]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.xml.sax/src/org/simantics/xml/sax/ImporterGenerator.java
Attribute namespace + multi-schema data export
[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                         fw.writer.println(commentTag+"    End of AttributeGroup " + group.getName());
526                 }
527                 
528         }
529         
530         @Override
531         public void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes) {
532                 FileWriter fw = getWriter(parent);
533                 QName type = new QName(SchemaConversionBase.CONVERSION_NS, composition.getType());
534                 String arrayBinding = this.base.getBindingFromPrimitiveType(type);
535                 String javaType = this.base.getJavaTypeFromPrimitiveType(type);
536                 String name = composition.getName();
537                 
538                 String relationName;
539                 if (name != null) {
540                         relationName = ontShort+"has"+name;
541                         if (parent != null)
542                                 relationName = ontShort+getName(parent)+"_has"+name;
543                 } else {
544                         throw new RuntimeException();
545                 }
546                 
547                 fw.writer.println("      {");
548                 int i = 0;
549                 for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute())
550                 fw.writer.println("         Attribute a"+(i++)+" = element.getAttribute(\"" +a.getName()+"\");");
551                 fw.writer.print  ("         "+javaType + " value = new "+javaType+"{");
552                 i = 0;
553                 // FIXME : handle optional attributes properly.
554                 for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute()) {
555                         Attribute attribute = ((Attribute)attributes.getRight(a));
556                         //QName atype = getBaseType(attribute);
557                         QName atype = this.base.getPrimitiveType(attribute);
558                         String defaultValue = attribute.getDefault();
559                         if (defaultValue == null)
560                             defaultValue = this.base.getDefaultValue(atype);
561                                 
562                         //String binding = getBindingFromPrimitiveType(atype);
563                         TypeEntry binding = this.base.getTypeEntry(atype);
564                         if (i > 0)
565                                 fw.writer.print(",");
566                         if (defaultValue != null)
567                                 fw.writer.print("a"+(i)+"!= null ? "+ getValueGetterMethod(binding,"a"+(i++)) + " : " +defaultValue);
568                         else
569                                 fw.writer.print(getValueGetterMethod(binding,"a"+(i++)));
570                 }
571                 fw.writer.println("};");
572                 fw.writer.println("         graph.claimLiteral(element.getData(),"+relationName+", value, "+arrayBinding+");");
573                 fw.writer.println("      }");
574                 
575         }
576         
577                 
578         IDProvider provider;
579         @Override
580         public void handleElement(SchemaObject elementObj)  {
581                 Element element = elementObj.getElement();
582                 
583                 String name = getName(elementObj);//topLevelElement.getName();
584                 String className = name;
585                 
586                 FileWriter fw = new FileWriter();
587                 try {
588                         fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));
589                 } catch (IOException e) {
590                         throw new RuntimeException(e);
591                 }
592                 writers.put(elementObj, fw);
593                 boolean isList = false;
594                 
595                 Inheritance inheritance = this.base.getInheritance(elementObj); 
596                 
597                 provider = this.base.getIDProvider(element);
598                 List<IDReference> references = this.base.getIDReferences(element);
599                 UnrecognizedChildElement unknownChildElement = this.base.getUnknown(element);
600
601                 List<String> intrerfaces = new ArrayList<String>();
602                 if (references.size() > 0)
603                         intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser");
604                 if (unknownChildElement != null)
605                         intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser");
606
607                 createClassHeader(fw.writer, isList);
608                 writeClass(fw.writer,false, element.getName(), className, inheritance.baseClass, intrerfaces);
609                 writeIDProvider(fw.writer);
610                 fw.writer.println("   @Override");
611                 fw.writer.println("   public Resource create(WriteGraph graph, ParserElement element) throws DatabaseException{");
612                 fw.writer.println("      Layer0 L0 = Layer0.getInstance(graph);");
613                 fw.writer.println("      "+getOntologyImport());
614                 if (!isList) {
615                 fw.writer.println("      Resource res = graph.newResource();");
616                 fw.writer.println("      graph.claim(res, L0.InstanceOf, "+ontShort+name+");");
617                 } else {
618                 fw.writer.println("      Resource res = ListUtils.create(graph, "+ontShort+name+", Collections.EMPTY_LIST);");
619                 }
620                 fw.writer.println("      return res;");
621                 fw.writer.println("   }");
622                 fw.writer.println();
623                 
624                 fw.writer.println("   @Override");
625                 fw.writer.println("   public boolean connectParent(WriteGraph graph, ParserElement parent, ParserElement element) throws DatabaseException{");
626                 fw.writer.println("      "+getOntologyImport());
627                 fw.writer.println("      graph.claim(parent.getData(), "+this.ontShort+getName(elementObj,"has")+", element.getData());");
628                 fw.writer.println("      return true;");
629                 fw.writer.println("   }");
630                 fw.writer.println();
631                 
632                 fw.writer.println("   @Override");
633                 fw.writer.println("   public void configure(WriteGraph graph, Deque<ParserElement> parents, ParserElement element) throws DatabaseException {");
634                 if (inheritance.type == InheritanceType.ComplexType) {
635                 fw.writer.println("      super.configure(graph,parents,element);");
636                 }
637                 fw.writer.println("      Layer0 L0 = Layer0.getInstance(graph);");
638                 fw.writer.println("      XMLResource XML = XMLResource.getInstance(graph);");
639                 fw.writer.println("      "+getOntologyImport());
640                 
641                 LocalComplexType complexType = element.getComplexType();
642                 LocalSimpleType simpleType = element.getSimpleType();
643                 
644                 if (complexType != null) {
645                         SchemaObject obj = this.base.getComplexType(complexType);
646                         this.base.handleElementComplexTypeAttributes(obj);
647                 } 
648                 fw.writer.println("   }");
649                 
650                 if (inheritance.type == InheritanceType.AtomicType) {
651                 fw.writer.println();
652                 fw.writer.println("   @Override");
653                 fw.writer.println("   public void configure(WriteGraph graph, ParserElement element, java.lang.String string) throws DatabaseException {");
654                 fw.writer.println("      graph.claimValue(element.getData(), "+getValueGetter(inheritance.atomicType,"string")+", "+inheritance.atomicType.binding+");");
655                 fw.writer.println("   }");
656                 }
657 //              if (simpleType != null) {
658 //                      SchemaObject obj = simpleTypes.get(simpleType);
659 //                      handleElementSimpleTypeAttributes(obj);
660 //              }
661                 
662                 
663                 StringWriter stringWriter = new StringWriter();
664                 fw.delayedWriter = new PrintWriter(stringWriter);
665                 StringWriter stringWriter2 = new StringWriter();
666                 fw.delayedWriter2 = new PrintWriter(stringWriter2);
667                 
668                 fw.writer.println("   public " + className + "() {");
669                 fw.writer.println("      super();");
670                 
671                 if (complexType != null) {
672                         SchemaObject obj = this.base.getComplexType(complexType);
673                         this.base.handleComplexTypeExtension(obj);
674                 } else if (simpleType != null) {
675                         
676                 }
677                 
678                 fw.writer.println("   }");
679                 
680                 fw.writer.println("   @Override");
681                 fw.writer.println("   public boolean connectChild(WriteGraph graph, ParserElement element, ParserElement child) throws DatabaseException{");
682                 fw.writer.println("      "+getOntologyImport());
683                 
684                 if (stringWriter.getBuffer().length() > 0) {
685                         fw.writer.write(stringWriter.toString());
686                 }
687                 if (inheritance.type == InheritanceType.ComplexType) {
688                 fw.writer.println("      return super.connectChild(graph,element,child);");     
689                 } else {
690                 fw.writer.println("      return false;");
691                 }
692                 fw.writer.println("   }");
693                 fw.writer.println();
694                 
695                 if (stringWriter2.getBuffer().length() > 0) {
696                         fw.writer.write(stringWriter2.toString());
697                 }
698                 
699                 stringWriter = null;
700                 fw.delayedWriter.close();
701                 fw.delayedWriter = null;
702                 stringWriter2 = null;
703                 fw.delayedWriter2.close();
704                 fw.delayedWriter2 = null;
705                 
706                 writeIDReferences(fw.writer,name, references);
707                 writeUnknownChild(fw.writer,name,unknownChildElement);
708
709                 fw.writer.println("}");
710                 fw.writer.println();
711                 fw.writer.flush();
712                 fw.writer.close();
713                 fw.writer = null;
714                 writers.remove(elementObj);
715                 provider = null;
716                 
717                 ruleClassNames.add(converter.getPluginName()+"."+elementPackageName+"."+name);
718         }
719
720         
721         private void writeIDProvider(PrintWriter writer) {
722                 if (provider != null) {
723                 writer.println("   java.lang.String idProviderValue = null;");
724                 writer.println();
725                 writer.println("   @Override");
726                 writer.println("   public java.lang.String getID() {");
727                 writer.println("        java.lang.String s = idProviderValue;");
728                 writer.println("        idProviderValue = null;");
729                 writer.println("        return s;");
730                 writer.println("   }");
731                 writer.println();
732                 if (provider.getPriority() != null) {
733                 writer.println("   @Override");
734                 writer.println("   public int idPriority() {");
735                 writer.println("        return " + provider.getPriority().intValue()+";");
736                 writer.println("   }"); 
737                 }
738                 }
739         }
740         
741         private void writeIDReferences(PrintWriter writer,String name, List<IDReference> references) {
742                 if (references.size() > 0) {
743                 writer.println("   @Override");
744                 writer.println("   public boolean connectReferences(WriteGraph graph, ParserElement element, java.util.Map<java.lang.String, ParserElement> map) throws DatabaseException {");
745                 writer.println("      "+getOntologyImport());
746                 writer.println("      boolean result = true;");
747                 for (IDReference ref : references) {
748                 writer.println("      {");
749                 writer.println("         Attribute a = element.getAttribute(\"" + ref.getIDSource().getName() +"\");");
750                 writer.println("         if (a != null) {");
751                 writer.println("            ParserElement refEle = map.get(a.value);");
752                 writer.println("            if (refEle != null) {");
753                 writer.println("               Resource ref = refEle.getData();");
754                 writer.println("               graph.claim(element.getData(), "+ontShort+name+"_"+ref.getReference().getName()+", ref);");
755                 writer.println("            } else {");
756                 writer.println("               result = false;");
757                 writer.println("            }");
758                 writer.println("         }");
759                 writer.println("      }");
760                 }
761                 writer.println("      return result;");
762                 writer.println("   }");
763                 writer.println();
764                 }
765         }
766         
767         private void writeUnknownChild(PrintWriter writer,String name, UnrecognizedChildElement unknownChildElement) {
768                 if (unknownChildElement == null)
769                         return;
770                 
771                 writer.println("   @Override");
772                 writer.println("   public void configureChild(WriteGraph graph, Deque<ParserElement> parents, ParserElement element, ParserElement child) throws DatabaseException {");
773                 writer.println("    " + unknownChildElement.getJavaMethod());
774                 writer.println("   }");
775                 writer.println();
776                 
777         }
778         
779         @Override
780         public String getBaseClass(ObjectType type) {
781                 return "org.simantics.xml.sax.base.XMLElementNamedChildParserBase";
782         }
783         
784         protected void createClassHeader(PrintWriter writer, boolean isList) {
785                 writer.println("package " + converter.getPluginName() +"."+elementPackageName+";");
786                 writer.println();
787                 writer.println("import java.util.Deque;");
788                 writer.println("import org.simantics.databoard.Bindings;");
789                 writer.println("import org.simantics.db.Resource;");
790                 writer.println("import org.simantics.db.WriteGraph;");
791                 writer.println("import org.simantics.db.exception.DatabaseException;");
792                 writer.println("import org.simantics.xml.sax.base.Attribute;");
793                 writer.println("import org.simantics.xml.sax.base.ParserElement;");
794                 writer.println("import org.simantics.xml.sax.ontology.XMLResource;");
795                 if (!isList) {
796                 writer.println("import org.simantics.layer0.Layer0;");
797             } else {
798             writer.println("import java.util.Collections;");
799                 writer.println("import org.simantics.db.common.utils.ListUtils;");
800                 }
801                 writer.println();
802         }
803         
804 }