X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.xml.sax.base%2Fsrc%2Forg%2Fsimantics%2Fxml%2Fsax%2Fbase%2FXMLParser.java;h=3d708f4842f729ea4f58bf5a76041524a3420242;hb=070e46f1fba569c5f5cb70fba5681ffafcb88088;hp=87bb477b788902adc54ffd5f7d38fd21861d726b;hpb=99e240f9ca43aa78fbc6d71d7905c38c00bc679a;p=simantics%2Finterop.git diff --git a/org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/XMLParser.java b/org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/XMLParser.java index 87bb477..3d708f4 100644 --- a/org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/XMLParser.java +++ b/org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/XMLParser.java @@ -52,11 +52,21 @@ public class XMLParser extends DefaultHandler implements Serializable { } public void setGraph(WriteGraph graph) { + if (graph == this.graph) + return; this.graph = graph; for (XMLParser p : subParsers.values()) p.setGraph(graph); } + public void setLogger(ILogger logger) { + if (logger == this.logger) + return; + this.logger = logger; + for (XMLParser p : subParsers.values()) + p.setLogger(logger); + } + public String getSchemaURI() { return schemaURI; } @@ -73,16 +83,35 @@ public class XMLParser extends DefaultHandler implements Serializable { public void add(XMLParser parser) { subParsers.put(parser.getSchemaURI(), parser); + + } + + public XMLParser resolveDependencies() { + + java.util.Map map = new java.util.HashMap<>(); + map.put(this.getSchemaURI(), this); + addDependencies(map); + return this; + } + + public void addDependencies(java.util.Map map) { + } private List idReferenceElements = new ArrayList(); + private void loadElement(Deque parents, ParserElement element) throws SAXException{ + loadElement(parents, element, true); + } + private void loadElement(Deque parents, ParserElement element, boolean checkParent) throws SAXException{ XMLElementParser parser = null; ParserElement parent = null; if (parents.size() > 0) { + // process a child element parent = parents.peek(); // check for assigned subparser - if (parent.getXMLParser() != null && parent.getXMLParser() != this) { + if (checkParent && parent.getXMLParser() != null && parent.getXMLParser() != this) { + //element.setXMLParser(parent.getXMLParser()); element.setXMLParser(parent.getXMLParser()); parent.getXMLParser().loadElement(parents, element); return; @@ -107,11 +136,11 @@ public class XMLParser extends DefaultHandler implements Serializable { // parser = parsers.get(element.qName); } else { // otherwise use globally configured element parser - parser = parsers.get(element.qName); + parser = parsers.get(element.getLocalName()); } } else { - // use globally configured element parser - parser = parsers.get(element.qName); + // use globally configured element parser for a root element + parser = parsers.get(element.getLocalName()); } if (parser != null) { @@ -127,18 +156,23 @@ public class XMLParser extends DefaultHandler implements Serializable { } else { // check for schema reference attempt to locate subparser for it. Attribute schemaRef = element.getAttribute(XML_NAMESPACE_REF); + String nsRef[] = element.getQName().split(":"); if (schemaRef != null && subParsers.containsKey(schemaRef.value)) { XMLParser subParser = subParsers.get(schemaRef.value); subParser.loadElement(parents, element); element.setXMLParser(subParser); + } else if (nsRef.length == 2 && element.getNS(nsRef[0]) != null && subParsers.containsKey(element.getNS(nsRef[0]))) { + XMLParser subParser = subParsers.get(element.getNS(nsRef[0])); + subParser.loadElement(parents, element, false); + element.setXMLParser(subParser); } else { if (parent == null && parents.size() > 0) parent = parents.peek(); String err = null; if (parent != null) - err = "Unknown element " + element.qName + ", parent " + (parent != null ? parent.getQName() : "None"); + err = "Unknown element " + element.getLocalName() + ", parent " + (parent != null ? parent.getLocalName() : "None"); else { - err = "Unknown root element " + element.qName + ", cannot import the file"; + err = "Unknown root element " + element.getLocalName() + ", cannot import the file"; throw new SAXException(err); } @@ -160,12 +194,12 @@ public class XMLParser extends DefaultHandler implements Serializable { if (parent.getElementParser() != null) { if (!parent.getElementParser().connectChild(graph, parent, element)) if (!parser.connectParent(graph, parent, element)) { - String err = "Did not connect element " + element.qName + ", parent " + (parent != null ? parent.getQName() : "None"); + String err = "Did not connect element " + element.getLocalName() + ", parent " + (parent != null ? parent.getLocalName() : "None"); logger.log(new Status(IStatus.ERROR, PLUGIN_ID, err)); if (debug) System.err.println(err); } } else { - String err = "Did not connect element " + element.qName + ", parent " + (parent != null ? parent.getQName() : "None") + " was not imported"; + String err = "Did not connect element " + element.getLocalName() + ", parent " + (parent != null ? parent.getLocalName() : "None") + " was not imported"; logger.log(new Status(IStatus.ERROR, PLUGIN_ID, err)); if (debug) System.err.println(err); } @@ -178,7 +212,7 @@ public class XMLParser extends DefaultHandler implements Serializable { boolean useExt = existing.elementParser.idPriority() > element.elementParser.idPriority(); if (useExt) idMap.put(id, existing); - String err = "Duplicate XML element id: " + id + " for " + element.getQName() + " and " + existing.getQName() + ", using " + (useExt ? existing.getQName() : element.getQName()); + String err = "Duplicate XML element id: " + id + " for " + element.getLocalName() + " and " + existing.getLocalName() + ", using " + (useExt ? existing.getLocalName() : element.getLocalName()); logger.log(new Status(IStatus.ERROR, PLUGIN_ID, err)); if (debug) System.err.println(err); } @@ -223,9 +257,9 @@ public class XMLParser extends DefaultHandler implements Serializable { public void done() throws SAXException{ try { for (ParserElement e : idReferenceElements) { - IDReferenceParser parser = (IDReferenceParser)parsers.get(e.qName); + IDReferenceParser parser = (IDReferenceParser)parsers.get(e.getLocalName()); if (!parser.connectReferences(graph, e, idMap)) { - String err ="Could not resolve ID references for " + e.getQName() + " " + e.getUri(); + String err ="Could not resolve ID references for " + e.getLocalName() + " " + e.getUri(); logger.log(new Status(IStatus.ERROR, PLUGIN_ID, err)); if (debug) System.err.println(err); } @@ -243,7 +277,7 @@ public class XMLParser extends DefaultHandler implements Serializable { @Override public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { - ParserElement e = new ParserElement(uri,localName,name,attributes); + ParserElement e = new ParserElement(current.peek(),uri,localName,name,attributes); loadElement(current,e); current.push(e); @@ -261,11 +295,12 @@ public class XMLParser extends DefaultHandler implements Serializable { if (e != null) { handleCharacters(e, charactersValue.toString()); handleElement(current,e); - } - if (current.isEmpty()) { - root = e.getData(); + if (current.isEmpty()) { + root = e.getData(); + } } + charactersValue = new StringBuilder(); } @@ -282,7 +317,7 @@ public class XMLParser extends DefaultHandler implements Serializable { } public void parse(File file, ILogger logger) throws Exception { - this.logger = logger; + setLogger(logger); SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser saxParser = spf.newSAXParser();