]> 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 600d13fd7dc91e35989375d8f3df4afe86fb63bb..2cf2e0c76afd4b3edb400f220902ce96dd910d70 100644 (file)
@@ -38,6 +38,7 @@ import org.w3._2001.xmlschema.NamedAttributeGroup;
 import org.w3._2001.xmlschema.OpenAttrs;\r
 import org.w3._2001.xmlschema.Restriction;\r
 import org.w3._2001.xmlschema.Schema;\r
+import org.w3._2001.xmlschema.SimpleContent;\r
 import org.w3._2001.xmlschema.SimpleType;\r
 import org.w3._2001.xmlschema.TopLevelAttribute;\r
 import org.w3._2001.xmlschema.TopLevelComplexType;\r
@@ -265,6 +266,23 @@ public abstract class SchemaConversionBase {
                                                        throw new RuntimeException("Groups not supported");\r
                                        }\r
                                }\r
+                               if (ct.getSimpleContent() != null) {\r
+                                       SimpleContent cc = ct.getSimpleContent();\r
+                                       ExtensionType extensionType = cc.getExtension();\r
+                                       if (extensionType != null) {\r
+                                               if (extensionType.getChoice() != null) {\r
+                                                       preload(object,extensionType.getChoice(), stack);\r
+                                               }\r
+                                               if (extensionType.getSequence()!= null) {\r
+                                                       preload(object,extensionType.getSequence(), stack);\r
+                                               }\r
+                                               if (extensionType.getAll()!= null) {\r
+                                                       preload(object,extensionType.getAll(), stack);\r
+                                               }\r
+                                               if (extensionType.getGroup() != null)\r
+                                                       throw new RuntimeException("Groups not supported");\r
+                                       }\r
+                               }\r
                        } else if (object.getType() == ObjectType.ELEMENT) {\r
                                Element e = object.getElement();\r
                                if (e instanceof TopLevelElement)\r
@@ -385,6 +403,13 @@ public abstract class SchemaConversionBase {
                                handleAttributes(complexType, extensionType.getAttributeOrAttributeGroup());\r
                        }\r
                }\r
+               SimpleContent simpleContent = complexType.getComplexType().getSimpleContent();\r
+               if (simpleContent != null) {\r
+                       ExtensionType extensionType = simpleContent.getExtension();\r
+                       if (extensionType != null) {\r
+                               handleAttributes(complexType, extensionType.getAttributeOrAttributeGroup());\r
+                       }\r
+               }\r
        }\r
        \r
        \r
@@ -489,8 +514,9 @@ public abstract class SchemaConversionBase {
                handleExtensionAttributes(complexType);\r
        }\r
        \r
-       protected abstract void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, boolean reference, String refName, QName refType);\r
-       protected abstract void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, boolean reference, String refName, OpenAttrs ref);\r
+       protected enum RefType{Element,Reference,Type};\r
+       \r
+       protected abstract void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement element, String refName, RefType refType);\r
        protected abstract void handleIndicator(SchemaObject parent, SchemaElement indicator, SchemaElement any);\r
        protected abstract void handle(SchemaObject parent, SchemaElement indicator, List<SchemaElement> elements);\r
        \r
@@ -606,18 +632,16 @@ 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
        \r
@@ -692,6 +716,10 @@ public abstract class SchemaConversionBase {
                                        }\r
                                }\r
                        }\r
+//                     SimpleContent simpleContent = complexType.getSimpleContent();\r
+//                     if (simpleContent != null) {\r
+//                             ExtensionType extensionType = simpleContent.getExtension();\r
+//                     }\r
                }\r
        }\r
        \r
@@ -709,28 +737,15 @@ public abstract class SchemaConversionBase {
        \r
        \r
        protected boolean isElementRef(String ref) {\r
-//             for (OpenAttrs attrs : schema.getSimpleTypeOrComplexTypeOrGroup()) {\r
-//                     if (attrs instanceof TopLevelElement) {\r
-//                             TopLevelElement element = (TopLevelElement)attrs;\r
-//                             if (ref.equals(element.getName()))\r
-//                                     return true;\r
-//                     }\r
-//             }\r
-//             return false;\r
                return elementName.containsKey(ref);\r
        }\r
        \r
        protected boolean isComplexTypeRef(String ref) {\r
-//             for (OpenAttrs attrs : schema.getSimpleTypeOrComplexTypeOrGroup()) {\r
-//                     if (attrs instanceof TopLevelComplexType) {\r
-//                             TopLevelComplexType element = (TopLevelComplexType)attrs;\r
-//                             if (ref.equals(element.getName()))\r
-//                                     return true;\r
-//                     }\r
-//             }\r
-//             return false;\r
                return complexTypeName.containsKey(ref);\r
-               \r
+       }\r
+       \r
+       protected boolean isSimpleTypeRef(String ref) {\r
+               return simpleTypeName.containsKey(ref);\r
        }\r
        \r
        protected NamedAttributeGroup getAttributeGroup(String name) {\r
@@ -1041,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