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.List;
\r
10 import javax.xml.namespace.QName;
\r
12 import org.simantics.utils.datastructures.BijectionMap;
\r
13 import org.simantics.xml.sax.SchemaConversionBase.Inheritance;
\r
14 import org.simantics.xml.sax.SchemaConversionBase.InheritanceType;
\r
15 import org.simantics.xml.sax.SchemaConversionBase.RefType;
\r
16 import org.simantics.xml.sax.SchemaConversionBase.TypeEntry;
\r
17 import org.simantics.xml.sax.SchemaObject.ObjectType;
\r
18 import org.simantics.xml.sax.configuration.AttributeComposition;
\r
19 import org.simantics.xml.sax.configuration.IDProvider;
\r
20 import org.simantics.xml.sax.configuration.IDReference;
\r
21 import org.simantics.xml.sax.configuration.UnrecognizedChildElement;
\r
22 import org.w3._2001.xmlschema.Annotated;
\r
23 import org.w3._2001.xmlschema.Attribute;
\r
24 import org.w3._2001.xmlschema.AttributeGroup;
\r
25 import org.w3._2001.xmlschema.ComplexType;
\r
26 import org.w3._2001.xmlschema.Element;
\r
27 import org.w3._2001.xmlschema.LocalComplexType;
\r
28 import org.w3._2001.xmlschema.LocalSimpleType;
\r
29 import org.w3._2001.xmlschema.NamedAttributeGroup;
\r
30 import org.w3._2001.xmlschema.NamedGroup;
\r
31 import org.w3._2001.xmlschema.Restriction;
\r
32 import org.w3._2001.xmlschema.SimpleType;
\r
34 public class ImporterGenerator extends JavaGenerator{
\r
36 public ImporterGenerator(SchemaConverter converter, SchemaConversionBase base) {
\r
37 super(converter, base);
\r
40 public void createParser() throws IOException {
\r
42 String parserPackagePostfix = "_elem";
\r
43 String importerClassPostfix = "Importer";
\r
44 String parserClassPostfix = "Parser";
\r
45 elementPackageName = name+parserPackagePostfix;
\r
47 importParserDir= new File(converter.getParserDir().getAbsolutePath()+"/"+elementPackageName);
\r
48 if (!importParserDir.exists())
\r
49 importParserDir.mkdirs();
\r
52 // Create Importer class
\r
53 File importerFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+importerClassPostfix+".java");
\r
54 PrintWriter mainWriter = createFile(importerFile);
\r
55 mainWriter.println("package " + converter.getPluginName() +";");
\r
56 mainWriter.println();
\r
57 mainWriter.println("import java.io.File;");
\r
58 mainWriter.println("import org.simantics.db.Session;");
\r
59 mainWriter.println("import org.simantics.xml.sax.base.AbstractImporter;");
\r
60 mainWriter.println();
\r
61 mainWriter.println("public class " + name + importerClassPostfix+" extends AbstractImporter {");
\r
62 mainWriter.println();
\r
63 mainWriter.println(" public " + name + importerClassPostfix+"(Session session, File file) {");
\r
64 mainWriter.println(" super(session, file, new "+name + parserClassPostfix+"());");
\r
65 mainWriter.println(" }");
\r
66 mainWriter.println();
\r
67 mainWriter.println("}");
\r
69 mainWriter.println();
\r
73 // Create Parser class
\r
74 File parserFile = new File(converter.getParserDir().getAbsolutePath()+"/"+name+parserClassPostfix+".java");
\r
75 mainWriter = createFile(parserFile);
\r
76 mainWriter.println("package " + converter.getPluginName() +";");
\r
77 mainWriter.println();
\r
78 mainWriter.println("import org.simantics.xml.sax.base.XMLParser;");
\r
79 mainWriter.println();
\r
80 mainWriter.println("public class " + name + parserClassPostfix+" extends XMLParser {");
\r
81 mainWriter.println();
\r
82 mainWriter.println(" public " + name + parserClassPostfix+"() {");
\r
83 if (schema.getTargetNamespace() != null)
\r
84 mainWriter.println(" setSchemaURI(\""+schema.getTargetNamespace()+"\");");
\r
85 for (String s : ruleClassNames) {
\r
86 mainWriter.println(" add(new "+s+"());");
\r
88 mainWriter.println(" }");
\r
89 mainWriter.println("}");
\r
91 mainWriter.println();
\r
97 public void handleSimpleType(SchemaObject parent, SchemaObject simpleTypeObj) {
\r
101 public void handle(SchemaObject parent, NamedGroup attribute) {
\r
102 // TODO Auto-generated method stub
\r
106 public void handleComplexType(SchemaObject complexTypeObj) {
\r
107 ComplexType topLevelComplexType = complexTypeObj.getComplexType();
\r
109 String name = getName(complexTypeObj);
\r
111 //if (topLevelComplexType.getName().equals("LocalizedText"))
\r
112 //if (topLevelComplexType.getName().equals("Reference"))
\r
113 // if (topLevelComplexType.getName().equals("NodeIdAlias"))
\r
114 // System.out.println();
\r
116 String className = name;//"_"+name;
\r
118 FileWriter fw = new FileWriter();
\r
120 fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));
\r
121 } catch (IOException e) {
\r
122 throw new RuntimeException(e);
\r
124 writers.put(complexTypeObj, fw);
\r
126 Inheritance inheritance = this.base.getInheritance(complexTypeObj);
\r
128 provider = this.base.getIDProvider(topLevelComplexType);
\r
129 List<IDReference> references = this.base.getIDReferences(topLevelComplexType);
\r
130 UnrecognizedChildElement unknownChildElement = this.base.getUnknown(topLevelComplexType);
\r
132 List<String> intrerfaces = new ArrayList<String>();
\r
133 if (references.size() > 0)
\r
134 intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser");
\r
135 if (unknownChildElement != null)
\r
136 intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser");
\r
138 createClassHeader(fw.writer, false);
\r
139 writeClass(fw.writer,false, null, className, inheritance.baseClass, intrerfaces);
\r
141 writeIDProvider(fw.writer);
\r
143 fw.writer.println(" @Override");
\r
144 fw.writer.println(" public Resource create(WriteGraph graph, ParserElement element) throws DatabaseException{");
\r
145 fw.writer.println(" Layer0 L0 = Layer0.getInstance(graph);");
\r
146 fw.writer.println(" "+getOntologyImport());
\r
147 fw.writer.println(" Resource res = graph.newResource();");
\r
148 fw.writer.println(" graph.claim(res, L0.InstanceOf, "+ontShort+name+");");
\r
149 fw.writer.println(" return res;");
\r
150 fw.writer.println(" }");
\r
151 fw.writer.println();
\r
153 fw.writer.println(" @Override");
\r
154 fw.writer.println(" public boolean connectParent(WriteGraph graph, ParserElement parent, ParserElement element) throws DatabaseException{");
\r
155 fw.writer.println(" "+getOntologyImport());
\r
156 fw.writer.println(" graph.claim(parent.getData(), "+this.ontShort+getName(complexTypeObj,"has")+", element.getData());");
\r
157 fw.writer.println(" return true;");
\r
158 fw.writer.println(" }");
\r
159 fw.writer.println();
\r
161 StringWriter stringWriter = new StringWriter();
\r
162 fw.delayedWriter = new PrintWriter(stringWriter);
\r
163 StringWriter stringWriter2 = new StringWriter();
\r
164 fw.delayedWriter2 = new PrintWriter(stringWriter2);
\r
166 fw.writer.println(" public " + className + "() {");
\r
167 fw.writer.println(" super();");
\r
169 this.base.handleComplexTypeExtension(complexTypeObj);
\r
171 fw.writer.println(" }");
\r
173 fw.writer.println(" @Override");
\r
174 fw.writer.println(" public boolean connectChild(WriteGraph graph, ParserElement element, ParserElement child) throws DatabaseException{");
\r
175 fw.writer.println(" "+getOntologyImport());
\r
177 if (stringWriter.getBuffer().length() > 0) {
\r
178 fw.writer.write(stringWriter.toString());
\r
180 if (inheritance.type == InheritanceType.ComplexType) {
\r
181 fw.writer.println(" return super.connectChild(graph,element,child);");
\r
183 fw.writer.println(" return false;");
\r
185 fw.writer.println(" }");
\r
186 fw.writer.println();
\r
188 if (stringWriter2.getBuffer().length() > 0) {
\r
189 fw.writer.write(stringWriter2.toString());
\r
192 stringWriter = null;
\r
193 fw.delayedWriter.close();
\r
194 fw.delayedWriter=null;
\r
195 stringWriter2 = null;
\r
196 fw.delayedWriter2.close();
\r
197 fw.delayedWriter2 = null;
\r
199 fw.writer.println(" @Override");
\r
200 fw.writer.println(" public void configure(WriteGraph graph, Deque<ParserElement> parents, ParserElement element) throws DatabaseException {");
\r
201 if (inheritance.type == InheritanceType.ComplexType) {
\r
202 fw.writer.println(" super.configure(graph,parents,element);");
\r
204 fw.writer.println(" "+getOntologyImport());
\r
206 this.base.handleComplexTypeAttributes(complexTypeObj);
\r
207 this.base.handleExtensionAttributes(complexTypeObj);
\r
209 fw.writer.println(" }");
\r
211 if (inheritance.type == InheritanceType.AtomicType) {
\r
212 fw.writer.println();
\r
213 fw.writer.println(" @Override");
\r
214 fw.writer.println(" public void configure(WriteGraph graph, ParserElement element, java.lang.String string) throws DatabaseException {");
\r
215 fw.writer.println(" graph.claimValue(element.getData(), "+getValueGetter(inheritance.atomicType,"string")+", "+inheritance.atomicType.binding+");");
\r
216 fw.writer.println(" }");
\r
219 writeIDReferences(fw.writer,name, references);
\r
220 writeUnknownChild(fw.writer,name,unknownChildElement);
\r
222 fw.writer.println("}");
\r
223 fw.writer.println();
\r
227 writers.remove(complexTypeObj);
\r
232 public void createReferenceIndicator(SchemaObject parent, RefType referenceType, String refName, String objectName, String primaryClassName, String secondaryClassName, boolean useElementList, boolean useOriginalList) {
\r
233 FileWriter fw = getWriter(parent);
\r
234 if (referenceType == RefType.Type) {
\r
235 // create internal class for handling the element and child attachment
\r
236 secondaryClassName = getName(parent) +"_" +objectName;
\r
237 fw.writer.println(" addParser(\""+ objectName +"\", "+secondaryClassName+".class);");
\r
238 fw.delayedWriter2.println(" public static class " + secondaryClassName +" extends " + primaryClassName +"{");
\r
239 fw.delayedWriter2.println(" public "+ secondaryClassName +"(){");
\r
240 fw.delayedWriter2.println(" }");
\r
241 fw.delayedWriter2.println(" }");
\r
242 } else { // referenceType == RefType.Reference
\r
243 fw.writer.println(" addParser("+primaryClassName+".class);");
\r
244 if (!primaryClassName.equals(secondaryClassName))
\r
245 fw.writer.println(" addParser("+secondaryClassName+".class);");
\r
248 fw.delayedWriter.println(" if (child.getElementParser() instanceof "+secondaryClassName+"){");
\r
249 fw.delayedWriter.println(" graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+refName + ", child.getData());");
\r
250 if (useElementList) {
\r
252 // element type specific list
\r
253 fw.delayedWriter.println(" {");
\r
254 fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "List);");
\r
255 fw.delayedWriter.println(" if (list == null) {");
\r
256 fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
\r
257 fw.delayedWriter.println(" graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "List,list);");
\r
258 fw.delayedWriter.println(" } else {");
\r
259 fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
\r
260 fw.delayedWriter.println(" }");
\r
261 fw.delayedWriter.println(" }");
\r
263 if (useOriginalList) {
\r
265 fw.delayedWriter.println(" {");
\r
266 fw.delayedWriter.println(" XMLResource XML = XMLResource.getInstance(graph);");
\r
267 fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");
\r
268 fw.delayedWriter.println(" if (list == null) {");
\r
269 fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
\r
270 fw.delayedWriter.println(" graph.claim(element.getData(), XML.hasOriginalElementList,list);");
\r
271 fw.delayedWriter.println(" } else {");
\r
272 fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
\r
273 fw.delayedWriter.println(" }");
\r
274 fw.delayedWriter.println(" }");
\r
277 fw.delayedWriter.println(" return true;");
\r
278 fw.delayedWriter.println(" }");
\r
282 protected void createPrimitiveIndicator(SchemaObject parent, String refName, String binding) {
\r
283 FileWriter fw = getWriter(parent);
\r
284 fw.writer.println(" addParser(\""+ refName +"\", "+getName(parent) +"_" +refName+".class);");
\r
286 fw.delayedWriter2.println(" public static class " + getName(parent) +"_" +refName+" extends org.simantics.xml.sax.base.ValueElementParser {");
\r
287 fw.delayedWriter2.println(" public "+ getName(parent) +"_" +refName +"(){");
\r
288 fw.delayedWriter2.println(" super(\""+refName+"\"," +this.ontologyClassName+".URIs."+getName(parent) + "_has"+refName+", "+binding+");");
\r
289 fw.delayedWriter2.println(" }");
\r
290 fw.delayedWriter2.println(" }");
\r
294 protected void createElementIndicator(SchemaObject parent, boolean useElementList, String refName, String className, boolean useOriginalList) {
\r
295 FileWriter fw = getWriter(parent);
\r
297 fw.writer.println(" addParser(\""+ refName +"\", "+className+".class);");
\r
299 // fw.writer.println(" addParser("+className+".class);");
\r
301 fw.delayedWriter.println(" if (child.getElementParser() instanceof "+className+"){");
\r
302 fw.delayedWriter.println(" graph.claim(element.getData(), "+ontShort+getName(parent)+"_has"+refName + ", child.getData());");
\r
303 if (useElementList) {
\r
305 // element type specific list
\r
306 fw.delayedWriter.println(" {");
\r
307 fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "List);");
\r
308 fw.delayedWriter.println(" if (list == null) {");
\r
309 fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
\r
310 fw.delayedWriter.println(" graph.claim(element.getData(),"+ontShort+getName(parent)+"_has"+refName + "List,list);");
\r
311 fw.delayedWriter.println(" } else {");
\r
312 fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
\r
313 fw.delayedWriter.println(" }");
\r
314 fw.delayedWriter.println(" }");
\r
316 if (useOriginalList) {
\r
318 fw.delayedWriter.println(" {");
\r
319 fw.delayedWriter.println(" XMLResource XML = XMLResource.getInstance(graph);");
\r
320 fw.delayedWriter.println(" Resource list = graph.getPossibleObject(element.getData(), XML.hasOriginalElementList);");
\r
321 fw.delayedWriter.println(" if (list == null) {");
\r
322 fw.delayedWriter.println(" list = org.simantics.db.common.utils.ListUtils.create(graph, java.util.Collections.singletonList(child.getData()));");
\r
323 fw.delayedWriter.println(" graph.claim(element.getData(), XML.hasOriginalElementList,list);");
\r
324 fw.delayedWriter.println(" } else {");
\r
325 fw.delayedWriter.println(" org.simantics.db.common.utils.ListUtils.insertBack(graph, list, java.util.Collections.singletonList(child.getData()));");
\r
326 fw.delayedWriter.println(" }");
\r
327 fw.delayedWriter.println(" }");
\r
330 fw.delayedWriter.println(" return true;");
\r
331 fw.delayedWriter.println(" }");
\r
335 public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) {
\r
336 // generates overriding method that allows parsing any element
\r
337 FileWriter fw = getWriter(parent);
\r
338 fw.delayedWriter2.println(" @Override");
\r
339 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) {");
\r
340 fw.delayedWriter2.println(" Class<? extends org.simantics.xml.sax.base.XMLElementParser> parserClass = super.getParser(parsers, element, child);");
\r
341 fw.delayedWriter2.println(" if (parserClass != null) return parserClass;");
\r
342 fw.delayedWriter2.println(" org.simantics.xml.sax.base.XMLElementParser parser = parsers.get(child.getQName());");
\r
343 fw.delayedWriter2.println(" if (parser != null) return parser.getClass();");
\r
344 fw.delayedWriter2.println(" return null;");
\r
345 fw.delayedWriter2.println(" }");
\r
349 public void handle(SchemaObject parent, Attribute attribute) {
\r
350 if (parent == null)
\r
352 String name = attribute.getName();
\r
353 QName primitiveType = attribute.getType();
\r
354 SimpleType simpleType = attribute.getSimpleType();
\r
355 QName ref = attribute.getRef();
\r
357 String relationName;
\r
359 if (name != null) {
\r
361 relationName = ontShort+"has"+name;
\r
362 if (parent != null)
\r
363 relationName = ontShort+getName(parent)+"_has"+name;
\r
365 else if (ref != null && parent != null) {
\r
366 attrName = ref.getLocalPart();
\r
367 relationName = ontShort+getName(parent)+"_has"+ref.getLocalPart();
\r
369 Attribute referred = this.base.getRefAttribute(ref);
\r
370 if (referred != null) {
\r
371 primitiveType = referred.getType();
\r
372 simpleType = referred.getSimpleType();
\r
376 throw new RuntimeException();
\r
378 boolean isReference = false;
\r
379 if (provider!= null && provider.getAttribute().getName().equals(attrName))
\r
380 isReference = true;
\r
382 FileWriter fw = getWriter(parent);
\r
383 if (primitiveType != null) {
\r
385 //String binding = getBindingFromPrimitiveType(primitiveType);
\r
386 TypeEntry binding = this.base.getTypeEntry(primitiveType);
\r
388 if (binding != null) {
\r
389 writeAttribute(fw, attrName, relationName, binding, isReference);
\r
392 if (simpleType == null) {
\r
393 SchemaObject simpleTypeObj = this.base.getSimpleType(primitiveType);//this.base.simpleTypeName.get(primitiveType.getLocalPart());
\r
394 if (simpleTypeObj != null)
\r
395 simpleType = simpleTypeObj.getSimpleType();
\r
399 if (simpleType != null) {
\r
400 org.w3._2001.xmlschema.List list = simpleType.getList();
\r
401 if (list != null) {
\r
402 TypeEntry binding = this.base.getTypeEntry(new QName(SchemaConversionBase.SCHEMA_NS, "string"));
\r
403 writeAttribute(fw, attrName, relationName, binding, isReference);
\r
405 Restriction restriction = simpleType.getRestriction();
\r
406 if (restriction == null)
\r
407 throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart()+ ", SimpleType restriction is unset");
\r
408 QName base = restriction.getBase();
\r
411 //String binding = getBindingFromPrimitiveType(base);
\r
412 TypeEntry binding = this.base.getTypeEntry(base);
\r
413 writeAttribute(fw, attrName, relationName, binding, isReference);
\r
416 // TODO : using default String attribute should be configured with rules.
\r
417 //throw new RuntimeException("Cannot resolve type for Attribute " + attrName + " -> " + primitiveType.getLocalPart());
\r
418 fw.writer.println(" //FIXME: Cannot resolve type for Attribute " + attrName + " Using default type String");
\r
419 //writeAttribute(fw, attrName, relationName, "STRING", isReference);
\r
420 writeAttribute(fw, attrName, relationName, this.base.getTypeEntry("string"), isReference);
\r
424 private void writeAttribute(FileWriter fw, String attrName, String relationName, TypeEntry binding, boolean isReference) {
\r
425 fw.writer.println(" {");
\r
426 fw.writer.println(" Attribute a = element.getAttribute(\"" +attrName+"\");");
\r
427 fw.writer.println(" if (a != null) {");
\r
428 fw.writer.println(" graph.claimLiteral(element.getData(),"+relationName+","+getValueGetterMethod(binding,"a")+", "+binding.binding+");");
\r
430 fw.writer.println(" idProviderValue = a.getValue();");
\r
431 fw.writer.println(" }");
\r
432 fw.writer.println(" }");
\r
436 public void handleAttributes(SchemaObject simpleTypeObj) {
\r
437 SchemaObject parent = simpleTypeObj.getParent();
\r
438 FileWriter fw = getWriter(parent);
\r
440 SimpleType simpleType = simpleTypeObj.getSimpleType();
\r
441 Restriction restriction = simpleType.getRestriction();
\r
442 if (restriction == null)
\r
443 throw new RuntimeException("Cannot resolve type for Element " + getName(parent));
\r
444 QName base = restriction.getBase();
\r
447 //String binding = getBindingFromPrimitiveType(base);
\r
448 TypeEntry binding = this.base.getTypeEntry(base);
\r
449 fw.writer.println(" @Override");
\r
450 fw.writer.println(" public void configure(WriteGraph graph, ParserElement element, java.lang.String value) throws DatabaseException {");
\r
451 //fw.writer.println(" graph.claimValue(element.getData(),"+getValueGetter(binding)+", Bindings."+binding+");");
\r
452 fw.writer.println(" graph.claimValue(element.getData(),"+getValueGetter(binding)+", "+binding.binding +");");
\r
453 fw.writer.println(" }");
\r
458 public void handle(SchemaObject parent, AttributeGroup attribute) {
\r
459 if (parent != null) {
\r
460 FileWriter fw = getWriter(parent);
\r
461 NamedAttributeGroup group = this.base.getAttributeGroup(attribute.getRef());
\r
462 fw.writer.println(commentTag+" AttributeGroup " + group.getName());
\r
463 SchemaObject obj = new SchemaObject(parent,attribute);
\r
464 for (Annotated annotated : group.getAttributeOrAttributeGroup()) {
\r
465 if (annotated instanceof Attribute) {
\r
466 //handle("AttributeGroups_"+group.getName(),(Attribute)annotated);
\r
467 handle(obj,(Attribute)annotated);
\r
468 } else if (annotated instanceof AttributeGroup) {
\r
469 //handle("AttributeGroups_"+group.getName(),(AttributeGroup)annotated);
\r
470 handle(obj,(AttributeGroup)annotated);
\r
475 System.out.println();
\r
476 fw.writer.println(commentTag+" End of AttributeGroup " + group.getName());
\r
482 public void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes) {
\r
483 FileWriter fw = getWriter(parent);
\r
484 QName type = new QName(SchemaConversionBase.CONVERSION_NS, composition.getType());
\r
485 String arrayBinding = this.base.getBindingFromPrimitiveType(type);
\r
486 String javaType = this.base.getJavaTypeFromPrimitiveType(type);
\r
487 String name = composition.getName();
\r
489 String relationName;
\r
490 if (name != null) {
\r
491 relationName = ontShort+"has"+name;
\r
492 if (parent != null)
\r
493 relationName = ontShort+getName(parent)+"_has"+name;
\r
495 throw new RuntimeException();
\r
498 fw.writer.println(" {");
\r
500 for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute())
\r
501 fw.writer.println(" Attribute a"+(i++)+" = element.getAttribute(\"" +a.getName()+"\");");
\r
502 fw.writer.print (" "+javaType + " value = new "+javaType+"{");
\r
504 // FIXME : handle optional attributes properly.
\r
505 for (org.simantics.xml.sax.configuration.Attribute a : composition.getAttribute()) {
\r
506 Attribute attribute = ((Attribute)attributes.getRight(a));
\r
507 //QName atype = getBaseType(attribute);
\r
508 QName atype = this.base.getPrimitiveType(attribute);
\r
509 String defaultValue = attribute.getDefault();
\r
510 if (defaultValue == null)
\r
511 defaultValue = this.base.getDefaultValue(atype);
\r
513 //String binding = getBindingFromPrimitiveType(atype);
\r
514 TypeEntry binding = this.base.getTypeEntry(atype);
\r
516 fw.writer.print(",");
\r
517 if (defaultValue != null)
\r
518 fw.writer.print("a"+(i)+"!= null ? "+ getValueGetterMethod(binding,"a"+(i++)) + " : " +defaultValue);
\r
520 fw.writer.print(getValueGetterMethod(binding,"a"+(i++)));
\r
522 fw.writer.println("};");
\r
523 fw.writer.println(" graph.claimLiteral(element.getData(),"+relationName+", value, "+arrayBinding+");");
\r
524 fw.writer.println(" }");
\r
534 IDProvider provider;
\r
536 public void handleElement(SchemaObject elementObj) {
\r
537 Element element = elementObj.getElement();
\r
539 String name = getName(elementObj);//topLevelElement.getName();
\r
540 String className = name;
\r
542 FileWriter fw = new FileWriter();
\r
544 fw.writer = createFile(new File(importParserDir.getAbsolutePath()+"/"+className+".java"));
\r
545 } catch (IOException e) {
\r
546 throw new RuntimeException(e);
\r
548 writers.put(elementObj, fw);
\r
549 boolean isList = false;
\r
551 Inheritance inheritance = this.base.getInheritance(elementObj);
\r
553 provider = this.base.getIDProvider(element);
\r
554 List<IDReference> references = this.base.getIDReferences(element);
\r
555 UnrecognizedChildElement unknownChildElement = this.base.getUnknown(element);
\r
557 List<String> intrerfaces = new ArrayList<String>();
\r
558 if (references.size() > 0)
\r
559 intrerfaces.add("org.simantics.xml.sax.base.IDReferenceParser");
\r
560 if (unknownChildElement != null)
\r
561 intrerfaces.add("org.simantics.xml.sax.base.UnrecognizedElementParser");
\r
563 createClassHeader(fw.writer, isList);
\r
564 writeClass(fw.writer,false, element.getName(), className, inheritance.baseClass, intrerfaces);
\r
565 writeIDProvider(fw.writer);
\r
566 fw.writer.println(" @Override");
\r
567 fw.writer.println(" public Resource create(WriteGraph graph, ParserElement element) throws DatabaseException{");
\r
568 fw.writer.println(" Layer0 L0 = Layer0.getInstance(graph);");
\r
569 fw.writer.println(" "+getOntologyImport());
\r
571 fw.writer.println(" Resource res = graph.newResource();");
\r
572 fw.writer.println(" graph.claim(res, L0.InstanceOf, "+ontShort+name+");");
\r
574 fw.writer.println(" Resource res = ListUtils.create(graph, "+ontShort+name+", Collections.EMPTY_LIST);");
\r
576 fw.writer.println(" return res;");
\r
577 fw.writer.println(" }");
\r
578 fw.writer.println();
\r
580 fw.writer.println(" @Override");
\r
581 fw.writer.println(" public boolean connectParent(WriteGraph graph, ParserElement parent, ParserElement element) throws DatabaseException{");
\r
582 fw.writer.println(" "+getOntologyImport());
\r
583 fw.writer.println(" graph.claim(parent.getData(), "+this.ontShort+getName(elementObj,"has")+", element.getData());");
\r
584 fw.writer.println(" return true;");
\r
585 fw.writer.println(" }");
\r
586 fw.writer.println();
\r
588 fw.writer.println(" @Override");
\r
589 fw.writer.println(" public void configure(WriteGraph graph, Deque<ParserElement> parents, ParserElement element) throws DatabaseException {");
\r
590 if (inheritance.type == InheritanceType.ComplexType) {
\r
591 fw.writer.println(" super.configure(graph,parents,element);");
\r
593 fw.writer.println(" "+getOntologyImport());
\r
595 LocalComplexType complexType = element.getComplexType();
\r
596 LocalSimpleType simpleType = element.getSimpleType();
\r
598 if (complexType != null) {
\r
599 SchemaObject obj = this.base.getComplexType(complexType);
\r
600 this.base.handleElementComplexTypeAttributes(obj);
\r
602 fw.writer.println(" }");
\r
604 if (inheritance.type == InheritanceType.AtomicType) {
\r
605 fw.writer.println();
\r
606 fw.writer.println(" @Override");
\r
607 fw.writer.println(" public void configure(WriteGraph graph, ParserElement element, java.lang.String string) throws DatabaseException {");
\r
608 fw.writer.println(" graph.claimValue(element.getData(), "+getValueGetter(inheritance.atomicType,"string")+", "+inheritance.atomicType.binding+");");
\r
609 fw.writer.println(" }");
\r
611 // if (simpleType != null) {
\r
612 // SchemaObject obj = simpleTypes.get(simpleType);
\r
613 // handleElementSimpleTypeAttributes(obj);
\r
617 StringWriter stringWriter = new StringWriter();
\r
618 fw.delayedWriter = new PrintWriter(stringWriter);
\r
619 StringWriter stringWriter2 = new StringWriter();
\r
620 fw.delayedWriter2 = new PrintWriter(stringWriter2);
\r
622 fw.writer.println(" public " + className + "() {");
\r
623 fw.writer.println(" super();");
\r
625 if (complexType != null) {
\r
626 SchemaObject obj = this.base.getComplexType(complexType);
\r
627 this.base.handleComplexTypeExtension(obj);
\r
628 } else if (simpleType != null) {
\r
632 fw.writer.println(" }");
\r
634 fw.writer.println(" @Override");
\r
635 fw.writer.println(" public boolean connectChild(WriteGraph graph, ParserElement element, ParserElement child) throws DatabaseException{");
\r
636 fw.writer.println(" "+getOntologyImport());
\r
638 if (stringWriter.getBuffer().length() > 0) {
\r
639 fw.writer.write(stringWriter.toString());
\r
641 if (inheritance.type == InheritanceType.ComplexType) {
\r
642 fw.writer.println(" return super.connectChild(graph,element,child);");
\r
644 fw.writer.println(" return false;");
\r
646 fw.writer.println(" }");
\r
647 fw.writer.println();
\r
649 if (stringWriter2.getBuffer().length() > 0) {
\r
650 fw.writer.write(stringWriter2.toString());
\r
653 stringWriter = null;
\r
654 fw.delayedWriter.close();
\r
655 fw.delayedWriter = null;
\r
656 stringWriter2 = null;
\r
657 fw.delayedWriter2.close();
\r
658 fw.delayedWriter2 = null;
\r
660 writeIDReferences(fw.writer,name, references);
\r
661 writeUnknownChild(fw.writer,name,unknownChildElement);
\r
663 fw.writer.println("}");
\r
664 fw.writer.println();
\r
668 writers.remove(elementObj);
\r
671 ruleClassNames.add(converter.getPluginName()+"."+elementPackageName+"."+name);
\r
675 private void writeIDProvider(PrintWriter writer) {
\r
676 if (provider != null) {
\r
677 writer.println(" java.lang.String idProviderValue = null;");
\r
679 writer.println(" @Override");
\r
680 writer.println(" public java.lang.String getID() {");
\r
681 writer.println(" java.lang.String s = idProviderValue;");
\r
682 writer.println(" idProviderValue = null;");
\r
683 writer.println(" return s;");
\r
684 writer.println(" }");
\r
686 if (provider.getPriority() != null) {
\r
687 writer.println(" @Override");
\r
688 writer.println(" public int idPriority() {");
\r
689 writer.println(" return " + provider.getPriority().intValue()+";");
\r
690 writer.println(" }");
\r
695 private void writeIDReferences(PrintWriter writer,String name, List<IDReference> references) {
\r
696 if (references.size() > 0) {
\r
697 writer.println(" @Override");
\r
698 writer.println(" public boolean connectReferences(WriteGraph graph, ParserElement element, java.util.Map<java.lang.String, ParserElement> map) throws DatabaseException {");
\r
699 writer.println(" "+getOntologyImport());
\r
700 writer.println(" boolean result = true;");
\r
701 for (IDReference ref : references) {
\r
702 writer.println(" {");
\r
703 writer.println(" Attribute a = element.getAttribute(\"" + ref.getIDSource().getName() +"\");");
\r
704 writer.println(" if (a != null) {");
\r
705 writer.println(" ParserElement refEle = map.get(a.value);");
\r
706 writer.println(" if (refEle != null) {");
\r
707 writer.println(" Resource ref = refEle.getData();");
\r
708 writer.println(" graph.claim(element.getData(), "+ontShort+name+"_"+ref.getReference().getName()+", ref);");
\r
709 writer.println(" } else {");
\r
710 writer.println(" result = false;");
\r
711 writer.println(" }");
\r
712 writer.println(" }");
\r
713 writer.println(" }");
\r
715 writer.println(" return result;");
\r
716 writer.println(" }");
\r
721 private void writeUnknownChild(PrintWriter writer,String name, UnrecognizedChildElement unknownChildElement) {
\r
722 if (unknownChildElement == null)
\r
725 writer.println(" @Override");
\r
726 writer.println(" public void configureChild(WriteGraph graph, Deque<ParserElement> parents, ParserElement element, ParserElement child) throws DatabaseException {");
\r
727 writer.println(" " + unknownChildElement.getJavaMethod());
\r
728 writer.println(" }");
\r
734 public String getBaseClass(ObjectType type) {
\r
735 return "org.simantics.xml.sax.base.XMLElementNamedChildParserBase";
\r
738 protected void createClassHeader(PrintWriter writer, boolean isList) {
\r
739 writer.println("package " + converter.getPluginName() +"."+elementPackageName+";");
\r
741 writer.println("import java.util.Deque;");
\r
742 writer.println("import org.simantics.databoard.Bindings;");
\r
743 writer.println("import org.simantics.db.Resource;");
\r
744 writer.println("import org.simantics.db.WriteGraph;");
\r
745 writer.println("import org.simantics.db.exception.DatabaseException;");
\r
746 writer.println("import org.simantics.xml.sax.base.Attribute;");
\r
747 writer.println("import org.simantics.xml.sax.base.ParserElement;");
\r
748 writer.println("import org.simantics.xml.sax.ontology.XMLResource;");
\r
750 writer.println("import org.simantics.layer0.Layer0;");
\r
752 writer.println("import java.util.Collections;");
\r
753 writer.println("import org.simantics.db.common.utils.ListUtils;");
\r