package jetbrains.mps.smodel.persistence.def.v8; /*Generated by MPS */ import jetbrains.mps.util.xml.XMLSAXHandler; import jetbrains.mps.smodel.loading.ModelLoadResult; import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import java.util.Stack; import org.xml.sax.Locator; import jetbrains.mps.smodel.SModelHeader; import jetbrains.mps.smodel.DefaultSModel; import jetbrains.mps.smodel.persistence.def.ReadHelper; import org.xml.sax.SAXException; import org.xml.sax.Attributes; import org.xml.sax.SAXParseException; import org.jetbrains.mps.openapi.persistence.PersistenceFacade; import jetbrains.mps.smodel.SModel; import jetbrains.mps.smodel.loading.ModelLoadingState; import org.jetbrains.mps.openapi.module.SModuleReference; import jetbrains.mps.smodel.SModelLegacy; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.baseLanguage.tuples.runtime.Tuples; import jetbrains.mps.vcspersistence.SNodeFactory; import jetbrains.mps.smodel.runtime.ConceptKind; import jetbrains.mps.smodel.runtime.StaticScope; import org.jetbrains.mps.openapi.model.SNodeId; import jetbrains.mps.smodel.InterfaceSNode; import jetbrains.mps.util.Pair; import org.jetbrains.mps.openapi.model.SNodeReference; import org.apache.log4j.Level; import jetbrains.mps.smodel.StaticReference; import jetbrains.mps.baseLanguage.tuples.runtime.MultiTuple; public class ModelReader8Handler extends XMLSAXHandler<ModelLoadResult> { private static final Logger LOG = LogManager.getLogger(ModelReader8Handler.class); private ModelReader8Handler.ModelElementHandler modelHandler = new ModelReader8Handler.ModelElementHandler(); private ModelReader8Handler.PersistenceElementHandler persistenceHandler = new ModelReader8Handler.PersistenceElementHandler(); private ModelReader8Handler.Module_referenceElementHandler module_referenceHandler = new ModelReader8Handler.Module_referenceElementHandler(); private ModelReader8Handler.ImportElementHandler importHandler = new ModelReader8Handler.ImportElementHandler(); private ModelReader8Handler.NodeElementHandler nodeHandler = new ModelReader8Handler.NodeElementHandler(); private ModelReader8Handler.IgnoredNodeElementHandler ignoredNodeHandler = new ModelReader8Handler.IgnoredNodeElementHandler(); private ModelReader8Handler.PropertyElementHandler propertyHandler = new ModelReader8Handler.PropertyElementHandler(); private ModelReader8Handler.IgnoredPropertyElementHandler ignoredPropertyHandler = new ModelReader8Handler.IgnoredPropertyElementHandler(); private ModelReader8Handler.LinkElementHandler linkHandler = new ModelReader8Handler.LinkElementHandler(); private ModelReader8Handler.IgnoredLinkElementHandler ignoredLinkHandler = new ModelReader8Handler.IgnoredLinkElementHandler(); private Stack<ModelReader8Handler.ElementHandler> myHandlersStack = new Stack<ModelReader8Handler.ElementHandler>(); private Stack<ModelReader8Handler.ChildHandler> myChildHandlersStack = new Stack<ModelReader8Handler.ChildHandler>(); private Stack<Object> myValues = new Stack<Object>(); private Locator myLocator; private ModelLoadResult myResult; private boolean my_interfaceOnlyParam; private boolean my_stripImplementationParam; private SModelHeader my_headerParam; private DefaultSModel my_modelField; private ReadHelper my_helperField; private boolean my_hasSkippedNodesField; public ModelReader8Handler(boolean interfaceOnly, boolean stripImplementation, SModelHeader header) { my_interfaceOnlyParam = interfaceOnly; my_stripImplementationParam = stripImplementation; 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 { ModelReader8Handler.ElementHandler current = (myHandlersStack.empty() ? (ModelReader8Handler.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 { ModelReader8Handler.ElementHandler current = myHandlersStack.pop(); Object childValue = myValues.pop(); current.validate(childValue); if (myChildHandlersStack.empty()) { myResult = (ModelLoadResult) childValue; } else { ModelReader8Handler.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 { ModelReader8Handler.ElementHandler current = (myHandlersStack.empty() ? (ModelReader8Handler.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 ModelReader8Handler.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 ModelReader8Handler.ElementHandler { public ModelElementHandler() { setRequiredAttributes("modelUID"); } @Override protected ModelLoadResult createObject(Attributes attrs) throws SAXException { my_modelField = new DefaultSModel(PersistenceFacade.getInstance().createModelReference(attrs.getValue("modelUID")), my_headerParam); my_hasSkippedNodesField = false; my_helperField = new ReadHelper(my_modelField.getReference()); return new ModelLoadResult((SModel) my_modelField, ModelLoadingState.NOT_LOADED); } @Override protected void handleAttribute(Object resultObject, String name, String value) throws SAXException { ModelLoadResult result = (ModelLoadResult) resultObject; if ("content".equals(name)) { if ("header".equals(value)) { result.setContentKind(ModelLoadResult.ContentKind.MODEL_HEADER); } else if ("root".equals(value)) { result.setContentKind(ModelLoadResult.ContentKind.MODEL_ROOT); } else { throw new SAXException("unknown content attribute value: " + value); } return; } if ("version".equals(name)) { // do nothing return; } if ("doNotGenerate".equals(name)) { my_headerParam.setDoNotGenerate(Boolean.parseBoolean(value)); return; } super.handleAttribute(resultObject, name, value); } @Override protected ModelReader8Handler.ElementHandler createChild(Object resultObject, String tagName, Attributes attrs) throws SAXException { if ("persistence".equals(tagName)) { myChildHandlersStack.push(null); return persistenceHandler; } if ("language".equals(tagName)) { myChildHandlersStack.push(new ModelReader8Handler.ChildHandler() { @Override public void apply(Object resultObject, Object value) throws SAXException { handleChild_286176397450364079(resultObject, value); } }); return module_referenceHandler; } if ("language-engaged-on-generation".equals(tagName)) { myChildHandlersStack.push(new ModelReader8Handler.ChildHandler() { @Override public void apply(Object resultObject, Object value) throws SAXException { handleChild_286176397450364090(resultObject, value); } }); return module_referenceHandler; } if ("devkit".equals(tagName)) { myChildHandlersStack.push(new ModelReader8Handler.ChildHandler() { @Override public void apply(Object resultObject, Object value) throws SAXException { handleChild_286176397450364101(resultObject, value); } }); return module_referenceHandler; } if ("import".equals(tagName)) { myChildHandlersStack.push(new ModelReader8Handler.ChildHandler() { @Override public void apply(Object resultObject, Object value) throws SAXException { handleChild_286176397450364112(resultObject, value); } }); return importHandler; } if ("root".equals(tagName) && checkroot_1768088633166530069(resultObject, attrs)) { myChildHandlersStack.push(new ModelReader8Handler.ChildHandler() { @Override public void apply(Object resultObject, Object value) throws SAXException { handleChild_1361478912184551722(resultObject, value); } }); return nodeHandler; } if ("root".equals(tagName)) { myChildHandlersStack.push(new ModelReader8Handler.ChildHandler() { @Override public void apply(Object resultObject, Object value) throws SAXException { handleChild_1768088633166523070(resultObject, value); } }); return ignoredNodeHandler; } return super.createChild(resultObject, tagName, attrs); } private boolean checkroot_1768088633166530069(Object resultObject, Attributes attrs) { return !((my_stripImplementationParam && my_helperField.isImplementationNode(attrs.getValue("nodeInfo")))); } private void handleChild_286176397450364079(Object resultObject, Object value) throws SAXException { SModuleReference child = (SModuleReference) value; new SModelLegacy(my_modelField).addLanguage(child); } private void handleChild_286176397450364090(Object resultObject, Object value) throws SAXException { SModuleReference child = (SModuleReference) value; new SModelLegacy(my_modelField).addEngagedOnGenerationLanguage(child); } private void handleChild_286176397450364101(Object resultObject, Object value) throws SAXException { SModuleReference child = (SModuleReference) value; my_modelField.addDevKit(child); } private void handleChild_286176397450364112(Object resultObject, Object value) throws SAXException { String[] child = (String[]) value; my_helperField.addImportToModel(my_modelField, child[0], child[1], (child[2] != null ? Integer.parseInt(child[2]) : -1), child[3] != null); } private void handleChild_1361478912184551722(Object resultObject, Object value) throws SAXException { SNode child = (SNode) value; if (child != null) { my_modelField.addRootNode(child); } } private void handleChild_1768088633166523070(Object resultObject, Object value) throws SAXException { Tuples._3<String, String, String> child = (Tuples._3<String, String, String>) value; if (my_helperField.isImplementationWithStubNode(child._1())) { String stubConcept = my_helperField.getStubConceptQualifiedName(child._2()); if (stubConcept != null) { my_modelField.addRootNode(SNodeFactory.newRegular(stubConcept)); } } my_hasSkippedNodesField = true; } @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 { result.setState((my_hasSkippedNodesField ? ((my_interfaceOnlyParam ? ModelLoadingState.INTERFACE_LOADED : ModelLoadingState.NO_IMPLEMENTATION)) : ModelLoadingState.FULLY_LOADED)); return true; } } public class PersistenceElementHandler extends ModelReader8Handler.ElementHandler { public PersistenceElementHandler() { setRequiredAttributes("version"); } @Override protected Integer createObject(Attributes attrs) throws SAXException { return Integer.parseInt(attrs.getValue("version")); } } public class Module_referenceElementHandler extends ModelReader8Handler.ElementHandler { public Module_referenceElementHandler() { setRequiredAttributes("namespace"); } @Override protected SModuleReference createObject(Attributes attrs) throws SAXException { return PersistenceFacade.getInstance().createModuleReference(attrs.getValue("namespace")); } } public class ImportElementHandler extends ModelReader8Handler.ElementHandler { public ImportElementHandler() { setRequiredAttributes("index", "modelUID"); } @Override protected String[] createObject(Attributes attrs) throws SAXException { return new String[]{attrs.getValue("index"), attrs.getValue("modelUID"), attrs.getValue("version"), null}; } @Override protected void handleAttribute(Object resultObject, String name, String value) throws SAXException { String[] result = (String[]) resultObject; if ("implicit".equals(name)) { result[3] = value; return; } super.handleAttribute(resultObject, name, value); } } public class NodeElementHandler extends ModelReader8Handler.ElementHandler { public NodeElementHandler() { setRequiredAttributes("type", "nodeInfo"); } @Override protected SNode createObject(Attributes attrs) throws SAXException { Tuples._3<ConceptKind, StaticScope, Boolean> parsed = my_helperField.readNodeInfo(attrs.getValue("nodeInfo")); if (parsed == null) { throw new SAXParseException("bad typeInfo attribute", null); } boolean interfaceNode = false; if (my_interfaceOnlyParam) { interfaceNode = (parsed._0() == ConceptKind.INTERFACE || attrs.getValue("role") == null); } String conceptName = my_helperField.readType(attrs.getValue("type")); jetbrains.mps.smodel.SNode result = (interfaceNode ? SNodeFactory.newInterface(conceptName) : SNodeFactory.newRegular(conceptName)); return result; } @Override protected void handleAttribute(Object resultObject, String name, String value) throws SAXException { SNode result = (SNode) resultObject; if ("role".equals(name)) { result.putUserObject("role", my_helperField.readRole(value)); 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 ModelReader8Handler.ElementHandler createChild(Object resultObject, String tagName, Attributes attrs) throws SAXException { if ("property".equals(tagName)) { myChildHandlersStack.push(new ModelReader8Handler.ChildHandler() { @Override public void apply(Object resultObject, Object value) throws SAXException { handleChild_286176397450364265(resultObject, value); } }); return propertyHandler; } if ("link".equals(tagName)) { myChildHandlersStack.push(new ModelReader8Handler.ChildHandler() { @Override public void apply(Object resultObject, Object value) throws SAXException { handleChild_286176397450364288(resultObject, value); } }); return linkHandler; } if ("node".equals(tagName) && checknode_1910945748547288250(resultObject, attrs)) { myChildHandlersStack.push(new ModelReader8Handler.ChildHandler() { @Override public void apply(Object resultObject, Object value) throws SAXException { handleChild_286176397450364333(resultObject, value); } }); return nodeHandler; } if ("node".equals(tagName)) { myChildHandlersStack.push(new ModelReader8Handler.ChildHandler() { @Override public void apply(Object resultObject, Object value) throws SAXException { handleChild_1910945748545948896(resultObject, value); } }); return ignoredNodeHandler; } return super.createChild(resultObject, tagName, attrs); } private boolean checknode_1910945748547288250(Object resultObject, Attributes attrs) { SNode result = (SNode) resultObject; if (my_stripImplementationParam && my_helperField.isImplementationNode(attrs.getValue("nodeInfo"))) { return false; } return !(result instanceof InterfaceSNode) || my_helperField.isInterfaceNode(attrs.getValue("nodeInfo")); } private void handleChild_286176397450364265(Object resultObject, Object value) throws SAXException { SNode result = (SNode) resultObject; String[] child = (String[]) value; if (child[1] != null) { String pname = my_helperField.readName(child[0]); result.setProperty(pname, child[1]); } } private void handleChild_286176397450364288(Object resultObject, Object value) throws SAXException { SNode result = (SNode) resultObject; String[] child = (String[]) value; Pair<Boolean, SNodeReference> pptr = my_helperField.readLink_internal(child[1]); SNodeReference ptr = pptr.o2; if (ptr == null || ptr.getModelReference() == null) { if (LOG.isEnabledFor(Level.ERROR)) { LOG.error("couldn't create reference '" + child[0] + "' from " + child[1]); } return; } StaticReference ref = new StaticReference(my_helperField.readRole(child[0]), result, ptr.getModelReference(), ptr.getNodeId(), child[2]); result.setReference(ref.getRole(), ref); } private void handleChild_286176397450364333(Object resultObject, Object value) throws SAXException { SNode result = (SNode) resultObject; SNode child = (SNode) value; if (child != null) { String role = (String) child.getUserObject("role"); result.addChild(role, child); child.putUserObject("role", null); } } private void handleChild_1910945748545948896(Object resultObject, Object value) throws SAXException { SNode result = (SNode) resultObject; Tuples._3<String, String, String> child = (Tuples._3<String, String, String>) value; my_hasSkippedNodesField = true; if (my_stripImplementationParam && my_helperField.isImplementationWithStubNode(child._1())) { String stubConcept = my_helperField.getStubConceptQualifiedName(child._2()); if (stubConcept != null) { jetbrains.mps.smodel.SNode childNode = SNodeFactory.newRegular(stubConcept); result.addChild(child._0(), childNode); return; } } if (result instanceof InterfaceSNode) { ((InterfaceSNode) result).skipRole(child._0()); } } } public class IgnoredNodeElementHandler extends ModelReader8Handler.ElementHandler { public IgnoredNodeElementHandler() { } @Override protected Tuples._3<String, String, String> createObject(Attributes attrs) throws SAXException { return MultiTuple.<String,String,String>from(attrs.getValue("role"), attrs.getValue("nodeInfo"), attrs.getValue("type")); } @Override protected ModelReader8Handler.ElementHandler createChild(Object resultObject, String tagName, Attributes attrs) throws SAXException { if ("property".equals(tagName)) { myChildHandlersStack.push(null); return ignoredPropertyHandler; } if ("link".equals(tagName)) { myChildHandlersStack.push(null); return ignoredLinkHandler; } if ("node".equals(tagName)) { myChildHandlersStack.push(null); return ignoredNodeHandler; } return super.createChild(resultObject, tagName, attrs); } } public class PropertyElementHandler extends ModelReader8Handler.ElementHandler { public PropertyElementHandler() { setRequiredAttributes("name"); } @Override protected String[] createObject(Attributes attrs) throws SAXException { return new String[]{attrs.getValue("name"), null, null}; } @Override protected void handleAttribute(Object resultObject, String name, String value) throws SAXException { String[] result = (String[]) resultObject; if ("nameId".equals(name)) { result[2] = value; return; } if ("value".equals(name)) { result[1] = value; return; } super.handleAttribute(resultObject, name, value); } } public class IgnoredPropertyElementHandler extends ModelReader8Handler.ElementHandler { public IgnoredPropertyElementHandler() { } } public class LinkElementHandler extends ModelReader8Handler.ElementHandler { public LinkElementHandler() { setRequiredAttributes("role", "targetNodeId"); } @Override protected String[] createObject(Attributes attrs) throws SAXException { return new String[]{attrs.getValue("role"), attrs.getValue("targetNodeId"), null, null}; } @Override protected void handleAttribute(Object resultObject, String name, String value) throws SAXException { String[] result = (String[]) resultObject; if ("roleId".equals(name)) { result[3] = value; return; } if ("resolveInfo".equals(name)) { result[2] = value; return; } super.handleAttribute(resultObject, name, value); } } public class IgnoredLinkElementHandler extends ModelReader8Handler.ElementHandler { public IgnoredLinkElementHandler() { } } }