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;
}
}
}