\r
import javax.xml.namespace.QName;\r
\r
-import org.simantics.xml.sax.configuration.Configuration;\r
+import org.simantics.xml.sax.SchemaConversionBase.Inheritance;\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 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(Configuration configuration) {\r
- super(configuration);\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
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
- public static String getComplexTypePrefix() {\r
- return "ComplexTypes_";\r
+ @Override\r
+ public String getSimpleTypePrefix() {\r
+ return "SimpleTypes_";\r
} \r
\r
- public static String getAttributeGroupPrefix() {\r
- return "AttributeGroups_";\r
- }\r
+ @Override\r
+ public String getComplexTypePrefix() {\r
+ return "ComplexTypes_";\r
+ } \r
\r
@Override\r
- protected void handle(SchemaObject parent, SchemaElement indicator, SchemaElement element) {\r
- Element localElement = element.getElement();\r
- if (localElement.getName() != null) {\r
- SchemaObject eObj = elements.get(localElement);\r
- String refName = localElement.getName();\r
- QName refType = localElement.getType();\r
- if (refType != null)\r
- handleIndicator(parent, indicator, element, false, refName, refType);\r
- else {\r
- handleElement(eObj);\r
- handleIndicator(parent, indicator, element, false, refName, localElement);\r
- }\r
- } else if (localElement.getRef() != null) {\r
- QName refType = localElement.getRef();\r
- handleIndicator(parent, indicator,element, true, refType.getLocalPart(), refType);\r
- }\r
+ public String getAttributeGroupPrefix() {\r
+ return "AttributeGroups_";\r
}\r
\r
@Override\r
- protected void handle(SchemaObject parent, SchemaElement indicator, List<SchemaElement> elements) {\r
- if (indicator.getType() == SchemaElement.ElementType.SEQUENCE || (indicator.getType() == SchemaElement.ElementType.CHOICE && indicator.getRestriction().many())) {\r
- for (SchemaElement e : elements) {\r
- handle(parent, indicator, e);\r
- }\r
- } else if (indicator.getType() == SchemaElement.ElementType.CHOICE) {\r
- String name = getChoiceName(elements);\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
- } else if (localElement.getRef() != null) {\r
- QName refType = localElement.getRef();\r
- handleIndicator(parent, indicator, e, true, name, refType);\r
- }\r
- }\r
- }\r
+ public String handleChoice(SchemaObject parent, SchemaElement indicator, List<SchemaElement> elements, String name) {\r
+ String baseRelationName = getName(parent) + ".has" + 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, baseRelationName);\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, baseRelationName);\r
+// }\r
+// }\r
\r
+ return baseRelationName;\r
}\r
\r
protected String getOntologyImport() {\r
return null;\r
}\r
\r
- \r
- public static String getName(SchemaObject obj) {\r
+ @Override\r
+ public String getName(SchemaObject obj) {\r
if (obj.getParent() == null) {\r
switch (obj.getType()) {\r
case COMPLEX_TYPE:\r
case ATTRIBUTE_GROUP:\r
return getAttributeGroupPrefix()+obj.getName();\r
case SIMPLE_TYPE:\r
- return obj.getName();\r
+ return getSimpleTypePrefix()+obj.getName();\r
}\r
} else {\r
SchemaObject o = obj;\r
case ATTRIBUTE_GROUP:\r
return getAttributeGroupPrefix()+name;\r
case SIMPLE_TYPE:\r
- return name;\r
+ return getSimpleTypePrefix()+name;\r
}\r
}\r
throw new RuntimeException();\r
\r
}\r
\r
- public static String getName(SchemaObject obj, String rel) {\r
+ public String getName(SchemaObject obj, String rel) {\r
if (obj.getParent() == null) {\r
switch (obj.getType()) {\r
case COMPLEX_TYPE:\r
case ATTRIBUTE_GROUP:\r
return getAttributeGroupPrefix()+rel+obj.getName();\r
case SIMPLE_TYPE:\r
- return rel+obj.getName();\r
+ return getSimpleTypePrefix()+rel+obj.getName();\r
}\r
} else {\r
SchemaObject o = obj;\r
case ATTRIBUTE_GROUP:\r
return getAttributeGroupPrefix()+rel+name;\r
case SIMPLE_TYPE:\r
- return rel+name;\r
+ return getSimpleTypePrefix()+rel+name;\r
}\r
}\r
throw new RuntimeException();\r
}\r
\r
- protected enum InheritanceType{ComplexType,AtomicType,None};\r
\r
- protected class Inheritance {\r
- public String baseClass;\r
- public InheritanceType type;\r
- public TypeEntry atomicType;\r
- \r
- public Inheritance(String baseClass) {\r
- this.baseClass = baseClass;\r
- this.type = InheritanceType.None;\r
- }\r
- }\r
\r
- protected void writeClass(PrintWriter writer,boolean abst, String name, String className, String baseClass, List<String> interfaces) {\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.println();\r
writer.println(" @Override");\r
writer.println(" public java.lang.String getElementId() {");\r
- if (name != null)\r
- writer.println(" return \""+name+"\";");\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
- protected abstract String getBaseClass();\r
\r
- protected Inheritance getElementInheritance(SchemaObject topLevelElementObj) {\r
- Element topLevelElement = topLevelElementObj.getElement();\r
- Inheritance inheritance = new Inheritance(getBaseClass());\r
- if (topLevelElement.getType() != null) {\r
- QName type = topLevelElement.getType();\r
- if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
- SchemaObject obj = complexTypeName.get(type.getLocalPart());\r
-// if (obj == null)\r
-// obj = simpleTypeName.get(type.getLocalPart());\r
- if (obj != null) {\r
- inheritance.baseClass = getName(obj);\r
- inheritance.type = InheritanceType.ComplexType;\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, TypeEntry typeEntry, QName typeName);\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, String baseRelationName) {\r
+ String objectName;\r
+ if (referenceType != RefType.Element) {\r
+ QName refTypeName;\r
+ SchemaObject refObject = null;\r
+ if (referenceType == RefType.Type) {\r
+ refTypeName = element.getElement().getType();\r
+ if (refName == null)\r
+ refName = element.getElement().getName();\r
+ objectName = element.getElement().getName();\r
+ refObject = this.base.getComplexType(refTypeName);\r
+ if (refObject == null) this.base.getSimpleType(refTypeName);\r
} else {\r
- TypeEntry entry = getTypeEntry(type);\r
- if (entry != null) {\r
- inheritance.type = InheritanceType.AtomicType;\r
- inheritance.atomicType = entry;\r
- }\r
+ refTypeName = element.getElement().getRef();\r
+ if (refName == null)\r
+ refName = refTypeName.getLocalPart();\r
+ objectName = refTypeName.getLocalPart();\r
+ refObject = this.base.getElement(refTypeName);\r
}\r
- }\r
- if (inheritance.type == InheritanceType.None) {\r
- QName type = getElementBase(topLevelElement);\r
- if (type != null) {\r
- if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
- SchemaObject obj = getWithName(topLevelElementObj, type.getLocalPart());\r
- inheritance.baseClass = getName(obj);\r
- inheritance.type = InheritanceType.ComplexType;\r
- } else {\r
- TypeEntry entry = getTypeEntry(type);\r
- if (entry != null) {\r
- inheritance.type = InheritanceType.AtomicType;\r
- inheritance.atomicType = entry;\r
+ \r
+ TypeEntry typeEntry = this.base.getTypeEntry(refTypeName);\r
+ if (typeEntry == null) {\r
+ // prefer element reference over complex type reference\r
+ String primaryClassName = null;\r
+ String secondaryClassName = null;\r
+ if (refObject != null)\r
+ primaryClassName = getName(refObject);\r
+ else if (this.base.getSimpleType(refTypeName) != null) {\r
+ Inheritance inheritance = new Inheritance("");\r
+ this.base.getAtomicTypeInheritance(refTypeName, inheritance);\r
+ if (inheritance.atomicType != null) {\r
+ createPrimitiveIndicator(parent, refName, inheritance.atomicType, refTypeName);\r
+ return;\r
}\r
- }\r
- }\r
- }\r
- if (inheritance.type == InheritanceType.None) {\r
- QName type = topLevelElement.getSubstitutionGroup();\r
- if (type != null) {\r
- if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
- SchemaObject obj = getWithName(topLevelElementObj, type.getLocalPart());\r
- inheritance.baseClass = getName(obj);\r
- inheritance.type = InheritanceType.ComplexType;\r
- } else {\r
- TypeEntry entry = getTypeEntry(type);\r
- if (entry != null) {\r
- inheritance.type = InheritanceType.AtomicType;\r
- inheritance.atomicType = entry;\r
+ else {\r
+ throw new RuntimeException("No supported atomic type found for simple type " + refTypeName.toString());\r
}\r
}\r
+ else {\r
+ throw new RuntimeException("Type that is neither complex nor simple??");\r
+ }\r
+ \r
+ if (refObject != null) {\r
+ secondaryClassName = getName(refObject);\r
+ }\r
+ boolean useElementList = this.base.useElementList(parent, indicator,element, referenceType == RefType.Reference, refName, refTypeName);\r
+ boolean useOriginalList = this.base.useOriginalList(parent, indicator,element, referenceType == RefType.Reference, refName, refTypeName);\r
+ createReferenceIndicator(parent, referenceType, refName, objectName, primaryClassName, secondaryClassName, useElementList, useOriginalList);\r
+ } else {\r
+ createPrimitiveIndicator(parent, refName, typeEntry, refTypeName);\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
- return inheritance;\r
- } \r
+ }\r
\r
}\r