package jetbrains.mps.ide.script.plugin.migrationtool;
/*Generated by MPS */
import jetbrains.mps.ide.findusages.findalgorithm.finders.BaseFinder;
import org.apache.log4j.Logger;
import org.apache.log4j.LogManager;
import java.util.Collection;
import jetbrains.mps.lang.script.runtime.RefactoringScript;
import jetbrains.mps.ide.findusages.model.SearchResults;
import org.jetbrains.mps.openapi.model.SNode;
import java.util.Map;
import jetbrains.mps.ide.findusages.model.SearchResult;
import jetbrains.mps.lang.script.runtime.AbstractMigrationRefactoring;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Collections;
import java.util.ArrayList;
import jetbrains.mps.ide.findusages.model.SearchQuery;
import org.jetbrains.mps.openapi.util.ProgressMonitor;
import org.jetbrains.mps.openapi.module.SearchScope;
import java.util.Set;
import org.jetbrains.mps.openapi.module.FindUsagesFacade;
import jetbrains.mps.progress.EmptyProgressMonitor;
import jetbrains.mps.util.StringUtil;
import org.apache.log4j.Level;
public class MigrationScriptFinder extends BaseFinder {
private static final Logger LOG = LogManager.getLogger(MigrationScriptFinder.class);
private final Collection<RefactoringScript> myScripts;
private SearchResults<SNode> myResults;
private Map<SearchResult<SNode>, AbstractMigrationRefactoring> myMigrationBySearchResult = new IdentityHashMap<SearchResult<SNode>, AbstractMigrationRefactoring>();
private List<ResultsListener> myResultsListeners = Collections.synchronizedList(new ArrayList<ResultsListener>());
public MigrationScriptFinder(Collection<RefactoringScript> scripts) {
myScripts = scripts;
}
@Override
public String getDescription() {
return "Migration Scripts";
}
@Override
public SearchResults find(SearchQuery query, ProgressMonitor monitor) {
myResults = new SearchResults<SNode>();
SearchScope queryScope = query.getScope();
monitor.start("Searching applicable nodes", myScripts.size());
try {
for (RefactoringScript scriptInstance : myScripts) {
if (monitor.isCanceled()) {
break;
}
Collection<AbstractMigrationRefactoring> refactorings = scriptInstance.getRefactorings();
for (AbstractMigrationRefactoring ref : refactorings) {
if (monitor.isCanceled()) {
break;
}
monitor.step(scriptInstance.getName() + " [" + ref.getAdditionalInfo() + "]");
Set<SNode> instances = FindUsagesFacade.getInstance().findInstances(queryScope, Collections.singleton(ref.getApplicableConcept()), false, new EmptyProgressMonitor());
for (SNode instance : instances) {
try {
if (ref.isApplicableInstanceNode(instance)) {
String category = StringUtil.escapeXml(scriptInstance.getName()) + " </b>[" + StringUtil.escapeXml(ref.getAdditionalInfo()) + "]<b>";
SearchResult<SNode> result = new SearchResult<SNode>(instance, category);
myMigrationBySearchResult.put(result, ref);
myResults.getSearchResults().add(result);
}
} catch (Throwable th) {
if (LOG.isEnabledFor(Level.ERROR)) {
LOG.error("Failed to evaluate script applicability", th);
}
}
}
}
monitor.advance(1);
}
fireResultsChanged();
return myResults;
} finally {
monitor.done();
}
}
public AbstractMigrationRefactoring getRefactoring(SearchResult<SNode> searchResult) {
return myMigrationBySearchResult.get(searchResult);
}
public SearchResults<SNode> getLastSearchResults() {
return myResults;
}
public Collection<RefactoringScript> getScripts() {
return myScripts;
}
public void addResultsListener(ResultsListener listener) {
myResultsListeners.add(listener);
}
public void removeResultsListener(ResultsListener listener) {
myResultsListeners.remove(listener);
}
private void fireResultsChanged() {
for (ResultsListener rl : new ArrayList<ResultsListener>(myResultsListeners)) {
rl.resultsChanged(this);
}
}
}