diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/impl/LiveShadowedResourceDescriptions.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/impl/LiveShadowedResourceDescriptions.java index 10dfda898..f011ccf80 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/impl/LiveShadowedResourceDescriptions.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/impl/LiveShadowedResourceDescriptions.java @@ -7,7 +7,6 @@ *******************************************************************************/ package org.eclipse.xtext.resource.impl; -import java.util.Collections; import java.util.Map; import org.eclipse.emf.common.notify.Notifier; @@ -26,70 +25,80 @@ import org.eclipse.xtext.resource.ISelectable; import com.google.common.base.Function; import com.google.common.base.Predicate; -import com.google.common.base.Predicates; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.inject.Inject; /** * @author Jan Koehnlein - Initial contribution and API * @author Sebastian Zarnekow - Applied implementation pattern from DirtyStateAwareResourceDescriptions + * @author Knut Wannheden - Fixed performance issue caused by the inheritance from ResourceSetBasedResourceDescriptions + *

+ * The implementation now manages local resources using an injected {@link ResourceSetBasedResourceDescriptions} + * field. The class only inherits from {@link ResourceSetBasedResourceDescriptions} to remain backwards + * compatible with the initial 2.1 release. + * * @since 2.1 */ public class LiveShadowedResourceDescriptions extends ResourceSetBasedResourceDescriptions { - + @Inject - private IResourceDescriptions delegate; - + private ResourceSetBasedResourceDescriptions localDescriptions; + + @Inject + private IResourceDescriptions globalDescriptions; + @Override public void setContext(Notifier ctx) { - super.setContext(ctx); - if(delegate instanceof IResourceDescriptions.IContextAware) - ((IResourceDescriptions.IContextAware) delegate).setContext(ctx); + localDescriptions.setContext(ctx); + if(globalDescriptions instanceof IResourceDescriptions.IContextAware) + ((IResourceDescriptions.IContextAware) globalDescriptions).setContext(ctx); } - + @Override public IResourceDescription getResourceDescription(URI uri) { - IResourceDescription result = super.getResourceDescription(uri); + IResourceDescription result = localDescriptions.getResourceDescription(uri); if (result == null && !isExistingOrRenamedResourceURI(uri)) - result = delegate.getResourceDescription(uri); + result = globalDescriptions.getResourceDescription(uri); return result; } - + @Override public Iterable getAllResourceDescriptions() { - Iterable notInLiveResourceSet = Iterables.transform(delegate.getAllResourceDescriptions(), new Function() { - public IResourceDescription apply(IResourceDescription from) { - if (isExistingOrRenamedResourceURI(from.getURI())) { - return null; - } - return from; + Iterable notInLiveResourceSet = Iterables.filter(globalDescriptions.getAllResourceDescriptions(), new Predicate() { + public boolean apply(IResourceDescription input) { + return !isExistingOrRenamedResourceURI(input.getURI()); } }); - Iterable withNullEntries = Iterables.concat(super.getAllResourceDescriptions(), notInLiveResourceSet); - Iterable result = Iterables.filter(withNullEntries, Predicates.notNull()); + Iterable result = Iterables.concat(localDescriptions.getAllResourceDescriptions(), notInLiveResourceSet); return result; } @Override public boolean isEmpty() { - return delegate.isEmpty() && super.isEmpty(); + return globalDescriptions.isEmpty() && localDescriptions.isEmpty(); } - + + @Override + public ResourceSet getResourceSet() { + return localDescriptions.getResourceSet(); + } + @Override protected boolean hasDescription(URI uri) { - boolean result = super.hasDescription(uri); + boolean result = localDescriptions.hasDescription(uri); if (!result) { if (isExistingOrRenamedResourceURI(uri)) { result = false; } else { - result = delegate.getResourceDescription(uri) != null; + result = globalDescriptions.getResourceDescription(uri) != null; } } return result; } - + protected boolean isExistingOrRenamedResourceURI(URI uri) { - ResourceSet resourceSet = getResourceSet(); + ResourceSet resourceSet = localDescriptions.getResourceSet(); if (resourceSet instanceof ResourceSetImpl) { Map map = ((ResourceSetImpl) resourceSet).getURIResourceMap(); boolean result = map.containsKey(uri.trimFragment()); @@ -104,15 +113,15 @@ public class LiveShadowedResourceDescriptions extends ResourceSetBasedResourceDe public Iterable apply(ISelectable from) { if (from != null) return from.getExportedObjects(); - return Collections.emptyList(); + return ImmutableSet.of(); } })); } @Override public Iterable getExportedObjects(EClass type, QualifiedName name, boolean ignoreCase) { - Iterable liveDescriptions = super.getExportedObjects(type, name, ignoreCase); - Iterable persistentDescriptions = delegate.getExportedObjects(type, name, ignoreCase); + Iterable liveDescriptions = localDescriptions.getExportedObjects(type, name, ignoreCase); + Iterable persistentDescriptions = globalDescriptions.getExportedObjects(type, name, ignoreCase); return joinIterables(liveDescriptions, persistentDescriptions); } @@ -131,17 +140,17 @@ public class LiveShadowedResourceDescriptions extends ResourceSetBasedResourceDe @Override public Iterable getExportedObjectsByType(EClass type) { - Iterable liveDescriptions = super.getExportedObjectsByType(type); - Iterable persistentDescriptions = delegate.getExportedObjectsByType(type); + Iterable liveDescriptions = localDescriptions.getExportedObjectsByType(type); + Iterable persistentDescriptions = globalDescriptions.getExportedObjectsByType(type); return joinIterables(liveDescriptions, persistentDescriptions); } @Override public Iterable getExportedObjectsByObject(EObject object) { URI resourceURI = EcoreUtil2.getNormalizedResourceURI(object); - if (super.hasDescription(resourceURI)) - return super.getExportedObjectsByObject(object); - return delegate.getExportedObjectsByObject(object); + if (localDescriptions.hasDescription(resourceURI)) + return localDescriptions.getExportedObjectsByObject(object); + return globalDescriptions.getExportedObjectsByObject(object); } - + }