1 package org.simantics.xml.sax.base;
3 import java.util.HashMap;
4 import java.util.HashSet;
8 import javax.xml.stream.XMLStreamException;
9 import javax.xml.stream.XMLStreamWriter;
11 import org.simantics.db.ReadGraph;
12 import org.simantics.db.Resource;
13 import org.simantics.db.exception.DatabaseException;
14 import org.simantics.xml.sax.ontology.XMLResource;
16 public abstract class XMLElementNamedChildWriterBase implements XMLElementNamedChildWriter{
18 private Map<Resource,Class<? extends XMLElementWriter>> typeWriters = new HashMap<>();
19 private Map<Resource,Class<? extends XMLElementWriter>> relationWriters = new HashMap<>();
20 private Map<Resource,Map<Resource,Class<? extends XMLElementWriter>>> relationTypeWriters = new HashMap<>();
21 private Set<Class<? extends XMLElementWriter>> writers = new HashSet<Class<? extends XMLElementWriter>>();
24 public XMLElementNamedChildWriterBase() {
28 public XMLElementNamedChildWriterBase(ReadGraph graph) {
33 public Resource getType(ReadGraph graph) throws DatabaseException {
38 public void start(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) throws XMLStreamException {
39 writer.writeStartElement(getElementId());
43 public void characters(ReadGraph graph, WriterElement instance, XMLStreamWriter writer)
44 throws XMLStreamException, DatabaseException {
49 public void end(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) throws XMLStreamException {
50 writer.writeEndElement();
54 public void children(ReadGraph graph, WriterElement instance, Set<Resource> sorted)
55 throws XMLStreamException, DatabaseException {
60 public Class<? extends XMLElementWriter> getWriter(ReadGraph graph, Map<Resource, XMLElementWriter> writers, WriterElement child) throws DatabaseException{
61 //Resource type = graph.getSingleType(child.instance);
62 // hack fix for elements containing character data (Current schema conversion does not recognise such cases, leaving Literal type inheritance out).
63 XMLResource XML = XMLResource.getInstance(graph);
64 Resource type = graph.getSingleType(child.instance,XML.Element);
65 Class<? extends XMLElementWriter> writerClass = typeWriters.get(type);
66 if (writerClass != null)
68 if (child.statement != null) {
69 Map<Resource,Class<? extends XMLElementWriter>> typeWriters = relationTypeWriters.get(child.statement.getPredicate());
70 if (typeWriters != null) {
71 writerClass = typeWriters.get(type);
72 if (writerClass != null)
75 writerClass = relationWriters.get(child.statement.getPredicate());
76 if (writerClass != null)
79 XMLElementWriter writer = writers.get(type);
82 writerClass = writer.getClass();
83 if (this.writers.contains(writerClass))
85 for (Class<?> c : this.writers)
86 if (c.isAssignableFrom(writerClass))
91 public void addTypeWriter(Resource type, Class<? extends XMLElementWriter> writer) {
92 typeWriters.put(type, writer);
95 public void addRelationWriter(Resource relation, Class<? extends XMLElementWriter> writer) {
96 relationWriters.put(relation, writer);
99 public void addRelationTypeWriter(Resource relation, Resource type, Class<? extends XMLElementWriter> writer) {
100 Map<Resource,Class<? extends XMLElementWriter>> typeWriters = relationTypeWriters.get(relation);
101 if (typeWriters == null) {
102 typeWriters = new HashMap<>();
103 relationTypeWriters.put(relation, typeWriters);
105 typeWriters.put(type, writer);
109 public void addWriter(Class<? extends XMLElementWriter> writer) {