-package org.simantics.xml.sax.base;\r
-\r
-import java.util.HashMap;\r
-import java.util.HashSet;\r
-import java.util.Map;\r
-import java.util.Set;\r
-\r
-import javax.xml.stream.XMLStreamException;\r
-import javax.xml.stream.XMLStreamWriter;\r
-\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.exception.DatabaseException;\r
-\r
-public abstract class XMLElementNamedChildWriterBase implements XMLElementNamedChildWriter{\r
-\r
- private Map<Resource,Class<? extends XMLElementWriter>> typeWriters = new HashMap<Resource, Class<? extends XMLElementWriter>>();\r
- private Map<Resource,Class<? extends XMLElementWriter>> relationWriters = new HashMap<Resource, Class<? extends XMLElementWriter>>();\r
- private Set<Class<? extends XMLElementWriter>> writers = new HashSet<Class<? extends XMLElementWriter>>();\r
- \r
- \r
- public XMLElementNamedChildWriterBase() {\r
- \r
- }\r
- \r
- public XMLElementNamedChildWriterBase(ReadGraph graph) {\r
- \r
- }\r
- \r
- @Override\r
- public Resource getType(ReadGraph graph) throws DatabaseException {\r
- return null;\r
- }\r
- \r
- @Override\r
- public void start(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) throws XMLStreamException {\r
- writer.writeStartElement(getElementId());\r
- }\r
- \r
- @Override\r
- public void characters(ReadGraph graph, WriterElement instance, XMLStreamWriter writer)\r
- throws XMLStreamException, DatabaseException {\r
- \r
- }\r
- \r
- @Override\r
- public void end(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) throws XMLStreamException {\r
- writer.writeEndElement();\r
- }\r
- \r
- @Override\r
- public void children(ReadGraph graph, WriterElement instance, Set<Resource> sorted)\r
- throws XMLStreamException, DatabaseException {\r
- \r
- }\r
- \r
- @Override\r
- public Class<? extends XMLElementWriter> getWriter(ReadGraph graph, Map<Resource, XMLElementWriter> writers, WriterElement child) throws DatabaseException{\r
- Resource type = graph.getSingleType(child.instance);\r
- Class<? extends XMLElementWriter> writerClass = typeWriters.get(type);\r
- if (writerClass != null)\r
- return writerClass;\r
- if (child.statement != null) {\r
- writerClass = relationWriters.get(child.statement.getPredicate());\r
- if (writerClass != null)\r
- return writerClass;\r
- }\r
- XMLElementWriter writer = writers.get(type);\r
- if (writer == null)\r
- return null;\r
- writerClass = writer.getClass();\r
- if (this.writers.contains(writerClass))\r
- return writerClass;\r
- for (Class<?> c : this.writers)\r
- if (c.isAssignableFrom(writerClass))\r
- return writerClass;\r
- return null;\r
- }\r
- \r
- public void addTypeWriter(Resource type, Class<? extends XMLElementWriter> writer) {\r
- typeWriters.put(type, writer);\r
- }\r
- \r
- public void addRelationWriter(Resource relation, Class<? extends XMLElementWriter> writer) {\r
- relationWriters.put(relation, writer);\r
- }\r
- \r
- public void addWriter(Class<? extends XMLElementWriter> writer) {\r
- writers.add(writer);\r
- }\r
-}\r
+package org.simantics.xml.sax.base;
+
+import java.util.HashMap;
+import java.util.HashSet;
+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.exception.DatabaseException;
+import org.simantics.xml.sax.ontology.XMLResource;
+
+public abstract class XMLElementNamedChildWriterBase implements XMLElementNamedChildWriter{
+
+ private Map<Resource,Class<? extends XMLElementWriter>> typeWriters = new HashMap<>();
+ private Map<Resource,Class<? extends XMLElementWriter>> relationWriters = new HashMap<>();
+ private Map<Resource,Map<Resource,Class<? extends XMLElementWriter>>> relationTypeWriters = new HashMap<>();
+ private Set<Class<? extends XMLElementWriter>> writers = new HashSet<Class<? extends XMLElementWriter>>();
+
+
+ public XMLElementNamedChildWriterBase() {
+
+ }
+
+ public XMLElementNamedChildWriterBase(ReadGraph graph) {
+
+ }
+
+ @Override
+ public Resource getType(ReadGraph graph) throws DatabaseException {
+ return null;
+ }
+
+ @Override
+ public void start(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) throws XMLStreamException {
+ writer.writeStartElement(getElementId());
+ }
+
+ @Override
+ public void characters(ReadGraph graph, WriterElement instance, XMLStreamWriter writer)
+ throws XMLStreamException, DatabaseException {
+
+ }
+
+ @Override
+ public void end(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) throws XMLStreamException {
+ writer.writeEndElement();
+ }
+
+ @Override
+ public void children(ReadGraph graph, WriterElement instance, Set<Resource> sorted)
+ throws XMLStreamException, DatabaseException {
+
+ }
+
+ @Override
+ public Class<? extends XMLElementWriter> getWriter(ReadGraph graph, Map<Resource, XMLElementWriter> writers, WriterElement child) throws DatabaseException{
+ //Resource type = graph.getSingleType(child.instance);
+ // hack fix for elements containing character data (Current schema conversion does not recognise such cases, leaving Literal type inheritance out).
+ XMLResource XML = XMLResource.getInstance(graph);
+ Resource type = graph.getSingleType(child.instance,XML.Element);
+ Class<? extends XMLElementWriter> writerClass = typeWriters.get(type);
+ if (writerClass != null)
+ return writerClass;
+ if (child.statement != null) {
+ Map<Resource,Class<? extends XMLElementWriter>> typeWriters = relationTypeWriters.get(child.statement.getPredicate());
+ if (typeWriters != null) {
+ writerClass = typeWriters.get(type);
+ if (writerClass != null)
+ return writerClass;
+ }
+ writerClass = relationWriters.get(child.statement.getPredicate());
+ if (writerClass != null)
+ return writerClass;
+ }
+ XMLElementWriter writer = writers.get(type);
+ if (writer == null)
+ return null;
+ writerClass = writer.getClass();
+ if (this.writers.contains(writerClass))
+ return writerClass;
+ for (Class<?> c : this.writers)
+ if (c.isAssignableFrom(writerClass))
+ return writerClass;
+ return null;
+ }
+
+ public void addTypeWriter(Resource type, Class<? extends XMLElementWriter> writer) {
+ typeWriters.put(type, writer);
+ }
+
+ public void addRelationWriter(Resource relation, Class<? extends XMLElementWriter> writer) {
+ relationWriters.put(relation, writer);
+ }
+
+ public void addRelationTypeWriter(Resource relation, Resource type, Class<? extends XMLElementWriter> writer) {
+ Map<Resource,Class<? extends XMLElementWriter>> typeWriters = relationTypeWriters.get(relation);
+ if (typeWriters == null) {
+ typeWriters = new HashMap<>();
+ relationTypeWriters.put(relation, typeWriters);
+ }
+ typeWriters.put(type, writer);
+ }
+
+
+ public void addWriter(Class<? extends XMLElementWriter> writer) {
+ writers.add(writer);
+ }
+}