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