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).resolveDependencies(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(" }");
104 mainWriter.println();
105 if (converter.getSubConverters().size() > 0) {
106 mainWriter.println(" public void addDependencies(org.simantics.db.Session session, java.util.Map<String,XMLWriter> map) throws DatabaseException {");
107 for (SchemaConverter sc : converter.getSubConverters()) {
108 String s = sc.className;
109 if (s.endsWith("Ontology"))
110 s = s.substring(0,s.length()-"Ontology".length());
112 mainWriter.println(" {");
113 mainWriter.println(" XMLWriter parser = new "+s+"(session);");
114 mainWriter.println(" if (!map.containsKey(parser.getSchemaURI())) {");
115 mainWriter.println(" map.put(parser.getSchemaURI(), parser);");
116 mainWriter.println(" parser.addDependencies(session,map);");
117 mainWriter.println(" } else {");
118 mainWriter.println(" parser = map.get(parser.getSchemaURI());");
119 mainWriter.println(" }");
120 mainWriter.println(" add(parser);");
121 mainWriter.println(" }");
123 mainWriter.println(" }");
125 mainWriter.println(" public XMLWriter resolveDependencies(org.simantics.db.Session session) throws DatabaseException {");
126 mainWriter.println(" super.resolveDependencies(session);");
127 for (SchemaConverter sc : converter.getSubConverters()) {
128 String s = sc.schemaNs;
129 mainWriter.println(" if (!nsPrefixes.containsKey(\""+s+"\")) {");
130 mainWriter.println(" nsPrefixes.put(\""+s+"\", \"ns\"+nsPrefixes.size());");
131 mainWriter.println(" }");
133 mainWriter.println(" return this;");
134 mainWriter.println(" }");
136 mainWriter.println("}");
138 mainWriter.println();
144 protected String getPackagePostFix() {
149 // protected void handle(TopLevelAttribute topLevelAttribute) {
154 public String getBaseClass(ObjectType type) {
155 return "org.simantics.xml.sax.base.XMLElementNamedChildWriterBase";
159 public void handleSimpleType(SchemaObject parent, SchemaObject simpleTypeObj) {
163 public void handle(SchemaObject parent, NamedGroup attribute) {
164 // TODO Auto-generated method stub
169 public void handleComplexType(SchemaObject complexTypeObj) {
170 ComplexType topLevelComplexType = complexTypeObj.getComplexType();
172 String name = getName(complexTypeObj);
174 String className = name;//"_"+name;
176 FileWriter fw = new FileWriter();
178 fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));
179 } catch (IOException e) {
180 throw new RuntimeException(e);
182 writers.put(complexTypeObj, fw);
184 // String baseClass = getBaseClass(ObjectType.COMPLEX_TYPE);
186 // boolean inherited = false;
188 // QName type = getComplexTypeBase(topLevelComplexType);
189 // if (type != null && !type.getNamespaceURI().equals("http://www.w3.org/2001/XMLSchema")) {
190 // SchemaObject obj = complexTypeName.get(type.getLocalPart());
191 //// if (obj == null)
192 //// obj = simpleTypeName.get(type.getLocalPart());
193 // if (obj != null) {
194 // baseClass = getName(obj);
198 Inheritance inheritance = base.getInheritance(complexTypeObj);
200 provider = base.getIDProvider(topLevelComplexType);
201 // List<IDReference> references = getIDReferences(topLevelComplexType);
202 // UnrecognizedChildElement unknownChildElement = getUnknown(topLevelComplexType);
204 // List<String> intrerfaces = new ArrayList<String>();
205 // if (references.size() > 0)
206 // intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser");
207 // if (unknownChildElement != null)
208 // intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser");
210 createClassHeader(fw.writer);
211 writeClass(fw.writer,false, topLevelComplexType.getName(), className, inheritance.baseClass, Collections.<String>emptyList());
213 // writeIDProvider(fw.writer);
215 fw.writer.println(" @Override");
216 fw.writer.println(" public Resource getType(ReadGraph graph) throws DatabaseException {");
217 fw.writer.println(" "+getOntologyImport());
218 fw.writer.println(" return "+ontShort+name+";");
219 fw.writer.println(" }");
222 // fw.writer.println(" @Override");
223 // fw.writer.println(" public Resource create(WriteGraph graph, ParserElement element) throws DatabaseException{");
224 // fw.writer.println(" Layer0 L0 = Layer0.getInstance(graph);");
225 // fw.writer.println(" "+getOntologyImport());
227 // fw.writer.println(" Resource res = graph.newResource();");
228 // fw.writer.println(" graph.claim(res, L0.InstanceOf, "+ontShort+name+");");
230 // fw.writer.println(" Resource res = ListUtils.create(graph, "+ontShort+name+", Collections.EMPTY_LIST);");
232 // fw.writer.println(" return res;");
233 // fw.writer.println(" }");
234 // fw.writer.println();
236 // fw.writer.println(" @Override");
237 // fw.writer.println(" public boolean connectParent(WriteGraph graph, ParserElement parent, ParserElement element) throws DatabaseException{");
238 // fw.writer.println(" "+getOntologyImport());
239 // fw.writer.println(" graph.claim(parent.getData(), "+this.ontShort+getName(complexTypeObj,"has")+", element.getData());");
240 // fw.writer.println(" return true;");
241 // fw.writer.println(" }");
242 // fw.writer.println();
244 StringWriter stringWriter = new StringWriter();
245 fw.delayedWriter = new PrintWriter(stringWriter);
246 StringWriter stringWriter2 = new StringWriter();
247 fw.delayedWriter2 = new PrintWriter(stringWriter2);
249 fw.writer.println(" public " + className + "(ReadGraph graph) {");
250 fw.writer.println(" super(graph);");
251 fw.writer.println(" "+getOntologyImport());
253 base.handleComplexTypeExtension(complexTypeObj);
255 fw.writer.println(" }");
257 fw.writer.println(" @Override");
258 fw.writer.println(" public void children(ReadGraph graph, WriterElement instance, java.util.Set<org.simantics.db.Resource> result) throws XMLStreamException, DatabaseException {");
259 fw.writer.println(" "+getOntologyImport());
261 if (stringWriter.getBuffer().length() > 0) {
262 fw.writer.write(stringWriter.toString());
264 if (inheritance.type == InheritanceType.ComplexType)
265 fw.writer.println(" super.children(graph,instance,result);");
266 fw.writer.println(" }");
269 if (stringWriter2.getBuffer().length() > 0) {
270 fw.writer.write(stringWriter2.toString());
274 fw.delayedWriter.close();
275 fw.delayedWriter=null;
276 stringWriter2 = null;
277 fw.delayedWriter2.close();
278 fw.delayedWriter2 = null;
280 fw.writer.println(" @Override");
281 fw.writer.println(" public void attributes(ReadGraph graph, WriterElement instance, Collection<Statement> attributes, XMLStreamWriter writer) throws XMLStreamException, DatabaseException{");
282 if (inheritance.type == InheritanceType.ComplexType) {
283 fw.writer.println(" super.attributes(graph,instance,attributes,writer);");
285 fw.writer.println(" "+getOntologyImport());
286 fw.writer.println(" for (Statement attribute : attributes) {");
287 base.handleComplexTypeAttributes(complexTypeObj);
288 base.handleExtensionAttributes(complexTypeObj);
289 fw.writer.println(" }");
290 fw.writer.println(" }");
292 if (inheritance.type == InheritanceType.AtomicType) {
294 fw.writer.println(" @Override");
295 fw.writer.println(" public void characters(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) throws XMLStreamException, DatabaseException {");
296 fw.writer.println(" writer.writeCharacters("+inheritance.atomicType.getToString("graph.getValue(instance.getResource(),"+inheritance.atomicType.binding+")")+");");
297 fw.writer.println(" }");
300 // writeIDReferences(fw.writer,name, references);
301 // writeUnknownChild(fw.writer,name,unknownChildElement);
303 fw.writer.println("}");
308 writers.remove(complexTypeObj);
313 protected void createReferenceIndicator(SchemaObject parent, RefType referenceType, String refName, String objectName,
314 String primaryClassName, String secondaryClassName, boolean useElementList, boolean useOriginalList) {
315 FileWriter fw = getWriter(parent);
316 if (referenceType == RefType.Type) {
317 // create internal class for handling the element and child attachment
318 secondaryClassName = getName(parent) +"_" +objectName;
319 if (objectName.equals(refName))
320 fw.writer.println(" addRelationWriter("+ontShort+ getName(parent)+"_has"+refName +", "+secondaryClassName+".class);");
321 else // FIXME : type name may not be correct
322 fw.writer.println(" addRelationTypeWriter("+ontShort+ getName(parent)+"_has"+refName +", " +ontShort+primaryClassName +", "+secondaryClassName+".class);");
323 fw.delayedWriter2.println(" public static class " + secondaryClassName +" extends " + primaryClassName +"{");
324 fw.delayedWriter2.println(" public "+ secondaryClassName +"(ReadGraph graph){");
325 fw.delayedWriter2.println(" super(graph);");
326 fw.delayedWriter2.println(" }");
327 fw.delayedWriter2.println(" ");
328 fw.delayedWriter2.println(" @Override");
329 fw.delayedWriter2.println(" public java.lang.String getElementId() {");
330 fw.delayedWriter2.println(" return \"" + refName +"\";");
331 fw.delayedWriter2.println(" }");
332 fw.delayedWriter2.println(" }");
333 } else { //referenceType == RefType.Reference
334 fw.writer.println(" addWriter("+primaryClassName+".class);");
335 if (!primaryClassName.equals(secondaryClassName))
336 fw.writer.println(" addWriter("+secondaryClassName+".class);");
338 // fw.delayedWriter.println(" if (child.getElementParser() instanceof "+refClassName+"){");
339 // fw.delayedWriter.println(" graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+ref + ", child.getData());");
340 if (useElementList) {
342 // element type specific list
343 fw.delayedWriter.println(" {");
344 fw.delayedWriter.println(" org.simantics.db.Resource list = graph.getPossibleObject(instance.getResource(),"+ontShort+getName(parent)+"_has"+refName + "_List);");
345 fw.delayedWriter.println(" if (list != null) {");
346 fw.delayedWriter.println(" java.util.List<org.simantics.db.Resource> l = org.simantics.db.common.utils.ListUtils.toList(graph, list);");
347 fw.delayedWriter.println(" result.addAll(l);");
348 fw.delayedWriter.println(" } else {");
349 fw.delayedWriter.println(" result.addAll(graph.getObjects(instance.getResource(), "+ontShort+getName(parent)+"_has"+refName + "));");
350 fw.delayedWriter.println(" }");
351 fw.delayedWriter.println(" }");
353 fw.delayedWriter.println(" result.addAll(graph.getObjects(instance.getResource(), "+ontShort+getName(parent)+"_has"+refName + "));");
355 // if (useOriginalList(parent, indicator,element, reference, ref, refType)) {
357 // fw.delayedWriter.println(" {");
358 // fw.delayedWriter.println(" XMLResource XML = XMLResource.getInstance(graph);");
359 // fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");
360 // fw.delayedWriter.println(" if (list == null) {");
361 // fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
362 // fw.delayedWriter.println(" graph.claim(element.getData(), XML.hasOriginalElementList,list);");
363 // fw.delayedWriter.println(" } else {");
364 // fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
365 // fw.delayedWriter.println(" }");
366 // fw.delayedWriter.println(" }");
369 // fw.delayedWriter.println(" return true;");
370 // fw.delayedWriter.println(" }");
375 protected void createPrimitiveIndicator(SchemaObject parent, String refName, TypeEntry typeEntry, QName typeName) {
376 FileWriter fw = getWriter(parent);
377 String ontologyClassName = converter.getOntologyClassName(typeName.getNamespaceURI());
378 String typeURI = ontologyClassName != null ? ontologyClassName + ".URIs." + getName(base.getSimpleType(typeName)) : "null";
380 fw.writer.println(" addRelationWriter("+ ontShort +getName(parent) + "_has"+refName+", "+getName(parent) +"_" +refName+".class);");
382 fw.delayedWriter2.println(" public static class " + getName(parent) +"_" +refName+" extends org.simantics.xml.sax.base.ValueElementWriter {");
383 fw.delayedWriter2.println(" public "+ getName(parent) +"_" +refName +"(){");
384 fw.delayedWriter2.println(" super(\""+refName+"\", " + typeURI + ", " + typeEntry.binding+");");
385 fw.delayedWriter2.println(" }\n");
386 fw.delayedWriter2.println(" @Override");
387 fw.delayedWriter2.println(" public java.lang.String decode(java.lang.Object value) {");
388 fw.delayedWriter2.println(" return " + typeEntry.stringPrefix + "(" + typeEntry.javaType + ")value" + typeEntry.stringPostfix + ";");
389 fw.delayedWriter2.println(" }");
390 fw.delayedWriter2.println(" }");
394 protected void createElementIndicator(SchemaObject parent, boolean useElementList, String refName, String className,
395 boolean useOriginalList) {
396 FileWriter fw = getWriter(parent);
398 fw.writer.println(" addTypeWriter("+ ontShort+className +", "+className+".class);");
400 // fw.writer.println(" addWriter("+className+".class);");
402 // fw.delayedWriter.println(" if (child.getElementParser() instanceof "+className+"){");
403 // fw.delayedWriter.println(" graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+ref + ", child.getData());");
404 if (useElementList) {
406 // element type specific list
407 fw.delayedWriter.println(" {");
408 fw.delayedWriter.println(" org.simantics.db.Resource list = graph.getPossibleObject(instance.getResource(),"+ontShort+getName(parent)+"_has"+refName + "_List);");
409 fw.delayedWriter.println(" if (list != null) {");
410 fw.delayedWriter.println(" java.util.List<org.simantics.db.Resource> l = org.simantics.db.common.utils.ListUtils.toList(graph, list);");
411 fw.delayedWriter.println(" result.addAll(l);");
412 fw.delayedWriter.println(" } else {");
413 fw.delayedWriter.println(" result.addAll(graph.getObjects(instance.getResource(), "+ontShort+getName(parent)+"_has"+refName + "));");
414 fw.delayedWriter.println(" }");
415 fw.delayedWriter.println(" }");
417 fw.delayedWriter.println(" result.addAll(graph.getObjects(instance.getResource(), "+ontShort+getName(parent)+"_has"+refName + "));");
419 // if (useOriginalList(parent, indicator,element, reference, ref, new QName(obj.getName()))) {
421 // fw.delayedWriter.println(" {");
422 // fw.delayedWriter.println(" XMLResource XML = XMLResource.getInstance(graph);");
423 // fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");
424 // fw.delayedWriter.println(" if (list == null) {");
425 // fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
426 // fw.delayedWriter.println(" graph.claim(element.getData(), XML.hasOriginalElementList,list);");
427 // fw.delayedWriter.println(" } else {");
428 // fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
429 // fw.delayedWriter.println(" }");
430 // fw.delayedWriter.println(" }");
433 // fw.delayedWriter.println(" return true;");
434 // fw.delayedWriter.println(" }");
439 public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) {
440 // generates overriding method that allows writing any element
441 FileWriter fw = getWriter(parent);
442 fw.delayedWriter2.println(" @Override");
443 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{");
444 fw.delayedWriter2.println(" Class<? extends org.simantics.xml.sax.base.XMLElementWriter> writerClass = super.getWriter(graph, writers, child);");
445 fw.delayedWriter2.println(" if (writerClass != null) return writerClass;");
446 fw.delayedWriter2.println(" Resource type = graph.getSingleType(child.instance);");
447 fw.delayedWriter2.println(" org.simantics.xml.sax.base.XMLElementWriter writer = writers.get(type);");
448 fw.delayedWriter2.println(" if (writer != null) return writer.getClass();");
449 fw.delayedWriter2.println(" return null;");
450 fw.delayedWriter2.println(" }");
454 public void handle(SchemaObject parent, Attribute attribute) {
457 String name = attribute.getName();
458 QName primitiveType = attribute.getType();
459 SimpleType simpleType = attribute.getSimpleType();
460 QName ref = attribute.getRef();
467 relationName = ontShort+"has"+base.getName(attribute);
469 relationName = ontShort+getName(parent)+"_has"+base.getName(attribute);
471 else if (ref != null && parent != null) {
472 attrName = ref.getLocalPart();
473 relationName = ontShort+getName(parent)+"_has"+base.getName(ref);
475 Attribute referred = base.getRefAttribute(ref);
476 if (referred != null) {
477 primitiveType = referred.getType();
478 simpleType = referred.getSimpleType();
479 if (ref.getNamespaceURI() != null && !ref.getNamespaceURI().equals(this.converter.schemaNs))
480 ns = ref.getNamespaceURI();
484 throw new RuntimeException();
486 boolean isReference = false;
487 if (provider!= null && provider.getAttribute().getName().equals(attrName))
490 FileWriter fw = getWriter(parent);
491 if (primitiveType != null) {
493 //String binding = getBindingFromPrimitiveType(primitiveType);
494 TypeEntry binding = base.getTypeEntry(primitiveType);
496 if (binding != null) {
498 writeAttribute(fw, ns, attrName, relationName, binding, isReference);
500 writeAttribute(fw, attrName, relationName, binding, isReference);
503 if (simpleType == null) {
504 SchemaObject simpleTypeObj = base.getSimpleType(primitiveType);
505 if (simpleTypeObj != null)
506 simpleType = simpleTypeObj.getSimpleType();
511 if (simpleType != null) {
512 org.w3._2001.xmlschema.List list = simpleType.getList();
514 TypeEntry binding = base.getTypeEntry(new QName(SchemaConversionBase.SCHEMA_NS, "string"));
515 writeAttribute(fw, attrName, relationName, binding, isReference);
517 Restriction restriction = simpleType.getRestriction();
518 if (restriction == null)
519 throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart()+ ", SimpleType restriction is unset");
520 QName base = restriction.getBase();
523 //String binding = getBindingFromPrimitiveType(base);
524 TypeEntry binding = this.base.getTypeEntry(base);
525 if (base.getNamespaceURI() != null)
526 writeAttribute(fw, base.getNamespaceURI(), attrName, relationName, binding, isReference);
528 writeAttribute(fw, attrName, relationName, binding, isReference);
531 // TODO : using default String attribute should be configured with rules.
532 //throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart());
533 fw.writer.println(" //FIXME: Cannot resolve type for Attribute " + attrName + " Using default type String");
534 //writeAttribute(fw, attrName, relationName, "STRING", isReference);
535 writeAttribute(fw, attrName, relationName, base.getTypeEntry("string"), isReference);
539 private void writeAttribute(FileWriter fw, String attrName, String relationName, TypeEntry binding, boolean isReference) {
540 fw.writer.println(" {");
541 fw.writer.println(" if (attribute.getPredicate().equals("+relationName+")) {");
542 fw.writer.println(" writer.writeAttribute(\""+attrName+"\", " + binding.getToString("graph.getValue(attribute.getObject(),"+binding.binding+")")+");");
543 // fw.writer.println(" graph.claimLiteral(element.getData(),"+relationName+","+getValueGetterMethod(binding,"a")+", "+binding.binding+");");
545 // fw.writer.println(" idProviderValue = a.getValue();");
546 fw.writer.println(" }");
547 fw.writer.println(" }");
550 private void writeAttribute(FileWriter fw, String ns, String attrName, String relationName, TypeEntry binding, boolean isReference) {
551 fw.writer.println(" {");
552 fw.writer.println(" if (attribute.getPredicate().equals("+relationName+")) {");
553 fw.writer.println(" writer.writeAttribute(\""+ns+"\",\""+attrName+"\", " + binding.getToString("graph.getValue(attribute.getObject(),"+binding.binding+")")+");");
554 // fw.writer.println(" graph.claimLiteral(element.getData(),"+relationName+","+getValueGetterMethod(binding,"a")+", "+binding.binding+");");
556 // fw.writer.println(" idProviderValue = a.getValue();");
557 fw.writer.println(" }");
558 fw.writer.println(" }");
562 public void handleAttributes(SchemaObject simpleTypeObj) {
563 SchemaObject parent = simpleTypeObj.getParent();
564 FileWriter fw = getWriter(parent);
566 SimpleType simpleType = simpleTypeObj.getSimpleType();
567 Restriction restriction = simpleType.getRestriction();
568 if (restriction == null)
569 throw new RuntimeException("Cannot resolve type for Element " + getName(parent));
570 QName base = restriction.getBase();
573 //String binding = getBindingFromPrimitiveType(base);
574 TypeEntry binding = this.base.getTypeEntry(base);
576 fw.writer.println(" @Override");
577 fw.writer.println(" public void characters(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) throws XMLStreamException, DatabaseException {");
578 fw.writer.println(" writer.writeCharacters("+ binding.getToString("graph.getValue(attribute.getObject(),"+binding.binding+")")+");");
579 // fw.writer.println(" graph.claimValue(element.getData(),"+getValueGetter(binding)+", "+binding.binding +");");
580 fw.writer.println(" }");
584 public void handle(SchemaObject parent, AttributeGroup attribute) {
585 if (parent != null) {
586 FileWriter fw = getWriter(parent);
587 NamedAttributeGroup group = this.base.getAttributeGroup(attribute.getRef());
588 fw.writer.println(commentTag+" AttributeGroup " + group.getName());
589 SchemaObject obj = new SchemaObject(base,parent,attribute);
590 for (Annotated annotated : group.getAttributeOrAttributeGroup()) {
591 if (annotated instanceof Attribute) {
592 //handle("AttributeGroups_"+group.getName(),(Attribute)annotated);
593 handle(obj,(Attribute)annotated);
594 } else if (annotated instanceof AttributeGroup) {
595 //handle("AttributeGroups_"+group.getName(),(AttributeGroup)annotated);
596 handle(obj,(AttributeGroup)annotated);
599 fw.writer.println(commentTag+" End of AttributeGroup " + group.getName());
605 public void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes) {
606 FileWriter fw = getWriter(parent);
607 QName type = new QName(SchemaConversionBase.CONVERSION_NS, composition.getType());
608 TypeEntry typeEntry = this.base.getTypeEntry(type);
609 String arrayBinding = typeEntry.binding;//getBindingFromPrimitiveType(type);
610 String javaType = typeEntry.javaType;//getJavaTypeFromPrimitiveType(type);
611 String name = composition.getName();
615 relationName = ontShort+"has"+name;
617 relationName = ontShort+getName(parent)+"_has"+name;
619 throw new RuntimeException();
621 fw.writer.println(" if (attribute.getPredicate().equals("+relationName+")) {");
622 fw.writer.println(" "+javaType+" value = ("+javaType+")graph.getValue(attribute.getObject(),"+arrayBinding+");");
623 //fw.writer.println(" writer.writeAttribute("+attrName+", graph.getValue(attribute.getObject(),"+binding.binding+").toString());");
626 for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute())
627 fw.writer.println(" writer.writeAttribute(\""+a.getName()+"\","+typeEntry.getElementToString("value["+(i++)+"]")+");");
628 //fw.writer.println(" writer.writeAttribute(\""+a.getName()+"\",value["+(i++)+"].toString());");
629 // fw.writer.println(" Attribute a"+(i++)+" = element.getAttribute(\"" +a.getName()+"\");");
630 // fw.writer.print (" "+javaType + " value = new "+javaType+"{");
632 // FIXME : handle optional attributes properly.
633 // for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute()) {
634 // Attribute attribute = ((Attribute)attributes.getRight(a));
635 // //QName atype = getBaseType(attribute);
636 // QName atype = getPrimitiveType(attribute);
637 // String defaultValue = attribute.getDefault();
638 // if (defaultValue == null)
639 // defaultValue = getDefaultValue(atype);
641 // //String binding = getBindingFromPrimitiveType(atype);
642 // TypeEntry binding = getTypeEntry(atype);
644 // fw.writer.print(",");
645 // if (defaultValue != null)
646 // fw.writer.print("a"+(i)+"!= null ? "+ getValueGetterMethod(binding,"a"+(i++)) + " : " +defaultValue);
648 // fw.writer.print(getValueGetterMethod(binding,"a"+(i++)));
650 // fw.writer.println("};");
651 // fw.writer.println(" graph.claimLiteral(element.getData(),"+relationName+", value, "+arrayBinding+");");
652 fw.writer.println(" }");
656 protected String getDefaultValue(QName atype) {
657 Map<String,TypeEntry> types = this.base.typeMap.get(atype.getNamespaceURI());
660 TypeEntry entry = types.get(atype.getLocalPart());
663 return entry.defaultValue;
668 public void handleElement(SchemaObject elementObj) {
669 Element element = elementObj.getElement();
671 String name = getName(elementObj);//topLevelElement.getName();
672 String className = name;
674 FileWriter fw = new FileWriter();
676 fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));
677 } catch (IOException e) {
678 throw new RuntimeException(e);
680 writers.put(elementObj, fw);
681 boolean isList = false;
683 Inheritance inheritance = this.base.getInheritance(elementObj);
685 provider = this.base.getIDProvider(element);
686 List<IDReference> references = this.base.getIDReferences(element);
687 UnrecognizedChildElement unknownChildElement = this.base.getUnknown(element);
689 // List<String> intrerfaces = new ArrayList<String>();
690 // if (references.size() > 0)
691 // intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser");
692 // if (unknownChildElement != null)
693 // intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser");
695 createClassHeader(fw.writer);
696 writeClass(fw.writer,false, element.getName(), className, inheritance.baseClass, Collections.EMPTY_LIST);
697 // writeIDProvider(fw.writer);
698 fw.writer.println(" @Override");
699 fw.writer.println(" public Resource getType(ReadGraph graph) throws DatabaseException {");
700 fw.writer.println(" "+getOntologyImport());
701 fw.writer.println(" return "+ontShort+name+";");
703 // fw.writer.println(" Resource res = graph.newResource();");
704 // fw.writer.println(" graph.claim(res, L0.InstanceOf, "+ontShort+name+");");
706 // fw.writer.println(" Resource res = ListUtils.create(graph, "+ontShort+name+", Collections.EMPTY_LIST);");
708 // fw.writer.println(" return res;");
709 fw.writer.println(" }");
712 // fw.writer.println(" @Override");
713 // fw.writer.println(" public boolean connectParent(WriteGraph graph, ParserElement parent, ParserElement element) throws DatabaseException{");
714 // fw.writer.println(" "+getOntologyImport());
715 // fw.writer.println(" graph.claim(parent.getData(), "+this.ontShort+getName(elementObj,"has")+", element.getData());");
716 // fw.writer.println(" return true;");
717 // fw.writer.println(" }");
718 // fw.writer.println();
719 LocalComplexType complexType = element.getComplexType();
720 LocalSimpleType simpleType = element.getSimpleType();
722 fw.writer.println(" @Override");
723 fw.writer.println(" public void attributes(ReadGraph graph, WriterElement instance, Collection<Statement> attributes, XMLStreamWriter writer) throws XMLStreamException, DatabaseException{");
724 if (inheritance.type == InheritanceType.ComplexType) {
725 fw.writer.println(" super.attributes(graph,instance,attributes,writer);");
727 fw.writer.println(" "+getOntologyImport());
728 fw.writer.println(" for (Statement attribute : attributes) {");
729 if (complexType != null) {
730 SchemaObject obj = this.base.getComplexType(complexType);
731 this.base.handleElementComplexTypeAttributes(obj);
733 fw.writer.println(" }");
734 fw.writer.println(" }");
737 // fw.writer.println(" @Override");
738 // fw.writer.println(" public void configure(WriteGraph graph, Deque<ParserElement> parents, ParserElement element) throws DatabaseException {");
739 // if (inhertiance.type == InheritanceType.ComplexType) {
740 // fw.writer.println(" super.configure(graph,parents,element);");
742 // fw.writer.println(" "+getOntologyImport());
744 // LocalComplexType complexType = element.getComplexType();
745 // LocalSimpleType simpleType = element.getSimpleType();
747 // if (complexType != null) {
748 // SchemaObject obj = complexTypes.get(complexType);
749 // handleElementComplexTypeAttributes(obj);
751 // fw.writer.println(" }");
753 if (inheritance.type == InheritanceType.AtomicType) {
755 // fw.writer.println(" @Override");
756 // fw.writer.println(" public void configure(WriteGraph graph, ParserElement element, java.lang.String string) throws DatabaseException {");
757 // fw.writer.println(" graph.claimValue(element.getData(), "+getValueGetter(inhertiance.atomicType,"string")+", "+inhertiance.atomicType.binding+");");
758 // fw.writer.println(" }");
759 fw.writer.println(" @Override");
760 fw.writer.println(" public void characters(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) throws XMLStreamException, DatabaseException {");
761 fw.writer.println(" writer.writeCharacters("+inheritance.atomicType.getToString("graph.getValue(instance.getResource(),"+inheritance.atomicType.binding+")")+");");
762 // fw.writer.println(" graph.claimValue(element.getData(),"+getValueGetter(binding)+", "+binding.binding +");");
763 fw.writer.println(" }");
765 // if (simpleType != null) {
766 // SchemaObject obj = simpleTypes.get(simpleType);
767 // handleElementSimpleTypeAttributes(obj);
771 StringWriter stringWriter = new StringWriter();
772 fw.delayedWriter = new PrintWriter(stringWriter);
773 StringWriter stringWriter2 = new StringWriter();
774 fw.delayedWriter2 = new PrintWriter(stringWriter2);
776 fw.writer.println(" public " + className + "(ReadGraph graph) {");
777 fw.writer.println(" super(graph);");
778 fw.writer.println(" "+getOntologyImport());
779 if (complexType != null) {
780 SchemaObject obj = this.base.getComplexType(complexType);
781 this.base.handleComplexTypeExtension(obj);
782 } else if (simpleType != null) {
786 fw.writer.println(" }");
788 fw.writer.println(" @Override");
789 fw.writer.println(" public void children(ReadGraph graph, WriterElement instance, java.util.Set<org.simantics.db.Resource> result) throws XMLStreamException, DatabaseException {");
790 fw.writer.println(" "+getOntologyImport());
792 if (stringWriter.getBuffer().length() > 0) {
793 fw.writer.write(stringWriter.toString());
796 if (inheritance.type == InheritanceType.ComplexType) {
797 fw.writer.println(" super.children(graph,instance,result);");
800 fw.writer.println(" }");
803 if (stringWriter2.getBuffer().length() > 0) {
804 fw.writer.write(stringWriter2.toString());
808 fw.delayedWriter.close();
809 fw.delayedWriter = null;
810 stringWriter2 = null;
811 fw.delayedWriter2.close();
812 fw.delayedWriter2 = null;
814 // writeIDReferences(fw.writer,name, references);
815 // writeUnknownChild(fw.writer,name,unknownChildElement);
817 fw.writer.println("}");
822 writers.remove(elementObj);
825 ruleClassNames.add(converter.getPluginName()+"."+elementPackageName+"."+name);
829 // private void writeIDProvider(PrintWriter writer) {
830 // if (provider != null) {
831 // writer.println(" java.lang.String idProviderValue = null;");
833 // writer.println(" @Override");
834 // writer.println(" public java.lang.String getID() {");
835 // writer.println(" java.lang.String s = idProviderValue;");
836 // writer.println(" idProviderValue = null;");
837 // writer.println(" return s;");
838 // writer.println(" }");
840 // if (provider.getPriority() != null) {
841 // writer.println(" @Override");
842 // writer.println(" public int idPriority() {");
843 // writer.println(" return " + provider.getPriority().intValue()+";");
844 // writer.println(" }");
849 // private void writeIDReferences(PrintWriter writer,String name, List<IDReference> references) {
850 // if (references.size() > 0) {
851 // writer.println(" @Override");
852 // writer.println(" public boolean connectReferences(WriteGraph graph, ParserElement element, java.util.Map<java.lang.String, ParserElement> map) throws DatabaseException {");
853 // writer.println(" "+getOntologyImport());
854 // writer.println(" boolean result = true;");
855 // for (IDReference ref : references) {
856 // writer.println(" {");
857 // writer.println(" Attribute a = element.getAttribute(\"" + ref.getIDSource().getName() +"\");");
858 // writer.println(" if (a != null) {");
859 // writer.println(" ParserElement refEle = map.get(a.value);");
860 // writer.println(" if (refEle != null) {");
861 // writer.println(" Resource ref = refEle.getData();");
862 // writer.println(" graph.claim(element.getData(), "+ontShort+name+"_"+ref.getReference().getName()+", ref);");
863 // writer.println(" } else {");
864 // writer.println(" result = false;");
865 // writer.println(" }");
866 // writer.println(" }");
867 // writer.println(" }");
869 // writer.println(" return result;");
870 // writer.println(" }");
875 // private void writeUnknownChild(PrintWriter writer,String name, UnrecognizedChildElement unknownChildElement) {
876 // if (unknownChildElement == null)
879 // writer.println(" @Override");
880 // writer.println(" public void configureChild(WriteGraph graph, Deque<ParserElement> parents, ParserElement element, ParserElement child) throws DatabaseException {");
881 // writer.println(" " + unknownChildElement.getJavaMethod());
882 // writer.println(" }");
887 protected void createClassHeader(PrintWriter writer) {
888 writer.println("package " + converter.getPluginName() +"."+elementPackageName+";");
890 writer.println("import org.simantics.databoard.Bindings;");
891 writer.println("import org.simantics.db.Resource;");
892 writer.println("import org.simantics.db.ReadGraph;");
893 writer.println("import org.simantics.db.Statement;");
894 writer.println("import org.simantics.db.exception.DatabaseException;");
895 writer.println("import org.simantics.xml.sax.base.WriterElement;");
896 writer.println("import org.simantics.xml.sax.ontology.XMLResource;");
897 writer.println("import java.util.Collection;");
898 writer.println("import javax.xml.stream.XMLStreamException;");
899 writer.println("import javax.xml.stream.XMLStreamWriter;");
901 // writer.println("import org.simantics.layer0.Layer0;");
903 // writer.println("import java.util.Collections;");
904 // writer.println("import org.simantics.db.common.utils.ListUtils;");