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); } } }