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