]> gerrit.simantics Code Review - simantics/interop.git/blob - simantics/xml/sax/ImporterGenerator.java
Replace log4j with slf4j
[simantics/interop.git] / simantics / xml / sax / ImporterGenerator.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.io.StringWriter;\r
7 import java.util.ArrayList;\r
8 import java.util.HashMap;\r
9 import java.util.List;\r
10 import java.util.Map;\r
11 \r
12 import javax.xml.namespace.QName;\r
13 \r
14 import org.simantics.utils.datastructures.BijectionMap;\r
15 import org.simantics.xml.sax.configuration.AttributeComposition;\r
16 import org.simantics.xml.sax.configuration.Configuration;\r
17 import org.simantics.xml.sax.configuration.IDProvider;\r
18 import org.simantics.xml.sax.configuration.IDReference;\r
19 import org.simantics.xml.sax.configuration.UnrecognizedChildElement;\r
20 import org.w3._2001.xmlschema.Annotated;\r
21 import org.w3._2001.xmlschema.Attribute;\r
22 import org.w3._2001.xmlschema.AttributeGroup;\r
23 import org.w3._2001.xmlschema.AttributeGroupRef;\r
24 import org.w3._2001.xmlschema.ComplexType;\r
25 import org.w3._2001.xmlschema.Element;\r
26 import org.w3._2001.xmlschema.LocalComplexType;\r
27 import org.w3._2001.xmlschema.LocalSimpleType;\r
28 import org.w3._2001.xmlschema.NamedAttributeGroup;\r
29 import org.w3._2001.xmlschema.OpenAttrs;\r
30 import org.w3._2001.xmlschema.Restriction;\r
31 import org.w3._2001.xmlschema.Schema;\r
32 import org.w3._2001.xmlschema.SimpleType;\r
33 import org.w3._2001.xmlschema.TopLevelAttribute;\r
34 \r
35 public class ImporterGenerator extends SchemaConversionBase{\r
36         \r
37         public ImporterGenerator(Configuration configuration) {\r
38                 super(configuration);\r
39         }\r
40 \r
41         String commentTag = "//";\r
42         \r
43         Schema schema;\r
44         String ontologyClassName;\r
45         SchemaConverter converter;\r
46         \r
47         List<String> ruleClassNames = new ArrayList<String>();\r
48         \r
49         String ontShort = "ONT"; \r
50         \r
51         File importParserDir;\r
52         String elementPackageName;\r
53         \r
54         public void createParser(Schema schema,String className, SchemaConverter converter) throws IOException {\r
55                 this.schema = schema;\r
56                 this.ontologyClassName = className;\r
57                 this.converter = converter;\r
58                 \r
59                 \r
60                 String packageParts[] = className.split("\\.");\r
61                 String name = packageParts[packageParts.length-1];\r
62         \r
63                 \r
64                 ontShort = name.substring(0, 3).toUpperCase();\r
65                 ontShort +=".";\r
66                 String parserPackagePostfix = "_elem";\r
67                 String importerClassPostfix = "Importer";\r
68                 String parserClassPostfix = "Parser";\r
69                 elementPackageName = name+parserPackagePostfix;\r
70                 \r
71                 importParserDir= new File(converter.getParserDir().getAbsolutePath()+"/"+elementPackageName);\r
72                 if (!importParserDir.exists())\r
73                         importParserDir.mkdirs();\r
74                 \r
75                 handle(schema);\r
76                 // Create Importer class\r
77                 File importerFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+importerClassPostfix+".java");\r
78                 PrintWriter mainWriter = createFile(importerFile);\r
79                 mainWriter.println("package " + converter.getPluginName() +";");\r
80                 mainWriter.println();\r
81                 mainWriter.println("import java.io.File;");\r
82                 mainWriter.println("import org.simantics.db.Session;");\r
83                 mainWriter.println("import org.simantics.xml.sax.base.AbstractImporter;");\r
84                 mainWriter.println();\r
85                 mainWriter.println("public class " + name + importerClassPostfix+" extends AbstractImporter {");\r
86                 mainWriter.println();\r
87                 mainWriter.println("   public " + name + importerClassPostfix+"(Session session, File file)  {");\r
88                 mainWriter.println("      super(session, file, new "+name + parserClassPostfix+"());");\r
89                 mainWriter.println("   }");\r
90                 mainWriter.println();\r
91 //              mainWriter.println("   @Override");\r
92 //              mainWriter.println("   public void configure(XMLParser parser) {");\r
93 //              for (String s : ruleClassNames) {\r
94 //              mainWriter.println("      parser.add(new "+s+"());");\r
95 //              }\r
96 //              mainWriter.println("   }");\r
97                 mainWriter.println("}");\r
98                 \r
99                 mainWriter.println();\r
100                 mainWriter.flush();\r
101                 mainWriter.close();\r
102                 \r
103                 // Create Parser class\r
104                 File parserFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+parserClassPostfix+".java");\r
105                 mainWriter = createFile(parserFile);\r
106                 mainWriter.println("package " + converter.getPluginName() +";");\r
107                 mainWriter.println();\r
108                 mainWriter.println("import org.simantics.xml.sax.base.XMLParser;");\r
109                 mainWriter.println();\r
110                 mainWriter.println("public class " + name + parserClassPostfix+" extends XMLParser {");\r
111                 mainWriter.println();\r
112                 mainWriter.println("   public " + name + parserClassPostfix+"()  {");\r
113                 if (schema.getTargetNamespace() != null)\r
114                 mainWriter.println("      setSchemaURI(\""+schema.getTargetNamespace()+"\");");\r
115                 for (String s : ruleClassNames) {\r
116                 mainWriter.println("      add(new "+s+"());");\r
117                 }\r
118                 mainWriter.println("   }");\r
119                 mainWriter.println("}");\r
120                 \r
121                 mainWriter.println();\r
122                 mainWriter.flush();\r
123                 mainWriter.close();\r
124         }\r
125         \r
126         protected PrintWriter createFile(File file) throws IOException {\r
127                 if (!file.exists())\r
128                         file.createNewFile();\r
129                 PrintWriter writer = new PrintWriter(file);\r
130                 for (String s : converter.getHeader()) {\r
131                         writer.println(commentTag + " " + s);   \r
132                 }\r
133                 writer.println();\r
134                 return writer;\r
135         }\r
136         \r
137 //      protected String getValueGetter(String binding,String name) {\r
138 //              if (binding == null)\r
139 //                      return name+".getValue()";\r
140 //              if ("STRING".equals(binding))\r
141 //                      return name+".getValue()";\r
142 //              if ("BOOLEAN".equals(binding))\r
143 //                      return "Boolean.parseBoolean("+name+".getValue())";\r
144 //              if ("INTEGER".equals(binding))\r
145 //                      return "Integer.parseInt("+name+".getValue())";\r
146 //              if ("DOUBLE".equals(binding))\r
147 //                      return "Double.parseDouble("+name+".getValue())";\r
148 //              if ("FLOAT".equals(binding))\r
149 //                      return "Float.parseFloat("+name+".getValue())";\r
150 //              return name+".getValue()";\r
151 //      }\r
152 //      protected String getValueGetter(String binding) {\r
153 //              if (binding == null)\r
154 //                      return "value";\r
155 //              if ("STRING".equals(binding))\r
156 //                      return "value";\r
157 //              if ("BOOLEAN".equals(binding))\r
158 //                      return "Boolean.parseBoolean(value)";\r
159 //              if ("INTEGER".equals(binding))\r
160 //                      return "Integer.parseInt(value)";\r
161 //              if ("DOUBLE".equals(binding))\r
162 //                      return "Double.parseDouble(value)";\r
163 //              if ("FLOAT".equals(binding))\r
164 //                      return "Float.parseFloat(value)";\r
165 //              return "value";\r
166 //      }\r
167         protected String getValueGetterMethod(TypeEntry binding,String name) {\r
168                 if (binding == null)\r
169                         return name+".getValue()";\r
170                 return binding.getValueGetterMethod(name);\r
171         }\r
172         \r
173         protected String getValueGetter(TypeEntry binding,String name) {\r
174                 if (binding == null)\r
175                         return name;\r
176                 return binding.getValueGetter(name);\r
177         }\r
178         protected String getValueGetter(TypeEntry binding) {\r
179                 if (binding == null)\r
180                         return "value";\r
181                 return binding.getValueGetter();\r
182         }\r
183         \r
184         protected void handle(TopLevelAttribute topLevelAttribute) {\r
185 \r
186         }\r
187         \r
188 \r
189         \r
190         public static String getComplexTypePrefix() {\r
191                 return "ComplexTypes_";\r
192         }       \r
193         \r
194         public static String getAttributeGroupPrefix() {\r
195                 return "AttributeGroups_";\r
196         }\r
197         \r
198         private Map<SchemaObject, FileWriter> writers = new HashMap<SchemaObject, ImporterGenerator.FileWriter>();\r
199         @Override\r
200         protected void handleComplexType(SchemaObject complexTypeObj) {\r
201                 ComplexType topLevelComplexType = complexTypeObj.getComplexType();\r
202                 \r
203                 String name = getName(complexTypeObj);//topLevelComplexType.getName();\r
204                 \r
205                 String className = name;//"_"+name;\r
206                 \r
207                 FileWriter fw = new FileWriter();\r
208                 try {\r
209                         fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));\r
210                 } catch (IOException e) {\r
211                         throw new RuntimeException(e);\r
212                 }\r
213                 writers.put(complexTypeObj, fw);\r
214                 \r
215                 boolean isList = false;\r
216 \r
217                 String baseClass = "org.simantics.xml.sax.base.XMLElementNamedChildParserBase";\r
218                 \r
219                 boolean inherited = false;\r
220                 \r
221                 QName type = getComplexTypeBase(topLevelComplexType);\r
222                 if (type != null && !type.getNamespaceURI().equals("http://www.w3.org/2001/XMLSchema")) {\r
223                         baseClass = getName(complexTypeName.get(type.getLocalPart()));\r
224                         inherited = true;\r
225                 }\r
226                 \r
227                 provider = getIDProvider(topLevelComplexType);\r
228                 List<IDReference> references = getIDReferences(topLevelComplexType);\r
229                 UnrecognizedChildElement unknownChildElement = getUnknown(topLevelComplexType);\r
230 \r
231                 List<String> intrerfaces = new ArrayList<String>();\r
232                 if (references.size() > 0)\r
233                         intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser");\r
234                 if (unknownChildElement != null)\r
235                         intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser");\r
236                 \r
237                 createClassHeader(fw.writer, isList);\r
238                 writeClass(fw.writer,false, null, className, baseClass, intrerfaces);\r
239                         \r
240                 writeIDProvider(fw.writer);\r
241         \r
242                 fw.writer.println("   @Override");\r
243                 fw.writer.println("   public Resource create(WriteGraph graph, Element element) throws DatabaseException{");\r
244                 fw.writer.println("      Layer0 L0 = Layer0.getInstance(graph);");\r
245                 fw.writer.println("      "+getOntologyImport());\r
246                 if (!isList) {\r
247                 fw.writer.println("      Resource res = graph.newResource();");\r
248                 fw.writer.println("      graph.claim(res, L0.InstanceOf, "+ontShort+name+");");\r
249                 } else {\r
250                 fw.writer.println("      Resource res = ListUtils.create(graph, "+ontShort+name+", Collections.EMPTY_LIST);");\r
251                 }\r
252                 fw.writer.println("      return res;");\r
253                 fw.writer.println("   }");\r
254                 fw.writer.println();\r
255                 \r
256                 fw.writer.println("   @Override");\r
257                 fw.writer.println("   public boolean connectParent(WriteGraph graph, Element parent, Element element) throws DatabaseException{");\r
258                 fw.writer.println("      "+getOntologyImport());\r
259                 fw.writer.println("      graph.claim(parent.getData(), "+this.ontShort+getName(complexTypeObj,"has")+", element.getData());");\r
260                 fw.writer.println("      return true;");\r
261                 fw.writer.println("   }");\r
262                 fw.writer.println();\r
263                                 \r
264                 StringWriter stringWriter = new StringWriter();\r
265                 fw.delayedWriter = new PrintWriter(stringWriter);\r
266                 StringWriter stringWriter2 = new StringWriter();\r
267                 fw.delayedWriter2 = new PrintWriter(stringWriter2);\r
268                 \r
269                 fw.writer.println("   public " + className + "() {");\r
270                 fw.writer.println("      super();");\r
271                 \r
272                 handleComplexTypeExtension(complexTypeObj);\r
273                 \r
274                 fw.writer.println("   }");\r
275                 \r
276                 fw.writer.println("   @Override");\r
277                 fw.writer.println("   public boolean connectChild(WriteGraph graph, Element element, Element child) throws DatabaseException{");\r
278                 fw.writer.println("      "+getOntologyImport());\r
279                 \r
280                 if (stringWriter.getBuffer().length() > 0) {\r
281                         fw.writer.write(stringWriter.toString());\r
282                 }\r
283                 \r
284                 \r
285                 fw.writer.println("      return false;");\r
286                 fw.writer.println("   }");\r
287                 fw.writer.println();\r
288                 \r
289                 if (stringWriter2.getBuffer().length() > 0) {\r
290                         fw.writer.write(stringWriter2.toString());\r
291                 }\r
292                 \r
293                 stringWriter = null;\r
294                 fw.delayedWriter.close();\r
295                 fw.delayedWriter=null;\r
296                 stringWriter2 = null;\r
297                 fw.delayedWriter2.close();\r
298                 fw.delayedWriter2 = null;\r
299                 \r
300                 fw.writer.println("   @Override");\r
301                 fw.writer.println("   public void configure(WriteGraph graph, Deque<Element> parents, Element element) throws DatabaseException {");\r
302                 if (inherited) {\r
303                 fw.writer.println("             super.configure(graph,parents,element);");\r
304                 }\r
305                 fw.writer.println("        "+getOntologyImport());\r
306                 \r
307                 handleComplexTypeAttributes(complexTypeObj);\r
308                 handleExtensionAttributes(complexTypeObj);\r
309                 \r
310                 fw.writer.println("   }");\r
311                 \r
312                 writeIDReferences(fw.writer,name, references);\r
313                 writeUnknownChild(fw.writer,name,unknownChildElement);\r
314                 \r
315                 fw.writer.println("}");\r
316                 fw.writer.println();\r
317                 fw.writer.flush();\r
318                 fw.writer.close();\r
319                 fw.writer = null;\r
320                 writers.remove(complexTypeObj);\r
321                 provider = null;\r
322         }\r
323         \r
324         @Override\r
325         protected void handle(SchemaObject parent, SchemaElement indicator, List<SchemaElement> elements) {\r
326                 if (indicator.getType() == SchemaElement.ElementType.SEQUENCE || (indicator.getType() == SchemaElement.ElementType.CHOICE && indicator.getRestriction().many())) {\r
327                         for (SchemaElement e : elements) {\r
328                                 handle(parent, indicator, e);\r
329                         }\r
330                 } else if (indicator.getType() == SchemaElement.ElementType.CHOICE) {\r
331                         String name = getChoiceName(elements);\r
332 \r
333                         for (SchemaElement e : elements) {\r
334                                 Element localElement = e.getElement();\r
335                                 if (localElement.getName() != null) {\r
336                                         QName refType = localElement.getType();\r
337                                         if (refType != null)\r
338                                                 handleIndicator(parent, indicator, e, false, name, refType);\r
339                                 } else if (localElement.getRef() != null) {\r
340                                         QName refType = localElement.getRef();\r
341                                         handleIndicator(parent, indicator, e, true, name, refType);\r
342                                 }\r
343                         }\r
344                 }\r
345                 \r
346         }\r
347         \r
348         @Override\r
349         protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element,  boolean reference, String ref, QName refType) {\r
350                 FileWriter fw = getWriter(parent);\r
351                 String binding = getBindingFromPrimitiveType(refType);\r
352                 if (binding == null) {\r
353                         SchemaObject refElement = elementName.get(refType.getLocalPart());\r
354                         SchemaObject refComplexType = complexTypeName.get(refType.getLocalPart());\r
355 //                      String className = refType.getLocalPart();\r
356 //                      if (!isElementRef(refType.getLocalPart())) { \r
357 //                              className = "_"+className;\r
358 //                      }\r
359 //                      \r
360 //                      String refClassName = refType.getLocalPart();\r
361 //                      if (isComplexTypeRef(refClassName)) {\r
362 //                              refClassName = "_"+refClassName;\r
363 //                      }\r
364                         String className = null;\r
365                         String refClassName = null;\r
366                         if (refElement != null)\r
367                                 className = getName(refElement);\r
368                         else\r
369                                 className = getName(refComplexType);\r
370                         \r
371                         if (refComplexType != null) {\r
372                                 refClassName = getName(refComplexType);\r
373                         } else {\r
374                                 refClassName = getName(refElement);\r
375                         }\r
376                         \r
377                         if (!reference)\r
378                         fw.writer.println("        addParser(\""+ ref +"\", "+className+".class);");\r
379                         else\r
380                         fw.writer.println("        addParser("+className+".class);");\r
381                         if (!className.equals(refClassName))\r
382                         fw.writer.println("        addParser("+refClassName+".class);");\r
383                         \r
384                         fw.delayedWriter.println("         if (child.getElementParser() instanceof "+refClassName+"){");\r
385                         fw.delayedWriter.println("            graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+ref + ", child.getData());");\r
386                         if (useElementList(parent, indicator,element, reference, ref, refType)) {\r
387         \r
388                         // element type specific list\r
389                         fw.delayedWriter.println("            {");\r
390                         fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+ref + "List);");\r
391                         fw.delayedWriter.println("               if (list == null) {");\r
392                         fw.delayedWriter.println("                  list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");\r
393                         fw.delayedWriter.println("                  graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+ref + "List,list);");\r
394                         fw.delayedWriter.println("               } else {");\r
395                         fw.delayedWriter.println("                  org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");\r
396                         fw.delayedWriter.println("               }");\r
397                         fw.delayedWriter.println("            }");\r
398                         }\r
399                         if (useOriginalList(parent, indicator,element, reference, ref, refType)) {\r
400                         // generic list\r
401                         fw.delayedWriter.println("            {");\r
402                         //fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(),"+ontShort+"XML_hasOriginalElementList);");\r
403                         fw.delayedWriter.println("               XMLResource XML = XMLResource.getInstance(graph);");\r
404                         fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");\r
405                         fw.delayedWriter.println("               if (list == null) {");\r
406                         fw.delayedWriter.println("                  list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");\r
407                         //fw.delayedWriter.println("                  graph.claim(element.getData(),"+ontShort+"XML_hasOriginalElementList,list);");\r
408                         fw.delayedWriter.println("                  graph.claim(element.getData(), XML.hasOriginalElementList,list);");\r
409                         fw.delayedWriter.println("               } else {");\r
410                         fw.delayedWriter.println("                  org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");\r
411                         fw.delayedWriter.println("               }");\r
412                         fw.delayedWriter.println("            }");\r
413                         }\r
414                         \r
415                         fw.delayedWriter.println("            return true;");\r
416                         fw.delayedWriter.println("         }");\r
417                 } else {\r
418                         //writer.println(commentTag+ontShort+"."+parent+".has"+ref + " <R " +  ontShort+".hasElement");\r
419                         fw.writer.println("        addParser(\""+ ref +"\", "+getName(parent) +"_" +ref+".class);");\r
420                         \r
421                         fw.delayedWriter2.println("   public static class " + getName(parent) +"_" +ref+" extends org.simantics.xml.sax.base.ValueElementParser {");\r
422                         fw.delayedWriter2.println("      public "+ getName(parent) +"_" +ref +"(){");\r
423                         fw.delayedWriter2.println("           super(\""+ref+"\"," +this.ontologyClassName+".URIs."+getName(parent) + "_has"+ref+", "+binding+");");\r
424                         fw.delayedWriter2.println("       }");\r
425                         fw.delayedWriter2.println("   }");\r
426                 }\r
427         }\r
428         \r
429         @Override\r
430         protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element,  boolean reference, String ref, OpenAttrs attrs) {\r
431                 FileWriter fw = getWriter(parent);\r
432                 SchemaObject obj = getWithObj(parent, attrs);\r
433         \r
434 //              String className = refType.getLocalPart();\r
435 //              if (!isElementRef(refType.getLocalPart())) { \r
436 //                      className = "_"+className;\r
437 //              }\r
438 //              \r
439 //              String refClassName = refType.getLocalPart();\r
440 //              if (isComplexTypeRef(refClassName)) {\r
441 //                      refClassName = "_"+refClassName;\r
442 //              }\r
443                 String className = getName(obj);\r
444                 \r
445                 \r
446                 if (!reference)\r
447                 fw.writer.println("        addParser(\""+ ref +"\", "+className+".class);");\r
448                 else\r
449                 fw.writer.println("        addParser("+className+".class);");\r
450                 \r
451                 fw.delayedWriter.println("         if (child.getElementParser() instanceof "+className+"){");\r
452                 fw.delayedWriter.println("            graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+ref + ", child.getData());");\r
453                 if (useElementList(parent, indicator,element, reference, ref, new QName(obj.getName()))) {\r
454 \r
455                 // element type specific list\r
456                 fw.delayedWriter.println("            {");\r
457                 fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+ref + "List);");\r
458                 fw.delayedWriter.println("               if (list == null) {");\r
459                 fw.delayedWriter.println("                  list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");\r
460                 fw.delayedWriter.println("                  graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+ref + "List,list);");\r
461                 fw.delayedWriter.println("               } else {");\r
462                 fw.delayedWriter.println("                  org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");\r
463                 fw.delayedWriter.println("               }");\r
464                 fw.delayedWriter.println("            }");\r
465                 }\r
466                 if (useOriginalList(parent, indicator,element, reference, ref, new QName(obj.getName()))) {\r
467                 // generic list\r
468                 fw.delayedWriter.println("            {");\r
469                 //fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(),"+ontShort+"XML_hasOriginalElementList);");\r
470                 fw.delayedWriter.println("               XMLResource XML = XMLResource.getInstance(graph);");\r
471                 fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");\r
472                 fw.delayedWriter.println("               if (list == null) {");\r
473                 fw.delayedWriter.println("                  list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");\r
474                 //fw.delayedWriter.println("                  graph.claim(element.getData(),"+ontShort+"XML_hasOriginalElementList,list);");\r
475                 fw.delayedWriter.println("                  graph.claim(element.getData(), XML.hasOriginalElementList,list);");\r
476                 fw.delayedWriter.println("               } else {");\r
477                 fw.delayedWriter.println("                  org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");\r
478                 fw.delayedWriter.println("               }");\r
479                 fw.delayedWriter.println("            }");\r
480                 }\r
481                 \r
482                 fw.delayedWriter.println("            return true;");\r
483                 fw.delayedWriter.println("         }");\r
484                 \r
485         }\r
486         \r
487         @Override\r
488         protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) {               \r
489                 FileWriter fw = getWriter(parent);\r
490                 fw.delayedWriter2.println("   @Override");\r
491                 fw.delayedWriter2.println("   public Class<? extends org.simantics.xml.sax.base.XMLElementParser> getParser(java.util.Map<java.lang.String,org.simantics.xml.sax.base.XMLElementParser> parsers, Element element, Element child) {");\r
492                 fw.delayedWriter2.println("      Class<? extends org.simantics.xml.sax.base.XMLElementParser> parserClass = super.getParser(parsers, element, child);");\r
493                 fw.delayedWriter2.println("      if (parserClass != null) return parserClass;");\r
494                 fw.delayedWriter2.println("      org.simantics.xml.sax.base.XMLElementParser parser = parsers.get(child.getQName());");\r
495                 fw.delayedWriter2.println("      if (parser != null) return parser.getClass();");\r
496                 fw.delayedWriter2.println("      return null;");\r
497                 fw.delayedWriter2.println("   }");\r
498         }\r
499         \r
500         private FileWriter getWriter(SchemaObject obj) {\r
501                 SchemaObject s = obj;\r
502                 while (s != null) {\r
503                         FileWriter fw = writers.get(s);\r
504                         if (fw != null)\r
505                                 return fw;\r
506                         s = s.getParent();\r
507                 }\r
508                 return null;\r
509         }\r
510         \r
511         \r
512         @Override       \r
513         protected void handle(SchemaObject parent, Attribute attribute) {\r
514                 String name = attribute.getName();\r
515                 QName primitiveType = attribute.getType();\r
516                 SimpleType simpleType = attribute.getSimpleType();\r
517                 QName ref = attribute.getRef();\r
518                 \r
519                 String relationName;\r
520                 String attrName;\r
521                 if (name != null) {\r
522                         attrName = name;\r
523                         relationName = ontShort+"has"+name;\r
524                         if (parent != null)\r
525                                 relationName = ontShort+getName(parent)+"_has"+name;\r
526                 }\r
527                 else if (ref != null && parent != null) {\r
528                         attrName = ref.getLocalPart();\r
529                         relationName = ontShort+getName(parent)+"_has"+ref.getLocalPart();\r
530                         \r
531                         Attribute referred = getRefAttribute(ref);\r
532                         if (referred != null) {\r
533                                 primitiveType = referred.getType();\r
534                                 simpleType = referred.getSimpleType();\r
535                         }\r
536                         \r
537                 } else {\r
538                         throw new RuntimeException();\r
539                 }\r
540                 boolean isReference = false;\r
541                 if (provider!= null && provider.getAttribute().getName().equals(attrName))\r
542                         isReference = true;\r
543                 \r
544                 FileWriter fw = getWriter(parent);\r
545                 if (primitiveType != null) {\r
546                         \r
547                         //String binding = getBindingFromPrimitiveType(primitiveType);\r
548                         TypeEntry binding = getTypeEntry(primitiveType);\r
549                         \r
550                         if (binding != null) {\r
551                                 writeAttribute(fw, attrName, relationName, binding, isReference);\r
552                                 return;\r
553                     } else {\r
554                         if (simpleType == null) {\r
555                                 SchemaObject simpleTypeObj = simpleTypeName.get(primitiveType.getLocalPart());\r
556                                 if (simpleTypeObj != null)\r
557                                         simpleType = simpleTypeObj.getSimpleType();\r
558                         }       \r
559                     }\r
560                 } \r
561                 if (simpleType != null) {\r
562                         org.w3._2001.xmlschema.List list = simpleType.getList();\r
563                         if (list != null) {\r
564                                 TypeEntry binding = getTypeEntry(new QName(SCHEMA_NS, "string"));\r
565                                 writeAttribute(fw, attrName, relationName, binding, isReference);\r
566                         } else {\r
567                                 Restriction restriction = simpleType.getRestriction();\r
568                                 if (restriction == null)\r
569                                         throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart()+ ", SimpleType restriction is unset");\r
570                                 QName base = restriction.getBase();\r
571                                 \r
572                                 \r
573                                 //String binding = getBindingFromPrimitiveType(base);\r
574                                 TypeEntry binding = getTypeEntry(base);\r
575                                 writeAttribute(fw, attrName, relationName, binding, isReference);\r
576                         }\r
577                 } else {\r
578                         // TODO : using default String attribute should be configured with rules.\r
579                         //throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart());\r
580                         fw.writer.println("    //FIXME: Cannot resolve type for Attribute " + attrName + " Using default type String");\r
581                         //writeAttribute(fw, attrName, relationName, "STRING", isReference);\r
582                         writeAttribute(fw, attrName, relationName, getTypeEntry("string"), isReference);\r
583                 }\r
584         }\r
585         \r
586         //private void writeAttribute(FileWriter fw, String attrName, String relationName, String binding, boolean isReference) {\r
587         private void writeAttribute(FileWriter fw, String attrName, String relationName, TypeEntry binding, boolean isReference) {\r
588                 fw.writer.println("      {");\r
589                 fw.writer.println("         Attribute a = element.getAttribute(\"" +attrName+"\");");\r
590                 fw.writer.println("         if (a != null) {");\r
591                 fw.writer.println("            graph.claimLiteral(element.getData(),"+relationName+","+getValueGetterMethod(binding,"a")+", "+binding.binding+");");\r
592                 if (isReference)\r
593                 fw.writer.println("            idProviderValue = a.getValue();");       \r
594                 fw.writer.println("         }");\r
595                 fw.writer.println("      }");\r
596         }\r
597         \r
598         @Override\r
599         protected void handleAttributes(SchemaObject simpleTypeObj) {\r
600                 SchemaObject parent = simpleTypeObj.getParent();\r
601                 FileWriter fw = getWriter(parent);\r
602                 \r
603                 SimpleType simpleType = simpleTypeObj.getSimpleType();\r
604                 Restriction restriction = simpleType.getRestriction();\r
605                 if (restriction == null)\r
606                         throw new RuntimeException("Cannot resolve type for Element " + getName(parent));\r
607                 QName base = restriction.getBase();\r
608                 \r
609                 \r
610                 //String binding = getBindingFromPrimitiveType(base);\r
611                 TypeEntry binding = getTypeEntry(base);\r
612                 fw.writer.println("   @Override");\r
613                 fw.writer.println("   public void configure(WriteGraph graph, Element element, java.lang.String value) throws DatabaseException {");\r
614                 //fw.writer.println("      graph.claimValue(element.getData(),"+getValueGetter(binding)+", Bindings."+binding+");");\r
615                 fw.writer.println("      graph.claimValue(element.getData(),"+getValueGetter(binding)+", "+binding.binding +");");\r
616                 fw.writer.println("   }");\r
617                 \r
618         }\r
619         \r
620         @Override\r
621         protected void handle(SchemaObject parent, AttributeGroup attribute) {\r
622                 if (parent != null) {\r
623                         FileWriter fw = getWriter(parent);\r
624                         NamedAttributeGroup group = getAttributeGroup(attribute.getRef().getLocalPart());\r
625                         fw.writer.println(commentTag+"    AttributeGroup " + group.getName());\r
626                         SchemaObject obj = new SchemaObject(parent,attribute);\r
627                         for (Annotated annotated : group.getAttributeOrAttributeGroup()) {\r
628                                 if (annotated instanceof Attribute) {\r
629                                         //handle("AttributeGroups_"+group.getName(),(Attribute)annotated);\r
630                                         handle(obj,(Attribute)annotated);\r
631                                 } else if (annotated instanceof AttributeGroup) {\r
632                                         //handle("AttributeGroups_"+group.getName(),(AttributeGroup)annotated);\r
633                                         handle(obj,(AttributeGroup)annotated);\r
634                                 }\r
635                         }\r
636                         fw.writer.println(commentTag+"    End of AttributeGroup " + group.getName());\r
637                 }\r
638                 \r
639         }\r
640         \r
641         @Override\r
642         protected void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes) {\r
643                 FileWriter fw = getWriter(parent);\r
644                 QName type = new QName(CONVERSION_NS, composition.getType());\r
645                 String arrayBinding = getBindingFromPrimitiveType(type);\r
646                 String javaType = getJavaTypeFromPrimitiveType(type);\r
647                 String name = composition.getName();\r
648                 \r
649                 String relationName;\r
650                 if (name != null) {\r
651                         relationName = ontShort+"has"+name;\r
652                         if (parent != null)\r
653                                 relationName = ontShort+getName(parent)+"_has"+name;\r
654                 } else {\r
655                         throw new RuntimeException();\r
656                 }\r
657                 \r
658                 fw.writer.println("      {");\r
659                 int i = 0;\r
660                 for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute())\r
661                 fw.writer.println("         Attribute a"+(i++)+" = element.getAttribute(\"" +a.getName()+"\");");\r
662                 fw.writer.print  ("         "+javaType + " value = new "+javaType+"{");\r
663                 i = 0;\r
664                 // FIXME : handle optional attributes properly.\r
665                 for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute()) {\r
666                         Attribute attribute = ((Attribute)attributes.getRight(a));\r
667                         //QName atype = getBaseType(attribute);\r
668                         QName atype = getPrimitiveType(attribute);\r
669                         String defaultValue = attribute.getDefault();\r
670                         if (defaultValue == null)\r
671                             defaultValue = getDefaultValue(atype);\r
672                                 \r
673                         //String binding = getBindingFromPrimitiveType(atype);\r
674                         TypeEntry binding = getTypeEntry(atype);\r
675                         if (i > 0)\r
676                                 fw.writer.print(",");\r
677                         if (defaultValue != null)\r
678                                 fw.writer.print("a"+(i)+"!= null ? "+ getValueGetterMethod(binding,"a"+(i++)) + " : " +defaultValue);\r
679                         else\r
680                                 fw.writer.print(getValueGetterMethod(binding,"a"+(i++)));\r
681                 }\r
682                 fw.writer.println("};");\r
683                 fw.writer.println("         graph.claimLiteral(element.getData(),"+relationName+", value, "+arrayBinding+");");\r
684                 fw.writer.println("      }");\r
685                 \r
686         }\r
687         \r
688         protected String getDefaultValue(QName atype) {\r
689                 Map<String,TypeEntry> types = typeMap.get(atype.getNamespaceURI());\r
690                 if (types == null)\r
691                         return null;\r
692                 TypeEntry entry =  types.get(atype.getLocalPart());\r
693                 if (entry == null)\r
694                         return null;\r
695                 return entry.defaultValue;\r
696         }\r
697         \r
698         \r
699         @Override\r
700         protected void handleSimpleType(SchemaObject parent, SchemaObject simpleType) {\r
701 \r
702         }\r
703         \r
704         \r
705         \r
706         IDProvider provider;\r
707         @Override\r
708         protected void handleElement(SchemaObject elementObj)  {\r
709                 Element element = elementObj.getElement();\r
710                 \r
711                 String name = getName(elementObj);//topLevelElement.getName();\r
712                 String className = name;\r
713                 \r
714                 FileWriter fw = new FileWriter();\r
715                 try {\r
716                         fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));\r
717                 } catch (IOException e) {\r
718                         throw new RuntimeException(e);\r
719                 }\r
720                 writers.put(elementObj, fw);\r
721                 boolean isList = false;\r
722                 \r
723                 Inheritance inhertiance = getElementInheritance(elementObj);    \r
724                 \r
725                 provider = getIDProvider(element);\r
726                 List<IDReference> references = getIDReferences(element);\r
727                 UnrecognizedChildElement unknownChildElement = getUnknown(element);\r
728 \r
729                 List<String> intrerfaces = new ArrayList<String>();\r
730                 if (references.size() > 0)\r
731                         intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser");\r
732                 if (unknownChildElement != null)\r
733                         intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser");\r
734 \r
735                 createClassHeader(fw.writer, isList);\r
736                 writeClass(fw.writer,false, element.getName(), className, inhertiance.baseClass, intrerfaces);\r
737                 writeIDProvider(fw.writer);\r
738                 fw.writer.println("   @Override");\r
739                 fw.writer.println("   public Resource create(WriteGraph graph, Element element) throws DatabaseException{");\r
740                 fw.writer.println("      Layer0 L0 = Layer0.getInstance(graph);");\r
741                 fw.writer.println("      "+getOntologyImport());\r
742                 if (!isList) {\r
743                 fw.writer.println("      Resource res = graph.newResource();");\r
744                 fw.writer.println("      graph.claim(res, L0.InstanceOf, "+ontShort+name+");");\r
745                 } else {\r
746                 fw.writer.println("      Resource res = ListUtils.create(graph, "+ontShort+name+", Collections.EMPTY_LIST);");\r
747                 }\r
748                 fw.writer.println("      return res;");\r
749                 fw.writer.println("   }");\r
750                 fw.writer.println();\r
751                 \r
752                 fw.writer.println("   @Override");\r
753                 fw.writer.println("   public boolean connectParent(WriteGraph graph, Element parent, Element element) throws DatabaseException{");\r
754                 fw.writer.println("      "+getOntologyImport());\r
755                 fw.writer.println("      graph.claim(parent.getData(), "+this.ontShort+getName(elementObj,"has")+", element.getData());");\r
756                 fw.writer.println("      return true;");\r
757                 fw.writer.println("   }");\r
758                 fw.writer.println();\r
759                 \r
760                 fw.writer.println("   @Override");\r
761                 fw.writer.println("   public void configure(WriteGraph graph, Deque<Element> parents, Element element) throws DatabaseException {");\r
762                 if (inhertiance.type == InheritanceType.ComplexType) {\r
763                 fw.writer.println("             super.configure(graph,parents,element);");\r
764                 }\r
765                 fw.writer.println("        "+getOntologyImport());\r
766                 \r
767                 LocalComplexType complexType = element.getComplexType();\r
768                 LocalSimpleType simpleType = element.getSimpleType();\r
769                 \r
770                 if (complexType != null) {\r
771                         SchemaObject obj = complexTypes.get(complexType);\r
772                         handleElementComplexTypeAttributes(obj);\r
773                 } \r
774                 fw.writer.println("   }");\r
775                 \r
776                 if (inhertiance.type == InheritanceType.AtomicType) {\r
777                 fw.writer.println();\r
778                 fw.writer.println("   @Override");\r
779                 fw.writer.println("   public void configure(WriteGraph graph, Element element, java.lang.String string) throws DatabaseException {");\r
780                 fw.writer.println("      graph.claimValue(element.getData(), "+getValueGetter(inhertiance.atomicType,"string")+", "+inhertiance.atomicType.binding+");");\r
781                 fw.writer.println("   }");\r
782                 }\r
783                 if (simpleType != null) {\r
784                         SchemaObject obj = simpleTypes.get(simpleType);\r
785                         handleElementSimpleTypeAttributes(obj);\r
786                 }\r
787                 \r
788                 \r
789                 StringWriter stringWriter = new StringWriter();\r
790                 fw.delayedWriter = new PrintWriter(stringWriter);\r
791                 StringWriter stringWriter2 = new StringWriter();\r
792                 fw.delayedWriter2 = new PrintWriter(stringWriter2);\r
793                 \r
794                 fw.writer.println("   public " + className + "() {");\r
795                 fw.writer.println("      super();");\r
796                 \r
797                 if (complexType != null) {\r
798                         SchemaObject obj = complexTypes.get(complexType);\r
799                         handleComplexTypeExtension(obj);\r
800                 } else if (simpleType != null) {\r
801                         \r
802                 }\r
803                 \r
804                 fw.writer.println("   }");\r
805                 \r
806                 fw.writer.println("   @Override");\r
807                 fw.writer.println("   public boolean connectChild(WriteGraph graph, Element element, Element child) throws DatabaseException{");\r
808                 fw.writer.println("      "+getOntologyImport());\r
809                 \r
810                 if (stringWriter.getBuffer().length() > 0) {\r
811                         fw.writer.write(stringWriter.toString());\r
812                 }\r
813                 if (inhertiance.type == InheritanceType.ComplexType) {\r
814                 fw.writer.println("      return super.connectChild(graph,element,child);");     \r
815                 } else {\r
816                 fw.writer.println("      return false;");\r
817                 }\r
818                 fw.writer.println("   }");\r
819                 fw.writer.println();\r
820                 \r
821                 if (stringWriter2.getBuffer().length() > 0) {\r
822                         fw.writer.write(stringWriter2.toString());\r
823                 }\r
824                 \r
825                 stringWriter = null;\r
826                 fw.delayedWriter.close();\r
827                 fw.delayedWriter = null;\r
828                 stringWriter2 = null;\r
829                 fw.delayedWriter2.close();\r
830                 fw.delayedWriter2 = null;\r
831                 \r
832                 writeIDReferences(fw.writer,name, references);\r
833                 writeUnknownChild(fw.writer,name,unknownChildElement);\r
834 \r
835                 fw.writer.println("}");\r
836                 fw.writer.println();\r
837                 fw.writer.flush();\r
838                 fw.writer.close();\r
839                 fw.writer = null;\r
840                 writers.remove(elementObj);\r
841                 provider = null;\r
842                 \r
843                 ruleClassNames.add(converter.getPluginName()+"."+elementPackageName+"."+name);\r
844         }\r
845         \r
846         private enum InheritanceType{ComplexType,AtomicType,None};\r
847         \r
848         private class Inheritance {\r
849                 public String baseClass;\r
850                 public InheritanceType type;\r
851                 public TypeEntry atomicType;\r
852                 \r
853                 public Inheritance() {\r
854                         baseClass = "org.simantics.xml.sax.base.XMLElementNamedChildParserBase";\r
855                         type = InheritanceType.None;\r
856                 }\r
857         }\r
858         \r
859         private Inheritance getElementInheritance(SchemaObject topLevelElementObj) {\r
860                 Element topLevelElement = topLevelElementObj.getElement();\r
861                 Inheritance inheritance = new Inheritance();\r
862                 if (topLevelElement.getType() != null) {\r
863                         QName type = topLevelElement.getType();\r
864                         if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
865                                 SchemaObject obj = complexTypeName.get(type.getLocalPart());\r
866 //                              if (obj == null)\r
867 //                                      obj = simpleTypeName.get(type.getLocalPart());\r
868                                 if (obj != null) {\r
869                                         inheritance.baseClass = getName(obj);\r
870                                         inheritance.type = InheritanceType.ComplexType;\r
871                                 }\r
872                         } else {\r
873                                 TypeEntry entry = getTypeEntry(type);\r
874                                 if (entry != null) {\r
875                                         inheritance.type = InheritanceType.AtomicType;\r
876                                         inheritance.atomicType = entry;\r
877                                 }\r
878                         }\r
879                 }\r
880                 if (inheritance.type == InheritanceType.None) {\r
881                         QName type = getElementBase(topLevelElement);\r
882                         if (type != null) {\r
883                                 if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
884                                         SchemaObject obj = getWithName(topLevelElementObj, type.getLocalPart());\r
885                                         inheritance.baseClass = getName(obj);\r
886                                         inheritance.type = InheritanceType.ComplexType;\r
887                                 } else {\r
888                                         TypeEntry entry = getTypeEntry(type);\r
889                                         if (entry != null) {\r
890                                                 inheritance.type = InheritanceType.AtomicType;\r
891                                                 inheritance.atomicType = entry;\r
892                                         }\r
893                                 }\r
894                         }\r
895                 }\r
896                 if (inheritance.type == InheritanceType.None) {\r
897                         QName type = topLevelElement.getSubstitutionGroup();\r
898                         if (type != null) {\r
899                                 if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
900                                         SchemaObject obj = getWithName(topLevelElementObj, type.getLocalPart());\r
901                                         inheritance.baseClass = getName(obj);\r
902                                         inheritance.type = InheritanceType.ComplexType;\r
903                                 } else {\r
904                                         TypeEntry entry = getTypeEntry(type);\r
905                                         if (entry != null) {\r
906                                                 inheritance.type = InheritanceType.AtomicType;\r
907                                                 inheritance.atomicType = entry;\r
908                                         }\r
909                                 }\r
910                         }\r
911                 }\r
912                 \r
913                 return inheritance;\r
914         }\r
915         \r
916         private void writeClass(PrintWriter writer,boolean abst, String name, String className, String baseClass, List<String> interfaces) {\r
917                 writer.println("@SuppressWarnings(\"unused\")");\r
918                 writer.print("public " +(abst ? "abstract " : "") + "class " + className + " extends "+baseClass);\r
919                 if (interfaces.size() > 0) {\r
920                         writer.print(" implements ");\r
921                         for (int i = 0; i < interfaces.size(); i++) {\r
922                                 writer.print(interfaces.get(i));\r
923                                 if (i < interfaces.size() -1 )\r
924                                         writer.print(",");\r
925                         }\r
926                 }\r
927                 writer.println("{");\r
928                 writer.println();\r
929                 writer.println("   @Override");\r
930                 writer.println("   public java.lang.String getElementId() {");\r
931                 if (name != null)\r
932                 writer.println("      return \""+name+"\";");\r
933                 else // complex types cannot be parsed directly with name/id reference.\r
934                 writer.println("      return null;");\r
935                 writer.println("   }");\r
936                 writer.println();\r
937         }\r
938         \r
939         private void writeIDProvider(PrintWriter writer) {\r
940                 if (provider != null) {\r
941                 writer.println("   java.lang.String idProviderValue = null;");\r
942                 writer.println();\r
943                 writer.println("   @Override");\r
944                 writer.println("   public java.lang.String getID() {");\r
945                 writer.println("        java.lang.String s = idProviderValue;");\r
946                 writer.println("        idProviderValue = null;");\r
947                 writer.println("        return s;");\r
948                 writer.println("   }");\r
949                 writer.println();\r
950                 if (provider.getPriority() != null) {\r
951                 writer.println("   @Override");\r
952                 writer.println("   public int idPriority() {");\r
953                 writer.println("        return " + provider.getPriority().intValue()+";");\r
954                 writer.println("   }"); \r
955                 }\r
956                 }\r
957         }\r
958         \r
959         private void writeIDReferences(PrintWriter writer,String name, List<IDReference> references) {\r
960                 if (references.size() > 0) {\r
961                 writer.println("   @Override");\r
962                 writer.println("   public boolean connectReferences(WriteGraph graph, Element element, java.util.Map<java.lang.String, Element> map) throws DatabaseException {");\r
963                 writer.println("      "+getOntologyImport());\r
964                 writer.println("      boolean result = true;");\r
965                 for (IDReference ref : references) {\r
966                 writer.println("      {");\r
967                 writer.println("         Attribute a = element.getAttribute(\"" + ref.getIDSource().getName() +"\");");\r
968                 writer.println("         if (a != null) {");\r
969                 writer.println("            Element refEle = map.get(a.value);");\r
970                 writer.println("            if (refEle != null) {");\r
971                 writer.println("               Resource ref = refEle.getData();");\r
972                 writer.println("               graph.claim(element.getData(), "+ontShort+name+"_"+ref.getReference().getName()+", ref);");\r
973                 writer.println("            } else {");\r
974                 writer.println("               result = false;");\r
975                 writer.println("            }");\r
976                 writer.println("         }");\r
977                 writer.println("      }");\r
978                 }\r
979                 writer.println("      return result;");\r
980                 writer.println("   }");\r
981                 writer.println();\r
982                 }\r
983         }\r
984         \r
985         private void writeUnknownChild(PrintWriter writer,String name, UnrecognizedChildElement unknownChildElement) {\r
986                 if (unknownChildElement == null)\r
987                         return;\r
988                 \r
989                 writer.println("   @Override");\r
990                 writer.println("   public void configureChild(WriteGraph graph, Deque<Element> parents, Element element, Element child) throws DatabaseException {");\r
991                 writer.println("    " + unknownChildElement.getJavaMethod());\r
992                 writer.println("   }");\r
993                 writer.println();\r
994                 \r
995         }\r
996         \r
997         protected void createClassHeader(PrintWriter writer, boolean isList) {\r
998                 writer.println("package " + converter.getPluginName() +"."+elementPackageName+";");\r
999                 writer.println();\r
1000                 writer.println("import java.util.Deque;");\r
1001                 writer.println("import org.simantics.databoard.Bindings;");\r
1002                 writer.println("import org.simantics.db.Resource;");\r
1003                 writer.println("import org.simantics.db.WriteGraph;");\r
1004                 writer.println("import org.simantics.db.exception.DatabaseException;");\r
1005                 writer.println("import org.simantics.xml.sax.base.Attribute;");\r
1006                 writer.println("import org.simantics.xml.sax.base.Element;");\r
1007                 writer.println("import org.simantics.xml.sax.ontology.XMLResource;");\r
1008                 if (!isList) {\r
1009                 writer.println("import org.simantics.layer0.Layer0;");\r
1010             } else {\r
1011             writer.println("import java.util.Collections;");\r
1012                 writer.println("import org.simantics.db.common.utils.ListUtils;");\r
1013                 }\r
1014                 writer.println();\r
1015         }\r
1016         \r
1017         private String getOntologyImport() {\r
1018                 return this.ontologyClassName+" " +ontShort.substring(0, 3)+" = "+this.ontologyClassName+".getInstance(graph);";\r
1019         }\r
1020         \r
1021         \r
1022         private static class FileWriter {\r
1023                 public PrintWriter writer;\r
1024                 \r
1025                 public PrintWriter delayedWriter;\r
1026                 public PrintWriter delayedWriter2;\r
1027         }\r
1028         \r
1029         public static String getName(SchemaObject obj) {\r
1030                 if (obj.getParent() == null) {\r
1031                         switch (obj.getType()) {\r
1032                         case COMPLEX_TYPE:\r
1033                                 return getComplexTypePrefix()+obj.getName();\r
1034                         case ELEMENT:\r
1035                                 return obj.getName();\r
1036                         case ATTRIBUTE_GROUP:\r
1037                                 return getAttributeGroupPrefix()+obj.getName();\r
1038                         case SIMPLE_TYPE:\r
1039                                 return obj.getName();\r
1040                         }\r
1041                 } else {\r
1042                         SchemaObject o = obj;\r
1043                         SchemaObject prev = null;\r
1044                         String name = "";\r
1045                         while (o != null){\r
1046                                 if (o.getName() != null)\r
1047                                         name = o.getName()+"_"+name;\r
1048                                 prev = o;\r
1049                                 o = o.getParent();\r
1050                                 if (prev.getObj() instanceof AttributeGroupRef)\r
1051                                         o = null;\r
1052                         }\r
1053                         name = name.substring(0, name.length()-1);\r
1054                         switch (prev.getType()) {\r
1055                         case COMPLEX_TYPE:\r
1056                                 return getComplexTypePrefix()+name;\r
1057                         case ELEMENT:\r
1058                                 return name;\r
1059                         case ATTRIBUTE_GROUP:\r
1060                                 return getAttributeGroupPrefix()+name;\r
1061                         case SIMPLE_TYPE:\r
1062                                 return name;\r
1063                         }\r
1064                 }\r
1065                 throw new RuntimeException();\r
1066                 \r
1067         }\r
1068         \r
1069         public static String getName(SchemaObject obj, String rel) {\r
1070                 if (obj.getParent() == null) {\r
1071                         switch (obj.getType()) {\r
1072                         case COMPLEX_TYPE:\r
1073                                 return getComplexTypePrefix()+rel+obj.getName();\r
1074                         case ELEMENT:\r
1075                                 return rel+obj.getName();\r
1076                         case ATTRIBUTE_GROUP:\r
1077                                 return getAttributeGroupPrefix()+rel+obj.getName();\r
1078                         case SIMPLE_TYPE:\r
1079                                 return rel+obj.getName();\r
1080                         }\r
1081                 } else {\r
1082                         SchemaObject o = obj;\r
1083                         SchemaObject prev = null;\r
1084                         String name = "";\r
1085                         while (o != null){\r
1086                                 if (o.getName() != null)\r
1087                                         name = o.getName()+"_"+name;\r
1088                                 prev = o;\r
1089                                 o = o.getParent();\r
1090                         }\r
1091                         name = name.substring(0, name.length()-1);\r
1092                         switch (prev.getType()) {\r
1093                         case COMPLEX_TYPE:\r
1094                                 return getComplexTypePrefix()+rel+name;\r
1095                         case ELEMENT:\r
1096                                 return rel+name;\r
1097                         case ATTRIBUTE_GROUP:\r
1098                                 return getAttributeGroupPrefix()+rel+name;\r
1099                         case SIMPLE_TYPE:\r
1100                                 return rel+name;\r
1101                         }\r
1102                 }\r
1103                 throw new RuntimeException();\r
1104                 \r
1105         }\r
1106 }\r