1 package org.simantics.xml.sax;
\r
4 import java.io.IOException;
\r
5 import java.io.PrintWriter;
\r
6 import java.io.StringWriter;
\r
7 import java.util.ArrayList;
\r
8 import java.util.HashMap;
\r
9 import java.util.List;
\r
10 import java.util.Map;
\r
12 import javax.xml.namespace.QName;
\r
14 import org.simantics.utils.datastructures.BijectionMap;
\r
15 import org.simantics.xml.sax.configuration.AttributeComposition;
\r
16 import org.simantics.xml.sax.configuration.Configuration;
\r
17 import org.simantics.xml.sax.configuration.IDProvider;
\r
18 import org.simantics.xml.sax.configuration.IDReference;
\r
19 import org.simantics.xml.sax.configuration.UnrecognizedChildElement;
\r
20 import org.w3._2001.xmlschema.Annotated;
\r
21 import org.w3._2001.xmlschema.Attribute;
\r
22 import org.w3._2001.xmlschema.AttributeGroup;
\r
23 import org.w3._2001.xmlschema.AttributeGroupRef;
\r
24 import org.w3._2001.xmlschema.ComplexType;
\r
25 import org.w3._2001.xmlschema.Element;
\r
26 import org.w3._2001.xmlschema.LocalComplexType;
\r
27 import org.w3._2001.xmlschema.LocalSimpleType;
\r
28 import org.w3._2001.xmlschema.NamedAttributeGroup;
\r
29 import org.w3._2001.xmlschema.OpenAttrs;
\r
30 import org.w3._2001.xmlschema.Restriction;
\r
31 import org.w3._2001.xmlschema.Schema;
\r
32 import org.w3._2001.xmlschema.SimpleType;
\r
33 import org.w3._2001.xmlschema.TopLevelAttribute;
\r
35 public class ImporterGenerator extends SchemaConversionBase{
\r
37 public ImporterGenerator(Configuration configuration) {
\r
38 super(configuration);
\r
41 String commentTag = "//";
\r
44 String ontologyClassName;
\r
45 SchemaConverter converter;
\r
47 List<String> ruleClassNames = new ArrayList<String>();
\r
49 String ontShort = "ONT";
\r
51 File importParserDir;
\r
52 String elementPackageName;
\r
54 public void createParser(Schema schema,String className, SchemaConverter converter) throws IOException {
\r
55 this.schema = schema;
\r
56 this.ontologyClassName = className;
\r
57 this.converter = converter;
\r
60 String packageParts[] = className.split("\\.");
\r
61 String name = packageParts[packageParts.length-1];
\r
64 ontShort = name.substring(0, 3).toUpperCase();
\r
66 String parserPackagePostfix = "_elem";
\r
67 String importerClassPostfix = "Importer";
\r
68 elementPackageName = name+parserPackagePostfix;
\r
70 importParserDir= new File(converter.getParserDir().getAbsolutePath()+"/"+elementPackageName);
\r
71 if (!importParserDir.exists())
\r
72 importParserDir.mkdirs();
\r
76 File importParserFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+importerClassPostfix+".java");
\r
77 PrintWriter mainWriter = createFile(importParserFile);
\r
78 mainWriter.println("package " + converter.getPluginName() +";");
\r
79 mainWriter.println();
\r
80 mainWriter.println("import java.io.File;");
\r
81 mainWriter.println("import org.simantics.db.Session;");
\r
82 mainWriter.println("import org.simantics.xml.sax.base.AbstractImporter;");
\r
83 mainWriter.println("import org.simantics.xml.sax.base.XMLParser;");
\r
84 mainWriter.println();
\r
85 mainWriter.println("public class " + name + importerClassPostfix+" extends AbstractImporter {");
\r
86 mainWriter.println();
\r
87 mainWriter.println(" public " + name + importerClassPostfix+"(Session session, File file) {");
\r
88 mainWriter.println(" super(session,file);");
\r
89 mainWriter.println(" }");
\r
90 mainWriter.println();
\r
91 mainWriter.println(" @Override");
\r
92 mainWriter.println(" public void configure(XMLParser parser) {");
\r
93 for (String s : ruleClassNames) {
\r
94 mainWriter.println(" parser.add(new "+s+"());");
\r
96 mainWriter.println(" }");
\r
97 mainWriter.println("}");
\r
99 mainWriter.println();
\r
100 mainWriter.flush();
\r
101 mainWriter.close();
\r
104 protected PrintWriter createFile(File file) throws IOException {
\r
105 if (!file.exists())
\r
106 file.createNewFile();
\r
107 PrintWriter writer = new PrintWriter(file);
\r
108 for (String s : converter.getHeader()) {
\r
109 writer.println(commentTag + " " + s);
\r
115 // protected String getValueGetter(String binding,String name) {
\r
116 // if (binding == null)
\r
117 // return name+".getValue()";
\r
118 // if ("STRING".equals(binding))
\r
119 // return name+".getValue()";
\r
120 // if ("BOOLEAN".equals(binding))
\r
121 // return "Boolean.parseBoolean("+name+".getValue())";
\r
122 // if ("INTEGER".equals(binding))
\r
123 // return "Integer.parseInt("+name+".getValue())";
\r
124 // if ("DOUBLE".equals(binding))
\r
125 // return "Double.parseDouble("+name+".getValue())";
\r
126 // if ("FLOAT".equals(binding))
\r
127 // return "Float.parseFloat("+name+".getValue())";
\r
128 // return name+".getValue()";
\r
130 // protected String getValueGetter(String binding) {
\r
131 // if (binding == null)
\r
133 // if ("STRING".equals(binding))
\r
135 // if ("BOOLEAN".equals(binding))
\r
136 // return "Boolean.parseBoolean(value)";
\r
137 // if ("INTEGER".equals(binding))
\r
138 // return "Integer.parseInt(value)";
\r
139 // if ("DOUBLE".equals(binding))
\r
140 // return "Double.parseDouble(value)";
\r
141 // if ("FLOAT".equals(binding))
\r
142 // return "Float.parseFloat(value)";
\r
145 protected String getValueGetterMethod(TypeEntry binding,String name) {
\r
146 if (binding == null)
\r
147 return name+".getValue()";
\r
148 return binding.getValueGetterMethod(name);
\r
151 protected String getValueGetter(TypeEntry binding,String name) {
\r
152 if (binding == null)
\r
154 return binding.getValueGetter(name);
\r
156 protected String getValueGetter(TypeEntry binding) {
\r
157 if (binding == null)
\r
159 return binding.getValueGetter();
\r
162 protected void handle(TopLevelAttribute topLevelAttribute) {
\r
168 public static String getComplexTypePrefix() {
\r
169 return "ComplexTypes_";
\r
172 public static String getAttributeGroupPrefix() {
\r
173 return "AttributeGroups_";
\r
176 private Map<SchemaObject, FileWriter> writers = new HashMap<SchemaObject, ImporterGenerator.FileWriter>();
\r
178 protected void handleComplexType(SchemaObject complexTypeObj) {
\r
179 ComplexType topLevelComplexType = complexTypeObj.getComplexType();
\r
181 String name = getName(complexTypeObj);//topLevelComplexType.getName();
\r
183 String className = name;//"_"+name;
\r
185 FileWriter fw = new FileWriter();
\r
187 fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));
\r
188 } catch (IOException e) {
\r
189 throw new RuntimeException(e);
\r
191 writers.put(complexTypeObj, fw);
\r
193 boolean isList = false;
\r
195 String baseClass = "org.simantics.xml.sax.base.XMLElementNamedChildParserBase";
\r
197 boolean inherited = false;
\r
199 QName type = getComplexTypeBase(topLevelComplexType);
\r
200 if (type != null && !type.getNamespaceURI().equals("http://www.w3.org/2001/XMLSchema")) {
\r
201 baseClass = getName(complexTypeName.get(type.getLocalPart()));
\r
205 provider = getIDProvider(topLevelComplexType);
\r
206 List<IDReference> references = getIDReferences(topLevelComplexType);
\r
207 UnrecognizedChildElement unknownChildElement = getUnknown(topLevelComplexType);
\r
209 List<String> intrerfaces = new ArrayList<String>();
\r
210 if (references.size() > 0)
\r
211 intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser");
\r
212 if (unknownChildElement != null)
\r
213 intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser");
\r
215 createClassHeader(fw.writer, isList);
\r
216 writeClass(fw.writer,false, null, className, baseClass, intrerfaces);
\r
218 writeIDProvider(fw.writer);
\r
220 fw.writer.println(" @Override");
\r
221 fw.writer.println(" public Resource create(WriteGraph graph, Element element) throws DatabaseException{");
\r
222 fw.writer.println(" Layer0 L0 = Layer0.getInstance(graph);");
\r
223 fw.writer.println(" "+getOntologyImport());
\r
225 fw.writer.println(" Resource res = graph.newResource();");
\r
226 fw.writer.println(" graph.claim(res, L0.InstanceOf, "+ontShort+name+");");
\r
228 fw.writer.println(" Resource res = ListUtils.create(graph, "+ontShort+name+", Collections.EMPTY_LIST);");
\r
230 fw.writer.println(" return res;");
\r
231 fw.writer.println(" }");
\r
232 fw.writer.println();
\r
234 fw.writer.println(" @Override");
\r
235 fw.writer.println(" public boolean connectParent(WriteGraph graph, Element parent, Element element) throws DatabaseException{");
\r
236 fw.writer.println(" "+getOntologyImport());
\r
237 fw.writer.println(" graph.claim(parent.getData(), "+this.ontShort+getName(complexTypeObj,"has")+", element.getData());");
\r
238 fw.writer.println(" return true;");
\r
239 fw.writer.println(" }");
\r
240 fw.writer.println();
\r
242 StringWriter stringWriter = new StringWriter();
\r
243 fw.delayedWriter = new PrintWriter(stringWriter);
\r
244 StringWriter stringWriter2 = new StringWriter();
\r
245 fw.delayedWriter2 = new PrintWriter(stringWriter2);
\r
247 fw.writer.println(" public " + className + "() {");
\r
248 fw.writer.println(" super();");
\r
250 handleComplexTypeExtension(complexTypeObj);
\r
252 fw.writer.println(" }");
\r
254 fw.writer.println(" @Override");
\r
255 fw.writer.println(" public boolean connectChild(WriteGraph graph, Element element, Element child) throws DatabaseException{");
\r
256 fw.writer.println(" "+getOntologyImport());
\r
258 if (stringWriter.getBuffer().length() > 0) {
\r
259 fw.writer.write(stringWriter.toString());
\r
263 fw.writer.println(" return false;");
\r
264 fw.writer.println(" }");
\r
265 fw.writer.println();
\r
267 if (stringWriter2.getBuffer().length() > 0) {
\r
268 fw.writer.write(stringWriter2.toString());
\r
271 stringWriter = null;
\r
272 fw.delayedWriter.close();
\r
273 fw.delayedWriter=null;
\r
274 stringWriter2 = null;
\r
275 fw.delayedWriter2.close();
\r
276 fw.delayedWriter2 = null;
\r
278 fw.writer.println(" @Override");
\r
279 fw.writer.println(" public void configure(WriteGraph graph, Deque<Element> parents, Element element) throws DatabaseException {");
\r
281 fw.writer.println(" super.configure(graph,parents,element);");
\r
283 fw.writer.println(" "+getOntologyImport());
\r
285 handleComplexTypeAttributes(complexTypeObj);
\r
286 handleExtensionAttributes(complexTypeObj);
\r
288 fw.writer.println(" }");
\r
290 writeIDReferences(fw.writer,name, references);
\r
291 writeUnknownChild(fw.writer,name,unknownChildElement);
\r
293 fw.writer.println("}");
\r
294 fw.writer.println();
\r
298 writers.remove(complexTypeObj);
\r
303 protected void handle(SchemaObject parent, SchemaElement indicator, List<SchemaElement> elements) {
\r
304 if (indicator.getType() == SchemaElement.ElementType.SEQUENCE || (indicator.getType() == SchemaElement.ElementType.CHOICE && indicator.getRestriction().many())) {
\r
305 for (SchemaElement e : elements) {
\r
306 handle(parent, indicator, e);
\r
308 } else if (indicator.getType() == SchemaElement.ElementType.CHOICE) {
\r
309 String name = getChoiceName(elements);
\r
311 for (SchemaElement e : elements) {
\r
312 Element localElement = e.getElement();
\r
313 if (localElement.getName() != null) {
\r
314 QName refType = localElement.getType();
\r
315 if (refType != null)
\r
316 handleIndicator(parent, indicator, e, false, name, refType);
\r
317 } else if (localElement.getRef() != null) {
\r
318 QName refType = localElement.getRef();
\r
319 handleIndicator(parent, indicator, e, true, name, refType);
\r
327 protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, boolean reference, String ref, QName refType) {
\r
328 FileWriter fw = getWriter(parent);
\r
329 String binding = getBindingFromPrimitiveType(refType);
\r
330 if (binding == null) {
\r
331 SchemaObject refElement = elementName.get(refType.getLocalPart());
\r
332 SchemaObject refComplexType = complexTypeName.get(refType.getLocalPart());
\r
333 // String className = refType.getLocalPart();
\r
334 // if (!isElementRef(refType.getLocalPart())) {
\r
335 // className = "_"+className;
\r
338 // String refClassName = refType.getLocalPart();
\r
339 // if (isComplexTypeRef(refClassName)) {
\r
340 // refClassName = "_"+refClassName;
\r
342 String className = null;
\r
343 String refClassName = null;
\r
344 if (refElement != null)
\r
345 className = getName(refElement);
\r
347 className = getName(refComplexType);
\r
349 if (refComplexType != null) {
\r
350 refClassName = getName(refComplexType);
\r
352 refClassName = getName(refElement);
\r
356 fw.writer.println(" addParser(\""+ ref +"\", "+className+".class);");
\r
358 fw.writer.println(" addParser("+className+".class);");
\r
359 if (!className.equals(refClassName))
\r
360 fw.writer.println(" addParser("+refClassName+".class);");
\r
362 fw.delayedWriter.println(" if (child.getParser() instanceof "+refClassName+"){");
\r
363 fw.delayedWriter.println(" graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+ref + ", child.getData());");
\r
364 if (useElementList(parent, indicator,element, reference, ref, refType)) {
\r
366 // element type specific list
\r
367 fw.delayedWriter.println(" {");
\r
368 fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+ref + "List);");
\r
369 fw.delayedWriter.println(" if (list == null) {");
\r
370 fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
\r
371 fw.delayedWriter.println(" graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+ref + "List,list);");
\r
372 fw.delayedWriter.println(" } else {");
\r
373 fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
\r
374 fw.delayedWriter.println(" }");
\r
375 fw.delayedWriter.println(" }");
\r
377 if (useOriginalList(parent, indicator,element, reference, ref, refType)) {
\r
379 fw.delayedWriter.println(" {");
\r
380 //fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(),"+ontShort+"XML_hasOriginalElementList);");
\r
381 fw.delayedWriter.println(" XMLResource XML = XMLResource.getInstance(graph);");
\r
382 fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");
\r
383 fw.delayedWriter.println(" if (list == null) {");
\r
384 fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
\r
385 //fw.delayedWriter.println(" graph.claim(element.getData(),"+ontShort+"XML_hasOriginalElementList,list);");
\r
386 fw.delayedWriter.println(" graph.claim(element.getData(), XML.hasOriginalElementList,list);");
\r
387 fw.delayedWriter.println(" } else {");
\r
388 fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
\r
389 fw.delayedWriter.println(" }");
\r
390 fw.delayedWriter.println(" }");
\r
393 fw.delayedWriter.println(" return true;");
\r
394 fw.delayedWriter.println(" }");
\r
396 //writer.println(commentTag+ontShort+"."+parent+".has"+ref + " <R " + ontShort+".hasElement");
\r
397 fw.writer.println(" addParser(\""+ ref +"\", "+getName(parent) +"_" +ref+".class);");
\r
399 fw.delayedWriter2.println(" public static class " + getName(parent) +"_" +ref+" extends org.simantics.xml.sax.base.ValueElementParser {");
\r
400 fw.delayedWriter2.println(" "+ getName(parent) +"_" +ref +"(){");
\r
401 fw.delayedWriter2.println(" super(\""+ref+"\"," +this.ontologyClassName+".URIs."+getName(parent) + "_has"+ref+", "+binding+");");
\r
402 fw.delayedWriter2.println(" }");
\r
403 fw.delayedWriter2.println(" }");
\r
408 protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, boolean reference, String ref, OpenAttrs attrs) {
\r
409 FileWriter fw = getWriter(parent);
\r
410 SchemaObject obj = getWithObj(parent, attrs);
\r
412 // String className = refType.getLocalPart();
\r
413 // if (!isElementRef(refType.getLocalPart())) {
\r
414 // className = "_"+className;
\r
417 // String refClassName = refType.getLocalPart();
\r
418 // if (isComplexTypeRef(refClassName)) {
\r
419 // refClassName = "_"+refClassName;
\r
421 String className = getName(obj);
\r
425 fw.writer.println(" addParser(\""+ ref +"\", "+className+".class);");
\r
427 fw.writer.println(" addParser("+className+".class);");
\r
429 fw.delayedWriter.println(" if (child.getParser() instanceof "+className+"){");
\r
430 fw.delayedWriter.println(" graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+ref + ", child.getData());");
\r
431 if (useElementList(parent, indicator,element, reference, ref, new QName(obj.getName()))) {
\r
433 // element type specific list
\r
434 fw.delayedWriter.println(" {");
\r
435 fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+ref + "List);");
\r
436 fw.delayedWriter.println(" if (list == null) {");
\r
437 fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
\r
438 fw.delayedWriter.println(" graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+ref + "List,list);");
\r
439 fw.delayedWriter.println(" } else {");
\r
440 fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
\r
441 fw.delayedWriter.println(" }");
\r
442 fw.delayedWriter.println(" }");
\r
444 if (useOriginalList(parent, indicator,element, reference, ref, new QName(obj.getName()))) {
\r
446 fw.delayedWriter.println(" {");
\r
447 //fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(),"+ontShort+"XML_hasOriginalElementList);");
\r
448 fw.delayedWriter.println(" XMLResource XML = XMLResource.getInstance(graph);");
\r
449 fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");
\r
450 fw.delayedWriter.println(" if (list == null) {");
\r
451 fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
\r
452 //fw.delayedWriter.println(" graph.claim(element.getData(),"+ontShort+"XML_hasOriginalElementList,list);");
\r
453 fw.delayedWriter.println(" graph.claim(element.getData(), XML.hasOriginalElementList,list);");
\r
454 fw.delayedWriter.println(" } else {");
\r
455 fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
\r
456 fw.delayedWriter.println(" }");
\r
457 fw.delayedWriter.println(" }");
\r
460 fw.delayedWriter.println(" return true;");
\r
461 fw.delayedWriter.println(" }");
\r
466 protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) {
\r
467 FileWriter fw = getWriter(parent);
\r
468 fw.delayedWriter2.println(" @Override");
\r
469 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, Element element, Element child) {");
\r
470 fw.delayedWriter2.println(" Class<? extends org.simantics.xml.sax.base.XMLElementParser> parserClass = super.getParser(parsers, element, child);");
\r
471 fw.delayedWriter2.println(" if (parserClass != null) return parserClass;");
\r
472 fw.delayedWriter2.println(" org.simantics.xml.sax.base.XMLElementParser parser = parsers.get(child.getQName());");
\r
473 fw.delayedWriter2.println(" if (parser != null) return parser.getClass();");
\r
474 fw.delayedWriter2.println(" return null;");
\r
475 fw.delayedWriter2.println(" }");
\r
478 private FileWriter getWriter(SchemaObject obj) {
\r
479 SchemaObject s = obj;
\r
480 while (s != null) {
\r
481 FileWriter fw = writers.get(s);
\r
491 protected void handle(SchemaObject parent, Attribute attribute) {
\r
492 String name = attribute.getName();
\r
493 QName primitiveType = attribute.getType();
\r
494 SimpleType simpleType = attribute.getSimpleType();
\r
495 QName ref = attribute.getRef();
\r
497 String relationName;
\r
499 if (name != null) {
\r
501 relationName = ontShort+"has"+name;
\r
502 if (parent != null)
\r
503 relationName = ontShort+getName(parent)+"_has"+name;
\r
505 else if (ref != null && parent != null) {
\r
506 attrName = ref.getLocalPart();
\r
507 relationName = ontShort+getName(parent)+"_has"+ref.getLocalPart();
\r
509 Attribute referred = getRefAttribute(ref);
\r
510 if (referred != null) {
\r
511 primitiveType = referred.getType();
\r
512 simpleType = referred.getSimpleType();
\r
516 throw new RuntimeException();
\r
518 boolean isReference = false;
\r
519 if (provider!= null && provider.getAttribute().getName().equals(attrName))
\r
520 isReference = true;
\r
522 FileWriter fw = getWriter(parent);
\r
523 if (primitiveType != null) {
\r
525 //String binding = getBindingFromPrimitiveType(primitiveType);
\r
526 TypeEntry binding = getTypeEntry(primitiveType);
\r
528 if (binding != null) {
\r
529 writeAttribute(fw, attrName, relationName, binding, isReference);
\r
532 if (simpleType == null) {
\r
533 SchemaObject simpleTypeObj = simpleTypeName.get(primitiveType.getLocalPart());
\r
534 if (simpleTypeObj != null)
\r
535 simpleType = simpleTypeObj.getSimpleType();
\r
539 if (simpleType != null) {
\r
540 org.w3._2001.xmlschema.List list = simpleType.getList();
\r
541 if (list != null) {
\r
542 TypeEntry binding = getTypeEntry(new QName(SCHEMA_NS, "string"));
\r
543 writeAttribute(fw, attrName, relationName, binding, isReference);
\r
545 Restriction restriction = simpleType.getRestriction();
\r
546 if (restriction == null)
\r
547 throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart()+ ", SimpleType restriction is unset");
\r
548 QName base = restriction.getBase();
\r
551 //String binding = getBindingFromPrimitiveType(base);
\r
552 TypeEntry binding = getTypeEntry(base);
\r
553 writeAttribute(fw, attrName, relationName, binding, isReference);
\r
556 // TODO : using default String attribute should be configured with rules.
\r
557 //throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart());
\r
558 fw.writer.println(" //FIXME: Cannot resolve type for Attribute " + attrName + " Using default type String");
\r
559 //writeAttribute(fw, attrName, relationName, "STRING", isReference);
\r
560 writeAttribute(fw, attrName, relationName, getTypeEntry("string"), isReference);
\r
564 //private void writeAttribute(FileWriter fw, String attrName, String relationName, String binding, boolean isReference) {
\r
565 private void writeAttribute(FileWriter fw, String attrName, String relationName, TypeEntry binding, boolean isReference) {
\r
566 fw.writer.println(" {");
\r
567 fw.writer.println(" Attribute a = element.getAttribute(\"" +attrName+"\");");
\r
568 fw.writer.println(" if (a != null) {");
\r
569 fw.writer.println(" graph.claimLiteral(element.getData(),"+relationName+","+getValueGetterMethod(binding,"a")+", "+binding.binding+");");
\r
571 fw.writer.println(" idProviderValue = a.getValue();");
\r
572 fw.writer.println(" }");
\r
573 fw.writer.println(" }");
\r
577 protected void handleAttributes(SchemaObject simpleTypeObj) {
\r
578 SchemaObject parent = simpleTypeObj.getParent();
\r
579 FileWriter fw = getWriter(parent);
\r
581 SimpleType simpleType = simpleTypeObj.getSimpleType();
\r
582 Restriction restriction = simpleType.getRestriction();
\r
583 if (restriction == null)
\r
584 throw new RuntimeException("Cannot resolve type for Element " + getName(parent));
\r
585 QName base = restriction.getBase();
\r
588 //String binding = getBindingFromPrimitiveType(base);
\r
589 TypeEntry binding = getTypeEntry(base);
\r
590 fw.writer.println(" @Override");
\r
591 fw.writer.println(" public void configure(WriteGraph graph, Element element, java.lang.String value) throws DatabaseException {");
\r
592 //fw.writer.println(" graph.claimValue(element.getData(),"+getValueGetter(binding)+", Bindings."+binding+");");
\r
593 fw.writer.println(" graph.claimValue(element.getData(),"+getValueGetter(binding)+", "+binding.binding +");");
\r
594 fw.writer.println(" }");
\r
599 protected void handle(SchemaObject parent, AttributeGroup attribute) {
\r
600 if (parent != null) {
\r
601 FileWriter fw = getWriter(parent);
\r
602 NamedAttributeGroup group = getAttributeGroup(attribute.getRef().getLocalPart());
\r
603 fw.writer.println(commentTag+" AttributeGroup " + group.getName());
\r
604 SchemaObject obj = new SchemaObject(parent,attribute);
\r
605 for (Annotated annotated : group.getAttributeOrAttributeGroup()) {
\r
606 if (annotated instanceof Attribute) {
\r
607 //handle("AttributeGroups_"+group.getName(),(Attribute)annotated);
\r
608 handle(obj,(Attribute)annotated);
\r
609 } else if (annotated instanceof AttributeGroup) {
\r
610 //handle("AttributeGroups_"+group.getName(),(AttributeGroup)annotated);
\r
611 handle(obj,(AttributeGroup)annotated);
\r
614 fw.writer.println(commentTag+" End of AttributeGroup " + group.getName());
\r
620 protected void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes) {
\r
621 FileWriter fw = getWriter(parent);
\r
622 QName type = new QName(CONVERSION_NS, composition.getType());
\r
623 String arrayBinding = getBindingFromPrimitiveType(type);
\r
624 String javaType = getJavaTypeFromPrimitiveType(type);
\r
625 String name = composition.getName();
\r
627 String relationName;
\r
628 if (name != null) {
\r
629 relationName = ontShort+"has"+name;
\r
630 if (parent != null)
\r
631 relationName = ontShort+getName(parent)+"_has"+name;
\r
633 throw new RuntimeException();
\r
636 fw.writer.println(" {");
\r
638 for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute())
\r
639 fw.writer.println(" Attribute a"+(i++)+" = element.getAttribute(\"" +a.getName()+"\");");
\r
640 fw.writer.print (" "+javaType + " value = new "+javaType+"{");
\r
642 // FIXME : handle optional attributes properly.
\r
643 for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute()) {
\r
644 Attribute attribute = ((Attribute)attributes.getRight(a));
\r
645 //QName atype = getBaseType(attribute);
\r
646 QName atype = getPrimitiveType(attribute);
\r
647 String defaultValue = attribute.getDefault();
\r
648 if (defaultValue == null)
\r
649 defaultValue = getDefaultValue(atype);
\r
651 //String binding = getBindingFromPrimitiveType(atype);
\r
652 TypeEntry binding = getTypeEntry(atype);
\r
654 fw.writer.print(",");
\r
655 if (defaultValue != null)
\r
656 fw.writer.print("a"+(i)+"!= null ? "+ getValueGetterMethod(binding,"a"+(i++)) + " : " +defaultValue);
\r
658 fw.writer.print(getValueGetterMethod(binding,"a"+(i++)));
\r
660 fw.writer.println("};");
\r
661 fw.writer.println(" graph.claimLiteral(element.getData(),"+relationName+", value, "+arrayBinding+");");
\r
662 fw.writer.println(" }");
\r
666 protected String getDefaultValue(QName atype) {
\r
667 Map<String,TypeEntry> types = typeMap.get(atype.getNamespaceURI());
\r
670 TypeEntry entry = types.get(atype.getLocalPart());
\r
673 return entry.defaultValue;
\r
678 protected void handleSimpleType(SchemaObject parent, SchemaObject simpleType) {
\r
684 IDProvider provider;
\r
686 protected void handleElement(SchemaObject elementObj) {
\r
687 Element element = elementObj.getElement();
\r
689 String name = getName(elementObj);//topLevelElement.getName();
\r
690 String className = name;
\r
692 FileWriter fw = new FileWriter();
\r
694 fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));
\r
695 } catch (IOException e) {
\r
696 throw new RuntimeException(e);
\r
698 writers.put(elementObj, fw);
\r
699 boolean isList = false;
\r
701 Inheritance inhertiance = getElementInheritance(elementObj);
\r
703 provider = getIDProvider(element);
\r
704 List<IDReference> references = getIDReferences(element);
\r
705 UnrecognizedChildElement unknownChildElement = getUnknown(element);
\r
707 List<String> intrerfaces = new ArrayList<String>();
\r
708 if (references.size() > 0)
\r
709 intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser");
\r
710 if (unknownChildElement != null)
\r
711 intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser");
\r
713 createClassHeader(fw.writer, isList);
\r
714 writeClass(fw.writer,false, element.getName(), className, inhertiance.baseClass, intrerfaces);
\r
715 writeIDProvider(fw.writer);
\r
716 fw.writer.println(" @Override");
\r
717 fw.writer.println(" public Resource create(WriteGraph graph, Element element) throws DatabaseException{");
\r
718 fw.writer.println(" Layer0 L0 = Layer0.getInstance(graph);");
\r
719 fw.writer.println(" "+getOntologyImport());
\r
721 fw.writer.println(" Resource res = graph.newResource();");
\r
722 fw.writer.println(" graph.claim(res, L0.InstanceOf, "+ontShort+name+");");
\r
724 fw.writer.println(" Resource res = ListUtils.create(graph, "+ontShort+name+", Collections.EMPTY_LIST);");
\r
726 fw.writer.println(" return res;");
\r
727 fw.writer.println(" }");
\r
728 fw.writer.println();
\r
730 fw.writer.println(" @Override");
\r
731 fw.writer.println(" public boolean connectParent(WriteGraph graph, Element parent, Element element) throws DatabaseException{");
\r
732 fw.writer.println(" "+getOntologyImport());
\r
733 fw.writer.println(" graph.claim(parent.getData(), "+this.ontShort+getName(elementObj,"has")+", element.getData());");
\r
734 fw.writer.println(" return true;");
\r
735 fw.writer.println(" }");
\r
736 fw.writer.println();
\r
738 fw.writer.println(" @Override");
\r
739 fw.writer.println(" public void configure(WriteGraph graph, Deque<Element> parents, Element element) throws DatabaseException {");
\r
740 if (inhertiance.type == InheritanceType.ComplexType) {
\r
741 fw.writer.println(" super.configure(graph,parents,element);");
\r
743 fw.writer.println(" "+getOntologyImport());
\r
745 LocalComplexType complexType = element.getComplexType();
\r
746 LocalSimpleType simpleType = element.getSimpleType();
\r
748 if (complexType != null) {
\r
749 SchemaObject obj = complexTypes.get(complexType);
\r
750 handleElementComplexTypeAttributes(obj);
\r
752 fw.writer.println(" }");
\r
754 if (inhertiance.type == InheritanceType.AtomicType) {
\r
755 fw.writer.println();
\r
756 fw.writer.println(" @Override");
\r
757 fw.writer.println(" public void configure(WriteGraph graph, Element element, java.lang.String string) throws DatabaseException {");
\r
758 fw.writer.println(" graph.claimValue(element.getData(), "+getValueGetter(inhertiance.atomicType,"string")+", "+inhertiance.atomicType.binding+");");
\r
759 fw.writer.println(" }");
\r
761 if (simpleType != null) {
\r
762 SchemaObject obj = simpleTypes.get(simpleType);
\r
763 handleElementSimpleTypeAttributes(obj);
\r
767 StringWriter stringWriter = new StringWriter();
\r
768 fw.delayedWriter = new PrintWriter(stringWriter);
\r
769 StringWriter stringWriter2 = new StringWriter();
\r
770 fw.delayedWriter2 = new PrintWriter(stringWriter2);
\r
772 fw.writer.println(" public " + className + "() {");
\r
773 fw.writer.println(" super();");
\r
775 if (complexType != null) {
\r
776 SchemaObject obj = complexTypes.get(complexType);
\r
777 handleComplexTypeExtension(obj);
\r
778 } else if (simpleType != null) {
\r
782 fw.writer.println(" }");
\r
784 fw.writer.println(" @Override");
\r
785 fw.writer.println(" public boolean connectChild(WriteGraph graph, Element element, Element child) throws DatabaseException{");
\r
786 fw.writer.println(" "+getOntologyImport());
\r
788 if (stringWriter.getBuffer().length() > 0) {
\r
789 fw.writer.write(stringWriter.toString());
\r
791 if (inhertiance.type == InheritanceType.ComplexType) {
\r
792 fw.writer.println(" return super.connectChild(graph,element,child);");
\r
794 fw.writer.println(" return false;");
\r
796 fw.writer.println(" }");
\r
797 fw.writer.println();
\r
799 if (stringWriter2.getBuffer().length() > 0) {
\r
800 fw.writer.write(stringWriter2.toString());
\r
803 stringWriter = null;
\r
804 fw.delayedWriter.close();
\r
805 fw.delayedWriter = null;
\r
806 stringWriter2 = null;
\r
807 fw.delayedWriter2.close();
\r
808 fw.delayedWriter2 = null;
\r
810 writeIDReferences(fw.writer,name, references);
\r
811 writeUnknownChild(fw.writer,name,unknownChildElement);
\r
813 fw.writer.println("}");
\r
814 fw.writer.println();
\r
818 writers.remove(elementObj);
\r
821 ruleClassNames.add(converter.getPluginName()+"."+elementPackageName+"."+name);
\r
824 private enum InheritanceType{ComplexType,AtomicType,None};
\r
826 private class Inheritance {
\r
827 public String baseClass;
\r
828 public InheritanceType type;
\r
829 public TypeEntry atomicType;
\r
831 public Inheritance() {
\r
832 baseClass = "org.simantics.xml.sax.base.XMLElementNamedChildParserBase";
\r
833 type = InheritanceType.None;
\r
837 private Inheritance getElementInheritance(SchemaObject topLevelElementObj) {
\r
838 if (topLevelElementObj.getElement() != null && topLevelElementObj.getElement().getName().equals("ByteString"))
\r
839 System.out.println();
\r
840 Element topLevelElement = topLevelElementObj.getElement();
\r
841 Inheritance inheritance = new Inheritance();
\r
842 if (topLevelElement.getType() != null) {
\r
843 QName type = topLevelElement.getType();
\r
844 if (!type.getNamespaceURI().equals(SCHEMA_NS)) {
\r
845 SchemaObject obj = complexTypeName.get(type.getLocalPart());
\r
846 // if (obj == null)
\r
847 // obj = simpleTypeName.get(type.getLocalPart());
\r
849 inheritance.baseClass = getName(obj);
\r
850 inheritance.type = InheritanceType.ComplexType;
\r
853 TypeEntry entry = getTypeEntry(type);
\r
854 if (entry != null) {
\r
855 inheritance.type = InheritanceType.AtomicType;
\r
856 inheritance.atomicType = entry;
\r
860 if (inheritance.type == InheritanceType.None) {
\r
861 QName type = getElementBase(topLevelElement);
\r
862 if (type != null) {
\r
863 if (!type.getNamespaceURI().equals(SCHEMA_NS)) {
\r
864 SchemaObject obj = getWithName(topLevelElementObj, type.getLocalPart());
\r
865 inheritance.baseClass = getName(obj);
\r
866 inheritance.type = InheritanceType.ComplexType;
\r
868 TypeEntry entry = getTypeEntry(type);
\r
869 if (entry != null) {
\r
870 inheritance.type = InheritanceType.AtomicType;
\r
871 inheritance.atomicType = entry;
\r
876 if (inheritance.type == InheritanceType.None) {
\r
877 QName type = topLevelElement.getSubstitutionGroup();
\r
878 if (type != null) {
\r
879 if (!type.getNamespaceURI().equals(SCHEMA_NS)) {
\r
880 SchemaObject obj = getWithName(topLevelElementObj, type.getLocalPart());
\r
881 inheritance.baseClass = getName(obj);
\r
882 inheritance.type = InheritanceType.ComplexType;
\r
884 TypeEntry entry = getTypeEntry(type);
\r
885 if (entry != null) {
\r
886 inheritance.type = InheritanceType.AtomicType;
\r
887 inheritance.atomicType = entry;
\r
893 return inheritance;
\r
896 private void writeClass(PrintWriter writer,boolean abst, String name, String className, String baseClass, List<String> interfaces) {
\r
897 writer.println("@SuppressWarnings(\"unused\")");
\r
898 writer.print("public " +(abst ? "abstract " : "") + "class " + className + " extends "+baseClass);
\r
899 if (interfaces.size() > 0) {
\r
900 writer.print(" implements ");
\r
901 for (int i = 0; i < interfaces.size(); i++) {
\r
902 writer.print(interfaces.get(i));
\r
903 if (i < interfaces.size() -1 )
\r
907 writer.println("{");
\r
909 writer.println(" @Override");
\r
910 writer.println(" public java.lang.String getElementId() {");
\r
912 writer.println(" return \""+name+"\";");
\r
913 else // complex types cannot be parsed directly with name/id reference.
\r
914 writer.println(" return null;");
\r
915 writer.println(" }");
\r
919 private void writeIDProvider(PrintWriter writer) {
\r
920 if (provider != null) {
\r
921 writer.println(" java.lang.String idProviderValue = null;");
\r
923 writer.println(" @Override");
\r
924 writer.println(" public java.lang.String getID() {");
\r
925 writer.println(" java.lang.String s = idProviderValue;");
\r
926 writer.println(" idProviderValue = null;");
\r
927 writer.println(" return s;");
\r
928 writer.println(" }");
\r
930 if (provider.getPriority() != null) {
\r
931 writer.println(" @Override");
\r
932 writer.println(" public int idPriority() {");
\r
933 writer.println(" return " + provider.getPriority().intValue()+";");
\r
934 writer.println(" }");
\r
939 private void writeIDReferences(PrintWriter writer,String name, List<IDReference> references) {
\r
940 if (references.size() > 0) {
\r
941 writer.println(" @Override");
\r
942 writer.println(" public boolean connectReferences(WriteGraph graph, Element element, java.util.Map<java.lang.String, Element> map) throws DatabaseException {");
\r
943 writer.println(" "+getOntologyImport());
\r
944 writer.println(" boolean result = true;");
\r
945 for (IDReference ref : references) {
\r
946 writer.println(" {");
\r
947 writer.println(" Attribute a = element.getAttribute(\"" + ref.getIDSource().getName() +"\");");
\r
948 writer.println(" if (a != null) {");
\r
949 writer.println(" Element refEle = map.get(a.value);");
\r
950 writer.println(" if (refEle != null) {");
\r
951 writer.println(" Resource ref = refEle.getData();");
\r
952 writer.println(" graph.claim(element.getData(), "+ontShort+name+"_"+ref.getReference().getName()+", ref);");
\r
953 writer.println(" } else {");
\r
954 writer.println(" result = false;");
\r
955 writer.println(" }");
\r
956 writer.println(" }");
\r
957 writer.println(" }");
\r
959 writer.println(" return result;");
\r
960 writer.println(" }");
\r
965 private void writeUnknownChild(PrintWriter writer,String name, UnrecognizedChildElement unknownChildElement) {
\r
966 if (unknownChildElement == null)
\r
969 writer.println(" @Override");
\r
970 writer.println(" public void configureChild(WriteGraph graph, Deque<Element> parents, Element element, Element child) throws DatabaseException {");
\r
971 writer.println(" " + unknownChildElement.getJavaMethod());
\r
972 writer.println(" }");
\r
977 protected void createClassHeader(PrintWriter writer, boolean isList) {
\r
978 writer.println("package " + converter.getPluginName() +"."+elementPackageName+";");
\r
980 writer.println("import java.util.Deque;");
\r
981 writer.println("import org.simantics.databoard.Bindings;");
\r
982 writer.println("import org.simantics.db.Resource;");
\r
983 writer.println("import org.simantics.db.WriteGraph;");
\r
984 writer.println("import org.simantics.db.exception.DatabaseException;");
\r
985 writer.println("import org.simantics.xml.sax.base.Attribute;");
\r
986 writer.println("import org.simantics.xml.sax.base.Element;");
\r
987 writer.println("import org.simantics.xml.sax.ontology.XMLResource;");
\r
989 writer.println("import org.simantics.layer0.Layer0;");
\r
991 writer.println("import java.util.Collections;");
\r
992 writer.println("import org.simantics.db.common.utils.ListUtils;");
\r
997 private String getOntologyImport() {
\r
998 return this.ontologyClassName+" " +ontShort.substring(0, 3)+" = "+this.ontologyClassName+".getInstance(graph);";
\r
1002 private static class FileWriter {
\r
1003 public PrintWriter writer;
\r
1005 public PrintWriter delayedWriter;
\r
1006 public PrintWriter delayedWriter2;
\r
1009 public static String getName(SchemaObject obj) {
\r
1010 if (obj.getParent() == null) {
\r
1011 switch (obj.getType()) {
\r
1012 case COMPLEX_TYPE:
\r
1013 return getComplexTypePrefix()+obj.getName();
\r
1015 return obj.getName();
\r
1016 case ATTRIBUTE_GROUP:
\r
1017 return getAttributeGroupPrefix()+obj.getName();
\r
1019 return obj.getName();
\r
1022 SchemaObject o = obj;
\r
1023 SchemaObject prev = null;
\r
1025 while (o != null){
\r
1026 if (o.getName() != null)
\r
1027 name = o.getName()+"_"+name;
\r
1029 o = o.getParent();
\r
1030 if (prev.getObj() instanceof AttributeGroupRef)
\r
1033 name = name.substring(0, name.length()-1);
\r
1034 switch (prev.getType()) {
\r
1035 case COMPLEX_TYPE:
\r
1036 return getComplexTypePrefix()+name;
\r
1039 case ATTRIBUTE_GROUP:
\r
1040 return getAttributeGroupPrefix()+name;
\r
1045 throw new RuntimeException();
\r
1049 public static String getName(SchemaObject obj, String rel) {
\r
1050 if (obj.getParent() == null) {
\r
1051 switch (obj.getType()) {
\r
1052 case COMPLEX_TYPE:
\r
1053 return getComplexTypePrefix()+rel+obj.getName();
\r
1055 return rel+obj.getName();
\r
1056 case ATTRIBUTE_GROUP:
\r
1057 return getAttributeGroupPrefix()+rel+obj.getName();
\r
1059 return rel+obj.getName();
\r
1062 SchemaObject o = obj;
\r
1063 SchemaObject prev = null;
\r
1065 while (o != null){
\r
1066 if (o.getName() != null)
\r
1067 name = o.getName()+"_"+name;
\r
1069 o = o.getParent();
\r
1071 name = name.substring(0, name.length()-1);
\r
1072 switch (prev.getType()) {
\r
1073 case COMPLEX_TYPE:
\r
1074 return getComplexTypePrefix()+rel+name;
\r
1077 case ATTRIBUTE_GROUP:
\r
1078 return getAttributeGroupPrefix()+rel+name;
\r
1083 throw new RuntimeException();
\r