package jetbrains.mps.ide.script.plugin.migrationtool;
/*Generated by MPS */
import org.apache.log4j.Logger;
import org.apache.log4j.LogManager;
import java.util.Collection;
import jetbrains.mps.ide.findusages.model.SearchResult;
import org.jetbrains.mps.openapi.model.SNode;
import java.util.List;
import org.jetbrains.mps.openapi.model.SNodeReference;
import org.jetbrains.mps.openapi.module.SRepository;
import jetbrains.mps.ide.ThreadUtils;
import java.util.ArrayList;
import java.util.Set;
import java.util.HashSet;
import java.util.Collections;
import org.jetbrains.mps.openapi.util.ProgressMonitor;
import jetbrains.mps.lang.script.runtime.AbstractMigrationRefactoring;
import org.apache.log4j.Level;
public class MigrationScriptsController {
private static final Logger LOG = LogManager.getLogger(MigrationScriptsController.class);
private final MigrationScriptFinder myFinder;
public MigrationScriptsController(MigrationScriptFinder finder) {
myFinder = finder;
}
public Collection<SearchResult<SNode>> computeAliveIncludedResults(final List<SNodeReference> includedResultNodes, SRepository repo) {
// apparently, requires model read. why does it demand EDT, is unclear
ThreadUtils.assertEDT();
final List<SearchResult<SNode>> aliveIncludedResults = new ArrayList<SearchResult<SNode>>();
final Set aliveIncludedNodes = new HashSet<SNode>();
List<SNodeReference> includedNodes = includedResultNodes;
for (SNodeReference includedNode : includedNodes) {
SNode n;
if ((n = includedNode.resolve(repo)) != null) {
aliveIncludedNodes.add(n);
}
}
List<SearchResult<SNode>> aliveResults = myFinder.getLastSearchResults().getAliveResults();
for (SearchResult aliveResult : aliveResults) {
if (aliveIncludedNodes.contains(aliveResult.getObject())) {
aliveIncludedResults.add(aliveResult);
}
}
return Collections.unmodifiableCollection(aliveIncludedResults);
}
public void process(final ProgressMonitor pmonitor, final Collection<SearchResult<SNode>> searchResults) {
// requires model write
pmonitor.start("", searchResults.size());
for (SearchResult<SNode> seachResult : searchResults) {
pmonitor.advance(1);
final SNode node = seachResult.getObject();
if (node == null || node.getModel() == null) {
return;
}
final AbstractMigrationRefactoring migrationRefactoring = myFinder.getRefactoring(seachResult);
try {
if (migrationRefactoring.isApplicableInstanceNode(node)) {
migrationRefactoring.doUpdateInstanceNode(node);
}
} catch (Throwable th) {
if (LOG.isEnabledFor(Level.ERROR)) {
LOG.error("Script execution failed", th);
}
}
}
pmonitor.done();
}
}