]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.xml.sax/src/org/simantics/xml/sax/ImporterGenerator.java
f1076b80bda639560696b04eff3a3db08c896466
[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                 
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, String binding) {
283                 FileWriter fw = getWriter(parent);
284                 fw.writer.println("        addParser(\""+ refName +"\", "+getName(parent) +"_" +refName+".class);");
285                 
286                 fw.delayedWriter2.println("   public static class " + getName(parent) +"_" +refName+" extends org.simantics.xml.sax.base.ValueElementParser {");
287                 fw.delayedWriter2.println("      public "+ getName(parent) +"_" +refName +"(){");
288                 fw.delayedWriter2.println("           super(\""+refName+"\"," +this.ontologyClassName+".URIs."+getName(parent) + "_has"+refName+", "+binding+");");
289                 fw.delayedWriter2.println("       }");
290                 fw.delayedWriter2.println("   }");
291         }
292         
293         @Override
294         protected void createElementIndicator(SchemaObject parent, boolean useElementList, String refName, String className, boolean useOriginalList) {
295                 FileWriter fw = getWriter(parent);
296                 //if (!reference)
297                 fw.writer.println("        addParser(\""+ refName +"\", "+className+".class);");
298 //              else
299 //              fw.writer.println("        addParser("+className+".class);");
300                 
301                 fw.delayedWriter.println("         if (child.getElementParser() instanceof "+className+"){");
302                 fw.delayedWriter.println("            graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+refName + ", child.getData());");
303                 if (useElementList) {
304
305                 // element type specific list
306                 fw.delayedWriter.println("            {");
307                 fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "List);");
308                 fw.delayedWriter.println("               if (list == null) {");
309                 fw.delayedWriter.println("                  list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
310                 fw.delayedWriter.println("                  graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "List,list);");
311                 fw.delayedWriter.println("               } else {");
312                 fw.delayedWriter.println("                  org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
313                 fw.delayedWriter.println("               }");
314                 fw.delayedWriter.println("            }");
315                 }
316                 if (useOriginalList) {
317                 // generic list
318                 fw.delayedWriter.println("            {");
319                 fw.delayedWriter.println("               XMLResource XML = XMLResource.getInstance(graph);");
320                 fw.delayedWriter.println("               Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");
321                 fw.delayedWriter.println("               if (list == null) {");
322                 fw.delayedWriter.println("                  list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
323                 fw.delayedWriter.println("                  graph.claim(element.getData(), XML.hasOriginalElementList,list);");
324                 fw.delayedWriter.println("               } else {");
325                 fw.delayedWriter.println("                  org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
326                 fw.delayedWriter.println("               }");
327                 fw.delayedWriter.println("            }");
328                 }
329                 
330                 fw.delayedWriter.println("            return true;");
331                 fw.delayedWriter.println("         }");
332         }
333         
334         @Override
335         public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) {          
336                 // generates overriding method that allows parsing any element
337                 FileWriter fw = getWriter(parent);
338                 fw.delayedWriter2.println("   @Override");
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) {");
340                 fw.delayedWriter2.println("      Class<? extends org.simantics.xml.sax.base.XMLElementParser> parserClass = super.getParser(parsers, element, child);");
341                 fw.delayedWriter2.println("      if (parserClass != null) return parserClass;");
342                 fw.delayedWriter2.println("      org.simantics.xml.sax.base.XMLElementParser parser = parsers.get(child.getQName());");
343                 fw.delayedWriter2.println("      if (parser != null) return parser.getClass();");
344                 fw.delayedWriter2.println("      return null;");
345                 fw.delayedWriter2.println("   }");
346         }
347
348         @Override       
349         public void handle(SchemaObject parent, Attribute attribute) {
350                 if (parent == null)
351                         return;
352                 String name = attribute.getName();
353                 QName primitiveType = attribute.getType();
354                 SimpleType simpleType = attribute.getSimpleType();
355                 QName ref = attribute.getRef();
356                 
357                 String relationName;
358                 String attrName;
359                 if (name != null) {
360                         attrName = name;
361                         relationName = ontShort+"has"+name;
362                         if (parent != null)
363                                 relationName = ontShort+getName(parent)+"_has"+name;
364                 }
365                 else if (ref != null && parent != null) {
366                         attrName = ref.getLocalPart();
367                         relationName = ontShort+getName(parent)+"_has"+ref.getLocalPart();
368                         
369                         Attribute referred = this.base.getRefAttribute(ref);
370                         if (referred != null) {
371                                 primitiveType = referred.getType();
372                                 simpleType = referred.getSimpleType();
373                         }
374                         
375                 } else {
376                         throw new RuntimeException();
377                 }
378                 boolean isReference = false;
379                 if (provider!= null && provider.getAttribute().getName().equals(attrName))
380                         isReference = true;
381                 
382                 FileWriter fw = getWriter(parent);
383                 if (primitiveType != null) {
384                         
385                         //String binding = getBindingFromPrimitiveType(primitiveType);
386                         TypeEntry binding = this.base.getTypeEntry(primitiveType);
387                         
388                         if (binding != null) {
389                                 writeAttribute(fw, attrName, relationName, binding, isReference);
390                                 return;
391                     } else {
392                         if (simpleType == null) {
393                                 SchemaObject simpleTypeObj = this.base.getSimpleType(primitiveType);//this.base.simpleTypeName.get(primitiveType.getLocalPart());
394                                 if (simpleTypeObj != null)
395                                         simpleType = simpleTypeObj.getSimpleType();
396                         }       
397                     }
398                 } 
399                 if (simpleType != null) {
400                         org.w3._2001.xmlschema.List list = simpleType.getList();
401                         if (list != null) {
402                                 TypeEntry binding = this.base.getTypeEntry(new QName(SchemaConversionBase.SCHEMA_NS, "string"));
403                                 writeAttribute(fw, attrName, relationName, binding, isReference);
404                         } else {
405 //                              Restriction restriction = simpleType.getRestriction();
406 //                              if (restriction == null)
407 //                                      throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart()+ ", SimpleType restriction is unset");
408 //                              QName base = restriction.getBase();
409                                 QName base = this.base.getSimpleTypeBase(simpleType);
410                                 
411                                 
412                                 //String binding = getBindingFromPrimitiveType(base);
413                                 TypeEntry binding = this.base.getTypeEntry(base);
414                                 writeAttribute(fw, attrName, relationName, binding, isReference);
415                         }
416                 } else {
417                         // TODO : using default String attribute should be configured with rules.
418                         //throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart());
419                         fw.writer.println("    //FIXME: Cannot resolve type for Attribute " + attrName + " Using default type String");
420                         //writeAttribute(fw, attrName, relationName, "STRING", isReference);
421                         writeAttribute(fw, attrName, relationName, this.base.getTypeEntry("string"), isReference);
422                 }
423         }
424         
425         private void writeAttribute(FileWriter fw, String attrName, String relationName, TypeEntry binding, boolean isReference) {
426                 fw.writer.println("      {");
427                 fw.writer.println("         Attribute a = element.getAttribute(\"" +attrName+"\");");
428                 fw.writer.println("         if (a != null) {");
429                 fw.writer.println("            graph.claimLiteral(element.getData(),"+relationName+","+getValueGetterMethod(binding,"a")+", "+binding.binding+");");
430                 if (isReference)
431                 fw.writer.println("            idProviderValue = a.getValue();");       
432                 fw.writer.println("         }");
433                 fw.writer.println("      }");
434         }
435         
436         @Override
437         public void handleAttributes(SchemaObject simpleTypeObj) {
438                 SchemaObject parent = simpleTypeObj.getParent();
439                 FileWriter fw = getWriter(parent);
440                 
441                 SimpleType simpleType = simpleTypeObj.getSimpleType();
442                 Restriction restriction = simpleType.getRestriction();
443                 if (restriction == null)
444                         throw new RuntimeException("Cannot resolve type for Element " + getName(parent));
445                 QName base = restriction.getBase();
446                 
447                 
448                 //String binding = getBindingFromPrimitiveType(base);
449                 TypeEntry binding = this.base.getTypeEntry(base);
450                 fw.writer.println("   @Override");
451                 fw.writer.println("   public void configure(WriteGraph graph, ParserElement element, java.lang.String value) throws DatabaseException {");
452                 //fw.writer.println("      graph.claimValue(element.getData(),"+getValueGetter(binding)+", Bindings."+binding+");");
453                 fw.writer.println("      graph.claimValue(element.getData(),"+getValueGetter(binding)+", "+binding.binding +");");
454                 fw.writer.println("   }");
455                 
456         }
457         
458         @Override
459         public void handle(SchemaObject parent, AttributeGroup attribute) {
460                 if (parent != null) {
461                         FileWriter fw = getWriter(parent);
462                         NamedAttributeGroup group = this.base.getAttributeGroup(attribute.getRef());
463                         fw.writer.println(commentTag+"    AttributeGroup " + group.getName());
464                         SchemaObject obj = new SchemaObject(parent,attribute);
465                         for (Annotated annotated : group.getAttributeOrAttributeGroup()) {
466                                 if (annotated instanceof Attribute) {
467                                         //handle("AttributeGroups_"+group.getName(),(Attribute)annotated);
468                                         handle(obj,(Attribute)annotated);
469                                 } else if (annotated instanceof AttributeGroup) {
470                                         //handle("AttributeGroups_"+group.getName(),(AttributeGroup)annotated);
471                                         handle(obj,(AttributeGroup)annotated);
472                                 }
473                         }
474                         //dd
475                         if(true)
476                                 System.out.println();
477                         fw.writer.println(commentTag+"    End of AttributeGroup " + group.getName());
478                 }
479                 
480         }
481         
482         @Override
483         public void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes) {
484                 FileWriter fw = getWriter(parent);
485                 QName type = new QName(SchemaConversionBase.CONVERSION_NS, composition.getType());
486                 String arrayBinding = this.base.getBindingFromPrimitiveType(type);
487                 String javaType = this.base.getJavaTypeFromPrimitiveType(type);
488                 String name = composition.getName();
489                 
490                 String relationName;
491                 if (name != null) {
492                         relationName = ontShort+"has"+name;
493                         if (parent != null)
494                                 relationName = ontShort+getName(parent)+"_has"+name;
495                 } else {
496                         throw new RuntimeException();
497                 }
498                 
499                 fw.writer.println("      {");
500                 int i = 0;
501                 for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute())
502                 fw.writer.println("         Attribute a"+(i++)+" = element.getAttribute(\"" +a.getName()+"\");");
503                 fw.writer.print  ("         "+javaType + " value = new "+javaType+"{");
504                 i = 0;
505                 // FIXME : handle optional attributes properly.
506                 for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute()) {
507                         Attribute attribute = ((Attribute)attributes.getRight(a));
508                         //QName atype = getBaseType(attribute);
509                         QName atype = this.base.getPrimitiveType(attribute);
510                         String defaultValue = attribute.getDefault();
511                         if (defaultValue == null)
512                             defaultValue = this.base.getDefaultValue(atype);
513                                 
514                         //String binding = getBindingFromPrimitiveType(atype);
515                         TypeEntry binding = this.base.getTypeEntry(atype);
516                         if (i > 0)
517                                 fw.writer.print(",");
518                         if (defaultValue != null)
519                                 fw.writer.print("a"+(i)+"!= null ? "+ getValueGetterMethod(binding,"a"+(i++)) + " : " +defaultValue);
520                         else
521                                 fw.writer.print(getValueGetterMethod(binding,"a"+(i++)));
522                 }
523                 fw.writer.println("};");
524                 fw.writer.println("         graph.claimLiteral(element.getData(),"+relationName+", value, "+arrayBinding+");");
525                 fw.writer.println("      }");
526                 
527         }
528         
529         
530         
531         
532         
533
534         
535         IDProvider provider;
536         @Override
537         public void handleElement(SchemaObject elementObj)  {
538                 Element element = elementObj.getElement();
539                 
540                 String name = getName(elementObj);//topLevelElement.getName();
541                 String className = name;
542                 
543                 FileWriter fw = new FileWriter();
544                 try {
545                         fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));
546                 } catch (IOException e) {
547                         throw new RuntimeException(e);
548                 }
549                 writers.put(elementObj, fw);
550                 boolean isList = false;
551                 
552                 Inheritance inheritance = this.base.getInheritance(elementObj); 
553                 
554                 provider = this.base.getIDProvider(element);
555                 List<IDReference> references = this.base.getIDReferences(element);
556                 UnrecognizedChildElement unknownChildElement = this.base.getUnknown(element);
557
558                 List<String> intrerfaces = new ArrayList<String>();
559                 if (references.size() > 0)
560                         intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser");
561                 if (unknownChildElement != null)
562                         intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser");
563
564                 createClassHeader(fw.writer, isList);
565                 writeClass(fw.writer,false, element.getName(), className, inheritance.baseClass, intrerfaces);
566                 writeIDProvider(fw.writer);
567                 fw.writer.println("   @Override");
568                 fw.writer.println("   public Resource create(WriteGraph graph, ParserElement element) throws DatabaseException{");
569                 fw.writer.println("      Layer0 L0 = Layer0.getInstance(graph);");
570                 fw.writer.println("      "+getOntologyImport());
571                 if (!isList) {
572                 fw.writer.println("      Resource res = graph.newResource();");
573                 fw.writer.println("      graph.claim(res, L0.InstanceOf, "+ontShort+name+");");
574                 } else {
575                 fw.writer.println("      Resource res = ListUtils.create(graph, "+ontShort+name+", Collections.EMPTY_LIST);");
576                 }
577                 fw.writer.println("      return res;");
578                 fw.writer.println("   }");
579                 fw.writer.println();
580                 
581                 fw.writer.println("   @Override");
582                 fw.writer.println("   public boolean connectParent(WriteGraph graph, ParserElement parent, ParserElement element) throws DatabaseException{");
583                 fw.writer.println("      "+getOntologyImport());
584                 fw.writer.println("      graph.claim(parent.getData(), "+this.ontShort+getName(elementObj,"has")+", element.getData());");
585                 fw.writer.println("      return true;");
586                 fw.writer.println("   }");
587                 fw.writer.println();
588                 
589                 fw.writer.println("   @Override");
590                 fw.writer.println("   public void configure(WriteGraph graph, Deque<ParserElement> parents, ParserElement element) throws DatabaseException {");
591                 if (inheritance.type == InheritanceType.ComplexType) {
592                 fw.writer.println("             super.configure(graph,parents,element);");
593                 }
594                 fw.writer.println("        "+getOntologyImport());
595                 
596                 LocalComplexType complexType = element.getComplexType();
597                 LocalSimpleType simpleType = element.getSimpleType();
598                 
599                 if (complexType != null) {
600                         SchemaObject obj = this.base.getComplexType(complexType);
601                         this.base.handleElementComplexTypeAttributes(obj);
602                 } 
603                 fw.writer.println("   }");
604                 
605                 if (inheritance.type == InheritanceType.AtomicType) {
606                 fw.writer.println();
607                 fw.writer.println("   @Override");
608                 fw.writer.println("   public void configure(WriteGraph graph, ParserElement element, java.lang.String string) throws DatabaseException {");
609                 fw.writer.println("      graph.claimValue(element.getData(), "+getValueGetter(inheritance.atomicType,"string")+", "+inheritance.atomicType.binding+");");
610                 fw.writer.println("   }");
611                 }
612 //              if (simpleType != null) {
613 //                      SchemaObject obj = simpleTypes.get(simpleType);
614 //                      handleElementSimpleTypeAttributes(obj);
615 //              }
616                 
617                 
618                 StringWriter stringWriter = new StringWriter();
619                 fw.delayedWriter = new PrintWriter(stringWriter);
620                 StringWriter stringWriter2 = new StringWriter();
621                 fw.delayedWriter2 = new PrintWriter(stringWriter2);
622                 
623                 fw.writer.println("   public " + className + "() {");
624                 fw.writer.println("      super();");
625                 
626                 if (complexType != null) {
627                         SchemaObject obj = this.base.getComplexType(complexType);
628                         this.base.handleComplexTypeExtension(obj);
629                 } else if (simpleType != null) {
630                         
631                 }
632                 
633                 fw.writer.println("   }");
634                 
635                 fw.writer.println("   @Override");
636                 fw.writer.println("   public boolean connectChild(WriteGraph graph, ParserElement element, ParserElement child) throws DatabaseException{");
637                 fw.writer.println("      "+getOntologyImport());
638                 
639                 if (stringWriter.getBuffer().length() > 0) {
640                         fw.writer.write(stringWriter.toString());
641                 }
642                 if (inheritance.type == InheritanceType.ComplexType) {
643                 fw.writer.println("      return super.connectChild(graph,element,child);");     
644                 } else {
645                 fw.writer.println("      return false;");
646                 }
647                 fw.writer.println("   }");
648                 fw.writer.println();
649                 
650                 if (stringWriter2.getBuffer().length() > 0) {
651                         fw.writer.write(stringWriter2.toString());
652                 }
653                 
654                 stringWriter = null;
655                 fw.delayedWriter.close();
656                 fw.delayedWriter = null;
657                 stringWriter2 = null;
658                 fw.delayedWriter2.close();
659                 fw.delayedWriter2 = null;
660                 
661                 writeIDReferences(fw.writer,name, references);
662                 writeUnknownChild(fw.writer,name,unknownChildElement);
663
664                 fw.writer.println("}");
665                 fw.writer.println();
666                 fw.writer.flush();
667                 fw.writer.close();
668                 fw.writer = null;
669                 writers.remove(elementObj);
670                 provider = null;
671                 
672                 ruleClassNames.add(converter.getPluginName()+"."+elementPackageName+"."+name);
673         }
674
675         
676         private void writeIDProvider(PrintWriter writer) {
677                 if (provider != null) {
678                 writer.println("   java.lang.String idProviderValue = null;");
679                 writer.println();
680                 writer.println("   @Override");
681                 writer.println("   public java.lang.String getID() {");
682                 writer.println("        java.lang.String s = idProviderValue;");
683                 writer.println("        idProviderValue = null;");
684                 writer.println("        return s;");
685                 writer.println("   }");
686                 writer.println();
687                 if (provider.getPriority() != null) {
688                 writer.println("   @Override");
689                 writer.println("   public int idPriority() {");
690                 writer.println("        return " + provider.getPriority().intValue()+";");
691                 writer.println("   }"); 
692                 }
693                 }
694         }
695         
696         private void writeIDReferences(PrintWriter writer,String name, List<IDReference> references) {
697                 if (references.size() > 0) {
698                 writer.println("   @Override");
699                 writer.println("   public boolean connectReferences(WriteGraph graph, ParserElement element, java.util.Map<java.lang.String, ParserElement> map) throws DatabaseException {");
700                 writer.println("      "+getOntologyImport());
701                 writer.println("      boolean result = true;");
702                 for (IDReference ref : references) {
703                 writer.println("      {");
704                 writer.println("         Attribute a = element.getAttribute(\"" + ref.getIDSource().getName() +"\");");
705                 writer.println("         if (a != null) {");
706                 writer.println("            ParserElement refEle = map.get(a.value);");
707                 writer.println("            if (refEle != null) {");
708                 writer.println("               Resource ref = refEle.getData();");
709                 writer.println("               graph.claim(element.getData(), "+ontShort+name+"_"+ref.getReference().getName()+", ref);");
710                 writer.println("            } else {");
711                 writer.println("               result = false;");
712                 writer.println("            }");
713                 writer.println("         }");
714                 writer.println("      }");
715                 }
716                 writer.println("      return result;");
717                 writer.println("   }");
718                 writer.println();
719                 }
720         }
721         
722         private void writeUnknownChild(PrintWriter writer,String name, UnrecognizedChildElement unknownChildElement) {
723                 if (unknownChildElement == null)
724                         return;
725                 
726                 writer.println("   @Override");
727                 writer.println("   public void configureChild(WriteGraph graph, Deque<ParserElement> parents, ParserElement element, ParserElement child) throws DatabaseException {");
728                 writer.println("    " + unknownChildElement.getJavaMethod());
729                 writer.println("   }");
730                 writer.println();
731                 
732         }
733         
734         @Override
735         public String getBaseClass(ObjectType type) {
736                 return "org.simantics.xml.sax.base.XMLElementNamedChildParserBase";
737         }
738         
739         protected void createClassHeader(PrintWriter writer, boolean isList) {
740                 writer.println("package " + converter.getPluginName() +"."+elementPackageName+";");
741                 writer.println();
742                 writer.println("import java.util.Deque;");
743                 writer.println("import org.simantics.databoard.Bindings;");
744                 writer.println("import org.simantics.db.Resource;");
745                 writer.println("import org.simantics.db.WriteGraph;");
746                 writer.println("import org.simantics.db.exception.DatabaseException;");
747                 writer.println("import org.simantics.xml.sax.base.Attribute;");
748                 writer.println("import org.simantics.xml.sax.base.ParserElement;");
749                 writer.println("import org.simantics.xml.sax.ontology.XMLResource;");
750                 if (!isList) {
751                 writer.println("import org.simantics.layer0.Layer0;");
752             } else {
753             writer.println("import java.util.Collections;");
754                 writer.println("import org.simantics.db.common.utils.ListUtils;");
755                 }
756                 writer.println();
757         }
758         
759 }