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