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