]> gerrit.simantics Code Review - simantics/interop.git/blobdiff - org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/XMLParser.java
Handle multi-namespace XML files.
[simantics/interop.git] / org.simantics.xml.sax.base / src / org / simantics / xml / sax / base / XMLParser.java
index 87bb477b788902adc54ffd5f7d38fd21861d726b..3d708f4842f729ea4f58bf5a76041524a3420242 100644 (file)
@@ -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<String, XMLParser> map = new java.util.HashMap<>();
+               map.put(this.getSchemaURI(), this);
+               addDependencies(map);
+               return this;
+       }
+       
+       public void addDependencies(java.util.Map<String,XMLParser> map) {
+               
        }
        
        private List<ParserElement> idReferenceElements = new ArrayList<ParserElement>();
+       
        private void loadElement(Deque<ParserElement> parents, ParserElement element) throws SAXException{
+               loadElement(parents, element, true);
+       }
+       private void loadElement(Deque<ParserElement> 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();