]> gerrit.simantics Code Review - simantics/interop.git/blobdiff - org.simantics.xml.sax/src/org/simantics/xml/sax/SchemaConversionBase.java
Initial support for XML export (order of Elements is not kept)
[simantics/interop.git] / org.simantics.xml.sax / src / org / simantics / xml / sax / SchemaConversionBase.java
index bcff6982821b680ebf230e9c4840c5a30dea5901..600d13fd7dc91e35989375d8f3df4afe86fb63bb 100644 (file)
@@ -2,7 +2,6 @@ package org.simantics.xml.sax;
 \r
 import java.util.ArrayDeque;\r
 import java.util.ArrayList;\r
-import java.util.Base64;\r
 import java.util.Deque;\r
 import java.util.HashMap;\r
 import java.util.HashSet;\r
@@ -21,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
@@ -63,38 +63,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", "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(",")"));\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", "java.lang.String", "","",""));\r
-               schemaTypes.put("double",               new TypeEntry("L0.Double",                      "Bindings.DOUBLE", "double", "java.lang.Double.NaN","java.lang.Double.parseDouble(",")"));\r
-               schemaTypes.put("float",                new TypeEntry("L0.Float",                       "Bindings.FLOAT",  "float",  "java.lang.Float.NaN","java.lang.Float.parseFloat(",")"));\r
-               schemaTypes.put("decimal",              new TypeEntry("L0.Double",                      "Bindings.DOUBLE", "double", "java.lang.Double.NaN","java.lang.Double.parseDouble(",")"));\r
-               schemaTypes.put("boolean",              new TypeEntry("L0.Boolean",                     "Bindings.BOOLEAN", "boolean", "false","java.lang.Boolean.parseBoolean(",")"));\r
-               schemaTypes.put("integer",              new TypeEntry("L0.Integer",             "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")"));\r
-               schemaTypes.put("positiveInteger", new TypeEntry("L0.Integer",          "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")"));\r
-               schemaTypes.put("nonPositiveInteger", new TypeEntry("L0.Integer",       "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")"));\r
-               schemaTypes.put("nonNegativeInteger", new TypeEntry("L0.Integer",       "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")"));\r
-               schemaTypes.put("negativeInteger", new TypeEntry("L0.Integer",          "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")"));\r
-               schemaTypes.put("unsignedInt",  new TypeEntry("L0.Integer",             "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")"));\r
-               schemaTypes.put("int",                  new TypeEntry("L0.Integer",                     "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")"));\r
-               schemaTypes.put("short",                new TypeEntry("L0.Integer",                     "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")"));\r
-               schemaTypes.put("unsignedShort",new TypeEntry("L0.Integer",                     "Bindings.INTEGER", "int", "0","java.lang.Integer.parseInt(",")"));\r
-               schemaTypes.put("byte",                 new TypeEntry("L0.Byte",                        "Bindings.BYTE", "byte", "0","java.lang.Byte.parseByte(",")"));\r
-               schemaTypes.put("unsignedByte", new TypeEntry("L0.Byte",                        "Bindings.BYTE", "byte", "0","java.lang.Byte.parseByte(",")"));\r
-               schemaTypes.put("long",                 new TypeEntry("L0.Long",                        "Bindings.LONG", "long", "0","java.lang.Long.parseLong(",")"));\r
-               schemaTypes.put("unsignedLong", new TypeEntry("L0.Long",                        "Bindings.LONG", "long", "0","java.lang.Long.parseLong(",")"));\r
-               schemaTypes.put("base64Binary", new TypeEntry("L0.ByteArray",           "Bindings.BYTE_ARRAY", "byte[]", "new byte[0]","",".getBytes(org.simantics.databoard.util.binary.UTF8.CHARSET)"));\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
@@ -216,10 +216,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
@@ -287,7 +289,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
@@ -509,7 +513,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
@@ -603,14 +606,14 @@ 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); // 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
                        QName refType = localElement.getType();\r
                        if (refType != null)\r
                                handleIndicator(parent, indicator, element, false, refName, refType);\r
                        else {\r
-                               handleElement(elements.get(localElement));\r
+                               handleElement(eObj);\r
                                handleIndicator(parent, indicator, element, false, refName, localElement);\r
-                               //FIXME:\r
                        }\r
                } else if (localElement.getRef() != null) {\r
                        QName refType = localElement.getRef();\r
@@ -814,11 +817,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
@@ -828,17 +831,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
@@ -942,7 +993,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
@@ -951,10 +1004,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
@@ -963,6 +1017,8 @@ 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 getValueGetterMethod(String name) {\r
@@ -976,6 +1032,14 @@ public abstract class SchemaConversionBase {
                        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
 }\r