package jetbrains.mps.project.persistence;
/*Generated by MPS */
import org.apache.log4j.Logger;
import org.apache.log4j.LogManager;
import jetbrains.mps.util.MacroHelper;
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.project.structure.modules.LanguageDescriptor;
import org.jdom.Element;
import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes;
import jetbrains.mps.project.ModuleId;
import jetbrains.mps.util.xml.XmlUtil;
import jetbrains.mps.internal.collections.runtime.Sequence;
import org.jetbrains.mps.openapi.persistence.PersistenceFacade;
import jetbrains.mps.project.structure.modules.GeneratorDescriptor;
import java.util.List;
import jetbrains.mps.vfs.IFile;
import org.jdom.Document;
import jetbrains.mps.util.JDOMUtil;
import jetbrains.mps.util.annotation.ToRemove;
import org.apache.log4j.Level;
import jetbrains.mps.project.structure.project.ProjectDescriptor;
import java.io.OutputStream;
import org.jetbrains.mps.openapi.model.SModelReference;
import jetbrains.mps.internal.collections.runtime.SetSequence;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import java.util.Collection;
import org.jetbrains.mps.openapi.module.SModuleReference;
/**
* XML/DOM persistence for a descriptor of Language module
*/
public class LanguageDescriptorPersistence {
private static final Logger LOG = LogManager.getLogger(LanguageDescriptorPersistence.class);
private final String SOURCE_GEN_DEFAULT = "${module}/source_gen";
private final MacroHelper myMacroHelper;
public LanguageDescriptorPersistence(@NotNull MacroHelper macroHelper) {
myMacroHelper = macroHelper;
}
@NotNull
public LanguageDescriptor load(@NotNull final Element languageElement) throws ModuleReadException {
LanguageDescriptor descriptor;
try {
descriptor = new _FunctionTypes._return_P0_E0<LanguageDescriptor>() {
public LanguageDescriptor invoke() {
final LanguageDescriptor result_v3r4p8_a0a0a0c0g = new LanguageDescriptor();
final String result_v3r4p8_a0a0a0a0c0g = languageElement.getAttributeValue("namespace");
result_v3r4p8_a0a0a0c0g.setNamespace(result_v3r4p8_a0a0a0a0c0g);
String uuid = languageElement.getAttributeValue("uuid");
if (uuid != null) {
final ModuleId result_v3r4p8_a0a2a0a0a0c0g = ModuleId.fromString(uuid);
result_v3r4p8_a0a0a0c0g.setId(result_v3r4p8_a0a2a0a0a0c0g);
}
final String result_v3r4p8_a4a0a0a0c0g = myMacroHelper.expandPath(XmlUtil.stringWithDefault(languageElement, "generatorOutputPath", SOURCE_GEN_DEFAULT));
result_v3r4p8_a0a0a0c0g.setGenPath(result_v3r4p8_a4a0a0a0c0g);
String moduleVersion = languageElement.getAttributeValue("moduleVersion");
if (moduleVersion != null) {
try {
result_v3r4p8_a0a0a0c0g.setModuleVersion(Integer.parseInt(moduleVersion));
} catch (NumberFormatException ignored) {
}
}
String languageVersion = (languageElement.getAttributeValue("languageVersion") != null ? languageElement.getAttributeValue("languageVersion") : languageElement.getAttributeValue("version"));
if (languageVersion != null) {
try {
result_v3r4p8_a0a0a0c0g.setLanguageVersion(Integer.parseInt(languageVersion));
} catch (NumberFormatException ignored) {
}
}
Element modelsTag = XmlUtil.first(languageElement, "models");
if (modelsTag != null) {
result_v3r4p8_a0a0a0c0g.getModelRootDescriptors().addAll(ModuleDescriptorPersistence.loadModelRoots(XmlUtil.children(modelsTag, "modelRoot"), myMacroHelper));
}
Element facets = XmlUtil.first(languageElement, "facets");
if (facets != null) {
result_v3r4p8_a0a0a0c0g.getModuleFacetDescriptors().addAll(ModuleDescriptorPersistence.loadFacets(XmlUtil.children(facets, "facet"), myMacroHelper));
}
ModuleDescriptorPersistence.loadDependencies(result_v3r4p8_a0a0a0c0g, languageElement);
for (Element extendedLanguage : Sequence.fromIterable(XmlUtil.children(XmlUtil.first(languageElement, "extendedLanguages"), "extendedLanguage"))) {
result_v3r4p8_a0a0a0c0g.getExtendedLanguages().add(PersistenceFacade.getInstance().createModuleReference(extendedLanguage.getText()));
}
Element autoImports = XmlUtil.first(languageElement, "accessoryModels");
if (autoImports == null) {
// deprecated name
autoImports = XmlUtil.first(languageElement, "library");
}
for (Element modelElement : Sequence.fromIterable(XmlUtil.children(autoImports, "model"))) {
result_v3r4p8_a0a0a0c0g.getAccessoryModels().add(PersistenceFacade.getInstance().createModelReference(modelElement.getAttributeValue("modelUID")));
}
GeneratorDescriptorPersistence gdp = new GeneratorDescriptorPersistence(myMacroHelper);
for (Element generatorElement : Sequence.fromIterable(XmlUtil.children(XmlUtil.first(languageElement, "generators"), "generator"))) {
GeneratorDescriptor gd = gdp.load(generatorElement);
// as long as generator descriptors are part of language descriptor, no need to persist identity of a source language, we can
// re-construct it here at loading time.
gd.setSourceLanguage(result_v3r4p8_a0a0a0c0g.getModuleReference());
result_v3r4p8_a0a0a0c0g.getGenerators().add(gd);
}
// odd 'stubModelEntry' name for auxiliary classpath is due to legacy
Element stubModelEntries = XmlUtil.first(languageElement, "stubModelEntries");
if (stubModelEntries != null) {
List<String> roots = ModuleDescriptorPersistence.loadStubModelEntries(stubModelEntries, myMacroHelper);
result_v3r4p8_a0a0a0c0g.getAdditionalJavaStubPaths().addAll(roots);
}
for (Element entryElement : Sequence.fromIterable(XmlUtil.children(XmlUtil.first(languageElement, "sourcePath"), "source"))) {
result_v3r4p8_a0a0a0c0g.getSourcePaths().add(myMacroHelper.expandPath(entryElement.getAttributeValue("path")));
}
return result_v3r4p8_a0a0a0c0g;
}
}.invoke();
} catch (ModuleReadException ex) {
throw ex;
} catch (Exception ex) {
throw new ModuleReadException(ex);
}
return descriptor;
}
/**
*
* @deprecated use {@link jetbrains.mps.project.persistence.LanguageDescriptorPersistence#load(Element) instance method} instead.
*/
@Deprecated
public static LanguageDescriptor loadLanguageDescriptor(final IFile file, MacroHelper macroHelper) {
LanguageDescriptor descriptor;
try {
Document document = JDOMUtil.loadDocument(file);
Element languageElement = document.getRootElement();
descriptor = new LanguageDescriptorPersistence(macroHelper).load(languageElement);
} catch (ModuleReadException ex) {
throw ex;
} catch (Exception e) {
throw new ModuleReadException(e);
}
ModuleDescriptorPersistence.setTimestamp(descriptor, file);
for (GeneratorDescriptor gd : descriptor.getGenerators()) {
ModuleDescriptorPersistence.setTimestamp(gd, file);
}
return descriptor;
}
/**
*
* @deprecated use {@link jetbrains.mps.project.persistence.LanguageDescriptorPersistence#save(LanguageDescriptor) instance method} instead
*/
@Deprecated
@ToRemove(version = 3.5)
public static void saveLanguageDescriptor(IFile file, LanguageDescriptor descriptor, MacroHelper macroHelper) {
if (file.isReadOnly()) {
if (LOG.isEnabledFor(Level.ERROR)) {
LOG.error("Cant't save " + file.getPath());
}
return;
}
try {
saveLanguageDescriptor(file.openOutputStream(), descriptor, macroHelper);
} catch (Exception e) {
if (LOG.isEnabledFor(Level.ERROR)) {
LOG.error("", e);
}
}
ModuleDescriptorPersistence.setTimestamp(descriptor, file);
}
/**
*
* @deprecated use {@link jetbrains.mps.project.persistence.ProjectDescriptorPersistence#save(ProjectDescriptor) instance method} instead. File/IO handling shall happen at the caller, which knows better how to deal with errors. Besides, clients are not supposed to access this code directly, rather shall use DescriptorIOFacade.
*/
@Deprecated
@ToRemove(version = 3.5)
public static void saveLanguageDescriptor(OutputStream stream, LanguageDescriptor descriptor, MacroHelper macroHelper) {
try {
Element ld = new LanguageDescriptorPersistence(macroHelper).save(descriptor);
Document doc = new Document(ld);
JDOMUtil.writeDocument(doc, stream);
} catch (Exception e) {
if (LOG.isEnabledFor(Level.ERROR)) {
LOG.error("", e);
}
}
}
@NotNull
public Element save(@NotNull LanguageDescriptor descriptor) {
Element languageElement = new Element("language");
languageElement.setAttribute("namespace", descriptor.getNamespace());
if (descriptor.getId() != null) {
languageElement.setAttribute("uuid", descriptor.getId().toString());
}
if (descriptor.getGenPath() != null) {
String p = myMacroHelper.shrinkPath(descriptor.getGenPath());
if (!(SOURCE_GEN_DEFAULT.equals(p))) {
languageElement.setAttribute("generatorOutputPath", p);
}
}
languageElement.setAttribute("languageVersion", Integer.toString(descriptor.getLanguageVersion()));
languageElement.setAttribute("moduleVersion", Integer.toString(descriptor.getModuleVersion()));
Element models = new Element("models");
ModuleDescriptorPersistence.saveModelRoots(models, descriptor.getModelRootDescriptors(), myMacroHelper);
languageElement.addContent(models);
if (!(descriptor.getModuleFacetDescriptors().isEmpty())) {
Element facets = new Element("facets");
ModuleDescriptorPersistence.saveFacets(facets, descriptor.getModuleFacetDescriptors(), myMacroHelper);
languageElement.addContent(facets);
}
Element accessoryModels = new Element("accessoryModels");
for (SModelReference model : SetSequence.fromSet(descriptor.getAccessoryModels())) {
XmlUtil.tagWithAttribute(accessoryModels, "model", "modelUID", model.toString());
}
languageElement.addContent(accessoryModels);
if (!(descriptor.getGenerators().isEmpty())) {
Element generators = new Element("generators");
GeneratorDescriptorPersistence gdp = new GeneratorDescriptorPersistence(myMacroHelper);
for (GeneratorDescriptor generatorDescriptor : ListSequence.fromList(descriptor.getGenerators())) {
generators.addContent(gdp.save(generatorDescriptor));
}
languageElement.addContent(generators);
}
if (!(descriptor.getAdditionalJavaStubPaths().isEmpty())) {
Element stubModelEntries = new Element("stubModelEntries");
ModuleDescriptorPersistence.saveStubModelEntries(stubModelEntries, (Collection<String>) descriptor.getAdditionalJavaStubPaths(), myMacroHelper);
languageElement.addContent(stubModelEntries);
}
Element sourcePath = new Element("sourcePath");
for (String p : descriptor.getSourcePaths()) {
XmlUtil.tagWithAttribute(sourcePath, "source", "path", myMacroHelper.shrinkPath(p));
}
languageElement.addContent(sourcePath);
ModuleDescriptorPersistence.saveDependencies(languageElement, descriptor);
Element extendedLanguages = new Element("extendedLanguages");
for (SModuleReference ref : SetSequence.fromSet(descriptor.getExtendedLanguages())) {
XmlUtil.tagWithText(extendedLanguages, "extendedLanguage", ref.toString());
}
languageElement.addContent(extendedLanguages);
return languageElement;
}
}