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