]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.xml.sax.base/src/org/simantics/xml/sax/base/XMLElementNamedChildWriterBase.java
8e6a678dab848182df40e720c7109caf9bc29570
[simantics/interop.git] / org.simantics.xml.sax.base / src / org / simantics / xml / sax / base / XMLElementNamedChildWriterBase.java
1 package org.simantics.xml.sax.base;\r
2 \r
3 import java.util.HashMap;\r
4 import java.util.HashSet;\r
5 import java.util.Map;\r
6 import java.util.Set;\r
7 \r
8 import javax.xml.stream.XMLStreamException;\r
9 import javax.xml.stream.XMLStreamWriter;\r
10 \r
11 import org.simantics.db.ReadGraph;\r
12 import org.simantics.db.Resource;\r
13 import org.simantics.db.exception.DatabaseException;\r
14 \r
15 public abstract class XMLElementNamedChildWriterBase implements XMLElementNamedChildWriter{\r
16 \r
17         private Map<Resource,Class<? extends XMLElementWriter>> typeWriters = new HashMap<>();\r
18         private Map<Resource,Class<? extends XMLElementWriter>> relationWriters = new HashMap<>();\r
19         private Map<Resource,Map<Resource,Class<? extends XMLElementWriter>>> relationTypeWriters = new HashMap<>();\r
20         private Set<Class<? extends XMLElementWriter>> writers = new HashSet<Class<? extends XMLElementWriter>>();\r
21         \r
22         \r
23         public XMLElementNamedChildWriterBase() {\r
24         \r
25         }\r
26         \r
27         public XMLElementNamedChildWriterBase(ReadGraph graph) {\r
28                 \r
29         }\r
30         \r
31         @Override\r
32         public Resource getType(ReadGraph graph) throws DatabaseException {\r
33                 return null;\r
34         }\r
35         \r
36         @Override\r
37         public void start(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) throws XMLStreamException {\r
38                 writer.writeStartElement(getElementId());\r
39         }\r
40         \r
41         @Override\r
42         public void characters(ReadGraph graph, WriterElement instance, XMLStreamWriter writer)\r
43                         throws XMLStreamException, DatabaseException {\r
44                 \r
45         }\r
46         \r
47         @Override\r
48         public void end(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) throws XMLStreamException {\r
49                 writer.writeEndElement();\r
50         }\r
51         \r
52         @Override\r
53         public void children(ReadGraph graph, WriterElement instance, Set<Resource> sorted)\r
54                         throws XMLStreamException, DatabaseException {\r
55         \r
56         }\r
57         \r
58         @Override\r
59         public Class<? extends XMLElementWriter> getWriter(ReadGraph graph, Map<Resource, XMLElementWriter> writers, WriterElement child) throws DatabaseException{\r
60                 Resource type = graph.getSingleType(child.instance);\r
61                 Class<? extends XMLElementWriter> writerClass =  typeWriters.get(type);\r
62                 if (writerClass != null)\r
63                         return writerClass;\r
64                 if (child.statement != null) {\r
65                         Map<Resource,Class<? extends XMLElementWriter>> typeWriters = relationTypeWriters.get(child.statement.getPredicate());\r
66                         if (typeWriters != null) {\r
67                                 writerClass = typeWriters.get(type);\r
68                                 if (writerClass != null)\r
69                                         return writerClass;\r
70                         }\r
71                         writerClass = relationWriters.get(child.statement.getPredicate());\r
72                         if (writerClass != null)\r
73                                 return writerClass;\r
74                 }\r
75                 XMLElementWriter writer = writers.get(type);\r
76                 if (writer == null)\r
77                         return null;\r
78                 writerClass = writer.getClass();\r
79                 if (this.writers.contains(writerClass))\r
80                         return writerClass;\r
81                 for (Class<?> c : this.writers)\r
82                         if (c.isAssignableFrom(writerClass))\r
83                                 return writerClass;\r
84                 return null;\r
85         }\r
86         \r
87         public void addTypeWriter(Resource type, Class<? extends XMLElementWriter> writer) {\r
88                 typeWriters.put(type, writer);\r
89         }\r
90         \r
91         public void addRelationWriter(Resource relation, Class<? extends XMLElementWriter> writer) {\r
92                 relationWriters.put(relation, writer);\r
93         }\r
94         \r
95         public void addRelationTypeWriter(Resource relation, Resource type, Class<? extends XMLElementWriter> writer) {\r
96                 Map<Resource,Class<? extends XMLElementWriter>> typeWriters = relationTypeWriters.get(relation);\r
97                 if (typeWriters == null) {\r
98                         typeWriters = new HashMap<>();\r
99                         relationTypeWriters.put(relation, typeWriters);\r
100                 }\r
101                 typeWriters.put(type, writer);\r
102         }\r
103         \r
104         \r
105         public void addWriter(Class<? extends XMLElementWriter> writer) {\r
106                 writers.add(writer);\r
107         }\r
108 }\r