]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/XMLElementNamedChildWriterBase.java
Attribute namespace + multi-schema data export
[simantics/interop.git] / org.simantics.xml.sax.base / src / org / simantics / xml / sax / base / XMLElementNamedChildWriterBase.java
1 package org.simantics.xml.sax.base;
2
3 import java.util.HashMap;
4 import java.util.HashSet;
5 import java.util.Map;
6 import java.util.Set;
7
8 import javax.xml.stream.XMLStreamException;
9 import javax.xml.stream.XMLStreamWriter;
10
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;
15
16 public abstract class XMLElementNamedChildWriterBase implements XMLElementNamedChildWriter{
17
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>>();
22         
23         
24         public XMLElementNamedChildWriterBase() {
25         
26         }
27         
28         public XMLElementNamedChildWriterBase(ReadGraph graph) {
29                 
30         }
31         
32         @Override
33         public Resource getType(ReadGraph graph) throws DatabaseException {
34                 return null;
35         }
36         
37         @Override
38         public void start(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) throws XMLStreamException {
39                 writer.writeStartElement(getElementId());
40         }
41         
42         @Override
43         public void characters(ReadGraph graph, WriterElement instance, XMLStreamWriter writer)
44                         throws XMLStreamException, DatabaseException {
45                 
46         }
47         
48         @Override
49         public void end(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) throws XMLStreamException {
50                 writer.writeEndElement();
51         }
52         
53         @Override
54         public void children(ReadGraph graph, WriterElement instance, Set<Resource> sorted)
55                         throws XMLStreamException, DatabaseException {
56         
57         }
58         
59         @Override
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)
67                         return writerClass;
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)
73                                         return writerClass;
74                         }
75                         writerClass = relationWriters.get(child.statement.getPredicate());
76                         if (writerClass != null)
77                                 return writerClass;
78                 }
79                 XMLElementWriter writer = writers.get(type);
80                 if (writer == null)
81                         return null;
82                 writerClass = writer.getClass();
83                 if (this.writers.contains(writerClass))
84                         return writerClass;
85                 for (Class<?> c : this.writers)
86                         if (c.isAssignableFrom(writerClass))
87                                 return writerClass;
88                 return null;
89         }
90         
91         public void addTypeWriter(Resource type, Class<? extends XMLElementWriter> writer) {
92                 typeWriters.put(type, writer);
93         }
94         
95         public void addRelationWriter(Resource relation, Class<? extends XMLElementWriter> writer) {
96                 relationWriters.put(relation, writer);
97         }
98         
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);
104                 }
105                 typeWriters.put(type, writer);
106         }
107         
108         
109         public void addWriter(Class<? extends XMLElementWriter> writer) {
110                 writers.add(writer);
111         }
112 }