+ \r
+ public enum InheritanceType{ComplexType,AtomicType,None};\r
+ \r
+ public static 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
+ public abstract String getComplexTypePrefix(); \r
+ \r
+ public abstract String getAttributeGroupPrefix();\r
+ \r
+ public abstract String getName(SchemaObject obj);\r
+ \r
+ protected abstract String getBaseClass(ObjectType type);\r
+ \r
+ \r
+ \r
+ protected Inheritance getInheritance(SchemaObject topLevelObj) {\r
+ Inheritance inheritance = null;\r
+ if (topLevelObj.getType() == ObjectType.ELEMENT) {\r
+ Element topLevelElement = topLevelObj.getElement();\r
+ inheritance = new Inheritance(getBaseClass(ObjectType.ELEMENT));\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
+ } else {\r
+ TypeEntry entry = getTypeEntry(type);\r
+ if (entry != null) {\r
+ inheritance.type = InheritanceType.AtomicType;\r
+ inheritance.atomicType = entry;\r
+ }\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(topLevelObj, 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
+ }\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(topLevelObj, 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
+ }\r
+ }\r
+ }\r
+ } else if (topLevelObj.getType() == ObjectType.COMPLEX_TYPE) {\r
+ ComplexType complexType = topLevelObj.getComplexType();\r
+ QName type = getComplexTypeBase(complexType);\r
+ inheritance = new Inheritance(getBaseClass(ObjectType.COMPLEX_TYPE));\r
+ if (type != null && !type.getNamespaceURI().equals("http://www.w3.org/2001/XMLSchema")) {\r
+ SchemaObject obj = complexTypeName.get(type.getLocalPart());\r
+ if (obj != null) {\r
+ inheritance.baseClass = getName(obj);\r
+ inheritance.type = InheritanceType.ComplexType;\r
+ }\r
+ }\r
+ SimpleContent simpleContent = complexType.getSimpleContent();\r
+ if (simpleContent != null) {\r
+ ExtensionType extensionType = simpleContent.getExtension();\r
+ if (extensionType != null) {\r
+ type = extensionType.getBase();\r
+ getAtomicTypeInheritance(type, topLevelObj, inheritance);\r
+ }\r
+ }\r
+ }\r
+ \r
+ return inheritance;\r
+ } \r
+ /**\r
+ * Goes through chain of SimpleTypes until locates Atomic Type (type defined in XML schema). \r
+ * @param type\r
+ * @param topLevelObj\r
+ * @param inheritance\r
+ */\r
+ protected void getAtomicTypeInheritance(QName type, SchemaObject topLevelObj, Inheritance inheritance) {\r
+ if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
+ SchemaObject obj = getWithName(topLevelObj, type.getLocalPart());\r
+ if (obj.getType() != ObjectType.SIMPLE_TYPE)\r
+ throw new RuntimeException("SimpleContent does not use SimpleType definition");\r
+ SimpleType simpleType = obj.getSimpleType();\r
+ type = getSimpleTypeBase(simpleType);\r
+ getAtomicTypeInheritance(type, topLevelObj, inheritance);\r
+ } else {\r
+ TypeEntry entry = getTypeEntry(type);\r
+ if (entry != null) {\r
+ inheritance.type = InheritanceType.AtomicType;\r
+ inheritance.atomicType = entry;\r
+ }\r
+ }\r
+ }\r