package jetbrains.mps.execution.configurations.implementation.plugin.plugin; /*Generated by MPS */ import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import jetbrains.mps.project.Project; import java.util.Set; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.internal.collections.runtime.SetSequence; import java.util.HashSet; import org.jetbrains.annotations.NotNull; import java.util.List; import org.jetbrains.mps.openapi.model.SNodeReference; import org.jetbrains.mps.openapi.module.SRepository; import jetbrains.mps.extapi.module.SRepositoryExt; import jetbrains.mps.smodel.tempmodel.TemporaryModels; import jetbrains.mps.smodel.tempmodel.TempModuleOptions; import org.jetbrains.mps.openapi.model.SNode; import java.io.File; import jetbrains.mps.smodel.behaviour.BHReflection; import jetbrains.mps.core.aspects.behaviour.SMethodTrimmedId; import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations; import jetbrains.mps.smodel.ModelDependencyUpdate; import org.jetbrains.annotations.Nullable; import jetbrains.mps.make.MakeSession; import jetbrains.mps.ide.make.DefaultMakeMessageHandler; import jetbrains.mps.make.IMakeService; import java.util.concurrent.Future; import jetbrains.mps.make.script.IResult; import jetbrains.mps.smodel.resources.ModelsToResources; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import org.apache.log4j.Level; import jetbrains.mps.util.FileUtil; import jetbrains.mps.smodel.tempmodel.TempModule; import java.util.Collections; import jetbrains.mps.project.structure.model.ModelRootDescriptor; import jetbrains.mps.vfs.IFile; import jetbrains.mps.vfs.FileSystem; public class DeployScript { private static final Logger LOG = LogManager.getLogger(DeployScript.class); private final DeployScript.TemporalModuleWithDescriptorFile myModule; private final Project myProject; private final Set<SModel> myModelsToMake = SetSequence.fromSet(new HashSet<SModel>()); private final String myDeployScriptPath; private final String myArtifactsPath; public DeployScript(@NotNull Project project, List<SNodeReference> plugins) { myProject = project; myModule = new DeployScript.TemporalModuleWithDescriptorFile(); SRepository projectRepo = project.getRepository(); assert projectRepo instanceof SRepositoryExt; (((SRepositoryExt) projectRepo)).registerModule(myModule, myModule); SModel model = TemporaryModels.getInstance().create(false, TempModuleOptions.forExistingModule(myModule)); SetSequence.fromSet(myModelsToMake).addElement(model); SNode deployScriptNode = DeployScriptCreator.createDeployScript(myProject, plugins, myModule.getBaseDirectory()); model.addRootNode(deployScriptNode); myDeployScriptPath = new File(myModule.getBaseDirectory(), ((String) BHReflection.invoke(deployScriptNode, SMethodTrimmedId.create("getOutputFileName", MetaAdapterFactory.getConcept(0x798100da4f0a421aL, 0xb99171f8c50ce5d2L, 0x4df58c6f18f84a13L, "jetbrains.mps.build.structure.BuildProject"), "4gSHdTptyu0")))).getAbsolutePath(); myArtifactsPath = new File(new File(new File(myModule.getBaseDirectory(), "build"), "artifacts"), SPropertyOperations.getString(deployScriptNode, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name"))).getAbsolutePath(); new ModelDependencyUpdate(model).updateUsedLanguages().updateImportedModels(projectRepo).updateModuleDependencies(projectRepo); } @Nullable public String make() { MakeSession session = new MakeSession(myProject, new DefaultMakeMessageHandler(myProject), false); if (IMakeService.INSTANCE.get().openNewSession(session)) { Future<IResult> future = IMakeService.INSTANCE.get().make(session, new ModelsToResources(myModelsToMake).resources(false)); IResult result = null; try { result = future.get(); } catch (CancellationException ignore) { } catch (InterruptedException ignore) { } catch (ExecutionException ignore) { } if (result == null || !(result.isSucessful())) { if (LOG.isEnabledFor(Level.ERROR)) { LOG.error("Can not generate deploy script"); } return null; } return myDeployScriptPath; } return null; } public String getArtifactsPath() { return myArtifactsPath; } public String getDeployScriptLocation() { return myDeployScriptPath; } public void dispose() { myProject.getModelAccess().runWriteAction(new Runnable() { public void run() { SRepository projectRepo = myProject.getRepository(); ((SRepositoryExt) projectRepo).unregisterModule(myModule, myProject); FileUtil.delete(myModule.getBaseDirectory()); } }); } private static class TemporalModuleWithDescriptorFile extends TempModule { private final File myDescriptorFile; private final File myBaseDir; private TemporalModuleWithDescriptorFile() { super(Collections.<ModelRootDescriptor>emptySet(), true, false); myBaseDir = FileUtil.createTmpDir(); // just anything myDescriptorFile = new File(myBaseDir, "module.msd"); } @Override public IFile getDescriptorFile() { // who cares if this module has descriptor file? Do we need to extend TempModule? return FileSystem.getInstance().getFileByPath(myDescriptorFile.getAbsolutePath().replace("\\", "/")); } public File getBaseDirectory() { return myBaseDir; } public boolean isPackaged() { // don't ask return false; } } }