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