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