Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/views/org.eclipse.papyrus.views.search/src/org/eclipse/papyrus/views/search/scope/ScopeCollector.java')
-rw-r--r--plugins/views/org.eclipse.papyrus.views.search/src/org/eclipse/papyrus/views/search/scope/ScopeCollector.java251
1 files changed, 173 insertions, 78 deletions
diff --git a/plugins/views/org.eclipse.papyrus.views.search/src/org/eclipse/papyrus/views/search/scope/ScopeCollector.java b/plugins/views/org.eclipse.papyrus.views.search/src/org/eclipse/papyrus/views/search/scope/ScopeCollector.java
index fbcd9adff3f..74f22d98d04 100644
--- a/plugins/views/org.eclipse.papyrus.views.search/src/org/eclipse/papyrus/views/search/scope/ScopeCollector.java
+++ b/plugins/views/org.eclipse.papyrus.views.search/src/org/eclipse/papyrus/views/search/scope/ScopeCollector.java
@@ -14,32 +14,28 @@
*****************************************************************************/
package org.eclipse.papyrus.views.search.scope;
+import static org.eclipse.papyrus.views.search.scope.WorkspaceScopeProvider.findPapyrusModels;
+
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
+import java.util.SortedSet;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
+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.plugin.RegistryReader;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.papyrus.infra.core.resource.ModelMultiException;
-import org.eclipse.papyrus.infra.core.resource.ModelSet;
-import org.eclipse.papyrus.infra.core.resource.NotFoundException;
-import org.eclipse.papyrus.infra.core.resource.sasheditor.SashModel;
-import org.eclipse.papyrus.infra.emf.utils.BusinessModelResolver;
-import org.eclipse.papyrus.infra.onefile.model.IPapyrusFile;
import org.eclipse.papyrus.views.search.Activator;
-import org.eclipse.papyrus.views.search.Messages;
-import org.eclipse.papyrus.views.search.utils.ModelUtils;
import org.eclipse.search.ui.ISearchPageContainer;
import org.eclipse.ui.IWorkingSet;
@@ -47,8 +43,12 @@ public class ScopeCollector implements IScopeCollector {
private static final ScopeCollector instance = new ScopeCollector();
+ private final Iterable<? extends IScopeProvider> scopeProviders;
+
private ScopeCollector() {
super();
+
+ scopeProviders = loadScopeProviders();
}
public final static ScopeCollector getInstance() {
@@ -128,55 +128,24 @@ public class ScopeCollector implements IScopeCollector {
Iterator<?> it = selection.iterator();
while(it.hasNext()) {
- Object object = (Object)it.next();
-
- if(object instanceof IPapyrusFile) {
- results.addAll(findPapyrusModels(((IPapyrusFile)object).getMainFile()));
- } else if(object instanceof IResource) {
- results.addAll(findPapyrusModels((IResource)object));
- } else {
- Object element = BusinessModelResolver.getInstance().getBusinessModel(object);
- if(element instanceof EObject) {
- // CDO resource *are* EObjects
- Resource eResource = (element instanceof Resource) ? (Resource) element : ((EObject)element).eResource();
- if(eResource != null) {
- ModelSet modelSet = null;
-
- try {
- modelSet = ModelUtils.openResource(eResource.getURI());
- SashModel sashModel = (SashModel)modelSet.getModelChecked(SashModel.MODEL_ID);
- Resource diResource = sashModel.getResource();
- if (diResource != null) {
- results.add(diResource.getURI());
- }
- } catch (ModelMultiException e) {
- //Do a workspace search instead
- results.addAll(createWorkspaceScope());
- } catch (NotFoundException e) {
- //Do a workspace search instead
- results.addAll(createWorkspaceScope());
- } finally {
- if (modelSet != null) {
- try {
- modelSet.unload();
- } catch (Exception e) {
- Activator.log.error(e);
- }
- }
- }
-
- } else {
- //Do a workspace search instead
- results.addAll(createWorkspaceScope());
- }
-
- } else {
- //Do a workspace search instead
- results.addAll(createWorkspaceScope());
+ Object next = it.next();
+
+ for (IScopeProvider provider : getScopeProviders()) {
+ Collection<URI> scope = provider.getScope(next);
+ if (!scope.isEmpty()) {
+ results.addAll(scope);
+
+ // don't consult the next provider
+ break;
}
-
}
}
+
+ if (results.isEmpty()) {
+ // search the workspace instead, then
+ results.addAll(createWorkspaceScope());
+ }
+
return results;
}
@@ -226,36 +195,162 @@ public class ScopeCollector implements IScopeCollector {
}
/**
- * Find all Papyrus models from a specific root
+ * Create a scope when the container is ISearchPageContainer.WORKSPACE_SCOPE
*
- * @param res
- * the root
* @return
- * the found Papyrus models
+ * the scope
*/
- protected Collection<URI> findPapyrusModels(IResource res) {
- ResourceVisitor visitor = new ResourceVisitor();
- try {
- res.accept(visitor, IResource.DEPTH_INFINITE);
- } catch (CoreException e) {
- Activator.log.warn(Messages.ScopeCollector_0 + res);
+ protected Collection<URI> createWorkspaceScope() {
+ Collection<URI> result = new ArrayList<URI>();
+
+ for (IScopeProvider next : getScopeProviders()) {
+ result.addAll(next.getScope());
}
+
+ return result;
+ }
- return visitor.getParticipantURIs();
+ private Iterable<? extends IScopeProvider> loadScopeProviders() {
+ return new ProvidersReader().load();
+ }
+
+ final Iterable<? extends IScopeProvider> getScopeProviders() {
+ List<IScopeProvider> result = new ArrayList<IScopeProvider>();
+
+ synchronized(scopeProviders) {
+ for (IScopeProvider next : scopeProviders) {
+ result.add(next);
+ }
+ }
+
+ return result;
+ }
+
+ //
+ // Nested types
+ //
+
+ private static class PriorityScopeProvider implements IScopeProvider, Comparable<PriorityScopeProvider> {
+ private final IScopeProvider delegate;
+
+ private final int priority;
+
+ public PriorityScopeProvider(IScopeProvider delegate, int priority) {
+ this.delegate = delegate;
+ this.priority = priority;
+ }
+
+ public int compareTo(PriorityScopeProvider o) {
+ // sort by descending priority
+ return o.priority - this.priority;
+ }
+
+ @Override
+ public int hashCode() {
+ return delegate.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return (obj instanceof PriorityScopeProvider) && ((PriorityScopeProvider) obj).delegate.equals(delegate);
+ }
+
+ //
+ // API delegation
+ //
+
+ public Collection<URI> getScope() {
+ return delegate.getScope();
+ }
+
+ public Collection<URI> getScope(Object selected) {
+ return delegate.getScope(selected);
+ }
}
+
+ private class ProvidersReader extends RegistryReader {
+ private static final String EXT_PT = "scopeProviders"; //$NON-NLS-1$
+
+ private static final String TAG_PROVIDER = "scopeProvider"; //$NON-NLS-1$
+
+ private static final String ATTR_CLASS = "class"; //$NON-NLS-1$
+
+ private static final String ATTR_PRIORITY = "priority"; //$NON-NLS-1$
+
+ private final SortedSet<PriorityScopeProvider> providers = new java.util.TreeSet<PriorityScopeProvider>();
- /**
- * Create a scope when the container is ISearchPageContainer.WORKSPACE_SCOPE
- *
- * @return
- * the scope
- */
- protected Collection<URI> createWorkspaceScope() {
+ ProvidersReader() {
+ super(Platform.getExtensionRegistry(), Activator.PLUGIN_ID, EXT_PT);
+ }
+
+ Iterable<? extends IScopeProvider> load() {
+ synchronized(providers) {
+ providers.clear();
+ readRegistry();
+ }
+
+ return providers;
+ }
+
+ @Override
+ protected boolean readElement(IConfigurationElement element, boolean add) {
+ boolean result = false;
- //Go through the workspace root
- IResource root = ResourcesPlugin.getWorkspace().getRoot();
+ if(TAG_PROVIDER.equals(element.getName())) {
+ result = true;
- return findPapyrusModels(root);
- }
+ String className = element.getAttribute(ATTR_CLASS);
+ if((className == null) || (className.length() == 0)) {
+ logMissingAttribute(element, ATTR_CLASS);
+ } else if(add) {
+ addProvider(element, className);
+ } else {
+ removeProvider(element, className);
+ }
+ }
+
+ return result;
+ }
+
+ private void addProvider(IConfigurationElement element, String className) {
+ try {
+ Object provider = element.createExecutableExtension(ATTR_CLASS);
+ if(!(provider instanceof IScopeProvider)) {
+ Activator.log.error("Scope provider extension does not implement IScopeProvider interface: " + className, null); //$NON-NLS-1$
+ } else {
+ String priorityString = element.getAttribute(ATTR_PRIORITY);
+ int priority = 0;
+
+ try {
+ if((priorityString) != null && (priorityString.length() > 0)) {
+ priority = Integer.parseInt(priorityString);
+ if(priority < 0) {
+ Activator.log.warn("Negative priority in scope provider " + className); //$NON-NLS-1$
+ priority = 0;
+ }
+ }
+ } catch (NumberFormatException e) {
+ Activator.log.warn("Not an integer priority in scope provider " + className); //$NON-NLS-1$
+ }
+
+ synchronized(providers) {
+ providers.add(new PriorityScopeProvider((IScopeProvider)provider, priority));
+ }
+ }
+ } catch (CoreException e) {
+ Activator.getDefault().getLog().log(e.getStatus());
+ }
+ }
+
+ private void removeProvider(IConfigurationElement element, String className) {
+ synchronized(providers) {
+ for (Iterator<PriorityScopeProvider> iter = providers.iterator(); iter.hasNext();) {
+ if (iter.next().delegate.getClass().getName().equals(className)) {
+ iter.remove();
+ }
+ }
+ }
+ }
+ }
}

Back to the top