Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEsteban Dugueperoux2015-05-07 09:02:23 +0000
committerEsteban DUGUEPEROUX2015-05-07 10:54:36 +0000
commit4d528ba673a18bf82fed7d0aaded7edbed196422 (patch)
treebe71541b6e509a9a85043cd21cdfd3d8452f732b
parent982bab0c3d9d53c7c8ab721ea222e917eae17c39 (diff)
downloadorg.eclipse.sirius-4d528ba673a18bf82fed7d0aaded7edbed196422.tar.gz
org.eclipse.sirius-4d528ba673a18bf82fed7d0aaded7edbed196422.tar.xz
org.eclipse.sirius-4d528ba673a18bf82fed7d0aaded7edbed196422.zip
[466692] IOException on semantic resource drop in a Modeling Project
Don't save read-only semantic resource and metamodel resource. Bug: 466692 Change-Id: Ib2e6ef5cddfcffffc92df3483b83e5309acdb736 Signed-off-by: Esteban Dugueperoux <esteban.dugueperoux@obeo.fr>
-rw-r--r--plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/api/resource/ResourceSetSync.java24
-rw-r--r--plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/ResourceSaveDiagnose.java10
2 files changed, 25 insertions, 9 deletions
diff --git a/plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/api/resource/ResourceSetSync.java b/plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/api/resource/ResourceSetSync.java
index 27e41b6581..ed1e85d2b3 100644
--- a/plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/api/resource/ResourceSetSync.java
+++ b/plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/api/resource/ResourceSetSync.java
@@ -218,15 +218,31 @@ public final class ResourceSetSync extends ResourceSetListenerImpl implements Re
boolean readonly = false;
URI resourceURI = resource.getURI();
ResourceSet resourceSet = resource.getResourceSet();
- if (resourceURI != null
- && (EPackage.Registry.INSTANCE.containsKey(resourceURI.toString()) || (resourceSet != null && Boolean.TRUE.equals(resourceSet.getURIConverter().getAttributes(resourceURI, null)
- .get(URIConverter.ATTRIBUTE_READ_ONLY))))) {
+ if (resourceURI != null && isMetamodel(resource)
+ || (resourceSet != null && Boolean.TRUE.equals(resourceSet.getURIConverter().getAttributes(resourceURI, null).get(URIConverter.ATTRIBUTE_READ_ONLY)))) {
readonly = true;
}
return readonly;
}
/**
+ * Test if the specified resource corresponds to a {@link EPackage} from
+ * central {@link EPackage.Registry} or one from {@link ResourceSet}.
+ *
+ * @param resource
+ * the {@link Resource} to test
+ * @return true if the resource corresponds to a {@link EPackage}, false
+ * otherwise
+ */
+ private static boolean isMetamodel(Resource resource) {
+ boolean isMetamodel = false;
+ URI resourceURI = resource.getURI();
+ ResourceSet resourceSet = resource.getResourceSet();
+ isMetamodel = EPackage.Registry.INSTANCE.containsKey(resourceURI.toString()) || resourceSet != null && resourceSet.getPackageRegistry().containsKey(resourceURI.toString());
+ return isMetamodel;
+ }
+
+ /**
* This method is an utility method to remove the synchronizer from a
* resourceset.
*
@@ -389,6 +405,7 @@ public final class ResourceSetSync extends ResourceSetListenerImpl implements Re
/**
* {@inheritDoc}
*/
+ @Override
public void statusChanged(final Resource resource, final ResourceStatus oldStatus, final ResourceStatus newStatus) {
/*
* we're handling the changes from the workspace backend in batch in the
@@ -404,6 +421,7 @@ public final class ResourceSetSync extends ResourceSetListenerImpl implements Re
* You should not need to call this method, it's called by the synchronizer
* backends to give updates to the synchronizer.
*/
+ @Override
public void statusesChanged(Collection<ResourceStatusChange> changesFromBackend) {
Collection<ResourceStatusChange> changesToTransmit = Sets.newLinkedHashSet();
for (ResourceStatusChange changeFromWorkspace : changesFromBackend) {
diff --git a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/ResourceSaveDiagnose.java b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/ResourceSaveDiagnose.java
index b4e3aeed09..fb8c6909bd 100644
--- a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/ResourceSaveDiagnose.java
+++ b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/session/danalysis/ResourceSaveDiagnose.java
@@ -18,9 +18,9 @@ import java.util.Map;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.URIConverter;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.sirius.common.tools.api.resource.ResourceSetSync;
/**
* Class able to tell whether a save operation on a resource can succeed or not,
@@ -51,9 +51,7 @@ public class ResourceSaveDiagnose {
* @return true if the resource might be saved, false otherwise.
*/
public boolean isSaveable() {
- boolean isSaveable = false;
- ResourceSet resourceSet = resourcetoSave.getResourceSet();
- isSaveable = resourceSet != null && !Boolean.TRUE.equals(resourceSet.getURIConverter().getAttributes(resourcetoSave.getURI(), null).get(URIConverter.ATTRIBUTE_READ_ONLY));
+ boolean isSaveable = !ResourceSetSync.isReadOnly(resourcetoSave);
return isSaveable;
}
@@ -110,8 +108,8 @@ public class ResourceSaveDiagnose {
final InputStream newContents = uriConverter.createInputStream(temporaryFileURI);
try {
final byte[] oldContentBuffer = new byte[4000];
- LOOP: for (int oldLength = oldContents.read(oldContentBuffer), newLength = newContents.read(newContentBuffer); (equal = oldLength == newLength) && oldLength > 0; oldLength = oldContents
- .read(oldContentBuffer), newLength = newContents.read(newContentBuffer)) {
+ LOOP: for (int oldLength = oldContents.read(oldContentBuffer), newLength = newContents.read(newContentBuffer); (equal = oldLength == newLength)
+ && oldLength > 0; oldLength = oldContents.read(oldContentBuffer), newLength = newContents.read(newContentBuffer)) {
for (int i = 0; i < oldLength; ++i) {
if (oldContentBuffer[i] != newContentBuffer[i]) {
equal = false;

Back to the top