]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.xml.sax/src/org/simantics/xml/sax/JavaGenerator.java
XML Elements are exported in the original order (if order is stored during import)
[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                                                 handleIndicator(parent, indicator, e, name, RefType.Type);\r
111                                 } else if (localElement.getRef() != null) {\r
112                                         //QName refType = localElement.getRef();\r
113                                         //handleIndicator(parent, indicator, e, true, name, refType);\r
114                                         handleIndicator(parent, indicator, e, name, RefType.Reference);\r
115                                 }\r
116                         }\r
117                 }\r
118                 \r
119         }\r
120         \r
121         protected String getOntologyImport() {\r
122                 return this.ontologyClassName+" " +ontShort.substring(0, 3)+" = "+this.ontologyClassName+".getInstance(graph);";\r
123         }\r
124         \r
125         protected static class FileWriter {\r
126                 public PrintWriter writer;\r
127                 \r
128                 public PrintWriter delayedWriter;\r
129                 public PrintWriter delayedWriter2;\r
130         }\r
131         \r
132         protected  FileWriter getWriter(SchemaObject obj) {\r
133                 SchemaObject s = obj;\r
134                 while (s != null) {\r
135                         FileWriter fw = writers.get(s);\r
136                         if (fw != null)\r
137                                 return fw;\r
138                         s = s.getParent();\r
139                 }\r
140                 return null;\r
141         }\r
142         \r
143         \r
144         public static String getName(SchemaObject obj) {\r
145                 if (obj.getParent() == null) {\r
146                         switch (obj.getType()) {\r
147                         case COMPLEX_TYPE:\r
148                                 return getComplexTypePrefix()+obj.getName();\r
149                         case ELEMENT:\r
150                                 return obj.getName();\r
151                         case ATTRIBUTE_GROUP:\r
152                                 return getAttributeGroupPrefix()+obj.getName();\r
153                         case SIMPLE_TYPE:\r
154                                 return obj.getName();\r
155                         }\r
156                 } else {\r
157                         SchemaObject o = obj;\r
158                         SchemaObject prev = null;\r
159                         String name = "";\r
160                         while (o != null){\r
161                                 if (o.getName() != null)\r
162                                         name = o.getName()+"_"+name;\r
163                                 prev = o;\r
164                                 o = o.getParent();\r
165                                 if (prev.getObj() instanceof AttributeGroupRef)\r
166                                         o = null;\r
167                         }\r
168                         name = name.substring(0, name.length()-1);\r
169                         switch (prev.getType()) {\r
170                         case COMPLEX_TYPE:\r
171                                 return getComplexTypePrefix()+name;\r
172                         case ELEMENT:\r
173                                 return name;\r
174                         case ATTRIBUTE_GROUP:\r
175                                 return getAttributeGroupPrefix()+name;\r
176                         case SIMPLE_TYPE:\r
177                                 return name;\r
178                         }\r
179                 }\r
180                 throw new RuntimeException();\r
181                 \r
182         }\r
183         \r
184         public static String getName(SchemaObject obj, String rel) {\r
185                 if (obj.getParent() == null) {\r
186                         switch (obj.getType()) {\r
187                         case COMPLEX_TYPE:\r
188                                 return getComplexTypePrefix()+rel+obj.getName();\r
189                         case ELEMENT:\r
190                                 return rel+obj.getName();\r
191                         case ATTRIBUTE_GROUP:\r
192                                 return getAttributeGroupPrefix()+rel+obj.getName();\r
193                         case SIMPLE_TYPE:\r
194                                 return rel+obj.getName();\r
195                         }\r
196                 } else {\r
197                         SchemaObject o = obj;\r
198                         SchemaObject prev = null;\r
199                         String name = "";\r
200                         while (o != null){\r
201                                 if (o.getName() != null)\r
202                                         name = o.getName()+"_"+name;\r
203                                 prev = o;\r
204                                 o = o.getParent();\r
205                         }\r
206                         name = name.substring(0, name.length()-1);\r
207                         switch (prev.getType()) {\r
208                         case COMPLEX_TYPE:\r
209                                 return getComplexTypePrefix()+rel+name;\r
210                         case ELEMENT:\r
211                                 return rel+name;\r
212                         case ATTRIBUTE_GROUP:\r
213                                 return getAttributeGroupPrefix()+rel+name;\r
214                         case SIMPLE_TYPE:\r
215                                 return rel+name;\r
216                         }\r
217                 }\r
218                 throw new RuntimeException();\r
219         }\r
220         \r
221         protected enum InheritanceType{ComplexType,AtomicType,None};\r
222         \r
223         protected class Inheritance {\r
224                 public String baseClass;\r
225                 public InheritanceType type;\r
226                 public TypeEntry atomicType;\r
227                 \r
228                 public Inheritance(String baseClass) {\r
229                         this.baseClass = baseClass;\r
230                         this.type = InheritanceType.None;\r
231                 }\r
232         }\r
233         \r
234         protected void writeClass(PrintWriter writer,boolean abst, String name, String className, String baseClass, List<String> interfaces) {\r
235                 writer.println("@SuppressWarnings(\"unused\")");\r
236                 writer.print("public " +(abst ? "abstract " : "") + "class " + className + " extends "+baseClass);\r
237                 if (interfaces.size() > 0) {\r
238                         writer.print(" implements ");\r
239                         for (int i = 0; i < interfaces.size(); i++) {\r
240                                 writer.print(interfaces.get(i));\r
241                                 if (i < interfaces.size() -1 )\r
242                                         writer.print(",");\r
243                         }\r
244                 }\r
245                 writer.println("{");\r
246                 writer.println();\r
247                 writer.println("   @Override");\r
248                 writer.println("   public java.lang.String getElementId() {");\r
249                 if (name != null)\r
250                 writer.println("      return \""+name+"\";");\r
251                 else // complex types cannot be parsed directly with name/id reference.\r
252                 writer.println("      return null;");\r
253                 writer.println("   }");\r
254                 writer.println();\r
255         }\r
256         \r
257         protected abstract String getBaseClass();\r
258         \r
259         protected Inheritance getElementInheritance(SchemaObject topLevelElementObj) {\r
260                 Element topLevelElement = topLevelElementObj.getElement();\r
261                 Inheritance inheritance = new Inheritance(getBaseClass());\r
262                 if (topLevelElement.getType() != null) {\r
263                         QName type = topLevelElement.getType();\r
264                         if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
265                                 SchemaObject obj = complexTypeName.get(type.getLocalPart());\r
266 //                              if (obj == null)\r
267 //                                      obj = simpleTypeName.get(type.getLocalPart());\r
268                                 if (obj != null) {\r
269                                         inheritance.baseClass = getName(obj);\r
270                                         inheritance.type = InheritanceType.ComplexType;\r
271                                 }\r
272                         } else {\r
273                                 TypeEntry entry = getTypeEntry(type);\r
274                                 if (entry != null) {\r
275                                         inheritance.type = InheritanceType.AtomicType;\r
276                                         inheritance.atomicType = entry;\r
277                                 }\r
278                         }\r
279                 }\r
280                 if (inheritance.type == InheritanceType.None) {\r
281                         QName type = getElementBase(topLevelElement);\r
282                         if (type != null) {\r
283                                 if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
284                                         SchemaObject obj = getWithName(topLevelElementObj, type.getLocalPart());\r
285                                         inheritance.baseClass = getName(obj);\r
286                                         inheritance.type = InheritanceType.ComplexType;\r
287                                 } else {\r
288                                         TypeEntry entry = getTypeEntry(type);\r
289                                         if (entry != null) {\r
290                                                 inheritance.type = InheritanceType.AtomicType;\r
291                                                 inheritance.atomicType = entry;\r
292                                         }\r
293                                 }\r
294                         }\r
295                 }\r
296                 if (inheritance.type == InheritanceType.None) {\r
297                         QName type = topLevelElement.getSubstitutionGroup();\r
298                         if (type != null) {\r
299                                 if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
300                                         SchemaObject obj = getWithName(topLevelElementObj, type.getLocalPart());\r
301                                         inheritance.baseClass = getName(obj);\r
302                                         inheritance.type = InheritanceType.ComplexType;\r
303                                 } else {\r
304                                         TypeEntry entry = getTypeEntry(type);\r
305                                         if (entry != null) {\r
306                                                 inheritance.type = InheritanceType.AtomicType;\r
307                                                 inheritance.atomicType = entry;\r
308                                         }\r
309                                 }\r
310                         }\r
311                 }\r
312                 \r
313                 return inheritance;\r
314         }       \r
315 \r
316 }\r