]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.xml.sax/src/org/simantics/xml/sax/JavaGenerator.java
Handling ComplexTypes inheriting AtomicType
[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 String getComplexTypePrefix() {\r
69                 return "ComplexTypes_";\r
70         }       \r
71         \r
72         public 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 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 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         \r
203         \r
204         protected void writeClass(PrintWriter writer,boolean abst, String elementId, String className, String baseClass, List<String> interfaces) {\r
205                 writer.println("@SuppressWarnings(\"unused\")");\r
206                 writer.print("public " +(abst ? "abstract " : "") + "class " + className + " extends "+baseClass);\r
207                 if (interfaces.size() > 0) {\r
208                         writer.print(" implements ");\r
209                         for (int i = 0; i < interfaces.size(); i++) {\r
210                                 writer.print(interfaces.get(i));\r
211                                 if (i < interfaces.size() -1 )\r
212                                         writer.print(",");\r
213                         }\r
214                 }\r
215                 writer.println("{");\r
216                 writer.println();\r
217                 writer.println("   @Override");\r
218                 writer.println("   public java.lang.String getElementId() {");\r
219                 if (elementId != null)\r
220                 writer.println("      return \""+elementId+"\";");\r
221                 else // complex types cannot be parsed directly with name/id reference.\r
222                 writer.println("      return null;");\r
223                 writer.println("   }");\r
224                 writer.println();\r
225         }\r
226         \r
227         \r
228         \r
229 \r
230 \r
231 }\r