package jetbrains.mps.build.mps.runtime.anttask; /*Generated by MPS */ import jetbrains.mps.tool.builder.MpsWorker; import jetbrains.mps.project.Project; import jetbrains.mps.tool.common.Script; import java.util.List; import org.jetbrains.mps.openapi.module.SModuleReference; import org.jetbrains.mps.openapi.persistence.PersistenceFacade; import org.jetbrains.mps.openapi.module.SModule; import jetbrains.mps.smodel.ModelAccessHelper; import jetbrains.mps.util.Computable; import jetbrains.mps.smodel.ModuleRepositoryFacade; import jetbrains.mps.vfs.IFile; import jetbrains.mps.vfs.FileSystem; import java.io.PrintWriter; import java.io.PrintStream; import jetbrains.mps.project.Solution; import jetbrains.mps.smodel.Language; import java.util.Collection; import java.io.IOException; import jetbrains.mps.baseLanguage.closures.runtime.Wrappers; import jetbrains.mps.project.dependency.GlobalModuleDependenciesManager; import java.io.File; public class GenModuleXmlWorker extends MpsWorker { public static final String INDENT_WITH = " "; public static final int INDENT_INNER_XML = 2; private Project myProject; public GenModuleXmlWorker(Script whatToDo, MpsWorker.AntLogger logger) { super(whatToDo, logger); } @Override protected void executeTask(Project project, MpsWorker.ObjectsToProcess go) { } @Override protected void showStatistic() { } @Override public void work() { setupEnvironment(); myProject = createDummyProject(); List<String> parameters = myWhatToDo.getParameters(); for (String parameter : parameters) { processParameter(myProject, parameter); } dispose(); showStatistic(); } public void processParameter(Project project, String parameter) { ModuleXml params = GenModuleXmlTask.decode(parameter); final SModuleReference moduleRef = PersistenceFacade.getInstance().createModuleReference(params.getRef()); SModule module = new ModelAccessHelper(project.getRepository()).runReadAction(new Computable<SModule>() { public SModule compute() { return ModuleRepositoryFacade.getInstance().getModule(moduleRef); } }); IFile xmlfile = FileSystem.getInstance().getFileByPath(params.getDestfile()); writeFile(xmlfile, moduleRef, module, params.getInnerText(INDENT_INNER_XML, INDENT_WITH)); } public void writeFile(IFile file, SModuleReference moduleRef, SModule module, String extraText) { try { PrintWriter wr = new PrintWriter(new PrintStream(file.openOutputStream())); wr.println("<module namespace=\"" + moduleRef.getModuleName() + "\" uuid=\"" + moduleRef.getModuleId() + "\" type=\"" + ((module instanceof Solution ? "solution" : (module instanceof Language ? "language" : "unknown"))) + "\">"); wr.println(INDENT_WITH + "<dependencies>"); Collection<SModule> dependencies = getDependencies(module); if (dependencies == null) { error("module " + moduleRef + " was not found in repository"); return; } for (SModule m : dependencies) { wr.println(INDENT_WITH + INDENT_WITH + "<module ref=\"" + m.getModuleReference().toString() + "\" />"); } wr.println(INDENT_WITH + "</dependencies>"); wr.println(extraText); wr.println("</module>"); wr.close(); } catch (IOException e) { error("Error writing to " + file.getPath()); } } private Collection<SModule> getDependencies(final SModule module) { if (module == null) { return null; } final Wrappers._T<Collection<SModule>> res = new Wrappers._T<Collection<SModule>>(); myProject.getModelAccess().runReadAction(new Runnable() { public void run() { res.value = new GlobalModuleDependenciesManager(module).getModules(GlobalModuleDependenciesManager.Deptype.COMPILE); } }); return res.value; } public static void main(String[] args) { new GenModuleXmlWorker(Script.fromDumpInFile(new File(args[0])), new MpsWorker.LogLogger()).workFromMain(); } }