diff options
| author | Esteban Dugueperoux | 2015-05-07 09:02:23 +0000 |
|---|---|---|
| committer | Esteban DUGUEPEROUX | 2015-05-07 10:54:36 +0000 |
| commit | 4d528ba673a18bf82fed7d0aaded7edbed196422 (patch) | |
| tree | be71541b6e509a9a85043cd21cdfd3d8452f732b | |
| parent | 982bab0c3d9d53c7c8ab721ea222e917eae17c39 (diff) | |
| download | org.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>
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; |
