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+"());");
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+"());");
87 mainWriter.println(" }");
88 mainWriter.println("}");
96 protected String getPackagePostFix() {
101 public void handleSimpleType(SchemaObject parent, SchemaObject simpleTypeObj) {
105 public void handle(SchemaObject parent, NamedGroup attribute) {
106 // TODO Auto-generated method stub
110 public void handleComplexType(SchemaObject complexTypeObj) {
111 ComplexType topLevelComplexType = complexTypeObj.getComplexType();
113 String name = getName(complexTypeObj);
115 //if (topLevelComplexType.getName().equals("LocalizedText"))
116 //if (topLevelComplexType.getName().equals("Reference"))
117 // if (topLevelComplexType.getName().equals("NodeIdAlias"))
118 // System.out.println();
120 String className = name;//"_"+name;
122 FileWriter fw = new FileWriter();
124 fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));
125 } catch (IOException e) {
126 throw new RuntimeException(e);
128 writers.put(complexTypeObj, fw);
130 Inheritance inheritance = this.base.getInheritance(complexTypeObj);
132 provider = this.base.getIDProvider(topLevelComplexType);
133 List<IDReference> references = this.base.getIDReferences(topLevelComplexType);
134 UnrecognizedChildElement unknownChildElement = this.base.getUnknown(topLevelComplexType);
136 List<String> intrerfaces = new ArrayList<String>();
137 if (references.size() > 0)
138 intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser");
139 if (unknownChildElement != null)
140 intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser");
142 createClassHeader(fw.writer, false);
143 writeClass(fw.writer,false, null, className, inheritance.baseClass, intrerfaces);
145 writeIDProvider(fw.writer);
147 fw.writer.println(" @Override");
148 fw.writer.println(" public Resource create(WriteGraph graph, ParserElement element) throws DatabaseException{");
149 fw.writer.println(" Layer0 L0 = Layer0.getInstance(graph);");
150 fw.writer.println(" "+getOntologyImport());
151 fw.writer.println(" Resource res = graph.newResource();");
152 fw.writer.println(" graph.claim(res, L0.InstanceOf, "+ontShort+name+");");
153 fw.writer.println(" return res;");
154 fw.writer.println(" }");
157 fw.writer.println(" @Override");
158 fw.writer.println(" public boolean connectParent(WriteGraph graph, ParserElement parent, ParserElement element) throws DatabaseException{");
159 fw.writer.println(" "+getOntologyImport());
160 fw.writer.println(" graph.claim(parent.getData(), "+this.ontShort+getName(complexTypeObj,"has")+", element.getData());");
161 fw.writer.println(" return true;");
162 fw.writer.println(" }");
165 StringWriter stringWriter = new StringWriter();
166 fw.delayedWriter = new PrintWriter(stringWriter);
167 StringWriter stringWriter2 = new StringWriter();
168 fw.delayedWriter2 = new PrintWriter(stringWriter2);
170 fw.writer.println(" public " + className + "() {");
171 fw.writer.println(" super();");
173 this.base.handleComplexTypeExtension(complexTypeObj);
175 fw.writer.println(" }");
177 fw.writer.println(" @Override");
178 fw.writer.println(" public boolean connectChild(WriteGraph graph, ParserElement element, ParserElement child) throws DatabaseException{");
179 fw.writer.println(" "+getOntologyImport());
181 if (stringWriter.getBuffer().length() > 0) {
182 fw.writer.write(stringWriter.toString());
184 if (inheritance.type == InheritanceType.ComplexType) {
185 fw.writer.println(" return super.connectChild(graph,element,child);");
187 fw.writer.println(" return false;");
189 fw.writer.println(" }");
192 if (stringWriter2.getBuffer().length() > 0) {
193 fw.writer.write(stringWriter2.toString());
197 fw.delayedWriter.close();
198 fw.delayedWriter=null;
199 stringWriter2 = null;
200 fw.delayedWriter2.close();
201 fw.delayedWriter2 = null;
203 fw.writer.println(" @Override");
204 fw.writer.println(" public void configure(WriteGraph graph, Deque<ParserElement> parents, ParserElement element) throws DatabaseException {");
205 if (inheritance.type == InheritanceType.ComplexType) {
206 fw.writer.println(" super.configure(graph,parents,element);");
208 fw.writer.println(" "+getOntologyImport());
209 fw.writer.println(" Layer0 L0 = Layer0.getInstance(graph);");
210 fw.writer.println(" XMLResource XML = XMLResource.getInstance(graph);");
211 this.base.handleComplexTypeAttributes(complexTypeObj);
212 this.base.handleExtensionAttributes(complexTypeObj);
214 fw.writer.println(" }");
216 if (inheritance.type == InheritanceType.AtomicType) {
218 fw.writer.println(" @Override");
219 fw.writer.println(" public void configure(WriteGraph graph, ParserElement element, java.lang.String string) throws DatabaseException {");
220 fw.writer.println(" graph.claimValue(element.getData(), "+getValueGetter(inheritance.atomicType,"string")+", "+inheritance.atomicType.binding+");");
221 fw.writer.println(" }");
224 writeIDReferences(fw.writer,name, references);
225 writeUnknownChild(fw.writer,name,unknownChildElement);
227 fw.writer.println("}");
232 writers.remove(complexTypeObj);
237 public void createReferenceIndicator(SchemaObject parent, RefType referenceType, String refName, String objectName, String primaryClassName, String secondaryClassName, boolean useElementList, boolean useOriginalList) {
239 System.out.println();
240 FileWriter fw = getWriter(parent);
241 if (referenceType == RefType.Type) {
242 // create internal class for handling the element and child attachment
243 secondaryClassName = getName(parent) +"_" +objectName;
244 fw.writer.println(" addParser(\""+ objectName +"\", "+secondaryClassName+".class);");
245 fw.delayedWriter2.println(" public static class " + secondaryClassName +" extends " + primaryClassName +"{");
246 fw.delayedWriter2.println(" public "+ secondaryClassName +"(){");
247 fw.delayedWriter2.println(" }");
248 fw.delayedWriter2.println(" }");
249 } else { // referenceType == RefType.Reference
250 fw.writer.println(" addParser("+primaryClassName+".class);");
251 if (!primaryClassName.equals(secondaryClassName))
252 fw.writer.println(" addParser("+secondaryClassName+".class);");
255 fw.delayedWriter.println(" if (child.getElementParser() instanceof "+secondaryClassName+"){");
256 fw.delayedWriter.println(" graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+refName + ", child.getData());");
257 if (useElementList) {
259 // element type specific list
260 fw.delayedWriter.println(" {");
261 fw.delayedWriter.println(" element.registerListChild("+ontShort+getName(parent)+"_has"+refName + "_List, child);");
262 // fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "_List);");
263 // fw.delayedWriter.println(" if (list == null) {");
264 // fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
265 // fw.delayedWriter.println(" graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "_List,list);");
266 // fw.delayedWriter.println(" } else {");
267 // fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
268 // fw.delayedWriter.println(" }");
269 fw.delayedWriter.println(" }");
271 if (useOriginalList) {
273 fw.delayedWriter.println(" {");
274 fw.delayedWriter.println(" XMLResource XML = XMLResource.getInstance(graph);");
275 fw.delayedWriter.println(" element.registerListChild(XML.hasOriginalElementList, child);");
276 // fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");
277 // fw.delayedWriter.println(" if (list == null) {");
278 // fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
279 // fw.delayedWriter.println(" graph.claim(element.getData(), XML.hasOriginalElementList,list);");
280 // fw.delayedWriter.println(" } else {");
281 // fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
282 // fw.delayedWriter.println(" }");
283 fw.delayedWriter.println(" }");
286 fw.delayedWriter.println(" return true;");
287 fw.delayedWriter.println(" }");
291 protected void createPrimitiveIndicator(SchemaObject parent, String refName, TypeEntry typeEntry, QName typeName) {
292 FileWriter fw = getWriter(parent);
293 String className = getName(parent) +"_" +refName;
294 fw.writer.println(" addParser(\"" + refName + "\", " + className + ".class);");
295 fw.delayedWriter2.println(" public static class " + className + " extends org.simantics.xml.sax.base.ValueElementParser {");
296 fw.delayedWriter2.println(" public "+ className +"(){");
297 fw.delayedWriter2.println(" super(\""+refName+"\"," +this.ontologyClassName+".URIs."+getName(parent) + "_has"+refName+", "+typeEntry.binding+");");
298 fw.delayedWriter2.println(" }\n");
299 fw.delayedWriter2.println(" @Override");
300 fw.delayedWriter2.println(" public void configure(WriteGraph graph, ParserElement element, java.lang.String value) throws DatabaseException {");
301 fw.delayedWriter2.println(" Layer0 L0 = Layer0.getInstance(graph);");
303 SchemaObject simpleType = base.getSimpleType(typeName);
304 String ontologyClassName = converter.getOntologyClassName(typeName.getNamespaceURI());
305 if (ontologyClassName != null && simpleType != null)
306 fw.delayedWriter2.println(" graph.claim(element.getData(), L0.InstanceOf, " + ontologyClassName + ".getInstance(graph)." + getName(simpleType, "") + ");");
308 if (typeEntry.l0Type.startsWith("XML"))
309 fw.delayedWriter2.println(" XMLResource XML = XMLResource.getInstance(graph);");
310 fw.delayedWriter2.println(" graph.claim(element.getData(), L0.InstanceOf, " + typeEntry.l0Type + ");");
313 fw.delayedWriter2.println(" graph.claimValue(element.getData(), " +getValueGetter(typeEntry) + ", " + typeEntry.binding + ");");
314 fw.delayedWriter2.println(" }");
315 fw.delayedWriter2.println(" }");
319 protected void createElementIndicator(SchemaObject parent, boolean useElementList, String refName, String className, boolean useOriginalList) {
321 System.out.println();
322 FileWriter fw = getWriter(parent);
324 fw.writer.println(" addParser(\""+ refName +"\", "+className+".class);");
326 // fw.writer.println(" addParser("+className+".class);");
328 fw.delayedWriter.println(" if (child.getElementParser() instanceof "+className+"){");
329 fw.delayedWriter.println(" graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+refName + ", child.getData());");
330 if (useElementList) {
332 // element type specific list
333 fw.delayedWriter.println(" {");
334 fw.delayedWriter.println(" element.registerListChild(" + ontShort+getName(parent)+"_has"+refName + "_List, child);");
335 // fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "_List);");
336 // fw.delayedWriter.println(" if (list == null) {");
337 // fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
338 // fw.delayedWriter.println(" graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "_List,list);");
339 // fw.delayedWriter.println(" } else {");
340 // fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
341 // fw.delayedWriter.println(" }");
342 fw.delayedWriter.println(" }");
344 if (useOriginalList) {
346 fw.delayedWriter.println(" {");
347 fw.delayedWriter.println(" XMLResource XML = XMLResource.getInstance(graph);");
348 fw.delayedWriter.println(" element.registerListChild(XML.hasOriginalElementList, child);");
349 // fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");
350 // fw.delayedWriter.println(" if (list == null) {");
351 // fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
352 // fw.delayedWriter.println(" graph.claim(element.getData(), XML.hasOriginalElementList,list);");
353 // fw.delayedWriter.println(" } else {");
354 // fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
355 // fw.delayedWriter.println(" }");
356 fw.delayedWriter.println(" }");
359 fw.delayedWriter.println(" return true;");
360 fw.delayedWriter.println(" }");
364 public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) {
365 // generates overriding method that allows parsing any element
366 FileWriter fw = getWriter(parent);
367 fw.delayedWriter2.println(" @Override");
368 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) {");
369 fw.delayedWriter2.println(" Class<? extends org.simantics.xml.sax.base.XMLElementParser> parserClass = super.getParser(parsers, element, child);");
370 fw.delayedWriter2.println(" if (parserClass != null) return parserClass;");
371 fw.delayedWriter2.println(" org.simantics.xml.sax.base.XMLElementParser parser = parsers.get(child.getQName());");
372 fw.delayedWriter2.println(" if (parser != null) return parser.getClass();");
373 fw.delayedWriter2.println(" return null;");
374 fw.delayedWriter2.println(" }");
378 public void handle(SchemaObject parent, Attribute attribute) {
381 String attrName = attribute.getName();
382 QName primitiveType = attribute.getType();
383 SimpleType simpleType = attribute.getSimpleType();
384 QName ref = attribute.getRef();
387 if (attrName != null) {
388 relationName = ontShort+getName(parent)+"_has"+base.getName(attribute);
390 else if (ref != null && parent != null) {
391 attrName = ref.getLocalPart();
392 relationName = ontShort+getName(parent)+"_has"+base.getName(ref);
394 Attribute referred = this.base.getRefAttribute(ref);
395 if (referred != null) {
396 primitiveType = referred.getType();
397 simpleType = referred.getSimpleType();
401 throw new RuntimeException();
403 boolean isReference = false;
404 if (provider!= null && provider.getAttribute().getName().equals(attrName))
407 FileWriter fw = getWriter(parent);
408 if (primitiveType != null) {
410 //String binding = getBindingFromPrimitiveType(primitiveType);
411 TypeEntry binding = this.base.getTypeEntry(primitiveType);
413 if (binding != null) {
414 writeAttribute(fw, attrName, relationName, binding, isReference, primitiveType);
417 if (simpleType == null) {
418 SchemaObject simpleTypeObj = this.base.getSimpleType(primitiveType);//this.base.simpleTypeName.get(primitiveType.getLocalPart());
419 if (simpleTypeObj != null)
420 simpleType = simpleTypeObj.getSimpleType();
424 if (simpleType != null) {
425 org.w3._2001.xmlschema.List list = simpleType.getList();
427 QName typeName = new QName(SchemaConversionBase.SCHEMA_NS, "string");
428 TypeEntry binding = this.base.getTypeEntry(typeName);
429 writeAttribute(fw, attrName, relationName, binding, isReference, typeName);
431 // Restriction restriction = simpleType.getRestriction();
432 // if (restriction == null)
433 // throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart()+ ", SimpleType restriction is unset");
434 // QName base = restriction.getBase();
435 QName base = this.base.getSimpleTypeBase(simpleType);
438 //String binding = getBindingFromPrimitiveType(base);
439 TypeEntry binding = this.base.getTypeEntry(base);
440 writeAttribute(fw, attrName, relationName, binding, isReference, base);
443 // TODO : using default String attribute should be configured with rules.
444 //throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart());
445 fw.writer.println(" //FIXME: Cannot resolve type for Attribute " + attrName + " Using default type String");
446 //writeAttribute(fw, attrName, relationName, "STRING", isReference);
447 writeAttribute(fw, attrName, relationName, this.base.getTypeEntry("string"), isReference, new QName(SchemaConversionBase.SCHEMA_NS, "string"));
451 private void writeAttribute(FileWriter fw, String attrName, String relationName, TypeEntry binding, boolean isReference, QName typeName) {
452 String ontologyClassName = converter.getOntologyClassName(typeName.getNamespaceURI());
453 String ontologyType = ontologyClassName != null ? ontologyClassName + ".getInstance(graph)." + getName(base.getSimpleType(typeName)) : binding.l0Type;
454 fw.writer.println(" {");
455 fw.writer.println(" Attribute a = element.getAttribute(\"" +attrName+"\");");
456 fw.writer.println(" if (a != null) {");
457 fw.writer.println(" graph.claimLiteral(element.getData(), " + relationName + ", " + ontologyType + ", " + getValueGetterMethod(binding,"a") + ", " + binding.binding + ");");
459 fw.writer.println(" idProviderValue = a.getValue();");
460 fw.writer.println(" }");
461 fw.writer.println(" }");
465 public void handleAttributes(SchemaObject simpleTypeObj) {
466 SchemaObject parent = simpleTypeObj.getParent();
467 FileWriter fw = getWriter(parent);
469 SimpleType simpleType = simpleTypeObj.getSimpleType();
470 Restriction restriction = simpleType.getRestriction();
471 if (restriction == null)
472 throw new RuntimeException("Cannot resolve type for Element " + getName(parent));
473 QName base = restriction.getBase();
476 //String binding = getBindingFromPrimitiveType(base);
477 TypeEntry binding = this.base.getTypeEntry(base);
478 fw.writer.println(" @Override");
479 fw.writer.println(" public void configure(WriteGraph graph, ParserElement element, java.lang.String value) throws DatabaseException {");
480 //fw.writer.println(" graph.claimValue(element.getData(),"+getValueGetter(binding)+", Bindings."+binding+");");
481 fw.writer.println(" graph.claimValue(element.getData(),"+getValueGetter(binding)+", "+binding.binding +");");
482 fw.writer.println(" }");
487 public void handle(SchemaObject parent, AttributeGroup attribute) {
488 if (parent != null) {
489 FileWriter fw = getWriter(parent);
490 NamedAttributeGroup group = this.base.getAttributeGroup(attribute.getRef());
491 fw.writer.println(commentTag+" AttributeGroup " + group.getName());
492 SchemaObject obj = new SchemaObject(base,parent,attribute);
493 for (Annotated annotated : group.getAttributeOrAttributeGroup()) {
494 if (annotated instanceof Attribute) {
495 //handle("AttributeGroups_"+group.getName(),(Attribute)annotated);
496 handle(obj,(Attribute)annotated);
497 } else if (annotated instanceof AttributeGroup) {
498 //handle("AttributeGroups_"+group.getName(),(AttributeGroup)annotated);
499 handle(obj,(AttributeGroup)annotated);
504 System.out.println();
505 fw.writer.println(commentTag+" End of AttributeGroup " + group.getName());
511 public void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes) {
512 FileWriter fw = getWriter(parent);
513 QName type = new QName(SchemaConversionBase.CONVERSION_NS, composition.getType());
514 String arrayBinding = this.base.getBindingFromPrimitiveType(type);
515 String javaType = this.base.getJavaTypeFromPrimitiveType(type);
516 String name = composition.getName();
520 relationName = ontShort+"has"+name;
522 relationName = ontShort+getName(parent)+"_has"+name;
524 throw new RuntimeException();
527 fw.writer.println(" {");
529 for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute())
530 fw.writer.println(" Attribute a"+(i++)+" = element.getAttribute(\"" +a.getName()+"\");");
531 fw.writer.print (" "+javaType + " value = new "+javaType+"{");
533 // FIXME : handle optional attributes properly.
534 for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute()) {
535 Attribute attribute = ((Attribute)attributes.getRight(a));
536 //QName atype = getBaseType(attribute);
537 QName atype = this.base.getPrimitiveType(attribute);
538 String defaultValue = attribute.getDefault();
539 if (defaultValue == null)
540 defaultValue = this.base.getDefaultValue(atype);
542 //String binding = getBindingFromPrimitiveType(atype);
543 TypeEntry binding = this.base.getTypeEntry(atype);
545 fw.writer.print(",");
546 if (defaultValue != null)
547 fw.writer.print("a"+(i)+"!= null ? "+ getValueGetterMethod(binding,"a"+(i++)) + " : " +defaultValue);
549 fw.writer.print(getValueGetterMethod(binding,"a"+(i++)));
551 fw.writer.println("};");
552 fw.writer.println(" graph.claimLiteral(element.getData(),"+relationName+", value, "+arrayBinding+");");
553 fw.writer.println(" }");
565 public void handleElement(SchemaObject elementObj) {
566 Element element = elementObj.getElement();
568 String name = getName(elementObj);//topLevelElement.getName();
569 String className = name;
571 FileWriter fw = new FileWriter();
573 fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));
574 } catch (IOException e) {
575 throw new RuntimeException(e);
577 writers.put(elementObj, fw);
578 boolean isList = false;
580 Inheritance inheritance = this.base.getInheritance(elementObj);
582 provider = this.base.getIDProvider(element);
583 List<IDReference> references = this.base.getIDReferences(element);
584 UnrecognizedChildElement unknownChildElement = this.base.getUnknown(element);
586 List<String> intrerfaces = new ArrayList<String>();
587 if (references.size() > 0)
588 intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser");
589 if (unknownChildElement != null)
590 intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser");
592 createClassHeader(fw.writer, isList);
593 writeClass(fw.writer,false, element.getName(), className, inheritance.baseClass, intrerfaces);
594 writeIDProvider(fw.writer);
595 fw.writer.println(" @Override");
596 fw.writer.println(" public Resource create(WriteGraph graph, ParserElement element) throws DatabaseException{");
597 fw.writer.println(" Layer0 L0 = Layer0.getInstance(graph);");
598 fw.writer.println(" "+getOntologyImport());
600 fw.writer.println(" Resource res = graph.newResource();");
601 fw.writer.println(" graph.claim(res, L0.InstanceOf, "+ontShort+name+");");
603 fw.writer.println(" Resource res = ListUtils.create(graph, "+ontShort+name+", Collections.EMPTY_LIST);");
605 fw.writer.println(" return res;");
606 fw.writer.println(" }");
609 fw.writer.println(" @Override");
610 fw.writer.println(" public boolean connectParent(WriteGraph graph, ParserElement parent, ParserElement element) throws DatabaseException{");
611 fw.writer.println(" "+getOntologyImport());
612 fw.writer.println(" graph.claim(parent.getData(), "+this.ontShort+getName(elementObj,"has")+", element.getData());");
613 fw.writer.println(" return true;");
614 fw.writer.println(" }");
617 fw.writer.println(" @Override");
618 fw.writer.println(" public void configure(WriteGraph graph, Deque<ParserElement> parents, ParserElement element) throws DatabaseException {");
619 if (inheritance.type == InheritanceType.ComplexType) {
620 fw.writer.println(" super.configure(graph,parents,element);");
622 fw.writer.println(" Layer0 L0 = Layer0.getInstance(graph);");
623 fw.writer.println(" XMLResource XML = XMLResource.getInstance(graph);");
624 fw.writer.println(" "+getOntologyImport());
626 LocalComplexType complexType = element.getComplexType();
627 LocalSimpleType simpleType = element.getSimpleType();
629 if (complexType != null) {
630 SchemaObject obj = this.base.getComplexType(complexType);
631 this.base.handleElementComplexTypeAttributes(obj);
633 fw.writer.println(" }");
635 if (inheritance.type == InheritanceType.AtomicType) {
637 fw.writer.println(" @Override");
638 fw.writer.println(" public void configure(WriteGraph graph, ParserElement element, java.lang.String string) throws DatabaseException {");
639 fw.writer.println(" graph.claimValue(element.getData(), "+getValueGetter(inheritance.atomicType,"string")+", "+inheritance.atomicType.binding+");");
640 fw.writer.println(" }");
642 // if (simpleType != null) {
643 // SchemaObject obj = simpleTypes.get(simpleType);
644 // handleElementSimpleTypeAttributes(obj);
648 StringWriter stringWriter = new StringWriter();
649 fw.delayedWriter = new PrintWriter(stringWriter);
650 StringWriter stringWriter2 = new StringWriter();
651 fw.delayedWriter2 = new PrintWriter(stringWriter2);
653 fw.writer.println(" public " + className + "() {");
654 fw.writer.println(" super();");
656 if (complexType != null) {
657 SchemaObject obj = this.base.getComplexType(complexType);
658 this.base.handleComplexTypeExtension(obj);
659 } else if (simpleType != null) {
663 fw.writer.println(" }");
665 fw.writer.println(" @Override");
666 fw.writer.println(" public boolean connectChild(WriteGraph graph, ParserElement element, ParserElement child) throws DatabaseException{");
667 fw.writer.println(" "+getOntologyImport());
669 if (stringWriter.getBuffer().length() > 0) {
670 fw.writer.write(stringWriter.toString());
672 if (inheritance.type == InheritanceType.ComplexType) {
673 fw.writer.println(" return super.connectChild(graph,element,child);");
675 fw.writer.println(" return false;");
677 fw.writer.println(" }");
680 if (stringWriter2.getBuffer().length() > 0) {
681 fw.writer.write(stringWriter2.toString());
685 fw.delayedWriter.close();
686 fw.delayedWriter = null;
687 stringWriter2 = null;
688 fw.delayedWriter2.close();
689 fw.delayedWriter2 = null;
691 writeIDReferences(fw.writer,name, references);
692 writeUnknownChild(fw.writer,name,unknownChildElement);
694 fw.writer.println("}");
699 writers.remove(elementObj);
702 ruleClassNames.add(converter.getPluginName()+"."+elementPackageName+"."+name);
706 private void writeIDProvider(PrintWriter writer) {
707 if (provider != null) {
708 writer.println(" java.lang.String idProviderValue = null;");
710 writer.println(" @Override");
711 writer.println(" public java.lang.String getID() {");
712 writer.println(" java.lang.String s = idProviderValue;");
713 writer.println(" idProviderValue = null;");
714 writer.println(" return s;");
715 writer.println(" }");
717 if (provider.getPriority() != null) {
718 writer.println(" @Override");
719 writer.println(" public int idPriority() {");
720 writer.println(" return " + provider.getPriority().intValue()+";");
721 writer.println(" }");
726 private void writeIDReferences(PrintWriter writer,String name, List<IDReference> references) {
727 if (references.size() > 0) {
728 writer.println(" @Override");
729 writer.println(" public boolean connectReferences(WriteGraph graph, ParserElement element, java.util.Map<java.lang.String, ParserElement> map) throws DatabaseException {");
730 writer.println(" "+getOntologyImport());
731 writer.println(" boolean result = true;");
732 for (IDReference ref : references) {
733 writer.println(" {");
734 writer.println(" Attribute a = element.getAttribute(\"" + ref.getIDSource().getName() +"\");");
735 writer.println(" if (a != null) {");
736 writer.println(" ParserElement refEle = map.get(a.value);");
737 writer.println(" if (refEle != null) {");
738 writer.println(" Resource ref = refEle.getData();");
739 writer.println(" graph.claim(element.getData(), "+ontShort+name+"_"+ref.getReference().getName()+", ref);");
740 writer.println(" } else {");
741 writer.println(" result = false;");
742 writer.println(" }");
743 writer.println(" }");
744 writer.println(" }");
746 writer.println(" return result;");
747 writer.println(" }");
752 private void writeUnknownChild(PrintWriter writer,String name, UnrecognizedChildElement unknownChildElement) {
753 if (unknownChildElement == null)
756 writer.println(" @Override");
757 writer.println(" public void configureChild(WriteGraph graph, Deque<ParserElement> parents, ParserElement element, ParserElement child) throws DatabaseException {");
758 writer.println(" " + unknownChildElement.getJavaMethod());
759 writer.println(" }");
765 public String getBaseClass(ObjectType type) {
766 return "org.simantics.xml.sax.base.XMLElementNamedChildParserBase";
769 protected void createClassHeader(PrintWriter writer, boolean isList) {
770 writer.println("package " + converter.getPluginName() +"."+elementPackageName+";");
772 writer.println("import java.util.Deque;");
773 writer.println("import org.simantics.databoard.Bindings;");
774 writer.println("import org.simantics.db.Resource;");
775 writer.println("import org.simantics.db.WriteGraph;");
776 writer.println("import org.simantics.db.exception.DatabaseException;");
777 writer.println("import org.simantics.xml.sax.base.Attribute;");
778 writer.println("import org.simantics.xml.sax.base.ParserElement;");
779 writer.println("import org.simantics.xml.sax.ontology.XMLResource;");
781 writer.println("import org.simantics.layer0.Layer0;");
783 writer.println("import java.util.Collections;");
784 writer.println("import org.simantics.db.common.utils.ListUtils;");