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