summaryrefslogtreecommitdiffstats
path: root/sandbox/tools/xmlfromxsd/src/main/java/org/apache/tuscany/tools/xmlfromxsd/generate/SDObasedXMLGenerator.java
diff options
context:
space:
mode:
authordims <dims@13f79535-47bb-0310-9956-ffa450edef68>2008-06-17 00:23:01 +0000
committerdims <dims@13f79535-47bb-0310-9956-ffa450edef68>2008-06-17 00:23:01 +0000
commitbdd0a41aed7edf21ec2a65cfa17a86af2ef8c48a (patch)
tree38a92061c0793434c4be189f1d70c3458b6bc41d /sandbox/tools/xmlfromxsd/src/main/java/org/apache/tuscany/tools/xmlfromxsd/generate/SDObasedXMLGenerator.java
Move Tuscany from Incubator to top level.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@668359 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sandbox/tools/xmlfromxsd/src/main/java/org/apache/tuscany/tools/xmlfromxsd/generate/SDObasedXMLGenerator.java')
-rw-r--r--sandbox/tools/xmlfromxsd/src/main/java/org/apache/tuscany/tools/xmlfromxsd/generate/SDObasedXMLGenerator.java195
1 files changed, 195 insertions, 0 deletions
diff --git a/sandbox/tools/xmlfromxsd/src/main/java/org/apache/tuscany/tools/xmlfromxsd/generate/SDObasedXMLGenerator.java b/sandbox/tools/xmlfromxsd/src/main/java/org/apache/tuscany/tools/xmlfromxsd/generate/SDObasedXMLGenerator.java
new file mode 100644
index 0000000000..f415babca2
--- /dev/null
+++ b/sandbox/tools/xmlfromxsd/src/main/java/org/apache/tuscany/tools/xmlfromxsd/generate/SDObasedXMLGenerator.java
@@ -0,0 +1,195 @@
+/**
+ *
+ * Copyright 2006 The Apache Software Foundation or its licensors as applicable
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tuscany.tools.xmlfromxsd.generate;
+
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.tuscany.sdo.util.SDOUtil;
+
+import commonj.sdo.DataObject;
+import commonj.sdo.Property;
+import commonj.sdo.Sequence;
+import commonj.sdo.Type;
+import commonj.sdo.helper.CopyHelper;
+import commonj.sdo.helper.DataFactory;
+import commonj.sdo.helper.TypeHelper;
+import commonj.sdo.helper.XMLHelper;
+import commonj.sdo.helper.XSDHelper;
+
+/**
+ * This class generates an XML instance given and XSD. All inputs required by this generator are
+ * set into the XMLFromXSDConfiguration object that is passed in the constructor. This generator
+ * first loads the XSD Types into the TypeHelper. Then for the XSD type for which an XML instnace
+ * is to be created, this generator creates SDOs which are then serialized as XML
+ *
+ */
+public class SDObasedXMLGenerator implements XMLGenerator
+{
+ private XMLfromXSDConfiguration config = null;
+
+ private TypeHelper typeHelper = null; //SDOUtil.createTypeHelper();
+
+ private XSDHelper xsdHelper = null; //SDOUtil.createXSDHelper(typeHelper);
+
+ private XMLHelper xmlHelper = null;//SDOUtil.createXMLHelper(typeHelper);
+
+ private Hashtable complexTypesMap = new Hashtable();
+
+ DataFactory dataFactory = SDOUtil.createDataFactory(typeHelper);
+
+ public SDObasedXMLGenerator(XMLfromXSDConfiguration config)
+ {
+ this.config = config;
+ // config.setXsdInputStream(getClass().getResource(conf).openStream());
+ }
+
+
+
+ public void generateXML(XMLfromXSDConfiguration config) throws Exception
+ {
+ this.config = config;
+ generateXML();
+ }
+
+
+
+ public void generateXML() throws Exception
+ {
+ typeHelper = SDOUtil.createTypeHelper();
+ xsdHelper = SDOUtil.createXSDHelper(typeHelper);
+
+ if ( config != null )
+ {
+ List types = xsdHelper.define(config.getXsdInputStream(), null);
+ Type type = typeHelper.getType(config.getSchemaTypeNamespaceURI(),
+ config.getSchemaTypeName());
+
+ if ( type != null )
+ {
+ Object instance = createInstance(type, null);
+ if ( instance != null )
+ {
+ xmlHelper = SDOUtil.createXMLHelper(typeHelper);
+ xmlHelper.save((DataObject) instance,
+ config.getRootElementNamespaceURI(),
+ config.getRootElementLocalName(), config.getXmlOutputStream());
+ }
+ }
+ else
+ {
+ throw new IllegalArgumentException("Incorrect input of SchemaType Namespace / SchemaType to be instantiated as XML!");
+ }
+ }
+ else
+ {
+ throw new Exception("Generation Configuraiton not set - no instnace of XMLFromXSDConfiguration found!");
+ }
+ }
+
+ protected Object createSimpleDataObject(Type type, Object defaultValue)
+ {
+ // FIXME: We need to handle well-know simple types
+ //return SDOUtil.createFromString(type, "0");
+ try
+ {
+ return SDOUtil.createFromString(type,"");
+ }
+ catch ( NumberFormatException nfe )
+ {
+ return SDOUtil.createFromString(type,"0");
+ }
+
+ }
+
+ protected Object createComplexDataObject(Type type, Object defaultValue)
+ {
+ // Type references can be recursive, we need to avoid infinite loop
+ DataObject dataObject = (DataObject) complexTypesMap.get(type);
+ if (dataObject != null)
+ {
+ dataObject = CopyHelper.INSTANCE.copy((DataObject) dataObject);
+ } else
+ {
+ dataObject = dataFactory.create(type);
+ complexTypesMap.put(type, dataObject);
+
+ List properties = type.getProperties();
+ for ( Iterator i = properties.iterator(); i.hasNext(); )
+ {
+ Property property = (Property) i.next();
+ if (!property.isReadOnly())
+ {
+ if (property.isMany())
+ {
+ Object values = dataObject.get(property);
+ if (values instanceof Sequence)
+ {
+ // NOP
+ }
+ if (values instanceof List)
+ {
+ ((List) values).add(createInstance(property
+ .getType(), null));
+ }
+ } else
+ {
+ dataObject.set(property, createInstance(property
+ .getType(), property.getDefault()));
+ }
+ }
+ }
+ }
+ return dataObject;
+ }
+
+ public Object createInstance(Type type, Object defaultValue)
+ {
+ Object dataObject = null;
+ if (type != null)
+ {
+ if (type.isDataType())
+ {
+ if (defaultValue != null)
+ {
+ dataObject = defaultValue;
+ } else
+ {
+ dataObject = createSimpleDataObject(type, defaultValue);
+ }
+
+ } else
+ {
+ dataObject = createComplexDataObject(type, defaultValue);
+ }
+ }
+ return dataObject;
+ }
+
+ public XMLfromXSDConfiguration getConfig()
+ {
+ return config;
+ }
+
+ public void setConfig(XMLfromXSDConfiguration config)
+ {
+ this.config = config;
+ }
+}