]> 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 e04b0931fb115fb9f96d9ce5427b4105a6732498..2cf2e0c76afd4b3edb400f220902ce96dd910d70 100644 (file)
@@ -20,6 +20,7 @@ import org.simantics.xml.sax.configuration.Configuration;
 import org.simantics.xml.sax.configuration.IDProvider;\r
 import org.simantics.xml.sax.configuration.IDReference;\r
 import org.simantics.xml.sax.configuration.OrderedChild;\r
+import org.simantics.xml.sax.configuration.Rename;\r
 import org.simantics.xml.sax.configuration.UnrecognizedChildElement;\r
 import org.w3._2001.xmlschema.All;\r
 import org.w3._2001.xmlschema.Annotated;\r
@@ -37,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
@@ -62,37 +64,38 @@ public abstract class SchemaConversionBase {
                Map<String,TypeEntry> l0Types = new HashMap<String, SchemaConversionBase.TypeEntry>();\r
                typeMap.put(CONVERSION_NS, l0Types);\r
                \r
-               schemaTypes.put("string",               new TypeEntry("L0.String",                      "Bindings.STRING", "String", "","",""));\r
-               schemaTypes.put("NMTOKEN",              new TypeEntry("L0.String",                      "Bindings.STRING", "String", "","",""));\r
-               schemaTypes.put("token",                new TypeEntry("L0.String",                      "Bindings.STRING", "String", "","",""));\r
-               schemaTypes.put("ID",                   new TypeEntry("L0.String",                      "Bindings.STRING", "String", "","","",true));\r
-               schemaTypes.put("IDREF",                new TypeEntry("L0.String",                      "Bindings.STRING", "String", "","",""));\r
-               schemaTypes.put("date",                 new TypeEntry("XML.Date",                       "org.simantics.xml.sax.base.datatypes.literal.Date.BINDING", "org.simantics.xml.sax.base.datatypes.literal.Date", "","org.simantics.xml.sax.base.datatypes.literal.Date.parseDate(",")"));\r
-               schemaTypes.put("time",                 new TypeEntry("XML.Time",                       "org.simantics.xml.sax.base.datatypes.literal.Time.BINDING", "org.simantics.xml.sax.base.datatypes.literal.Time", "","org.simantics.xml.sax.base.datatypes.literal.Time.parseTime(",")"));\r
-               schemaTypes.put("dateTime",             new TypeEntry("XML.DateTime",           "org.simantics.xml.sax.base.datatypes.literal.DateTime.BINDING", "org.simantics.xml.sax.base.datatypes.literal.DateTime", "","org.simantics.xml.sax.base.datatypes.literal.DateTime.parseDateTime(",")"));\r
-               schemaTypes.put("anyURI",               new TypeEntry("L0.URI",                         "Bindings.STRING", "String", "","",""));\r
-               schemaTypes.put("double",               new TypeEntry("L0.Double",                      "Bindings.DOUBLE", "double", "Double.NaN","Double.parseDouble(",")"));\r
-               schemaTypes.put("float",                new TypeEntry("L0.Float",                       "Bindings.FLOAT",  "float",  "Float.NaN","Float.parseFloat(",")"));\r
-               schemaTypes.put("decimal",              new TypeEntry("L0.Double",                      "Bindings.DOUBLE", "double", "Double.NaN","Double.parseDouble(",")"));\r
-               schemaTypes.put("boolean",              new TypeEntry("L0.Boolean",                     "Bindings.BOOLEAN", "boolean", "false","Boolean.parseBoolean(",")"));\r
-               schemaTypes.put("integer",              new TypeEntry("L0.Integer",             "Bindings.INTEGER", "int", "0","Integer.parseInt(",")"));\r
-               schemaTypes.put("positiveInteger", new TypeEntry("L0.Integer",          "Bindings.INTEGER", "int", "0","Integer.parseInt(",")"));\r
-               schemaTypes.put("nonPositiveInteger", new TypeEntry("L0.Integer",       "Bindings.INTEGER", "int", "0","Integer.parseInt(",")"));\r
-               schemaTypes.put("nonNegativeInteger", new TypeEntry("L0.Integer",       "Bindings.INTEGER", "int", "0","Integer.parseInt(",")"));\r
-               schemaTypes.put("negativeInteger", new TypeEntry("L0.Integer",          "Bindings.INTEGER", "int", "0","Integer.parseInt(",")"));\r
-               schemaTypes.put("unsignedInt",  new TypeEntry("L0.Integer",             "Bindings.INTEGER", "int", "0","Integer.parseInt(",")"));\r
-               schemaTypes.put("int",                  new TypeEntry("L0.Integer",                     "Bindings.INTEGER", "int", "0","Integer.parseInt(",")"));\r
-               schemaTypes.put("short",                new TypeEntry("L0.Integer",                     "Bindings.INTEGER", "int", "0","Integer.parseInt(",")"));\r
-               schemaTypes.put("unsignedShort",new TypeEntry("L0.Integer",                     "Bindings.INTEGER", "int", "0","Integer.parseInt(",")"));\r
-               schemaTypes.put("byte",                 new TypeEntry("L0.Byte",                        "Bindings.BYTE", "byte", "0","Byte.parseByte(",")"));\r
-               schemaTypes.put("unsignedByte", new TypeEntry("L0.Byte",                        "Bindings.BYTE", "byte", "0","Byte.parseByte(",")"));\r
-               schemaTypes.put("long",                 new TypeEntry("L0.Long",                        "Bindings.LONG", "long", "0","Long.parseLong(",")"));\r
-               schemaTypes.put("unsignedLong", new TypeEntry("L0.Long",                        "Bindings.LONG", "long", "0","Long.parseLong(",")"));\r
+               schemaTypes.put("string",               new TypeEntry("L0.String",                      "Bindings.STRING", "java.lang.String", "","","","",""));\r
+               schemaTypes.put("NMTOKEN",              new TypeEntry("L0.String",                      "Bindings.STRING", "java.lang.String", "","","","",""));\r
+               schemaTypes.put("token",                new TypeEntry("L0.String",                      "Bindings.STRING", "java.lang.String", "","","","",""));\r
+               schemaTypes.put("ID",                   new TypeEntry("L0.String",                      "Bindings.STRING", "java.lang.String", "","","","","",true));\r
+               schemaTypes.put("IDREF",                new TypeEntry("L0.String",                      "Bindings.STRING", "java.lang.String", "","","","",""));\r
+               schemaTypes.put("date",                 new TypeEntry("XML.Date",                       "org.simantics.xml.sax.base.datatypes.literal.Date.BINDING", "org.simantics.xml.sax.base.datatypes.literal.Date", "","org.simantics.xml.sax.base.datatypes.literal.Date.parseDate(",")","(",").toString()"));\r
+               schemaTypes.put("time",                 new TypeEntry("XML.Time",                       "org.simantics.xml.sax.base.datatypes.literal.Time.BINDING", "org.simantics.xml.sax.base.datatypes.literal.Time", "","org.simantics.xml.sax.base.datatypes.literal.Time.parseTime(",")","(",").toString()"));\r
+               schemaTypes.put("dateTime",             new TypeEntry("XML.DateTime",           "org.simantics.xml.sax.base.datatypes.literal.DateTime.BINDING", "org.simantics.xml.sax.base.datatypes.literal.DateTime", "","org.simantics.xml.sax.base.datatypes.literal.DateTime.parseDateTime(",")","(",").toString()"));\r
+               schemaTypes.put("anyURI",               new TypeEntry("L0.URI",                         "Bindings.STRING", "java.lang.String", "","","","",""));\r
+               schemaTypes.put("double",               new TypeEntry("L0.Double",                      "Bindings.DOUBLE", "double", "java.lang.Double.NaN","java.lang.Double.parseDouble(",")","java.lang.Double.toString(",")"));\r
+               schemaTypes.put("float",                new TypeEntry("L0.Float",                       "Bindings.FLOAT",  "float",  "java.lang.Float.NaN","java.lang.Float.parseFloat(",")","java.lang.Float.toString(",")"));\r
+               schemaTypes.put("decimal",              new TypeEntry("L0.Double",                      "Bindings.DOUBLE", "double", "java.lang.Double.NaN","java.lang.Double.parseDouble(",")","java.lang.Double.toString(",")"));\r
+               schemaTypes.put("boolean",              new TypeEntry("L0.Boolean",                     "Bindings.BOOLEAN", "boolean", "false","java.lang.Boolean.parseBoolean(",")","java.lang.Boolean.toString(",")"));\r
+               schemaTypes.put("integer",              new TypeEntry("L0.Integer",             "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")"));\r
+               schemaTypes.put("positiveInteger", new TypeEntry("L0.Integer",          "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")"));\r
+               schemaTypes.put("nonPositiveInteger", new TypeEntry("L0.Integer",       "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")"));\r
+               schemaTypes.put("nonNegativeInteger", new TypeEntry("L0.Integer",       "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")"));\r
+               schemaTypes.put("negativeInteger", new TypeEntry("L0.Integer",          "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")"));\r
+               schemaTypes.put("unsignedInt",  new TypeEntry("L0.Integer",             "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")"));\r
+               schemaTypes.put("int",                  new TypeEntry("L0.Integer",                     "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")"));\r
+               schemaTypes.put("short",                new TypeEntry("L0.Integer",                     "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")"));\r
+               schemaTypes.put("unsignedShort",new TypeEntry("L0.Integer",                     "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")","java.lang.Integer.toString(",")"));\r
+               schemaTypes.put("byte",                 new TypeEntry("L0.Byte",                        "Bindings.BYTE", "byte", "0","java.lang.Byte.parseByte(",")","java.lang.Byte.toString(",")"));\r
+               schemaTypes.put("unsignedByte", new TypeEntry("L0.Byte",                        "Bindings.BYTE", "byte", "0","java.lang.Byte.parseByte(",")","java.lang.Byte.toString(",")"));\r
+               schemaTypes.put("long",                 new TypeEntry("L0.Long",                        "Bindings.LONG", "long", "0","java.lang.Long.parseLong(",")","java.lang.Long.toString(",")"));\r
+               schemaTypes.put("unsignedLong", new TypeEntry("L0.Long",                        "Bindings.LONG", "long", "0","java.lang.Long.parseLong(",")","java.lang.Long.toString(",")"));\r
+               schemaTypes.put("base64Binary", new TypeEntry("L0.ByteArray",           "Bindings.BYTE_ARRAY", "byte[]", "new byte[0]","",".getBytes(org.simantics.databoard.util.binary.UTF8.CHARSET)","new java.lang.String(",", org.simantics.databoard.util.binary.UTF8.CHARSET)"));\r
                \r
                \r
                \r
-               l0Types.put("doubleArray",              new TypeEntry("L0.DoubleArray",  "Bindings.DOUBLE_ARRAY", "double[]", null,null,null));\r
-               l0Types.put("stringArray",              new TypeEntry("L0.StringArray",  "Bindings.STRING_ARRAY", "string[]", null,null,null));\r
+               l0Types.put("doubleArray",              new TypeEntry("L0.DoubleArray",  "Bindings.DOUBLE_ARRAY", "double[]", null,null,null,"java.lang.Double.toString(",")"));\r
+               l0Types.put("stringArray",              new TypeEntry("L0.StringArray",  "Bindings.STRING_ARRAY", "string[]", null,null,null,"",""));\r
        }\r
        \r
        \r
@@ -214,10 +217,12 @@ public abstract class SchemaConversionBase {
                        if (attrs instanceof Element) {\r
                                Element element = (Element)attrs;\r
                                SchemaObject obj = new SchemaObject(element);\r
+                               obj.setRename(getRename(element));\r
                                stack.push(obj);\r
                        } else if (attrs instanceof ComplexType) {\r
                                ComplexType complexType = (ComplexType)attrs;\r
                                SchemaObject obj = new SchemaObject(complexType);\r
+                               obj.setRename(getRename(complexType));\r
                                stack.push(obj);\r
                        } else if (attrs instanceof SimpleType) {\r
                                SimpleType simpleType = (SimpleType)attrs;\r
@@ -261,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
@@ -285,7 +307,9 @@ public abstract class SchemaConversionBase {
                                JAXBElement<?> element = (JAXBElement<?>)o;\r
                                Object elemValue = element.getValue();\r
                                if (elemValue instanceof Element) {\r
-                                       stack.add(new SchemaObject(parent,(Element)elemValue));\r
+                                       SchemaObject obj = new SchemaObject(parent,(Element)elemValue);\r
+                                       obj.setRename(getRename((Element)elemValue));\r
+                                       stack.add(obj);\r
                                } else if (elemValue instanceof All) {\r
                                        preload(parent,(All)elemValue, stack);\r
                                } else if (elemValue instanceof ExplicitGroup) {\r
@@ -379,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
@@ -483,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
@@ -507,7 +539,6 @@ public abstract class SchemaConversionBase {
                                Object elemValue = element.getValue();\r
                                if (elemValue instanceof LocalElement) {\r
                                        LocalElement localElement = (LocalElement)elemValue;\r
-                                       \r
                                        elements.add(new SchemaElement(indicator,localElement, ElementType.ELEMENT));\r
                                } else if (elemValue instanceof All) {\r
                                        alls.add(new SchemaElement(indicator,(All)elemValue, ElementType.ALL));\r
@@ -601,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
-                       String refName = 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(elements.get(localElement));\r
-                               handleIndicator(parent, indicator, element, false, refName, localElement);\r
-                               //FIXME:\r
+                               handleElement(eObj);\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
@@ -687,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
@@ -704,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
@@ -812,11 +832,11 @@ public abstract class SchemaConversionBase {
        public UnrecognizedChildElement getUnknown(ComplexType complexType) {\r
                for (JAXBElement<?> e : configuration.getConversionRule()) {\r
                        if (e.getValue() instanceof UnrecognizedChildElement) {\r
-                               UnrecognizedChildElement ref = (UnrecognizedChildElement)e.getValue();\r
-                               org.simantics.xml.sax.configuration.ComplexType complexType2 = ref.getComplexType();\r
+                               UnrecognizedChildElement rule = (UnrecognizedChildElement)e.getValue();\r
+                               org.simantics.xml.sax.configuration.ComplexType complexType2 = rule.getComplexType();\r
                                if (complexType2 != null) {\r
                                        if (complexType.getName().equals(complexType2.getName()))\r
-                                               return ref;\r
+                                               return rule;\r
                                }\r
                        }\r
                }\r
@@ -826,17 +846,65 @@ public abstract class SchemaConversionBase {
        public UnrecognizedChildElement getUnknown(Element element) {\r
                for (JAXBElement<?> e : configuration.getConversionRule()) {\r
                        if (e.getValue() instanceof UnrecognizedChildElement) {\r
-                               UnrecognizedChildElement ref = (UnrecognizedChildElement)e.getValue();\r
-                               org.simantics.xml.sax.configuration.Element element2 = ref.getElement();\r
+                               UnrecognizedChildElement rule = (UnrecognizedChildElement)e.getValue();\r
+                               org.simantics.xml.sax.configuration.Element element2 = rule.getElement();\r
                                if (element2 != null) {\r
                                        if (element.getName().equals(element2.getName()))\r
-                                               return ref;\r
+                                               return rule;\r
+                               }\r
+                       }\r
+               }\r
+               return null;\r
+       }\r
+       \r
+       public Rename getRename(Attribute element) {\r
+               for (JAXBElement<?> e : configuration.getConversionRule()) {\r
+                       if (e.getValue() instanceof Rename) {\r
+                               Rename rule = (Rename)e.getValue();\r
+                               Object ref = rule.getElementOrComplexTypeOrAttribute().get(0);\r
+                               if (!(ref instanceof org.simantics.xml.sax.configuration.Attribute))\r
+                                       continue;\r
+                               org.simantics.xml.sax.configuration.Attribute element2 = (org.simantics.xml.sax.configuration.Attribute)ref;\r
+                               if (element2.getName().equals(element.getName())) {\r
+                                       return rule;\r
+                               }\r
+                       }\r
+               }\r
+               return null;\r
+       }\r
+       \r
+       public Rename getRename(ComplexType element) {\r
+               for (JAXBElement<?> e : configuration.getConversionRule()) {\r
+                       if (e.getValue() instanceof Rename) {\r
+                               Rename rule = (Rename)e.getValue();\r
+                               Object ref = rule.getElementOrComplexTypeOrAttribute().get(0);\r
+                               if (!(ref instanceof org.simantics.xml.sax.configuration.ComplexType))\r
+                                       continue;\r
+                               org.simantics.xml.sax.configuration.ComplexType element2 = (org.simantics.xml.sax.configuration.ComplexType)ref;\r
+                               if (element2.getName().equals(element.getName())) {\r
+                                       return rule;\r
                                }\r
                        }\r
                }\r
                return null;\r
        }\r
        \r
+       public Rename getRename(Element element) {\r
+               for (JAXBElement<?> e : configuration.getConversionRule()) {\r
+                       if (e.getValue() instanceof Rename) {\r
+                               Rename rule = (Rename)e.getValue();\r
+                               Object ref = rule.getElementOrComplexTypeOrAttribute().get(0);\r
+                               if (!(ref instanceof org.simantics.xml.sax.configuration.Element))\r
+                                       continue;\r
+                               org.simantics.xml.sax.configuration.Element element2 = (org.simantics.xml.sax.configuration.Element)ref;\r
+                               if (element2.getName().equals(element.getName())) {\r
+                                       return rule;\r
+                               }\r
+                       }\r
+               }\r
+               return null;\r
+       }\r
+        \r
        \r
        public boolean useOriginalList(SchemaObject parent, SchemaElement indicator, SchemaElement element,  boolean reference, String ref, QName refType) {\r
                if (parent.getName() == null)\r
@@ -940,7 +1008,9 @@ public abstract class SchemaConversionBase {
                boolean id;\r
                String getterPrefix;\r
                String getterPostfix;\r
-               public TypeEntry(String l0Type, String binding, String javaType, String defaultValue, String getterPrefix, String getterPostfix) {\r
+               String stringPrefix;\r
+               String stringPostfix;\r
+               public TypeEntry(String l0Type, String binding, String javaType, String defaultValue, String getterPrefix, String getterPostfix, String stringPrefix, String stringPostfix) {\r
                        super();\r
                        this.l0Type = l0Type;\r
                        this.binding = binding;\r
@@ -949,10 +1019,11 @@ public abstract class SchemaConversionBase {
                        this.id = false;\r
                        this.getterPrefix = getterPrefix;\r
                        this.getterPostfix = getterPostfix;\r
-                       \r
+                       this.stringPrefix = stringPrefix;\r
+                       this.stringPostfix = stringPostfix;\r
                }\r
                \r
-               public TypeEntry(String l0Type, String binding, String javaType, String defaultValue, String getterPrefix, String getterPostfix, boolean id) {\r
+               public TypeEntry(String l0Type, String binding, String javaType, String defaultValue, String getterPrefix, String getterPostfix, String stringPrefix, String stringPostfix, boolean id) {\r
                        super();\r
                        this.l0Type = l0Type;\r
                        this.binding = binding;\r
@@ -961,15 +1032,153 @@ public abstract class SchemaConversionBase {
                        this.id = id;\r
                        this.getterPrefix = getterPrefix;\r
                        this.getterPostfix = getterPostfix;\r
+                       this.stringPrefix = stringPrefix;\r
+                       this.stringPostfix = stringPostfix;\r
                }\r
                \r
-               public String getValueGetter(String name) {\r
+               public String getValueGetterMethod(String name) {\r
                        return getterPrefix + name + ".getValue()"+getterPostfix;\r
                }\r
-               public String getValueGetter() {\r
-                       return getterPrefix + "value"+getterPostfix;\r
+               public String getValueGetter(String name) {\r
+                       return getterPrefix + name+getterPostfix;\r
+               }\r
+               public String getValueGetter()\r
+               {\r
+                       return getValueGetter("value");\r
+               }\r
+               \r
+               public String getToString(String name) {\r
+                       return stringPrefix +"("+javaType+")"+name+stringPostfix;\r
                }\r
                \r
+               public String getElementToString(String name) {\r
+                       return stringPrefix + name+stringPostfix;\r
+               }\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