package jetbrains.mps.smodel.persistence.def.v5; /*Generated by MPS */ import jetbrains.mps.util.xml.XMLSAXHandler; import jetbrains.mps.smodel.loading.ModelLoadResult; import java.util.Stack; import org.xml.sax.Locator; import jetbrains.mps.smodel.SModelHeader; import jetbrains.mps.smodel.SModelVersionsInfo; import java.util.ArrayList; import jetbrains.mps.smodel.persistence.def.IReferencePersister; import jetbrains.mps.smodel.persistence.def.SAXVisibleModelElements; import jetbrains.mps.smodel.DefaultSModel; import org.xml.sax.SAXException; import org.xml.sax.Attributes; import org.xml.sax.SAXParseException; import jetbrains.mps.vcspersistence.VCSPersistenceUtil; import jetbrains.mps.smodel.SModel; import jetbrains.mps.smodel.loading.ModelLoadingState; import jetbrains.mps.smodel.SModelLegacy; import org.jetbrains.mps.openapi.persistence.PersistenceFacade; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.smodel.persistence.def.v4.VersionUtil; import jetbrains.mps.vcspersistence.SNodeFactory; import org.jetbrains.mps.openapi.model.SNodeId; import org.jetbrains.mps.openapi.model.SNodeAccessUtil; import jetbrains.mps.smodel.persistence.def.v4.ReferencePersister4; public class ModelReader5Handler extends XMLSAXHandler<ModelLoadResult> { private ModelReader5Handler.ModelElementHandler modelHandler = new ModelReader5Handler.ModelElementHandler(); private ModelReader5Handler.PersistenceElementHandler persistenceHandler = new ModelReader5Handler.PersistenceElementHandler(); private ModelReader5Handler.MaxImportIndexElementHandler maxImportIndexHandler = new ModelReader5Handler.MaxImportIndexElementHandler(); private ModelReader5Handler.LanguageAspectElementHandler languageAspectHandler = new ModelReader5Handler.LanguageAspectElementHandler(); private ModelReader5Handler.Tag_with_namespaceElementHandler tag_with_namespaceHandler = new ModelReader5Handler.Tag_with_namespaceElementHandler(); private ModelReader5Handler.ImportElementHandler importHandler = new ModelReader5Handler.ImportElementHandler(); private ModelReader5Handler.NodeElementHandler nodeHandler = new ModelReader5Handler.NodeElementHandler(); private ModelReader5Handler.PropertyElementHandler propertyHandler = new ModelReader5Handler.PropertyElementHandler(); private ModelReader5Handler.LinkElementHandler linkHandler = new ModelReader5Handler.LinkElementHandler(); private ModelReader5Handler.VisibleElementHandler visibleHandler = new ModelReader5Handler.VisibleElementHandler(); private Stack<ModelReader5Handler.ElementHandler> myHandlersStack = new Stack<ModelReader5Handler.ElementHandler>(); private Stack<ModelReader5Handler.ChildHandler> myChildHandlersStack = new Stack<ModelReader5Handler.ChildHandler>(); private Stack<Object> myValues = new Stack<Object>(); private Locator myLocator; private ModelLoadResult myResult; private SModelHeader my_headerParam; private SModelVersionsInfo my_versionsInfoField; private ArrayList<IReferencePersister> my_referenceDescriptorsField; private SAXVisibleModelElements my_visibleModelElementsField; private DefaultSModel my_modelField; public ModelReader5Handler(SModelHeader header) { my_headerParam = header; } public ModelLoadResult getResult() { return myResult; } @Override public void setDocumentLocator(Locator locator) { myLocator = locator; } @Override public void characters(char[] array, int start, int len) throws SAXException { ModelReader5Handler.ElementHandler current = (myHandlersStack.empty() ? (ModelReader5Handler.ElementHandler) null : myHandlersStack.peek()); if (current != null) { current.handleText(myValues.peek(), new String(array, start, len)); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { ModelReader5Handler.ElementHandler current = myHandlersStack.pop(); Object childValue = myValues.pop(); current.validate(childValue); if (myChildHandlersStack.empty()) { myResult = (ModelLoadResult) childValue; } else { ModelReader5Handler.ChildHandler ch = myChildHandlersStack.pop(); if (ch != null) { ch.apply(myValues.peek(), childValue); } } } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { ModelReader5Handler.ElementHandler current = (myHandlersStack.empty() ? (ModelReader5Handler.ElementHandler) null : myHandlersStack.peek()); if (current == null) { // root current = modelHandler; } else { current = current.createChild(myValues.peek(), qName, attributes); } // check required for (String attr : current.requiredAttributes()) { if (attributes.getValue(attr) == null) { throw new SAXParseException("attribute " + attr + " is absent", null); } } Object result = current.createObject(attributes); if (myHandlersStack.empty()) { myResult = (ModelLoadResult) result; } // handle attributes for (int i = 0; i < attributes.getLength(); i++) { String name = attributes.getQName(i); String value = attributes.getValue(i); current.handleAttribute(result, name, value); } myHandlersStack.push(current); myValues.push(result); } private interface ChildHandler { void apply(Object resultObject, Object value) throws SAXException; } private class ElementHandler { private String[] requiredAttributes = new String[0]; private ElementHandler() { } protected Object createObject(Attributes attrs) throws SAXException { return null; } protected void handleAttribute(Object resultObject, String name, String value) throws SAXException { } protected ModelReader5Handler.ElementHandler createChild(Object resultObject, String tagName, Attributes attrs) throws SAXException { throw new SAXParseException("unknown tag: " + tagName, null); } protected void handleText(Object resultObject, String value) throws SAXException { if (value.trim().length() == 0) { return; } throw new SAXParseException("text is not accepted: '" + value + "'", null); } protected String[] requiredAttributes() { return requiredAttributes; } protected void setRequiredAttributes(String... required) { requiredAttributes = required; } protected void validate(Object resultObject) throws SAXException { } } public class ModelElementHandler extends ModelReader5Handler.ElementHandler { public ModelElementHandler() { setRequiredAttributes("modelUID"); } @Override protected ModelLoadResult createObject(Attributes attrs) throws SAXException { my_versionsInfoField = new SModelVersionsInfo(); my_referenceDescriptorsField = new ArrayList<IReferencePersister>(); my_visibleModelElementsField = new SAXVisibleModelElements(); my_modelField = new DefaultSModel(VCSPersistenceUtil.createModelReference(attrs.getValue("modelUID")), my_headerParam); return new ModelLoadResult((SModel) my_modelField, ModelLoadingState.FULLY_LOADED); } @Override protected ModelReader5Handler.ElementHandler createChild(Object resultObject, String tagName, Attributes attrs) throws SAXException { if ("persistence".equals(tagName)) { myChildHandlersStack.push(null); return persistenceHandler; } if ("maxImportIndex".equals(tagName)) { myChildHandlersStack.push(null); return maxImportIndexHandler; } if ("languageAspect".equals(tagName)) { myChildHandlersStack.push(new ModelReader5Handler.ChildHandler() { @Override public void apply(Object resultObject, Object value) throws SAXException { handleChild_2286463592495498109(resultObject, value); } }); return languageAspectHandler; } if ("language".equals(tagName)) { myChildHandlersStack.push(new ModelReader5Handler.ChildHandler() { @Override public void apply(Object resultObject, Object value) throws SAXException { handleChild_2286463592495498227(resultObject, value); } }); return tag_with_namespaceHandler; } if ("language-engaged-on-generation".equals(tagName)) { myChildHandlersStack.push(new ModelReader5Handler.ChildHandler() { @Override public void apply(Object resultObject, Object value) throws SAXException { handleChild_2286463592495498259(resultObject, value); } }); return tag_with_namespaceHandler; } if ("devkit".equals(tagName)) { myChildHandlersStack.push(new ModelReader5Handler.ChildHandler() { @Override public void apply(Object resultObject, Object value) throws SAXException { handleChild_2286463592495498276(resultObject, value); } }); return tag_with_namespaceHandler; } if ("import".equals(tagName)) { myChildHandlersStack.push(new ModelReader5Handler.ChildHandler() { @Override public void apply(Object resultObject, Object value) throws SAXException { handleChild_2286463592495498335(resultObject, value); } }); return importHandler; } if ("node".equals(tagName)) { myChildHandlersStack.push(new ModelReader5Handler.ChildHandler() { @Override public void apply(Object resultObject, Object value) throws SAXException { handleChild_2286463592495515690(resultObject, value); } }); return nodeHandler; } if ("visible".equals(tagName)) { myChildHandlersStack.push(null); return visibleHandler; } return super.createChild(resultObject, tagName, attrs); } private void handleChild_2286463592495498109(Object resultObject, Object value) throws SAXException { String[] child = (String[]) value; int version = Integer.parseInt(child[1]); my_modelField.getImplicitImportsSupport().addAdditionalModelVersion(VCSPersistenceUtil.createModelReference(child[0]), version); } private void handleChild_2286463592495498227(Object resultObject, Object value) throws SAXException { String child = (String) value; new SModelLegacy(my_modelField).addLanguage(PersistenceFacade.getInstance().createModuleReference(child)); } private void handleChild_2286463592495498259(Object resultObject, Object value) throws SAXException { String child = (String) value; new SModelLegacy(my_modelField).addEngagedOnGenerationLanguage(PersistenceFacade.getInstance().createModuleReference(child)); } private void handleChild_2286463592495498276(Object resultObject, Object value) throws SAXException { String child = (String) value; my_modelField.addDevKit(PersistenceFacade.getInstance().createModuleReference(child)); } private void handleChild_2286463592495498335(Object resultObject, Object value) throws SAXException { SModel.ImportElement child = (SModel.ImportElement) value; my_modelField.addModelImport(child); } private void handleChild_2286463592495515690(Object resultObject, Object value) throws SAXException { SNode child = (SNode) value; if (child != null) { my_modelField.addRootNode(child); } } @Override protected void validate(Object resultObject) throws SAXException { if (!(validateInternal((ModelLoadResult) resultObject))) { throw new SAXParseException("missing tags", null); } } private boolean validateInternal(ModelLoadResult result) throws SAXException { for (IReferencePersister referencePersister : my_referenceDescriptorsField) { referencePersister.createReferenceInModel(my_modelField, my_visibleModelElementsField); } return true; } } public class PersistenceElementHandler extends ModelReader5Handler.ElementHandler { public PersistenceElementHandler() { setRequiredAttributes("version"); } @Override protected Integer createObject(Attributes attrs) throws SAXException { return Integer.parseInt(attrs.getValue("version")); } } public class MaxImportIndexElementHandler extends ModelReader5Handler.ElementHandler { public MaxImportIndexElementHandler() { setRequiredAttributes("value"); } @Override protected Integer createObject(Attributes attrs) throws SAXException { return Integer.parseInt(attrs.getValue("value")); } } public class LanguageAspectElementHandler extends ModelReader5Handler.ElementHandler { public LanguageAspectElementHandler() { setRequiredAttributes("modelUID", "version"); } @Override protected String[] createObject(Attributes attrs) throws SAXException { return new String[]{attrs.getValue("modelUID"), attrs.getValue("version")}; } } public class Tag_with_namespaceElementHandler extends ModelReader5Handler.ElementHandler { public Tag_with_namespaceElementHandler() { setRequiredAttributes("namespace"); } @Override protected String createObject(Attributes attrs) throws SAXException { return attrs.getValue("namespace"); } } public class ImportElementHandler extends ModelReader5Handler.ElementHandler { public ImportElementHandler() { setRequiredAttributes("index", "version", "modelUID"); } @Override protected SModel.ImportElement createObject(Attributes attrs) throws SAXException { int indexValue = Integer.parseInt(attrs.getValue("index")); int versionValue = Integer.parseInt(attrs.getValue("version")); return new SModel.ImportElement(VCSPersistenceUtil.createModelReference(attrs.getValue("modelUID")), indexValue, versionValue); } } public class NodeElementHandler extends ModelReader5Handler.ElementHandler { public NodeElementHandler() { setRequiredAttributes("type"); } @Override protected SNode createObject(Attributes attrs) throws SAXException { String rawFqName = attrs.getValue("type"); String conceptFQName = VersionUtil.getConceptFQName(rawFqName); SNode node = SNodeFactory.newRegular(conceptFQName); VersionUtil.fetchConceptVersion(rawFqName, node, my_versionsInfoField); return node; } @Override protected void handleAttribute(Object resultObject, String name, String value) throws SAXException { SNode result = (SNode) resultObject; if ("role".equals(name)) { result.putUserObject("role", VersionUtil.getRole(value)); VersionUtil.fetchChildNodeRoleVersion(value, result, my_versionsInfoField); return; } if ("id".equals(name)) { SNodeId id = jetbrains.mps.smodel.SNodeId.fromString(value); if (id == null) { throw new SAXParseException("bad node ID", null); } ((jetbrains.mps.smodel.SNode) result).setId(id); return; } super.handleAttribute(resultObject, name, value); } @Override protected ModelReader5Handler.ElementHandler createChild(Object resultObject, String tagName, Attributes attrs) throws SAXException { if ("property".equals(tagName)) { myChildHandlersStack.push(new ModelReader5Handler.ChildHandler() { @Override public void apply(Object resultObject, Object value) throws SAXException { handleChild_7707758858786147473(resultObject, value); } }); return propertyHandler; } if ("link".equals(tagName)) { myChildHandlersStack.push(new ModelReader5Handler.ChildHandler() { @Override public void apply(Object resultObject, Object value) throws SAXException { handleChild_355506112072964454(resultObject, value); } }); return linkHandler; } if ("node".equals(tagName)) { myChildHandlersStack.push(new ModelReader5Handler.ChildHandler() { @Override public void apply(Object resultObject, Object value) throws SAXException { handleChild_7707758858785937650(resultObject, value); } }); return nodeHandler; } return super.createChild(resultObject, tagName, attrs); } private void handleChild_7707758858786147473(Object resultObject, Object value) throws SAXException { SNode result = (SNode) resultObject; String[] child = (String[]) value; if (child[1] != null) { SNodeAccessUtil.setProperty(result, VersionUtil.getPropertyName(child[0], result, my_versionsInfoField), child[1]); } } private void handleChild_355506112072964454(Object resultObject, Object value) throws SAXException { SNode result = (SNode) resultObject; String[] child = (String[]) value; ReferencePersister4 rp = new ReferencePersister4(); rp.fillFields(child[0], child[1], child[2], result, false, my_versionsInfoField); my_referenceDescriptorsField.add(rp); } private void handleChild_7707758858785937650(Object resultObject, Object value) throws SAXException { SNode result = (SNode) resultObject; SNode child = (SNode) value; result.addChild(((String) child.getUserObject("role")), child); child.putUserObject("role", null); } } public class PropertyElementHandler extends ModelReader5Handler.ElementHandler { public PropertyElementHandler() { setRequiredAttributes("name"); } @Override protected String[] createObject(Attributes attrs) throws SAXException { return new String[]{attrs.getValue("name"), null}; } @Override protected void handleAttribute(Object resultObject, String name, String value) throws SAXException { String[] result = (String[]) resultObject; if ("value".equals(name)) { result[1] = value; return; } super.handleAttribute(resultObject, name, value); } } public class LinkElementHandler extends ModelReader5Handler.ElementHandler { public LinkElementHandler() { } @Override protected String[] createObject(Attributes attrs) throws SAXException { return new String[]{null, null, null}; } @Override protected void handleAttribute(Object resultObject, String name, String value) throws SAXException { String[] result = (String[]) resultObject; if ("role".equals(name)) { result[0] = value; return; } if ("resolveInfo".equals(name)) { result[1] = value; return; } if ("targetNodeId".equals(name)) { result[2] = value; return; } super.handleAttribute(resultObject, name, value); } } public class VisibleElementHandler extends ModelReader5Handler.ElementHandler { public VisibleElementHandler() { setRequiredAttributes("index", "modelUID"); } @Override protected Object createObject(Attributes attrs) throws SAXException { my_visibleModelElementsField.addVisible(Integer.parseInt(attrs.getValue("index")), attrs.getValue("modelUID")); return null; } } }