From 854324972f1eef1c1ecef337146274c1428edeae Mon Sep 17 00:00:00 2001 From: luukkainen Date: Mon, 30 Jan 2017 10:59:27 +0000 Subject: [PATCH] Export XML Namespaces refs #6985 git-svn-id: https://www.simantics.org/svn/simantics/interoperability/trunk@33440 ac1ea38d-2e2b-0410-8846-a27921b304fc --- .../xml/sax/base/XMLNSElementWriter.java | 65 +++++++++++++++++ .../xml/sax/base/XMLNSNamedChildWriter.java | 72 +++++++++++++++++++ .../org/simantics/xml/sax/base/XMLParser.java | 5 +- .../org/simantics/xml/sax/base/XMLWriter.java | 11 +++ 4 files changed, 151 insertions(+), 2 deletions(-) create mode 100644 org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/XMLNSElementWriter.java create mode 100644 org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/XMLNSNamedChildWriter.java diff --git a/org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/XMLNSElementWriter.java b/org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/XMLNSElementWriter.java new file mode 100644 index 0000000..42606c1 --- /dev/null +++ b/org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/XMLNSElementWriter.java @@ -0,0 +1,65 @@ +package org.simantics.xml.sax.base; + +import java.util.Collection; +import java.util.Set; + +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamWriter; + +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.Statement; +import org.simantics.db.exception.DatabaseException; + +public class XMLNSElementWriter implements XMLElementWriter{ + + XMLElementWriter writer; + String ns; + + public XMLNSElementWriter(XMLElementWriter writer, String ns) { + this.writer = writer; + this.ns = ns; + } + + @Override + public void start(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) + throws XMLStreamException, DatabaseException { + this.writer.start(graph, instance, writer); + writer.writeNamespace("", ns); + } + + @Override + public void attributes(ReadGraph graph, WriterElement instance, Collection attributes, + XMLStreamWriter writer) throws XMLStreamException, DatabaseException { + this.writer.attributes(graph, instance, attributes, writer); + } + + @Override + public void characters(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) + throws XMLStreamException, DatabaseException { + this.writer.characters(graph, instance, writer); + } + + @Override + public void children(ReadGraph graph, WriterElement instance, Set writer) + throws XMLStreamException, DatabaseException { + this.writer.children(graph, instance, writer); + } + + @Override + public void end(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) + throws XMLStreamException, DatabaseException { + this.writer.end(graph, instance, writer); + } + + @Override + public String getElementId() { + return writer.getElementId(); + } + + @Override + public Resource getType(ReadGraph graph) throws DatabaseException { + return writer.getType(graph); + } + +} diff --git a/org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/XMLNSNamedChildWriter.java b/org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/XMLNSNamedChildWriter.java new file mode 100644 index 0000000..296c238 --- /dev/null +++ b/org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/XMLNSNamedChildWriter.java @@ -0,0 +1,72 @@ +package org.simantics.xml.sax.base; + +import java.util.Collection; +import java.util.Map; +import java.util.Set; + +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamWriter; + +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.Statement; +import org.simantics.db.exception.DatabaseException; + +public class XMLNSNamedChildWriter implements XMLElementNamedChildWriter{ + + XMLElementNamedChildWriter writer; + String ns; + + public XMLNSNamedChildWriter(XMLElementNamedChildWriter writer, String ns) { + this.writer = writer; + this.ns = ns; + } + + @Override + public void start(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) + throws XMLStreamException, DatabaseException { + this.writer.start(graph, instance, writer); + writer.writeNamespace("", ns); + } + + @Override + public void attributes(ReadGraph graph, WriterElement instance, Collection attributes, + XMLStreamWriter writer) throws XMLStreamException, DatabaseException { + this.writer.attributes(graph, instance, attributes, writer); + } + + @Override + public void characters(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) + throws XMLStreamException, DatabaseException { + this.writer.characters(graph, instance, writer); + } + + @Override + public void children(ReadGraph graph, WriterElement instance, Set writer) + throws XMLStreamException, DatabaseException { + this.writer.children(graph, instance, writer); + } + + @Override + public void end(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) + throws XMLStreamException, DatabaseException { + this.writer.end(graph, instance, writer); + } + + @Override + public String getElementId() { + return writer.getElementId(); + } + + @Override + public Resource getType(ReadGraph graph) throws DatabaseException { + return writer.getType(graph); + } + + @Override + public Class getWriter(ReadGraph graph, Map writers, + WriterElement element) throws DatabaseException { + return this.writer.getWriter(graph, writers, element); + } + +} 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 992b98a..01b8deb 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 @@ -29,10 +29,11 @@ import org.xml.sax.helpers.DefaultHandler; public class XMLParser extends DefaultHandler implements Serializable { public static String PLUGIN_ID = "org.simantics.xml.sax.base"; + public static String XML_NAMESPACE_REF = "xmlns"; private static final long serialVersionUID = 7360740940824360338L; private static final boolean debug = false; - private static String XML_SCHEMA_REF = "xmlns"; + private ILogger logger; private WriteGraph graph; private Resource root; @@ -125,7 +126,7 @@ public class XMLParser extends DefaultHandler implements Serializable { } } else { // check for schema reference attempt to locate subparser for it. - Attribute schemaRef = element.getAttribute(XML_SCHEMA_REF); + Attribute schemaRef = element.getAttribute(XML_NAMESPACE_REF); if (schemaRef != null && subParsers.containsKey(schemaRef.value)) { XMLParser subParser = subParsers.get(schemaRef.value); subParser.loadElement(parents, element); diff --git a/org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/XMLWriter.java b/org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/XMLWriter.java index f37e4d8..ac2d368 100644 --- a/org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/XMLWriter.java +++ b/org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/XMLWriter.java @@ -26,6 +26,9 @@ import org.simantics.xml.sax.ontology.XMLResource; public class XMLWriter { + public static String XML_SCHEMA_URI = "http://www.w3.org/2001/XMLSchema"; + public static String XML_SCHEMA_INSTANCE_URI = "http://www.w3.org/2001/XMLSchema-instance"; + private ReadGraph graph; private Map subWriters = new HashMap(); private Map, XMLElementWriter> namedWriters = new HashMap, XMLElementWriter>(); @@ -95,6 +98,8 @@ public class XMLWriter { if(getSchemaURI() != null) { writer.writeDefaultNamespace(getSchemaURI()); } + writer.writeNamespace("xsd", XML_SCHEMA_URI); + writer.writeNamespace("xsi", XML_SCHEMA_INSTANCE_URI); } elementWriter.attributes(graph, instance, graph.getStatements(instance.instance, XML.hasAttribute), writer); if (graph.hasValue(instance.instance)) @@ -178,6 +183,12 @@ public class XMLWriter { XMLWriter xmlWriter = subWriters.get(ontology); if (xmlWriter != null) { childWriter = xmlWriter.writers.get(type); + // wrap the child writer with namespace writer + if (childWriter instanceof XMLElementNamedChildWriter) { + childWriter = new XMLNSNamedChildWriter((XMLElementNamedChildWriter)childWriter, xmlWriter.schemaURI); + } else { + childWriter = new XMLNSElementWriter(childWriter, xmlWriter.schemaURI); + } } } if (childWriter == null) -- 2.45.1