1 package org.simantics.xml.sax;
4 import java.io.IOException;
5 import java.io.PrintWriter;
6 import java.io.StringWriter;
7 import java.util.Collections;
11 import javax.xml.namespace.QName;
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;
35 public class ExporterGenerator extends JavaGenerator{
37 public ExporterGenerator(SchemaConverter converter, SchemaConversionBase base) {
38 super(converter, base);
41 public void createParser() throws IOException {
44 String importerClassPostfix = "Exporter";
45 String parserClassPostfix = "Writer";
47 importParserDir= new File(converter.getParserDir().getAbsolutePath()+"/"+elementPackageName);
48 if (!importParserDir.exists())
49 importParserDir.mkdirs();
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() +";");
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;");
63 mainWriter.println("public class " + name + importerClassPostfix+" extends AbstractExporter {");
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(" }");
70 mainWriter.println("}");
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() +";");
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;");
87 mainWriter.println("public class " + name + parserClassPostfix+" extends XMLWriter {");
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));");
100 mainWriter.println(" }");
101 mainWriter.println(" });");
102 mainWriter.println(" }");
103 mainWriter.println("}");
105 mainWriter.println();
111 protected String getPackagePostFix() {
116 // protected void handle(TopLevelAttribute topLevelAttribute) {
121 public String getBaseClass(ObjectType type) {
122 return "org.simantics.xml.sax.base.XMLElementNamedChildWriterBase";
126 public void handleSimpleType(SchemaObject parent, SchemaObject simpleTypeObj) {
130 public void handle(SchemaObject parent, NamedGroup attribute) {
131 // TODO Auto-generated method stub
136 public void handleComplexType(SchemaObject complexTypeObj) {
137 ComplexType topLevelComplexType = complexTypeObj.getComplexType();
139 String name = getName(complexTypeObj);
141 String className = name;//"_"+name;
143 FileWriter fw = new FileWriter();
145 fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));
146 } catch (IOException e) {
147 throw new RuntimeException(e);
149 writers.put(complexTypeObj, fw);
151 // String baseClass = getBaseClass(ObjectType.COMPLEX_TYPE);
153 // boolean inherited = false;
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);
165 Inheritance inheritance = base.getInheritance(complexTypeObj);
167 provider = base.getIDProvider(topLevelComplexType);
168 // List<IDReference> references = getIDReferences(topLevelComplexType);
169 // UnrecognizedChildElement unknownChildElement = getUnknown(topLevelComplexType);
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");
177 createClassHeader(fw.writer);
178 writeClass(fw.writer,false, topLevelComplexType.getName(), className, inheritance.baseClass, Collections.<String>emptyList());
180 // writeIDProvider(fw.writer);
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(" }");
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());
194 // fw.writer.println(" Resource res = graph.newResource();");
195 // fw.writer.println(" graph.claim(res, L0.InstanceOf, "+ontShort+name+");");
197 // fw.writer.println(" Resource res = ListUtils.create(graph, "+ontShort+name+", Collections.EMPTY_LIST);");
199 // fw.writer.println(" return res;");
200 // fw.writer.println(" }");
201 // fw.writer.println();
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();
211 StringWriter stringWriter = new StringWriter();
212 fw.delayedWriter = new PrintWriter(stringWriter);
213 StringWriter stringWriter2 = new StringWriter();
214 fw.delayedWriter2 = new PrintWriter(stringWriter2);
216 fw.writer.println(" public " + className + "(ReadGraph graph) {");
217 fw.writer.println(" super(graph);");
218 fw.writer.println(" "+getOntologyImport());
220 base.handleComplexTypeExtension(complexTypeObj);
222 fw.writer.println(" }");
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());
228 if (stringWriter.getBuffer().length() > 0) {
229 fw.writer.write(stringWriter.toString());
231 if (inheritance.type == InheritanceType.ComplexType)
232 fw.writer.println(" super.children(graph,instance,result);");
233 fw.writer.println(" }");
236 if (stringWriter2.getBuffer().length() > 0) {
237 fw.writer.write(stringWriter2.toString());
241 fw.delayedWriter.close();
242 fw.delayedWriter=null;
243 stringWriter2 = null;
244 fw.delayedWriter2.close();
245 fw.delayedWriter2 = null;
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);");
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(" }");
259 if (inheritance.type == InheritanceType.AtomicType) {
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(" }");
267 // writeIDReferences(fw.writer,name, references);
268 // writeUnknownChild(fw.writer,name,unknownChildElement);
270 fw.writer.println("}");
275 writers.remove(complexTypeObj);
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);");
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) {
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(" }");
322 fw.delayedWriter.println(" result.addAll(graph.getObjects(instance.getResource(), "+ontShort+getName(parent)+"_has"+refName + "));");
324 // if (useOriginalList(parent, indicator,element, reference, ref, refType)) {
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(" }");
338 // fw.delayedWriter.println(" return true;");
339 // fw.delayedWriter.println(" }");
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";
349 fw.writer.println(" addRelationWriter("+ ontShort +getName(parent) + "_has"+refName+", "+getName(parent) +"_" +refName+".class);");
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(" }");
363 protected void createElementIndicator(SchemaObject parent, boolean useElementList, String refName, String className,
364 boolean useOriginalList) {
365 FileWriter fw = getWriter(parent);
367 fw.writer.println(" addTypeWriter("+ ontShort+className +", "+className+".class);");
369 // fw.writer.println(" addWriter("+className+".class);");
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) {
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(" }");
386 fw.delayedWriter.println(" result.addAll(graph.getObjects(instance.getResource(), "+ontShort+getName(parent)+"_has"+refName + "));");
388 // if (useOriginalList(parent, indicator,element, reference, ref, new QName(obj.getName()))) {
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(" }");
402 // fw.delayedWriter.println(" return true;");
403 // fw.delayedWriter.println(" }");
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(" }");
423 public void handle(SchemaObject parent, Attribute attribute) {
426 String name = attribute.getName();
427 QName primitiveType = attribute.getType();
428 SimpleType simpleType = attribute.getSimpleType();
429 QName ref = attribute.getRef();
435 relationName = ontShort+"has"+base.getName(attribute);
437 relationName = ontShort+getName(parent)+"_has"+base.getName(attribute);
439 else if (ref != null && parent != null) {
440 attrName = ref.getLocalPart();
441 relationName = ontShort+getName(parent)+"_has"+base.getName(ref);
443 Attribute referred = base.getRefAttribute(ref);
444 if (referred != null) {
445 primitiveType = referred.getType();
446 simpleType = referred.getSimpleType();
450 throw new RuntimeException();
452 boolean isReference = false;
453 if (provider!= null && provider.getAttribute().getName().equals(attrName))
456 FileWriter fw = getWriter(parent);
457 if (primitiveType != null) {
459 //String binding = getBindingFromPrimitiveType(primitiveType);
460 TypeEntry binding = base.getTypeEntry(primitiveType);
462 if (binding != null) {
463 writeAttribute(fw, attrName, relationName, binding, isReference);
466 if (simpleType == null) {
467 SchemaObject simpleTypeObj = base.getSimpleType(primitiveType);
468 if (simpleTypeObj != null)
469 simpleType = simpleTypeObj.getSimpleType();
473 if (simpleType != null) {
474 org.w3._2001.xmlschema.List list = simpleType.getList();
476 TypeEntry binding = base.getTypeEntry(new QName(SchemaConversionBase.SCHEMA_NS, "string"));
477 writeAttribute(fw, attrName, relationName, binding, isReference);
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();
485 //String binding = getBindingFromPrimitiveType(base);
486 TypeEntry binding = this.base.getTypeEntry(base);
487 writeAttribute(fw, attrName, relationName, binding, isReference);
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);
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+");");
504 // fw.writer.println(" idProviderValue = a.getValue();");
505 fw.writer.println(" }");
506 fw.writer.println(" }");
510 public void handleAttributes(SchemaObject simpleTypeObj) {
511 SchemaObject parent = simpleTypeObj.getParent();
512 FileWriter fw = getWriter(parent);
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();
521 //String binding = getBindingFromPrimitiveType(base);
522 TypeEntry binding = this.base.getTypeEntry(base);
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(" }");
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);
547 fw.writer.println(commentTag+" End of AttributeGroup " + group.getName());
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();
563 relationName = ontShort+"has"+name;
565 relationName = ontShort+getName(parent)+"_has"+name;
567 throw new RuntimeException();
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());");
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+"{");
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);
589 // //String binding = getBindingFromPrimitiveType(atype);
590 // TypeEntry binding = getTypeEntry(atype);
592 // fw.writer.print(",");
593 // if (defaultValue != null)
594 // fw.writer.print("a"+(i)+"!= null ? "+ getValueGetterMethod(binding,"a"+(i++)) + " : " +defaultValue);
596 // fw.writer.print(getValueGetterMethod(binding,"a"+(i++)));
598 // fw.writer.println("};");
599 // fw.writer.println(" graph.claimLiteral(element.getData(),"+relationName+", value, "+arrayBinding+");");
600 fw.writer.println(" }");
604 protected String getDefaultValue(QName atype) {
605 Map<String,TypeEntry> types = this.base.typeMap.get(atype.getNamespaceURI());
608 TypeEntry entry = types.get(atype.getLocalPart());
611 return entry.defaultValue;
616 public void handleElement(SchemaObject elementObj) {
617 Element element = elementObj.getElement();
619 String name = getName(elementObj);//topLevelElement.getName();
620 String className = name;
622 FileWriter fw = new FileWriter();
624 fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));
625 } catch (IOException e) {
626 throw new RuntimeException(e);
628 writers.put(elementObj, fw);
629 boolean isList = false;
631 Inheritance inheritance = this.base.getInheritance(elementObj);
633 provider = this.base.getIDProvider(element);
634 List<IDReference> references = this.base.getIDReferences(element);
635 UnrecognizedChildElement unknownChildElement = this.base.getUnknown(element);
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");
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+";");
651 // fw.writer.println(" Resource res = graph.newResource();");
652 // fw.writer.println(" graph.claim(res, L0.InstanceOf, "+ontShort+name+");");
654 // fw.writer.println(" Resource res = ListUtils.create(graph, "+ontShort+name+", Collections.EMPTY_LIST);");
656 // fw.writer.println(" return res;");
657 fw.writer.println(" }");
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();
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);");
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);
681 fw.writer.println(" }");
682 fw.writer.println(" }");
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);");
690 // fw.writer.println(" "+getOntologyImport());
692 // LocalComplexType complexType = element.getComplexType();
693 // LocalSimpleType simpleType = element.getSimpleType();
695 // if (complexType != null) {
696 // SchemaObject obj = complexTypes.get(complexType);
697 // handleElementComplexTypeAttributes(obj);
699 // fw.writer.println(" }");
701 if (inheritance.type == InheritanceType.AtomicType) {
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(" }");
713 // if (simpleType != null) {
714 // SchemaObject obj = simpleTypes.get(simpleType);
715 // handleElementSimpleTypeAttributes(obj);
719 StringWriter stringWriter = new StringWriter();
720 fw.delayedWriter = new PrintWriter(stringWriter);
721 StringWriter stringWriter2 = new StringWriter();
722 fw.delayedWriter2 = new PrintWriter(stringWriter2);
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) {
734 fw.writer.println(" }");
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());
740 if (stringWriter.getBuffer().length() > 0) {
741 fw.writer.write(stringWriter.toString());
744 if (inheritance.type == InheritanceType.ComplexType) {
745 fw.writer.println(" super.children(graph,instance,result);");
748 fw.writer.println(" }");
751 if (stringWriter2.getBuffer().length() > 0) {
752 fw.writer.write(stringWriter2.toString());
756 fw.delayedWriter.close();
757 fw.delayedWriter = null;
758 stringWriter2 = null;
759 fw.delayedWriter2.close();
760 fw.delayedWriter2 = null;
762 // writeIDReferences(fw.writer,name, references);
763 // writeUnknownChild(fw.writer,name,unknownChildElement);
765 fw.writer.println("}");
770 writers.remove(elementObj);
773 ruleClassNames.add(converter.getPluginName()+"."+elementPackageName+"."+name);
777 // private void writeIDProvider(PrintWriter writer) {
778 // if (provider != null) {
779 // writer.println(" java.lang.String idProviderValue = null;");
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(" }");
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(" }");
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(" }");
817 // writer.println(" return result;");
818 // writer.println(" }");
823 // private void writeUnknownChild(PrintWriter writer,String name, UnrecognizedChildElement unknownChildElement) {
824 // if (unknownChildElement == null)
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(" }");
835 protected void createClassHeader(PrintWriter writer) {
836 writer.println("package " + converter.getPluginName() +"."+elementPackageName+";");
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;");
849 // writer.println("import org.simantics.layer0.Layer0;");
851 // writer.println("import java.util.Collections;");
852 // writer.println("import org.simantics.db.common.utils.ListUtils;");