/*******************************************************************************
* Copyright (c) 2005, 2012 eBay Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
*******************************************************************************/
package org.eclipse.vjet.eclipse.ui;
import java.util.List;
import org.eclipse.vjet.eclipse.core.search.SearchQueryParameters;
import org.eclipse.vjet.eclipse.core.search.VjoMatch;
import org.eclipse.vjet.eclipse.core.search.VjoSearchEngine;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.dltk.mod.core.IDLTKLanguageToolkit;
import org.eclipse.dltk.mod.core.IModelElement;
import org.eclipse.dltk.mod.core.ModelException;
import org.eclipse.dltk.mod.core.search.IDLTKSearchConstants;
import org.eclipse.dltk.mod.core.search.SearchPattern;
import org.eclipse.dltk.mod.internal.core.NativeVjoSourceModule;
import org.eclipse.dltk.mod.internal.core.VjoSourceType;
import org.eclipse.dltk.mod.internal.corext.util.Messages;
import org.eclipse.dltk.mod.internal.corext.util.SearchUtils;
import org.eclipse.dltk.mod.internal.ui.search.DLTKElementMatch;
import org.eclipse.dltk.mod.internal.ui.search.DLTKSearchQuery;
import org.eclipse.dltk.mod.internal.ui.search.DLTKSearchResult;
import org.eclipse.dltk.mod.internal.ui.search.SearchMessages;
import org.eclipse.dltk.mod.ui.DLTKUIPlugin;
import org.eclipse.dltk.mod.ui.ScriptElementLabels;
import org.eclipse.dltk.mod.ui.search.ElementQuerySpecification;
import org.eclipse.dltk.mod.ui.search.PatternQuerySpecification;
import org.eclipse.dltk.mod.ui.search.QuerySpecification;
/**
* The search query based on {@link VjoSearchEngine} functionality.
*
*
*
*/
public class VjoSearchQuery extends DLTKSearchQuery {
private QuerySpecification specification;
private boolean isForSatisfier = false;
public VjoSearchQuery(QuerySpecification specification) {
super(specification);
this.specification = specification;
}
@Override
public IStatus run(IProgressMonitor monitor) {
final DLTKSearchResult result = (DLTKSearchResult) getSearchResult();
result.removeAll();
SearchQueryParameters parameters = createQueryParameters();
if (parameters.getStringPattern() == null) {
return createErrorStatus(parameters.getStringPattern());
}
monitor.beginTask(Messages.format(
SearchMessages.DLTKSearchQuery_task_label, parameters
.getStringPattern()), 1);
VjoSearchEngine engine = new VjoSearchEngine();
List<VjoMatch> list = engine.search(parameters);
for (VjoMatch vm : list) {
// Add by Oliver.2009-06-04.Begin. Sometimes there is no .satisfies
// block for a type, only use .need to import the IType and use the
// constant of ITYPE.It is not a satisfier,so filter it.
if (isForSatisfier) {
if (vm.getElement() instanceof VjoSourceType) {
try {
String[] satisfiers = ((VjoSourceType) vm.getElement())
.getSuperInterfaceNames();
if (parameters.getElement() instanceof VjoSourceType) {
String satisfierName = ((VjoSourceType) parameters
.getElement()).getFullyQualifiedName();
if (!isStringInArray(satisfiers, satisfierName)) {
continue;
}
}
} catch (ModelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// Add by Oliver.2009-06-04.End
DLTKElementMatch match = new DLTKElementMatch(vm.getElement(), vm
.getMatchRule(), vm.getOffset(), vm.getLength(), vm
.getAccuracy(), vm.isReadAccess(), vm.isWriteAccess(), vm
.isScriptdoc());
match.setIsImport(vm.isIsImport());
match.setPublic(vm.isPublic());
match.setStatic(vm.isStatic());
// match.setIsImport(vm.isScriptdoc());
result.addMatch(match);
}
String message = createStatusMessage(result);
return createSuccessStatus(message);
}
private boolean isStringInArray(String[] satisfiers, String satisfierName) {
boolean isContainInSatisfiesAree = false;
for (String name : satisfiers) {
if (name.equals(satisfierName)) {
isContainInSatisfiesAree = true;
}
}
return isContainInSatisfiesAree;
}
private SearchQueryParameters createQueryParameters() {
SearchPattern pattern;
String stringPattern;
IDLTKLanguageToolkit toolkit = this.specification.getScope()
.getLanguageToolkit();
SearchQueryParameters parameters;
parameters = new SearchQueryParameters();
int limitedTo = specification.getLimitTo();
// Add by Oliver.2009-06-04.Begin.
// Handle the satisfier searching.
if (limitedTo == IDLTKSearchConstants.SATISFIER) {
limitedTo = IDLTKSearchConstants.REFERENCES;
isForSatisfier = true;
}
// Add by Oliver.2009-06-04.End.
if (specification instanceof ElementQuerySpecification) {
IModelElement element = ((ElementQuerySpecification) specification)
.getElement();
stringPattern = ScriptElementLabels.getDefault().getElementLabel(
element, ScriptElementLabels.ALL_DEFAULT);
if (!element.exists()) {
return new SearchQueryParameters(null, stringPattern);
}
// Add the code below to fit with native type.
if (element instanceof NativeVjoSourceModule) {
element = ((NativeVjoSourceModule) element).getVjoType();
}
pattern = SearchPattern.createPattern(element, limitedTo,
SearchUtils.GENERICS_AGNOSTIC_MATCH_RULE, toolkit);
ElementQuerySpecification elSpecification = (ElementQuerySpecification) specification;
parameters.setElementSpecification(true);
parameters.setElement(element);
} else {
PatternQuerySpecification patternSpec = (PatternQuerySpecification) specification;
stringPattern = patternSpec.getPattern();
int matchMode = getMatchMode(stringPattern)
| SearchPattern.R_ERASURE_MATCH;
if (patternSpec.isCaseSensitive())
matchMode |= SearchPattern.R_CASE_SENSITIVE;
pattern = SearchPattern.createPattern(patternSpec.getPattern(),
patternSpec.getSearchFor(), limitedTo, matchMode, toolkit);
}
parameters.setStringPattern(stringPattern);
parameters.setPattern(pattern);
parameters.setScope(specification.getScope());
parameters.setLimitTo(limitedTo);
return parameters;
}
private Status createErrorStatus(String stringPattern) {
return new Status(
IStatus.ERROR,
DLTKUIPlugin.getPluginId(),
0,
Messages
.format(
SearchMessages.DLTKSearchQuery_error_element_does_not_exist,
stringPattern), null);
}
private Status createSuccessStatus(String message) {
return new Status(IStatus.OK, DLTKUIPlugin.getPluginId(), 0, message,
null);
}
private String createStatusMessage(final DLTKSearchResult textResult) {
return Messages.format(
SearchMessages.DLTKSearchQuery_status_ok_message, String
.valueOf(textResult.getMatchCount()));
}
private int getMatchMode(String pattern) {
if (pattern.indexOf('*') != -1 || pattern.indexOf('?') != -1) {
return SearchPattern.R_PATTERN_MATCH;
} else if (SearchUtils.isCamelCasePattern(pattern)) {
return SearchPattern.R_CAMELCASE_MATCH;
}
return SearchPattern.R_EXACT_MATCH;
}
}