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 parserPackagePostfix = "_elem";
43 String importerClassPostfix = "Importer";
44 String parserClassPostfix = "Parser";
45 elementPackageName = name+parserPackagePostfix;
47 importParserDir= new File(converter.getParserDir().getAbsolutePath()+"/"+elementPackageName);
48 if (!importParserDir.exists())
49 importParserDir.mkdirs();
52 // Create Importer class
53 File importerFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+importerClassPostfix+".java");
54 PrintWriter mainWriter = createFile(importerFile);
55 mainWriter.println("package " + converter.getPluginName() +";");
57 mainWriter.println("import java.io.File;");
58 mainWriter.println("import org.simantics.db.Session;");
59 mainWriter.println("import org.simantics.xml.sax.base.AbstractImporter;");
61 mainWriter.println("public class " + name + importerClassPostfix+" extends AbstractImporter {");
63 mainWriter.println(" public " + name + importerClassPostfix+"(Session session, File file) {");
64 mainWriter.println(" super(session, file, new "+name + parserClassPostfix+"());");
65 mainWriter.println(" }");
67 mainWriter.println("}");
73 // Create Parser class
74 File parserFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+parserClassPostfix+".java");
75 mainWriter = createFile(parserFile);
76 mainWriter.println("package " + converter.getPluginName() +";");
78 mainWriter.println("import org.simantics.xml.sax.base.XMLParser;");
80 mainWriter.println("public class " + name + parserClassPostfix+" extends XMLParser {");
82 mainWriter.println(" public " + name + parserClassPostfix+"() {");
83 if (schema.getTargetNamespace() != null)
84 mainWriter.println(" setSchemaURI(\""+schema.getTargetNamespace()+"\");");
85 for (String s : ruleClassNames) {
86 mainWriter.println(" add(new "+s+"());");
88 mainWriter.println(" }");
89 mainWriter.println("}");
97 public void handleSimpleType(SchemaObject parent, SchemaObject simpleTypeObj) {
101 public void handle(SchemaObject parent, NamedGroup attribute) {
102 // TODO Auto-generated method stub
106 public void handleComplexType(SchemaObject complexTypeObj) {
107 ComplexType topLevelComplexType = complexTypeObj.getComplexType();
109 String name = getName(complexTypeObj);
111 //if (topLevelComplexType.getName().equals("LocalizedText"))
112 //if (topLevelComplexType.getName().equals("Reference"))
113 // if (topLevelComplexType.getName().equals("NodeIdAlias"))
114 // System.out.println();
116 String className = name;//"_"+name;
118 FileWriter fw = new FileWriter();
120 fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));
121 } catch (IOException e) {
122 throw new RuntimeException(e);
124 writers.put(complexTypeObj, fw);
126 Inheritance inheritance = this.base.getInheritance(complexTypeObj);
128 provider = this.base.getIDProvider(topLevelComplexType);
129 List<IDReference> references = this.base.getIDReferences(topLevelComplexType);
130 UnrecognizedChildElement unknownChildElement = this.base.getUnknown(topLevelComplexType);
132 List<String> intrerfaces = new ArrayList<String>();
133 if (references.size() > 0)
134 intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser");
135 if (unknownChildElement != null)
136 intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser");
138 createClassHeader(fw.writer, false);
139 writeClass(fw.writer,false, null, className, inheritance.baseClass, intrerfaces);
141 writeIDProvider(fw.writer);
143 fw.writer.println(" @Override");
144 fw.writer.println(" public Resource create(WriteGraph graph, ParserElement element) throws DatabaseException{");
145 fw.writer.println(" Layer0 L0 = Layer0.getInstance(graph);");
146 fw.writer.println(" "+getOntologyImport());
147 fw.writer.println(" Resource res = graph.newResource();");
148 fw.writer.println(" graph.claim(res, L0.InstanceOf, "+ontShort+name+");");
149 fw.writer.println(" return res;");
150 fw.writer.println(" }");
153 fw.writer.println(" @Override");
154 fw.writer.println(" public boolean connectParent(WriteGraph graph, ParserElement parent, ParserElement element) throws DatabaseException{");
155 fw.writer.println(" "+getOntologyImport());
156 fw.writer.println(" graph.claim(parent.getData(), "+this.ontShort+getName(complexTypeObj,"has")+", element.getData());");
157 fw.writer.println(" return true;");
158 fw.writer.println(" }");
161 StringWriter stringWriter = new StringWriter();
162 fw.delayedWriter = new PrintWriter(stringWriter);
163 StringWriter stringWriter2 = new StringWriter();
164 fw.delayedWriter2 = new PrintWriter(stringWriter2);
166 fw.writer.println(" public " + className + "() {");
167 fw.writer.println(" super();");
169 this.base.handleComplexTypeExtension(complexTypeObj);
171 fw.writer.println(" }");
173 fw.writer.println(" @Override");
174 fw.writer.println(" public boolean connectChild(WriteGraph graph, ParserElement element, ParserElement child) throws DatabaseException{");
175 fw.writer.println(" "+getOntologyImport());
177 if (stringWriter.getBuffer().length() > 0) {
178 fw.writer.write(stringWriter.toString());
180 if (inheritance.type == InheritanceType.ComplexType) {
181 fw.writer.println(" return super.connectChild(graph,element,child);");
183 fw.writer.println(" return false;");
185 fw.writer.println(" }");
188 if (stringWriter2.getBuffer().length() > 0) {
189 fw.writer.write(stringWriter2.toString());
193 fw.delayedWriter.close();
194 fw.delayedWriter=null;
195 stringWriter2 = null;
196 fw.delayedWriter2.close();
197 fw.delayedWriter2 = null;
199 fw.writer.println(" @Override");
200 fw.writer.println(" public void configure(WriteGraph graph, Deque<ParserElement> parents, ParserElement element) throws DatabaseException {");
201 if (inheritance.type == InheritanceType.ComplexType) {
202 fw.writer.println(" super.configure(graph,parents,element);");
204 fw.writer.println(" "+getOntologyImport());
205 fw.writer.println(" Layer0 L0 = Layer0.getInstance(graph);");
206 fw.writer.println(" XMLResource XML = XMLResource.getInstance(graph);");
207 this.base.handleComplexTypeAttributes(complexTypeObj);
208 this.base.handleExtensionAttributes(complexTypeObj);
210 fw.writer.println(" }");
212 if (inheritance.type == InheritanceType.AtomicType) {
214 fw.writer.println(" @Override");
215 fw.writer.println(" public void configure(WriteGraph graph, ParserElement element, java.lang.String string) throws DatabaseException {");
216 fw.writer.println(" graph.claimValue(element.getData(), "+getValueGetter(inheritance.atomicType,"string")+", "+inheritance.atomicType.binding+");");
217 fw.writer.println(" }");
220 writeIDReferences(fw.writer,name, references);
221 writeUnknownChild(fw.writer,name,unknownChildElement);
223 fw.writer.println("}");
228 writers.remove(complexTypeObj);
233 public void createReferenceIndicator(SchemaObject parent, RefType referenceType, String refName, String objectName, String primaryClassName, String secondaryClassName, boolean useElementList, boolean useOriginalList) {
234 FileWriter fw = getWriter(parent);
235 if (referenceType == RefType.Type) {
236 // create internal class for handling the element and child attachment
237 secondaryClassName = getName(parent) +"_" +objectName;
238 fw.writer.println(" addParser(\""+ objectName +"\", "+secondaryClassName+".class);");
239 fw.delayedWriter2.println(" public static class " + secondaryClassName +" extends " + primaryClassName +"{");
240 fw.delayedWriter2.println(" public "+ secondaryClassName +"(){");
241 fw.delayedWriter2.println(" }");
242 fw.delayedWriter2.println(" }");
243 } else { // referenceType == RefType.Reference
244 fw.writer.println(" addParser("+primaryClassName+".class);");
245 if (!primaryClassName.equals(secondaryClassName))
246 fw.writer.println(" addParser("+secondaryClassName+".class);");
249 fw.delayedWriter.println(" if (child.getElementParser() instanceof "+secondaryClassName+"){");
250 fw.delayedWriter.println(" graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+refName + ", child.getData());");
251 if (useElementList) {
253 // element type specific list
254 fw.delayedWriter.println(" {");
255 fw.delayedWriter.println(" element.registerListChild("+ontShort+getName(parent)+"_has"+refName + "_List, child);");
256 // fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "_List);");
257 // fw.delayedWriter.println(" if (list == null) {");
258 // fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
259 // fw.delayedWriter.println(" graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "_List,list);");
260 // fw.delayedWriter.println(" } else {");
261 // fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
262 // fw.delayedWriter.println(" }");
263 fw.delayedWriter.println(" }");
265 if (useOriginalList) {
267 fw.delayedWriter.println(" {");
268 fw.delayedWriter.println(" XMLResource XML = XMLResource.getInstance(graph);");
269 fw.delayedWriter.println(" element.registerListChild(XML.hasOriginalElementList, child);");
270 // fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");
271 // fw.delayedWriter.println(" if (list == null) {");
272 // fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
273 // fw.delayedWriter.println(" graph.claim(element.getData(), XML.hasOriginalElementList,list);");
274 // fw.delayedWriter.println(" } else {");
275 // fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
276 // fw.delayedWriter.println(" }");
277 fw.delayedWriter.println(" }");
280 fw.delayedWriter.println(" return true;");
281 fw.delayedWriter.println(" }");
285 protected void createPrimitiveIndicator(SchemaObject parent, String refName, TypeEntry typeEntry, QName typeName) {
286 FileWriter fw = getWriter(parent);
287 String className = getName(parent) +"_" +refName;
288 fw.writer.println(" addParser(\"" + refName + "\", " + className + ".class);");
289 fw.delayedWriter2.println(" public static class " + className + " extends org.simantics.xml.sax.base.ValueElementParser {");
290 fw.delayedWriter2.println(" public "+ className +"(){");
291 fw.delayedWriter2.println(" super(\""+refName+"\"," +this.ontologyClassName+".URIs."+getName(parent) + "_has"+refName+", "+typeEntry.binding+");");
292 fw.delayedWriter2.println(" }\n");
293 fw.delayedWriter2.println(" @Override");
294 fw.delayedWriter2.println(" public void configure(WriteGraph graph, ParserElement element, java.lang.String value) throws DatabaseException {");
295 fw.delayedWriter2.println(" Layer0 L0 = Layer0.getInstance(graph);");
297 SchemaObject simpleType = base.getSimpleType(typeName);
298 String ontologyClassName = converter.getOntologyClassName(typeName.getNamespaceURI());
299 if (ontologyClassName != null && simpleType != null)
300 fw.delayedWriter2.println(" graph.claim(element.getData(), L0.InstanceOf, " + ontologyClassName + ".getInstance(graph)." + getName(simpleType, "") + ");");
302 if (typeEntry.l0Type.startsWith("XML"))
303 fw.delayedWriter2.println(" XMLResource XML = XMLResource.getInstance(graph);");
304 fw.delayedWriter2.println(" graph.claim(element.getData(), L0.InstanceOf, " + typeEntry.l0Type + ");");
307 fw.delayedWriter2.println(" graph.claimValue(element.getData(), " +getValueGetter(typeEntry) + ", " + typeEntry.binding + ");");
308 fw.delayedWriter2.println(" }");
309 fw.delayedWriter2.println(" }");
313 protected void createElementIndicator(SchemaObject parent, boolean useElementList, String refName, String className, boolean useOriginalList) {
314 FileWriter fw = getWriter(parent);
316 fw.writer.println(" addParser(\""+ refName +"\", "+className+".class);");
318 // fw.writer.println(" addParser("+className+".class);");
320 fw.delayedWriter.println(" if (child.getElementParser() instanceof "+className+"){");
321 fw.delayedWriter.println(" graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+refName + ", child.getData());");
322 if (useElementList) {
324 // element type specific list
325 fw.delayedWriter.println(" {");
326 fw.delayedWriter.println(" element.registerListChild(" + ontShort+getName(parent)+"_has"+refName + "_List, child);");
327 // fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "_List);");
328 // fw.delayedWriter.println(" if (list == null) {");
329 // fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
330 // fw.delayedWriter.println(" graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "_List,list);");
331 // fw.delayedWriter.println(" } else {");
332 // fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
333 // fw.delayedWriter.println(" }");
334 fw.delayedWriter.println(" }");
336 if (useOriginalList) {
338 fw.delayedWriter.println(" {");
339 fw.delayedWriter.println(" XMLResource XML = XMLResource.getInstance(graph);");
340 fw.delayedWriter.println(" element.registerListChild(XML.hasOriginalElementList, child);");
341 // fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");
342 // fw.delayedWriter.println(" if (list == null) {");
343 // fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
344 // fw.delayedWriter.println(" graph.claim(element.getData(), XML.hasOriginalElementList,list);");
345 // fw.delayedWriter.println(" } else {");
346 // fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
347 // fw.delayedWriter.println(" }");
348 fw.delayedWriter.println(" }");
351 fw.delayedWriter.println(" return true;");
352 fw.delayedWriter.println(" }");
356 public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) {
357 // generates overriding method that allows parsing any element
358 FileWriter fw = getWriter(parent);
359 fw.delayedWriter2.println(" @Override");
360 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) {");
361 fw.delayedWriter2.println(" Class<? extends org.simantics.xml.sax.base.XMLElementParser> parserClass = super.getParser(parsers, element, child);");
362 fw.delayedWriter2.println(" if (parserClass != null) return parserClass;");
363 fw.delayedWriter2.println(" org.simantics.xml.sax.base.XMLElementParser parser = parsers.get(child.getQName());");
364 fw.delayedWriter2.println(" if (parser != null) return parser.getClass();");
365 fw.delayedWriter2.println(" return null;");
366 fw.delayedWriter2.println(" }");
370 public void handle(SchemaObject parent, Attribute attribute) {
373 String name = attribute.getName();
374 QName primitiveType = attribute.getType();
375 SimpleType simpleType = attribute.getSimpleType();
376 QName ref = attribute.getRef();
382 relationName = ontShort+"has"+name;
384 relationName = ontShort+getName(parent)+"_has"+name;
386 else if (ref != null && parent != null) {
387 attrName = ref.getLocalPart();
388 relationName = ontShort+getName(parent)+"_has"+ref.getLocalPart();
390 Attribute referred = this.base.getRefAttribute(ref);
391 if (referred != null) {
392 primitiveType = referred.getType();
393 simpleType = referred.getSimpleType();
397 throw new RuntimeException();
399 boolean isReference = false;
400 if (provider!= null && provider.getAttribute().getName().equals(attrName))
403 FileWriter fw = getWriter(parent);
404 if (primitiveType != null) {
406 //String binding = getBindingFromPrimitiveType(primitiveType);
407 TypeEntry binding = this.base.getTypeEntry(primitiveType);
409 if (binding != null) {
410 writeAttribute(fw, attrName, relationName, binding, isReference, primitiveType);
413 if (simpleType == null) {
414 SchemaObject simpleTypeObj = this.base.getSimpleType(primitiveType);//this.base.simpleTypeName.get(primitiveType.getLocalPart());
415 if (simpleTypeObj != null)
416 simpleType = simpleTypeObj.getSimpleType();
420 if (simpleType != null) {
421 org.w3._2001.xmlschema.List list = simpleType.getList();
423 QName typeName = new QName(SchemaConversionBase.SCHEMA_NS, "string");
424 TypeEntry binding = this.base.getTypeEntry(typeName);
425 writeAttribute(fw, attrName, relationName, binding, isReference, typeName);
427 // Restriction restriction = simpleType.getRestriction();
428 // if (restriction == null)
429 // throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart()+ ", SimpleType restriction is unset");
430 // QName base = restriction.getBase();
431 QName base = this.base.getSimpleTypeBase(simpleType);
434 //String binding = getBindingFromPrimitiveType(base);
435 TypeEntry binding = this.base.getTypeEntry(base);
436 writeAttribute(fw, attrName, relationName, binding, isReference, base);
439 // TODO : using default String attribute should be configured with rules.
440 //throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart());
441 fw.writer.println(" //FIXME: Cannot resolve type for Attribute " + attrName + " Using default type String");
442 //writeAttribute(fw, attrName, relationName, "STRING", isReference);
443 writeAttribute(fw, attrName, relationName, this.base.getTypeEntry("string"), isReference, new QName(SchemaConversionBase.SCHEMA_NS, "string"));
447 private void writeAttribute(FileWriter fw, String attrName, String relationName, TypeEntry binding, boolean isReference, QName typeName) {
448 String ontologyClassName = converter.getOntologyClassName(typeName.getNamespaceURI());
449 String ontologyType = ontologyClassName != null ? ontologyClassName + ".getInstance(graph)." + getName(base.getSimpleType(typeName)) : binding.l0Type;
450 fw.writer.println(" {");
451 fw.writer.println(" Attribute a = element.getAttribute(\"" +attrName+"\");");
452 fw.writer.println(" if (a != null) {");
453 fw.writer.println(" graph.claimLiteral(element.getData(), " + relationName + ", " + ontologyType + ", " + getValueGetterMethod(binding,"a") + ", " + binding.binding + ");");
455 fw.writer.println(" idProviderValue = a.getValue();");
456 fw.writer.println(" }");
457 fw.writer.println(" }");
461 public void handleAttributes(SchemaObject simpleTypeObj) {
462 SchemaObject parent = simpleTypeObj.getParent();
463 FileWriter fw = getWriter(parent);
465 SimpleType simpleType = simpleTypeObj.getSimpleType();
466 Restriction restriction = simpleType.getRestriction();
467 if (restriction == null)
468 throw new RuntimeException("Cannot resolve type for Element " + getName(parent));
469 QName base = restriction.getBase();
472 //String binding = getBindingFromPrimitiveType(base);
473 TypeEntry binding = this.base.getTypeEntry(base);
474 fw.writer.println(" @Override");
475 fw.writer.println(" public void configure(WriteGraph graph, ParserElement element, java.lang.String value) throws DatabaseException {");
476 //fw.writer.println(" graph.claimValue(element.getData(),"+getValueGetter(binding)+", Bindings."+binding+");");
477 fw.writer.println(" graph.claimValue(element.getData(),"+getValueGetter(binding)+", "+binding.binding +");");
478 fw.writer.println(" }");
483 public void handle(SchemaObject parent, AttributeGroup attribute) {
484 if (parent != null) {
485 FileWriter fw = getWriter(parent);
486 NamedAttributeGroup group = this.base.getAttributeGroup(attribute.getRef());
487 fw.writer.println(commentTag+" AttributeGroup " + group.getName());
488 SchemaObject obj = new SchemaObject(parent,attribute);
489 for (Annotated annotated : group.getAttributeOrAttributeGroup()) {
490 if (annotated instanceof Attribute) {
491 //handle("AttributeGroups_"+group.getName(),(Attribute)annotated);
492 handle(obj,(Attribute)annotated);
493 } else if (annotated instanceof AttributeGroup) {
494 //handle("AttributeGroups_"+group.getName(),(AttributeGroup)annotated);
495 handle(obj,(AttributeGroup)annotated);
500 System.out.println();
501 fw.writer.println(commentTag+" End of AttributeGroup " + group.getName());
507 public void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes) {
508 FileWriter fw = getWriter(parent);
509 QName type = new QName(SchemaConversionBase.CONVERSION_NS, composition.getType());
510 String arrayBinding = this.base.getBindingFromPrimitiveType(type);
511 String javaType = this.base.getJavaTypeFromPrimitiveType(type);
512 String name = composition.getName();
516 relationName = ontShort+"has"+name;
518 relationName = ontShort+getName(parent)+"_has"+name;
520 throw new RuntimeException();
523 fw.writer.println(" {");
525 for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute())
526 fw.writer.println(" Attribute a"+(i++)+" = element.getAttribute(\"" +a.getName()+"\");");
527 fw.writer.print (" "+javaType + " value = new "+javaType+"{");
529 // FIXME : handle optional attributes properly.
530 for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute()) {
531 Attribute attribute = ((Attribute)attributes.getRight(a));
532 //QName atype = getBaseType(attribute);
533 QName atype = this.base.getPrimitiveType(attribute);
534 String defaultValue = attribute.getDefault();
535 if (defaultValue == null)
536 defaultValue = this.base.getDefaultValue(atype);
538 //String binding = getBindingFromPrimitiveType(atype);
539 TypeEntry binding = this.base.getTypeEntry(atype);
541 fw.writer.print(",");
542 if (defaultValue != null)
543 fw.writer.print("a"+(i)+"!= null ? "+ getValueGetterMethod(binding,"a"+(i++)) + " : " +defaultValue);
545 fw.writer.print(getValueGetterMethod(binding,"a"+(i++)));
547 fw.writer.println("};");
548 fw.writer.println(" graph.claimLiteral(element.getData(),"+relationName+", value, "+arrayBinding+");");
549 fw.writer.println(" }");
561 public void handleElement(SchemaObject elementObj) {
562 Element element = elementObj.getElement();
564 String name = getName(elementObj);//topLevelElement.getName();
565 String className = name;
567 FileWriter fw = new FileWriter();
569 fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));
570 } catch (IOException e) {
571 throw new RuntimeException(e);
573 writers.put(elementObj, fw);
574 boolean isList = false;
576 Inheritance inheritance = this.base.getInheritance(elementObj);
578 provider = this.base.getIDProvider(element);
579 List<IDReference> references = this.base.getIDReferences(element);
580 UnrecognizedChildElement unknownChildElement = this.base.getUnknown(element);
582 List<String> intrerfaces = new ArrayList<String>();
583 if (references.size() > 0)
584 intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser");
585 if (unknownChildElement != null)
586 intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser");
588 createClassHeader(fw.writer, isList);
589 writeClass(fw.writer,false, element.getName(), className, inheritance.baseClass, intrerfaces);
590 writeIDProvider(fw.writer);
591 fw.writer.println(" @Override");
592 fw.writer.println(" public Resource create(WriteGraph graph, ParserElement element) throws DatabaseException{");
593 fw.writer.println(" Layer0 L0 = Layer0.getInstance(graph);");
594 fw.writer.println(" "+getOntologyImport());
596 fw.writer.println(" Resource res = graph.newResource();");
597 fw.writer.println(" graph.claim(res, L0.InstanceOf, "+ontShort+name+");");
599 fw.writer.println(" Resource res = ListUtils.create(graph, "+ontShort+name+", Collections.EMPTY_LIST);");
601 fw.writer.println(" return res;");
602 fw.writer.println(" }");
605 fw.writer.println(" @Override");
606 fw.writer.println(" public boolean connectParent(WriteGraph graph, ParserElement parent, ParserElement element) throws DatabaseException{");
607 fw.writer.println(" "+getOntologyImport());
608 fw.writer.println(" graph.claim(parent.getData(), "+this.ontShort+getName(elementObj,"has")+", element.getData());");
609 fw.writer.println(" return true;");
610 fw.writer.println(" }");
613 fw.writer.println(" @Override");
614 fw.writer.println(" public void configure(WriteGraph graph, Deque<ParserElement> parents, ParserElement element) throws DatabaseException {");
615 if (inheritance.type == InheritanceType.ComplexType) {
616 fw.writer.println(" super.configure(graph,parents,element);");
618 fw.writer.println(" Layer0 L0 = Layer0.getInstance(graph);");
619 fw.writer.println(" XMLResource XML = XMLResource.getInstance(graph);");
620 fw.writer.println(" "+getOntologyImport());
622 LocalComplexType complexType = element.getComplexType();
623 LocalSimpleType simpleType = element.getSimpleType();
625 if (complexType != null) {
626 SchemaObject obj = this.base.getComplexType(complexType);
627 this.base.handleElementComplexTypeAttributes(obj);
629 fw.writer.println(" }");
631 if (inheritance.type == InheritanceType.AtomicType) {
633 fw.writer.println(" @Override");
634 fw.writer.println(" public void configure(WriteGraph graph, ParserElement element, java.lang.String string) throws DatabaseException {");
635 fw.writer.println(" graph.claimValue(element.getData(), "+getValueGetter(inheritance.atomicType,"string")+", "+inheritance.atomicType.binding+");");
636 fw.writer.println(" }");
638 // if (simpleType != null) {
639 // SchemaObject obj = simpleTypes.get(simpleType);
640 // handleElementSimpleTypeAttributes(obj);
644 StringWriter stringWriter = new StringWriter();
645 fw.delayedWriter = new PrintWriter(stringWriter);
646 StringWriter stringWriter2 = new StringWriter();
647 fw.delayedWriter2 = new PrintWriter(stringWriter2);
649 fw.writer.println(" public " + className + "() {");
650 fw.writer.println(" super();");
652 if (complexType != null) {
653 SchemaObject obj = this.base.getComplexType(complexType);
654 this.base.handleComplexTypeExtension(obj);
655 } else if (simpleType != null) {
659 fw.writer.println(" }");
661 fw.writer.println(" @Override");
662 fw.writer.println(" public boolean connectChild(WriteGraph graph, ParserElement element, ParserElement child) throws DatabaseException{");
663 fw.writer.println(" "+getOntologyImport());
665 if (stringWriter.getBuffer().length() > 0) {
666 fw.writer.write(stringWriter.toString());
668 if (inheritance.type == InheritanceType.ComplexType) {
669 fw.writer.println(" return super.connectChild(graph,element,child);");
671 fw.writer.println(" return false;");
673 fw.writer.println(" }");
676 if (stringWriter2.getBuffer().length() > 0) {
677 fw.writer.write(stringWriter2.toString());
681 fw.delayedWriter.close();
682 fw.delayedWriter = null;
683 stringWriter2 = null;
684 fw.delayedWriter2.close();
685 fw.delayedWriter2 = null;
687 writeIDReferences(fw.writer,name, references);
688 writeUnknownChild(fw.writer,name,unknownChildElement);
690 fw.writer.println("}");
695 writers.remove(elementObj);
698 ruleClassNames.add(converter.getPluginName()+"."+elementPackageName+"."+name);
702 private void writeIDProvider(PrintWriter writer) {
703 if (provider != null) {
704 writer.println(" java.lang.String idProviderValue = null;");
706 writer.println(" @Override");
707 writer.println(" public java.lang.String getID() {");
708 writer.println(" java.lang.String s = idProviderValue;");
709 writer.println(" idProviderValue = null;");
710 writer.println(" return s;");
711 writer.println(" }");
713 if (provider.getPriority() != null) {
714 writer.println(" @Override");
715 writer.println(" public int idPriority() {");
716 writer.println(" return " + provider.getPriority().intValue()+";");
717 writer.println(" }");
722 private void writeIDReferences(PrintWriter writer,String name, List<IDReference> references) {
723 if (references.size() > 0) {
724 writer.println(" @Override");
725 writer.println(" public boolean connectReferences(WriteGraph graph, ParserElement element, java.util.Map<java.lang.String, ParserElement> map) throws DatabaseException {");
726 writer.println(" "+getOntologyImport());
727 writer.println(" boolean result = true;");
728 for (IDReference ref : references) {
729 writer.println(" {");
730 writer.println(" Attribute a = element.getAttribute(\"" + ref.getIDSource().getName() +"\");");
731 writer.println(" if (a != null) {");
732 writer.println(" ParserElement refEle = map.get(a.value);");
733 writer.println(" if (refEle != null) {");
734 writer.println(" Resource ref = refEle.getData();");
735 writer.println(" graph.claim(element.getData(), "+ontShort+name+"_"+ref.getReference().getName()+", ref);");
736 writer.println(" } else {");
737 writer.println(" result = false;");
738 writer.println(" }");
739 writer.println(" }");
740 writer.println(" }");
742 writer.println(" return result;");
743 writer.println(" }");
748 private void writeUnknownChild(PrintWriter writer,String name, UnrecognizedChildElement unknownChildElement) {
749 if (unknownChildElement == null)
752 writer.println(" @Override");
753 writer.println(" public void configureChild(WriteGraph graph, Deque<ParserElement> parents, ParserElement element, ParserElement child) throws DatabaseException {");
754 writer.println(" " + unknownChildElement.getJavaMethod());
755 writer.println(" }");
761 public String getBaseClass(ObjectType type) {
762 return "org.simantics.xml.sax.base.XMLElementNamedChildParserBase";
765 protected void createClassHeader(PrintWriter writer, boolean isList) {
766 writer.println("package " + converter.getPluginName() +"."+elementPackageName+";");
768 writer.println("import java.util.Deque;");
769 writer.println("import org.simantics.databoard.Bindings;");
770 writer.println("import org.simantics.db.Resource;");
771 writer.println("import org.simantics.db.WriteGraph;");
772 writer.println("import org.simantics.db.exception.DatabaseException;");
773 writer.println("import org.simantics.xml.sax.base.Attribute;");
774 writer.println("import org.simantics.xml.sax.base.ParserElement;");
775 writer.println("import org.simantics.xml.sax.ontology.XMLResource;");
777 writer.println("import org.simantics.layer0.Layer0;");
779 writer.println("import java.util.Collections;");
780 writer.println("import org.simantics.db.common.utils.ListUtils;");