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