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 {
43 String parserPackagePostfix = "_exp";
44 String importerClassPostfix = "Exporter";
45 String parserClassPostfix = "Writer";
46 elementPackageName = name+parserPackagePostfix;
48 importParserDir= new File(converter.getParserDir().getAbsolutePath()+"/"+elementPackageName);
49 if (!importParserDir.exists())
50 importParserDir.mkdirs();
53 // Create Importer class
54 File importerFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+importerClassPostfix+".java");
55 PrintWriter mainWriter = createFile(importerFile);
56 mainWriter.println("package " + converter.getPluginName() +";");
58 mainWriter.println("import java.io.File;");
59 mainWriter.println("import org.simantics.db.Resource;");
60 mainWriter.println("import org.simantics.db.Session;");
61 mainWriter.println("import org.simantics.db.exception.DatabaseException;");
62 mainWriter.println("import org.simantics.xml.sax.base.AbstractExporter;");
64 mainWriter.println("public class " + name + importerClassPostfix+" extends AbstractExporter {");
66 mainWriter.println(" public " + name + importerClassPostfix+"(Session session, File file, Resource root) throws DatabaseException {");
67 mainWriter.println(" super(session, file, root);");
68 mainWriter.println(" setXmlWriter(new "+name + parserClassPostfix+"(session));");
69 mainWriter.println(" }");
71 mainWriter.println("}");
77 // Create Parser class
78 File parserFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+parserClassPostfix+".java");
79 mainWriter = createFile(parserFile);
80 mainWriter.println("package " + converter.getPluginName() +";");
82 mainWriter.println("import org.simantics.xml.sax.base.XMLWriter;");
83 mainWriter.println("import org.simantics.db.ReadGraph;");
84 mainWriter.println("import org.simantics.db.Session;");
85 mainWriter.println("import org.simantics.db.exception.DatabaseException;");
86 mainWriter.println("import org.simantics.db.common.request.ReadRequest;");
88 mainWriter.println("public class " + name + parserClassPostfix+" extends XMLWriter {");
90 mainWriter.println(" public " + name + parserClassPostfix+"(Session session) throws DatabaseException {");
91 if (schema.getTargetNamespace() != null)
92 mainWriter.println(" setSchemaURI(\""+schema.getTargetNamespace()+"\");");
93 mainWriter.println(" setOntologyURI(\""+ontologyUri+"\");");
94 mainWriter.println(" session.syncRequest(new ReadRequest() {");
95 mainWriter.println(" @Override");
96 mainWriter.println(" public void run(ReadGraph graph) throws DatabaseException {");
97 mainWriter.println(" setGraph(graph);");
98 for (String s : ruleClassNames) {
99 mainWriter.println(" add(new "+s+"(graph));");
101 mainWriter.println(" }");
102 mainWriter.println(" });");
103 mainWriter.println(" }");
104 mainWriter.println("}");
106 mainWriter.println();
112 // protected void handle(TopLevelAttribute topLevelAttribute) {
117 public String getBaseClass(ObjectType type) {
118 return "org.simantics.xml.sax.base.XMLElementNamedChildWriterBase";
122 public void handleSimpleType(SchemaObject parent, SchemaObject simpleTypeObj) {
126 public void handle(SchemaObject parent, NamedGroup attribute) {
127 // TODO Auto-generated method stub
132 public void handleComplexType(SchemaObject complexTypeObj) {
133 ComplexType topLevelComplexType = complexTypeObj.getComplexType();
135 String name = getName(complexTypeObj);
137 String className = name;//"_"+name;
139 FileWriter fw = new FileWriter();
141 fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));
142 } catch (IOException e) {
143 throw new RuntimeException(e);
145 writers.put(complexTypeObj, fw);
147 // String baseClass = getBaseClass(ObjectType.COMPLEX_TYPE);
149 // boolean inherited = false;
151 // QName type = getComplexTypeBase(topLevelComplexType);
152 // if (type != null && !type.getNamespaceURI().equals("http://www.w3.org/2001/XMLSchema")) {
153 // SchemaObject obj = complexTypeName.get(type.getLocalPart());
154 //// if (obj == null)
155 //// obj = simpleTypeName.get(type.getLocalPart());
156 // if (obj != null) {
157 // baseClass = getName(obj);
161 Inheritance inheritance = base.getInheritance(complexTypeObj);
163 provider = base.getIDProvider(topLevelComplexType);
164 // List<IDReference> references = getIDReferences(topLevelComplexType);
165 // UnrecognizedChildElement unknownChildElement = getUnknown(topLevelComplexType);
167 // List<String> intrerfaces = new ArrayList<String>();
168 // if (references.size() > 0)
169 // intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser");
170 // if (unknownChildElement != null)
171 // intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser");
173 createClassHeader(fw.writer);
174 writeClass(fw.writer,false, topLevelComplexType.getName(), className, inheritance.baseClass, Collections.<String>emptyList());
176 // writeIDProvider(fw.writer);
178 fw.writer.println(" @Override");
179 fw.writer.println(" public Resource getType(ReadGraph graph) throws DatabaseException {");
180 fw.writer.println(" "+getOntologyImport());
181 fw.writer.println(" return "+ontShort+name+";");
182 fw.writer.println(" }");
185 // fw.writer.println(" @Override");
186 // fw.writer.println(" public Resource create(WriteGraph graph, ParserElement element) throws DatabaseException{");
187 // fw.writer.println(" Layer0 L0 = Layer0.getInstance(graph);");
188 // fw.writer.println(" "+getOntologyImport());
190 // fw.writer.println(" Resource res = graph.newResource();");
191 // fw.writer.println(" graph.claim(res, L0.InstanceOf, "+ontShort+name+");");
193 // fw.writer.println(" Resource res = ListUtils.create(graph, "+ontShort+name+", Collections.EMPTY_LIST);");
195 // fw.writer.println(" return res;");
196 // fw.writer.println(" }");
197 // fw.writer.println();
199 // fw.writer.println(" @Override");
200 // fw.writer.println(" public boolean connectParent(WriteGraph graph, ParserElement parent, ParserElement element) throws DatabaseException{");
201 // fw.writer.println(" "+getOntologyImport());
202 // fw.writer.println(" graph.claim(parent.getData(), "+this.ontShort+getName(complexTypeObj,"has")+", element.getData());");
203 // fw.writer.println(" return true;");
204 // fw.writer.println(" }");
205 // fw.writer.println();
207 StringWriter stringWriter = new StringWriter();
208 fw.delayedWriter = new PrintWriter(stringWriter);
209 StringWriter stringWriter2 = new StringWriter();
210 fw.delayedWriter2 = new PrintWriter(stringWriter2);
212 fw.writer.println(" public " + className + "(ReadGraph graph) {");
213 fw.writer.println(" super(graph);");
214 fw.writer.println(" "+getOntologyImport());
216 base.handleComplexTypeExtension(complexTypeObj);
218 fw.writer.println(" }");
220 fw.writer.println(" @Override");
221 fw.writer.println(" public void children(ReadGraph graph, WriterElement instance, java.util.Set<org.simantics.db.Resource> result) throws XMLStreamException, DatabaseException {");
222 fw.writer.println(" "+getOntologyImport());
224 if (stringWriter.getBuffer().length() > 0) {
225 fw.writer.write(stringWriter.toString());
227 if (inheritance.type == InheritanceType.ComplexType)
228 fw.writer.println(" super.children(graph,instance,result);");
229 fw.writer.println(" }");
232 if (stringWriter2.getBuffer().length() > 0) {
233 fw.writer.write(stringWriter2.toString());
237 fw.delayedWriter.close();
238 fw.delayedWriter=null;
239 stringWriter2 = null;
240 fw.delayedWriter2.close();
241 fw.delayedWriter2 = null;
243 fw.writer.println(" @Override");
244 fw.writer.println(" public void attributes(ReadGraph graph, WriterElement instance, Collection<Statement> attributes, XMLStreamWriter writer) throws XMLStreamException, DatabaseException{");
245 if (inheritance.type == InheritanceType.ComplexType) {
246 fw.writer.println(" super.attributes(graph,instance,attributes,writer);");
248 fw.writer.println(" "+getOntologyImport());
249 fw.writer.println(" for (Statement attribute : attributes) {");
250 base.handleComplexTypeAttributes(complexTypeObj);
251 base.handleExtensionAttributes(complexTypeObj);
252 fw.writer.println(" }");
253 fw.writer.println(" }");
255 if (inheritance.type == InheritanceType.AtomicType) {
257 fw.writer.println(" @Override");
258 fw.writer.println(" public void characters(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) throws XMLStreamException, DatabaseException {");
259 fw.writer.println(" writer.writeCharacters("+inheritance.atomicType.getToString("graph.getValue(instance.getResource(),"+inheritance.atomicType.binding+")")+");");
260 fw.writer.println(" }");
263 // writeIDReferences(fw.writer,name, references);
264 // writeUnknownChild(fw.writer,name,unknownChildElement);
266 fw.writer.println("}");
271 writers.remove(complexTypeObj);
276 protected void createReferenceIndicator(SchemaObject parent, RefType referenceType, String refName, String objectName,
277 String primaryClassName, String secondaryClassName, boolean useElementList, boolean useOriginalList) {
278 FileWriter fw = getWriter(parent);
279 if ("TextOrField".equals(refName))
280 System.out.println();
281 if (referenceType == RefType.Type) {
282 // create internal class for handling the element and child attachment
283 secondaryClassName = getName(parent) +"_" +objectName;
284 if (objectName.equals(refName))
285 fw.writer.println(" addRelationWriter("+ontShort+ getName(parent)+"_has"+refName +", "+secondaryClassName+".class);");
286 else // FIXME : type name may not be correct
287 fw.writer.println(" addRelationTypeWriter("+ontShort+ getName(parent)+"_has"+refName +", " +ontShort+primaryClassName +", "+secondaryClassName+".class);");
288 fw.delayedWriter2.println(" public static class " + secondaryClassName +" extends " + primaryClassName +"{");
289 fw.delayedWriter2.println(" public "+ secondaryClassName +"(ReadGraph graph){");
290 fw.delayedWriter2.println(" super(graph);");
291 fw.delayedWriter2.println(" }");
292 fw.delayedWriter2.println(" ");
293 fw.delayedWriter2.println(" @Override");
294 fw.delayedWriter2.println(" public java.lang.String getElementId() {");
295 fw.delayedWriter2.println(" return \"" + refName +"\";");
296 fw.delayedWriter2.println(" }");
297 fw.delayedWriter2.println(" }");
298 } else { //referenceType == RefType.Reference
299 fw.writer.println(" addWriter("+primaryClassName+".class);");
300 if (!primaryClassName.equals(secondaryClassName))
301 fw.writer.println(" addWriter("+secondaryClassName+".class);");
303 // fw.delayedWriter.println(" if (child.getElementParser() instanceof "+refClassName+"){");
304 // fw.delayedWriter.println(" graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+ref + ", child.getData());");
305 if (useElementList) {
307 // element type specific list
308 fw.delayedWriter.println(" {");
309 fw.delayedWriter.println(" org.simantics.db.Resource list = graph.getPossibleObject(instance.getResource(),"+ontShort+getName(parent)+"_has"+refName + "_List);");
310 fw.delayedWriter.println(" if (list != null) {");
311 fw.delayedWriter.println(" java.util.List<org.simantics.db.Resource> l = org.simantics.db.common.utils.ListUtils.toList(graph, list);");
312 fw.delayedWriter.println(" result.addAll(l);");
313 fw.delayedWriter.println(" } else {");
314 fw.delayedWriter.println(" result.addAll(graph.getObjects(instance.getResource(), "+ontShort+getName(parent)+"_has"+refName + "));");
315 fw.delayedWriter.println(" }");
316 fw.delayedWriter.println(" }");
318 fw.delayedWriter.println(" result.addAll(graph.getObjects(instance.getResource(), "+ontShort+getName(parent)+"_has"+refName + "));");
320 // if (useOriginalList(parent, indicator,element, reference, ref, refType)) {
322 // fw.delayedWriter.println(" {");
323 // fw.delayedWriter.println(" XMLResource XML = XMLResource.getInstance(graph);");
324 // fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");
325 // fw.delayedWriter.println(" if (list == null) {");
326 // fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
327 // fw.delayedWriter.println(" graph.claim(element.getData(), XML.hasOriginalElementList,list);");
328 // fw.delayedWriter.println(" } else {");
329 // fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
330 // fw.delayedWriter.println(" }");
331 // fw.delayedWriter.println(" }");
334 // fw.delayedWriter.println(" return true;");
335 // fw.delayedWriter.println(" }");
340 protected void createPrimitiveIndicator(SchemaObject parent, String refName, TypeEntry typeEntry, QName typeName) {
341 FileWriter fw = getWriter(parent);
342 String ontologyClassName = converter.getOntologyClassName(typeName.getNamespaceURI());
343 String typeURI = ontologyClassName != null ? ontologyClassName + ".URIs." + getName(base.getSimpleType(typeName)) : "null";
345 fw.writer.println(" addRelationWriter("+ ontShort +getName(parent) + "_has"+refName+", "+getName(parent) +"_" +refName+".class);");
347 fw.delayedWriter2.println(" public static class " + getName(parent) +"_" +refName+" extends org.simantics.xml.sax.base.ValueElementWriter {");
348 fw.delayedWriter2.println(" public "+ getName(parent) +"_" +refName +"(){");
349 fw.delayedWriter2.println(" super(\""+refName+"\", " + typeURI + ", " + typeEntry.binding+");");
350 fw.delayedWriter2.println(" }\n");
351 fw.delayedWriter2.println(" @Override");
352 fw.delayedWriter2.println(" public java.lang.String decode(java.lang.Object value) {");
353 fw.delayedWriter2.println(" return " + typeEntry.stringPrefix + "(" + typeEntry.javaType + ")value" + typeEntry.stringPostfix + ";");
354 fw.delayedWriter2.println(" }");
355 fw.delayedWriter2.println(" }");
359 protected void createElementIndicator(SchemaObject parent, boolean useElementList, String refName, String className,
360 boolean useOriginalList) {
361 FileWriter fw = getWriter(parent);
363 fw.writer.println(" addTypeWriter("+ ontShort+className +", "+className+".class);");
365 // fw.writer.println(" addWriter("+className+".class);");
367 // fw.delayedWriter.println(" if (child.getElementParser() instanceof "+className+"){");
368 // fw.delayedWriter.println(" graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+ref + ", child.getData());");
369 if (useElementList) {
371 // element type specific list
372 fw.delayedWriter.println(" {");
373 fw.delayedWriter.println(" org.simantics.db.Resource list = graph.getPossibleObject(instance.getResource(),"+ontShort+getName(parent)+"_has"+refName + "_List);");
374 fw.delayedWriter.println(" if (list != null) {");
375 fw.delayedWriter.println(" java.util.List<org.simantics.db.Resource> l = org.simantics.db.common.utils.ListUtils.toList(graph, list);");
376 fw.delayedWriter.println(" result.addAll(l);");
377 fw.delayedWriter.println(" } else {");
378 fw.delayedWriter.println(" result.addAll(graph.getObjects(instance.getResource(), "+ontShort+getName(parent)+"_has"+refName + "));");
379 fw.delayedWriter.println(" }");
380 fw.delayedWriter.println(" }");
382 fw.delayedWriter.println(" result.addAll(graph.getObjects(instance.getResource(), "+ontShort+getName(parent)+"_has"+refName + "));");
384 // if (useOriginalList(parent, indicator,element, reference, ref, new QName(obj.getName()))) {
386 // fw.delayedWriter.println(" {");
387 // fw.delayedWriter.println(" XMLResource XML = XMLResource.getInstance(graph);");
388 // fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");
389 // fw.delayedWriter.println(" if (list == null) {");
390 // fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
391 // fw.delayedWriter.println(" graph.claim(element.getData(), XML.hasOriginalElementList,list);");
392 // fw.delayedWriter.println(" } else {");
393 // fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
394 // fw.delayedWriter.println(" }");
395 // fw.delayedWriter.println(" }");
398 // fw.delayedWriter.println(" return true;");
399 // fw.delayedWriter.println(" }");
404 public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) {
405 // generates overriding method that allows writing any element
406 FileWriter fw = getWriter(parent);
407 fw.delayedWriter2.println(" @Override");
408 fw.delayedWriter2.println(" public Class<? extends org.simantics.xml.sax.base.XMLElementWriter> getWriter(ReadGraph graph, java.util.Map<Resource, org.simantics.xml.sax.base.XMLElementWriter> writers, WriterElement child) throws DatabaseException{");
409 fw.delayedWriter2.println(" Class<? extends org.simantics.xml.sax.base.XMLElementWriter> writerClass = super.getWriter(graph, writers, child);");
410 fw.delayedWriter2.println(" if (writerClass != null) return writerClass;");
411 fw.delayedWriter2.println(" Resource type = graph.getSingleType(child.instance);");
412 fw.delayedWriter2.println(" org.simantics.xml.sax.base.XMLElementWriter writer = writers.get(type);");
413 fw.delayedWriter2.println(" if (writer != null) return writer.getClass();");
414 fw.delayedWriter2.println(" return null;");
415 fw.delayedWriter2.println(" }");
419 public void handle(SchemaObject parent, Attribute attribute) {
422 String name = attribute.getName();
423 QName primitiveType = attribute.getType();
424 SimpleType simpleType = attribute.getSimpleType();
425 QName ref = attribute.getRef();
431 relationName = ontShort+"has"+name;
433 relationName = ontShort+getName(parent)+"_has"+name;
435 else if (ref != null && parent != null) {
436 attrName = ref.getLocalPart();
437 relationName = ontShort+getName(parent)+"_has"+ref.getLocalPart();
439 Attribute referred = base.getRefAttribute(ref);
440 if (referred != null) {
441 primitiveType = referred.getType();
442 simpleType = referred.getSimpleType();
446 throw new RuntimeException();
448 boolean isReference = false;
449 if (provider!= null && provider.getAttribute().getName().equals(attrName))
452 FileWriter fw = getWriter(parent);
453 if (primitiveType != null) {
455 //String binding = getBindingFromPrimitiveType(primitiveType);
456 TypeEntry binding = base.getTypeEntry(primitiveType);
458 if (binding != null) {
459 writeAttribute(fw, attrName, relationName, binding, isReference);
462 if (simpleType == null) {
463 SchemaObject simpleTypeObj = base.getSimpleType(primitiveType);
464 if (simpleTypeObj != null)
465 simpleType = simpleTypeObj.getSimpleType();
469 if (simpleType != null) {
470 org.w3._2001.xmlschema.List list = simpleType.getList();
472 TypeEntry binding = base.getTypeEntry(new QName(SchemaConversionBase.SCHEMA_NS, "string"));
473 writeAttribute(fw, attrName, relationName, binding, isReference);
475 Restriction restriction = simpleType.getRestriction();
476 if (restriction == null)
477 throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart()+ ", SimpleType restriction is unset");
478 QName base = restriction.getBase();
481 //String binding = getBindingFromPrimitiveType(base);
482 TypeEntry binding = this.base.getTypeEntry(base);
483 writeAttribute(fw, attrName, relationName, binding, isReference);
486 // TODO : using default String attribute should be configured with rules.
487 //throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart());
488 fw.writer.println(" //FIXME: Cannot resolve type for Attribute " + attrName + " Using default type String");
489 //writeAttribute(fw, attrName, relationName, "STRING", isReference);
490 writeAttribute(fw, attrName, relationName, base.getTypeEntry("string"), isReference);
494 private void writeAttribute(FileWriter fw, String attrName, String relationName, TypeEntry binding, boolean isReference) {
495 fw.writer.println(" {");
496 fw.writer.println(" if (attribute.getPredicate().equals("+relationName+")) {");
497 fw.writer.println(" writer.writeAttribute(\""+attrName+"\", " + binding.getToString("graph.getValue(attribute.getObject(),"+binding.binding+")")+");");
498 // fw.writer.println(" graph.claimLiteral(element.getData(),"+relationName+","+getValueGetterMethod(binding,"a")+", "+binding.binding+");");
500 // fw.writer.println(" idProviderValue = a.getValue();");
501 fw.writer.println(" }");
502 fw.writer.println(" }");
506 public void handleAttributes(SchemaObject simpleTypeObj) {
507 SchemaObject parent = simpleTypeObj.getParent();
508 FileWriter fw = getWriter(parent);
510 SimpleType simpleType = simpleTypeObj.getSimpleType();
511 Restriction restriction = simpleType.getRestriction();
512 if (restriction == null)
513 throw new RuntimeException("Cannot resolve type for Element " + getName(parent));
514 QName base = restriction.getBase();
517 //String binding = getBindingFromPrimitiveType(base);
518 TypeEntry binding = this.base.getTypeEntry(base);
520 fw.writer.println(" @Override");
521 fw.writer.println(" public void characters(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) throws XMLStreamException, DatabaseException {");
522 fw.writer.println(" writer.writeCharacters("+ binding.getToString("graph.getValue(attribute.getObject(),"+binding.binding+")")+");");
523 // fw.writer.println(" graph.claimValue(element.getData(),"+getValueGetter(binding)+", "+binding.binding +");");
524 fw.writer.println(" }");
528 public void handle(SchemaObject parent, AttributeGroup attribute) {
529 if (parent != null) {
530 FileWriter fw = getWriter(parent);
531 NamedAttributeGroup group = this.base.getAttributeGroup(attribute.getRef());
532 fw.writer.println(commentTag+" AttributeGroup " + group.getName());
533 SchemaObject obj = new SchemaObject(parent,attribute);
534 for (Annotated annotated : group.getAttributeOrAttributeGroup()) {
535 if (annotated instanceof Attribute) {
536 //handle("AttributeGroups_"+group.getName(),(Attribute)annotated);
537 handle(obj,(Attribute)annotated);
538 } else if (annotated instanceof AttributeGroup) {
539 //handle("AttributeGroups_"+group.getName(),(AttributeGroup)annotated);
540 handle(obj,(AttributeGroup)annotated);
543 fw.writer.println(commentTag+" End of AttributeGroup " + group.getName());
549 public void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes) {
550 FileWriter fw = getWriter(parent);
551 QName type = new QName(SchemaConversionBase.CONVERSION_NS, composition.getType());
552 TypeEntry typeEntry = this.base.getTypeEntry(type);
553 String arrayBinding = typeEntry.binding;//getBindingFromPrimitiveType(type);
554 String javaType = typeEntry.javaType;//getJavaTypeFromPrimitiveType(type);
555 String name = composition.getName();
559 relationName = ontShort+"has"+name;
561 relationName = ontShort+getName(parent)+"_has"+name;
563 throw new RuntimeException();
565 fw.writer.println(" if (attribute.getPredicate().equals("+relationName+")) {");
566 fw.writer.println(" "+javaType+" value = ("+javaType+")graph.getValue(attribute.getObject(),"+arrayBinding+");");
567 //fw.writer.println(" writer.writeAttribute("+attrName+", graph.getValue(attribute.getObject(),"+binding.binding+").toString());");
570 for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute())
571 fw.writer.println(" writer.writeAttribute(\""+a.getName()+"\","+typeEntry.getElementToString("value["+(i++)+"]")+");");
572 //fw.writer.println(" writer.writeAttribute(\""+a.getName()+"\",value["+(i++)+"].toString());");
573 // fw.writer.println(" Attribute a"+(i++)+" = element.getAttribute(\"" +a.getName()+"\");");
574 // fw.writer.print (" "+javaType + " value = new "+javaType+"{");
576 // FIXME : handle optional attributes properly.
577 // for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute()) {
578 // Attribute attribute = ((Attribute)attributes.getRight(a));
579 // //QName atype = getBaseType(attribute);
580 // QName atype = getPrimitiveType(attribute);
581 // String defaultValue = attribute.getDefault();
582 // if (defaultValue == null)
583 // defaultValue = getDefaultValue(atype);
585 // //String binding = getBindingFromPrimitiveType(atype);
586 // TypeEntry binding = getTypeEntry(atype);
588 // fw.writer.print(",");
589 // if (defaultValue != null)
590 // fw.writer.print("a"+(i)+"!= null ? "+ getValueGetterMethod(binding,"a"+(i++)) + " : " +defaultValue);
592 // fw.writer.print(getValueGetterMethod(binding,"a"+(i++)));
594 // fw.writer.println("};");
595 // fw.writer.println(" graph.claimLiteral(element.getData(),"+relationName+", value, "+arrayBinding+");");
596 fw.writer.println(" }");
600 protected String getDefaultValue(QName atype) {
601 Map<String,TypeEntry> types = this.base.typeMap.get(atype.getNamespaceURI());
604 TypeEntry entry = types.get(atype.getLocalPart());
607 return entry.defaultValue;
612 public void handleElement(SchemaObject elementObj) {
613 Element element = elementObj.getElement();
615 String name = getName(elementObj);//topLevelElement.getName();
616 String className = name;
618 FileWriter fw = new FileWriter();
620 fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));
621 } catch (IOException e) {
622 throw new RuntimeException(e);
624 writers.put(elementObj, fw);
625 boolean isList = false;
627 Inheritance inheritance = this.base.getInheritance(elementObj);
629 provider = this.base.getIDProvider(element);
630 List<IDReference> references = this.base.getIDReferences(element);
631 UnrecognizedChildElement unknownChildElement = this.base.getUnknown(element);
633 // List<String> intrerfaces = new ArrayList<String>();
634 // if (references.size() > 0)
635 // intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser");
636 // if (unknownChildElement != null)
637 // intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser");
639 createClassHeader(fw.writer);
640 writeClass(fw.writer,false, element.getName(), className, inheritance.baseClass, Collections.EMPTY_LIST);
641 // writeIDProvider(fw.writer);
642 fw.writer.println(" @Override");
643 fw.writer.println(" public Resource getType(ReadGraph graph) throws DatabaseException {");
644 fw.writer.println(" "+getOntologyImport());
645 fw.writer.println(" return "+ontShort+name+";");
647 // fw.writer.println(" Resource res = graph.newResource();");
648 // fw.writer.println(" graph.claim(res, L0.InstanceOf, "+ontShort+name+");");
650 // fw.writer.println(" Resource res = ListUtils.create(graph, "+ontShort+name+", Collections.EMPTY_LIST);");
652 // fw.writer.println(" return res;");
653 fw.writer.println(" }");
656 // fw.writer.println(" @Override");
657 // fw.writer.println(" public boolean connectParent(WriteGraph graph, ParserElement parent, ParserElement element) throws DatabaseException{");
658 // fw.writer.println(" "+getOntologyImport());
659 // fw.writer.println(" graph.claim(parent.getData(), "+this.ontShort+getName(elementObj,"has")+", element.getData());");
660 // fw.writer.println(" return true;");
661 // fw.writer.println(" }");
662 // fw.writer.println();
663 LocalComplexType complexType = element.getComplexType();
664 LocalSimpleType simpleType = element.getSimpleType();
666 fw.writer.println(" @Override");
667 fw.writer.println(" public void attributes(ReadGraph graph, WriterElement instance, Collection<Statement> attributes, XMLStreamWriter writer) throws XMLStreamException, DatabaseException{");
668 if (inheritance.type == InheritanceType.ComplexType) {
669 fw.writer.println(" super.attributes(graph,instance,attributes,writer);");
671 fw.writer.println(" "+getOntologyImport());
672 fw.writer.println(" for (Statement attribute : attributes) {");
673 if (complexType != null) {
674 SchemaObject obj = this.base.getComplexType(complexType);
675 this.base.handleElementComplexTypeAttributes(obj);
677 fw.writer.println(" }");
678 fw.writer.println(" }");
681 // fw.writer.println(" @Override");
682 // fw.writer.println(" public void configure(WriteGraph graph, Deque<ParserElement> parents, ParserElement element) throws DatabaseException {");
683 // if (inhertiance.type == InheritanceType.ComplexType) {
684 // fw.writer.println(" super.configure(graph,parents,element);");
686 // fw.writer.println(" "+getOntologyImport());
688 // LocalComplexType complexType = element.getComplexType();
689 // LocalSimpleType simpleType = element.getSimpleType();
691 // if (complexType != null) {
692 // SchemaObject obj = complexTypes.get(complexType);
693 // handleElementComplexTypeAttributes(obj);
695 // fw.writer.println(" }");
697 if (inheritance.type == InheritanceType.AtomicType) {
699 // fw.writer.println(" @Override");
700 // fw.writer.println(" public void configure(WriteGraph graph, ParserElement element, java.lang.String string) throws DatabaseException {");
701 // fw.writer.println(" graph.claimValue(element.getData(), "+getValueGetter(inhertiance.atomicType,"string")+", "+inhertiance.atomicType.binding+");");
702 // fw.writer.println(" }");
703 fw.writer.println(" @Override");
704 fw.writer.println(" public void characters(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) throws XMLStreamException, DatabaseException {");
705 fw.writer.println(" writer.writeCharacters("+inheritance.atomicType.getToString("graph.getValue(instance.getResource(),"+inheritance.atomicType.binding+")")+");");
706 // fw.writer.println(" graph.claimValue(element.getData(),"+getValueGetter(binding)+", "+binding.binding +");");
707 fw.writer.println(" }");
709 // if (simpleType != null) {
710 // SchemaObject obj = simpleTypes.get(simpleType);
711 // handleElementSimpleTypeAttributes(obj);
715 StringWriter stringWriter = new StringWriter();
716 fw.delayedWriter = new PrintWriter(stringWriter);
717 StringWriter stringWriter2 = new StringWriter();
718 fw.delayedWriter2 = new PrintWriter(stringWriter2);
720 fw.writer.println(" public " + className + "(ReadGraph graph) {");
721 fw.writer.println(" super(graph);");
722 fw.writer.println(" "+getOntologyImport());
723 if (complexType != null) {
724 SchemaObject obj = this.base.getComplexType(complexType);
725 this.base.handleComplexTypeExtension(obj);
726 } else if (simpleType != null) {
730 fw.writer.println(" }");
732 fw.writer.println(" @Override");
733 fw.writer.println(" public void children(ReadGraph graph, WriterElement instance, java.util.Set<org.simantics.db.Resource> result) throws XMLStreamException, DatabaseException {");
734 fw.writer.println(" "+getOntologyImport());
736 if (stringWriter.getBuffer().length() > 0) {
737 fw.writer.write(stringWriter.toString());
740 if (inheritance.type == InheritanceType.ComplexType) {
741 fw.writer.println(" super.children(graph,instance,result);");
744 fw.writer.println(" }");
747 if (stringWriter2.getBuffer().length() > 0) {
748 fw.writer.write(stringWriter2.toString());
752 fw.delayedWriter.close();
753 fw.delayedWriter = null;
754 stringWriter2 = null;
755 fw.delayedWriter2.close();
756 fw.delayedWriter2 = null;
758 // writeIDReferences(fw.writer,name, references);
759 // writeUnknownChild(fw.writer,name,unknownChildElement);
761 fw.writer.println("}");
766 writers.remove(elementObj);
769 ruleClassNames.add(converter.getPluginName()+"."+elementPackageName+"."+name);
773 // private void writeIDProvider(PrintWriter writer) {
774 // if (provider != null) {
775 // writer.println(" java.lang.String idProviderValue = null;");
777 // writer.println(" @Override");
778 // writer.println(" public java.lang.String getID() {");
779 // writer.println(" java.lang.String s = idProviderValue;");
780 // writer.println(" idProviderValue = null;");
781 // writer.println(" return s;");
782 // writer.println(" }");
784 // if (provider.getPriority() != null) {
785 // writer.println(" @Override");
786 // writer.println(" public int idPriority() {");
787 // writer.println(" return " + provider.getPriority().intValue()+";");
788 // writer.println(" }");
793 // private void writeIDReferences(PrintWriter writer,String name, List<IDReference> references) {
794 // if (references.size() > 0) {
795 // writer.println(" @Override");
796 // writer.println(" public boolean connectReferences(WriteGraph graph, ParserElement element, java.util.Map<java.lang.String, ParserElement> map) throws DatabaseException {");
797 // writer.println(" "+getOntologyImport());
798 // writer.println(" boolean result = true;");
799 // for (IDReference ref : references) {
800 // writer.println(" {");
801 // writer.println(" Attribute a = element.getAttribute(\"" + ref.getIDSource().getName() +"\");");
802 // writer.println(" if (a != null) {");
803 // writer.println(" ParserElement refEle = map.get(a.value);");
804 // writer.println(" if (refEle != null) {");
805 // writer.println(" Resource ref = refEle.getData();");
806 // writer.println(" graph.claim(element.getData(), "+ontShort+name+"_"+ref.getReference().getName()+", ref);");
807 // writer.println(" } else {");
808 // writer.println(" result = false;");
809 // writer.println(" }");
810 // writer.println(" }");
811 // writer.println(" }");
813 // writer.println(" return result;");
814 // writer.println(" }");
819 // private void writeUnknownChild(PrintWriter writer,String name, UnrecognizedChildElement unknownChildElement) {
820 // if (unknownChildElement == null)
823 // writer.println(" @Override");
824 // writer.println(" public void configureChild(WriteGraph graph, Deque<ParserElement> parents, ParserElement element, ParserElement child) throws DatabaseException {");
825 // writer.println(" " + unknownChildElement.getJavaMethod());
826 // writer.println(" }");
831 protected void createClassHeader(PrintWriter writer) {
832 writer.println("package " + converter.getPluginName() +"."+elementPackageName+";");
834 writer.println("import org.simantics.databoard.Bindings;");
835 writer.println("import org.simantics.db.Resource;");
836 writer.println("import org.simantics.db.ReadGraph;");
837 writer.println("import org.simantics.db.Statement;");
838 writer.println("import org.simantics.db.exception.DatabaseException;");
839 writer.println("import org.simantics.xml.sax.base.WriterElement;");
840 writer.println("import org.simantics.xml.sax.ontology.XMLResource;");
841 writer.println("import java.util.Collection;");
842 writer.println("import javax.xml.stream.XMLStreamException;");
843 writer.println("import javax.xml.stream.XMLStreamWriter;");
845 // writer.println("import org.simantics.layer0.Layer0;");
847 // writer.println("import java.util.Collections;");
848 // writer.println("import org.simantics.db.common.utils.ListUtils;");