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