package jetbrains.mps.build.migration; /*Generated by MPS */ import jetbrains.mps.tool.builder.MpsWorker; import jetbrains.mps.core.tool.environment.classloading.UrlClassLoader; import jetbrains.mps.tool.common.Script; import jetbrains.mps.tool.environment.Environment; import jetbrains.mps.tool.environment.EnvironmentConfig; import org.apache.log4j.Logger; import java.util.Map; import java.io.File; import java.util.List; import jetbrains.mps.project.Project; import jetbrains.mps.make.MPSCompilationResult; import jetbrains.mps.smodel.ModelAccess; import jetbrains.mps.util.Computable; import jetbrains.mps.make.ModuleMaker; import jetbrains.mps.util.IterableUtil; import jetbrains.mps.progress.EmptyProgressMonitor; import jetbrains.mps.classloading.ClassLoaderManager; import javax.swing.SwingUtilities; import com.intellij.ide.plugins.PluginManager; import com.intellij.openapi.extensions.PluginId; import java.lang.reflect.Method; import com.intellij.openapi.project.ProjectManager; import com.intellij.ide.impl.ProjectUtil; import java.lang.reflect.InvocationTargetException; import jetbrains.mps.tool.environment.IdeaEnvironment; import org.jetbrains.annotations.NotNull; import java.util.Set; import jetbrains.mps.internal.collections.runtime.SetSequence; import java.util.LinkedHashSet; import jetbrains.mps.util.PathManager; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.internal.collections.runtime.ISelector; import java.net.URL; import java.net.MalformedURLException; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import jetbrains.mps.library.LibraryInitializer; public class MigrationWorker extends MpsWorker { private static final String MIGRATION_PLUGIN = "jetbrains.mps.ide.migration.assistant"; private static final String TASK_EXEC_CLASS = "jetbrains.mps.ide.migration.AntTaskExecutionUtil"; private final UrlClassLoader myClassLoader; public MigrationWorker(Script whatToDo, MpsWorker.AntLogger logger) { super(whatToDo, logger); myClassLoader = createClassloader(); } @Override protected Environment createEnvironment() { EnvironmentConfig cfg = MpsWorker.createEnvConfig(myWhatToDo); cfg.addPlugin("migrationAssistant", MigrationWorker.MIGRATION_PLUGIN); Environment environment = new MigrationWorker.MyEnvironment(cfg); environment.init(); Logger.getRootLogger().setLevel(myWhatToDo.getLogLevel()); return environment; } @Override public void work() { setupEnvironment(); Map<File, List<String>> mpsProjects = myWhatToDo.getMPSProjectFiles(); for (File file : mpsProjects.keySet()) { final Project p = myEnvironment.openProject(file); info("Loaded project " + p); myEnvironment.flushAllEvents(); final MPSCompilationResult mpsCompilationResult = ModelAccess.instance().runReadAction(new Computable<MPSCompilationResult>() { public MPSCompilationResult compute() { return new ModuleMaker().make(IterableUtil.asCollection(p.getProjectModulesWithGenerators()), new EmptyProgressMonitor(), myJavaCompilerOptions); } }); if (mpsCompilationResult.isReloadingNeeded()) { ModelAccess.instance().runWriteAction(new Runnable() { public void run() { ClassLoaderManager.getInstance().reloadModules(mpsCompilationResult.getChangedModules()); } }); } myEnvironment.flushAllEvents(); try { SwingUtilities.invokeAndWait(new Runnable() { public void run() { try { Class<?> euClass = PluginManager.getPlugin(PluginId.getId(MIGRATION_PLUGIN)).getPluginClassLoader().loadClass(TASK_EXEC_CLASS); Method method = euClass.getMethod("migrate", Project.class); Object result = method.invoke(null, p); if (!(((Boolean) result))) { info("Nothing to migrate"); } com.intellij.openapi.project.Project[] projects = ProjectManager.getInstance().getOpenProjects(); assert projects.length == 1 : "more than one project opened: " + projects.length; ProjectUtil.closeAndDispose(projects[0]); } catch (Exception e) { error(e.getMessage()); } } }); } catch (InterruptedException e) { error(e.getMessage()); } catch (InvocationTargetException e) { error(e.getMessage()); } p.dispose(); myEnvironment.flushAllEvents(); } dispose(); } public static void main(String[] args) { MigrationWorker mpsWorker = new MigrationWorker(Script.fromDumpInFile(new File(args[0])), new MpsWorker.SystemOutLogger()); mpsWorker.workFromMain(); } protected void executeTask(Project project, MpsWorker.ObjectsToProcess go) { } protected void showStatistic() { } protected class MyEnvironment extends IdeaEnvironment { public MyEnvironment(@NotNull EnvironmentConfig config) { super(config); } @Override protected ClassLoader rootClassLoader() { return myClassLoader; } } private UrlClassLoader createClassloader() { Set<File> pluginsClasspath = SetSequence.fromSet(new LinkedHashSet<File>()); File pluginDir = new File(PathManager.getPreInstalledPluginsPath()); for (File pluginFolder : pluginDir.listFiles()) { if (pluginFolder.isFile()) { SetSequence.fromSet(pluginsClasspath).addElement(pluginFolder); } else { File lib = new File(pluginFolder + File.separator + "lib"); if (lib.exists() && lib.isDirectory()) { SetSequence.fromSet(pluginsClasspath).addSequence(Sequence.fromIterable(Sequence.fromArray(lib.listFiles(PathManager.JAR_FILE_FILTER)))); } } } return new UrlClassLoader(SetSequence.fromSet(pluginsClasspath).select(new ISelector<File, URL>() { public URL select(File it) { try { return it.toURI().toURL(); } catch (MalformedURLException e) { return null; } } }).where(new IWhereFilter<URL>() { public boolean accept(URL it) { return it != null; } }).toGenericArray(URL.class), LibraryInitializer.class.getClassLoader()); } }