]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.xml.sax/src/org/simantics/xml/sax/ImporterGenerator.java
Handling ComplexTypes inheriting AtomicType
[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.List;\r
9 import java.util.Map;\r
10 \r
11 import javax.xml.namespace.QName;\r
12 \r
13 import org.simantics.utils.datastructures.BijectionMap;\r
14 import org.simantics.xml.sax.SchemaConversionBase.InheritanceType;\r
15 import org.simantics.xml.sax.SchemaConversionBase.RefType;\r
16 import org.simantics.xml.sax.SchemaObject.ObjectType;\r
17 import org.simantics.xml.sax.configuration.AttributeComposition;\r
18 import org.simantics.xml.sax.configuration.Configuration;\r
19 import org.simantics.xml.sax.configuration.IDProvider;\r
20 import org.simantics.xml.sax.configuration.IDReference;\r
21 import org.simantics.xml.sax.configuration.UnrecognizedChildElement;\r
22 import org.w3._2001.xmlschema.Annotated;\r
23 import org.w3._2001.xmlschema.Attribute;\r
24 import org.w3._2001.xmlschema.AttributeGroup;\r
25 import org.w3._2001.xmlschema.ComplexType;\r
26 import org.w3._2001.xmlschema.Element;\r
27 import org.w3._2001.xmlschema.LocalComplexType;\r
28 import org.w3._2001.xmlschema.LocalSimpleType;\r
29 import org.w3._2001.xmlschema.NamedAttributeGroup;\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 JavaGenerator{\r
36         \r
37         public ImporterGenerator(Configuration configuration) {\r
38                 super(configuration);\r
39         }\r
40         \r
41         public void createParser(Schema schema,String ontologyUri, String className, SchemaConverter converter) throws IOException {\r
42                 this.schema = schema;\r
43                 this.ontologyClassName = className;\r
44                 this.converter = converter;\r
45                 \r
46                 \r
47                 String packageParts[] = className.split("\\.");\r
48                 String name = packageParts[packageParts.length-1];\r
49         \r
50                 \r
51                 ontShort = name.substring(0, 3).toUpperCase();\r
52                 ontShort +=".";\r
53                 String parserPackagePostfix = "_elem";\r
54                 String importerClassPostfix = "Importer";\r
55                 String parserClassPostfix = "Parser";\r
56                 elementPackageName = name+parserPackagePostfix;\r
57                 \r
58                 importParserDir= new File(converter.getParserDir().getAbsolutePath()+"/"+elementPackageName);\r
59                 if (!importParserDir.exists())\r
60                         importParserDir.mkdirs();\r
61                 \r
62                 handle(schema);\r
63                 // Create Importer class\r
64                 File importerFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+importerClassPostfix+".java");\r
65                 PrintWriter mainWriter = createFile(importerFile);\r
66                 mainWriter.println("package " + converter.getPluginName() +";");\r
67                 mainWriter.println();\r
68                 mainWriter.println("import java.io.File;");\r
69                 mainWriter.println("import org.simantics.db.Session;");\r
70                 mainWriter.println("import org.simantics.xml.sax.base.AbstractImporter;");\r
71                 mainWriter.println();\r
72                 mainWriter.println("public class " + name + importerClassPostfix+" extends AbstractImporter {");\r
73                 mainWriter.println();\r
74                 mainWriter.println("   public " + name + importerClassPostfix+"(Session session, File file)  {");\r
75                 mainWriter.println("      super(session, file, new "+name + parserClassPostfix+"());");\r
76                 mainWriter.println("   }");\r
77                 mainWriter.println();\r
78                 mainWriter.println("}");\r
79                 \r
80                 mainWriter.println();\r
81                 mainWriter.flush();\r
82                 mainWriter.close();\r
83                 \r
84                 // Create Parser class\r
85                 File parserFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+parserClassPostfix+".java");\r
86                 mainWriter = createFile(parserFile);\r
87                 mainWriter.println("package " + converter.getPluginName() +";");\r
88                 mainWriter.println();\r
89                 mainWriter.println("import org.simantics.xml.sax.base.XMLParser;");\r
90                 mainWriter.println();\r
91                 mainWriter.println("public class " + name + parserClassPostfix+" extends XMLParser {");\r
92                 mainWriter.println();\r
93                 mainWriter.println("   public " + name + parserClassPostfix+"()  {");\r
94                 if (schema.getTargetNamespace() != null)\r
95                 mainWriter.println("      setSchemaURI(\""+schema.getTargetNamespace()+"\");");\r
96                 for (String s : ruleClassNames) {\r
97                 mainWriter.println("      add(new "+s+"());");\r
98                 }\r
99                 mainWriter.println("   }");\r
100                 mainWriter.println("}");\r
101                 \r
102                 mainWriter.println();\r
103                 mainWriter.flush();\r
104                 mainWriter.close();\r
105         }\r
106 \r
107         protected void handle(TopLevelAttribute topLevelAttribute) {\r
108         }\r
109         \r
110         @Override\r
111         protected void handleSimpleType(SchemaObject parent, SchemaObject simpleTypeObj) {\r
112         }\r
113         \r
114         @Override\r
115         protected void handleComplexType(SchemaObject complexTypeObj) {\r
116                 ComplexType topLevelComplexType = complexTypeObj.getComplexType();\r
117                 \r
118                 String name = getName(complexTypeObj);\r
119                 \r
120                 //if (topLevelComplexType.getName().equals("LocalizedText"))\r
121                 //if (topLevelComplexType.getName().equals("Reference"))\r
122 //              if (topLevelComplexType.getName().equals("NodeIdAlias"))\r
123 //                      System.out.println();\r
124                 \r
125                 String className = name;//"_"+name;\r
126                 \r
127                 FileWriter fw = new FileWriter();\r
128                 try {\r
129                         fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));\r
130                 } catch (IOException e) {\r
131                         throw new RuntimeException(e);\r
132                 }\r
133                 writers.put(complexTypeObj, fw);\r
134                 \r
135                 Inheritance inheritance = getInheritance(complexTypeObj);\r
136                 \r
137                 provider = getIDProvider(topLevelComplexType);\r
138                 List<IDReference> references = getIDReferences(topLevelComplexType);\r
139                 UnrecognizedChildElement unknownChildElement = getUnknown(topLevelComplexType);\r
140 \r
141                 List<String> intrerfaces = new ArrayList<String>();\r
142                 if (references.size() > 0)\r
143                         intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser");\r
144                 if (unknownChildElement != null)\r
145                         intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser");\r
146                 \r
147                 createClassHeader(fw.writer, false);\r
148                 writeClass(fw.writer,false, null, className, inheritance.baseClass, intrerfaces);\r
149                         \r
150                 writeIDProvider(fw.writer);\r
151         \r
152                 fw.writer.println("   @Override");\r
153                 fw.writer.println("   public Resource create(WriteGraph graph, ParserElement element) throws DatabaseException{");\r
154                 fw.writer.println("      Layer0 L0 = Layer0.getInstance(graph);");\r
155                 fw.writer.println("      "+getOntologyImport());\r
156                 fw.writer.println("      Resource res = graph.newResource();");\r
157                 fw.writer.println("      graph.claim(res, L0.InstanceOf, "+ontShort+name+");");\r
158                 fw.writer.println("      return res;");\r
159                 fw.writer.println("   }");\r
160                 fw.writer.println();\r
161                 \r
162                 fw.writer.println("   @Override");\r
163                 fw.writer.println("   public boolean connectParent(WriteGraph graph, ParserElement parent, ParserElement element) throws DatabaseException{");\r
164                 fw.writer.println("      "+getOntologyImport());\r
165                 fw.writer.println("      graph.claim(parent.getData(), "+this.ontShort+getName(complexTypeObj,"has")+", element.getData());");\r
166                 fw.writer.println("      return true;");\r
167                 fw.writer.println("   }");\r
168                 fw.writer.println();\r
169                                 \r
170                 StringWriter stringWriter = new StringWriter();\r
171                 fw.delayedWriter = new PrintWriter(stringWriter);\r
172                 StringWriter stringWriter2 = new StringWriter();\r
173                 fw.delayedWriter2 = new PrintWriter(stringWriter2);\r
174                 \r
175                 fw.writer.println("   public " + className + "() {");\r
176                 fw.writer.println("      super();");\r
177                 \r
178                 handleComplexTypeExtension(complexTypeObj);\r
179                 \r
180                 fw.writer.println("   }");\r
181                 \r
182                 fw.writer.println("   @Override");\r
183                 fw.writer.println("   public boolean connectChild(WriteGraph graph, ParserElement element, ParserElement child) throws DatabaseException{");\r
184                 fw.writer.println("      "+getOntologyImport());\r
185                 \r
186                 if (stringWriter.getBuffer().length() > 0) {\r
187                         fw.writer.write(stringWriter.toString());\r
188                 }\r
189                 if (inheritance.type == InheritanceType.ComplexType) {\r
190                 fw.writer.println("      return super.connectChild(graph,element,child);");\r
191                 }else{\r
192                 fw.writer.println("      return false;");\r
193                 }\r
194                 fw.writer.println("   }");\r
195                 fw.writer.println();\r
196                 \r
197                 if (stringWriter2.getBuffer().length() > 0) {\r
198                         fw.writer.write(stringWriter2.toString());\r
199                 }\r
200                 \r
201                 stringWriter = null;\r
202                 fw.delayedWriter.close();\r
203                 fw.delayedWriter=null;\r
204                 stringWriter2 = null;\r
205                 fw.delayedWriter2.close();\r
206                 fw.delayedWriter2 = null;\r
207                 \r
208                 fw.writer.println("   @Override");\r
209                 fw.writer.println("   public void configure(WriteGraph graph, Deque<ParserElement> parents, ParserElement element) throws DatabaseException {");\r
210                 if (inheritance.type == InheritanceType.ComplexType) {\r
211                 fw.writer.println("             super.configure(graph,parents,element);");\r
212                 }\r
213                 fw.writer.println("        "+getOntologyImport());\r
214                 \r
215                 handleComplexTypeAttributes(complexTypeObj);\r
216                 handleExtensionAttributes(complexTypeObj);\r
217                 \r
218                 fw.writer.println("   }");\r
219                 \r
220                 if (inheritance.type == InheritanceType.AtomicType) {\r
221                 fw.writer.println();\r
222                 fw.writer.println("   @Override");\r
223                 fw.writer.println("   public void configure(WriteGraph graph, ParserElement element, java.lang.String string) throws DatabaseException {");\r
224                 fw.writer.println("      graph.claimValue(element.getData(), "+getValueGetter(inheritance.atomicType,"string")+", "+inheritance.atomicType.binding+");");\r
225                 fw.writer.println("   }");\r
226                 }\r
227                 \r
228                 writeIDReferences(fw.writer,name, references);\r
229                 writeUnknownChild(fw.writer,name,unknownChildElement);\r
230                 \r
231                 fw.writer.println("}");\r
232                 fw.writer.println();\r
233                 fw.writer.flush();\r
234                 fw.writer.close();\r
235                 fw.writer = null;\r
236                 writers.remove(complexTypeObj);\r
237                 provider = null;\r
238         }\r
239         \r
240         @Override\r
241         protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, String refName, RefType referenceType) {\r
242                 FileWriter fw = getWriter(parent);\r
243                 String objectName;\r
244                 if (referenceType != RefType.Element) {\r
245                         QName refType;\r
246                         if (referenceType == RefType.Type) {\r
247                                 refType = element.getElement().getType();\r
248                                 if (refName == null)\r
249                                         refName = element.getElement().getName();\r
250                                 objectName = element.getElement().getName();\r
251                         } else {\r
252                                 refType = element.getElement().getRef();\r
253                                 if (refName == null)\r
254                                         refName = refType.getLocalPart();\r
255                                 objectName = refType.getLocalPart();\r
256                         }\r
257                         \r
258                         String binding = getBindingFromPrimitiveType(refType);\r
259                         if (binding == null) {\r
260                                 SchemaObject refElement = elementName.get(refType.getLocalPart());\r
261                                 SchemaObject refComplexType = complexTypeName.get(refType.getLocalPart());\r
262         \r
263                                 // prefer element reference over complex type reference\r
264                                 String primaryClassName = null;\r
265                                 String secondaryClassName = null;\r
266                                 if (refElement != null)\r
267                                         primaryClassName = getName(refElement);\r
268                                 else\r
269                                         primaryClassName = getName(refComplexType);\r
270                                 \r
271                                 if (refComplexType != null) {\r
272                                         secondaryClassName = getName(refComplexType);\r
273                                 } else {\r
274                                         secondaryClassName = getName(refElement);\r
275                                 }\r
276                                 \r
277                                 if (referenceType == RefType.Type) {\r
278                                 // create internal class for handling the element and child attachment\r
279                                 secondaryClassName = getName(parent) +"_" +objectName;\r
280                                 fw.writer.println("        addParser(\""+ objectName +"\", "+secondaryClassName+".class);");\r
281                                 fw.delayedWriter2.println("   public static class " + secondaryClassName +" extends " + primaryClassName +"{");\r
282                                 fw.delayedWriter2.println("      public "+ secondaryClassName +"(){");\r
283                                 fw.delayedWriter2.println("      }");\r
284                                 fw.delayedWriter2.println("   }");\r
285                                 } else { // referenceType == RefType.Reference\r
286                                 fw.writer.println("        addParser("+primaryClassName+".class);");\r
287                                 if (!primaryClassName.equals(secondaryClassName))\r
288                                 fw.writer.println("        addParser("+secondaryClassName+".class);");\r
289                                 }\r
290                                 \r
291                                 fw.delayedWriter.println("         if (child.getElementParser() instanceof "+secondaryClassName+"){");\r
292                                 fw.delayedWriter.println("            graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+refName + ", child.getData());");\r
293                                 if (useElementList(parent, indicator,element, referenceType == RefType.Reference, refName, refType)) {\r
294                 \r
295                                 // element type specific list\r
296                                 fw.delayedWriter.println("            {");\r
297                                 fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "List);");\r
298                                 fw.delayedWriter.println("               if (list == null) {");\r
299                                 fw.delayedWriter.println("                  list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");\r
300                                 fw.delayedWriter.println("                  graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "List,list);");\r
301                                 fw.delayedWriter.println("               } else {");\r
302                                 fw.delayedWriter.println("                  org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");\r
303                                 fw.delayedWriter.println("               }");\r
304                                 fw.delayedWriter.println("            }");\r
305                                 }\r
306                                 if (useOriginalList(parent, indicator,element, referenceType == RefType.Reference, refName, refType)) {\r
307                                 // generic list\r
308                                 fw.delayedWriter.println("            {");\r
309                                 fw.delayedWriter.println("               XMLResource XML = XMLResource.getInstance(graph);");\r
310                                 fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");\r
311                                 fw.delayedWriter.println("               if (list == null) {");\r
312                                 fw.delayedWriter.println("                  list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");\r
313                                 fw.delayedWriter.println("                  graph.claim(element.getData(), XML.hasOriginalElementList,list);");\r
314                                 fw.delayedWriter.println("               } else {");\r
315                                 fw.delayedWriter.println("                  org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");\r
316                                 fw.delayedWriter.println("               }");\r
317                                 fw.delayedWriter.println("            }");\r
318                                 }\r
319                                 \r
320                                 fw.delayedWriter.println("            return true;");\r
321                                 fw.delayedWriter.println("         }");\r
322                         } else {\r
323                                 //writer.println(commentTag+ontShort+"."+parent+".has"+ref + " <R " +  ontShort+".hasElement");\r
324                                 fw.writer.println("        addParser(\""+ refName +"\", "+getName(parent) +"_" +refName+".class);");\r
325                                 \r
326                                 fw.delayedWriter2.println("   public static class " + getName(parent) +"_" +refName+" extends org.simantics.xml.sax.base.ValueElementParser {");\r
327                                 fw.delayedWriter2.println("      public "+ getName(parent) +"_" +refName +"(){");\r
328                                 fw.delayedWriter2.println("           super(\""+refName+"\"," +this.ontologyClassName+".URIs."+getName(parent) + "_has"+refName+", "+binding+");");\r
329                                 fw.delayedWriter2.println("       }");\r
330                                 fw.delayedWriter2.println("   }");\r
331                         }\r
332                 } else {\r
333                         Element attrs= element.getElement();\r
334                         SchemaObject obj = getWithObj(parent, attrs);\r
335                         \r
336                         String className = getName(obj);\r
337                         if (refName == null)\r
338                                 refName = attrs.getName();\r
339                         \r
340                         \r
341                         //if (!reference)\r
342                         fw.writer.println("        addParser(\""+ refName +"\", "+className+".class);");\r
343 //                      else\r
344 //                      fw.writer.println("        addParser("+className+".class);");\r
345                         \r
346                         fw.delayedWriter.println("         if (child.getElementParser() instanceof "+className+"){");\r
347                         fw.delayedWriter.println("            graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+refName + ", child.getData());");\r
348                         if (useElementList(parent, indicator,element, false, refName, new QName(obj.getName()))) {\r
349 \r
350                         // element type specific list\r
351                         fw.delayedWriter.println("            {");\r
352                         fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "List);");\r
353                         fw.delayedWriter.println("               if (list == null) {");\r
354                         fw.delayedWriter.println("                  list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");\r
355                         fw.delayedWriter.println("                  graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "List,list);");\r
356                         fw.delayedWriter.println("               } else {");\r
357                         fw.delayedWriter.println("                  org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");\r
358                         fw.delayedWriter.println("               }");\r
359                         fw.delayedWriter.println("            }");\r
360                         }\r
361                         if (useOriginalList(parent, indicator,element, false, refName, new QName(obj.getName()))) {\r
362                         // generic list\r
363                         fw.delayedWriter.println("            {");\r
364                         fw.delayedWriter.println("               XMLResource XML = XMLResource.getInstance(graph);");\r
365                         fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");\r
366                         fw.delayedWriter.println("               if (list == null) {");\r
367                         fw.delayedWriter.println("                  list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");\r
368                         fw.delayedWriter.println("                  graph.claim(element.getData(), XML.hasOriginalElementList,list);");\r
369                         fw.delayedWriter.println("               } else {");\r
370                         fw.delayedWriter.println("                  org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");\r
371                         fw.delayedWriter.println("               }");\r
372                         fw.delayedWriter.println("            }");\r
373                         }\r
374                         \r
375                         fw.delayedWriter.println("            return true;");\r
376                         fw.delayedWriter.println("         }");\r
377                 }\r
378         }\r
379         \r
380         @Override\r
381         protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) {               \r
382                 // generates overriding method that allows parsing any element\r
383                 FileWriter fw = getWriter(parent);\r
384                 fw.delayedWriter2.println("   @Override");\r
385                 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, ParserElement element, ParserElement child) {");\r
386                 fw.delayedWriter2.println("      Class<? extends org.simantics.xml.sax.base.XMLElementParser> parserClass = super.getParser(parsers, element, child);");\r
387                 fw.delayedWriter2.println("      if (parserClass != null) return parserClass;");\r
388                 fw.delayedWriter2.println("      org.simantics.xml.sax.base.XMLElementParser parser = parsers.get(child.getQName());");\r
389                 fw.delayedWriter2.println("      if (parser != null) return parser.getClass();");\r
390                 fw.delayedWriter2.println("      return null;");\r
391                 fw.delayedWriter2.println("   }");\r
392         }\r
393 \r
394         @Override       \r
395         protected void handle(SchemaObject parent, Attribute attribute) {\r
396                 String name = attribute.getName();\r
397                 QName primitiveType = attribute.getType();\r
398                 SimpleType simpleType = attribute.getSimpleType();\r
399                 QName ref = attribute.getRef();\r
400                 \r
401                 String relationName;\r
402                 String attrName;\r
403                 if (name != null) {\r
404                         attrName = name;\r
405                         relationName = ontShort+"has"+name;\r
406                         if (parent != null)\r
407                                 relationName = ontShort+getName(parent)+"_has"+name;\r
408                 }\r
409                 else if (ref != null && parent != null) {\r
410                         attrName = ref.getLocalPart();\r
411                         relationName = ontShort+getName(parent)+"_has"+ref.getLocalPart();\r
412                         \r
413                         Attribute referred = getRefAttribute(ref);\r
414                         if (referred != null) {\r
415                                 primitiveType = referred.getType();\r
416                                 simpleType = referred.getSimpleType();\r
417                         }\r
418                         \r
419                 } else {\r
420                         throw new RuntimeException();\r
421                 }\r
422                 boolean isReference = false;\r
423                 if (provider!= null && provider.getAttribute().getName().equals(attrName))\r
424                         isReference = true;\r
425                 \r
426                 FileWriter fw = getWriter(parent);\r
427                 if (primitiveType != null) {\r
428                         \r
429                         //String binding = getBindingFromPrimitiveType(primitiveType);\r
430                         TypeEntry binding = getTypeEntry(primitiveType);\r
431                         \r
432                         if (binding != null) {\r
433                                 writeAttribute(fw, attrName, relationName, binding, isReference);\r
434                                 return;\r
435                     } else {\r
436                         if (simpleType == null) {\r
437                                 SchemaObject simpleTypeObj = simpleTypeName.get(primitiveType.getLocalPart());\r
438                                 if (simpleTypeObj != null)\r
439                                         simpleType = simpleTypeObj.getSimpleType();\r
440                         }       \r
441                     }\r
442                 } \r
443                 if (simpleType != null) {\r
444                         org.w3._2001.xmlschema.List list = simpleType.getList();\r
445                         if (list != null) {\r
446                                 TypeEntry binding = getTypeEntry(new QName(SCHEMA_NS, "string"));\r
447                                 writeAttribute(fw, attrName, relationName, binding, isReference);\r
448                         } else {\r
449                                 Restriction restriction = simpleType.getRestriction();\r
450                                 if (restriction == null)\r
451                                         throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart()+ ", SimpleType restriction is unset");\r
452                                 QName base = restriction.getBase();\r
453                                 \r
454                                 \r
455                                 //String binding = getBindingFromPrimitiveType(base);\r
456                                 TypeEntry binding = getTypeEntry(base);\r
457                                 writeAttribute(fw, attrName, relationName, binding, isReference);\r
458                         }\r
459                 } else {\r
460                         // TODO : using default String attribute should be configured with rules.\r
461                         //throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart());\r
462                         fw.writer.println("    //FIXME: Cannot resolve type for Attribute " + attrName + " Using default type String");\r
463                         //writeAttribute(fw, attrName, relationName, "STRING", isReference);\r
464                         writeAttribute(fw, attrName, relationName, getTypeEntry("string"), isReference);\r
465                 }\r
466         }\r
467         \r
468         //private void writeAttribute(FileWriter fw, String attrName, String relationName, String binding, boolean isReference) {\r
469         private void writeAttribute(FileWriter fw, String attrName, String relationName, TypeEntry binding, boolean isReference) {\r
470                 fw.writer.println("      {");\r
471                 fw.writer.println("         Attribute a = element.getAttribute(\"" +attrName+"\");");\r
472                 fw.writer.println("         if (a != null) {");\r
473                 fw.writer.println("            graph.claimLiteral(element.getData(),"+relationName+","+getValueGetterMethod(binding,"a")+", "+binding.binding+");");\r
474                 if (isReference)\r
475                 fw.writer.println("            idProviderValue = a.getValue();");       \r
476                 fw.writer.println("         }");\r
477                 fw.writer.println("      }");\r
478         }\r
479         \r
480         @Override\r
481         protected void handleAttributes(SchemaObject simpleTypeObj) {\r
482                 SchemaObject parent = simpleTypeObj.getParent();\r
483                 FileWriter fw = getWriter(parent);\r
484                 \r
485                 SimpleType simpleType = simpleTypeObj.getSimpleType();\r
486                 Restriction restriction = simpleType.getRestriction();\r
487                 if (restriction == null)\r
488                         throw new RuntimeException("Cannot resolve type for Element " + getName(parent));\r
489                 QName base = restriction.getBase();\r
490                 \r
491                 \r
492                 //String binding = getBindingFromPrimitiveType(base);\r
493                 TypeEntry binding = getTypeEntry(base);\r
494                 fw.writer.println("   @Override");\r
495                 fw.writer.println("   public void configure(WriteGraph graph, ParserElement element, java.lang.String value) throws DatabaseException {");\r
496                 //fw.writer.println("      graph.claimValue(element.getData(),"+getValueGetter(binding)+", Bindings."+binding+");");\r
497                 fw.writer.println("      graph.claimValue(element.getData(),"+getValueGetter(binding)+", "+binding.binding +");");\r
498                 fw.writer.println("   }");\r
499                 \r
500         }\r
501         \r
502         @Override\r
503         protected void handle(SchemaObject parent, AttributeGroup attribute) {\r
504                 if (parent != null) {\r
505                         FileWriter fw = getWriter(parent);\r
506                         NamedAttributeGroup group = getAttributeGroup(attribute.getRef().getLocalPart());\r
507                         fw.writer.println(commentTag+"    AttributeGroup " + group.getName());\r
508                         SchemaObject obj = new SchemaObject(parent,attribute);\r
509                         for (Annotated annotated : group.getAttributeOrAttributeGroup()) {\r
510                                 if (annotated instanceof Attribute) {\r
511                                         //handle("AttributeGroups_"+group.getName(),(Attribute)annotated);\r
512                                         handle(obj,(Attribute)annotated);\r
513                                 } else if (annotated instanceof AttributeGroup) {\r
514                                         //handle("AttributeGroups_"+group.getName(),(AttributeGroup)annotated);\r
515                                         handle(obj,(AttributeGroup)annotated);\r
516                                 }\r
517                         }\r
518                         fw.writer.println(commentTag+"    End of AttributeGroup " + group.getName());\r
519                 }\r
520                 \r
521         }\r
522         \r
523         @Override\r
524         protected void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes) {\r
525                 FileWriter fw = getWriter(parent);\r
526                 QName type = new QName(CONVERSION_NS, composition.getType());\r
527                 String arrayBinding = getBindingFromPrimitiveType(type);\r
528                 String javaType = getJavaTypeFromPrimitiveType(type);\r
529                 String name = composition.getName();\r
530                 \r
531                 String relationName;\r
532                 if (name != null) {\r
533                         relationName = ontShort+"has"+name;\r
534                         if (parent != null)\r
535                                 relationName = ontShort+getName(parent)+"_has"+name;\r
536                 } else {\r
537                         throw new RuntimeException();\r
538                 }\r
539                 \r
540                 fw.writer.println("      {");\r
541                 int i = 0;\r
542                 for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute())\r
543                 fw.writer.println("         Attribute a"+(i++)+" = element.getAttribute(\"" +a.getName()+"\");");\r
544                 fw.writer.print  ("         "+javaType + " value = new "+javaType+"{");\r
545                 i = 0;\r
546                 // FIXME : handle optional attributes properly.\r
547                 for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute()) {\r
548                         Attribute attribute = ((Attribute)attributes.getRight(a));\r
549                         //QName atype = getBaseType(attribute);\r
550                         QName atype = getPrimitiveType(attribute);\r
551                         String defaultValue = attribute.getDefault();\r
552                         if (defaultValue == null)\r
553                             defaultValue = getDefaultValue(atype);\r
554                                 \r
555                         //String binding = getBindingFromPrimitiveType(atype);\r
556                         TypeEntry binding = getTypeEntry(atype);\r
557                         if (i > 0)\r
558                                 fw.writer.print(",");\r
559                         if (defaultValue != null)\r
560                                 fw.writer.print("a"+(i)+"!= null ? "+ getValueGetterMethod(binding,"a"+(i++)) + " : " +defaultValue);\r
561                         else\r
562                                 fw.writer.print(getValueGetterMethod(binding,"a"+(i++)));\r
563                 }\r
564                 fw.writer.println("};");\r
565                 fw.writer.println("         graph.claimLiteral(element.getData(),"+relationName+", value, "+arrayBinding+");");\r
566                 fw.writer.println("      }");\r
567                 \r
568         }\r
569         \r
570         protected String getDefaultValue(QName atype) {\r
571                 Map<String,TypeEntry> types = typeMap.get(atype.getNamespaceURI());\r
572                 if (types == null)\r
573                         return null;\r
574                 TypeEntry entry =  types.get(atype.getLocalPart());\r
575                 if (entry == null)\r
576                         return null;\r
577                 return entry.defaultValue;\r
578         }\r
579         \r
580         \r
581         \r
582 \r
583         \r
584         IDProvider provider;\r
585         @Override\r
586         protected void handleElement(SchemaObject elementObj)  {\r
587                 Element element = elementObj.getElement();\r
588                 \r
589                 String name = getName(elementObj);//topLevelElement.getName();\r
590                 String className = name;\r
591                 \r
592                 FileWriter fw = new FileWriter();\r
593                 try {\r
594                         fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));\r
595                 } catch (IOException e) {\r
596                         throw new RuntimeException(e);\r
597                 }\r
598                 writers.put(elementObj, fw);\r
599                 boolean isList = false;\r
600                 \r
601                 Inheritance inheritance = getInheritance(elementObj);   \r
602                 \r
603                 provider = getIDProvider(element);\r
604                 List<IDReference> references = getIDReferences(element);\r
605                 UnrecognizedChildElement unknownChildElement = getUnknown(element);\r
606 \r
607                 List<String> intrerfaces = new ArrayList<String>();\r
608                 if (references.size() > 0)\r
609                         intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser");\r
610                 if (unknownChildElement != null)\r
611                         intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser");\r
612 \r
613                 createClassHeader(fw.writer, isList);\r
614                 writeClass(fw.writer,false, element.getName(), className, inheritance.baseClass, intrerfaces);\r
615                 writeIDProvider(fw.writer);\r
616                 fw.writer.println("   @Override");\r
617                 fw.writer.println("   public Resource create(WriteGraph graph, ParserElement element) throws DatabaseException{");\r
618                 fw.writer.println("      Layer0 L0 = Layer0.getInstance(graph);");\r
619                 fw.writer.println("      "+getOntologyImport());\r
620                 if (!isList) {\r
621                 fw.writer.println("      Resource res = graph.newResource();");\r
622                 fw.writer.println("      graph.claim(res, L0.InstanceOf, "+ontShort+name+");");\r
623                 } else {\r
624                 fw.writer.println("      Resource res = ListUtils.create(graph, "+ontShort+name+", Collections.EMPTY_LIST);");\r
625                 }\r
626                 fw.writer.println("      return res;");\r
627                 fw.writer.println("   }");\r
628                 fw.writer.println();\r
629                 \r
630                 fw.writer.println("   @Override");\r
631                 fw.writer.println("   public boolean connectParent(WriteGraph graph, ParserElement parent, ParserElement element) throws DatabaseException{");\r
632                 fw.writer.println("      "+getOntologyImport());\r
633                 fw.writer.println("      graph.claim(parent.getData(), "+this.ontShort+getName(elementObj,"has")+", element.getData());");\r
634                 fw.writer.println("      return true;");\r
635                 fw.writer.println("   }");\r
636                 fw.writer.println();\r
637                 \r
638                 fw.writer.println("   @Override");\r
639                 fw.writer.println("   public void configure(WriteGraph graph, Deque<ParserElement> parents, ParserElement element) throws DatabaseException {");\r
640                 if (inheritance.type == InheritanceType.ComplexType) {\r
641                 fw.writer.println("             super.configure(graph,parents,element);");\r
642                 }\r
643                 fw.writer.println("        "+getOntologyImport());\r
644                 \r
645                 LocalComplexType complexType = element.getComplexType();\r
646                 LocalSimpleType simpleType = element.getSimpleType();\r
647                 \r
648                 if (complexType != null) {\r
649                         SchemaObject obj = complexTypes.get(complexType);\r
650                         handleElementComplexTypeAttributes(obj);\r
651                 } \r
652                 fw.writer.println("   }");\r
653                 \r
654                 if (inheritance.type == InheritanceType.AtomicType) {\r
655                 fw.writer.println();\r
656                 fw.writer.println("   @Override");\r
657                 fw.writer.println("   public void configure(WriteGraph graph, ParserElement element, java.lang.String string) throws DatabaseException {");\r
658                 fw.writer.println("      graph.claimValue(element.getData(), "+getValueGetter(inheritance.atomicType,"string")+", "+inheritance.atomicType.binding+");");\r
659                 fw.writer.println("   }");\r
660                 }\r
661 //              if (simpleType != null) {\r
662 //                      SchemaObject obj = simpleTypes.get(simpleType);\r
663 //                      handleElementSimpleTypeAttributes(obj);\r
664 //              }\r
665                 \r
666                 \r
667                 StringWriter stringWriter = new StringWriter();\r
668                 fw.delayedWriter = new PrintWriter(stringWriter);\r
669                 StringWriter stringWriter2 = new StringWriter();\r
670                 fw.delayedWriter2 = new PrintWriter(stringWriter2);\r
671                 \r
672                 fw.writer.println("   public " + className + "() {");\r
673                 fw.writer.println("      super();");\r
674                 \r
675                 if (complexType != null) {\r
676                         SchemaObject obj = complexTypes.get(complexType);\r
677                         handleComplexTypeExtension(obj);\r
678                 } else if (simpleType != null) {\r
679                         \r
680                 }\r
681                 \r
682                 fw.writer.println("   }");\r
683                 \r
684                 fw.writer.println("   @Override");\r
685                 fw.writer.println("   public boolean connectChild(WriteGraph graph, ParserElement element, ParserElement child) throws DatabaseException{");\r
686                 fw.writer.println("      "+getOntologyImport());\r
687                 \r
688                 if (stringWriter.getBuffer().length() > 0) {\r
689                         fw.writer.write(stringWriter.toString());\r
690                 }\r
691                 if (inheritance.type == InheritanceType.ComplexType) {\r
692                 fw.writer.println("      return super.connectChild(graph,element,child);");     \r
693                 } else {\r
694                 fw.writer.println("      return false;");\r
695                 }\r
696                 fw.writer.println("   }");\r
697                 fw.writer.println();\r
698                 \r
699                 if (stringWriter2.getBuffer().length() > 0) {\r
700                         fw.writer.write(stringWriter2.toString());\r
701                 }\r
702                 \r
703                 stringWriter = null;\r
704                 fw.delayedWriter.close();\r
705                 fw.delayedWriter = null;\r
706                 stringWriter2 = null;\r
707                 fw.delayedWriter2.close();\r
708                 fw.delayedWriter2 = null;\r
709                 \r
710                 writeIDReferences(fw.writer,name, references);\r
711                 writeUnknownChild(fw.writer,name,unknownChildElement);\r
712 \r
713                 fw.writer.println("}");\r
714                 fw.writer.println();\r
715                 fw.writer.flush();\r
716                 fw.writer.close();\r
717                 fw.writer = null;\r
718                 writers.remove(elementObj);\r
719                 provider = null;\r
720                 \r
721                 ruleClassNames.add(converter.getPluginName()+"."+elementPackageName+"."+name);\r
722         }\r
723 \r
724         \r
725         private void writeIDProvider(PrintWriter writer) {\r
726                 if (provider != null) {\r
727                 writer.println("   java.lang.String idProviderValue = null;");\r
728                 writer.println();\r
729                 writer.println("   @Override");\r
730                 writer.println("   public java.lang.String getID() {");\r
731                 writer.println("        java.lang.String s = idProviderValue;");\r
732                 writer.println("        idProviderValue = null;");\r
733                 writer.println("        return s;");\r
734                 writer.println("   }");\r
735                 writer.println();\r
736                 if (provider.getPriority() != null) {\r
737                 writer.println("   @Override");\r
738                 writer.println("   public int idPriority() {");\r
739                 writer.println("        return " + provider.getPriority().intValue()+";");\r
740                 writer.println("   }"); \r
741                 }\r
742                 }\r
743         }\r
744         \r
745         private void writeIDReferences(PrintWriter writer,String name, List<IDReference> references) {\r
746                 if (references.size() > 0) {\r
747                 writer.println("   @Override");\r
748                 writer.println("   public boolean connectReferences(WriteGraph graph, ParserElement element, java.util.Map<java.lang.String, ParserElement> map) throws DatabaseException {");\r
749                 writer.println("      "+getOntologyImport());\r
750                 writer.println("      boolean result = true;");\r
751                 for (IDReference ref : references) {\r
752                 writer.println("      {");\r
753                 writer.println("         Attribute a = element.getAttribute(\"" + ref.getIDSource().getName() +"\");");\r
754                 writer.println("         if (a != null) {");\r
755                 writer.println("            ParserElement refEle = map.get(a.value);");\r
756                 writer.println("            if (refEle != null) {");\r
757                 writer.println("               Resource ref = refEle.getData();");\r
758                 writer.println("               graph.claim(element.getData(), "+ontShort+name+"_"+ref.getReference().getName()+", ref);");\r
759                 writer.println("            } else {");\r
760                 writer.println("               result = false;");\r
761                 writer.println("            }");\r
762                 writer.println("         }");\r
763                 writer.println("      }");\r
764                 }\r
765                 writer.println("      return result;");\r
766                 writer.println("   }");\r
767                 writer.println();\r
768                 }\r
769         }\r
770         \r
771         private void writeUnknownChild(PrintWriter writer,String name, UnrecognizedChildElement unknownChildElement) {\r
772                 if (unknownChildElement == null)\r
773                         return;\r
774                 \r
775                 writer.println("   @Override");\r
776                 writer.println("   public void configureChild(WriteGraph graph, Deque<ParserElement> parents, ParserElement element, ParserElement child) throws DatabaseException {");\r
777                 writer.println("    " + unknownChildElement.getJavaMethod());\r
778                 writer.println("   }");\r
779                 writer.println();\r
780                 \r
781         }\r
782         \r
783         @Override\r
784         protected String getBaseClass(ObjectType type) {\r
785                 return "org.simantics.xml.sax.base.XMLElementNamedChildParserBase";\r
786         }\r
787         \r
788         protected void createClassHeader(PrintWriter writer, boolean isList) {\r
789                 writer.println("package " + converter.getPluginName() +"."+elementPackageName+";");\r
790                 writer.println();\r
791                 writer.println("import java.util.Deque;");\r
792                 writer.println("import org.simantics.databoard.Bindings;");\r
793                 writer.println("import org.simantics.db.Resource;");\r
794                 writer.println("import org.simantics.db.WriteGraph;");\r
795                 writer.println("import org.simantics.db.exception.DatabaseException;");\r
796                 writer.println("import org.simantics.xml.sax.base.Attribute;");\r
797                 writer.println("import org.simantics.xml.sax.base.ParserElement;");\r
798                 writer.println("import org.simantics.xml.sax.ontology.XMLResource;");\r
799                 if (!isList) {\r
800                 writer.println("import org.simantics.layer0.Layer0;");\r
801             } else {\r
802             writer.println("import java.util.Collections;");\r
803                 writer.println("import org.simantics.db.common.utils.ListUtils;");\r
804                 }\r
805                 writer.println();\r
806         }\r
807         \r
808 }\r