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.Collections;
\r
8 import java.util.List;
\r
9 import java.util.Map;
\r
11 import javax.xml.namespace.QName;
\r
13 import org.simantics.utils.datastructures.BijectionMap;
\r
14 import org.simantics.xml.sax.SchemaConversionBase.Inheritance;
\r
15 import org.simantics.xml.sax.SchemaConversionBase.InheritanceType;
\r
16 import org.simantics.xml.sax.SchemaConversionBase.RefType;
\r
17 import org.simantics.xml.sax.SchemaConversionBase.TypeEntry;
\r
18 import org.simantics.xml.sax.SchemaObject.ObjectType;
\r
19 import org.simantics.xml.sax.configuration.AttributeComposition;
\r
20 import org.simantics.xml.sax.configuration.IDProvider;
\r
21 import org.simantics.xml.sax.configuration.IDReference;
\r
22 import org.simantics.xml.sax.configuration.UnrecognizedChildElement;
\r
23 import org.w3._2001.xmlschema.Annotated;
\r
24 import org.w3._2001.xmlschema.Attribute;
\r
25 import org.w3._2001.xmlschema.AttributeGroup;
\r
26 import org.w3._2001.xmlschema.ComplexType;
\r
27 import org.w3._2001.xmlschema.Element;
\r
28 import org.w3._2001.xmlschema.LocalComplexType;
\r
29 import org.w3._2001.xmlschema.LocalSimpleType;
\r
30 import org.w3._2001.xmlschema.NamedAttributeGroup;
\r
31 import org.w3._2001.xmlschema.NamedGroup;
\r
32 import org.w3._2001.xmlschema.Restriction;
\r
33 import org.w3._2001.xmlschema.SimpleType;
\r
35 public class ExporterGenerator extends JavaGenerator{
\r
37 public ExporterGenerator(SchemaConverter converter, SchemaConversionBase base) {
\r
38 super(converter, base);
\r
41 public void createParser() throws IOException {
\r
43 String parserPackagePostfix = "_exp";
\r
44 String importerClassPostfix = "Exporter";
\r
45 String parserClassPostfix = "Writer";
\r
46 elementPackageName = name+parserPackagePostfix;
\r
48 importParserDir= new File(converter.getParserDir().getAbsolutePath()+"/"+elementPackageName);
\r
49 if (!importParserDir.exists())
\r
50 importParserDir.mkdirs();
\r
53 // Create Importer class
\r
54 File importerFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+importerClassPostfix+".java");
\r
55 PrintWriter mainWriter = createFile(importerFile);
\r
56 mainWriter.println("package " + converter.getPluginName() +";");
\r
57 mainWriter.println();
\r
58 mainWriter.println("import java.io.File;");
\r
59 mainWriter.println("import org.simantics.db.Resource;");
\r
60 mainWriter.println("import org.simantics.db.Session;");
\r
61 mainWriter.println("import org.simantics.db.exception.DatabaseException;");
\r
62 mainWriter.println("import org.simantics.xml.sax.base.AbstractExporter;");
\r
63 mainWriter.println();
\r
64 mainWriter.println("public class " + name + importerClassPostfix+" extends AbstractExporter {");
\r
65 mainWriter.println();
\r
66 mainWriter.println(" public " + name + importerClassPostfix+"(Session session, File file, Resource root) throws DatabaseException {");
\r
67 mainWriter.println(" super(session, file, root);");
\r
68 mainWriter.println(" setXmlWriter(new "+name + parserClassPostfix+"(session));");
\r
69 mainWriter.println(" }");
\r
70 mainWriter.println();
\r
71 mainWriter.println("}");
\r
73 mainWriter.println();
\r
77 // Create Parser class
\r
78 File parserFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+parserClassPostfix+".java");
\r
79 mainWriter = createFile(parserFile);
\r
80 mainWriter.println("package " + converter.getPluginName() +";");
\r
81 mainWriter.println();
\r
82 mainWriter.println("import org.simantics.xml.sax.base.XMLWriter;");
\r
83 mainWriter.println("import org.simantics.db.ReadGraph;");
\r
84 mainWriter.println("import org.simantics.db.Session;");
\r
85 mainWriter.println("import org.simantics.db.exception.DatabaseException;");
\r
86 mainWriter.println("import org.simantics.db.common.request.ReadRequest;");
\r
87 mainWriter.println();
\r
88 mainWriter.println("public class " + name + parserClassPostfix+" extends XMLWriter {");
\r
89 mainWriter.println();
\r
90 mainWriter.println(" public " + name + parserClassPostfix+"(Session session) throws DatabaseException {");
\r
91 if (schema.getTargetNamespace() != null)
\r
92 mainWriter.println(" setSchemaURI(\""+schema.getTargetNamespace()+"\");");
\r
93 mainWriter.println(" setOntologyURI(\""+ontologyUri+"\");");
\r
94 mainWriter.println(" session.syncRequest(new ReadRequest() {");
\r
95 mainWriter.println(" @Override");
\r
96 mainWriter.println(" public void run(ReadGraph graph) throws DatabaseException {");
\r
97 mainWriter.println(" setGraph(graph);");
\r
98 for (String s : ruleClassNames) {
\r
99 mainWriter.println(" add(new "+s+"(graph));");
\r
101 mainWriter.println(" }");
\r
102 mainWriter.println(" });");
\r
103 mainWriter.println(" }");
\r
104 mainWriter.println("}");
\r
106 mainWriter.println();
\r
107 mainWriter.flush();
\r
108 mainWriter.close();
\r
112 // protected void handle(TopLevelAttribute topLevelAttribute) {
\r
117 public String getBaseClass(ObjectType type) {
\r
118 return "org.simantics.xml.sax.base.XMLElementNamedChildWriterBase";
\r
122 public void handleSimpleType(SchemaObject parent, SchemaObject simpleTypeObj) {
\r
126 public void handle(SchemaObject parent, NamedGroup attribute) {
\r
127 // TODO Auto-generated method stub
\r
132 public void handleComplexType(SchemaObject complexTypeObj) {
\r
133 ComplexType topLevelComplexType = complexTypeObj.getComplexType();
\r
135 String name = getName(complexTypeObj);
\r
137 String className = name;//"_"+name;
\r
139 FileWriter fw = new FileWriter();
\r
141 fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));
\r
142 } catch (IOException e) {
\r
143 throw new RuntimeException(e);
\r
145 writers.put(complexTypeObj, fw);
\r
147 // String baseClass = getBaseClass(ObjectType.COMPLEX_TYPE);
\r
149 // boolean inherited = false;
\r
151 // QName type = getComplexTypeBase(topLevelComplexType);
\r
152 // if (type != null && !type.getNamespaceURI().equals("http://www.w3.org/2001/XMLSchema")) {
\r
153 // SchemaObject obj = complexTypeName.get(type.getLocalPart());
\r
154 //// if (obj == null)
\r
155 //// obj = simpleTypeName.get(type.getLocalPart());
\r
156 // if (obj != null) {
\r
157 // baseClass = getName(obj);
\r
158 // inherited = true;
\r
161 Inheritance inheritance = base.getInheritance(complexTypeObj);
\r
163 provider = base.getIDProvider(topLevelComplexType);
\r
164 // List<IDReference> references = getIDReferences(topLevelComplexType);
\r
165 // UnrecognizedChildElement unknownChildElement = getUnknown(topLevelComplexType);
\r
167 // List<String> intrerfaces = new ArrayList<String>();
\r
168 // if (references.size() > 0)
\r
169 // intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser");
\r
170 // if (unknownChildElement != null)
\r
171 // intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser");
\r
173 createClassHeader(fw.writer);
\r
174 writeClass(fw.writer,false, topLevelComplexType.getName(), className, inheritance.baseClass, Collections.EMPTY_LIST);
\r
176 // writeIDProvider(fw.writer);
\r
178 fw.writer.println(" @Override");
\r
179 fw.writer.println(" public Resource getType(ReadGraph graph) throws DatabaseException {");
\r
180 fw.writer.println(" "+getOntologyImport());
\r
181 fw.writer.println(" return "+ontShort+name+";");
\r
182 fw.writer.println(" }");
\r
183 fw.writer.println();
\r
185 // fw.writer.println(" @Override");
\r
186 // fw.writer.println(" public Resource create(WriteGraph graph, ParserElement element) throws DatabaseException{");
\r
187 // fw.writer.println(" Layer0 L0 = Layer0.getInstance(graph);");
\r
188 // fw.writer.println(" "+getOntologyImport());
\r
190 // fw.writer.println(" Resource res = graph.newResource();");
\r
191 // fw.writer.println(" graph.claim(res, L0.InstanceOf, "+ontShort+name+");");
\r
193 // fw.writer.println(" Resource res = ListUtils.create(graph, "+ontShort+name+", Collections.EMPTY_LIST);");
\r
195 // fw.writer.println(" return res;");
\r
196 // fw.writer.println(" }");
\r
197 // fw.writer.println();
\r
199 // fw.writer.println(" @Override");
\r
200 // fw.writer.println(" public boolean connectParent(WriteGraph graph, ParserElement parent, ParserElement element) throws DatabaseException{");
\r
201 // fw.writer.println(" "+getOntologyImport());
\r
202 // fw.writer.println(" graph.claim(parent.getData(), "+this.ontShort+getName(complexTypeObj,"has")+", element.getData());");
\r
203 // fw.writer.println(" return true;");
\r
204 // fw.writer.println(" }");
\r
205 // fw.writer.println();
\r
207 StringWriter stringWriter = new StringWriter();
\r
208 fw.delayedWriter = new PrintWriter(stringWriter);
\r
209 StringWriter stringWriter2 = new StringWriter();
\r
210 fw.delayedWriter2 = new PrintWriter(stringWriter2);
\r
212 fw.writer.println(" public " + className + "(ReadGraph graph) {");
\r
213 fw.writer.println(" super(graph);");
\r
214 fw.writer.println(" "+getOntologyImport());
\r
216 base.handleComplexTypeExtension(complexTypeObj);
\r
218 fw.writer.println(" }");
\r
220 fw.writer.println(" @Override");
\r
221 fw.writer.println(" public void children(ReadGraph graph, WriterElement instance, java.util.Set<org.simantics.db.Resource> result) throws XMLStreamException, DatabaseException {");
\r
222 fw.writer.println(" "+getOntologyImport());
\r
224 if (stringWriter.getBuffer().length() > 0) {
\r
225 fw.writer.write(stringWriter.toString());
\r
227 if (inheritance.type == InheritanceType.ComplexType)
\r
228 fw.writer.println(" super.children(graph,instance,result);");
\r
229 fw.writer.println(" }");
\r
230 fw.writer.println();
\r
232 if (stringWriter2.getBuffer().length() > 0) {
\r
233 fw.writer.write(stringWriter2.toString());
\r
236 stringWriter = null;
\r
237 fw.delayedWriter.close();
\r
238 fw.delayedWriter=null;
\r
239 stringWriter2 = null;
\r
240 fw.delayedWriter2.close();
\r
241 fw.delayedWriter2 = null;
\r
243 fw.writer.println(" @Override");
\r
244 fw.writer.println(" public void attributes(ReadGraph graph, WriterElement instance, Collection<Statement> attributes, XMLStreamWriter writer) throws XMLStreamException, DatabaseException{");
\r
245 if (inheritance.type == InheritanceType.ComplexType) {
\r
246 fw.writer.println(" super.attributes(graph,instance,attributes,writer);");
\r
248 fw.writer.println(" "+getOntologyImport());
\r
249 fw.writer.println(" for (Statement attribute : attributes) {");
\r
250 base.handleComplexTypeAttributes(complexTypeObj);
\r
251 base.handleExtensionAttributes(complexTypeObj);
\r
252 fw.writer.println(" }");
\r
253 fw.writer.println(" }");
\r
255 if (inheritance.type == InheritanceType.AtomicType) {
\r
256 fw.writer.println();
\r
257 fw.writer.println(" @Override");
\r
258 fw.writer.println(" public void characters(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) throws XMLStreamException, DatabaseException {");
\r
259 fw.writer.println(" writer.writeCharacters("+inheritance.atomicType.getToString("graph.getValue(instance.getResource(),"+inheritance.atomicType.binding+")")+");");
\r
260 fw.writer.println(" }");
\r
263 // writeIDReferences(fw.writer,name, references);
\r
264 // writeUnknownChild(fw.writer,name,unknownChildElement);
\r
266 fw.writer.println("}");
\r
267 fw.writer.println();
\r
271 writers.remove(complexTypeObj);
\r
276 protected void createReferenceIndicator(SchemaObject parent, RefType referenceType, String refName, String objectName,
\r
277 String primaryClassName, String secondaryClassName, boolean useElementList, boolean useOriginalList) {
\r
278 FileWriter fw = getWriter(parent);
\r
279 if ("TextOrField".equals(refName))
\r
280 System.out.println();
\r
281 if (referenceType == RefType.Type) {
\r
282 // create internal class for handling the element and child attachment
\r
283 secondaryClassName = getName(parent) +"_" +objectName;
\r
284 if (objectName.equals(refName))
\r
285 fw.writer.println(" addRelationWriter("+ontShort+ getName(parent)+"_has"+refName +", "+secondaryClassName+".class);");
\r
286 else // FIXME : type name may not be correct
\r
287 fw.writer.println(" addRelationTypeWriter("+ontShort+ getName(parent)+"_has"+refName +", " +ontShort+primaryClassName +", "+secondaryClassName+".class);");
\r
288 fw.delayedWriter2.println(" public static class " + secondaryClassName +" extends " + primaryClassName +"{");
\r
289 fw.delayedWriter2.println(" public "+ secondaryClassName +"(ReadGraph graph){");
\r
290 fw.delayedWriter2.println(" super(graph);");
\r
291 fw.delayedWriter2.println(" }");
\r
292 fw.delayedWriter2.println(" ");
\r
293 fw.delayedWriter2.println(" @Override");
\r
294 fw.delayedWriter2.println(" public java.lang.String getElementId() {");
\r
295 fw.delayedWriter2.println(" return \"" + refName +"\";");
\r
296 fw.delayedWriter2.println(" }");
\r
297 fw.delayedWriter2.println(" }");
\r
298 } else { //referenceType == RefType.Reference
\r
299 fw.writer.println(" addWriter("+primaryClassName+".class);");
\r
300 if (!primaryClassName.equals(secondaryClassName))
\r
301 fw.writer.println(" addWriter("+secondaryClassName+".class);");
\r
303 // fw.delayedWriter.println(" if (child.getElementParser() instanceof "+refClassName+"){");
\r
304 // fw.delayedWriter.println(" graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+ref + ", child.getData());");
\r
305 if (useElementList) {
\r
307 // element type specific list
\r
308 fw.delayedWriter.println(" {");
\r
309 fw.delayedWriter.println(" org.simantics.db.Resource list = graph.getPossibleObject(instance.getResource(),"+ontShort+getName(parent)+"_has"+refName + "List);");
\r
310 fw.delayedWriter.println(" if (list != null) {");
\r
311 fw.delayedWriter.println(" java.util.List<org.simantics.db.Resource> l = org.simantics.db.common.utils.ListUtils.toList(graph, list);");
\r
312 fw.delayedWriter.println(" result.addAll(l);");
\r
313 fw.delayedWriter.println(" } else {");
\r
314 fw.delayedWriter.println(" result.addAll(graph.getObjects(instance.getResource(), "+ontShort+getName(parent)+"_has"+refName + "));");
\r
315 fw.delayedWriter.println(" }");
\r
316 fw.delayedWriter.println(" }");
\r
318 fw.delayedWriter.println(" result.addAll(graph.getObjects(instance.getResource(), "+ontShort+getName(parent)+"_has"+refName + "));");
\r
320 // if (useOriginalList(parent, indicator,element, reference, ref, refType)) {
\r
322 // fw.delayedWriter.println(" {");
\r
323 // fw.delayedWriter.println(" XMLResource XML = XMLResource.getInstance(graph);");
\r
324 // fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");
\r
325 // fw.delayedWriter.println(" if (list == null) {");
\r
326 // fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
\r
327 // fw.delayedWriter.println(" graph.claim(element.getData(), XML.hasOriginalElementList,list);");
\r
328 // fw.delayedWriter.println(" } else {");
\r
329 // fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
\r
330 // fw.delayedWriter.println(" }");
\r
331 // fw.delayedWriter.println(" }");
\r
334 // fw.delayedWriter.println(" return true;");
\r
335 // fw.delayedWriter.println(" }");
\r
340 protected void createPrimitiveIndicator(SchemaObject parent, String refName, String binding) {
\r
341 FileWriter fw = getWriter(parent);
\r
342 //SchemaObject refElement = elementName.get(refType.getLocalPart());
\r
343 //writer.println(commentTag+ontShort+"."+parent+".has"+ref + " <R " + ontShort+".hasElement");
\r
344 fw.writer.println(" addRelationWriter("+ ontShort +getName(parent) + "_has"+refName+", "+getName(parent) +"_" +refName+".class);");
\r
346 fw.delayedWriter2.println(" public static class " + getName(parent) +"_" +refName+" extends org.simantics.xml.sax.base.ValueElementWriter {");
\r
347 fw.delayedWriter2.println(" public "+ getName(parent) +"_" +refName +"(){");
\r
348 //fw.delayedWriter2.println(" super(\""+ref+"\"," +this.ontologyClassName+".URIs."+getName(parent) + "_has"+ref+", "+binding+");");
\r
349 fw.delayedWriter2.println(" super(\""+refName+"\",null, "+binding+");");
\r
350 fw.delayedWriter2.println(" }");
\r
351 fw.delayedWriter2.println(" }");
\r
355 protected void createElementIndicator(SchemaObject parent, boolean useElementList, String refName, String className,
\r
356 boolean useOriginalList) {
\r
357 FileWriter fw = getWriter(parent);
\r
359 fw.writer.println(" addTypeWriter("+ ontShort+className +", "+className+".class);");
\r
361 // fw.writer.println(" addWriter("+className+".class);");
\r
363 // fw.delayedWriter.println(" if (child.getElementParser() instanceof "+className+"){");
\r
364 // fw.delayedWriter.println(" graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+ref + ", child.getData());");
\r
365 if (useElementList) {
\r
367 // element type specific list
\r
368 fw.delayedWriter.println(" {");
\r
369 fw.delayedWriter.println(" org.simantics.db.Resource list = graph.getPossibleObject(instance.getResource(),"+ontShort+getName(parent)+"_has"+refName + "List);");
\r
370 fw.delayedWriter.println(" if (list != null) {");
\r
371 fw.delayedWriter.println(" java.util.List<org.simantics.db.Resource> l = org.simantics.db.common.utils.ListUtils.toList(graph, list);");
\r
372 fw.delayedWriter.println(" result.addAll(l);");
\r
373 fw.delayedWriter.println(" } else {");
\r
374 fw.delayedWriter.println(" result.addAll(graph.getObjects(instance.getResource(), "+ontShort+getName(parent)+"_has"+refName + "));");
\r
375 fw.delayedWriter.println(" }");
\r
376 fw.delayedWriter.println(" }");
\r
378 fw.delayedWriter.println(" result.addAll(graph.getObjects(instance.getResource(), "+ontShort+getName(parent)+"_has"+refName + "));");
\r
380 // if (useOriginalList(parent, indicator,element, reference, ref, new QName(obj.getName()))) {
\r
382 // fw.delayedWriter.println(" {");
\r
383 // fw.delayedWriter.println(" XMLResource XML = XMLResource.getInstance(graph);");
\r
384 // fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");
\r
385 // fw.delayedWriter.println(" if (list == null) {");
\r
386 // fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
\r
387 // fw.delayedWriter.println(" graph.claim(element.getData(), XML.hasOriginalElementList,list);");
\r
388 // fw.delayedWriter.println(" } else {");
\r
389 // fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
\r
390 // fw.delayedWriter.println(" }");
\r
391 // fw.delayedWriter.println(" }");
\r
394 // fw.delayedWriter.println(" return true;");
\r
395 // fw.delayedWriter.println(" }");
\r
400 public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) {
\r
401 // generates overriding method that allows writing any element
\r
402 FileWriter fw = getWriter(parent);
\r
403 fw.delayedWriter2.println(" @Override");
\r
404 fw.delayedWriter2.println(" public Class<? extends org.simantics.xml.sax.base.XMLElementWriter> getWriter(ReadGraph graph, java.util.Map<Resource, org.simantics.xml.sax.base.XMLElementWriter> writers, WriterElement child) throws DatabaseException{");
\r
405 fw.delayedWriter2.println(" Class<? extends org.simantics.xml.sax.base.XMLElementWriter> writerClass = super.getWriter(graph, writers, child);");
\r
406 fw.delayedWriter2.println(" if (writerClass != null) return writerClass;");
\r
407 fw.delayedWriter2.println(" Resource type = graph.getSingleType(child.instance);");
\r
408 fw.delayedWriter2.println(" org.simantics.xml.sax.base.XMLElementWriter writer = writers.get(type);");
\r
409 fw.delayedWriter2.println(" if (writer != null) return writer.getClass();");
\r
410 fw.delayedWriter2.println(" return null;");
\r
411 fw.delayedWriter2.println(" }");
\r
415 public void handle(SchemaObject parent, Attribute attribute) {
\r
416 if (parent == null)
\r
418 String name = attribute.getName();
\r
419 QName primitiveType = attribute.getType();
\r
420 SimpleType simpleType = attribute.getSimpleType();
\r
421 QName ref = attribute.getRef();
\r
423 String relationName;
\r
425 if (name != null) {
\r
427 relationName = ontShort+"has"+name;
\r
428 if (parent != null)
\r
429 relationName = ontShort+getName(parent)+"_has"+name;
\r
431 else if (ref != null && parent != null) {
\r
432 attrName = ref.getLocalPart();
\r
433 relationName = ontShort+getName(parent)+"_has"+ref.getLocalPart();
\r
435 Attribute referred = base.getRefAttribute(ref);
\r
436 if (referred != null) {
\r
437 primitiveType = referred.getType();
\r
438 simpleType = referred.getSimpleType();
\r
442 throw new RuntimeException();
\r
444 boolean isReference = false;
\r
445 if (provider!= null && provider.getAttribute().getName().equals(attrName))
\r
446 isReference = true;
\r
448 FileWriter fw = getWriter(parent);
\r
449 if (primitiveType != null) {
\r
451 //String binding = getBindingFromPrimitiveType(primitiveType);
\r
452 TypeEntry binding = base.getTypeEntry(primitiveType);
\r
454 if (binding != null) {
\r
455 writeAttribute(fw, attrName, relationName, binding, isReference);
\r
458 if (simpleType == null) {
\r
459 SchemaObject simpleTypeObj = base.simpleTypeName.get(primitiveType.getLocalPart());
\r
460 if (simpleTypeObj != null)
\r
461 simpleType = simpleTypeObj.getSimpleType();
\r
465 if (simpleType != null) {
\r
466 org.w3._2001.xmlschema.List list = simpleType.getList();
\r
467 if (list != null) {
\r
468 TypeEntry binding = base.getTypeEntry(new QName(SchemaConversionBase.SCHEMA_NS, "string"));
\r
469 writeAttribute(fw, attrName, relationName, binding, isReference);
\r
471 Restriction restriction = simpleType.getRestriction();
\r
472 if (restriction == null)
\r
473 throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart()+ ", SimpleType restriction is unset");
\r
474 QName base = restriction.getBase();
\r
477 //String binding = getBindingFromPrimitiveType(base);
\r
478 TypeEntry binding = this.base.getTypeEntry(base);
\r
479 writeAttribute(fw, attrName, relationName, binding, isReference);
\r
482 // TODO : using default String attribute should be configured with rules.
\r
483 //throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart());
\r
484 fw.writer.println(" //FIXME: Cannot resolve type for Attribute " + attrName + " Using default type String");
\r
485 //writeAttribute(fw, attrName, relationName, "STRING", isReference);
\r
486 writeAttribute(fw, attrName, relationName, base.getTypeEntry("string"), isReference);
\r
490 private void writeAttribute(FileWriter fw, String attrName, String relationName, TypeEntry binding, boolean isReference) {
\r
491 fw.writer.println(" {");
\r
492 fw.writer.println(" if (attribute.getPredicate().equals("+relationName+")) {");
\r
493 fw.writer.println(" writer.writeAttribute(\""+attrName+"\", " + binding.getToString("graph.getValue(attribute.getObject(),"+binding.binding+")")+");");
\r
494 // fw.writer.println(" graph.claimLiteral(element.getData(),"+relationName+","+getValueGetterMethod(binding,"a")+", "+binding.binding+");");
\r
495 // if (isReference)
\r
496 // fw.writer.println(" idProviderValue = a.getValue();");
\r
497 fw.writer.println(" }");
\r
498 fw.writer.println(" }");
\r
502 public void handleAttributes(SchemaObject simpleTypeObj) {
\r
503 SchemaObject parent = simpleTypeObj.getParent();
\r
504 FileWriter fw = getWriter(parent);
\r
506 SimpleType simpleType = simpleTypeObj.getSimpleType();
\r
507 Restriction restriction = simpleType.getRestriction();
\r
508 if (restriction == null)
\r
509 throw new RuntimeException("Cannot resolve type for Element " + getName(parent));
\r
510 QName base = restriction.getBase();
\r
513 //String binding = getBindingFromPrimitiveType(base);
\r
514 TypeEntry binding = this.base.getTypeEntry(base);
\r
516 fw.writer.println(" @Override");
\r
517 fw.writer.println(" public void characters(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) throws XMLStreamException, DatabaseException {");
\r
518 fw.writer.println(" writer.writeCharacters("+ binding.getToString("graph.getValue(attribute.getObject(),"+binding.binding+")")+");");
\r
519 // fw.writer.println(" graph.claimValue(element.getData(),"+getValueGetter(binding)+", "+binding.binding +");");
\r
520 fw.writer.println(" }");
\r
524 public void handle(SchemaObject parent, AttributeGroup attribute) {
\r
525 if (parent != null) {
\r
526 FileWriter fw = getWriter(parent);
\r
527 NamedAttributeGroup group = this.base.getAttributeGroup(attribute.getRef().getLocalPart());
\r
528 fw.writer.println(commentTag+" AttributeGroup " + group.getName());
\r
529 SchemaObject obj = new SchemaObject(parent,attribute);
\r
530 for (Annotated annotated : group.getAttributeOrAttributeGroup()) {
\r
531 if (annotated instanceof Attribute) {
\r
532 //handle("AttributeGroups_"+group.getName(),(Attribute)annotated);
\r
533 handle(obj,(Attribute)annotated);
\r
534 } else if (annotated instanceof AttributeGroup) {
\r
535 //handle("AttributeGroups_"+group.getName(),(AttributeGroup)annotated);
\r
536 handle(obj,(AttributeGroup)annotated);
\r
539 fw.writer.println(commentTag+" End of AttributeGroup " + group.getName());
\r
545 public void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes) {
\r
546 FileWriter fw = getWriter(parent);
\r
547 QName type = new QName(SchemaConversionBase.CONVERSION_NS, composition.getType());
\r
548 TypeEntry typeEntry = this.base.getTypeEntry(type);
\r
549 String arrayBinding = typeEntry.binding;//getBindingFromPrimitiveType(type);
\r
550 String javaType = typeEntry.javaType;//getJavaTypeFromPrimitiveType(type);
\r
551 String name = composition.getName();
\r
553 String relationName;
\r
554 if (name != null) {
\r
555 relationName = ontShort+"has"+name;
\r
556 if (parent != null)
\r
557 relationName = ontShort+getName(parent)+"_has"+name;
\r
559 throw new RuntimeException();
\r
561 fw.writer.println(" if (attribute.getPredicate().equals("+relationName+")) {");
\r
562 fw.writer.println(" "+javaType+" value = ("+javaType+")graph.getValue(attribute.getObject(),"+arrayBinding+");");
\r
563 //fw.writer.println(" writer.writeAttribute("+attrName+", graph.getValue(attribute.getObject(),"+binding.binding+").toString());");
\r
566 for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute())
\r
567 fw.writer.println(" writer.writeAttribute(\""+a.getName()+"\","+typeEntry.getElementToString("value["+(i++)+"]")+");");
\r
568 //fw.writer.println(" writer.writeAttribute(\""+a.getName()+"\",value["+(i++)+"].toString());");
\r
569 // fw.writer.println(" Attribute a"+(i++)+" = element.getAttribute(\"" +a.getName()+"\");");
\r
570 // fw.writer.print (" "+javaType + " value = new "+javaType+"{");
\r
572 // FIXME : handle optional attributes properly.
\r
573 // for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute()) {
\r
574 // Attribute attribute = ((Attribute)attributes.getRight(a));
\r
575 // //QName atype = getBaseType(attribute);
\r
576 // QName atype = getPrimitiveType(attribute);
\r
577 // String defaultValue = attribute.getDefault();
\r
578 // if (defaultValue == null)
\r
579 // defaultValue = getDefaultValue(atype);
\r
581 // //String binding = getBindingFromPrimitiveType(atype);
\r
582 // TypeEntry binding = getTypeEntry(atype);
\r
584 // fw.writer.print(",");
\r
585 // if (defaultValue != null)
\r
586 // fw.writer.print("a"+(i)+"!= null ? "+ getValueGetterMethod(binding,"a"+(i++)) + " : " +defaultValue);
\r
588 // fw.writer.print(getValueGetterMethod(binding,"a"+(i++)));
\r
590 // fw.writer.println("};");
\r
591 // fw.writer.println(" graph.claimLiteral(element.getData(),"+relationName+", value, "+arrayBinding+");");
\r
592 fw.writer.println(" }");
\r
596 protected String getDefaultValue(QName atype) {
\r
597 Map<String,TypeEntry> types = this.base.typeMap.get(atype.getNamespaceURI());
\r
600 TypeEntry entry = types.get(atype.getLocalPart());
\r
603 return entry.defaultValue;
\r
606 IDProvider provider;
\r
608 public void handleElement(SchemaObject elementObj) {
\r
609 Element element = elementObj.getElement();
\r
611 String name = getName(elementObj);//topLevelElement.getName();
\r
612 String className = name;
\r
614 FileWriter fw = new FileWriter();
\r
616 fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));
\r
617 } catch (IOException e) {
\r
618 throw new RuntimeException(e);
\r
620 writers.put(elementObj, fw);
\r
621 boolean isList = false;
\r
623 Inheritance inheritance = this.base.getInheritance(elementObj);
\r
625 provider = this.base.getIDProvider(element);
\r
626 List<IDReference> references = this.base.getIDReferences(element);
\r
627 UnrecognizedChildElement unknownChildElement = this.base.getUnknown(element);
\r
629 // List<String> intrerfaces = new ArrayList<String>();
\r
630 // if (references.size() > 0)
\r
631 // intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser");
\r
632 // if (unknownChildElement != null)
\r
633 // intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser");
\r
635 createClassHeader(fw.writer);
\r
636 writeClass(fw.writer,false, element.getName(), className, inheritance.baseClass, Collections.EMPTY_LIST);
\r
637 // writeIDProvider(fw.writer);
\r
638 fw.writer.println(" @Override");
\r
639 fw.writer.println(" public Resource getType(ReadGraph graph) throws DatabaseException {");
\r
640 fw.writer.println(" "+getOntologyImport());
\r
641 fw.writer.println(" return "+ontShort+name+";");
\r
643 // fw.writer.println(" Resource res = graph.newResource();");
\r
644 // fw.writer.println(" graph.claim(res, L0.InstanceOf, "+ontShort+name+");");
\r
646 // fw.writer.println(" Resource res = ListUtils.create(graph, "+ontShort+name+", Collections.EMPTY_LIST);");
\r
648 // fw.writer.println(" return res;");
\r
649 fw.writer.println(" }");
\r
650 fw.writer.println();
\r
652 // fw.writer.println(" @Override");
\r
653 // fw.writer.println(" public boolean connectParent(WriteGraph graph, ParserElement parent, ParserElement element) throws DatabaseException{");
\r
654 // fw.writer.println(" "+getOntologyImport());
\r
655 // fw.writer.println(" graph.claim(parent.getData(), "+this.ontShort+getName(elementObj,"has")+", element.getData());");
\r
656 // fw.writer.println(" return true;");
\r
657 // fw.writer.println(" }");
\r
658 // fw.writer.println();
\r
659 LocalComplexType complexType = element.getComplexType();
\r
660 LocalSimpleType simpleType = element.getSimpleType();
\r
662 fw.writer.println(" @Override");
\r
663 fw.writer.println(" public void attributes(ReadGraph graph, WriterElement instance, Collection<Statement> attributes, XMLStreamWriter writer) throws XMLStreamException, DatabaseException{");
\r
664 if (inheritance.type == InheritanceType.ComplexType) {
\r
665 fw.writer.println(" super.attributes(graph,instance,attributes,writer);");
\r
667 fw.writer.println(" "+getOntologyImport());
\r
668 fw.writer.println(" for (Statement attribute : attributes) {");
\r
669 if (complexType != null) {
\r
670 SchemaObject obj = this.base.complexTypes.get(complexType);
\r
671 this.base.handleElementComplexTypeAttributes(obj);
\r
673 fw.writer.println(" }");
\r
674 fw.writer.println(" }");
\r
677 // fw.writer.println(" @Override");
\r
678 // fw.writer.println(" public void configure(WriteGraph graph, Deque<ParserElement> parents, ParserElement element) throws DatabaseException {");
\r
679 // if (inhertiance.type == InheritanceType.ComplexType) {
\r
680 // fw.writer.println(" super.configure(graph,parents,element);");
\r
682 // fw.writer.println(" "+getOntologyImport());
\r
684 // LocalComplexType complexType = element.getComplexType();
\r
685 // LocalSimpleType simpleType = element.getSimpleType();
\r
687 // if (complexType != null) {
\r
688 // SchemaObject obj = complexTypes.get(complexType);
\r
689 // handleElementComplexTypeAttributes(obj);
\r
691 // fw.writer.println(" }");
\r
693 if (inheritance.type == InheritanceType.AtomicType) {
\r
694 fw.writer.println();
\r
695 // fw.writer.println(" @Override");
\r
696 // fw.writer.println(" public void configure(WriteGraph graph, ParserElement element, java.lang.String string) throws DatabaseException {");
\r
697 // fw.writer.println(" graph.claimValue(element.getData(), "+getValueGetter(inhertiance.atomicType,"string")+", "+inhertiance.atomicType.binding+");");
\r
698 // fw.writer.println(" }");
\r
699 fw.writer.println(" @Override");
\r
700 fw.writer.println(" public void characters(ReadGraph graph, WriterElement instance, XMLStreamWriter writer) throws XMLStreamException, DatabaseException {");
\r
701 fw.writer.println(" writer.writeCharacters("+inheritance.atomicType.getToString("graph.getValue(instance.getResource(),"+inheritance.atomicType.binding+")")+");");
\r
702 // fw.writer.println(" graph.claimValue(element.getData(),"+getValueGetter(binding)+", "+binding.binding +");");
\r
703 fw.writer.println(" }");
\r
705 // if (simpleType != null) {
\r
706 // SchemaObject obj = simpleTypes.get(simpleType);
\r
707 // handleElementSimpleTypeAttributes(obj);
\r
711 StringWriter stringWriter = new StringWriter();
\r
712 fw.delayedWriter = new PrintWriter(stringWriter);
\r
713 StringWriter stringWriter2 = new StringWriter();
\r
714 fw.delayedWriter2 = new PrintWriter(stringWriter2);
\r
716 fw.writer.println(" public " + className + "(ReadGraph graph) {");
\r
717 fw.writer.println(" super(graph);");
\r
718 fw.writer.println(" "+getOntologyImport());
\r
719 if (complexType != null) {
\r
720 SchemaObject obj = this.base.complexTypes.get(complexType);
\r
721 this.base.handleComplexTypeExtension(obj);
\r
722 } else if (simpleType != null) {
\r
726 fw.writer.println(" }");
\r
728 fw.writer.println(" @Override");
\r
729 fw.writer.println(" public void children(ReadGraph graph, WriterElement instance, java.util.Set<org.simantics.db.Resource> result) throws XMLStreamException, DatabaseException {");
\r
730 fw.writer.println(" "+getOntologyImport());
\r
732 if (stringWriter.getBuffer().length() > 0) {
\r
733 fw.writer.write(stringWriter.toString());
\r
736 if (inheritance.type == InheritanceType.ComplexType) {
\r
737 fw.writer.println(" super.children(graph,instance,result);");
\r
740 fw.writer.println(" }");
\r
741 fw.writer.println();
\r
743 if (stringWriter2.getBuffer().length() > 0) {
\r
744 fw.writer.write(stringWriter2.toString());
\r
747 stringWriter = null;
\r
748 fw.delayedWriter.close();
\r
749 fw.delayedWriter = null;
\r
750 stringWriter2 = null;
\r
751 fw.delayedWriter2.close();
\r
752 fw.delayedWriter2 = null;
\r
754 // writeIDReferences(fw.writer,name, references);
\r
755 // writeUnknownChild(fw.writer,name,unknownChildElement);
\r
757 fw.writer.println("}");
\r
758 fw.writer.println();
\r
762 writers.remove(elementObj);
\r
765 ruleClassNames.add(converter.getPluginName()+"."+elementPackageName+"."+name);
\r
769 // private void writeIDProvider(PrintWriter writer) {
\r
770 // if (provider != null) {
\r
771 // writer.println(" java.lang.String idProviderValue = null;");
\r
772 // writer.println();
\r
773 // writer.println(" @Override");
\r
774 // writer.println(" public java.lang.String getID() {");
\r
775 // writer.println(" java.lang.String s = idProviderValue;");
\r
776 // writer.println(" idProviderValue = null;");
\r
777 // writer.println(" return s;");
\r
778 // writer.println(" }");
\r
779 // writer.println();
\r
780 // if (provider.getPriority() != null) {
\r
781 // writer.println(" @Override");
\r
782 // writer.println(" public int idPriority() {");
\r
783 // writer.println(" return " + provider.getPriority().intValue()+";");
\r
784 // writer.println(" }");
\r
789 // private void writeIDReferences(PrintWriter writer,String name, List<IDReference> references) {
\r
790 // if (references.size() > 0) {
\r
791 // writer.println(" @Override");
\r
792 // writer.println(" public boolean connectReferences(WriteGraph graph, ParserElement element, java.util.Map<java.lang.String, ParserElement> map) throws DatabaseException {");
\r
793 // writer.println(" "+getOntologyImport());
\r
794 // writer.println(" boolean result = true;");
\r
795 // for (IDReference ref : references) {
\r
796 // writer.println(" {");
\r
797 // writer.println(" Attribute a = element.getAttribute(\"" + ref.getIDSource().getName() +"\");");
\r
798 // writer.println(" if (a != null) {");
\r
799 // writer.println(" ParserElement refEle = map.get(a.value);");
\r
800 // writer.println(" if (refEle != null) {");
\r
801 // writer.println(" Resource ref = refEle.getData();");
\r
802 // writer.println(" graph.claim(element.getData(), "+ontShort+name+"_"+ref.getReference().getName()+", ref);");
\r
803 // writer.println(" } else {");
\r
804 // writer.println(" result = false;");
\r
805 // writer.println(" }");
\r
806 // writer.println(" }");
\r
807 // writer.println(" }");
\r
809 // writer.println(" return result;");
\r
810 // writer.println(" }");
\r
811 // writer.println();
\r
815 // private void writeUnknownChild(PrintWriter writer,String name, UnrecognizedChildElement unknownChildElement) {
\r
816 // if (unknownChildElement == null)
\r
819 // writer.println(" @Override");
\r
820 // writer.println(" public void configureChild(WriteGraph graph, Deque<ParserElement> parents, ParserElement element, ParserElement child) throws DatabaseException {");
\r
821 // writer.println(" " + unknownChildElement.getJavaMethod());
\r
822 // writer.println(" }");
\r
823 // writer.println();
\r
827 protected void createClassHeader(PrintWriter writer) {
\r
828 writer.println("package " + converter.getPluginName() +"."+elementPackageName+";");
\r
830 writer.println("import org.simantics.databoard.Bindings;");
\r
831 writer.println("import org.simantics.db.Resource;");
\r
832 writer.println("import org.simantics.db.ReadGraph;");
\r
833 writer.println("import org.simantics.db.Statement;");
\r
834 writer.println("import org.simantics.db.exception.DatabaseException;");
\r
835 writer.println("import org.simantics.xml.sax.base.WriterElement;");
\r
836 writer.println("import org.simantics.xml.sax.ontology.XMLResource;");
\r
837 writer.println("import java.util.Collection;");
\r
838 writer.println("import javax.xml.stream.XMLStreamException;");
\r
839 writer.println("import javax.xml.stream.XMLStreamWriter;");
\r
841 // writer.println("import org.simantics.layer0.Layer0;");
\r
843 // writer.println("import java.util.Collections;");
\r
844 // writer.println("import org.simantics.db.common.utils.ListUtils;");
\r