]> gerrit.simantics Code Review - simantics/interop.git/blobdiff - org.simantics.xml.sax/src/org/simantics/xml/sax/SchemaConversionBase.java
Schema parsing can access data from other schemas (work in progress)
[simantics/interop.git] / org.simantics.xml.sax / src / org / simantics / xml / sax / SchemaConversionBase.java
index 3e6c8818732a102cd5b56601e1847eaeff2963be..2bca88d64f5dfd666fee38f5d5cdf6a956fc4e84 100644 (file)
@@ -196,41 +196,147 @@ public final class SchemaConversionBase {
                }\r
        }\r
        \r
-       protected Map<String,SchemaObject> elementName = new HashMap<>();\r
-       protected Map<String,SchemaObject> complexTypeName = new HashMap<>();\r
-       protected Map<String,SchemaObject> simpleTypeName = new HashMap<>();\r
-       protected Map<String,SchemaObject> modelGroupName = new HashMap<>();\r
-       protected Map<Element,SchemaObject> elements = new HashMap<>();\r
-       protected Map<ComplexType,SchemaObject> complexTypes = new HashMap<>();\r
-       protected Map<SimpleType,SchemaObject> simpleTypes = new HashMap<>();\r
-       protected Map<NamedGroup,SchemaObject> modelGroups = new HashMap<>();\r
-       \r
-       \r
-       protected SchemaObject getWithName(SchemaObject referrer, String name) {\r
-               SchemaObject obj = elementName.get(name);\r
+       private Map<String,SchemaObject> elementName = new HashMap<>();\r
+       private Map<String,SchemaObject> complexTypeName = new HashMap<>();\r
+       private Map<String,SchemaObject> simpleTypeName = new HashMap<>();\r
+       private Map<String,SchemaObject> modelGroupName = new HashMap<>();\r
+       private Map<Element,SchemaObject> elements = new HashMap<>();\r
+       private Map<ComplexType,SchemaObject> complexTypes = new HashMap<>();\r
+       private Map<SimpleType,SchemaObject> simpleTypes = new HashMap<>();\r
+       private Map<NamedGroup,SchemaObject> modelGroups = new HashMap<>();\r
+       \r
+       private SchemaObject _getWithName(QName name) {\r
+               SchemaObject obj = elementName.get(name.getLocalPart());\r
                if (obj == null)\r
-                       obj = complexTypeName.get(name);\r
+                       obj = complexTypeName.get(name.getLocalPart());\r
                if (obj == null)\r
-                       obj = simpleTypeName.get(name);\r
-               if (obj == null) {\r
-                       throw new RuntimeException("Cannot locate referred type " + name + " when handling " + referrer.getName());\r
-               }\r
+                       obj = simpleTypeName.get(name.getLocalPart());\r
                return obj;\r
        }\r
        \r
-       protected SchemaObject getWithName(String name) {\r
-               SchemaObject obj = elementName.get(name);\r
-               if (obj == null)\r
-                       obj = complexTypeName.get(name);\r
-               if (obj == null)\r
-                       obj = simpleTypeName.get(name);\r
-               if (obj == null) {\r
-                       throw new RuntimeException("Cannot locate referred type " + name);\r
+       protected SchemaObject getWithName(QName name) {\r
+               SchemaObject obj = _getWithName(name);\r
+               if (obj != null)\r
+                       return obj;\r
+               if (name.getNamespaceURI() != null) {\r
+                       for (SchemaConverter sc : converter.getConverter(name.getNamespaceURI())) {\r
+                               if (sc.base != null) {\r
+                                       obj = sc.base._getWithName(name);\r
+                                       if (obj != null) {\r
+                                               return obj;\r
+                                       }\r
+                               }\r
+                       }               \r
                }\r
-               return obj;\r
+               return null;\r
+       }\r
+       \r
+       private NamedAttributeGroup _getAttributeGroup(QName name) {\r
+               for (OpenAttrs attrs : schema.getSimpleTypeOrComplexTypeOrGroup()) {\r
+                       if (attrs instanceof NamedAttributeGroup) {\r
+                               NamedAttributeGroup group = (NamedAttributeGroup)attrs;\r
+                               if (group.getName().equals(name.getLocalPart()))\r
+                                       return group;\r
+                       }\r
+               }\r
+               return null;\r
+       }\r
+\r
+       public NamedAttributeGroup getAttributeGroup(QName name) {\r
+               NamedAttributeGroup group = _getAttributeGroup(name);\r
+               if (group != null)\r
+                       return group;\r
+               if (name.getNamespaceURI() != null) {\r
+                       for (SchemaConverter sc : converter.getConverter(name.getNamespaceURI())) {\r
+                               if (sc.base != null) {\r
+                                       group = sc.base._getAttributeGroup(name);\r
+                                       if (group != null) {\r
+                                               return group;\r
+                                       }\r
+                               }\r
+                       }       \r
+               }\r
+               return null;\r
+       }\r
+       \r
+       private SchemaObject _getElement(QName name) {\r
+               return elementName.get(name.getLocalPart());\r
+       }\r
+       \r
+       protected SchemaObject getElement(QName name) {\r
+               SchemaObject obj = _getElement(name);\r
+               if (obj != null)\r
+                       return obj;\r
+               if (name.getNamespaceURI() != null) {\r
+                       for (SchemaConverter sc : converter.getConverter(name.getNamespaceURI())) {\r
+                               if (sc.base != null) {\r
+                                       obj = sc.base._getElement(name);\r
+                                       if (obj != null) {\r
+                                               return obj;\r
+                                       }\r
+                               }\r
+                       }               \r
+               }\r
+               return null;\r
+       }\r
+       \r
+       protected SchemaObject getElement(Element element) {\r
+               return elements.get(element);\r
+       }\r
+       \r
+       \r
+       private SchemaObject _getComplexType(QName name) {\r
+               return complexTypeName.get(name.getLocalPart());\r
+       }\r
+       \r
+       protected SchemaObject getComplexType(QName name) {\r
+               SchemaObject obj = _getComplexType(name);\r
+               if (obj != null)\r
+                       return obj;\r
+               if (name.getNamespaceURI() != null) {\r
+                       for (SchemaConverter sc : converter.getConverter(name.getNamespaceURI())) {\r
+                               if (sc.base != null) {\r
+                                       obj = sc.base._getComplexType(name);\r
+                                       if (obj != null) {\r
+                                               return obj;\r
+                                       }\r
+                               }\r
+                       }               \r
+               }\r
+               return null;\r
+       }\r
+       \r
+       protected SchemaObject getComplexType(ComplexType complexType) {\r
+               return complexTypes.get(complexType);\r
+       }\r
+       \r
+       private SchemaObject _getSimpleType(QName name) {\r
+               return simpleTypeName.get(name.getLocalPart());\r
+       }\r
+       \r
+       protected SchemaObject getSimpleType(QName name) {\r
+               SchemaObject obj = _getSimpleType(name);\r
+               if (obj != null)\r
+                       return obj;\r
+               if (name.getNamespaceURI() != null) {\r
+                       for (SchemaConverter sc : converter.getConverter(name.getNamespaceURI())) {\r
+                               if (sc.base != null) {\r
+                                       obj = sc.base._getSimpleType(name);\r
+                                       if (obj != null) {\r
+                                               return obj;\r
+                                       }\r
+                               }\r
+                       }               \r
+               }\r
+               return null;\r
+       }\r
+       \r
+       protected SchemaObject getSimpleType(SimpleType simpleType) {\r
+               return simpleTypes.get(simpleType);\r
        }\r
        \r
        protected SchemaObject getWithObj(SchemaObject referrer, OpenAttrs attrs) {\r
+               // FIXME : this method cannot handle references to other schemas.\r
                SchemaObject obj = null;\r
                if (attrs instanceof Element)\r
                        obj = elements.get(attrs);\r
@@ -492,13 +598,6 @@ public final class SchemaConversionBase {
                return null;\r
        }\r
        \r
-\r
-       \r
-       \r
-       \r
-       \r
-       \r
-       \r
        private void handleAttributes(SchemaObject complexType, List<Annotated> attributeOrAttributeGroup) {\r
                //name = getComplexTypePrefix()+complexType.getName()\r
                \r
@@ -763,6 +862,17 @@ public final class SchemaConversionBase {
                                        }\r
                                }\r
                        } else {\r
+                               if (choices.size() == 1 && sequences.size() == 0 && alls.size() == 0 && groups.size() == 0) {\r
+                                       // special case: handle lone choice inside sequence with maxOccurs > 1 \r
+                                       SchemaElement choice = choices.get(0);\r
+                                       // move multiplicity restrictions to choice\r
+                                       if (indicator.getRestriction().max == -1 || (choice.getRestriction().max > 0 && indicator.getRestriction().max > choice.getRestriction().max))\r
+                                               choice.getRestriction().max = indicator.getRestriction().max;\r
+                                       if (indicator.getRestriction().min == 0 || choice.getRestriction().min > indicator.getRestriction().min)\r
+                                               choice.getRestriction().min = indicator.getRestriction().min;\r
+                                       handle(parent, choice, elements);\r
+                                       return;\r
+                               }\r
                                if (sequences.size() > 0 || choices.size() > 0 || alls.size() > 0 || groups.size() > 0) {\r
                                        throw new RuntimeException("Cannot handle Sequence with inner ExplicitGroups");\r
                                }\r
@@ -915,17 +1025,6 @@ public final class SchemaConversionBase {
                return simpleTypeName.containsKey(ref);\r
        }\r
        \r
-       public NamedAttributeGroup getAttributeGroup(String name) {\r
-               for (OpenAttrs attrs : schema.getSimpleTypeOrComplexTypeOrGroup()) {\r
-                       if (attrs instanceof NamedAttributeGroup) {\r
-                               NamedAttributeGroup group = (NamedAttributeGroup)attrs;\r
-                               if (group.getName().equals(name))\r
-                                       return group;\r
-                       }\r
-               }\r
-               return null;\r
-       }\r
-       \r
        public IDProvider getIDProvider(Element element) {\r
                List<IDProvider> idProviders = new ArrayList<IDProvider>(2);\r
                for (JAXBElement<?> e : configuration.getConversionRule()) {\r
@@ -1279,7 +1378,7 @@ public final class SchemaConversionBase {
                                QName type = getElementBase(topLevelElement);\r
                                if (type != null) {\r
                                        if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
-                                               SchemaObject obj = getWithName(topLevelObj, type.getLocalPart());\r
+                                               SchemaObject obj = getWithName(type);\r
                                                inheritance.baseClass = getName(obj);\r
                                                inheritance.type = InheritanceType.ComplexType;\r
                                        } else {\r
@@ -1295,7 +1394,7 @@ public final class SchemaConversionBase {
                                QName type = topLevelElement.getSubstitutionGroup();\r
                                if (type != null) {\r
                                        if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
-                                               SchemaObject obj = getWithName(topLevelObj, type.getLocalPart());\r
+                                               SchemaObject obj = getWithName(type);\r
                                                inheritance.baseClass = getName(obj);\r
                                                inheritance.type = InheritanceType.ComplexType;\r
                                        } else {\r
@@ -1338,7 +1437,8 @@ public final class SchemaConversionBase {
         */\r
        public void getAtomicTypeInheritance(QName type, Inheritance inheritance) {\r
                if (!type.getNamespaceURI().equals(SCHEMA_NS)) {\r
-                       SchemaObject obj = getWithName(type.getLocalPart());\r
+                       SchemaObject obj = getWithName(type);\r
+                       System.out.println();\r
                        if (obj.getType() != ObjectType.SIMPLE_TYPE)\r
                                throw new RuntimeException("SimpleContent does not use SimpleType definition");\r
                        SimpleType simpleType = obj.getSimpleType();\r