blob: 581d649927a6f94b47fb6c389da986597e3cd0fb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2007 IBM Corporation and others.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
*******************************************************************************/
package org.eclipse.dltk.core.search;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.core.search.index.Index;
import org.eclipse.dltk.core.search.indexing.IndexManager;
import org.eclipse.dltk.internal.core.ModelManager;
/**
* A search participant describes a particular extension to a generic search
* mechanism, permitting combined search actions which will involve all required
* participants.
* <p>
* A search participant is involved in the indexing phase and in the search
* phase. The indexing phase consists in taking one or more search documents,
* parse them, and add index entries in an index chosen by the participant. An
* index is identified by a path on disk. The search phase consists in selecting
* the indexes corresponding to a search pattern and a search scope, from these
* indexes the search infrastructure extracts the document paths that match the
* search pattern asking the search participant for the corresponding document,
* finally the search participant is asked to locate the matches precisely in
* these search documents.
* </p>
* <p>
* This class is intended to be subclassed by clients. During the indexing
* phase, a subclass will be called with the following requests in order:
* <ul>
* <li>{@link #scheduleDocumentIndexing(SearchDocument, IPath)}</li>
* <li>{@link #indexDocument(SearchDocument, IPath)}</li>
* </ul>
* During the search phase, a subclass will be called with the following
* requests in order:
* <ul>
* <li>{@link #selectIndexes(SearchPattern, IJavaSearchScope)}</li>
* <li>one or more {@link #getDocument(String)}</li>
* <li>
* {@link #locateMatches(SearchDocument[], SearchPattern, IJavaSearchScope, SearchRequestor, IProgressMonitor)}
* </li>
* </ul>
* </p>
*
*
*/
public abstract class SearchParticipant {
/**
* Creates a new search participant.
*/
protected SearchParticipant() {
// do nothing
}
/**
* Notification that this participant's help is needed in a search.
* <p>
* This method should be re-implemented in subclasses that need to do
* something when the participant is needed in a search.
* </p>
*/
public void beginSearching() {
// do nothing
}
/**
* Notification that this participant's help is no longer needed.
* <p>
* This method should be re-implemented in subclasses that need to do
* something when the participant is no longer needed in a search.
* </p>
*/
public void doneSearching() {
// do nothing
}
/**
* Returns a displayable name of this search participant.
* <p>
* This method should be re-implemented in subclasses that need to display a
* meaningfull name.
* </p>
*
* @return the displayable name of this search participant
*/
public String getDescription() {
return "Search participant"; //$NON-NLS-1$
}
/**
* Returns a search document for the given path. The given document path is
* a string that uniquely identifies the document. Most of the time it is a
* workspace-relative path, but it can also be a file system path, or a path
* inside a zip file.
* <p>
* Implementors of this method can either create an instance of their own
* subclass of {@link SearchDocument} or return an existing instance of such
* a subclass.
* </p>
*
* @param documentPath
* the path of the document.
* @return a search document
*/
public abstract SearchDocument getDocument(String documentPath,
IProject project);
/**
* Locates the matches in the given documents using the given search pattern
* and search scope, and reports them to the givenn search requestor. This
* method is called by the search engine once it has search documents
* matching the given pattern in the given search scope.
* <p>
* Note that a participant (e.g. a JSP participant) can pre-process the
* contents of the given documents, create its own documents whose contents
* are Script compilation units and delegate the match location to the
* default participant (see
* {@link SearchEngine#getDefaultSearchParticipant()}). Passing its own
* {@link SearchRequestor} this particpant can then map the match positions
* back to the original contents, create its own matches and report them to
* the original requestor.
* </p>
* <p>
* Implementors of this method should check the progress monitor for
* cancelation when it is safe and appropriate to do so. The cancelation
* request should be propagated to the caller by throwing
* <code>OperationCanceledException</code>.
* </p>
*
* @param documents
* the documents to locate matches in
* @param pattern
* the search pattern to use when locating matches
* @param scope
* the scope to limit the search to
* @param requestor
* the requestor to report matches to
* @param monitor
* the progress monitor to report progress to, or
* <code>null</code> if no progress should be reported
* @throws CoreException
* if the requestor had problem accepting one of the matches
*/
public abstract void locateMatches(SearchDocument[] documents,
SearchPattern pattern, IDLTKSearchScope scope,
SearchRequestor requestor, IProgressMonitor monitor)
throws CoreException;
/**
* Return correct source modules from selected index matches.
*
* @param matches
* @param scope
* @param subMonitor
* @return
*/
public abstract ISourceModule[] locateModules(SearchDocument[] matches,
IDLTKSearchScope scope, IProgressMonitor subMonitor)
throws CoreException;
/**
* Removes the index for a given path.
* <p>
* The given index location must represent a path in the file system to a
* file that already exists and must be an index file, otherwise nothing
* will be done.
* </p>
* <p>
* It is strongly recommended to use this method instead of deleting file
* directly otherwise cached index will not be removed.
* </p>
*
* @param indexLocation
* the location in the file system to the index
*
*/
public void removeIndex(IPath indexLocation) {
IndexManager manager = ModelManager.getModelManager().getIndexManager();
manager.removeIndexPath(indexLocation);
}
/**
* Returns the collection of index locations to consider when performing the
* given search query in the given scope. The search engine calls this
* method before locating matches.
* <p>
* An index location represents a path in the file system to a file that
* holds index information.
* </p>
* <p>
* Clients are not expected to call this method.
* </p>
*
* @param query
* the search pattern to consider
* @param scope
* the given search scope
* @return the collection of index paths to consider
*/
public abstract IPath[] selectIndexes(SearchPattern query,
IDLTKSearchScope scope);
public abstract IPath[] selectMixinIndexes(SearchPattern query,
IDLTKSearchScope scope);
public abstract void skipNotMixin();
/**
* Used then searcj, if selected index are skipped, it not inclouded in
* search.
*/
public abstract boolean isSkipped(Index index);
}