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