001: /*******************************************************************************
002: * Copyright (c) 2000, 2006 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.pde.internal.core.search;
011:
012: import java.util.ArrayList;
013: import java.util.regex.Pattern;
014:
015: import org.eclipse.core.runtime.IProgressMonitor;
016: import org.eclipse.pde.core.plugin.IFragment;
017: import org.eclipse.pde.core.plugin.IPlugin;
018: import org.eclipse.pde.core.plugin.IPluginBase;
019: import org.eclipse.pde.core.plugin.IPluginExtension;
020: import org.eclipse.pde.core.plugin.IPluginExtensionPoint;
021: import org.eclipse.pde.core.plugin.IPluginImport;
022: import org.eclipse.pde.core.plugin.IPluginModelBase;
023: import org.eclipse.pde.core.plugin.IPluginObject;
024: import org.eclipse.pde.internal.core.util.PatternConstructor;
025:
026: public class PluginSearchOperation {
027: protected PluginSearchInput fInput;
028: private IPluginSearchResultCollector fCollector;
029: private Pattern fPattern;
030:
031: public PluginSearchOperation(PluginSearchInput input,
032: IPluginSearchResultCollector collector) {
033: this .fInput = input;
034: this .fCollector = collector;
035: collector.setOperation(this );
036: this .fPattern = PatternConstructor.createPattern(input
037: .getSearchString(), input.isCaseSensitive());
038: }
039:
040: public void execute(IProgressMonitor monitor) {
041: IPluginModelBase[] entries = fInput.getSearchScope()
042: .getMatchingModels();
043: fCollector.searchStarted();
044: fCollector.setProgressMonitor(monitor);
045: monitor.beginTask("", entries.length); //$NON-NLS-1$
046:
047: try {
048: for (int i = 0; i < entries.length; i++) {
049: IPluginModelBase candidate = entries[i];
050: visit(candidate);
051: monitor.worked(1);
052: }
053: } finally {
054: monitor.done();
055: fCollector.done();
056: }
057: }
058:
059: private void visit(IPluginModelBase model) {
060: ArrayList matches = findMatch(model);
061: for (int i = 0; i < matches.size(); i++) {
062: fCollector.accept((IPluginObject) matches.get(i));
063: }
064: }
065:
066: private ArrayList findMatch(IPluginModelBase model) {
067: ArrayList result = new ArrayList();
068: int searchLimit = fInput.getSearchLimit();
069: switch (fInput.getSearchElement()) {
070: case PluginSearchInput.ELEMENT_PLUGIN:
071: if (searchLimit != PluginSearchInput.LIMIT_REFERENCES)
072: findPluginDeclaration(model, result);
073: if (searchLimit != PluginSearchInput.LIMIT_DECLARATIONS)
074: findPluginReferences(model, result);
075: break;
076: case PluginSearchInput.ELEMENT_FRAGMENT:
077: findFragmentDeclaration(model, result);
078: break;
079: case PluginSearchInput.ELEMENT_EXTENSION_POINT:
080: if (searchLimit != PluginSearchInput.LIMIT_REFERENCES)
081: findExtensionPointDeclarations(model, result);
082: if (searchLimit != PluginSearchInput.LIMIT_DECLARATIONS)
083: findExtensionPointReferences(model, result);
084: break;
085: }
086: return result;
087: }
088:
089: private void findFragmentDeclaration(IPluginModelBase model,
090: ArrayList result) {
091: IPluginBase pluginBase = model.getPluginBase();
092: if (pluginBase instanceof IFragment
093: && fPattern.matcher(pluginBase.getId()).matches()) {
094: result.add(pluginBase);
095: }
096: }
097:
098: private void findPluginDeclaration(IPluginModelBase model,
099: ArrayList result) {
100: IPluginBase pluginBase = model.getPluginBase();
101: if (pluginBase instanceof IPlugin
102: && fPattern.matcher(pluginBase.getId()).matches())
103: result.add(pluginBase);
104: }
105:
106: private void findPluginReferences(IPluginModelBase model,
107: ArrayList result) {
108: IPluginBase pluginBase = model.getPluginBase();
109: if (pluginBase instanceof IFragment) {
110: if (fPattern
111: .matcher(((IFragment) pluginBase).getPluginId())
112: .matches())
113: result.add(pluginBase);
114: }
115: IPluginImport[] imports = pluginBase.getImports();
116: for (int i = 0; i < imports.length; i++) {
117: if (fPattern.matcher(imports[i].getId()).matches())
118: result.add(imports[i]);
119: }
120: }
121:
122: private void findExtensionPointDeclarations(IPluginModelBase model,
123: ArrayList result) {
124: IPluginExtensionPoint[] extensionPoints = model.getPluginBase()
125: .getExtensionPoints();
126: for (int i = 0; i < extensionPoints.length; i++) {
127: if (fPattern.matcher(extensionPoints[i].getFullId())
128: .matches())
129: result.add(extensionPoints[i]);
130: }
131: }
132:
133: private void findExtensionPointReferences(IPluginModelBase model,
134: ArrayList result) {
135: IPluginExtension[] extensions = model.getPluginBase()
136: .getExtensions();
137: for (int i = 0; i < extensions.length; i++) {
138: if (fPattern.matcher(extensions[i].getPoint()).matches())
139: result.add(extensions[i]);
140: }
141: }
142:
143: }
|