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