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