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