]> gerrit.simantics Code Review - simantics/interop.git/blobdiff - org.simantics.xml.sax/src/org/simantics/xml/sax/SchemaConversionBase.java
Handling ComplexTypes inheriting AtomicType
[simantics/interop.git] / org.simantics.xml.sax / src / org / simantics / xml / sax / SchemaConversionBase.java
index 5df8c4aefcbf4736d477410f4599c65c26286249..2cf2e0c76afd4b3edb400f220902ce96dd910d70 100644 (file)
@@ -348,14 +348,6 @@ public abstract class SchemaConversionBase {
                                return type;\r
                        }\r
                }\r
-//             SimpleContent simpleContent = complexType.getSimpleContent();\r
-//             if (simpleContent != null) {\r
-//                     ExtensionType extensionType = simpleContent.getExtension();\r
-//                     if (extensionType != null) {\r
-//                             QName type = extensionType.getBase();\r
-//                             return type;\r
-//                     }\r
-//             }\r
                return null;\r
        }\r
        \r
@@ -640,20 +632,15 @@ public abstract class SchemaConversionBase {
        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); // FIXME: handleIndicator should be refactored, not this methdof must be overridden in JavaGenerator to handle renaming of Elements properly\r
-                       //String refName = eObj.getName();//localElement.getName();\r
+                       SchemaObject eObj = elements.get(localElement); \r
                        QName refType = localElement.getType();\r
                        if (refType != null)\r
-                               //handleIndicator(parent, indicator, element, false, refName, refType);\r
                                handleIndicator(parent, indicator, element, null, RefType.Type);\r
                        else {\r
                                handleElement(eObj);\r
-                               //handleIndicator(parent, indicator, element, false, refName, localElement);\r
                                handleIndicator(parent, indicator, element, null, RefType.Element);\r
                        }\r
                } else if (localElement.getRef() != null) {\r
-                       //QName refType = localElement.getRef();\r
-                       //handleIndicator(parent, indicator,element, true, refType.getLocalPart(), refType);\r
                        handleIndicator(parent, indicator,element, null, RefType.Reference);\r
                }\r
        }\r
@@ -1069,5 +1056,129 @@ public abstract class SchemaConversionBase {
                }\r
                \r
        }\r
+       \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
 \r
 }\r