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