]> gerrit.simantics Code Review - simantics/interop.git/blobdiff - org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/XMLWriter.java
XML Elements are exported in the original order (if order is stored during import)
[simantics/interop.git] / org.simantics.xml.sax.base / src / org / simantics / xml / sax / base / XMLWriter.java
index 3fd881ba3c3d86da100a06c87190c32a06f54512..0881a5d109d3b3b56ba7e287e594da67c282078e 100644 (file)
@@ -4,6 +4,8 @@ import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;\r
 import java.util.Collection;\r
 import java.util.HashMap;\r
+import java.util.HashSet;\r
+import java.util.LinkedHashSet;\r
 import java.util.List;\r
 import java.util.Map;\r
 import java.util.Set;\r
@@ -73,6 +75,11 @@ public class XMLWriter {
 \r
                XMLElementWriter elementWriter = instance.writer;\r
                elementWriter.start(graph, instance, writer);\r
+               if (instance.parent == null) {\r
+                       if(getSchemaURI() != null) {\r
+                               writer.writeDefaultNamespace(getSchemaURI());\r
+                       }\r
+               }\r
                elementWriter.attributes(graph, instance, graph.getStatements(instance.instance, XML.hasAttribute), writer);\r
                if (graph.hasValue(instance.instance))\r
                        elementWriter.characters(graph, instance, writer);\r
@@ -85,15 +92,24 @@ public class XMLWriter {
                        loadElement(c);\r
                        elementMap.put(s.getObject(), c);\r
                }\r
-               List<Resource> sorted = elementWriter.children(graph, instance, writer);\r
-                       \r
+               LinkedHashSet<Resource> sorted = new LinkedHashSet<>();\r
+               if (graph.hasStatement(instance.instance, XML.hasOriginalElementList)) {\r
+                       Resource originalList = graph.getSingleObject(instance.instance, XML.hasOriginalElementList);\r
+                       List<Resource> l = ListUtils.toList(graph, originalList);\r
+                       sorted.addAll(l);\r
+               }\r
+               elementWriter.children(graph, instance, sorted);\r
+               Set<Resource> processed = new HashSet<>();\r
                for (Resource r : sorted) {\r
+                       if (processed.contains(r)) // badly generated writer could report elements several times. \r
+                               continue;\r
                        WriterElement child = elementMap.get(r);\r
                        write(child, writer);\r
+                       processed.add(r);\r
                }\r
                //write the rest of the elements (in random order) \r
                for (Statement stm : childElements) {\r
-                       if (sorted.contains(stm.getObject()))\r
+                       if (processed.contains(stm.getObject()))\r
                                continue;\r
                        WriterElement child = elementMap.get(stm.getObject());\r
                        write(child, writer);\r
@@ -103,53 +119,6 @@ public class XMLWriter {
                \r
        }\r
        \r
-//     public void write(Resource root, XMLStreamWriter writer) throws DatabaseException, XMLStreamException {\r
-//             XMLResource XML = XMLResource.getInstance(graph);\r
-//             \r
-//             Deque<Element> stack = new ArrayDeque<>();\r
-//             Element rootElement = new Element(root);\r
-//             loadElement(rootElement);\r
-//             stack.push(rootElement);\r
-//             while (!stack.isEmpty()) {\r
-//                     \r
-//                     Element instance = stack.pop();\r
-//                     XMLElementWriter elementWriter = instance.writer;\r
-//                     elementWriter.start(graph, instance.instance, writer);\r
-//                     elementWriter.attributes(graph, graph.getStatements(instance.instance, XML.hasAttribute), writer);\r
-//                     // get all child elements\r
-//                     Collection<Statement> childElements = graph.getStatements(instance.instance, XML.hasElement);\r
-//                     // get original element order, if available\r
-//                     Resource originalElementList = graph.getPossibleObject(instance.instance, XML.hasOriginalElementList);\r
-//                     List<Resource> originalList = null;\r
-//                     if (originalElementList != null) {\r
-//                             originalList = ListUtils.toList(graph, originalElementList);\r
-//                     }\r
-//                     if (originalList != null) {\r
-//                             // check for elements that are missing form the original list (should be empty).  \r
-//                             for (Statement stm : childElements) {\r
-//                                     if (originalList.contains(stm.getObject()))\r
-//                                             continue;\r
-//                                     Element child = new Element(instance,stm.getObject());\r
-//                                     loadElement(child);\r
-//                                     stack.push(child);\r
-//                             }\r
-//                             // process the list in reverse order so that the stack processing processes the items in correct order.\r
-//                             for (int i = originalList.size()-1; i >= 0; i--) {\r
-//                                     Resource r = originalList.get(i);\r
-//                                     Element child = new Element(instance, r);\r
-//                                     loadElement(child);\r
-//                                     stack.push(child);\r
-//                             }\r
-//                     } else {\r
-//                             for (Statement stm : childElements) {\r
-//                                     Element child = new Element(instance, stm.getObject());\r
-//                                     loadElement(child);\r
-//                                     stack.push(child);\r
-//                             }\r
-//                     }\r
-//             }\r
-//     }\r
-       \r
        private void loadElement(WriterElement child) throws DatabaseException {\r
                XMLElementWriter childWriter = null;\r
                if (child.parent != null && child.parent.writer instanceof XMLElementNamedChildWriter) {\r