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