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