]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.xml.sax/src/org/simantics/xml/sax/JavaGenerator.java
Initial support for XML export (order of Elements is not kept)
[simantics/interop.git] / org.simantics.xml.sax / src / org / simantics / xml / sax / JavaGenerator.java
1 package org.simantics.xml.sax;\r
2 \r
3 import java.io.File;\r
4 import java.io.IOException;\r
5 import java.io.PrintWriter;\r
6 import java.util.ArrayList;\r
7 import java.util.HashMap;\r
8 import java.util.List;\r
9 import java.util.Map;\r
10 \r
11 import javax.xml.namespace.QName;\r
12 \r
13 import org.simantics.xml.sax.configuration.Configuration;\r
14 import org.w3._2001.xmlschema.AttributeGroupRef;\r
15 import org.w3._2001.xmlschema.Element;\r
16 import org.w3._2001.xmlschema.Schema;\r
17 \r
18 public abstract class JavaGenerator extends SchemaConversionBase{\r
19 \r
20         String commentTag = "//";\r
21         \r
22         Schema schema;\r
23         String ontologyClassName;\r
24         SchemaConverter converter;\r
25         \r
26         List<String> ruleClassNames = new ArrayList<String>();\r
27         \r
28         String ontShort = "ONT"; \r
29         \r
30         File importParserDir;\r
31         String elementPackageName;\r
32         \r
33         Map<SchemaObject, FileWriter> writers = new HashMap<SchemaObject, ImporterGenerator.FileWriter>();\r
34         \r
35         public JavaGenerator(Configuration configuration) {\r
36                 super(configuration);\r
37         }\r
38         \r
39         \r
40         protected PrintWriter createFile(File file) throws IOException {\r
41                 if (!file.exists())\r
42                         file.createNewFile();\r
43                 PrintWriter writer = new PrintWriter(file);\r
44                 for (String s : converter.getHeader()) {\r
45                         writer.println(commentTag + " " + s);   \r
46                 }\r
47                 writer.println();\r
48                 return writer;\r
49         }\r
50         \r
51         protected String getValueGetterMethod(TypeEntry binding,String name) {\r
52                 if (binding == null)\r
53                         return name+".getValue()";\r
54                 return binding.getValueGetterMethod(name);\r
55         }\r
56         \r
57         protected String getValueGetter(TypeEntry binding,String name) {\r
58                 if (binding == null)\r
59                         return name;\r
60                 return binding.getValueGetter(name);\r
61         }\r
62         protected String getValueGetter(TypeEntry binding) {\r
63                 if (binding == null)\r
64                         return "value";\r
65                 return binding.getValueGetter();\r
66         }\r
67         \r
68         public static String getComplexTypePrefix() {\r
69                 return "ComplexTypes_";\r
70         }       \r
71         \r
72         public static String getAttributeGroupPrefix() {\r
73                 return "AttributeGroups_";\r
74         }\r
75         \r
76         @Override\r
77         protected void handle(SchemaObject parent, SchemaElement indicator, SchemaElement element) {\r
78                 Element localElement = element.getElement();\r
79                 if (localElement.getName() != null) {\r
80                         SchemaObject eObj = elements.get(localElement);\r
81                         String refName = localElement.getName();\r
82                         QName refType = localElement.getType();\r
83                         if (refType != null)\r
84                                 handleIndicator(parent, indicator, element, false, refName, refType);\r
85                         else {\r
86                                 handleElement(eObj);\r
87                                 handleIndicator(parent, indicator, element, false, refName, localElement);\r
88                         }\r
89                 } else if (localElement.getRef() != null) {\r
90                         QName refType = localElement.getRef();\r
91                         handleIndicator(parent, indicator,element, true, refType.getLocalPart(), refType);\r
92                 }\r
93         }\r
94         \r
95         @Override\r
96         protected void handle(SchemaObject parent, SchemaElement indicator, List<SchemaElement> elements) {\r
97                 if (indicator.getType() == SchemaElement.ElementType.SEQUENCE || (indicator.getType() == SchemaElement.ElementType.CHOICE && indicator.getRestriction().many())) {\r
98                         for (SchemaElement e : elements) {\r
99                                 handle(parent, indicator, e);\r
100                         }\r
101                 } else if (indicator.getType() == SchemaElement.ElementType.CHOICE) {\r
102                         String name = getChoiceName(elements);\r
103 \r
104                         for (SchemaElement e : elements) {\r
105                                 Element localElement = e.getElement();\r
106                                 if (localElement.getName() != null) {\r
107                                         QName refType = localElement.getType();\r
108                                         if (refType != null)\r
109                                                 handleIndicator(parent, indicator, e, false, name, refType);\r
110                                 } else if (localElement.getRef() != null) {\r
111                                         QName refType = localElement.getRef();\r
112                                         handleIndicator(parent, indicator, e, true, name, refType);\r
113                                 }\r
114                         }\r
115                 }\r
116                 \r
117         }\r
118         \r
119         protected String getOntologyImport() {\r
120                 return this.ontologyClassName+" " +ontShort.substring(0, 3)+" = "+this.ontologyClassName+".getInstance(graph);";\r
121         }\r
122         \r
123         protected static class FileWriter {\r
124                 public PrintWriter writer;\r
125                 \r
126                 public PrintWriter delayedWriter;\r
127                 public PrintWriter delayedWriter2;\r
128         }\r
129         \r
130         protected  FileWriter getWriter(SchemaObject obj) {\r
131                 SchemaObject s = obj;\r
132                 while (s != null) {\r
133                         FileWriter fw = writers.get(s);\r
134                         if (fw != null)\r
135                                 return fw;\r
136                         s = s.getParent();\r
137                 }\r
138                 return null;\r
139         }\r
140         \r
141         \r
142         public static String getName(SchemaObject obj) {\r
143                 if (obj.getParent() == null) {\r
144                         switch (obj.getType()) {\r
145                         case COMPLEX_TYPE:\r
146                                 return getComplexTypePrefix()+obj.getName();\r
147                         case ELEMENT:\r
148                                 return obj.getName();\r
149                         case ATTRIBUTE_GROUP:\r
150                                 return getAttributeGroupPrefix()+obj.getName();\r
151                         case SIMPLE_TYPE:\r
152                                 return obj.getName();\r
153                         }\r
154                 } else {\r
155                         SchemaObject o = obj;\r
156                         SchemaObject prev = null;\r
157                         String name = "";\r
158                         while (o != null){\r
159                                 if (o.getName() != null)\r
160                                         name = o.getName()+"_"+name;\r
161                                 prev = o;\r
162                                 o = o.getParent();\r
163                                 if (prev.getObj() instanceof AttributeGroupRef)\r
164                                         o = null;\r
165                         }\r
166                         name = name.substring(0, name.length()-1);\r
167                         switch (prev.getType()) {\r
168                         case COMPLEX_TYPE:\r
169                                 return getComplexTypePrefix()+name;\r
170                         case ELEMENT:\r
171                                 return name;\r
172                         case ATTRIBUTE_GROUP:\r
173                                 return getAttributeGroupPrefix()+name;\r
174                         case SIMPLE_TYPE:\r
175                                 return name;\r
176                         }\r
177                 }\r
178                 throw new RuntimeException();\r
179                 \r
180         }\r
181         \r
182         public static String getName(SchemaObject obj, String rel) {\r
183                 if (obj.getParent() == null) {\r
184                         switch (obj.getType()) {\r
185                         case COMPLEX_TYPE:\r
186                                 return getComplexTypePrefix()+rel+obj.getName();\r
187                         case ELEMENT:\r
188                                 return rel+obj.getName();\r
189                         case ATTRIBUTE_GROUP:\r
190                                 return getAttributeGroupPrefix()+rel+obj.getName();\r
191                         case SIMPLE_TYPE:\r
192                                 return rel+obj.getName();\r
193                         }\r
194                 } else {\r
195                         SchemaObject o = obj;\r
196                         SchemaObject prev = null;\r
197                         String name = "";\r
198                         while (o != null){\r
199                                 if (o.getName() != null)\r
200                                         name = o.getName()+"_"+name;\r
201                                 prev = o;\r
202                                 o = o.getParent();\r
203                         }\r
204                         name = name.substring(0, name.length()-1);\r
205                         switch (prev.getType()) {\r
206                         case COMPLEX_TYPE:\r
207                                 return getComplexTypePrefix()+rel+name;\r
208                         case ELEMENT:\r
209                                 return rel+name;\r
210                         case ATTRIBUTE_GROUP:\r
211                                 return getAttributeGroupPrefix()+rel+name;\r
212                         case SIMPLE_TYPE:\r
213                                 return rel+name;\r
214                         }\r
215                 }\r
216                 throw new RuntimeException();\r
217         }\r
218         \r
219         protected enum InheritanceType{ComplexType,AtomicType,None};\r
220         \r
221         protected class Inheritance {\r
222                 public String baseClass;\r
223                 public InheritanceType type;\r
224                 public TypeEntry atomicType;\r
225                 \r
226                 public Inheritance(String baseClass) {\r
227                         this.baseClass = baseClass;\r
228                         this.type = InheritanceType.None;\r
229                 }\r
230         }\r
231         \r
232         protected void writeClass(PrintWriter writer,boolean abst, String name, String className, String baseClass, List<String> interfaces) {\r
233                 writer.println("@SuppressWarnings(\"unused\")");\r
234                 writer.print("public " +(abst ? "abstract " : "") + "class " + className + " extends "+baseClass);\r
235                 if (interfaces.size() > 0) {\r
236                         writer.print(" implements ");\r
237                         for (int i = 0; i < interfaces.size(); i++) {\r
238                                 writer.print(interfaces.get(i));\r
239                                 if (i < interfaces.size() -1 )\r
240                                         writer.print(",");\r
241                         }\r
242                 }\r
243                 writer.println("{");\r
244                 writer.println();\r
245                 writer.println("   @Override");\r
246                 writer.println("   public java.lang.String getElementId() {");\r
247                 if (name != null)\r
248                 writer.println("      return \""+name+"\";");\r
249                 else // complex types cannot be parsed directly with name/id reference.\r
250                 writer.println("      return null;");\r
251                 writer.println("   }");\r
252                 writer.println();\r
253         }\r
254         \r
255         protected abstract String getBaseClass();\r
256         \r
257         protected Inheritance getElementInheritance(SchemaObject topLevelElementObj) {\r
258                 Element topLevelElement = topLevelElementObj.getElement();\r
259                 Inheritance inheritance = new Inheritance(getBaseClass());\r
260                 if (topLevelElement.getType() != null) {\r
261                         QName type = topLevelElement.getType();\r
262                         if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
263                                 SchemaObject obj = complexTypeName.get(type.getLocalPart());\r
264 //                              if (obj == null)\r
265 //                                      obj = simpleTypeName.get(type.getLocalPart());\r
266                                 if (obj != null) {\r
267                                         inheritance.baseClass = getName(obj);\r
268                                         inheritance.type = InheritanceType.ComplexType;\r
269                                 }\r
270                         } else {\r
271                                 TypeEntry entry = getTypeEntry(type);\r
272                                 if (entry != null) {\r
273                                         inheritance.type = InheritanceType.AtomicType;\r
274                                         inheritance.atomicType = entry;\r
275                                 }\r
276                         }\r
277                 }\r
278                 if (inheritance.type == InheritanceType.None) {\r
279                         QName type = getElementBase(topLevelElement);\r
280                         if (type != null) {\r
281                                 if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
282                                         SchemaObject obj = getWithName(topLevelElementObj, type.getLocalPart());\r
283                                         inheritance.baseClass = getName(obj);\r
284                                         inheritance.type = InheritanceType.ComplexType;\r
285                                 } else {\r
286                                         TypeEntry entry = getTypeEntry(type);\r
287                                         if (entry != null) {\r
288                                                 inheritance.type = InheritanceType.AtomicType;\r
289                                                 inheritance.atomicType = entry;\r
290                                         }\r
291                                 }\r
292                         }\r
293                 }\r
294                 if (inheritance.type == InheritanceType.None) {\r
295                         QName type = topLevelElement.getSubstitutionGroup();\r
296                         if (type != null) {\r
297                                 if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
298                                         SchemaObject obj = getWithName(topLevelElementObj, type.getLocalPart());\r
299                                         inheritance.baseClass = getName(obj);\r
300                                         inheritance.type = InheritanceType.ComplexType;\r
301                                 } else {\r
302                                         TypeEntry entry = getTypeEntry(type);\r
303                                         if (entry != null) {\r
304                                                 inheritance.type = InheritanceType.AtomicType;\r
305                                                 inheritance.atomicType = entry;\r
306                                         }\r
307                                 }\r
308                         }\r
309                 }\r
310                 \r
311                 return inheritance;\r
312         }       \r
313 \r
314 }\r