]> gerrit.simantics Code Review - simantics/interop.git/blobdiff - org.simantics.xml.sax/src/org/simantics/xml/sax/OntologyGenerator.java
Refactoring and preparing the conversion code to handle references between XML schemas.
[simantics/interop.git] / org.simantics.xml.sax / src / org / simantics / xml / sax / OntologyGenerator.java
index 741e197f0e2ff50bf9bb6b41c619fe94fd78471e..f98a85f5673785e292347149b5865cde0454f392 100644 (file)
@@ -11,9 +11,11 @@ import java.util.Set;
 import javax.xml.namespace.QName;\r
 \r
 import org.simantics.utils.datastructures.BijectionMap;\r
+import org.simantics.xml.sax.SchemaConversionBase.Inheritance;\r
+import org.simantics.xml.sax.SchemaConversionBase.InheritanceType;\r
+import org.simantics.xml.sax.SchemaConversionBase.RefType;\r
 import org.simantics.xml.sax.SchemaObject.ObjectType;\r
 import org.simantics.xml.sax.configuration.AttributeComposition;\r
-import org.simantics.xml.sax.configuration.Configuration;\r
 import org.simantics.xml.sax.configuration.IDReference;\r
 import org.w3._2001.xmlschema.Annotated;\r
 import org.w3._2001.xmlschema.Attribute;\r
@@ -22,15 +24,21 @@ import org.w3._2001.xmlschema.Element;
 import org.w3._2001.xmlschema.LocalComplexType;\r
 import org.w3._2001.xmlschema.LocalSimpleType;\r
 import org.w3._2001.xmlschema.NamedAttributeGroup;\r
+import org.w3._2001.xmlschema.NamedGroup;\r
 import org.w3._2001.xmlschema.Restriction;\r
 import org.w3._2001.xmlschema.Schema;\r
 import org.w3._2001.xmlschema.SimpleType;\r
-import org.w3._2001.xmlschema.TopLevelAttribute;\r
 \r
-public class OntologyGenerator extends SchemaConversionBase {\r
+//public class OntologyGenerator extends SchemaConversionBase {\r
+public class OntologyGenerator implements SchemaConversionComponent {\r
+       SchemaConversionBase base;\r
        \r
-       public OntologyGenerator(Configuration configuration) {\r
-               super(configuration);\r
+       public OntologyGenerator(SchemaConverter converter, SchemaConversionBase base) {\r
+               this.base = base;\r
+               this.converter = converter;\r
+               this.schema = base.schema;\r
+               this.ontologyUri = base.ontologyURI;\r
+               this.className = base.className;                \r
        }\r
 \r
        String ontRoot = "ONT.";\r
@@ -44,30 +52,7 @@ public class OntologyGenerator extends SchemaConversionBase {
        \r
        PrintWriter writer = null;\r
        \r
-       \r
-       \r
-       \r
-       \r
-       public void createOntology(Schema schema, String ontologyName, String className, SchemaConverter converter) throws FileNotFoundException {\r
-               this.schema = schema;\r
-               this.converter = converter;\r
-               this.ontologyUri = ontologyName;\r
-               this.className = className;\r
-               \r
-//             for (OpenAttrs attrs : schema.getIncludeOrImportOrRedefine()) {\r
-//                     if (attrs instanceof Annotation) {\r
-//                             Annotation ann = (Annotation)attrs;\r
-//                             for (Object o : ann.getAppinfoOrDocumentation()) {\r
-//                                     if (o instanceof Documentation) {\r
-//                                             Documentation doc = (Documentation)o;\r
-//                                     } else if (o instanceof Appinfo) {\r
-//                                             Appinfo info = (Appinfo)o;\r
-//                                     }\r
-//                             }\r
-//                     }\r
-//             }\r
-               \r
-               \r
+       public void createOntology() throws FileNotFoundException {\r
                StringWriter stringWriter = null;\r
                if (converter.getOntologyFile() == null) {\r
                        stringWriter = new StringWriter();\r
@@ -76,7 +61,7 @@ public class OntologyGenerator extends SchemaConversionBase {
                        writer = new PrintWriter(converter.getOntologyFile());\r
                }\r
        \r
-               handle(schema);\r
+               handle();\r
                \r
                writer.flush();\r
                writer.close();\r
@@ -84,10 +69,8 @@ public class OntologyGenerator extends SchemaConversionBase {
                        System.out.println(stringWriter.toString());\r
        }\r
        \r
-       protected void handle(Schema schema) {\r
-               String parts[] = ontologyUri.split("/");\r
-               String name = parts[parts.length-1];\r
-               ontRoot = name.substring(0, Math.min(3, name.length())).toUpperCase();\r
+       protected void handle() {\r
+               ontRoot = converter.shortName;\r
 \r
                for (String s : converter.getHeader()) {\r
                        writer.println(commentTag + " " + s);   \r
@@ -109,18 +92,18 @@ public class OntologyGenerator extends SchemaConversionBase {
                writer.println(commentTag + " Interpreted from schema");\r
                writer.println();\r
                        \r
-               super.handle(schema);\r
+               base.handle(this);\r
        }\r
                \r
        protected String getType(QName qtype) {\r
-               String ontType = getL0TypeFromPrimitiveType(qtype);\r
+               String ontType = base.getL0TypeFromPrimitiveType(qtype);\r
                if (ontType != null)\r
                        return ontType;\r
-               else if (isComplexTypeRef(qtype.getLocalPart()))\r
+               else if (base.isComplexTypeRef(qtype.getLocalPart()))\r
                        return ontRoot+getComplexTypePrefix()+qtype.getLocalPart();\r
-               else if (isSimpleTypeRef(qtype.getLocalPart()))\r
+               else if (base.isSimpleTypeRef(qtype.getLocalPart()))\r
                        return ontRoot+qtype.getLocalPart();\r
-               else if (isElementRef(qtype.getLocalPart()))\r
+               else if (base.isElementRef(qtype.getLocalPart()))\r
                        return ontRoot+qtype.getLocalPart();\r
                else if (qtype.getPrefix() != null && qtype.getPrefix().length() > 0) {\r
                        return ontRoot+qtype.getPrefix()+qtype.getLocalPart();\r
@@ -128,19 +111,6 @@ public class OntologyGenerator extends SchemaConversionBase {
                throw new RuntimeException("Reference to unknown type " + qtype.getLocalPart());\r
        }\r
        \r
-       @Override\r
-       protected void handle(TopLevelAttribute topLevelAttribute) {\r
-               super.handle(topLevelAttribute);\r
-               writer.println();\r
-       }\r
-       \r
-       @Override\r
-       protected void handleSimpleType(SchemaObject topLevelSimpleType) {\r
-               super.handleSimpleType(topLevelSimpleType);\r
-               writer.println();\r
-       }\r
-       \r
-       \r
        public String getComplexTypePrefix() {\r
                return "ComplexTypes.";\r
        }\r
@@ -149,94 +119,85 @@ public class OntologyGenerator extends SchemaConversionBase {
                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
-                       boolean single = true;\r
-                       for (SchemaElement e : elements) {\r
-                               if (e.getRestriction().many()) {\r
-                                       single = false;\r
-                                       break;\r
-                               }\r
+       public void handleChoice(SchemaObject parent, SchemaElement indicator, java.util.List<SchemaElement> elements, String name) {\r
+               boolean single = true;\r
+               for (SchemaElement e : elements) {\r
+                       if (e.getRestriction().many()) {\r
+                               single = false;\r
+                               break;\r
                        }\r
-                       String relationName = getName(parent)+".has"+name;\r
-                       writer.print(relationName);\r
+               }\r
+               String relationName = getName(parent)+".has"+name;\r
+               writer.print(relationName);\r
+               \r
+               List<String> types = new ArrayList<String>();\r
+               for (SchemaElement e : elements) {\r
+                       Element localElement = e.getElement();\r
+                       QName refType = null;\r
+                       String type = null;\r
                        \r
-                       List<String> types = new ArrayList<String>();\r
-                       for (SchemaElement e : elements) {\r
-                               Element localElement = e.getElement();\r
-                               QName refType = null;\r
-                               String type = null;\r
-                               \r
-                               if (localElement.getName() != null) {\r
-                                       refType = localElement.getType();\r
-                                       type = getL0TypeFromPrimitiveType(refType);     \r
-                               } else if (localElement.getRef() != null) {\r
-                                       refType = localElement.getRef();\r
-                                       type = getL0TypeFromPrimitiveType(refType);\r
-                               }\r
-                               if (type == null) {\r
-                                       SchemaObject obj = getWithName(parent, refType.getLocalPart());\r
-                                       types.add(getName(obj,"has"));\r
-                               } \r
+                       if (localElement.getName() != null) {\r
+                               refType = localElement.getType();\r
+                               type = base.getL0TypeFromPrimitiveType(refType);        \r
+                       } else if (localElement.getRef() != null) {\r
+                               refType = localElement.getRef();\r
+                               type = base.getL0TypeFromPrimitiveType(refType);\r
                        }\r
-                       if (types.size() > 0) {\r
-                               for (String type : types) {\r
-                                       writer.print(" <R " + type);\r
-                               }\r
-                       } else {\r
-                               writer.print(" <R XML.hasElement");\r
+                       if (type == null) {\r
+                               SchemaObject obj = base.getWithName(parent, refType.getLocalPart());\r
+                               types.add(getName(obj,"has"));\r
+                       } \r
+               }\r
+               if (types.size() > 0) {\r
+                       for (String type : types) {\r
+                               writer.print(" <R " + type);\r
                        }\r
-                       \r
-                       writer.println();\r
-                       \r
-                       for (SchemaElement e : elements) {\r
-                               Element localElement = e.getElement();\r
-                               QName refType = null;\r
-                               String type = null;\r
-                               if (localElement.getName() != null) {\r
-                                       refType = localElement.getType();\r
-                                       type = getType(refType);        \r
-                               } else if (localElement.getRef() != null) {\r
-                                       refType = localElement.getRef();\r
-                                       type = getType(refType);\r
-                               }\r
-                               if (type != null) {\r
-                                       writer.println("   --> " + type);\r
-                               }\r
+               } else {\r
+                       writer.print(" <R XML.hasElement");\r
+               }\r
+               \r
+               writer.println();\r
+               \r
+               for (SchemaElement e : elements) {\r
+                       Element localElement = e.getElement();\r
+                       QName refType = null;\r
+                       String type = null;\r
+                       if (localElement.getName() != null) {\r
+                               refType = localElement.getType();\r
+                               type = getType(refType);        \r
+                       } else if (localElement.getRef() != null) {\r
+                               refType = localElement.getRef();\r
+                               type = getType(refType);\r
                        }\r
-                       if (!single) {\r
-                               writer.println(ontRoot+name+ "List <T XML.ElementList");\r
-                               if (types.size() == 0) {\r
-                               writer.println(relationName+ "List <R XML.hasElementList : L0.FunctionalRelation");\r
-                               } else {\r
-                                       writer.print(relationName+ "List");\r
-                                       for (String type : types) {\r
-                                               writer.print(" <R " + type+"List");\r
-                                       }\r
-                                       writer.println(" : L0.FunctionalRelation");\r
+                       if (type != null) {\r
+                               writer.println("   --> " + type);\r
+                       }\r
+               }\r
+               if (!single) {\r
+                       writer.println(ontRoot+name+ "List <T XML.ElementList");\r
+                       if (types.size() == 0) {\r
+                       writer.println(relationName+ "List <R XML.hasElementList : L0.FunctionalRelation");\r
+                       } else {\r
+                               writer.print(relationName+ "List");\r
+                               for (String type : types) {\r
+                                       writer.print(" <R " + type+"List");\r
                                }\r
-                               writer.println("   --> " + ontRoot+name+"List");\r
+                               writer.println(" : L0.FunctionalRelation");\r
                        }\r
+                       writer.println("   --> " + ontRoot+name+"List");\r
                }\r
-               \r
-       }\r
+       };\r
        \r
        \r
        \r
        @Override\r
-       protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, String refName, RefType refType) {\r
+       public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, String refName, RefType refType) {\r
                if (refType != refType.Element) {\r
                        QName referenceType = null;\r
                        if (refType == RefType.Type) {\r
                                referenceType = element.getElement().getType();\r
                                //refName = element.getElement().getName()\r
-                               SchemaObject eObj = elements.get(element.getElement());\r
+                               SchemaObject eObj = base.elements.get(element.getElement());\r
                                if (refName == null)\r
                                        refName = eObj.getName();\r
                        } else {\r
@@ -244,10 +205,10 @@ public class OntologyGenerator extends SchemaConversionBase {
                                if (refName == null)\r
                                        refName = referenceType.getLocalPart();\r
                        }\r
-                       String type = getL0TypeFromPrimitiveType(referenceType);\r
+                       String type = base.getL0TypeFromPrimitiveType(referenceType);\r
                        SchemaObject obj = null;\r
                        if (type == null) {\r
-                               obj = getWithName(parent, referenceType.getLocalPart());\r
+                               obj = base.getWithName(parent, referenceType.getLocalPart());\r
                                \r
                                writer.println(getName(parent)+".has"+refName + " <R " +  getName(obj,"has"));\r
                                writer.println("   --> " + getName(obj));\r
@@ -256,7 +217,7 @@ public class OntologyGenerator extends SchemaConversionBase {
                                writer.println("   --> " + getType(referenceType));\r
                        }\r
                        \r
-                       if (useElementList(parent, indicator,element, refType == RefType.Reference, refName, referenceType)) {\r
+                       if (base.useElementList(parent, indicator,element, refType == RefType.Reference, refName, referenceType)) {\r
                                \r
                                if (type == null) {\r
                                        writer.println(getName(parent)+"."+refName + "List <T XML.ElementList");\r
@@ -268,13 +229,13 @@ public class OntologyGenerator extends SchemaConversionBase {
                        }\r
                } else {\r
                        Element attrs = element.getElement();\r
-                       SchemaObject obj = getWithObj(parent, attrs);\r
+                       SchemaObject obj = base.getWithObj(parent, attrs);\r
                        if (refName == null)\r
                                refName = obj.getName();\r
                        \r
                        writer.println(getName(parent)+".has"+refName + " <R " + getName(obj,"has"));\r
                        writer.println("   --> " + getName(obj));\r
-                       if (useElementList(parent, indicator,element, false, refName, new QName(obj.getName()))) {\r
+                       if (base.useElementList(parent, indicator,element, false, refName, new QName(obj.getName()))) {\r
                                writer.println(getName(parent)+"."+refName + "List <T XML.ElementList");\r
                                writer.println(getName(parent)+".has"+refName + "List <R " +  getName(obj,"has")+"List : L0.FunctionalRelation");\r
                        }\r
@@ -283,12 +244,18 @@ public class OntologyGenerator extends SchemaConversionBase {
        }\r
        \r
        @Override\r
-       protected void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) {\r
+       public void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any) {\r
+               \r
+       }\r
+       \r
+       @Override\r
+       public void handle(SchemaObject parent, NamedGroup attribute) {\r
+               // TODO Auto-generated method stub\r
                \r
        }\r
                \r
        @Override\r
-       protected void handle(SchemaObject parent, Attribute attribute) {\r
+       public void handle(SchemaObject parent, Attribute attribute) {\r
                String name = attribute.getName();\r
                QName primitiveType = attribute.getType();\r
                LocalSimpleType simpleType = attribute.getSimpleType();\r
@@ -311,9 +278,9 @@ public class OntologyGenerator extends SchemaConversionBase {
                boolean id = false;\r
                String ontType = null;\r
                if (primitiveType != null) {\r
-                       ontType = getL0TypeFromPrimitiveType(primitiveType);\r
+                       ontType = base.getL0TypeFromPrimitiveType(primitiveType);\r
                        if (ontType != null) {\r
-                               id = getTypeEntry(primitiveType).id;\r
+                               id = base.getTypeEntry(primitiveType).id;\r
                                if (id)\r
                                        relationType = "XML.hasID";\r
                        } else {\r
@@ -326,7 +293,7 @@ public class OntologyGenerator extends SchemaConversionBase {
                        QName base = restriction.getBase();\r
                        \r
                        \r
-                       ontType = getL0TypeFromPrimitiveType(base);\r
+                       ontType = this.base.getL0TypeFromPrimitiveType(base);\r
                        \r
 //                     for (Object facetWrap : restriction.getFacets()) {\r
 //                             JAXBElement<?> element = (JAXBElement<?>)facetWrap;\r
@@ -348,7 +315,7 @@ public class OntologyGenerator extends SchemaConversionBase {
        }\r
        \r
        @Override\r
-       protected void handleAttributes(SchemaObject simpleTypeObj) {\r
+       public void handleAttributes(SchemaObject simpleTypeObj) {\r
 //             SchemaObject parent = simpleTypeObj.getParent();\r
 //             SimpleType simpleType = simpleTypeObj.getSimpleType();\r
 //             Restriction restriction = simpleType.getRestriction();\r
@@ -357,7 +324,7 @@ public class OntologyGenerator extends SchemaConversionBase {
        }\r
        \r
        @Override\r
-       protected void handle(SchemaObject parent, AttributeGroup attributeGroup) {\r
+       public void handle(SchemaObject parent, AttributeGroup attributeGroup) {\r
                if (parent == null) {\r
                        NamedAttributeGroup group = (NamedAttributeGroup)attributeGroup;\r
                        writer.println(ontRoot+getAttributeGroupPrefix()+group.getName()+ " <T XML.AttributeGroup");\r
@@ -367,7 +334,8 @@ public class OntologyGenerator extends SchemaConversionBase {
                                        //handle(getAttributeGroupPrefix()+group.getName(),(Attribute)annotated);\r
                                        handle(obj,(Attribute)annotated);\r
                                } else if (annotated instanceof AttributeGroup) {\r
-                                       throw new RuntimeException("Cannot handle nested attribute groups");\r
+                                       handle(obj,(AttributeGroup)annotated);\r
+                                       //throw new RuntimeException("Cannot handle nested attribute groups");\r
                                }\r
                        }\r
                } else {\r
@@ -377,16 +345,16 @@ public class OntologyGenerator extends SchemaConversionBase {
        }\r
        \r
        @Override\r
-       protected void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes) {\r
+       public void handleAttributeComposition(SchemaObject parent, AttributeComposition composition, BijectionMap<org.simantics.xml.sax.configuration.Attribute, Annotated> attributes) {\r
                Attribute compositionAttribute = new Attribute();\r
                compositionAttribute.setName(composition.getName());\r
-               QName type = new QName(CONVERSION_NS, composition.getType());\r
+               QName type = new QName(SchemaConversionBase.CONVERSION_NS, composition.getType());\r
                compositionAttribute.setType(type);\r
                handle(parent, compositionAttribute);\r
        }\r
        \r
        @Override\r
-       protected void handleSimpleType(SchemaObject parent, SchemaObject simpleTypeObj) {\r
+       public void handleSimpleType(SchemaObject parent, SchemaObject simpleTypeObj) {\r
                SimpleType simpleType = simpleTypeObj.getSimpleType();\r
                String name = simpleType.getName();\r
                \r
@@ -398,27 +366,75 @@ public class OntologyGenerator extends SchemaConversionBase {
                                relationName = getName(parent)+".has"+name;\r
                        writer.println(relationName+ " <R XML.hasAttribute : L0.FunctionalRelation");\r
                        \r
-                       String ontType = getL0Type(new QName(SCHEMA_NS, "string"));\r
+                       String ontType = base.getL0Type(new QName(SchemaConversionBase.SCHEMA_NS, "string"));\r
                        writer.println("   --> " + ontType);\r
                } else {\r
-                       Restriction restriction = simpleType.getRestriction();\r
-                       if (restriction == null || simpleType.getUnion() != null || simpleType.getId() != null)\r
-                               throw new RuntimeException(simpleType.getName() + " restriction error");\r
-                       QName base = restriction.getBase();\r
-                       \r
                        String relationName = ontRoot+"has"+name;\r
                        if (parent != null)\r
                                relationName = getName(parent)+".has"+name;\r
                        \r
                        writer.println(relationName+ " <R XML.hasAttribute : L0.FunctionalRelation");\r
                        \r
-                       String ontType = getL0Type(base);\r
-                       writer.println("   --> " + ontType);\r
+                       QName base = this.base.getSimpleTypeBase(simpleType);\r
+                       Inheritance inheritance = new Inheritance("");\r
+                       this.base.getAtomicTypeInheritance(base, inheritance);\r
+                       if (inheritance.atomicType == null)\r
+                               throw new RuntimeException("Could not locate atomic type for SimpleType " + simpleType.getName());\r
+                       writer.println("   --> " + inheritance.atomicType.l0Type);\r
+                       \r
+//                     Restriction restriction = simpleType.getRestriction();\r
+//                     if (restriction != null) {\r
+//                             \r
+//                             QName base = restriction.getBase();\r
+//                             String ontType = getL0Type(base);\r
+//                             writer.println("   --> " + ontType);\r
+//                     } else if (simpleType.getId() != null) {\r
+//                             throw new RuntimeException(simpleType.getName() + " restriction error");\r
+//                     } else if (simpleType.getUnion() != null) {\r
+//                             Union union = simpleType.getUnion();\r
+//                             String ontType = null;\r
+//                             if (union.getMemberTypes().size() > 0) {\r
+//                                     for (QName type : union.getMemberTypes()) {\r
+//                                             String sType = null;\r
+//                                             TypeEntry entry = getTypeEntry(type);\r
+//                                             if (entry == null) {\r
+//                                                     SchemaObject obj = simpleTypeName.get(type.getLocalPart());\r
+//                                                     Inheritance inheritance = new Inheritance("");\r
+//                                                     getAtomicTypeInheritance(type, obj, inheritance);\r
+//                                                     sType = inheritance.atomicType.l0Type;\r
+//                                             } else {\r
+//                                                     sType = entry.l0Type;\r
+//                                             }\r
+//                                             if (ontType == null)\r
+//                                                     ontType = sType;\r
+//                                             else if (!ontType.equals(sType))\r
+//                                                     throw new RuntimeException(simpleType.getName() + " union has incompatible member types");\r
+//                                     }\r
+//                             } else {\r
+//                                     if (union.getSimpleType().size() == 0)\r
+//                                             throw new RuntimeException(simpleType.getName() + " union error");\r
+//                                     for (SimpleType s : union.getSimpleType()) {\r
+//                                             if (restriction == null)\r
+//                                                     restriction = s.getRestriction();\r
+//                                             else  {\r
+//                                                     Restriction r = s.getRestriction();\r
+//                                                     if (!r.getBase().equals(restriction.getBase()))\r
+//                                                             throw new RuntimeException(simpleType.getName() + " union has incompatible restriction bases");\r
+//                                             }\r
+//                                     }\r
+//                                     QName base = restriction.getBase();\r
+//                                     ontType = getL0Type(base);\r
+//                             }\r
+//                             writer.println("   --> " + ontType);\r
+//                     } else {\r
+//                             throw new RuntimeException(simpleType.getName() + " restriction error");\r
+//                     }\r
+                       \r
                }\r
        }\r
        \r
        @Override\r
-       protected void handleComplexType(SchemaObject topLevelComplexType) {\r
+       public void handleComplexType(SchemaObject topLevelComplexType) {\r
                String name = getName(topLevelComplexType);\r
 //             if (topLevelComplexType.getName().equals("Reference"))\r
 //                     System.out.println();\r
@@ -440,7 +456,7 @@ public class OntologyGenerator extends SchemaConversionBase {
 //             if (base != null) {\r
 //                     baseType = getType(base);\r
 //             }\r
-               Inheritance inheritance = getInheritance(topLevelComplexType);\r
+               Inheritance inheritance = base.getInheritance(topLevelComplexType);\r
                \r
 //             writer.println(name+ " <T "+baseType);\r
                \r
@@ -451,12 +467,15 @@ public class OntologyGenerator extends SchemaConversionBase {
                }\r
 //             if (!baseType.equals(inheritance.baseClass))\r
 //                     System.out.println();\r
-               super.handleComplexType(topLevelComplexType);\r
+               //super.handleComplexType(topLevelComplexType);\r
+               base.handleComplexTypeAttributes(topLevelComplexType);\r
+               base.handleComplexTypeExtension(topLevelComplexType);\r
+               base.handleExtensionAttributes(topLevelComplexType);\r
                writer.println();\r
        }\r
        \r
        @Override\r
-       protected void handleElement(SchemaObject elementObj) {\r
+       public void handleElement(SchemaObject elementObj) {\r
                Element element = elementObj.getElement();\r
                String name = getName(elementObj);//element.getName();\r
                \r
@@ -468,21 +487,21 @@ public class OntologyGenerator extends SchemaConversionBase {
                if (element.getType() != null) {\r
                        types.add(getType(element.getType()));\r
                }\r
-               QName base = getElementBase(element);\r
+               QName base = this.base.getElementBase(element);\r
                if (base != null) {\r
-                       if (base.getNamespaceURI().equals(SCHEMA_NS)) {\r
-                               String l0Type = getL0Type(base);\r
+                       if (base.getNamespaceURI().equals(SchemaConversionBase.SCHEMA_NS)) {\r
+                               String l0Type = this.base.getL0Type(base);\r
                                if (l0Type == null)\r
                                        throw new RuntimeException("Cannot get L0 type for " + base.getLocalPart());\r
                                types.add(l0Type);\r
-                       } else if (isElementRef(base.getLocalPart()))\r
+                       } else if (this.base.isElementRef(base.getLocalPart()))\r
                                types.add(ontRoot+base.getLocalPart());\r
                        else\r
                                types.add(ontRoot+getComplexTypePrefix()+base.getLocalPart());\r
                }\r
                QName substitution = element.getSubstitutionGroup();\r
                if (substitution != null) {\r
-                       if (isElementRef(substitution.getLocalPart()))\r
+                       if (this.base.isElementRef(substitution.getLocalPart()))\r
                                types.add(ontRoot+substitution.getLocalPart());\r
                        else\r
                                types.add( ontRoot+getComplexTypePrefix()+substitution.getLocalPart());\r
@@ -505,15 +524,15 @@ public class OntologyGenerator extends SchemaConversionBase {
                LocalSimpleType simpleType = element.getSimpleType();\r
                \r
                if (complexType != null) {\r
-                       SchemaObject complexTypeObj = complexTypes.get(complexType);\r
-                       handleElementComplexTypeAttributes(complexTypeObj);\r
-                       handleComplexTypeExtension(complexTypeObj);\r
+                       SchemaObject complexTypeObj = this.base.complexTypes.get(complexType);\r
+                       this.base.handleElementComplexTypeAttributes(complexTypeObj);\r
+                       this.base.handleComplexTypeExtension(complexTypeObj);\r
                } else if (simpleType != null) {\r
-                       SchemaObject simpleTypeObj = simpleTypes.get(simpleType);\r
-                       handleElementSimpleTypeAttributes(simpleTypeObj);\r
+                       SchemaObject simpleTypeObj = this.base.simpleTypes.get(simpleType);\r
+                       this.base.handleElementSimpleTypeAttributes(simpleTypeObj);\r
                }\r
                \r
-               List<IDReference> references = getIDReferences(element);\r
+               List<IDReference> references = this.base.getIDReferences(element);\r
        \r
                for (IDReference ref : references) {\r
                        writer.println(name+"."+ref.getReference().getName()+ " <R XML.hasReference");\r
@@ -523,7 +542,7 @@ public class OntologyGenerator extends SchemaConversionBase {
        }\r
        \r
        @Override\r
-       protected String getBaseClass(ObjectType type) {\r
+       public String getBaseClass(ObjectType type) {\r
                if (type == ObjectType.ELEMENT)\r
                        return "XML.Element";\r
                if (type == ObjectType.COMPLEX_TYPE)\r
@@ -531,6 +550,7 @@ public class OntologyGenerator extends SchemaConversionBase {
                throw new RuntimeException("ObjectType " + type + " has no base class");\r
        }\r
        \r
+       @Override\r
        public String getName(SchemaObject obj) {\r
                if (obj.getParent() == null) {\r
                        switch (obj.getType()) {\r