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