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