Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core/META-INF/MANIFEST.MF3
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/AbstractBaseModel.java27
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/IModel.java7
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/IReadOnlyHandler.java (renamed from plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/IReadOnlyHandler2.java)186
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/IReadOnlyProvider.java35
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/ModelSet.java177
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/ProxyModificationTrackingAdapter.java147
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/additional/AdditionalResourcesModel.java14
-rw-r--r--plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/plugin.xml4
-rw-r--r--plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/schema/readOnlyHandler.exsd9
-rw-r--r--plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/AbstractReadOnlyHandler.java29
-rw-r--r--plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/EMFReadOnlyHandler.java14
-rw-r--r--plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/FSReadOnlyHandler.java18
-rw-r--r--plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/PapyrusROTransactionalEditingDomain.java12
-rw-r--r--plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/ReadOnlyAdapterFactory.java33
-rw-r--r--plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/ReadOnlyManager.java190
-rw-r--r--plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/ReadOnlyOneFileApprover.java19
-rw-r--r--plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/ReadOnlyTester.java4
-rw-r--r--plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/handlers/EnableWriteCommandHandler.java (renamed from plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/handlers/EnableWriteHandler.java)15
-rw-r--r--plugins/infra/emf/org.eclipse.papyrus.infra.emf/META-INF/MANIFEST.MF3
-rw-r--r--plugins/infra/emf/org.eclipse.papyrus.infra.emf/src/org/eclipse/papyrus/infra/emf/utils/EMFHelper.java75
-rw-r--r--plugins/infra/services/org.eclipse.papyrus.infra.services.edit/META-INF/MANIFEST.MF3
-rw-r--r--plugins/infra/services/org.eclipse.papyrus.infra.services.edit/src/org/eclipse/papyrus/infra/services/edit/internal/ElementEditServiceProvider.java14
-rw-r--r--plugins/team/org.eclipse.papyrus.team.svn/META-INF/MANIFEST.MF4
-rw-r--r--plugins/team/org.eclipse.papyrus.team.svn/plugin.xml1
-rw-r--r--plugins/team/org.eclipse.papyrus.team.svn/src/org/eclipse/papyrus/team/svn/SVNLockHandler.java29
-rw-r--r--plugins/uml/org.eclipse.papyrus.uml.profile/META-INF/MANIFEST.MF3
-rw-r--r--plugins/uml/org.eclipse.papyrus.uml.profile/src/org/eclipse/papyrus/uml/profile/readonly/AppliedProfileReadOnlyHandler.java25
-rw-r--r--plugins/uml/tools/org.eclipse.papyrus.uml.tools/src/org/eclipse/papyrus/uml/tools/model/ExtendedUmlModel.java13
29 files changed, 648 insertions, 465 deletions
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core/META-INF/MANIFEST.MF b/plugins/infra/core/org.eclipse.papyrus.infra.core/META-INF/MANIFEST.MF
index d14d4f739a8..7d66b71e8b5 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core/META-INF/MANIFEST.MF
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core/META-INF/MANIFEST.MF
@@ -10,7 +10,8 @@ Require-Bundle: org.eclipse.papyrus.infra.core.sasheditor;bundle-version="0.10.0
org.eclipse.ui.views.properties.tabbed;bundle-version="3.5.300",
org.eclipse.gef;bundle-version="3.8.1",
org.eclipse.emf.ecore.xmi;bundle-version="2.8.0",
- org.eclipse.emf.workspace;bundle-version="1.5.1"
+ org.eclipse.emf.workspace;bundle-version="1.5.1",
+ com.google.guava;bundle-version="10.0.1"
Export-Package: org.eclipse.papyrus.infra.core,
org.eclipse.papyrus.infra.core.contentoutline,
org.eclipse.papyrus.infra.core.editor,
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/AbstractBaseModel.java b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/AbstractBaseModel.java
index e484cc8c9cd..62654e1549b 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/AbstractBaseModel.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/AbstractBaseModel.java
@@ -19,11 +19,11 @@ import java.io.OutputStream;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
+import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IPath;
import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.common.util.WrappedException;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.URIConverter;
@@ -214,28 +214,16 @@ public abstract class AbstractBaseModel implements IVersionableModel {
* @param fullPathWithoutExtension
*/
public void loadModel(URI uriWithoutExtension) {
-
// Compute model URI
- RuntimeException error = null;
resourceURI = uriWithoutExtension.appendFileExtension(getModelFileExtension());
// Create Resource of appropriate type
- try {
- resource = modelSet.getResource(resourceURI, true);
- } catch (WrappedException e) {
- if(ModelUtils.isDegradedModeAllowed(e.getCause())) {
- // only this case is managed in degraded mode
- resource = modelSet.getResource(resourceURI, false);
- }
- error = e;
- }
+ resource = modelSet.getResource(resourceURI, true);
configureResource(resource);
+
// call registered snippets
snippets.performStart(this);
- if(error != null) {
- throw error;
- }
}
/**
@@ -411,4 +399,13 @@ public abstract class AbstractBaseModel implements IVersionableModel {
}
+ public Set<URI> getModifiedURIs() {
+ if (getResource() != null) {
+ if (!getResource().isTrackingModification() || getResource().isModified()) {
+ return Collections.singleton(getResource().getURI());
+ }
+ }
+ return Collections.emptySet();
+ }
+
}
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/IModel.java b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/IModel.java
index a55b45c8970..7ecca11869b 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/IModel.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/IModel.java
@@ -15,6 +15,7 @@
package org.eclipse.papyrus.infra.core.resource;
import java.io.IOException;
+import java.util.Set;
import org.eclipse.core.runtime.IPath;
import org.eclipse.emf.common.util.URI;
@@ -140,4 +141,10 @@ public interface IModel {
*/
public void addModelSnippet(IModelSnippet snippet);
+ /**
+ * return uris of this model resources that had been modified since the last save.
+ *
+ * @return
+ */
+ public Set<URI> getModifiedURIs();
}
diff --git a/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/IReadOnlyHandler2.java b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/IReadOnlyHandler.java
index ec0d2e2e34a..ff1f959705a 100644
--- a/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/IReadOnlyHandler2.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/IReadOnlyHandler.java
@@ -1,95 +1,91 @@
-/*****************************************************************************
- * Copyright (c) 2013 CEA LIST.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * CEA LIST - Initial API and implementation
- *****************************************************************************/
-package org.eclipse.papyrus.infra.emf.readonly;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.domain.EditingDomain;
-
-import com.google.common.base.Optional;
-
-/**
- * An alternative to the {@link IReadOnlyHandler} protocol that allows a handler
- * to declare that it definitively knows the answer to the read-only question,
- * and the subsequent handlers in the chain should not be consulted even if the
- * result is {@code false}.
- */
-public interface IReadOnlyHandler2 {
-
- /**
- * Queries whether any of the resources identified by the given URIs is
- * read-only.
- *
- * @param uris
- * the URIs about which read-only-ness is to be determined
- * @param editingDomain
- * the domain in the context of which editing is being done
- *
- * @return {@link Optional#absent() absent} if I do not know whether any of
- * the URIs is read-only or a {@link Optional#isPresent() present}
- * boolean indicating whether any definitively is or they all
- * definitively are not read-only
- */
- Optional<Boolean> anyReadOnly(URI[] uris, EditingDomain editingDomain);
-
- /**
- * Attempt to ensure that the resources identified by the given URIs are
- * writable.
- *
- * @param uris
- * the URIs of resources to make writable (not all are
- * necessarily read-only)
- * @param editingDomain
- * the domain in the context of which editing is being done
- *
- * @return {@link Optional#absent() absent} if I do not know how to make
- * these resources writable and the next provider should be given a
- * chance, or a {@link Optional#isPresent() present} boolean
- * indicating that I made the resources writable ({@code true}) or
- * they cannot be made writable ({@code false})
- */
- Optional<Boolean> makeWritable(URI[] uris, EditingDomain editingDomain);
-
- /**
- * Queries whether an {@code eObject} is individually read-only in a given
- * editing domain, if it is in a resource that supports object-level
- * read/write permissions.
- *
- * @param eObject
- * an element in some model resource
- * @param editingDomain
- * the contextual editing domain
- *
- * @return {@link Optional#absent() absent} if I do not know whether the
- * {@code eObject} is read-only or a {@link Optional#isPresent()
- * present} boolean indicating whether it definitively is or is not
- * read-only
- */
- Optional<Boolean> isReadOnly(EObject eObject, EditingDomain editingDomain);
-
- /**
- * Attempt to ensure that the given {@code eObject} is writable.
- *
- * @param eObject
- * a {@linkplain #isReadOnly(EObject, EditingDomain) read-only}
- * element in some model resource
- * @param editingDomain
- * the domain in the context of which editing is being done
- *
- * @return {@link Optional#absent() absent} if I do not know how to make
- * this object writable and the next provider should be given a
- * chance, or a {@link Optional#isPresent() present} boolean
- * indicating that I made it writable ({@code true}) or it cannot be
- * made writable ({@code false})
- */
- Optional<Boolean> makeWritable(EObject eObject, EditingDomain editingDomain);
-}
+/*****************************************************************************
+ * Copyright (c) 2011 Atos Origin.
+ *
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Mathieu Velten (Atos Origin) mathieu.velten@atosorigin.com - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.core.resource;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.domain.EditingDomain;
+
+import com.google.common.base.Optional;
+
+public interface IReadOnlyHandler {
+
+ /**
+ * Queries whether any of the resources identified by the given URIs is
+ * read-only.
+ *
+ * @param uris
+ * the URIs about which read-only-ness is to be determined
+ * @param editingDomain
+ * the domain in the context of which editing is being done
+ *
+ * @return {@link Optional#absent() absent} if I do not know whether any of
+ * the URIs is read-only or a {@link Optional#isPresent() present}
+ * boolean indicating whether any definitively is or they all
+ * definitively are not read-only
+ */
+ Optional<Boolean> anyReadOnly(URI[] uris, EditingDomain editingDomain);
+
+ /**
+ * Attempt to ensure that the resources identified by the given URIs are
+ * writable.
+ *
+ * @param uris
+ * the URIs of resources to make writable (not all are
+ * necessarily read-only)
+ * @param editingDomain
+ * the domain in the context of which editing is being done
+ *
+ * @return {@link Optional#absent() absent} if I do not know how to make
+ * these resources writable and the next provider should be given a
+ * chance, or a {@link Optional#isPresent() present} boolean
+ * indicating that I made the resources writable ({@code true}) or
+ * they cannot be made writable ({@code false})
+ */
+ Optional<Boolean> makeWritable(URI[] uris, EditingDomain editingDomain);
+
+ /**
+ * Queries whether an {@code eObject} is individually read-only in a given
+ * editing domain, if it is in a resource that supports object-level
+ * read/write permissions.
+ *
+ * @param eObject
+ * an element in some model resource
+ * @param editingDomain
+ * the contextual editing domain
+ *
+ * @return {@link Optional#absent() absent} if I do not know whether the
+ * {@code eObject} is read-only or a {@link Optional#isPresent()
+ * present} boolean indicating whether it definitively is or is not
+ * read-only
+ */
+ Optional<Boolean> isReadOnly(EObject eObject, EditingDomain editingDomain);
+
+ /**
+ * Attempt to ensure that the given {@code eObject} is writable.
+ *
+ * @param eObject
+ * a {@linkplain #isReadOnly(EObject, EditingDomain) read-only}
+ * element in some model resource
+ * @param editingDomain
+ * the domain in the context of which editing is being done
+ *
+ * @return {@link Optional#absent() absent} if I do not know how to make
+ * this object writable and the next provider should be given a
+ * chance, or a {@link Optional#isPresent() present} boolean
+ * indicating that I made it writable ({@code true}) or it cannot be
+ * made writable ({@code false})
+ */
+ Optional<Boolean> makeWritable(EObject eObject, EditingDomain editingDomain);
+}
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/IReadOnlyProvider.java b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/IReadOnlyProvider.java
deleted file mode 100644
index 0e912c214f9..00000000000
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/IReadOnlyProvider.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*****************************************************************************
- * Copyright (c) 2013 CEA LIST.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * CEA LIST - Initial API and implementation
- *****************************************************************************/
-package org.eclipse.papyrus.infra.core.resource;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.edit.domain.EditingDomain;
-
-/**
- * An adapter type for {@link EditingDomain}s and {@link ResourceSet}s that
- * support querying read/write permissions on the object level (not just the
- * resource level).
- */
-public interface IReadOnlyProvider {
-
- /**
- * Queries whether an object is read-only, which might be an individual
- * state independent of any read/write controls on its resource.
- *
- * @param eObject
- * an object
- *
- * @return whether the object is read-only
- */
- boolean isReadOnly(EObject eObject);
-}
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/ModelSet.java b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/ModelSet.java
index b9da14aa186..0a83edf8c72 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/ModelSet.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/ModelSet.java
@@ -21,32 +21,35 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.common.util.WrappedException;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.impl.ResourceImpl;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.XMIResource;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.emf.transaction.impl.EditingDomainManager;
-import org.eclipse.papyrus.infra.core.Activator;
import org.eclipse.papyrus.infra.core.resource.additional.AdditionalResourcesModel;
+import com.google.common.base.Optional;
+
/**
* This class is used to manage a set of {@link IModel}.
*
@@ -68,7 +71,7 @@ import org.eclipse.papyrus.infra.core.resource.additional.AdditionalResourcesMod
* @author cedric dumoulin
*
*/
-public class ModelSet extends ResourceSetImpl implements IReadOnlyProvider {
+public class ModelSet extends ResourceSetImpl {
/**
* Id use to register the EditinDomain into the registry
@@ -76,22 +79,22 @@ public class ModelSet extends ResourceSetImpl implements IReadOnlyProvider {
public static final String PAPYRUS_EDITING_DOMAIN_ID = "org.eclipse.papyrus.SharedEditingDomainID";
/** The associated IModels. */
- private Map<String, IModel> models = new HashMap<String, IModel>();
+ protected Map<String, IModel> models = new HashMap<String, IModel>();
/** The snippets. */
- private ModelSetSnippetList snippets = new ModelSetSnippetList();
+ protected ModelSetSnippetList snippets = new ModelSetSnippetList();
- private AdditionalResourcesModel additional = new AdditionalResourcesModel();
+ protected AdditionalResourcesModel additional = new AdditionalResourcesModel();
/**
* The associated EditingDomain.
*/
- private TransactionalEditingDomain transactionalEditingDomain;
+ protected TransactionalEditingDomain transactionalEditingDomain;
/**
* The URI, without extension, used for action on models.
*/
- private URI uriWithoutExtension;
+ protected URI uriWithoutExtension;
/**
*
@@ -100,16 +103,12 @@ public class ModelSet extends ResourceSetImpl implements IReadOnlyProvider {
*/
public ModelSet() {
registerModel(additional);
- this.setURIResourceMap(new HashMap<URI, Resource>());
- }
- @Override
- public Map<Object, Object> getLoadOptions() {
- Map<Object, Object> loadOptions = super.getLoadOptions();
- loadOptions.put(XMLResource.OPTION_DEFER_ATTACHMENT, true);
- loadOptions.put(XMLResource.OPTION_DEFER_IDREF_RESOLUTION, true);
- loadOptions.put(XMIResource.OPTION_LAX_FEATURE_PROCESSING, Boolean.TRUE);
- return loadOptions;
+ getLoadOptions().put(XMLResource.OPTION_DEFER_ATTACHMENT, true);
+ getLoadOptions().put(XMLResource.OPTION_DEFER_IDREF_RESOLUTION, true);
+ getLoadOptions().put(XMIResource.OPTION_LAX_FEATURE_PROCESSING, Boolean.TRUE);
+
+ this.eAdapters().add(new ProxyModificationTrackingAdapter());
}
/**
@@ -129,7 +128,7 @@ public class ModelSet extends ResourceSetImpl implements IReadOnlyProvider {
}
}
- private void doRegisterModel(IModel model) {
+ protected void doRegisterModel(IModel model) {
models.put(model.getIdentifier(), model);
model.init(this);
}
@@ -170,21 +169,53 @@ public class ModelSet extends ResourceSetImpl implements IReadOnlyProvider {
@Override
public Resource getResource(URI uri, boolean loadOnDemand) {
- Resource resource = null;
- resource = super.getResource(uri, loadOnDemand);
- return setResourceOptions(resource);
+ Resource r = null;
+ try {
+ r = super.getResource(uri, loadOnDemand);
+ } catch (WrappedException e) {
+ if(ModelUtils.isDegradedModeAllowed(e.getCause())) {
+ r = getResource(uri, false);
+ if (r == null) {
+ throw e;
+ }
+ }
+ }
+ return setResourceOptions(r);
}
/**
- * Retrieve and load the associated resource which have the given extension.
+ * @deprecated please use {@link #getAssociatedResource(EObject, String, boolean)} instead
*
* @param modelElement
* @param associatedResourceExtension
* @return
*/
public Resource getAssociatedResource(EObject modelElement, String associatedResourceExtension) {
+ return getAssociatedResource(modelElement, associatedResourceExtension, true);
+ }
+
+ /**
+ * @deprecated please use {@link #getAssociatedResource(Resource, String, boolean)} instead
+ *
+ * @param modelResource
+ * @param associatedResourceExtension
+ * @return
+ */
+ public Resource getAssociatedResource(Resource modelResource, String associatedResourceExtension) {
+ return getAssociatedResource(modelResource, associatedResourceExtension, true);
+ }
+
+ /**
+ * Retrieve and load the associated resource which have the given extension.
+ *
+ * @param modelElement
+ * @param associatedResourceExtension
+ * @param loadOnDemand same as for getResource
+ * @return
+ */
+ public Resource getAssociatedResource(EObject modelElement, String associatedResourceExtension, boolean loadOnDemand) {
if(modelElement != null) {
- return getAssociatedResource(modelElement.eResource(), associatedResourceExtension);
+ return getAssociatedResource(modelElement.eResource(), associatedResourceExtension, loadOnDemand);
}
return null;
}
@@ -194,29 +225,20 @@ public class ModelSet extends ResourceSetImpl implements IReadOnlyProvider {
*
* @param modelResource
* @param associatedResourceExtension
+ * @param loadOnDemand same as for getResource
* @return
*/
- public Resource getAssociatedResource(Resource modelResource, String associatedResourceExtension) {
+ public Resource getAssociatedResource(Resource modelResource, String associatedResourceExtension, boolean loadOnDemand) {
Resource r = null;
if(modelResource != null) {
URI trimmedModelURI = modelResource.getURI().trimFileExtension();
- try {
- r = getResource(trimmedModelURI.appendFileExtension(associatedResourceExtension), true);
- } catch (WrappedException e) {
- if(ModelUtils.isDegradedModeAllowed(e.getCause())) {
- r = getResource(trimmedModelURI.appendFileExtension(associatedResourceExtension), false);
- if(r == null) {
- throw e;
- }
- }
- } catch (Exception e) {
- }
+ r = getResource(trimmedModelURI.appendFileExtension(associatedResourceExtension), loadOnDemand);
}
return setResourceOptions(r);
}
/**
- * This method is called by getResource and createResource before returning
+ * This method is called by getResource, createResource and demandLoad before returning
* the resource to the caller so we can set options on the resource.
*
* @param r
@@ -224,15 +246,19 @@ public class ModelSet extends ResourceSetImpl implements IReadOnlyProvider {
* @return the same resource for convenience
*/
protected Resource setResourceOptions(Resource r) {
- if(r instanceof ResourceImpl) {
- ResourceImpl impl = (ResourceImpl)r;
- if(impl.getIntrinsicIDToEObjectMap() == null) {
- impl.setIntrinsicIDToEObjectMap(new HashMap<String, EObject>());
- }
+ if (r != null && !r.isTrackingModification()) {
+ r.setTrackingModification(true);
}
return r;
}
+ @Override
+ protected void demandLoad(Resource resource) throws IOException {
+ // perf optimization : call setResourceOptions before the loading of the resource to avoid
+ // going through the whole objects tree when setting the tracking modification
+ super.demandLoad(setResourceOptions(resource));
+ }
+
/**
* Create the transactional editing domain.
*
@@ -250,17 +276,6 @@ public class ModelSet extends ResourceSetImpl implements IReadOnlyProvider {
}
/**
- * Queries whether I am associated with a transactional editing domain.
- *
- * @return {@code true} if my editing domain has been {@linkplain #getTransactionalEditingDomain() created}; {@code false}, otherwise
- *
- * @see #getTransactionalEditingDomain()
- */
- protected synchronized boolean hasTransactionalEditingDomain() {
- return transactionalEditingDomain != null;
- }
-
- /**
* @return the filenameWithoutExtension
*
* @deprecated Use the {@link #getURIWithoutExtension()} API, instead.
@@ -419,7 +434,7 @@ public class ModelSet extends ResourceSetImpl implements IReadOnlyProvider {
loadModels(createURI(file));
}
- private URI createURI(IFile file) {
+ protected URI createURI(IFile file) {
return URI.createPlatformResourceURI(file.getFullPath().toString(), true);
}
@@ -578,16 +593,37 @@ public class ModelSet extends ResourceSetImpl implements IReadOnlyProvider {
Collection<IModel> modelList = models.values();
monitor.beginTask("Saving resources", modelList.size());
+ TransactionalEditingDomain editingDomain = getTransactionalEditingDomain();
+ IReadOnlyHandler roHandler = getReadOnlyHandler();
+
+ if (roHandler != null) {
+ Set<URI> roUris = new HashSet<URI>();
+ for(IModel model : modelList) {
+ Set<URI> uris = model.getModifiedURIs();
+ for(URI u : uris) {
+ Optional<Boolean> res = roHandler.anyReadOnly(new URI[]{u}, editingDomain);
+ if(res.isPresent() && res.get()) {
+ roUris.add(u);
+ }
+ }
+ }
+
+ if (!roUris.isEmpty()) {
+ Optional<Boolean> authorizeSave = roHandler.makeWritable(roUris.toArray(new URI[roUris.size()]), editingDomain);
+
+ if (authorizeSave.isPresent() && !authorizeSave.get()) {
+ monitor.done();
+ throw new IOException("Some modified resources are read-only : the model can't be saved");
+ }
+ }
+ }
+
try {
// Walk all registered models
for(IModel model : modelList) {
- try {
- if(!(model instanceof AdditionalResourcesModel)) {
- model.saveModel();
- }
+ if(!(model instanceof AdditionalResourcesModel)) {
+ model.saveModel();
monitor.worked(1);
- } catch (Exception ex) {
- Activator.log.error(ex);
}
}
additional.saveModel();
@@ -672,24 +708,13 @@ public class ModelSet extends ResourceSetImpl implements IReadOnlyProvider {
}
}
- public boolean isReadOnly(EObject eObject) {
- boolean result = false;
-
- Resource resource = eObject.eResource();
-
- // a detached object is necessarily editable
- if (resource != null) {
- if (hasTransactionalEditingDomain()) {
- EditingDomain domain = getTransactionalEditingDomain();
- if (domain instanceof IReadOnlyProvider) {
- result = ((IReadOnlyProvider) domain).isReadOnly(eObject);
- } else {
- result = domain.isReadOnly(resource);
- }
- }
+ public IReadOnlyHandler getReadOnlyHandler() {
+ EditingDomain editingDomain = getTransactionalEditingDomain();
+ Object handler = Platform.getAdapterManager().getAdapter(editingDomain, IReadOnlyHandler.class);
+ if (handler instanceof IReadOnlyHandler) {
+ return (IReadOnlyHandler) handler;
}
-
- return result;
+ return null;
}
/**
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/ProxyModificationTrackingAdapter.java b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/ProxyModificationTrackingAdapter.java
new file mode 100644
index 00000000000..4fbd76e2512
--- /dev/null
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/ProxyModificationTrackingAdapter.java
@@ -0,0 +1,147 @@
+/*****************************************************************************
+ * Copyright (c) 2013 Atos.
+ *
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Mathieu Velten (Atos) mathieu.velten@atos.net - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.core.resource;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.TreeIterator;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.EStructuralFeature.Setting;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EContentAdapter;
+import org.eclipse.emf.ecore.util.ECrossReferenceAdapter;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+
+/**
+ * This adapter handles "modified" flag of resources for tricky cases :
+ *
+ * - when there is a change in an URI all the resources containing a proxy
+ * to the modified resource should be marked as modified
+ *
+ * - when doing control/uncontrol operations the resource of the parent object
+ * should be marked as modified
+ *
+ * @author mvelten
+ *
+ */
+public class ProxyModificationTrackingAdapter extends EContentAdapter {
+
+ @Override
+ protected void setTarget(Resource target) {
+ basicSetTarget(target);
+ }
+
+ @Override
+ protected void unsetTarget(Resource target) {
+ basicUnsetTarget(target);
+ }
+
+ @Override
+ protected void setTarget(EObject target) {
+ }
+
+ @Override
+ protected void unsetTarget(EObject target) {
+ }
+
+ @Override
+ public void notifyChanged(Notification n) {
+ Object notifier = n.getNotifier();
+
+ if (notifier instanceof Resource) {
+ Resource r = (Resource)notifier;
+
+ if (n.getEventType() == Notification.SET && n.getFeatureID(Resource.class) == Resource.RESOURCE__URI) {
+ r.setModified(true);
+
+ TreeIterator<Object> properContents = EcoreUtil.getAllProperContents(r, true);
+ while(properContents.hasNext()) {
+ Object obj = properContents.next();
+ if (obj instanceof EObject) {
+ EObject eObj = (EObject) obj;
+ Collection<Setting> references = getUsages(eObj);
+ for (Setting setting : references) {
+ EStructuralFeature f = setting.getEStructuralFeature();
+ if(setting.getEObject() != null && !f.isDerived() && !f.isTransient()) {
+ Resource refResource = setting.getEObject().eResource();
+ if(refResource != null) {
+ refResource.setModified(true);
+ }
+ }
+ }
+ }
+ }
+
+ } else {
+ List objects = new ArrayList();
+ if (n.getEventType() == Notification.ADD_MANY) {
+ objects = (List<?>)n.getNewValue();
+ } else if(n.getEventType() == Notification.REMOVE_MANY) {
+ objects = (List<?>)n.getOldValue();
+ } else if(n.getEventType() == Notification.ADD) {
+ objects.add(n.getNewValue());
+ } else if(n.getEventType() == Notification.REMOVE) {
+ objects.add(n.getOldValue());
+ }
+
+ for (Object o : objects) {
+ if (o instanceof EObject) {
+ EObject parentEObj = ((EObject)o).eContainer();
+ if (parentEObj != null && parentEObj.eResource() != null) {
+ parentEObj.eResource().setModified(true);
+ }
+ }
+ }
+ }
+ }
+
+ super.notifyChanged(n);
+ }
+
+ /**
+ * Gets the usages.
+ *
+ * @param source
+ * the source
+ *
+ * @return the usages or null if there is no usages
+ */
+ public static Collection<Setting> getUsages(EObject source) {
+ if(source == null) {
+ return Collections.emptyList();
+ }
+
+ ECrossReferenceAdapter crossReferencer = ECrossReferenceAdapter.getCrossReferenceAdapter(source);
+ if(crossReferencer == null) {
+ // try to register a cross referencer at the highest level
+ crossReferencer = new ECrossReferenceAdapter();
+ if(source.eResource() != null) {
+ if(source.eResource().getResourceSet() != null) {
+ crossReferencer.setTarget(source.eResource().getResourceSet());
+ } else {
+ crossReferencer.setTarget(source.eResource());
+ }
+ } else {
+ crossReferencer.setTarget(source);
+ }
+ }
+
+ return crossReferencer.getInverseReferences(source, true);
+ }
+}
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/additional/AdditionalResourcesModel.java b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/additional/AdditionalResourcesModel.java
index 1ed7aab9ad6..d11dcd00b1c 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/additional/AdditionalResourcesModel.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/additional/AdditionalResourcesModel.java
@@ -16,6 +16,8 @@ package org.eclipse.papyrus.infra.core.resource.additional;
import java.io.IOException;
import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
import org.eclipse.core.runtime.IPath;
import org.eclipse.emf.common.util.URI;
@@ -146,4 +148,16 @@ public class AdditionalResourcesModel implements IModel {
}
return false;
}
+
+ public Set<URI> getModifiedURIs() {
+ Set<URI> res = new HashSet<URI>();
+ for(Resource r : modelSet.getResources()) {
+ if(isAdditionalResource(getModelManager(), r.getURI())) {
+ if (!r.isTrackingModification() || r.isModified()) {
+ res.add(r.getURI());
+ }
+ }
+ }
+ return res;
+ }
}
diff --git a/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/plugin.xml b/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/plugin.xml
index 58a13953003..877b08fba07 100644
--- a/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/plugin.xml
+++ b/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/plugin.xml
@@ -6,17 +6,19 @@
point="org.eclipse.papyrus.infra.emf.readonly.readOnlyHandler">
<readOnlyHandler
class="org.eclipse.papyrus.infra.emf.readonly.FSReadOnlyHandler"
+ id="org.eclipse.papyrus.infra.emf.readonly.FSReadOnlyHandler"
priority="10">
</readOnlyHandler>
<readOnlyHandler
class="org.eclipse.papyrus.infra.emf.readonly.EMFReadOnlyHandler"
+ id="org.eclipse.papyrus.infra.emf.readonly.EMFReadOnlyHandler"
priority="5">
</readOnlyHandler>
</extension>
<extension
point="org.eclipse.ui.handlers">
<handler
- class="org.eclipse.papyrus.infra.emf.readonly.handlers.EnableWriteHandler"
+ class="org.eclipse.papyrus.infra.emf.readonly.handlers.EnableWriteCommandHandler"
commandId="org.eclipse.papyrus.infra.emf.readonly.EnableWriteCommand">
<enabledWhen>
<and>
diff --git a/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/schema/readOnlyHandler.exsd b/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/schema/readOnlyHandler.exsd
index c31ee0bac9e..f6e1fa72735 100644
--- a/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/schema/readOnlyHandler.exsd
+++ b/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/schema/readOnlyHandler.exsd
@@ -55,7 +55,7 @@
</documentation>
<appinfo>
- <meta.attribute kind="java" basedOn=":org.eclipse.papyrus.infra.emf.readonly.IReadOnlyHandler2"/>
+ <meta.attribute kind="java" basedOn=":org.eclipse.papyrus.infra.core.resource.IReadOnlyHandler"/>
</appinfo>
</annotation>
</attribute>
@@ -66,6 +66,13 @@
</documentation>
</annotation>
</attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+ optional id that can be used if this read only handler can be overriden.
+ </documentation>
+ </annotation>
+ </attribute>
</complexType>
</element>
diff --git a/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/AbstractReadOnlyHandler.java b/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/AbstractReadOnlyHandler.java
new file mode 100644
index 00000000000..bce08fa627a
--- /dev/null
+++ b/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/AbstractReadOnlyHandler.java
@@ -0,0 +1,29 @@
+package org.eclipse.papyrus.infra.emf.readonly;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.papyrus.infra.core.resource.IReadOnlyHandler;
+
+import com.google.common.base.Optional;
+
+public abstract class AbstractReadOnlyHandler implements IReadOnlyHandler {
+
+ public Optional<Boolean> isReadOnly(EObject eObject, EditingDomain editingDomain) {
+ Resource res = eObject.eResource();
+ if (res != null && res.getURI() != null) {
+ return anyReadOnly(new URI[] {res.getURI()}, editingDomain);
+ }
+ return Optional.absent();
+ }
+
+ public Optional<Boolean> makeWritable(EObject eObject, EditingDomain editingDomain) {
+ Resource res = eObject.eResource();
+ if (res != null && res.getURI() != null) {
+ return makeWritable(new URI[] {res.getURI()}, editingDomain);
+ }
+ return Optional.absent();
+ }
+
+}
diff --git a/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/EMFReadOnlyHandler.java b/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/EMFReadOnlyHandler.java
index bf5f5ff756d..93cd67204cd 100644
--- a/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/EMFReadOnlyHandler.java
+++ b/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/EMFReadOnlyHandler.java
@@ -3,21 +3,23 @@ package org.eclipse.papyrus.infra.emf.readonly;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.edit.domain.EditingDomain;
+import com.google.common.base.Optional;
-public class EMFReadOnlyHandler implements IReadOnlyHandler {
- public boolean isReadOnly(URI[] uris, EditingDomain editingDomain) {
+public class EMFReadOnlyHandler extends AbstractReadOnlyHandler {
+
+ public Optional<Boolean> anyReadOnly(URI[] uris, EditingDomain editingDomain) {
for(URI uri : uris) {
if(!uri.isPlatformResource()) {
- return true;
+ return Optional.of(Boolean.TRUE);
}
}
- return false;
+ return Optional.absent();
}
- public boolean enableWrite(URI[] uris, EditingDomain editingDomain) {
- return false; //We cannot change the read-only status
+ public Optional<Boolean> makeWritable(URI[] uris, EditingDomain editingDomain) {
+ return Optional.absent(); //We cannot change the read-only status
}
}
diff --git a/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/FSReadOnlyHandler.java b/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/FSReadOnlyHandler.java
index 84ff0d28905..2af579f5c4b 100644
--- a/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/FSReadOnlyHandler.java
+++ b/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/FSReadOnlyHandler.java
@@ -25,18 +25,20 @@ import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;
-public class FSReadOnlyHandler implements IReadOnlyHandler {
+import com.google.common.base.Optional;
- public boolean isReadOnly(URI[] uris, EditingDomain editingDomain) {
+public class FSReadOnlyHandler extends AbstractReadOnlyHandler {
+
+ public Optional<Boolean> anyReadOnly(URI[] uris, EditingDomain editingDomain) {
for(URI uri : uris) {
IFile file = getFile(uri);
if(file != null && file.isReadOnly()) {
- return true;
+ return Optional.of(Boolean.TRUE);
}
}
- return false;
+ return Optional.absent();
}
private static IFile getFile(URI uri) {
@@ -46,7 +48,7 @@ public class FSReadOnlyHandler implements IReadOnlyHandler {
return null;
}
- public boolean enableWrite(final URI[] uris, EditingDomain editingDomain) {
+ public Optional<Boolean> makeWritable(final URI[] uris, EditingDomain editingDomain) {
final AtomicBoolean doEnableWrite = new AtomicBoolean();
Display.getCurrent().syncExec(new Runnable() {
@@ -63,7 +65,7 @@ public class FSReadOnlyHandler implements IReadOnlyHandler {
});
if(doEnableWrite.get()) {
- boolean ok = true;
+ Boolean ok = true;
for(URI uri : uris) {
IFile file = getFile(uri);
if(file != null && file.isReadOnly()) {
@@ -76,9 +78,9 @@ public class FSReadOnlyHandler implements IReadOnlyHandler {
}
}
}
- return ok;
+ return Optional.of(ok);
} else {
- return false;
+ return Optional.absent();
}
}
diff --git a/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/PapyrusROTransactionalEditingDomain.java b/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/PapyrusROTransactionalEditingDomain.java
index 2b3acba86ca..0d0c14eecb7 100644
--- a/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/PapyrusROTransactionalEditingDomain.java
+++ b/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/PapyrusROTransactionalEditingDomain.java
@@ -15,17 +15,16 @@
package org.eclipse.papyrus.infra.emf.readonly;
import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.transaction.TransactionalCommandStack;
import org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl;
-import org.eclipse.papyrus.infra.core.resource.IReadOnlyProvider;
public class PapyrusROTransactionalEditingDomain
- extends TransactionalEditingDomainImpl
- implements IReadOnlyProvider {
+ extends TransactionalEditingDomainImpl {
public PapyrusROTransactionalEditingDomain(AdapterFactory adapterFactory, TransactionalCommandStack stack, ResourceSet resourceSet) {
super(adapterFactory, stack, resourceSet);
@@ -33,11 +32,14 @@ public class PapyrusROTransactionalEditingDomain
@Override
public boolean isReadOnly(Resource resource) {
- return ReadOnlyManager.isReadOnly(resource, this);
+ if (resource != null && resource.getURI() != null) {
+ return ReadOnlyManager.getInstance().anyReadOnly(new URI[] {resource.getURI()}, this).get();
+ }
+ return false;
}
public boolean isReadOnly(EObject eObject) {
- return ReadOnlyManager.isReadOnly(eObject, this);
+ return ReadOnlyManager.getInstance().isReadOnly(eObject, this).get();
}
@Override
diff --git a/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/ReadOnlyAdapterFactory.java b/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/ReadOnlyAdapterFactory.java
new file mode 100644
index 00000000000..cd743c02e26
--- /dev/null
+++ b/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/ReadOnlyAdapterFactory.java
@@ -0,0 +1,33 @@
+/*****************************************************************************
+ * Copyright (c) 2012 Atos Origin.
+ *
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Mathieu Velten (Atos Origin) mathieu.velten@atosorigin.com - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.emf.readonly;
+
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.papyrus.infra.core.resource.IReadOnlyHandler;
+
+@SuppressWarnings("rawtypes")
+public class ReadOnlyAdapterFactory implements IAdapterFactory {
+
+ public Object getAdapter(Object adaptableObject, Class adapterType) {
+ if(IReadOnlyHandler.class == adapterType && adaptableObject instanceof PapyrusROTransactionalEditingDomain) {
+ return ReadOnlyManager.getInstance();
+ }
+ return null;
+ }
+
+ public Class[] getAdapterList() {
+ return new Class[]{ EditingDomain.class };
+ }
+}
diff --git a/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/ReadOnlyManager.java b/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/ReadOnlyManager.java
index f99dbef91d3..7aa5b3f5058 100644
--- a/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/ReadOnlyManager.java
+++ b/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/ReadOnlyManager.java
@@ -15,23 +15,30 @@
package org.eclipse.papyrus.infra.emf.readonly;
import java.util.Collections;
+import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
+import java.util.Map;
-import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.papyrus.infra.core.resource.IReadOnlyHandler;
import com.google.common.base.Optional;
-public class ReadOnlyManager {
+public class ReadOnlyManager implements IReadOnlyHandler {
- protected static final IReadOnlyHandler2[] orderedHandlersArray;
+
+ private static class ReadOnlyManagerHolder {
+ public static final ReadOnlyManager INSTANCE = new ReadOnlyManager();
+ }
+
+ public static ReadOnlyManager getInstance() {
+ return ReadOnlyManagerHolder.INSTANCE;
+ }
protected static class HandlerPriorityPair implements Comparable<HandlerPriorityPair> {
@@ -50,18 +57,37 @@ public class ReadOnlyManager {
}
}
- static {
+ protected final IReadOnlyHandler[] orderedHandlersArray;
+
+ private ReadOnlyManager() {
IConfigurationElement[] configElements = Platform.getExtensionRegistry().getConfigurationElementsFor("org.eclipse.papyrus.infra.emf.readonly", "readOnlyHandler");
List<HandlerPriorityPair> handlerPriorityPairs = new LinkedList<HandlerPriorityPair>();
+ Map<String, HandlerPriorityPair> idMap = new HashMap<String, HandlerPriorityPair>();
+
for(IConfigurationElement elem : configElements) {
if("readOnlyHandler".equals(elem.getName())) {
try {
HandlerPriorityPair handlerPriorityPair = new HandlerPriorityPair();
handlerPriorityPair.handler = elem.createExecutableExtension("class");
handlerPriorityPair.priority = Integer.parseInt(elem.getAttribute("priority"));
-
- handlerPriorityPairs.add(handlerPriorityPair);
+ String id = elem.getAttribute("id");
+ if (id != null) {
+ //if any then the handler could be overrided by another registration
+ HandlerPriorityPair oldHandler = idMap.get(id);
+ if(oldHandler == null) {
+ idMap.put(id, handlerPriorityPair);
+ handlerPriorityPairs.add(handlerPriorityPair);
+ } else {
+ if (oldHandler.priority < handlerPriorityPair.priority) {
+ handlerPriorityPairs.remove(oldHandler);
+ handlerPriorityPairs.add(handlerPriorityPair);
+ }
+ }
+ }else {
+ //If none the handler can not be overrided
+ handlerPriorityPairs.add(handlerPriorityPair);
+ }
} catch (Throwable t) {
//FIXME: We need to catch Throwables because we rely on external contributions. It is required to also catch Errors (such as compilation errors).
//Move this code to an initialization method, because if a throwable is not caught, this will prevent the whole class initialization
@@ -72,19 +98,19 @@ public class ReadOnlyManager {
Collections.sort(handlerPriorityPairs);
- orderedHandlersArray = new IReadOnlyHandler2[handlerPriorityPairs.size()];
+ orderedHandlersArray = new IReadOnlyHandler[handlerPriorityPairs.size()];
for (int i = 0; i < orderedHandlersArray.length; i++) {
Object handler = handlerPriorityPairs.get(i).handler;
- if (handler instanceof IReadOnlyHandler2) {
- orderedHandlersArray[i] = (IReadOnlyHandler2) handler;
+ if (handler instanceof IReadOnlyHandler) {
+ orderedHandlersArray[i] = (IReadOnlyHandler) handler;
} else {
@SuppressWarnings("deprecation")
- boolean isOldStyle = (handler instanceof IReadOnlyHandler);
-
+ boolean isOldStyle = (handler instanceof org.eclipse.papyrus.infra.emf.readonly.IReadOnlyHandler);
+
if (isOldStyle) {
@SuppressWarnings("deprecation")
- IReadOnlyHandler oldStyle = (IReadOnlyHandler) handler;
+ org.eclipse.papyrus.infra.emf.readonly.IReadOnlyHandler oldStyle = (org.eclipse.papyrus.infra.emf.readonly.IReadOnlyHandler) handler;
orderedHandlersArray[i] = new HandlerAdapter(oldStyle);
} else {
Activator.log.warn("Unsupported read-only handler type: " + handler);
@@ -93,105 +119,75 @@ public class ReadOnlyManager {
}
}
- public static boolean isReadOnly(Resource resource, EditingDomain editingDomain) {
- URI uri = null;
- if(resource != null && resource.getURI() != null) {
-
- uri = resource.getURI();
- }
-
- return isReadOnly(uri, editingDomain);
- }
-
- private static URI getURI(IFile iFile) {
- return URI.createPlatformResourceURI(iFile.getFullPath().toString(), true);
- }
-
- private static URI[] getURIs(IFile[] iFiles) {
- URI[] uris = new URI[iFiles.length];
- int i = 0;
- for(IFile iFile : iFiles) {
- uris[i++] = getURI(iFile);
- }
- return uris;
- }
-
- public static boolean isReadOnly(URI uri, EditingDomain editingDomain) {
- URI[] uris = uri != null ? new URI[]{ uri } : new URI[]{};
- return isReadOnly(uris, editingDomain);
- }
-
- public static boolean isReadOnly(URI[] uris, EditingDomain editingDomain) {
+ public Optional<Boolean> anyReadOnly(URI[] uris, EditingDomain editingDomain) {
Optional<Boolean> result = Optional.absent();
-
- for (int i = 0; (i < orderedHandlersArray.length) && !result.isPresent(); i++) {
- result = orderedHandlersArray[i].anyReadOnly(uris, editingDomain);
- }
-
- return result.or(Boolean.FALSE);
- }
- public static boolean enableWrite(URI[] uris, EditingDomain editingDomain) {
- Optional<Boolean> result = Optional.absent();
-
for (int i = 0; (i < orderedHandlersArray.length) && !result.isPresent(); i++) {
- result = orderedHandlersArray[i].makeWritable(uris, editingDomain);
+ result = orderedHandlersArray[i].anyReadOnly(uris, editingDomain);
}
- return result.or(Boolean.TRUE);
+ return result.isPresent() ? result : Optional.of(Boolean.FALSE);
}
- public static boolean isReadOnly(EObject eObject, EditingDomain editingDomain) {
+ public Optional<Boolean> isReadOnly(EObject eObject, EditingDomain editingDomain) {
Optional<Boolean> result = Optional.absent();
-
+
for (int i = 0; (i < orderedHandlersArray.length) && !result.isPresent(); i++) {
result = orderedHandlersArray[i].isReadOnly(eObject, editingDomain);
}
-
- if (!result.isPresent()) {
- // assume that an object is writable if it's not in a resource
- Resource resource = eObject.eResource();
- result = Optional.of((resource != null)
- && isReadOnly(resource, editingDomain));
- }
-
- return result.get();
+
+ return result.isPresent() ? result : Optional.of(Boolean.FALSE);
}
- public static boolean enableWrite(EObject eObject, EditingDomain editingDomain) {
- Optional<Boolean> result = Optional.absent();
-
- for (int i = 0; (i < orderedHandlersArray.length) && !result.isPresent(); i++) {
- result = orderedHandlersArray[i].makeWritable(eObject, editingDomain);
+ public Optional<Boolean> makeWritable(URI[] uris, EditingDomain editingDomain) {
+ Boolean finalResult = true;
+
+ for (int i = 0; (i < orderedHandlersArray.length); i++) {
+ Optional<Boolean> isRO = orderedHandlersArray[i].anyReadOnly(uris, editingDomain);
+ if (isRO.isPresent() && isRO.get()) {
+ Optional<Boolean> result = orderedHandlersArray[i].makeWritable(uris, editingDomain);
+ // makeWritable should provide an answer since anyReadOnly returned a positive value
+ // if no answer consider it fails
+ if (!result.isPresent() || !result.get()) {
+ finalResult = false;
+ }
+ }
}
- return result.or(enableWrite(new URI[]{EcoreUtil.getURI(eObject)
- .trimFragment()}, editingDomain));
+ return Optional.of(finalResult);
}
- public static boolean isReadOnly(IFile[] iFiles, EditingDomain editingDomain) {
- return isReadOnly(getURIs(iFiles), editingDomain);
- }
+ public Optional<Boolean> makeWritable(EObject eObject, EditingDomain editingDomain) {
+ Boolean finalResult = true;
+
+ for (int i = 0; (i < orderedHandlersArray.length); i++) {
+ Optional<Boolean> isRO = orderedHandlersArray[i].isReadOnly(eObject, editingDomain);
+ if (isRO.isPresent() && isRO.get()) {
+ Optional<Boolean> result = orderedHandlersArray[i].makeWritable(eObject, editingDomain);
+ // makeWritable should provide an answer since anyReadOnly returned a positive value
+ // if no answer consider it fails
+ if (result.isPresent() && !result.get()) {
+ finalResult = false;
+ }
+ }
+ }
- public static boolean enableWrite(IFile[] iFiles, EditingDomain editingDomain) {
- return enableWrite(getURIs(iFiles), editingDomain);
+ return Optional.of(finalResult);
}
-
- private static final class HandlerAdapter
- implements IReadOnlyHandler2 {
+
+ private static final class HandlerAdapter extends AbstractReadOnlyHandler {
@SuppressWarnings("deprecation")
- private final IReadOnlyHandler delegate;
+ private final org.eclipse.papyrus.infra.emf.readonly.IReadOnlyHandler delegate;
@SuppressWarnings("deprecation")
- HandlerAdapter(IReadOnlyHandler handler) {
+ HandlerAdapter(org.eclipse.papyrus.infra.emf.readonly.IReadOnlyHandler handler) {
super();
this.delegate = handler;
}
- public Optional<Boolean> anyReadOnly(URI[] uris,
- EditingDomain editingDomain) {
+ public Optional<Boolean> anyReadOnly(URI[] uris, EditingDomain editingDomain) {
// the old API contract is that handlers only return true if they
// know it to be true, because the manager takes the first positive
@@ -199,8 +195,8 @@ public class ReadOnlyManager {
@SuppressWarnings("deprecation")
boolean delegateResult = delegate.isReadOnly(uris, editingDomain);
return delegateResult
- ? Optional.of(Boolean.TRUE)
- : Optional.<Boolean> absent();
+ ? Optional.of(Boolean.TRUE)
+ : Optional.<Boolean> absent();
}
public Optional<Boolean> makeWritable(URI[] uris,
@@ -213,24 +209,8 @@ public class ReadOnlyManager {
@SuppressWarnings("deprecation")
boolean delegateResult = delegate.enableWrite(uris, editingDomain);
return delegateResult
- ? Optional.<Boolean> absent()
- : Optional.of(Boolean.FALSE);
- }
-
- public Optional<Boolean> isReadOnly(EObject eObject,
- EditingDomain editingDomain) {
-
- // old-style read-only handlers don't support object-level
- // permissions
- return Optional.absent();
- }
-
- public Optional<Boolean> makeWritable(EObject eObject,
- EditingDomain editingDomain) {
-
- // old-style read-only handlers don't support object-level
- // permissions
- return Optional.absent();
+ ? Optional.<Boolean> absent()
+ : Optional.of(Boolean.FALSE);
}
}
}
diff --git a/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/ReadOnlyOneFileApprover.java b/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/ReadOnlyOneFileApprover.java
index f534f389050..c9e474d05b3 100644
--- a/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/ReadOnlyOneFileApprover.java
+++ b/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/ReadOnlyOneFileApprover.java
@@ -14,7 +14,6 @@
package org.eclipse.papyrus.infra.emf.readonly;
import java.io.File;
-import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
@@ -27,6 +26,7 @@ import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.workspace.AbstractEMFOperation;
import org.eclipse.gmf.runtime.common.core.command.CommandResult;
@@ -37,6 +37,8 @@ import org.eclipse.papyrus.infra.onefile.model.IPapyrusFile;
import org.eclipse.papyrus.infra.onefile.model.PapyrusModelHelper;
import org.eclipse.papyrus.infra.onefile.utils.OneFileUtils;
+import com.google.common.base.Optional;
+
public class ReadOnlyOneFileApprover implements IOperationApprover2 {
public IStatus proceedRedoing(IUndoableOperation operation, IOperationHistory history, IAdaptable info) {
@@ -48,7 +50,7 @@ public class ReadOnlyOneFileApprover implements IOperationApprover2 {
}
public IStatus proceedExecuting(IUndoableOperation operation, IOperationHistory history, IAdaptable info) {
- HashSet<IFile> filesToCheckForLock = new HashSet<IFile>();
+ HashSet<URI> filesToCheckForLock = new HashSet<URI>();
if(operation instanceof ICommand) {
ICommand command = (ICommand)operation;
@@ -61,8 +63,9 @@ public class ReadOnlyOneFileApprover implements IOperationApprover2 {
if(affectedFile.exists()) {
// the file is in the workspace
IPapyrusFile papFile = PapyrusModelHelper.getPapyrusModelFactory().createIPapyrusFile(affectedFile);
- filesToCheckForLock.addAll(Arrays.asList(OneFileUtils.getAssociatedFiles(papFile)));
-
+ for (IFile f : OneFileUtils.getAssociatedFiles(papFile)) {
+ filesToCheckForLock.add(URI.createPlatformResourceURI(f.getFullPath().toString(), true));
+ }
} else {
// the file is not in the workspace
IPath path = affectedFile.getRawLocation();
@@ -84,10 +87,10 @@ public class ReadOnlyOneFileApprover implements IOperationApprover2 {
EditingDomain editingDomain = getEditingDomain(operation);
- IFile[] filesToCheckForLockArray = filesToCheckForLock.toArray(new IFile[filesToCheckForLock.size()]);
- if(ReadOnlyManager.isReadOnly(filesToCheckForLock.toArray(filesToCheckForLockArray), editingDomain)) {
- boolean ok = ReadOnlyManager.enableWrite(filesToCheckForLockArray, editingDomain);
- if(!ok) {
+ URI[] filesToCheckForLockArray = filesToCheckForLock.toArray(new URI[filesToCheckForLock.size()]);
+ if(ReadOnlyManager.getInstance().anyReadOnly(filesToCheckForLockArray, editingDomain).get()) {
+ Optional<Boolean> ok = ReadOnlyManager.getInstance().makeWritable(filesToCheckForLockArray, editingDomain);
+ if(!ok.get()) {
return Status.CANCEL_STATUS;
}
}
diff --git a/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/ReadOnlyTester.java b/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/ReadOnlyTester.java
index 6b494d491cc..14b71e01f26 100644
--- a/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/ReadOnlyTester.java
+++ b/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/ReadOnlyTester.java
@@ -40,9 +40,9 @@ public class ReadOnlyTester extends PropertyTester {
EObject eObject = (EObject) businessObject;
Resource resource = eObject.eResource();
if ((resource != null) && (resource.getResourceSet() != null)) {
- return ReadOnlyManager.isReadOnly(eObject,
+ return ReadOnlyManager.getInstance().isReadOnly(eObject,
WorkspaceEditingDomainFactory.INSTANCE
- .getEditingDomain(resource.getResourceSet()));
+ .getEditingDomain(resource.getResourceSet())).get();
}
}
}
diff --git a/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/handlers/EnableWriteHandler.java b/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/handlers/EnableWriteCommandHandler.java
index cf2f6d58a05..8b70b05d112 100644
--- a/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/handlers/EnableWriteHandler.java
+++ b/plugins/infra/emf/org.eclipse.papyrus.infra.emf.readonly/src/org/eclipse/papyrus/infra/emf/readonly/handlers/EnableWriteCommandHandler.java
@@ -20,7 +20,7 @@ import org.eclipse.papyrus.infra.onefile.model.PapyrusModelHelper;
import org.eclipse.papyrus.infra.onefile.utils.OneFileUtils;
import org.eclipse.ui.PlatformUI;
-public class EnableWriteHandler extends AbstractHandler {
+public class EnableWriteCommandHandler extends AbstractHandler {
public Object execute(ExecutionEvent event) throws ExecutionException {
EObject elem = getSelectedElement();
@@ -33,15 +33,12 @@ public class EnableWriteHandler extends AbstractHandler {
IPapyrusFile papFile = PapyrusModelHelper.getPapyrusModelFactory().createIPapyrusFile(file);
IFile[] associatedFiles = OneFileUtils.getAssociatedFiles(papFile);
- ReadOnlyManager.enableWrite(associatedFiles, WorkspaceEditingDomainFactory.INSTANCE.getEditingDomain(rs));
-
- for(IFile associatedFile : associatedFiles) {
- URI associatedUri = URI.createPlatformResourceURI(associatedFile.getFullPath().toString(), true);
- Resource associatedResource = rs.getResource(associatedUri, true);
- if(associatedResource != null) {
- associatedResource.setModified(true);
- }
+ URI[] associatedUris = new URI[associatedFiles.length];
+ for (int i=0 ; i < associatedFiles.length ; i++) {
+ associatedUris[i] = URI.createPlatformResourceURI(associatedFiles[i].getFullPath().toString(), true);
}
+
+ ReadOnlyManager.getInstance().makeWritable(associatedUris, WorkspaceEditingDomainFactory.INSTANCE.getEditingDomain(rs));
}
}
return null;
diff --git a/plugins/infra/emf/org.eclipse.papyrus.infra.emf/META-INF/MANIFEST.MF b/plugins/infra/emf/org.eclipse.papyrus.infra.emf/META-INF/MANIFEST.MF
index de9677b2a1a..a0b61c80f37 100644
--- a/plugins/infra/emf/org.eclipse.papyrus.infra.emf/META-INF/MANIFEST.MF
+++ b/plugins/infra/emf/org.eclipse.papyrus.infra.emf/META-INF/MANIFEST.MF
@@ -27,7 +27,8 @@ Require-Bundle: org.eclipse.ui,
org.eclipse.core.expressions;bundle-version="3.4.400",
org.eclipse.gmf.runtime.common.core;bundle-version="1.7.0",
org.eclipse.gmf.runtime.emf.commands.core;bundle-version="1.4.0",
- org.eclipse.gmf.runtime.emf.type.core;bundle-version="1.7.0"
+ org.eclipse.gmf.runtime.emf.type.core;bundle-version="1.7.0",
+ com.google.guava
Export-Package: org.eclipse.papyrus.infra.emf,
org.eclipse.papyrus.infra.emf.commands,
org.eclipse.papyrus.infra.emf.databinding,
diff --git a/plugins/infra/emf/org.eclipse.papyrus.infra.emf/src/org/eclipse/papyrus/infra/emf/utils/EMFHelper.java b/plugins/infra/emf/org.eclipse.papyrus.infra.emf/src/org/eclipse/papyrus/infra/emf/utils/EMFHelper.java
index 1b304be64fc..c1b180e593c 100644
--- a/plugins/infra/emf/org.eclipse.papyrus.infra.emf/src/org/eclipse/papyrus/infra/emf/utils/EMFHelper.java
+++ b/plugins/infra/emf/org.eclipse.papyrus.infra.emf/src/org/eclipse/papyrus/infra/emf/utils/EMFHelper.java
@@ -26,6 +26,7 @@ import java.util.Map;
import java.util.Set;
import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
@@ -47,7 +48,8 @@ import org.eclipse.emf.ecore.xmi.XMIResource;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.facet.custom.ui.CustomizedContentProviderUtils;
-import org.eclipse.papyrus.infra.core.resource.IReadOnlyProvider;
+import org.eclipse.papyrus.infra.core.resource.IReadOnlyHandler;
+import org.eclipse.papyrus.infra.core.resource.ProxyModificationTrackingAdapter;
import org.eclipse.papyrus.infra.core.services.ServiceException;
import org.eclipse.papyrus.infra.core.utils.ServiceUtilsForActionHandlers;
import org.eclipse.papyrus.infra.emf.Activator;
@@ -185,7 +187,7 @@ public class EMFHelper {
return null;
}
-
+
/**
* Queries whether an {@code object} is an EMF model element, an instance of
* some {@link EClass} from an EMF model. This isn't as simple as checking
@@ -195,7 +197,7 @@ public class EMFHelper {
* an {@link EObject}.
*
* @param object
- * an object
+ * an object
* @return whether it is "model content"
*
* @see EMFHelper#asEMFModelElement(Object)
@@ -203,21 +205,19 @@ public class EMFHelper {
public static boolean isEMFModelElement(Object object) {
return (object instanceof EObject) && !(object instanceof Resource);
}
-
+
/**
* Casts an {@code object} as an EMF model element, if appropriate.
*
* @param object
- * an object
+ * an object
* @return the object as an EMF model element, or {@code null} if it is not
* an EMF model element
*
* @see #isEMFModelElement(Object)
*/
public static EObject asEMFModelElement(Object object) {
- return isEMFModelElement(object)
- ? (EObject) object
- : null;
+ return isEMFModelElement(object) ? (EObject)object : null;
}
/**
@@ -448,22 +448,23 @@ public class EMFHelper {
* Delegates to the given editing domain if it isn't null
*
* @param eObject
+ *
* @param domain
* @return
* True if the EObject is read only
*/
public static boolean isReadOnly(final EObject eObject, final EditingDomain domain) {
- Resource resource = eObject.eResource();
- ResourceSet resourceSet = (resource == null)
- ? null
- : resource.getResourceSet();
- IReadOnlyProvider provider = (resourceSet instanceof IReadOnlyProvider)
- ? (IReadOnlyProvider) resourceSet
- : null;
-
- return (provider != null)
- ? provider.isReadOnly(eObject)
- : isReadOnly(resource, domain);
+ if(domain != null) {
+ Object handler = Platform.getAdapterManager().getAdapter(domain, IReadOnlyHandler.class);
+ if(handler instanceof IReadOnlyHandler) {
+ return ((IReadOnlyHandler)handler).isReadOnly(eObject, domain).get();
+ }
+
+ if(eObject.eResource() != null) {
+ return domain.isReadOnly(eObject.eResource());
+ }
+ }
+ return false;
}
/**
@@ -476,14 +477,19 @@ public class EMFHelper {
* True if the Resource is read only
*/
public static boolean isReadOnly(final Resource resource, final EditingDomain domain) {
- if(domain instanceof AdapterFactoryEditingDomain) {
- return ((AdapterFactoryEditingDomain)domain).isReadOnly(resource);
- }
-
if(resource == null) {
return false;
}
+ if(domain != null && resource.getURI() != null) {
+ Object handler = Platform.getAdapterManager().getAdapter(domain, IReadOnlyHandler.class);
+ if(handler instanceof IReadOnlyHandler) {
+ return ((IReadOnlyHandler)handler).anyReadOnly(new URI[]{ resource.getURI() }, domain).get();
+ }
+ return domain.isReadOnly(resource);
+ }
+
+ // no editing domain : use file system attribute
ResourceSet resourceSet = resource.getResourceSet();
if(resourceSet == null) {
@@ -642,26 +648,9 @@ public class EMFHelper {
* @return the usages or null if there is no usages
*/
public static Collection<Setting> getUsages(EObject source) {
- if(source == null) {
- return Collections.emptyList();
- }
-
- ECrossReferenceAdapter crossReferencer = ECrossReferenceAdapter.getCrossReferenceAdapter(source);
- if(crossReferencer == null) {
- // try to register a cross referencer at the highest level
- crossReferencer = new ECrossReferenceAdapter();
- if(source.eResource() != null) {
- if(source.eResource().getResourceSet() != null) {
- crossReferencer.setTarget(source.eResource().getResourceSet());
- } else {
- crossReferencer.setTarget(source.eResource());
- }
- } else {
- crossReferencer.setTarget(source);
- }
- }
-
- return crossReferencer.getInverseReferences(source, true);
+ // the functional code is defined in core because we need it in infra.core
+ // but infra.core can't depend on infra.emf (circular dependency)
+ return ProxyModificationTrackingAdapter.getUsages(source);
}
diff --git a/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/META-INF/MANIFEST.MF b/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/META-INF/MANIFEST.MF
index 71e6ba3eb2e..e33e65518bd 100644
--- a/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/META-INF/MANIFEST.MF
+++ b/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/META-INF/MANIFEST.MF
@@ -4,7 +4,8 @@ Require-Bundle: org.eclipse.ui,
org.eclipse.emf;bundle-version="2.6.0",
org.eclipse.gmf.runtime.emf.type.core;bundle-version="1.4.0",
org.eclipse.papyrus.infra.core.log;bundle-version="0.10.0",
- org.eclipse.papyrus.infra.core;bundle-version="0.10.0"
+ org.eclipse.papyrus.infra.core;bundle-version="0.10.0",
+ org.eclipse.papyrus.infra.emf;bundle-version="0.10.0"
Export-Package: org.eclipse.papyrus.infra.services.edit,
org.eclipse.papyrus.infra.services.edit.commands,
org.eclipse.papyrus.infra.services.edit.internal;x-internal:=true,
diff --git a/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/src/org/eclipse/papyrus/infra/services/edit/internal/ElementEditServiceProvider.java b/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/src/org/eclipse/papyrus/infra/services/edit/internal/ElementEditServiceProvider.java
index 585657ec559..c6098144371 100644
--- a/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/src/org/eclipse/papyrus/infra/services/edit/internal/ElementEditServiceProvider.java
+++ b/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/src/org/eclipse/papyrus/infra/services/edit/internal/ElementEditServiceProvider.java
@@ -21,15 +21,13 @@ import java.util.List;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.gmf.runtime.emf.type.core.ElementTypeRegistry;
import org.eclipse.gmf.runtime.emf.type.core.IClientContext;
import org.eclipse.gmf.runtime.emf.type.core.IElementType;
import org.eclipse.gmf.runtime.emf.type.core.NullElementType;
import org.eclipse.osgi.util.NLS;
-import org.eclipse.papyrus.infra.core.resource.ModelSet;
import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
import org.eclipse.papyrus.infra.services.edit.internal.context.TypeContext;
import org.eclipse.papyrus.infra.services.edit.messages.Messages;
import org.eclipse.papyrus.infra.services.edit.service.IElementEditService;
@@ -122,15 +120,7 @@ public class ElementEditServiceProvider implements IElementEditServiceProvider {
}
private boolean isReadOnly(EObject object) {
- boolean result = false;
-
- Resource resource = object.eResource();
- ResourceSet resourceSet = (resource == null) ? null : resource.getResourceSet();
- if (resourceSet instanceof ModelSet) {
- result = ((ModelSet) resourceSet).isReadOnly(object);
- }
-
- return result;
+ return EMFHelper.isReadOnly(object);
}
/**
diff --git a/plugins/team/org.eclipse.papyrus.team.svn/META-INF/MANIFEST.MF b/plugins/team/org.eclipse.papyrus.team.svn/META-INF/MANIFEST.MF
index 2f7b0e44f2d..3e0ea8fd43c 100644
--- a/plugins/team/org.eclipse.papyrus.team.svn/META-INF/MANIFEST.MF
+++ b/plugins/team/org.eclipse.papyrus.team.svn/META-INF/MANIFEST.MF
@@ -6,7 +6,9 @@ Require-Bundle: org.eclipse.papyrus.infra.onefile;bundle-version="0.10.0",
org.eclipse.team.svn.core;resolution:=optional,
org.eclipse.papyrus.infra.emf.readonly;bundle-version="0.10.0",
org.eclipse.papyrus.infra.gmfdiag.commands;bundle-version="0.10.0",
- org.eclipse.emf.edit
+ org.eclipse.emf.edit,
+ org.eclipse.papyrus.infra.core,
+ com.google.guava;bundle-version="10.0.1"
Export-Package: org.eclipse.papyrus.team.svn
Bundle-Vendor: %providerName
Bundle-ActivationPolicy: lazy
diff --git a/plugins/team/org.eclipse.papyrus.team.svn/plugin.xml b/plugins/team/org.eclipse.papyrus.team.svn/plugin.xml
index 7e70529c9ea..403b2942f18 100644
--- a/plugins/team/org.eclipse.papyrus.team.svn/plugin.xml
+++ b/plugins/team/org.eclipse.papyrus.team.svn/plugin.xml
@@ -5,6 +5,7 @@
point="org.eclipse.papyrus.infra.emf.readonly.readOnlyHandler">
<readOnlyHandler
class="org.eclipse.papyrus.team.svn.SVNLockHandler"
+ id="org.eclipse.papyrus.team.svn.SVNLockHandler"
priority="20">
</readOnlyHandler>
</extension>
diff --git a/plugins/team/org.eclipse.papyrus.team.svn/src/org/eclipse/papyrus/team/svn/SVNLockHandler.java b/plugins/team/org.eclipse.papyrus.team.svn/src/org/eclipse/papyrus/team/svn/SVNLockHandler.java
index 2777ba14711..fd82e369c43 100644
--- a/plugins/team/org.eclipse.papyrus.team.svn/src/org/eclipse/papyrus/team/svn/SVNLockHandler.java
+++ b/plugins/team/org.eclipse.papyrus.team.svn/src/org/eclipse/papyrus/team/svn/SVNLockHandler.java
@@ -24,16 +24,17 @@ import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.papyrus.infra.emf.readonly.IReadOnlyHandler;
+import org.eclipse.papyrus.infra.emf.readonly.AbstractReadOnlyHandler;
import org.eclipse.team.svn.core.IStateFilter;
import org.eclipse.team.svn.core.svnstorage.SVNRemoteStorage;
import org.eclipse.team.svn.core.utility.FileUtility;
import org.eclipse.team.svn.ui.SVNTeamModificationValidator;
-public class SVNLockHandler implements IReadOnlyHandler {
+import com.google.common.base.Optional;
- FileModificationValidator validator = null;
+public class SVNLockHandler extends AbstractReadOnlyHandler {
+ FileModificationValidator validator = null;
public SVNLockHandler() {
try {
@@ -42,18 +43,26 @@ public class SVNLockHandler implements IReadOnlyHandler {
}
}
- public boolean isReadOnly(URI[] uris, EditingDomain editingDomain) {
+ public Optional<Boolean> anyReadOnly(URI[] uris, EditingDomain editingDomain) {
if (validator != null) {
IResource[] needsLockResources = FileUtility.filterResources(getIFiles(uris), IStateFilter.SF_NEEDS_LOCK, IResource.DEPTH_ZERO);
for(IResource needsLockResource : needsLockResources) {
if(!SVNRemoteStorage.instance().asLocalResource(needsLockResource).isLocked()) {
- return true;
+ return Optional.of(Boolean.TRUE);
}
}
}
- return false;
+ return Optional.absent();
+ }
+
+ public Optional<Boolean> makeWritable(URI[] uris, EditingDomain editingDomain) {
+ if (validator != null) {
+ IStatus result = validator.validateEdit(getIFiles(uris), FileModificationValidationContext.VALIDATE_PROMPT);
+ return Optional.of(result.isOK());
+ }
+ return Optional.absent();
}
private IFile[] getIFiles(URI[] uris) {
@@ -73,12 +82,4 @@ public class SVNLockHandler implements IReadOnlyHandler {
}
return null;
}
-
- public boolean enableWrite(URI[] uris, EditingDomain editingDomain) {
- if (validator != null) {
- IStatus result = validator.validateEdit(getIFiles(uris), FileModificationValidationContext.VALIDATE_PROMPT);
- return result.isOK();
- }
- return false;
- }
}
diff --git a/plugins/uml/org.eclipse.papyrus.uml.profile/META-INF/MANIFEST.MF b/plugins/uml/org.eclipse.papyrus.uml.profile/META-INF/MANIFEST.MF
index 82dd3c326da..2ed4bc3c501 100644
--- a/plugins/uml/org.eclipse.papyrus.uml.profile/META-INF/MANIFEST.MF
+++ b/plugins/uml/org.eclipse.papyrus.uml.profile/META-INF/MANIFEST.MF
@@ -16,7 +16,8 @@ Require-Bundle: org.eclipse.emf.facet.infra.browser.uicore;bundle-version="0.1.0
org.eclipse.uml2.uml.editor;bundle-version="4.0.0",
org.eclipse.papyrus.infra.emf;bundle-version="0.10.0",
org.eclipse.ui.views.properties.tabbed;bundle-version="3.5.300",
- org.eclipse.papyrus.infra.services.labelprovider;bundle-version="0.10.0"
+ org.eclipse.papyrus.infra.services.labelprovider;bundle-version="0.10.0",
+ com.google.guava;bundle-version="10.0.1"
Export-Package: org.eclipse.papyrus.uml.profile,
org.eclipse.papyrus.uml.profile.constraints,
org.eclipse.papyrus.uml.profile.definition,
diff --git a/plugins/uml/org.eclipse.papyrus.uml.profile/src/org/eclipse/papyrus/uml/profile/readonly/AppliedProfileReadOnlyHandler.java b/plugins/uml/org.eclipse.papyrus.uml.profile/src/org/eclipse/papyrus/uml/profile/readonly/AppliedProfileReadOnlyHandler.java
index cfba440cf94..698f02c8d2d 100644
--- a/plugins/uml/org.eclipse.papyrus.uml.profile/src/org/eclipse/papyrus/uml/profile/readonly/AppliedProfileReadOnlyHandler.java
+++ b/plugins/uml/org.eclipse.papyrus.uml.profile/src/org/eclipse/papyrus/uml/profile/readonly/AppliedProfileReadOnlyHandler.java
@@ -12,24 +12,25 @@
package org.eclipse.papyrus.uml.profile.readonly;
import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.papyrus.infra.core.resource.ModelSet;
-import org.eclipse.papyrus.infra.emf.readonly.IReadOnlyHandler;
+import org.eclipse.papyrus.infra.emf.readonly.AbstractReadOnlyHandler;
import org.eclipse.papyrus.uml.tools.model.UmlModel;
import org.eclipse.uml2.uml.Profile;
+import com.google.common.base.Optional;
-public class AppliedProfileReadOnlyHandler implements IReadOnlyHandler {
- public boolean isReadOnly(URI[] uris, EditingDomain editingDomain) {
+public class AppliedProfileReadOnlyHandler extends AbstractReadOnlyHandler {
+
+ public Optional<Boolean> anyReadOnly(URI[] uris, EditingDomain editingDomain) {
if(editingDomain != null) {
Resource mainUmlResource = null;
if(editingDomain.getResourceSet() instanceof ModelSet) {
UmlModel umlModel = (UmlModel)((ModelSet)editingDomain.getResourceSet()).getModel(UmlModel.MODEL_ID);
if(umlModel == null) {
- return false;
+ return Optional.absent();
}
mainUmlResource = umlModel.getResource();
}
@@ -37,12 +38,12 @@ public class AppliedProfileReadOnlyHandler implements IReadOnlyHandler {
for(URI uri : uris) {
Resource resource = editingDomain.getResourceSet().getResource(uri, false);
if(isProfileResource(resource) && mainUmlResource != resource) {
- return true;
+ return Optional.of(Boolean.TRUE);
}
}
}
- return false;
+ return Optional.absent();
}
private boolean isProfileResource(Resource resource) {
@@ -50,17 +51,15 @@ public class AppliedProfileReadOnlyHandler implements IReadOnlyHandler {
return false;
}
- for(EObject rootElement : resource.getContents()) {
- if(rootElement instanceof Profile) {
- return true;
- }
+ if (!resource.getContents().isEmpty() && resource.getContents().get(0) instanceof Profile) {
+ return true;
}
return false;
}
- public boolean enableWrite(URI[] uris, EditingDomain editingDomain) {
- return false; //Applied profiles should remain read-only
+ public Optional<Boolean> makeWritable(URI[] uris, EditingDomain editingDomain) {
+ return Optional.absent(); //Applied profiles should remain read-only
}
}
diff --git a/plugins/uml/tools/org.eclipse.papyrus.uml.tools/src/org/eclipse/papyrus/uml/tools/model/ExtendedUmlModel.java b/plugins/uml/tools/org.eclipse.papyrus.uml.tools/src/org/eclipse/papyrus/uml/tools/model/ExtendedUmlModel.java
index 462e8f3fec7..179f82eeee2 100644
--- a/plugins/uml/tools/org.eclipse.papyrus.uml.tools/src/org/eclipse/papyrus/uml/tools/model/ExtendedUmlModel.java
+++ b/plugins/uml/tools/org.eclipse.papyrus.uml.tools/src/org/eclipse/papyrus/uml/tools/model/ExtendedUmlModel.java
@@ -8,9 +8,7 @@ import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
-import org.eclipse.emf.common.util.WrappedException;
import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.papyrus.infra.core.resource.ModelUtils;
/**
* A UML model whose resource is either a uml file or a profile(?).
@@ -45,16 +43,7 @@ public class ExtendedUmlModel extends UmlModel {
if(r.getFullPath().removeFileExtension().lastSegment().equals(fullPath.lastSegment()) && !"di".equalsIgnoreCase(extension) && !"notation".equalsIgnoreCase(extension)) {
if(Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().get(extension) != null) {
resourceURI = getPlatformURI(r.getFullPath());
- try {
- resource = getResourceSet().getResource(resourceURI, true);
- } catch (WrappedException e) {
- if (ModelUtils.isDegradedModeAllowed(e.getCause())){
- resource = getResourceSet().getResource(resourceURI, false);
- if (resource == null){
- throw e;
- }
- }
- }
+ resource = getResourceSet().getResource(resourceURI, true);
break;
}
}

Back to the top