diff options
| author | Pierre-Charles David | 2017-01-24 10:00:16 +0000 |
|---|---|---|
| committer | Pierre-Charles David | 2017-08-22 09:45:01 +0000 |
| commit | 82112831e1d5f557b444e9e8b9be7baed927ce58 (patch) | |
| tree | e8c2b9e7aa6a44ec8ac09263505bfb302d9cab60 | |
| parent | f2d6dda40977a9096210d02e499447e6ab1fa1dc (diff) | |
| download | org.eclipse.sirius-82112831e1d5f557b444e9e8b9be7baed927ce58.tar.gz org.eclipse.sirius-82112831e1d5f557b444e9e8b9be7baed927ce58.tar.xz org.eclipse.sirius-82112831e1d5f557b444e9e8b9be7baed927ce58.zip | |
[510928] Always unload InMemoryResources to release their buffers
Bug: 510928
Change-Id: I4d2007820d920e1cc233e633bd1417eeb853c09e
Signed-off-by: Pierre-Charles David <pierre-charles.david@obeo.fr>
2 files changed, 20 insertions, 8 deletions
diff --git a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/api/resource/strategy/LegacyReleaseResourceStrategyImpl.java b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/api/resource/strategy/LegacyReleaseResourceStrategyImpl.java index b216de1cab..28ff5d9baa 100644 --- a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/api/resource/strategy/LegacyReleaseResourceStrategyImpl.java +++ b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/api/resource/strategy/LegacyReleaseResourceStrategyImpl.java @@ -11,23 +11,23 @@ package org.eclipse.sirius.business.api.resource.strategy; import java.text.MessageFormat; +import java.util.Objects; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.sirius.business.api.query.URIQuery; import org.eclipse.sirius.viewpoint.Messages; import org.eclipse.sirius.viewpoint.SiriusPlugin; /** - * This legacy implementation can be used by client who don't want the new - * optimized behavior. They just have to contributed to {@link ResourceStrategy} - * extension point with this class to keep the old and non optimized + * This legacy implementation can be used by client who don't want the new optimized behavior. They just have to + * contributed to {@link ResourceStrategy} extension point with this class to keep the old and non optimized * behavior.</br> * - * @deprecated This class corresponds to the previous code. It will be removed - * in a future version of Sirius (6.0.0). + * @deprecated This class corresponds to the previous code. It will be removed in a future version of Sirius (6.0.0). * * @author <a href="mailto:laurent.fasani@obeo.fr">Laurent Fasani</a> */ @@ -37,8 +37,12 @@ public class LegacyReleaseResourceStrategyImpl extends AbstractResourceStrategyI @Override public IStatus releaseResourceAtResourceSetDispose(Resource resource, IProgressMonitor monitor) { try { - // Don't try to unload metamodel resources. - if (!isFromPackageRegistry(resource)) { + URI uri = resource.getURI(); + if (uri != null && Objects.equals(URIQuery.INMEMORY_URI_SCHEME, uri.scheme())) { + // InMemory resources must be unloaded explicitly for their memory + // buffers to be released. + resource.unload(); + } else if (!isFromPackageRegistry(resource)) { resource.unload(); } } catch (final IllegalStateException e) { diff --git a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/resource/strategy/DefaultResourceStrategyImpl.java b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/resource/strategy/DefaultResourceStrategyImpl.java index a97cf3f4de..fd72829dac 100644 --- a/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/resource/strategy/DefaultResourceStrategyImpl.java +++ b/plugins/org.eclipse.sirius/src/org/eclipse/sirius/business/internal/resource/strategy/DefaultResourceStrategyImpl.java @@ -10,6 +10,8 @@ *******************************************************************************/ package org.eclipse.sirius.business.internal.resource.strategy; +import java.util.Objects; + import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; @@ -18,6 +20,7 @@ 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.sirius.business.api.query.URIQuery; import org.eclipse.sirius.business.api.resource.strategy.AbstractResourceStrategyImpl; import org.eclipse.sirius.viewpoint.SiriusPlugin; @@ -36,7 +39,12 @@ public class DefaultResourceStrategyImpl extends AbstractResourceStrategyImpl { @Override public IStatus releaseResourceAtResourceSetDispose(Resource resource, IProgressMonitor monitor) { // optimized implementation that avoids to unload the resource - if (!isFromPackageRegistry(resource)) { + URI uri = resource.getURI(); + if (uri != null && Objects.equals(URIQuery.INMEMORY_URI_SCHEME, uri.scheme())) { + // InMemory resources must be unloaded explicitly for their memory + // buffers to be released. + resource.unload(); + } else if (!isFromPackageRegistry(resource)) { TreeIterator<EObject> allContents = EcoreUtil.getAllProperContents(resource, false); while (allContents.hasNext()) { EObject eObject = allContents.next(); |
