-package org.simantics.xml.sax;\r
-\r
-import java.io.File;\r
-import java.io.IOException;\r
-import java.io.PrintWriter;\r
-import java.util.ArrayList;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import javax.xml.namespace.QName;\r
-\r
-import org.simantics.xml.sax.SchemaConversionBase.RefType;\r
-import org.simantics.xml.sax.SchemaConversionBase.TypeEntry;\r
-import org.w3._2001.xmlschema.AttributeGroupRef;\r
-import org.w3._2001.xmlschema.Element;\r
-import org.w3._2001.xmlschema.Schema;\r
-\r
-//public abstract class JavaGenerator extends SchemaConversionBase{\r
-public abstract class JavaGenerator implements SchemaConversionComponent {\r
-\r
- String commentTag = "//";\r
- \r
- Schema schema;\r
- String ontologyClassName;\r
- String ontologyUri;\r
- SchemaConverter converter;\r
- SchemaConversionBase base;\r
- \r
- List<String> ruleClassNames = new ArrayList<String>();\r
- \r
- String ontShort = "ONT"; \r
- String name;\r
- \r
- File importParserDir;\r
- String elementPackageName;\r
- \r
- Map<SchemaObject, FileWriter> writers = new HashMap<SchemaObject, ImporterGenerator.FileWriter>();\r
- \r
- public JavaGenerator(SchemaConverter converter, SchemaConversionBase base) {\r
- this.converter = converter;\r
- this.base = base;\r
- \r
- this.schema = base.schema;\r
- this.ontologyClassName = base.className;\r
- this.ontologyUri = base.ontologyURI;\r
- this.converter = converter;\r
- this.name = converter.name;\r
- ontShort = converter.shortName;\r
- ontShort +=".";\r
- }\r
- \r
- \r
- protected PrintWriter createFile(File file) throws IOException {\r
- if (!file.exists())\r
- file.createNewFile();\r
- PrintWriter writer = new PrintWriter(file);\r
- for (String s : converter.getHeader()) {\r
- writer.println(commentTag + " " + s); \r
- }\r
- writer.println();\r
- return writer;\r
- }\r
- \r
- protected String getValueGetterMethod(TypeEntry binding,String name) {\r
- if (binding == null)\r
- return name+".getValue()";\r
- return binding.getValueGetterMethod(name);\r
- }\r
- \r
- protected String getValueGetter(TypeEntry binding,String name) {\r
- if (binding == null)\r
- return name;\r
- return binding.getValueGetter(name);\r
- }\r
- \r
- protected String getValueGetter(TypeEntry binding) {\r
- if (binding == null)\r
- return "value";\r
- return binding.getValueGetter();\r
- }\r
- \r
- @Override\r
- public String getComplexTypePrefix() {\r
- return "ComplexTypes_";\r
- } \r
- \r
- @Override\r
- public String getAttributeGroupPrefix() {\r
- return "AttributeGroups_";\r
- }\r
- \r
- @Override\r
- public void handleChoice(SchemaObject parent, SchemaElement indicator, List<SchemaElement> elements, String name) {\r
-\r
- for (SchemaElement e : elements) {\r
- Element localElement = e.getElement();\r
- if (localElement.getName() != null) {\r
- QName refType = localElement.getType();\r
- if (refType != null)\r
- //handleIndicator(parent, indicator, e, false, name, refType);\r
- handleIndicator(parent, indicator, e, name, RefType.Type);\r
- } else if (localElement.getRef() != null) {\r
- //QName refType = localElement.getRef();\r
- //handleIndicator(parent, indicator, e, true, name, refType);\r
- handleIndicator(parent, indicator, e, name, RefType.Reference);\r
- }\r
- }\r
- \r
- }\r
- \r
- protected String getOntologyImport() {\r
- return this.ontologyClassName+" " +ontShort.substring(0, 3)+" = "+this.ontologyClassName+".getInstance(graph);";\r
- }\r
- \r
- protected static class FileWriter {\r
- public PrintWriter writer;\r
- \r
- public PrintWriter delayedWriter;\r
- public PrintWriter delayedWriter2;\r
- }\r
- \r
- protected FileWriter getWriter(SchemaObject obj) {\r
- SchemaObject s = obj;\r
- while (s != null) {\r
- FileWriter fw = writers.get(s);\r
- if (fw != null)\r
- return fw;\r
- s = s.getParent();\r
- }\r
- return null;\r
- }\r
- \r
- @Override\r
- public String getName(SchemaObject obj) {\r
- if (obj.getParent() == null) {\r
- switch (obj.getType()) {\r
- case COMPLEX_TYPE:\r
- return getComplexTypePrefix()+obj.getName();\r
- case ELEMENT:\r
- return obj.getName();\r
- case ATTRIBUTE_GROUP:\r
- return getAttributeGroupPrefix()+obj.getName();\r
- case SIMPLE_TYPE:\r
- return obj.getName();\r
- }\r
- } else {\r
- SchemaObject o = obj;\r
- SchemaObject prev = null;\r
- String name = "";\r
- while (o != null){\r
- if (o.getName() != null)\r
- name = o.getName()+"_"+name;\r
- prev = o;\r
- o = o.getParent();\r
- if (prev.getObj() instanceof AttributeGroupRef)\r
- o = null;\r
- }\r
- name = name.substring(0, name.length()-1);\r
- switch (prev.getType()) {\r
- case COMPLEX_TYPE:\r
- return getComplexTypePrefix()+name;\r
- case ELEMENT:\r
- return name;\r
- case ATTRIBUTE_GROUP:\r
- return getAttributeGroupPrefix()+name;\r
- case SIMPLE_TYPE:\r
- return name;\r
- }\r
- }\r
- throw new RuntimeException();\r
- \r
- }\r
- \r
- public String getName(SchemaObject obj, String rel) {\r
- if (obj.getParent() == null) {\r
- switch (obj.getType()) {\r
- case COMPLEX_TYPE:\r
- return getComplexTypePrefix()+rel+obj.getName();\r
- case ELEMENT:\r
- return rel+obj.getName();\r
- case ATTRIBUTE_GROUP:\r
- return getAttributeGroupPrefix()+rel+obj.getName();\r
- case SIMPLE_TYPE:\r
- return rel+obj.getName();\r
- }\r
- } else {\r
- SchemaObject o = obj;\r
- SchemaObject prev = null;\r
- String name = "";\r
- while (o != null){\r
- if (o.getName() != null)\r
- name = o.getName()+"_"+name;\r
- prev = o;\r
- o = o.getParent();\r
- }\r
- name = name.substring(0, name.length()-1);\r
- switch (prev.getType()) {\r
- case COMPLEX_TYPE:\r
- return getComplexTypePrefix()+rel+name;\r
- case ELEMENT:\r
- return rel+name;\r
- case ATTRIBUTE_GROUP:\r
- return getAttributeGroupPrefix()+rel+name;\r
- case SIMPLE_TYPE:\r
- return rel+name;\r
- }\r
- }\r
- throw new RuntimeException();\r
- }\r
- \r
- \r
- \r
- protected void writeClass(PrintWriter writer,boolean abst, String elementId, String className, String baseClass, List<String> interfaces) {\r
- writer.println("@SuppressWarnings(\"unused\")");\r
- writer.print("public " +(abst ? "abstract " : "") + "class " + className + " extends "+baseClass);\r
- if (interfaces.size() > 0) {\r
- writer.print(" implements ");\r
- for (int i = 0; i < interfaces.size(); i++) {\r
- writer.print(interfaces.get(i));\r
- if (i < interfaces.size() -1 )\r
- writer.print(",");\r
- }\r
- }\r
- writer.println("{");\r
- writer.println();\r
- writer.println(" @Override");\r
- writer.println(" public java.lang.String getElementId() {");\r
- if (elementId != null)\r
- writer.println(" return \""+elementId+"\";");\r
- else // complex types cannot be parsed directly with name/id reference.\r
- writer.println(" return null;");\r
- writer.println(" }");\r
- writer.println();\r
- }\r
- \r
- \r
- protected abstract void createReferenceIndicator(SchemaObject parent, RefType referenceType, String refName, String objectName, String primaryClassName, String secondaryClassName, boolean useElementList, boolean useOriginalList);\r
- protected abstract void createPrimitiveIndicator(SchemaObject parent, String refName, String binding);\r
- protected abstract void createElementIndicator(SchemaObject parent, boolean useElementList, String refName, String className, boolean useOriginalList);\r
- \r
- @Override\r
- public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, String refName, RefType referenceType) {\r
- String objectName;\r
- if (referenceType != RefType.Element) {\r
- QName refType;\r
- if (referenceType == RefType.Type) {\r
- refType = element.getElement().getType();\r
- if (refName == null)\r
- refName = element.getElement().getName();\r
- objectName = element.getElement().getName();\r
- } else {\r
- refType = element.getElement().getRef();\r
- if (refName == null)\r
- refName = refType.getLocalPart();\r
- objectName = refType.getLocalPart();\r
- }\r
- \r
- String binding = this.base.getBindingFromPrimitiveType(refType);\r
- if (binding == null) {\r
- SchemaObject refElement = this.base.getElement(refType);\r
- SchemaObject refComplexType = this.base.getComplexType(refType);\r
- \r
- // prefer element reference over complex type reference\r
- String primaryClassName = null;\r
- String secondaryClassName = null;\r
- if (refElement != null)\r
- primaryClassName = getName(refElement);\r
- else\r
- primaryClassName = getName(refComplexType);\r
- \r
- if (refComplexType != null) {\r
- secondaryClassName = getName(refComplexType);\r
- } else {\r
- secondaryClassName = getName(refElement);\r
- }\r
- boolean useElementList = this.base.useElementList(parent, indicator,element, referenceType == RefType.Reference, refName, refType);\r
- boolean useOriginalList = this.base.useOriginalList(parent, indicator,element, referenceType == RefType.Reference, refName, refType);\r
- createReferenceIndicator(parent, referenceType, refName, objectName, primaryClassName, secondaryClassName, useElementList, useOriginalList);\r
- } else {\r
- createPrimitiveIndicator(parent, refName, binding);\r
- }\r
- } else {\r
- Element attrs= element.getElement();\r
- SchemaObject obj = this.base.getWithObj(parent, attrs);\r
- \r
- String className = getName(obj);\r
- if (refName == null)\r
- refName = attrs.getName();\r
- \r
- boolean useElementList = this.base.useElementList(parent, indicator,element, false, refName, new QName(obj.getName()));\r
- boolean useOriginalList = this.base.useOriginalList(parent, indicator,element, false, refName, new QName(obj.getName()));\r
- createElementIndicator(parent, useElementList, refName, className, useOriginalList);\r
- }\r
- }\r
-\r
-}\r
+package org.simantics.xml.sax;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+
+import org.simantics.xml.sax.SchemaConversionBase.Inheritance;
+import org.simantics.xml.sax.SchemaConversionBase.RefType;
+import org.simantics.xml.sax.SchemaConversionBase.TypeEntry;
+import org.w3._2001.xmlschema.AttributeGroupRef;
+import org.w3._2001.xmlschema.Element;
+import org.w3._2001.xmlschema.Schema;
+
+//public abstract class JavaGenerator extends SchemaConversionBase{
+public abstract class JavaGenerator implements SchemaConversionComponent {
+
+ String commentTag = "//";
+
+ Schema schema;
+ String ontologyClassName;
+ String ontologyUri;
+ SchemaConverter converter;
+ SchemaConversionBase base;
+
+ List<String> ruleClassNames = new ArrayList<String>();
+
+ String ontShort = "ONT";
+ String name;
+
+ File importParserDir;
+ String elementPackageName;
+
+ Map<SchemaObject, FileWriter> writers = new HashMap<SchemaObject, ImporterGenerator.FileWriter>();
+
+ public JavaGenerator(SchemaConverter converter, SchemaConversionBase base) {
+ this.converter = converter;
+ this.base = base;
+
+ this.schema = base.schema;
+ this.ontologyClassName = base.className;
+ this.ontologyUri = base.ontologyURI;
+ this.converter = converter;
+ this.name = converter.name;
+ ontShort = converter.shortName;
+ ontShort +=".";
+ elementPackageName = name+getPackagePostFix();
+ }
+
+ public String getElementPackageName() {
+ return elementPackageName;
+ }
+
+
+ protected PrintWriter createFile(File file) throws IOException {
+ if (!file.exists())
+ file.createNewFile();
+ PrintWriter writer = new PrintWriter(file);
+ for (String s : converter.getHeader()) {
+ writer.println(commentTag + " " + s);
+ }
+ writer.println();
+ return writer;
+ }
+
+ protected String getValueGetterMethod(TypeEntry binding,String name) {
+ if (binding == null)
+ return name+".getValue()";
+ return binding.getValueGetterMethod(name);
+ }
+
+ protected String getValueGetter(TypeEntry binding,String name) {
+ if (binding == null)
+ return name;
+ return binding.getValueGetter(name);
+ }
+
+ protected String getValueGetter(TypeEntry binding) {
+ if (binding == null)
+ return "value";
+ return binding.getValueGetter();
+ }
+
+ @Override
+ public String getSimpleTypePrefix() {
+ return "SimpleTypes_";
+ }
+
+ @Override
+ public String getComplexTypePrefix() {
+ return "ComplexTypes_";
+ }
+
+ @Override
+ public String getAttributeGroupPrefix() {
+ return "AttributeGroups_";
+ }
+
+ @Override
+ public String handleChoice(SchemaObject parent, SchemaElement indicator, List<SchemaElement> elements, String name) {
+ String baseRelationName = getName(parent) + ".has" + name;
+
+// for (SchemaElement e : elements) {
+// Element localElement = e.getElement();
+// if (localElement.getName() != null) {
+// QName refType = localElement.getType();
+// if (refType != null)
+// //handleIndicator(parent, indicator, e, false, name, refType);
+// handleIndicator(parent, indicator, e, name, RefType.Type, baseRelationName);
+// } else if (localElement.getRef() != null) {
+// //QName refType = localElement.getRef();
+// //handleIndicator(parent, indicator, e, true, name, refType);
+// handleIndicator(parent, indicator, e, name, RefType.Reference, baseRelationName);
+// }
+// }
+
+ return baseRelationName;
+ }
+
+ protected String getOntologyImport() {
+ return this.ontologyClassName+" " +ontShort.substring(0,ontShort.length()-1)+" = "+this.ontologyClassName+".getInstance(graph);";
+ }
+
+ protected static class FileWriter {
+ public PrintWriter writer;
+
+ public PrintWriter delayedWriter;
+ public PrintWriter delayedWriter2;
+ }
+
+ protected FileWriter getWriter(SchemaObject obj) {
+ SchemaObject s = obj;
+ while (s != null) {
+ FileWriter fw = writers.get(s);
+ if (fw != null)
+ return fw;
+ s = s.getParent();
+ }
+ return null;
+ }
+
+ @Override
+ public String getName(SchemaObject obj) {
+ if (obj.getParent() == null) {
+ switch (obj.getType()) {
+ case COMPLEX_TYPE:
+ return getComplexTypePrefix()+obj.getName();
+ case ELEMENT:
+ return obj.getName();
+ case ATTRIBUTE_GROUP:
+ return getAttributeGroupPrefix()+obj.getName();
+ case SIMPLE_TYPE:
+ return getSimpleTypePrefix()+obj.getName();
+ }
+ } else {
+ SchemaObject o = obj;
+ SchemaObject prev = null;
+ String name = "";
+ while (o != null){
+ if (o.getName() != null)
+ name = o.getName()+"_"+name;
+ prev = o;
+ o = o.getParent();
+ if (prev.getObj() instanceof AttributeGroupRef)
+ o = null;
+ }
+ name = name.substring(0, name.length()-1);
+ switch (prev.getType()) {
+ case COMPLEX_TYPE:
+ return getComplexTypePrefix()+name;
+ case ELEMENT:
+ return name;
+ case ATTRIBUTE_GROUP:
+ return getAttributeGroupPrefix()+name;
+ case SIMPLE_TYPE:
+ return getSimpleTypePrefix()+name;
+ }
+ }
+ throw new RuntimeException();
+ }
+
+ public String getName(SchemaObject obj, String rel) {
+ if (obj.getParent() == null) {
+ switch (obj.getType()) {
+ case COMPLEX_TYPE:
+ return getComplexTypePrefix()+rel+obj.getName();
+ case ELEMENT:
+ return rel+obj.getName();
+ case ATTRIBUTE_GROUP:
+ return getAttributeGroupPrefix()+rel+obj.getName();
+ case SIMPLE_TYPE:
+ return getSimpleTypePrefix()+rel+obj.getName();
+ }
+ } else {
+ SchemaObject o = obj;
+ SchemaObject prev = null;
+ String name = "";
+ while (o != null){
+ if (o.getName() != null)
+ name = o.getName()+"_"+name;
+ prev = o;
+ o = o.getParent();
+ }
+ name = name.substring(0, name.length()-1);
+ switch (prev.getType()) {
+ case COMPLEX_TYPE:
+ return getComplexTypePrefix()+rel+name;
+ case ELEMENT:
+ return rel+name;
+ case ATTRIBUTE_GROUP:
+ return getAttributeGroupPrefix()+rel+name;
+ case SIMPLE_TYPE:
+ return getSimpleTypePrefix()+rel+name;
+ }
+ }
+ throw new RuntimeException();
+ }
+
+
+
+ protected void writeClass(PrintWriter writer,boolean abst, String elementId, String className, String baseClass, List<String> interfaces) {
+ writer.println("@SuppressWarnings(\"unused\")");
+ writer.print("public " +(abst ? "abstract " : "") + "class " + className + " extends "+baseClass);
+ if (interfaces.size() > 0) {
+ writer.print(" implements ");
+ for (int i = 0; i < interfaces.size(); i++) {
+ writer.print(interfaces.get(i));
+ if (i < interfaces.size() -1 )
+ writer.print(",");
+ }
+ }
+ writer.println("{");
+ writer.println();
+ writer.println(" @Override");
+ writer.println(" public java.lang.String getElementId() {");
+ if (elementId != null)
+ writer.println(" return \""+elementId+"\";");
+ else // complex types cannot be parsed directly with name/id reference.
+ writer.println(" return null;");
+ writer.println(" }");
+ writer.println();
+ }
+
+
+ protected abstract void createReferenceIndicator(SchemaObject parent, RefType referenceType, String refName, String objectName, String primaryClassName, String secondaryClassName, boolean useElementList, boolean useOriginalList);
+ protected abstract void createPrimitiveIndicator(SchemaObject parent, String refName, TypeEntry typeEntry, QName typeName);
+ protected abstract void createElementIndicator(SchemaObject parent, boolean useElementList, String refName, String className, boolean useOriginalList);
+
+ protected abstract String getPackagePostFix();
+ @Override
+ public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, String refName, RefType referenceType, String baseRelationName) {
+ String objectName;
+ if (referenceType != RefType.Element) {
+ QName refTypeName;
+ SchemaObject refObject = null;
+ if (referenceType == RefType.Type) {
+ refTypeName = element.getElement().getType();
+ if (refName == null)
+ refName = base.getName(element.getElement());
+ objectName = base.getName(element.getElement());
+ refObject = this.base.getComplexType(refTypeName);
+ if (refObject == null) this.base.getSimpleType(refTypeName);
+ } else {
+ refTypeName = element.getElement().getRef();
+ if (refName == null)
+ refName = base.getName(refTypeName);
+ objectName = refTypeName.getLocalPart();
+ refObject = this.base.getElement(refTypeName);
+ }
+
+ TypeEntry typeEntry = this.base.getTypeEntry(refTypeName);
+ if (typeEntry == null) {
+ // prefer element reference over complex type reference
+ String primaryClassName = null;
+ String secondaryClassName = null;
+ if (refObject != null) {
+ primaryClassName = getName(refObject);
+ if (refObject.getSc() != base) {
+ SchemaConverter con = refObject.getSc().converter;
+ primaryClassName = con.getPluginName() + "." + con.name +getPackagePostFix() + "." + primaryClassName;
+ }
+ }
+ else if (this.base.getSimpleType(refTypeName) != null) {
+ Inheritance inheritance = new Inheritance("");
+ this.base.getAtomicTypeInheritance(refTypeName, inheritance);
+ if (inheritance.atomicType != null) {
+ createPrimitiveIndicator(parent, refName, inheritance.atomicType, refTypeName);
+ return;
+ }
+ else {
+ throw new RuntimeException("No supported atomic type found for simple type " + refTypeName.toString());
+ }
+ }
+ else {
+ throw new RuntimeException("Type that is neither complex nor simple??");
+ }
+
+ secondaryClassName = primaryClassName;
+ boolean useElementList = this.base.useElementList(parent, indicator,element, referenceType == RefType.Reference, refName, refTypeName);
+ boolean useOriginalList = this.base.useOriginalList(parent, indicator,element, referenceType == RefType.Reference, refName, refTypeName);
+ createReferenceIndicator(parent, referenceType, refName, objectName, primaryClassName, secondaryClassName, useElementList, useOriginalList);
+ } else {
+ createPrimitiveIndicator(parent, refName, typeEntry, refTypeName);
+ }
+ } else {
+ Element attrs= element.getElement();
+ SchemaObject obj = this.base.getWithObj(parent, attrs);
+
+ String className = getName(obj);
+ if (refName == null)
+ refName = base.getName(attrs);
+
+ boolean useElementList = this.base.useElementList(parent, indicator,element, false, refName, new QName(obj.getName()));
+ boolean useOriginalList = this.base.useOriginalList(parent, indicator,element, false, refName, new QName(obj.getName()));
+ createElementIndicator(parent, useElementList, refName, className, useOriginalList);
+ }
+ }
+
+}