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.ArrayList;
10 import javax.xml.namespace.QName;
12 import org.simantics.utils.datastructures.BijectionMap;
13 import org.simantics.xml.sax.SchemaConversionBase.Inheritance;
14 import org.simantics.xml.sax.SchemaConversionBase.InheritanceType;
15 import org.simantics.xml.sax.SchemaConversionBase.RefType;
16 import org.simantics.xml.sax.SchemaConversionBase.TypeEntry;
17 import org.simantics.xml.sax.SchemaObject.ObjectType;
18 import org.simantics.xml.sax.configuration.AttributeComposition;
19 import org.simantics.xml.sax.configuration.IDProvider;
20 import org.simantics.xml.sax.configuration.IDReference;
21 import org.simantics.xml.sax.configuration.UnrecognizedChildElement;
22 import org.w3._2001.xmlschema.Annotated;
23 import org.w3._2001.xmlschema.Attribute;
24 import org.w3._2001.xmlschema.AttributeGroup;
25 import org.w3._2001.xmlschema.ComplexType;
26 import org.w3._2001.xmlschema.Element;
27 import org.w3._2001.xmlschema.LocalComplexType;
28 import org.w3._2001.xmlschema.LocalSimpleType;
29 import org.w3._2001.xmlschema.NamedAttributeGroup;
30 import org.w3._2001.xmlschema.NamedGroup;
31 import org.w3._2001.xmlschema.Restriction;
32 import org.w3._2001.xmlschema.SimpleType;
34 public class ImporterGenerator extends JavaGenerator{
36 public ImporterGenerator(SchemaConverter converter, SchemaConversionBase base) {
37 super(converter, base);
40 public void createParser() throws IOException {
42 String importerClassPostfix = "Importer";
43 String parserClassPostfix = "Parser";
46 importParserDir= new File(converter.getParserDir().getAbsolutePath()+"/"+elementPackageName);
47 if (!importParserDir.exists())
48 importParserDir.mkdirs();
51 // Create Importer class
52 File importerFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+importerClassPostfix+".java");
53 PrintWriter mainWriter = createFile(importerFile);
54 mainWriter.println("package " + converter.getPluginName() +";");
56 mainWriter.println("import java.io.File;");
57 mainWriter.println("import org.simantics.db.Session;");
58 mainWriter.println("import org.simantics.xml.sax.base.AbstractImporter;");
60 mainWriter.println("public class " + name + importerClassPostfix+" extends AbstractImporter {");
62 mainWriter.println(" public " + name + importerClassPostfix+"(Session session, File file) {");
63 mainWriter.println(" super(session, file, new "+name + parserClassPostfix+"().resolveDependencies());");
64 mainWriter.println(" }");
66 mainWriter.println("}");
72 // Create Parser class
73 File parserFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+parserClassPostfix+".java");
74 mainWriter = createFile(parserFile);
75 mainWriter.println("package " + converter.getPluginName() +";");
77 mainWriter.println("import org.simantics.xml.sax.base.XMLParser;");
79 mainWriter.println("public class " + name + parserClassPostfix+" extends XMLParser {");
81 mainWriter.println(" public " + name + parserClassPostfix+"() {");
82 if (schema.getTargetNamespace() != null)
83 mainWriter.println(" setSchemaURI(\""+schema.getTargetNamespace()+"\");");
84 for (String s : ruleClassNames) {
85 mainWriter.println(" add(new "+s+"());");
88 mainWriter.println(" }");
90 if (converter.getSubConverters().size() > 0) {
91 mainWriter.println(" public void addDependencies(java.util.Map<String,XMLParser> map) {");
92 for (SchemaConverter sc : converter.getSubConverters()) {
93 String s = sc.className;
94 if (s.endsWith("Ontology"))
95 s = s.substring(0,s.length()-"Ontology".length());
97 mainWriter.println(" {");
98 mainWriter.println(" XMLParser parser = new "+s+"();");
99 mainWriter.println(" if (!map.containsKey(parser.getSchemaURI())) {");
100 mainWriter.println(" map.put(parser.getSchemaURI(), parser);");
101 mainWriter.println(" parser.addDependencies(map);");
102 mainWriter.println(" } else {");
103 mainWriter.println(" parser = map.get(parser.getSchemaURI());");
104 mainWriter.println(" }");
105 mainWriter.println(" add(parser);");
106 mainWriter.println(" }");
108 mainWriter.println(" }");
110 mainWriter.println("}");
112 mainWriter.println();
118 protected String getPackagePostFix() {
123 public void handleSimpleType(SchemaObject parent, SchemaObject simpleTypeObj) {
127 public void handle(SchemaObject parent, NamedGroup attribute) {
128 // TODO Auto-generated method stub
132 public void handleComplexType(SchemaObject complexTypeObj) {
133 ComplexType topLevelComplexType = complexTypeObj.getComplexType();
135 String name = getName(complexTypeObj);
137 //if (topLevelComplexType.getName().equals("LocalizedText"))
138 //if (topLevelComplexType.getName().equals("Reference"))
139 // if (topLevelComplexType.getName().equals("NodeIdAlias"))
140 // System.out.println();
142 String className = name;//"_"+name;
144 FileWriter fw = new FileWriter();
146 fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));
147 } catch (IOException e) {
148 throw new RuntimeException(e);
150 writers.put(complexTypeObj, fw);
152 Inheritance inheritance = this.base.getInheritance(complexTypeObj);
154 provider = this.base.getIDProvider(topLevelComplexType);
155 List<IDReference> references = this.base.getIDReferences(topLevelComplexType);
156 UnrecognizedChildElement unknownChildElement = this.base.getUnknown(topLevelComplexType);
158 List<String> intrerfaces = new ArrayList<String>();
159 if (references.size() > 0)
160 intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser");
161 if (unknownChildElement != null)
162 intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser");
164 createClassHeader(fw.writer, false);
165 writeClass(fw.writer,false, null, className, inheritance.baseClass, intrerfaces);
167 writeIDProvider(fw.writer);
169 fw.writer.println(" @Override");
170 fw.writer.println(" public Resource create(WriteGraph graph, ParserElement element) throws DatabaseException{");
171 fw.writer.println(" Layer0 L0 = Layer0.getInstance(graph);");
172 fw.writer.println(" "+getOntologyImport());
173 fw.writer.println(" Resource res = graph.newResource();");
174 fw.writer.println(" graph.claim(res, L0.InstanceOf, "+ontShort+name+");");
175 fw.writer.println(" return res;");
176 fw.writer.println(" }");
179 fw.writer.println(" @Override");
180 fw.writer.println(" public boolean connectParent(WriteGraph graph, ParserElement parent, ParserElement element) throws DatabaseException{");
181 fw.writer.println(" "+getOntologyImport());
182 fw.writer.println(" graph.claim(parent.getData(), "+this.ontShort+getName(complexTypeObj,"has")+", element.getData());");
183 fw.writer.println(" return true;");
184 fw.writer.println(" }");
187 StringWriter stringWriter = new StringWriter();
188 fw.delayedWriter = new PrintWriter(stringWriter);
189 StringWriter stringWriter2 = new StringWriter();
190 fw.delayedWriter2 = new PrintWriter(stringWriter2);
192 fw.writer.println(" public " + className + "() {");
193 fw.writer.println(" super();");
195 this.base.handleComplexTypeExtension(complexTypeObj);
197 fw.writer.println(" }");
199 fw.writer.println(" @Override");
200 fw.writer.println(" public boolean connectChild(WriteGraph graph, ParserElement element, ParserElement child) throws DatabaseException{");
201 fw.writer.println(" "+getOntologyImport());
203 if (stringWriter.getBuffer().length() > 0) {
204 fw.writer.write(stringWriter.toString());
206 if (inheritance.type == InheritanceType.ComplexType) {
207 fw.writer.println(" return super.connectChild(graph,element,child);");
209 fw.writer.println(" return false;");
211 fw.writer.println(" }");
214 if (stringWriter2.getBuffer().length() > 0) {
215 fw.writer.write(stringWriter2.toString());
219 fw.delayedWriter.close();
220 fw.delayedWriter=null;
221 stringWriter2 = null;
222 fw.delayedWriter2.close();
223 fw.delayedWriter2 = null;
225 fw.writer.println(" @Override");
226 fw.writer.println(" public void configure(WriteGraph graph, Deque<ParserElement> parents, ParserElement element) throws DatabaseException {");
227 if (inheritance.type == InheritanceType.ComplexType) {
228 fw.writer.println(" super.configure(graph,parents,element);");
230 fw.writer.println(" "+getOntologyImport());
231 fw.writer.println(" Layer0 L0 = Layer0.getInstance(graph);");
232 fw.writer.println(" XMLResource XML = XMLResource.getInstance(graph);");
233 this.base.handleComplexTypeAttributes(complexTypeObj);
234 this.base.handleExtensionAttributes(complexTypeObj);
236 fw.writer.println(" }");
238 if (inheritance.type == InheritanceType.AtomicType) {
240 fw.writer.println(" @Override");
241 fw.writer.println(" public void configure(WriteGraph graph, ParserElement element, java.lang.String string) throws DatabaseException {");
242 fw.writer.println(" graph.claimValue(element.getData(), "+getValueGetter(inheritance.atomicType,"string")+", "+inheritance.atomicType.binding+");");
243 fw.writer.println(" }");
246 writeIDReferences(fw.writer,name, references);
247 writeUnknownChild(fw.writer,name,unknownChildElement);
249 fw.writer.println("}");
254 writers.remove(complexTypeObj);
259 public void createReferenceIndicator(SchemaObject parent, RefType referenceType, String refName, String objectName, String primaryClassName, String secondaryClassName, boolean useElementList, boolean useOriginalList) {
260 // if (refName == null)
261 // System.out.println();
262 FileWriter fw = getWriter(parent);
263 if (referenceType == RefType.Type) {
264 // create internal class for handling the element and child attachment
265 secondaryClassName = getName(parent) +"_" +objectName;
266 fw.writer.println(" addParser(\""+ objectName +"\", "+secondaryClassName+".class);");
267 fw.delayedWriter2.println(" public static class " + secondaryClassName +" extends " + primaryClassName +"{");
268 fw.delayedWriter2.println(" public "+ secondaryClassName +"(){");
269 fw.delayedWriter2.println(" }");
270 fw.delayedWriter2.println(" }");
271 } else { // referenceType == RefType.Reference
272 fw.writer.println(" addParser("+primaryClassName+".class);");
273 if (!primaryClassName.equals(secondaryClassName))
274 fw.writer.println(" addParser("+secondaryClassName+".class);");
277 fw.delayedWriter.println(" if (child.getElementParser() instanceof "+secondaryClassName+"){");
278 fw.delayedWriter.println(" graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+refName + ", child.getData());");
279 if (useElementList) {
281 // element type specific list
282 fw.delayedWriter.println(" {");
283 fw.delayedWriter.println(" element.registerListChild("+ontShort+getName(parent)+"_has"+refName + "_List, child);");
284 // fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "_List);");
285 // fw.delayedWriter.println(" if (list == null) {");
286 // fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
287 // fw.delayedWriter.println(" graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "_List,list);");
288 // fw.delayedWriter.println(" } else {");
289 // fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
290 // fw.delayedWriter.println(" }");
291 fw.delayedWriter.println(" }");
293 if (useOriginalList) {
295 fw.delayedWriter.println(" {");
296 fw.delayedWriter.println(" XMLResource XML = XMLResource.getInstance(graph);");
297 fw.delayedWriter.println(" element.registerListChild(XML.hasOriginalElementList, child);");
298 // fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");
299 // fw.delayedWriter.println(" if (list == null) {");
300 // fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
301 // fw.delayedWriter.println(" graph.claim(element.getData(), XML.hasOriginalElementList,list);");
302 // fw.delayedWriter.println(" } else {");
303 // fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
304 // fw.delayedWriter.println(" }");
305 fw.delayedWriter.println(" }");
308 fw.delayedWriter.println(" return true;");
309 fw.delayedWriter.println(" }");
313 protected void createPrimitiveIndicator(SchemaObject parent, String refName, TypeEntry typeEntry, QName typeName) {
314 FileWriter fw = getWriter(parent);
315 String className = getName(parent) +"_" +refName;
316 fw.writer.println(" addParser(\"" + refName + "\", " + className + ".class);");
317 fw.delayedWriter2.println(" public static class " + className + " extends org.simantics.xml.sax.base.ValueElementParser {");
318 fw.delayedWriter2.println(" public "+ className +"(){");
319 fw.delayedWriter2.println(" super(\""+refName+"\"," +this.ontologyClassName+".URIs."+getName(parent) + "_has"+refName+", "+typeEntry.binding+");");
320 fw.delayedWriter2.println(" }\n");
321 fw.delayedWriter2.println(" @Override");
322 fw.delayedWriter2.println(" public void configure(WriteGraph graph, ParserElement element, java.lang.String value) throws DatabaseException {");
323 fw.delayedWriter2.println(" Layer0 L0 = Layer0.getInstance(graph);");
325 SchemaObject simpleType = base.getSimpleType(typeName);
326 String ontologyClassName = converter.getOntologyClassName(typeName.getNamespaceURI());
327 if (ontologyClassName != null && simpleType != null)
328 fw.delayedWriter2.println(" graph.claim(element.getData(), L0.InstanceOf, " + ontologyClassName + ".getInstance(graph)." + getName(simpleType, "") + ");");
330 if (typeEntry.l0Type.startsWith("XML"))
331 fw.delayedWriter2.println(" XMLResource XML = XMLResource.getInstance(graph);");
332 fw.delayedWriter2.println(" graph.claim(element.getData(), L0.InstanceOf, " + typeEntry.l0Type + ");");
335 fw.delayedWriter2.println(" graph.claimValue(element.getData(), " +getValueGetter(typeEntry) + ", " + typeEntry.binding + ");");
336 fw.delayedWriter2.println(" }");
337 fw.delayedWriter2.println(" }");
341 protected void createElementIndicator(SchemaObject parent, boolean useElementList, String refName, String className, boolean useOriginalList) {
342 // if (refName == null)
343 // System.out.println();
344 FileWriter fw = getWriter(parent);
346 fw.writer.println(" addParser(\""+ refName +"\", "+className+".class);");
348 // fw.writer.println(" addParser("+className+".class);");
350 fw.delayedWriter.println(" if (child.getElementParser() instanceof "+className+"){");
351 fw.delayedWriter.println(" graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+refName + ", child.getData());");
352 if (useElementList) {
354 // element type specific list
355 fw.delayedWriter.println(" {");
356 fw.delayedWriter.println(" element.registerListChild(" + ontShort+getName(parent)+"_has"+refName + "_List, child);");
357 // fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "_List);");
358 // fw.delayedWriter.println(" if (list == null) {");
359 // fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
360 // fw.delayedWriter.println(" graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "_List,list);");
361 // fw.delayedWriter.println(" } else {");
362 // fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
363 // fw.delayedWriter.println(" }");
364 fw.delayedWriter.println(" }");
366 if (useOriginalList) {
368 fw.delayedWriter.println(" {");
369 fw.delayedWriter.println(" XMLResource XML = XMLResource.getInstance(graph);");
370 fw.delayedWriter.println(" element.registerListChild(XML.hasOriginalElementList, child);");
371 // fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");
372 // fw.delayedWriter.println(" if (list == null) {");
373 // fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
374 // fw.delayedWriter.println(" graph.claim(element.getData(), XML.hasOriginalElementList,list);");
375 // fw.delayedWriter.println(" } else {");
376 // fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
377 // fw.delayedWriter.println(" }");
378 fw.delayedWriter.println(" }");
381 fw.delayedWriter.println(" return true;");
382 fw.delayedWriter.println(" }");
386 public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) {
387 // generates overriding method that allows parsing any element
388 FileWriter fw = getWriter(parent);
389 fw.delayedWriter2.println(" @Override");
390 fw.delayedWriter2.println(" public Class<? extends org.simantics.xml.sax.base.XMLElementParser> getParser(java.util.Map<java.lang.String,org.simantics.xml.sax.base.XMLElementParser> parsers, ParserElement element, ParserElement child) {");
391 fw.delayedWriter2.println(" Class<? extends org.simantics.xml.sax.base.XMLElementParser> parserClass = super.getParser(parsers, element, child);");
392 fw.delayedWriter2.println(" if (parserClass != null) return parserClass;");
393 fw.delayedWriter2.println(" org.simantics.xml.sax.base.XMLElementParser parser = parsers.get(child.getQName());");
394 fw.delayedWriter2.println(" if (parser != null) return parser.getClass();");
395 fw.delayedWriter2.println(" return null;");
396 fw.delayedWriter2.println(" }");
400 public void handle(SchemaObject parent, Attribute attribute) {
403 String attrName = attribute.getName();
404 QName primitiveType = attribute.getType();
405 SimpleType simpleType = attribute.getSimpleType();
406 QName ref = attribute.getRef();
409 if (attrName != null) {
410 relationName = ontShort+getName(parent)+"_has"+base.getName(attribute);
412 else if (ref != null && parent != null) {
413 attrName = ref.getLocalPart();
414 relationName = ontShort+getName(parent)+"_has"+base.getName(ref);
416 Attribute referred = this.base.getRefAttribute(ref);
417 if (referred != null) {
418 primitiveType = referred.getType();
419 simpleType = referred.getSimpleType();
423 throw new RuntimeException();
425 boolean isReference = false;
426 if (provider!= null && provider.getAttribute().getName().equals(attrName))
429 FileWriter fw = getWriter(parent);
430 if (primitiveType != null) {
432 //String binding = getBindingFromPrimitiveType(primitiveType);
433 TypeEntry binding = this.base.getTypeEntry(primitiveType);
435 if (binding != null) {
436 writeAttribute(fw, attrName, relationName, binding, isReference, primitiveType);
439 if (simpleType == null) {
440 SchemaObject simpleTypeObj = this.base.getSimpleType(primitiveType);//this.base.simpleTypeName.get(primitiveType.getLocalPart());
441 if (simpleTypeObj != null)
442 simpleType = simpleTypeObj.getSimpleType();
446 if (simpleType != null) {
447 org.w3._2001.xmlschema.List list = simpleType.getList();
449 QName typeName = new QName(SchemaConversionBase.SCHEMA_NS, "string");
450 TypeEntry binding = this.base.getTypeEntry(typeName);
451 writeAttribute(fw, attrName, relationName, binding, isReference, typeName);
453 // Restriction restriction = simpleType.getRestriction();
454 // if (restriction == null)
455 // throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart()+ ", SimpleType restriction is unset");
456 // QName base = restriction.getBase();
457 QName base = this.base.getSimpleTypeBase(simpleType);
460 //String binding = getBindingFromPrimitiveType(base);
461 TypeEntry binding = this.base.getTypeEntry(base);
462 writeAttribute(fw, attrName, relationName, binding, isReference, base);
465 // TODO : using default String attribute should be configured with rules.
466 //throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart());
467 fw.writer.println(" //FIXME: Cannot resolve type for Attribute " + attrName + " Using default type String");
468 //writeAttribute(fw, attrName, relationName, "STRING", isReference);
469 writeAttribute(fw, attrName, relationName, this.base.getTypeEntry("string"), isReference, new QName(SchemaConversionBase.SCHEMA_NS, "string"));
473 private void writeAttribute(FileWriter fw, String attrName, String relationName, TypeEntry binding, boolean isReference, QName typeName) {
474 String ontologyClassName = converter.getOntologyClassName(typeName.getNamespaceURI());
475 String ontologyType = ontologyClassName != null ? ontologyClassName + ".getInstance(graph)." + getName(base.getSimpleType(typeName)) : binding.l0Type;
476 fw.writer.println(" {");
477 fw.writer.println(" Attribute a = element.getAttribute(\"" +attrName+"\");");
478 fw.writer.println(" if (a != null) {");
479 fw.writer.println(" graph.claimLiteral(element.getData(), " + relationName + ", " + ontologyType + ", " + getValueGetterMethod(binding,"a") + ", " + binding.binding + ");");
481 fw.writer.println(" idProviderValue = a.getValue();");
482 fw.writer.println(" }");
483 fw.writer.println(" }");
487 public void handleAttributes(SchemaObject simpleTypeObj) {
488 SchemaObject parent = simpleTypeObj.getParent();
489 FileWriter fw = getWriter(parent);
491 SimpleType simpleType = simpleTypeObj.getSimpleType();
492 Restriction restriction = simpleType.getRestriction();
493 if (restriction == null)
494 throw new RuntimeException("Cannot resolve type for Element " + getName(parent));
495 QName base = restriction.getBase();
498 //String binding = getBindingFromPrimitiveType(base);
499 TypeEntry binding = this.base.getTypeEntry(base);
500 fw.writer.println(" @Override");
501 fw.writer.println(" public void configure(WriteGraph graph, ParserElement element, java.lang.String value) throws DatabaseException {");
502 //fw.writer.println(" graph.claimValue(element.getData(),"+getValueGetter(binding)+", Bindings."+binding+");");
503 fw.writer.println(" graph.claimValue(element.getData(),"+getValueGetter(binding)+", "+binding.binding +");");
504 fw.writer.println(" }");
509 public void handle(SchemaObject parent, AttributeGroup attribute) {
510 if (parent != null) {
511 FileWriter fw = getWriter(parent);
512 NamedAttributeGroup group = this.base.getAttributeGroup(attribute.getRef());
513 fw.writer.println(commentTag+" AttributeGroup " + group.getName());
514 SchemaObject obj = new SchemaObject(base,parent,attribute);
515 for (Annotated annotated : group.getAttributeOrAttributeGroup()) {
516 if (annotated instanceof Attribute) {
517 //handle("AttributeGroups_"+group.getName(),(Attribute)annotated);
518 handle(obj,(Attribute)annotated);
519 } else if (annotated instanceof AttributeGroup) {
520 //handle("AttributeGroups_"+group.getName(),(AttributeGroup)annotated);
521 handle(obj,(AttributeGroup)annotated);
525 fw.writer.println(commentTag+" End of AttributeGroup " + group.getName());
531 public void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes) {
532 FileWriter fw = getWriter(parent);
533 QName type = new QName(SchemaConversionBase.CONVERSION_NS, composition.getType());
534 String arrayBinding = this.base.getBindingFromPrimitiveType(type);
535 String javaType = this.base.getJavaTypeFromPrimitiveType(type);
536 String name = composition.getName();
540 relationName = ontShort+"has"+name;
542 relationName = ontShort+getName(parent)+"_has"+name;
544 throw new RuntimeException();
547 fw.writer.println(" {");
549 for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute())
550 fw.writer.println(" Attribute a"+(i++)+" = element.getAttribute(\"" +a.getName()+"\");");
551 fw.writer.print (" "+javaType + " value = new "+javaType+"{");
553 // FIXME : handle optional attributes properly.
554 for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute()) {
555 Attribute attribute = ((Attribute)attributes.getRight(a));
556 //QName atype = getBaseType(attribute);
557 QName atype = this.base.getPrimitiveType(attribute);
558 String defaultValue = attribute.getDefault();
559 if (defaultValue == null)
560 defaultValue = this.base.getDefaultValue(atype);
562 //String binding = getBindingFromPrimitiveType(atype);
563 TypeEntry binding = this.base.getTypeEntry(atype);
565 fw.writer.print(",");
566 if (defaultValue != null)
567 fw.writer.print("a"+(i)+"!= null ? "+ getValueGetterMethod(binding,"a"+(i++)) + " : " +defaultValue);
569 fw.writer.print(getValueGetterMethod(binding,"a"+(i++)));
571 fw.writer.println("};");
572 fw.writer.println(" graph.claimLiteral(element.getData(),"+relationName+", value, "+arrayBinding+");");
573 fw.writer.println(" }");
580 public void handleElement(SchemaObject elementObj) {
581 Element element = elementObj.getElement();
583 String name = getName(elementObj);//topLevelElement.getName();
584 String className = name;
586 FileWriter fw = new FileWriter();
588 fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));
589 } catch (IOException e) {
590 throw new RuntimeException(e);
592 writers.put(elementObj, fw);
593 boolean isList = false;
595 Inheritance inheritance = this.base.getInheritance(elementObj);
597 provider = this.base.getIDProvider(element);
598 List<IDReference> references = this.base.getIDReferences(element);
599 UnrecognizedChildElement unknownChildElement = this.base.getUnknown(element);
601 List<String> intrerfaces = new ArrayList<String>();
602 if (references.size() > 0)
603 intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser");
604 if (unknownChildElement != null)
605 intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser");
607 createClassHeader(fw.writer, isList);
608 writeClass(fw.writer,false, element.getName(), className, inheritance.baseClass, intrerfaces);
609 writeIDProvider(fw.writer);
610 fw.writer.println(" @Override");
611 fw.writer.println(" public Resource create(WriteGraph graph, ParserElement element) throws DatabaseException{");
612 fw.writer.println(" Layer0 L0 = Layer0.getInstance(graph);");
613 fw.writer.println(" "+getOntologyImport());
615 fw.writer.println(" Resource res = graph.newResource();");
616 fw.writer.println(" graph.claim(res, L0.InstanceOf, "+ontShort+name+");");
618 fw.writer.println(" Resource res = ListUtils.create(graph, "+ontShort+name+", Collections.EMPTY_LIST);");
620 fw.writer.println(" return res;");
621 fw.writer.println(" }");
624 fw.writer.println(" @Override");
625 fw.writer.println(" public boolean connectParent(WriteGraph graph, ParserElement parent, ParserElement element) throws DatabaseException{");
626 fw.writer.println(" "+getOntologyImport());
627 fw.writer.println(" graph.claim(parent.getData(), "+this.ontShort+getName(elementObj,"has")+", element.getData());");
628 fw.writer.println(" return true;");
629 fw.writer.println(" }");
632 fw.writer.println(" @Override");
633 fw.writer.println(" public void configure(WriteGraph graph, Deque<ParserElement> parents, ParserElement element) throws DatabaseException {");
634 if (inheritance.type == InheritanceType.ComplexType) {
635 fw.writer.println(" super.configure(graph,parents,element);");
637 fw.writer.println(" Layer0 L0 = Layer0.getInstance(graph);");
638 fw.writer.println(" XMLResource XML = XMLResource.getInstance(graph);");
639 fw.writer.println(" "+getOntologyImport());
641 LocalComplexType complexType = element.getComplexType();
642 LocalSimpleType simpleType = element.getSimpleType();
644 if (complexType != null) {
645 SchemaObject obj = this.base.getComplexType(complexType);
646 this.base.handleElementComplexTypeAttributes(obj);
648 fw.writer.println(" }");
650 if (inheritance.type == InheritanceType.AtomicType) {
652 fw.writer.println(" @Override");
653 fw.writer.println(" public void configure(WriteGraph graph, ParserElement element, java.lang.String string) throws DatabaseException {");
654 fw.writer.println(" graph.claimValue(element.getData(), "+getValueGetter(inheritance.atomicType,"string")+", "+inheritance.atomicType.binding+");");
655 fw.writer.println(" }");
657 // if (simpleType != null) {
658 // SchemaObject obj = simpleTypes.get(simpleType);
659 // handleElementSimpleTypeAttributes(obj);
663 StringWriter stringWriter = new StringWriter();
664 fw.delayedWriter = new PrintWriter(stringWriter);
665 StringWriter stringWriter2 = new StringWriter();
666 fw.delayedWriter2 = new PrintWriter(stringWriter2);
668 fw.writer.println(" public " + className + "() {");
669 fw.writer.println(" super();");
671 if (complexType != null) {
672 SchemaObject obj = this.base.getComplexType(complexType);
673 this.base.handleComplexTypeExtension(obj);
674 } else if (simpleType != null) {
678 fw.writer.println(" }");
680 fw.writer.println(" @Override");
681 fw.writer.println(" public boolean connectChild(WriteGraph graph, ParserElement element, ParserElement child) throws DatabaseException{");
682 fw.writer.println(" "+getOntologyImport());
684 if (stringWriter.getBuffer().length() > 0) {
685 fw.writer.write(stringWriter.toString());
687 if (inheritance.type == InheritanceType.ComplexType) {
688 fw.writer.println(" return super.connectChild(graph,element,child);");
690 fw.writer.println(" return false;");
692 fw.writer.println(" }");
695 if (stringWriter2.getBuffer().length() > 0) {
696 fw.writer.write(stringWriter2.toString());
700 fw.delayedWriter.close();
701 fw.delayedWriter = null;
702 stringWriter2 = null;
703 fw.delayedWriter2.close();
704 fw.delayedWriter2 = null;
706 writeIDReferences(fw.writer,name, references);
707 writeUnknownChild(fw.writer,name,unknownChildElement);
709 fw.writer.println("}");
714 writers.remove(elementObj);
717 ruleClassNames.add(converter.getPluginName()+"."+elementPackageName+"."+name);
721 private void writeIDProvider(PrintWriter writer) {
722 if (provider != null) {
723 writer.println(" java.lang.String idProviderValue = null;");
725 writer.println(" @Override");
726 writer.println(" public java.lang.String getID() {");
727 writer.println(" java.lang.String s = idProviderValue;");
728 writer.println(" idProviderValue = null;");
729 writer.println(" return s;");
730 writer.println(" }");
732 if (provider.getPriority() != null) {
733 writer.println(" @Override");
734 writer.println(" public int idPriority() {");
735 writer.println(" return " + provider.getPriority().intValue()+";");
736 writer.println(" }");
741 private void writeIDReferences(PrintWriter writer,String name, List<IDReference> references) {
742 if (references.size() > 0) {
743 writer.println(" @Override");
744 writer.println(" public boolean connectReferences(WriteGraph graph, ParserElement element, java.util.Map<java.lang.String, ParserElement> map) throws DatabaseException {");
745 writer.println(" "+getOntologyImport());
746 writer.println(" boolean result = true;");
747 for (IDReference ref : references) {
748 writer.println(" {");
749 writer.println(" Attribute a = element.getAttribute(\"" + ref.getIDSource().getName() +"\");");
750 writer.println(" if (a != null) {");
751 writer.println(" ParserElement refEle = map.get(a.value);");
752 writer.println(" if (refEle != null) {");
753 writer.println(" Resource ref = refEle.getData();");
754 writer.println(" graph.claim(element.getData(), "+ontShort+name+"_"+ref.getReference().getName()+", ref);");
755 writer.println(" } else {");
756 writer.println(" result = false;");
757 writer.println(" }");
758 writer.println(" }");
759 writer.println(" }");
761 writer.println(" return result;");
762 writer.println(" }");
767 private void writeUnknownChild(PrintWriter writer,String name, UnrecognizedChildElement unknownChildElement) {
768 if (unknownChildElement == null)
771 writer.println(" @Override");
772 writer.println(" public void configureChild(WriteGraph graph, Deque<ParserElement> parents, ParserElement element, ParserElement child) throws DatabaseException {");
773 writer.println(" " + unknownChildElement.getJavaMethod());
774 writer.println(" }");
780 public String getBaseClass(ObjectType type) {
781 return "org.simantics.xml.sax.base.XMLElementNamedChildParserBase";
784 protected void createClassHeader(PrintWriter writer, boolean isList) {
785 writer.println("package " + converter.getPluginName() +"."+elementPackageName+";");
787 writer.println("import java.util.Deque;");
788 writer.println("import org.simantics.databoard.Bindings;");
789 writer.println("import org.simantics.db.Resource;");
790 writer.println("import org.simantics.db.WriteGraph;");
791 writer.println("import org.simantics.db.exception.DatabaseException;");
792 writer.println("import org.simantics.xml.sax.base.Attribute;");
793 writer.println("import org.simantics.xml.sax.base.ParserElement;");
794 writer.println("import org.simantics.xml.sax.ontology.XMLResource;");
796 writer.println("import org.simantics.layer0.Layer0;");
798 writer.println("import java.util.Collections;");
799 writer.println("import org.simantics.db.common.utils.ListUtils;");