package jetbrains.mps.lang.editor.imageGen.plugin;
/*Generated by MPS */
import jetbrains.mps.make.facet.IFacet;
import java.util.List;
import jetbrains.mps.make.facet.ITarget;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import java.util.ArrayList;
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.make.resources.IPropertiesPersistence;
import jetbrains.mps.make.facet.ITargetEx;
import jetbrains.mps.make.script.IJob;
import jetbrains.mps.make.script.IResult;
import jetbrains.mps.make.resources.IResource;
import jetbrains.mps.make.script.IJobMonitor;
import jetbrains.mps.make.resources.IPropertiesAccessor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.mps.openapi.util.ProgressMonitor;
import jetbrains.mps.smodel.resources.GResource;
import org.jetbrains.mps.openapi.module.SRepository;
import java.util.Map;
import jetbrains.mps.vfs.IFile;
import jetbrains.mps.internal.collections.runtime.MapSequence;
import java.util.HashMap;
import jetbrains.mps.internal.collections.runtime.IWhereFilter;
import jetbrains.mps.smodel.SModelOperations;
import jetbrains.mps.baseLanguage.tuples.runtime.Tuples;
import org.jetbrains.mps.openapi.model.SModel;
import jetbrains.mps.internal.collections.runtime.ISelector;
import jetbrains.mps.baseLanguage.tuples.runtime.MultiTuple;
import jetbrains.mps.make.facets.Make_Facet.Target_make;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import org.jetbrains.mps.openapi.model.SNodeId;
import org.jetbrains.mps.openapi.persistence.PersistenceFacade;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations;
import jetbrains.mps.make.delta.IDelta;
import jetbrains.mps.internal.collections.runtime.SetSequence;
import jetbrains.mps.internal.make.runtime.util.FilesDelta;
import jetbrains.mps.internal.make.runtime.util.StaleFilesCollector;
import jetbrains.mps.make.script.IFeedback;
import jetbrains.mps.smodel.resources.DResource;
import jetbrains.mps.vfs.FileSystem;
import java.io.OutputStream;
import java.io.IOException;
import jetbrains.mps.make.script.IConfig;
import jetbrains.mps.make.script.IPropertiesPool;
public class GenerateImages_Facet extends IFacet.Stub {
private List<ITarget> targets = ListSequence.fromList(new ArrayList<ITarget>());
private IFacet.Name name = new IFacet.Name("jetbrains.mps.lang.editor.imageGen.GenerateImages");
public GenerateImages_Facet() {
ListSequence.fromList(targets).addElement(new GenerateImages_Facet.Target_generateImages());
}
public Iterable<ITarget> targets() {
return targets;
}
public Iterable<IFacet.Name> optional() {
return null;
}
public Iterable<IFacet.Name> required() {
return Sequence.fromArray(new IFacet.Name[]{new IFacet.Name("jetbrains.mps.make.facets.Make"), new IFacet.Name("jetbrains.mps.lang.core.TextGen"), new IFacet.Name("jetbrains.mps.lang.core.Generate")});
}
public Iterable<IFacet.Name> extended() {
return null;
}
public IFacet.Name getName() {
return this.name;
}
public IPropertiesPersistence propertiesPersistence() {
return new GenerateImages_Facet.TargetProperties();
}
public static class Target_generateImages implements ITargetEx {
private static final ITarget.Name name = new ITarget.Name("jetbrains.mps.lang.editor.imageGen.GenerateImages.generateImages");
public Target_generateImages() {
}
public IJob createJob() {
return new IJob.Stub() {
@Override
public IResult execute(final Iterable<IResource> rawInput, final IJobMonitor monitor, final IPropertiesAccessor pa, @NotNull final ProgressMonitor progressMonitor) {
Iterable<IResource> _output_7crsqe_a0a = null;
final Iterable<GResource> input = (Iterable<GResource>) (Iterable) rawInput;
switch (0) {
case 0:
progressMonitor.start("Printing Images", 4);
try {
final SRepository repository = monitor.getSession().getProject().getRepository();
final Map<IFile, List<PrintNodeRunnable>> folder2PrintRunnables = MapSequence.fromMap(new HashMap<IFile, List<PrintNodeRunnable>>());
repository.getModelAccess().runReadAction(new Runnable() {
public void run() {
progressMonitor.step("Collecting models to print");
// TODO: check status & outputPath... see TextGen facet
Iterable<GResource> resourcesWithOutput = Sequence.fromIterable(input).where(new IWhereFilter<GResource>() {
public boolean accept(GResource it) {
return SModelOperations.getOutputLocation(it.model()) != null && it.status().getOutputModel() != null;
}
});
Iterable<Tuples._2<SModel, SModel>> allModels = Sequence.fromIterable(resourcesWithOutput).select(new ISelector<GResource, Tuples._2<SModel, SModel>>() {
public Tuples._2<SModel, SModel> select(GResource gResource) {
SModel inputModel = gResource.model();
SModel outputModel = gResource.status().getOutputModel();
return MultiTuple.<SModel,SModel>from(inputModel, outputModel);
}
});
progressMonitor.advance(1);
ProgressMonitor collectingNodesMonitor = progressMonitor.subTask(1);
collectingNodesMonitor.start("Collecting nodes to print", Sequence.fromIterable(allModels).count());
for (Tuples._2<SModel, SModel> modelsPair : Sequence.fromIterable(allModels)) {
collectingNodesMonitor.step(jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations.getModelName(modelsPair._0()));
// XXX what if there are multiple GenerationTargetFacet (now it's only JavaModuleFacet), shall we generate into each? Or identify them somehow?
IFile modelOutputLocation = SModelOperations.getOutputLocation(modelsPair._0());
IFile outputDir = Target_make.vars(pa.global()).pathToFile().invoke(modelOutputLocation.getPath());
if (!(MapSequence.fromMap(folder2PrintRunnables).containsKey(outputDir))) {
MapSequence.fromMap(folder2PrintRunnables).put(outputDir, ListSequence.fromList(new ArrayList<PrintNodeRunnable>()));
}
for (SNode imageGenerator : ListSequence.fromList(jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations.roots(modelsPair._1(), MetaAdapterFactory.getConcept(0x1839bec5cea641dfL, 0xb9e0c405ff35c41eL, 0x20c051df23a9488cL, "jetbrains.mps.lang.editor.imageGen.structure.ImageGenerator")))) {
SNodeId nodeId = PersistenceFacade.getInstance().createNodeId(SPropertyOperations.getString(imageGenerator, MetaAdapterFactory.getProperty(0x1839bec5cea641dfL, 0xb9e0c405ff35c41eL, 0x20c051df23a9488cL, 0x2d0ad2528389ad26L, "id")));
SNode node = modelsPair._0().getNode(nodeId);
PrintNodeRunnable printRunnable = new PrintNodeRunnable(node.getReference(), repository, SPropertyOperations.getString(imageGenerator, MetaAdapterFactory.getProperty(0x1839bec5cea641dfL, 0xb9e0c405ff35c41eL, 0x20c051df23a9488cL, 0x20c051df23a9da87L, "fileName")));
if (SPropertyOperations.getString(imageGenerator, MetaAdapterFactory.getProperty(0x1839bec5cea641dfL, 0xb9e0c405ff35c41eL, 0x20c051df23a9488cL, 0x132781a3b11568fbL, "imageFormat")) != null) {
printRunnable.setImageFormat(SPropertyOperations.getString(imageGenerator, MetaAdapterFactory.getProperty(0x1839bec5cea641dfL, 0xb9e0c405ff35c41eL, 0x20c051df23a9488cL, 0x132781a3b11568fbL, "imageFormat")));
}
if (SPropertyOperations.getString(imageGenerator, MetaAdapterFactory.getProperty(0x1839bec5cea641dfL, 0xb9e0c405ff35c41eL, 0x20c051df23a9488cL, 0x132781a3b11572e9L, "scale")) != null) {
printRunnable.setScale(Double.parseDouble(SPropertyOperations.getString(imageGenerator, MetaAdapterFactory.getProperty(0x1839bec5cea641dfL, 0xb9e0c405ff35c41eL, 0x20c051df23a9488cL, 0x132781a3b11572e9L, "scale"))));
}
printRunnable.setBackgroundColor(255, 255, 255, 255);
ListSequence.fromList(MapSequence.fromMap(folder2PrintRunnables).get(outputDir)).addElement(printRunnable);
}
collectingNodesMonitor.advance(1);
}
collectingNodesMonitor.done();
}
});
List<IDelta> deltaList = ListSequence.fromList(new ArrayList<IDelta>());
List<Tuples._2<IFile, byte[]>> fileContentsToWrite = ListSequence.fromList(new ArrayList<Tuples._2<IFile, byte[]>>());
ProgressMonitor printingFoldersMonitor = progressMonitor.subTask(1);
printingFoldersMonitor.start("Printing folders", MapSequence.fromMap(folder2PrintRunnables).count());
for (IFile folder : SetSequence.fromSet(MapSequence.fromMap(folder2PrintRunnables).keySet())) {
FilesDelta fd = new FilesDelta(folder);
ListSequence.fromList(deltaList).addElement(fd);
new StaleFilesCollector(folder).updateDelta(fd);
ProgressMonitor printFilesMonitor = printingFoldersMonitor.subTask(1);
printFilesMonitor.start("Printing files", ListSequence.fromList(MapSequence.fromMap(folder2PrintRunnables).get(folder)).count());
for (PrintNodeRunnable printNodeRunnable : ListSequence.fromList(MapSequence.fromMap(folder2PrintRunnables).get(folder))) {
printFilesMonitor.step(printNodeRunnable.getFileName());
repository.getModelAccess().runWriteInEDT(printNodeRunnable);
if (printNodeRunnable.waitForExecution()) {
IFile outputFile = folder.getDescendant(printNodeRunnable.getFileName());
ListSequence.fromList(fileContentsToWrite).addElement(MultiTuple.<IFile,byte[]>from(outputFile, printNodeRunnable.getResult()));
fd.written(outputFile);
} else {
monitor.reportFeedback(new IFeedback.ERROR(String.valueOf(printNodeRunnable.getErrorMessage())));
}
printFilesMonitor.advance(1);
}
printFilesMonitor.done();
}
printingFoldersMonitor.done();
_output_7crsqe_a0a = Sequence.fromIterable(_output_7crsqe_a0a).concat(Sequence.fromIterable(Sequence.<IResource>singleton(new DResource(deltaList))));
ProgressMonitor saveFilesMonitor = progressMonitor.subTask(1);
saveFilesMonitor.start("Saving images", ListSequence.fromList(fileContentsToWrite).count());
for (Tuples._2<IFile, byte[]> fileContent : ListSequence.fromList(fileContentsToWrite)) {
saveFilesMonitor.step(fileContent._0().getName());
final IFile fileToWrite = fileContent._0();
final byte[] bytes = fileContent._1();
if (!(FileSystem.getInstance().runWriteTransaction(new Runnable() {
public void run() {
OutputStream stream = null;
try {
stream = fileToWrite.openOutputStream();
stream.write(bytes);
} catch (IOException e) {
monitor.reportFeedback(new IFeedback.ERROR(String.valueOf(e.toString())));
} finally {
if (stream != null) {
try {
stream.close();
} catch (IOException ignored) {
}
}
}
}
}))) {
monitor.reportFeedback(new IFeedback.ERROR(String.valueOf("Failed to save files")));
return new IResult.FAILURE(_output_7crsqe_a0a);
}
saveFilesMonitor.advance(1);
}
saveFilesMonitor.done();
} finally {
progressMonitor.done();
}
default:
progressMonitor.done();
return new IResult.SUCCESS(_output_7crsqe_a0a);
}
}
};
}
public IConfig createConfig() {
return null;
}
public Iterable<ITarget.Name> notAfter() {
return null;
}
public Iterable<ITarget.Name> after() {
return Sequence.fromArray(new ITarget.Name[]{new ITarget.Name("jetbrains.mps.lang.core.Generate.generate")});
}
public Iterable<ITarget.Name> notBefore() {
return null;
}
public Iterable<ITarget.Name> before() {
return Sequence.fromArray(new ITarget.Name[]{new ITarget.Name("jetbrains.mps.make.facets.Make.reconcile")});
}
public ITarget.Name getName() {
return name;
}
public boolean isOptional() {
return false;
}
public boolean requiresInput() {
return true;
}
public boolean producesOutput() {
return true;
}
public Iterable<Class<? extends IResource>> expectedInput() {
List<Class<? extends IResource>> rv = ListSequence.fromList(new ArrayList<Class<? extends IResource>>());
ListSequence.fromList(rv).addElement(GResource.class);
return rv;
}
public Iterable<Class<? extends IResource>> expectedOutput() {
return null;
}
public <T> T createParameters(Class<T> cls) {
return null;
}
public <T> T createParameters(Class<T> cls, T copyFrom) {
T t = createParameters(cls);
return t;
}
}
public static class TargetProperties implements IPropertiesPersistence {
public TargetProperties() {
}
public void storeValues(Map<String, String> store, IPropertiesPool properties) {
}
public void loadValues(Map<String, String> store, IPropertiesPool properties) {
try {
} catch (RuntimeException re) {
}
}
}
}