Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
Difference between revisions of "EMF Search Framework Extensibility---org.eclipse.emf.search.modelSearchEngine"
(→org.eclipse.emf.search.modelSearchEngine) |
(→org.eclipse.emf.search.modelSearchEngine) |
||
Line 25: | Line 25: | ||
</source> | </source> | ||
− | <source lang=" | + | <source lang="java"> |
import org.eclipse.emf.search.core.resource.AbstractModelResourceValidator; | import org.eclipse.emf.search.core.resource.AbstractModelResourceValidator; | ||
Line 37: | Line 37: | ||
addModelFileExtension("customers"); //$NON-NLS-1$ | addModelFileExtension("customers"); //$NON-NLS-1$ | ||
addModelFileExtension("orders"); //$NON-NLS-1$ | addModelFileExtension("orders"); //$NON-NLS-1$ | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | |||
+ | <source lang="java"> | ||
+ | import org.eclipse.emf.search.core.factories.IModelSearchQueryParametersFactory; | ||
+ | import org.eclipse.emf.search.core.parameters.AbstractModelSearchQueryParameters; | ||
+ | import org.eclipse.emf.search.core.parameters.IModelSearchQueryParameters; | ||
+ | |||
+ | /** | ||
+ | * Wraps ModelSearchQueryParameters creation. | ||
+ | */ | ||
+ | public class ModelSearchQueryParametersFactory implements | ||
+ | IModelSearchQueryParametersFactory { | ||
+ | private static ModelSearchQueryParametersFactory instance; | ||
+ | |||
+ | public ModelSearchQueryParametersFactory() { | ||
+ | } | ||
+ | |||
+ | public static ModelSearchQueryParametersFactory getInstance() { | ||
+ | return instance == null ? instance = new ModelSearchQueryParametersFactory() | ||
+ | : instance; | ||
+ | } | ||
+ | |||
+ | protected final class ModelSearchQueryParameters extends | ||
+ | AbstractModelSearchQueryParameters { | ||
+ | public String getModelSearchEngineID() { | ||
+ | return "search.MoviesDbSearchEngine"; //$NON-NLS-1$ | ||
+ | } | ||
+ | } | ||
+ | |||
+ | public IModelSearchQueryParameters createSearchQueryParameters() { | ||
+ | return new ModelSearchQueryParameters(); | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | <source lang="java"> | ||
+ | import org.eclipse.emf.search.core.engine.AbstractModelSearchQuery; | ||
+ | import org.eclipse.emf.search.core.factories.IModelSearchQueryFactory; | ||
+ | import org.eclipse.emf.search.core.parameters.IModelSearchQueryParameters; | ||
+ | import search.engine.ModelSearchQuery; | ||
+ | |||
+ | /** | ||
+ | * Wraps ModelSearchQuery creation. | ||
+ | */ | ||
+ | public class ModelSearchQueryFactory implements IModelSearchQueryFactory { | ||
+ | private static ModelSearchQueryFactory instance; | ||
+ | |||
+ | public ModelSearchQueryFactory() { | ||
+ | } | ||
+ | |||
+ | public static ModelSearchQueryFactory getInstance() { | ||
+ | return instance == null ? instance = new ModelSearchQueryFactory() | ||
+ | : instance; | ||
+ | } | ||
+ | |||
+ | public AbstractModelSearchQuery createModelSearchQuery(String expr, | ||
+ | IModelSearchQueryParameters p) { | ||
+ | return new ModelSearchQuery(expr, p); | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | <source lang="java"> | ||
+ | import java.util.ArrayList; | ||
+ | import java.util.List; | ||
+ | |||
+ | import org.eclipse.core.runtime.IStatus; | ||
+ | import org.eclipse.core.runtime.Status; | ||
+ | import org.eclipse.emf.ecore.EClassifier; | ||
+ | import org.eclipse.emf.ecore.ENamedElement; | ||
+ | import org.eclipse.emf.ecore.EObject; | ||
+ | import org.eclipse.core.runtime.IProgressMonitor; | ||
+ | import org.eclipse.emf.search.core.engine.IModelSearchQuery; | ||
+ | import org.eclipse.emf.search.core.eval.IModelSearchQueryEvaluator; | ||
+ | import org.eclipse.emf.search.core.parameters.IModelSearchQueryParameters; | ||
+ | import org.eclipse.emf.search.core.results.IModelResultEntry; | ||
+ | import org.eclipse.emf.search.ecore.engine.EcoreMetaModelIntrospector; | ||
+ | import org.eclipse.emf.search.ecore.engine.EcoreModelSearchQuery; | ||
+ | import org.eclipse.emf.search.ecore.results.EcoreModelSearchResultEntry; | ||
+ | import org.eclipse.emf.search.ecore.utils.EcoreModelLoaderUtil; | ||
+ | |||
+ | import search.Activator; | ||
+ | import search.l10n.Messages; | ||
+ | import search.evaluators.ModelTextualModelSearchQueryEvaluator; | ||
+ | |||
+ | import org.eclipse.emf.search.tests.models.movies.MoviesPackage; | ||
+ | import org.eclipse.emf.search.tests.models.customers.CustomersPackage; | ||
+ | import org.eclipse.emf.search.tests.models.orders.OrdersPackage; | ||
+ | |||
+ | /** | ||
+ | * Gather all model search settings to run a specific query. | ||
+ | * TODO: the name of the class and its file should include modelName | ||
+ | * | ||
+ | */ | ||
+ | public final class ModelSearchQuery extends EcoreModelSearchQuery { | ||
+ | public final static String MoviesDb_MODEL_SEARCH_IMAGE_PATH = "icons/esearch.gif"; //$NON-NLS-1$ | ||
+ | public final static String MoviesDb_MODEL_SEARCH_RESULT_IMAGE_PATH = "icons/esearch.gif"; //$NON-NLS-1$ | ||
+ | |||
+ | final static class MoviesDbSupportedElements { | ||
+ | private static List<EClassifier> getMoviesDbEClassifiersLiterals() { | ||
+ | List<EClassifier> eclassifiersLiteralsList = new ArrayList<EClassifier>(); | ||
+ | |||
+ | try { | ||
+ | |||
+ | for (Object o : MoviesPackage.eINSTANCE.getEClassifiers()) { | ||
+ | if (o instanceof ENamedElement) { | ||
+ | eclassifiersLiteralsList.add((EClassifier) o); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | for (Object o : CustomersPackage.eINSTANCE.getEClassifiers()) { | ||
+ | if (o instanceof ENamedElement) { | ||
+ | eclassifiersLiteralsList.add((EClassifier) o); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | for (Object o : OrdersPackage.eINSTANCE.getEClassifiers()) { | ||
+ | if (o instanceof ENamedElement) { | ||
+ | eclassifiersLiteralsList.add((EClassifier) o); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } catch (Throwable t) { | ||
+ | Activator | ||
+ | .getDefault() | ||
+ | .getLog() | ||
+ | .log( | ||
+ | new Status( | ||
+ | IStatus.ERROR, | ||
+ | Activator.PLUGIN_ID, | ||
+ | 0, | ||
+ | Messages | ||
+ | .getString("ModelSearchQuery.MoviesDbClassifiersWalkErrorMessage"), t)); //$NON-NLS-1$ | ||
+ | } | ||
+ | |||
+ | return eclassifiersLiteralsList; | ||
+ | } | ||
+ | |||
+ | public static List<EClassifier> getSupportedElements( | ||
+ | List<? extends Object> participantEClassList) { | ||
+ | ArrayList<EClassifier> definitiveMetaElementParticipantList = new ArrayList<EClassifier>(); | ||
+ | for (EClassifier eClass : getMoviesDbEClassifiersLiterals()) { | ||
+ | if (participantEClassList.contains(eClass)) { | ||
+ | definitiveMetaElementParticipantList.add(eClass); | ||
+ | } | ||
+ | } | ||
+ | return definitiveMetaElementParticipantList; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | public ModelSearchQuery(String expr, IModelSearchQueryParameters parameters) { | ||
+ | super(expr, parameters); | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public String getQueryImagePath() { | ||
+ | return MoviesDb_MODEL_SEARCH_IMAGE_PATH; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public String getResultImagePath() { | ||
+ | return MoviesDb_MODEL_SEARCH_RESULT_IMAGE_PATH; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public String getBundleSymbolicName() { | ||
+ | return Activator.getDefault().getBundle().getSymbolicName(); | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public IStatus search(Object resource, boolean notify) { | ||
+ | try { | ||
+ | EObject root = EcoreModelLoaderUtil.openFile(resource, false); | ||
+ | |||
+ | validParticipantMetaElements = EcoreMetaModelIntrospector | ||
+ | .discriminateValidMetaElements((EObject) root, | ||
+ | MoviesDbSupportedElements | ||
+ | .getSupportedElements(participantElements)); | ||
+ | |||
+ | ((IModelSearchQueryEvaluator<IModelSearchQuery, Object>) getEvaluator()) | ||
+ | .eval(this, resource, notify); | ||
+ | } catch (Exception e) { | ||
+ | return Status.CANCEL_STATUS; | ||
+ | } | ||
+ | return Status.OK_STATUS; | ||
+ | } | ||
+ | |||
+ | public IStatus search(Object resource, boolean notify, | ||
+ | IProgressMonitor monitor) { | ||
+ | try { | ||
+ | if (monitor.isCanceled()) { | ||
+ | return Status.CANCEL_STATUS; | ||
+ | } | ||
+ | |||
+ | EObject root = EcoreModelLoaderUtil.openFile(resource, false); | ||
+ | |||
+ | if (monitor.isCanceled()) { | ||
+ | return Status.CANCEL_STATUS; | ||
+ | } | ||
+ | |||
+ | validParticipantMetaElements = EcoreMetaModelIntrospector | ||
+ | .discriminateValidMetaElements((EObject) root, | ||
+ | MoviesDbSupportedElements | ||
+ | .getSupportedElements(participantElements)); | ||
+ | |||
+ | if (monitor.isCanceled()) { | ||
+ | return Status.CANCEL_STATUS; | ||
+ | } | ||
+ | |||
+ | ((IModelSearchQueryEvaluator<IModelSearchQuery, Object>) getEvaluator()) | ||
+ | .eval(this, resource, notify); | ||
+ | |||
+ | monitor.setTaskName(getLabel()); | ||
+ | |||
+ | if (monitor.isCanceled()) { | ||
+ | return Status.CANCEL_STATUS; | ||
+ | } | ||
+ | } catch (Exception e) { | ||
+ | return Status.CANCEL_STATUS; | ||
+ | } | ||
+ | return Status.OK_STATUS; | ||
+ | } | ||
+ | |||
+ | // Recursively build EObject containment hierarchy | ||
+ | private IModelResultEntry buildSearchResultEntryHierarchy( | ||
+ | IModelResultEntry intermediate, Object resource, EObject current, | ||
+ | EObject leaf) { | ||
+ | if (current instanceof EObject) { | ||
+ | IModelResultEntry entryContainer = new EcoreModelSearchResultEntry( | ||
+ | null, resource, current, false); | ||
+ | entryContainer.addChildren(intermediate); | ||
+ | intermediate.setParent(entryContainer); | ||
+ | return buildSearchResultEntryHierarchy(entryContainer, resource, | ||
+ | current.eContainer(), leaf); | ||
+ | } else { | ||
+ | return intermediate; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public IModelSearchQueryEvaluator<IModelSearchQuery, ?> getEvaluator() { | ||
+ | evaluator = getModelSearchParameters().getEvaluator(); | ||
+ | //TODO: get the name of evalutar's class compound of modelName and string "TextualModelSearchQueryEvaluator" | ||
+ | return evaluator != null ? evaluator | ||
+ | : (evaluator = new ModelTextualModelSearchQueryEvaluator<IModelSearchQuery, Object>()); | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public String getName() { | ||
+ | switch (getKind()) { | ||
+ | case NORMAL_TEXT: | ||
+ | return Messages | ||
+ | .getString("MoviesDbModelSearchQuery.NormalTextMessage"); //$NON-NLS-1$ | ||
+ | case CASE_SENSITIVE: | ||
+ | return Messages | ||
+ | .getString("MoviesDbModelSearchQuery.CaseSensitiveMessage"); //$NON-NLS-1$ | ||
+ | case REGULAR_EXPRESSION: | ||
+ | return Messages | ||
+ | .getString("MoviesDbModelSearchQuery.RegularExpressionMessage"); //$NON-NLS-1$ | ||
+ | } | ||
+ | |||
+ | return Messages | ||
+ | .getString("MoviesDbModelSearchQuery.DefaultSearchKindMessage"); //$NON-NLS-1$ | ||
} | } | ||
} | } | ||
</source> | </source> |
Latest revision as of 13:23, 24 April 2008
org.eclipse.emf.search.modelSearchEngine
Users wanting to contribute an custom ecore metamodel based search should extends modelSearchEngine.
* id - model search engine unique ID * label - Query label to be displayed as a prefix of in search result pages * searchQueryFactory - This extension point element describes a model search engine compliant with org.eclipse.emf.search.providers.IModelSearchQueryFactory APIs. * queryParametersFactory - parameter factory compliant with IModelSearchQueryParametersFactory * modelResourceValidator - resource validator compliant with IModelSearchQueryParametersFactory and specializing AbstractModelResourceValidator
<plugin> <extension point="org.eclipse.emf.search.modelSearchEngine"> <modelSearchEngine id="search.MoviesDbSearchEngine" label="MoviesDb Search Engine" modelResourceValidator="search.engine.ModelResourceValidator" queryParametersFactory="search.factories.ModelSearchQueryParametersFactory" searchQueryFactory="search.factories.ModelSearchQueryFactory"/> </extension> </plugin>
import org.eclipse.emf.search.core.resource.AbstractModelResourceValidator; /** * Allows users to describe all the specific query search supported model editor extensions. */ public class ModelResourceValidator extends AbstractModelResourceValidator { public ModelResourceValidator() { addModelFileExtension("movies"); //$NON-NLS-1$ addModelFileExtension("customers"); //$NON-NLS-1$ addModelFileExtension("orders"); //$NON-NLS-1$ } }
import org.eclipse.emf.search.core.factories.IModelSearchQueryParametersFactory; import org.eclipse.emf.search.core.parameters.AbstractModelSearchQueryParameters; import org.eclipse.emf.search.core.parameters.IModelSearchQueryParameters; /** * Wraps ModelSearchQueryParameters creation. */ public class ModelSearchQueryParametersFactory implements IModelSearchQueryParametersFactory { private static ModelSearchQueryParametersFactory instance; public ModelSearchQueryParametersFactory() { } public static ModelSearchQueryParametersFactory getInstance() { return instance == null ? instance = new ModelSearchQueryParametersFactory() : instance; } protected final class ModelSearchQueryParameters extends AbstractModelSearchQueryParameters { public String getModelSearchEngineID() { return "search.MoviesDbSearchEngine"; //$NON-NLS-1$ } } public IModelSearchQueryParameters createSearchQueryParameters() { return new ModelSearchQueryParameters(); } }
import org.eclipse.emf.search.core.engine.AbstractModelSearchQuery; import org.eclipse.emf.search.core.factories.IModelSearchQueryFactory; import org.eclipse.emf.search.core.parameters.IModelSearchQueryParameters; import search.engine.ModelSearchQuery; /** * Wraps ModelSearchQuery creation. */ public class ModelSearchQueryFactory implements IModelSearchQueryFactory { private static ModelSearchQueryFactory instance; public ModelSearchQueryFactory() { } public static ModelSearchQueryFactory getInstance() { return instance == null ? instance = new ModelSearchQueryFactory() : instance; } public AbstractModelSearchQuery createModelSearchQuery(String expr, IModelSearchQueryParameters p) { return new ModelSearchQuery(expr, p); } }
import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.ENamedElement; import org.eclipse.emf.ecore.EObject; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.emf.search.core.engine.IModelSearchQuery; import org.eclipse.emf.search.core.eval.IModelSearchQueryEvaluator; import org.eclipse.emf.search.core.parameters.IModelSearchQueryParameters; import org.eclipse.emf.search.core.results.IModelResultEntry; import org.eclipse.emf.search.ecore.engine.EcoreMetaModelIntrospector; import org.eclipse.emf.search.ecore.engine.EcoreModelSearchQuery; import org.eclipse.emf.search.ecore.results.EcoreModelSearchResultEntry; import org.eclipse.emf.search.ecore.utils.EcoreModelLoaderUtil; import search.Activator; import search.l10n.Messages; import search.evaluators.ModelTextualModelSearchQueryEvaluator; import org.eclipse.emf.search.tests.models.movies.MoviesPackage; import org.eclipse.emf.search.tests.models.customers.CustomersPackage; import org.eclipse.emf.search.tests.models.orders.OrdersPackage; /** * Gather all model search settings to run a specific query. * TODO: the name of the class and its file should include modelName * */ public final class ModelSearchQuery extends EcoreModelSearchQuery { public final static String MoviesDb_MODEL_SEARCH_IMAGE_PATH = "icons/esearch.gif"; //$NON-NLS-1$ public final static String MoviesDb_MODEL_SEARCH_RESULT_IMAGE_PATH = "icons/esearch.gif"; //$NON-NLS-1$ final static class MoviesDbSupportedElements { private static List<EClassifier> getMoviesDbEClassifiersLiterals() { List<EClassifier> eclassifiersLiteralsList = new ArrayList<EClassifier>(); try { for (Object o : MoviesPackage.eINSTANCE.getEClassifiers()) { if (o instanceof ENamedElement) { eclassifiersLiteralsList.add((EClassifier) o); } } for (Object o : CustomersPackage.eINSTANCE.getEClassifiers()) { if (o instanceof ENamedElement) { eclassifiersLiteralsList.add((EClassifier) o); } } for (Object o : OrdersPackage.eINSTANCE.getEClassifiers()) { if (o instanceof ENamedElement) { eclassifiersLiteralsList.add((EClassifier) o); } } } catch (Throwable t) { Activator .getDefault() .getLog() .log( new Status( IStatus.ERROR, Activator.PLUGIN_ID, 0, Messages .getString("ModelSearchQuery.MoviesDbClassifiersWalkErrorMessage"), t)); //$NON-NLS-1$ } return eclassifiersLiteralsList; } public static List<EClassifier> getSupportedElements( List<? extends Object> participantEClassList) { ArrayList<EClassifier> definitiveMetaElementParticipantList = new ArrayList<EClassifier>(); for (EClassifier eClass : getMoviesDbEClassifiersLiterals()) { if (participantEClassList.contains(eClass)) { definitiveMetaElementParticipantList.add(eClass); } } return definitiveMetaElementParticipantList; } } public ModelSearchQuery(String expr, IModelSearchQueryParameters parameters) { super(expr, parameters); } @Override public String getQueryImagePath() { return MoviesDb_MODEL_SEARCH_IMAGE_PATH; } @Override public String getResultImagePath() { return MoviesDb_MODEL_SEARCH_RESULT_IMAGE_PATH; } @Override public String getBundleSymbolicName() { return Activator.getDefault().getBundle().getSymbolicName(); } @Override public IStatus search(Object resource, boolean notify) { try { EObject root = EcoreModelLoaderUtil.openFile(resource, false); validParticipantMetaElements = EcoreMetaModelIntrospector .discriminateValidMetaElements((EObject) root, MoviesDbSupportedElements .getSupportedElements(participantElements)); ((IModelSearchQueryEvaluator<IModelSearchQuery, Object>) getEvaluator()) .eval(this, resource, notify); } catch (Exception e) { return Status.CANCEL_STATUS; } return Status.OK_STATUS; } public IStatus search(Object resource, boolean notify, IProgressMonitor monitor) { try { if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } EObject root = EcoreModelLoaderUtil.openFile(resource, false); if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } validParticipantMetaElements = EcoreMetaModelIntrospector .discriminateValidMetaElements((EObject) root, MoviesDbSupportedElements .getSupportedElements(participantElements)); if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } ((IModelSearchQueryEvaluator<IModelSearchQuery, Object>) getEvaluator()) .eval(this, resource, notify); monitor.setTaskName(getLabel()); if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } } catch (Exception e) { return Status.CANCEL_STATUS; } return Status.OK_STATUS; } // Recursively build EObject containment hierarchy private IModelResultEntry buildSearchResultEntryHierarchy( IModelResultEntry intermediate, Object resource, EObject current, EObject leaf) { if (current instanceof EObject) { IModelResultEntry entryContainer = new EcoreModelSearchResultEntry( null, resource, current, false); entryContainer.addChildren(intermediate); intermediate.setParent(entryContainer); return buildSearchResultEntryHierarchy(entryContainer, resource, current.eContainer(), leaf); } else { return intermediate; } } @Override public IModelSearchQueryEvaluator<IModelSearchQuery, ?> getEvaluator() { evaluator = getModelSearchParameters().getEvaluator(); //TODO: get the name of evalutar's class compound of modelName and string "TextualModelSearchQueryEvaluator" return evaluator != null ? evaluator : (evaluator = new ModelTextualModelSearchQueryEvaluator<IModelSearchQuery, Object>()); } @Override public String getName() { switch (getKind()) { case NORMAL_TEXT: return Messages .getString("MoviesDbModelSearchQuery.NormalTextMessage"); //$NON-NLS-1$ case CASE_SENSITIVE: return Messages .getString("MoviesDbModelSearchQuery.CaseSensitiveMessage"); //$NON-NLS-1$ case REGULAR_EXPRESSION: return Messages .getString("MoviesDbModelSearchQuery.RegularExpressionMessage"); //$NON-NLS-1$ } return Messages .getString("MoviesDbModelSearchQuery.DefaultSearchKindMessage"); //$NON-NLS-1$ } }