You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by an...@apache.org on 2006/08/27 12:12:01 UTC

svn commit: r437356 [1/3] - in /incubator/tuscany/java/sca/containers/container.javascript: ./ src/main/java/org/apache/tuscany/container/javascript/ src/main/java/org/apache/tuscany/container/javascript/rhino/ src/main/java/org/apache/tuscany/containe...

Author: antelder
Date: Sun Aug 27 03:11:58 2006
New Revision: 437356

URL: http://svn.apache.org/viewvc?rev=437356&view=rev
Log:
TUSCANY-418, Patch from Venkat - JavaScript enhancements 
Port E4X support from M1 plus support for E4X references and XML instances

Added:
    incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptRefInvocInterceptor.java   (with props)
    incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptReferenceProxy.java   (with props)
    incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/
    incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/
    incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/CmdLineArgsHandler.java   (with props)
    incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/CmdLineArgsProcessor.java   (with props)
    incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/TuscanySampleXmlUtil.java   (with props)
    incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/XBbasedXMLGenerator.java   (with props)
    incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/XMLGenerator.java   (with props)
    incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/XMLGeneratorFactory.java   (with props)
    incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/XMLfromXSDConfiguration.java   (with props)
    incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/XMLfromXSDGenerator.java   (with props)
    incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/XmlInstanceCreationException.java   (with props)
    incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/XmlInstanceRegistry.java   (with props)
    incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/XmlInstanceRegistryImpl.java   (with props)
    incubator/tuscany/java/sca/containers/container.javascript/src/test/java/helloworld/HelloWorldServiceImpl.java   (with props)
    incubator/tuscany/java/sca/containers/container.javascript/src/test/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/
    incubator/tuscany/java/sca/containers/container.javascript/src/test/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/XMLfromXSDGeneratorTestCase.java   (with props)
    incubator/tuscany/java/sca/containers/container.javascript/src/test/resources/AccountService.wsdl   (with props)
    incubator/tuscany/java/sca/containers/container.javascript/src/test/resources/interopdoc.wsdl   (with props)
    incubator/tuscany/java/sca/containers/container.javascript/src/test/resources/org/apache/tuscany/container/javascript/function/e4x.componentType
    incubator/tuscany/java/sca/containers/container.javascript/src/test/resources/org/apache/tuscany/container/javascript/function/e4x.js   (with props)
    incubator/tuscany/java/sca/containers/container.javascript/src/test/resources/sequences.xsd   (with props)
Modified:
    incubator/tuscany/java/sca/containers/container.javascript/pom.xml
    incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptComponent.java
    incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptComponentBuilder.java
    incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/rhino/RhinoFunctionInvoker.java
    incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/rhino/RhinoScript.java
    incubator/tuscany/java/sca/containers/container.javascript/src/main/resources/META-INF/sca/default.scdl
    incubator/tuscany/java/sca/containers/container.javascript/src/main/resources/META-INF/sca/js.system.scdl
    incubator/tuscany/java/sca/containers/container.javascript/src/test/java/helloworld/HelloWorldService.java
    incubator/tuscany/java/sca/containers/container.javascript/src/test/java/org/apache/tuscany/container/javascript/function/HelloWorldTestCase.java
    incubator/tuscany/java/sca/containers/container.javascript/src/test/java/org/apache/tuscany/container/javascript/rhino/RhinoFunctionInvokerTestCase.java
    incubator/tuscany/java/sca/containers/container.javascript/src/test/resources/org/apache/tuscany/container/javascript/function/HelloWorld.componentType
    incubator/tuscany/java/sca/containers/container.javascript/src/test/resources/org/apache/tuscany/container/javascript/function/helloworld.scdl
    incubator/tuscany/java/sca/containers/container.javascript/src/test/resources/org/apache/tuscany/container/javascript/rhino/helloworld.wsdl

Modified: incubator/tuscany/java/sca/containers/container.javascript/pom.xml
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.javascript/pom.xml?rev=437356&r1=437355&r2=437356&view=diff
==============================================================================
--- incubator/tuscany/java/sca/containers/container.javascript/pom.xml (original)
+++ incubator/tuscany/java/sca/containers/container.javascript/pom.xml Sun Aug 27 03:11:58 2006
@@ -82,6 +82,34 @@
             <groupId>org.easymock</groupId>
             <artifactId>easymockclassextension</artifactId>
         </dependency>
+        <dependency>
+			<groupId>ws-commons</groupId>
+			<artifactId>axiom-api</artifactId>
+			<version>1.0</version>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>ws-commons</groupId>
+			<artifactId>axiom-impl</artifactId>
+			<version>1.0</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+            <groupId>commons-logging</groupId>
+            <artifactId>commons-logging</artifactId>
+            <version>1.0.4</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>woodstox</groupId>
+            <artifactId>wstx-asl</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cglib</groupId>
+            <artifactId>cglib-nodep</artifactId>
+            <version>2.1_3</version>
+            <scope>compile</scope>
+        </dependency>
 
     </dependencies>
 

Modified: incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptComponent.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptComponent.java?rev=437356&r1=437355&r2=437356&view=diff
==============================================================================
--- incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptComponent.java (original)
+++ incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptComponent.java Sun Aug 27 03:11:58 2006
@@ -65,7 +65,19 @@
 
         for (List<OutboundWire> referenceWires : getOutboundWires().values()) {
             for (OutboundWire<?> wire : referenceWires) {
-                context.put(wire.getReferenceName(), wireService.createProxy(wire));
+                 Object wireProxy = wireService.createProxy(wire);
+                //since all types that may be used in the reference interface may not be known to Rhino
+                //using the wireProxy as is will fail result in type conversion exceptions in cases where
+                //Rhino does not know enough of the tpypes used.  Hence introduce a interceptor proxy, 
+                //with weak typing (java.lang.Object) so that Rhino's call to the proxy succeeds.  Then
+                //within this interceptor proxy perform data mediations required to correctly call the 
+                //referenced service.                
+                JavaScriptReferenceProxy interceptingProxy = 
+                    new JavaScriptReferenceProxy(wire.getBusinessInterface(), 
+                                                 wireProxy, 
+                                                 rhinoScript.createInstanceScope(context));
+                context.put(wire.getReferenceName(),  interceptingProxy.createProxy());
+
             }
         }
 

Modified: incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptComponentBuilder.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptComponentBuilder.java?rev=437356&r1=437355&r2=437356&view=diff
==============================================================================
--- incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptComponentBuilder.java (original)
+++ incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptComponentBuilder.java Sun Aug 27 03:11:58 2006
@@ -21,8 +21,11 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.tuscany.container.javascript.rhino.RhinoScript;
+import org.apache.tuscany.container.javascript.utils.xmlfromxsd.XmlInstanceRegistry;
+import org.apache.tuscany.spi.annotation.Autowire;
 import org.apache.tuscany.spi.builder.BuilderConfigException;
 import org.apache.tuscany.spi.component.Component;
 import org.apache.tuscany.spi.component.CompositeComponent;
@@ -32,12 +35,30 @@
 import org.apache.tuscany.spi.model.ComponentDefinition;
 import org.apache.tuscany.spi.model.Scope;
 import org.apache.tuscany.spi.model.ServiceDefinition;
+import org.apache.xmlbeans.XmlObject;
+import org.osoa.sca.annotations.Constructor;
 
 /**
  * Extension point for creating {@link JavaScriptComponent}s from an assembly configuration
  */
 public class JavaScriptComponentBuilder extends ComponentBuilderExtension<JavaScriptImplementation> {
 
+    private static String head = "var xmlInstanceMap = new Array();";
+    private static String part1 = "xmlInstanceMap[\"";
+    private static String part2 = "\"] = ";
+    private static String part3 = ";";
+    
+    private static String getXmlObjectFunction = 
+        "function getXmlObject(xmlElementNamespace, xmlElementName){\n" +
+        "return xmlInstanceMap[xmlElementNamespace + \"#\" + xmlElementName];\n}";
+    
+    XmlInstanceRegistry xmlInstRegistry;
+
+    @Constructor({"xmlInstRegistry"})
+    public JavaScriptComponentBuilder(@Autowire XmlInstanceRegistry reg) {
+        this.xmlInstRegistry = reg;
+    }
+
     protected Class<JavaScriptImplementation> getImplementationType() {
         return JavaScriptImplementation.class;
     }
@@ -55,6 +76,8 @@
         List<Class<?>> services = new ArrayList<Class<?>>(collection.size());
         for (ServiceDefinition serviceDefinition : collection) {
             services.add(serviceDefinition.getServiceContract().getInterfaceClass());
+            //do this for the set of references also
+            enhanceRhinoScript(serviceDefinition, implementation);       
         }
 
         RhinoScript rhinoScript = implementation.getRhinoScript();
@@ -69,6 +92,49 @@
         }
 
         return new JavaScriptComponent(name, rhinoScript, services, parent, scopeContainer, wireService, workContext);
+    }
+
+    private void enhanceRhinoScript(ServiceDefinition serviceDefn, JavaScriptImplementation implementation) throws BuilderConfigException {
+        //if the service interface of the component is a wsdl get the wsdl interface and generate 
+        //xml instances for the elements in it.  Add these xml instances to the rhinoscript.
+        //TODO : when interface.wsdl and wsdl registry is integrated remove this hardcoding and 
+        //obtain wsdl from the interface.wsdl or wsdl registry
+        String wsdlPath = "org/apache/tuscany/container/javascript/rhino/helloworld.wsdl";
+
+        //this if block is a tempfix to get other testcases working. Again when a the interface.wsdl 
+        //extension is in place this will be deleted.  Right now this is the only way we know that 
+        //a js has to do with an interface that is wsdl.
+        if (!implementation.getRhinoScript().getScriptName().endsWith("e4x.js")) {
+            return;
+        }
+
+        try {
+            Map<String, XmlObject> xmlInstanceMap = xmlInstRegistry.getXmlInstance(wsdlPath);
+            StringBuffer sb = new StringBuffer();
+
+            sb.append(head);
+            sb.append("\n");
+            for (String xmlInstanceKey : xmlInstanceMap.keySet()) {
+                sb.append(part1);
+                sb.append(xmlInstanceKey);
+                sb.append(part2);
+                sb.append(xmlInstanceMap.get(xmlInstanceKey).toString());
+                sb.append(part3);
+                sb.append("\n");
+            }
+            // System.out.println(" **** - " + sb.toString());
+
+            sb.append(getXmlObjectFunction);
+
+            RhinoScript rhinoScript = implementation.getRhinoScript();
+            sb.append(rhinoScript.getScript());
+            rhinoScript.setScript(sb.toString());
+            rhinoScript.initScriptScope(rhinoScript.getScriptName(), sb.toString(), null, rhinoScript.getClassLoader());
+            implementation.setRhinoScript(rhinoScript);
+
+        } catch (Exception e) {
+            throw new BuilderConfigException(e);
+        }
     }
 
 }

Added: incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptRefInvocInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptRefInvocInterceptor.java?rev=437356&view=auto
==============================================================================
--- incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptRefInvocInterceptor.java (added)
+++ incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptRefInvocInterceptor.java Sun Aug 27 03:11:58 2006
@@ -0,0 +1,132 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.container.javascript;
+
+import java.io.ByteArrayInputStream;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.axiom.om.OMAbstractFactory;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.impl.builder.StAXOMBuilder;
+import org.apache.axiom.om.util.StAXUtils;
+import org.apache.xmlbeans.XmlObject;
+import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Scriptable;
+import org.mozilla.javascript.ScriptableObject;
+import org.mozilla.javascript.Wrapper;
+import org.mozilla.javascript.xml.XMLObject;
+
+/**
+ * This Interceptor encasulates the data mediation required  by the JavaScriptReferenceProxy.  The 
+ * invocation handler of this class traps the javascript reference calls, performs data mediation 
+ * and calls then calls the actual referred service.  This classes implementation is subject to 
+ * review and change when the DataMediation infrastructure of Tuscany is ready.
+ *
+ */
+public class JavaScriptRefInvocInterceptor implements InvocationHandler {
+    private Object actualProxy;
+
+    private Class wireInterface;
+
+    private Scriptable instanceScope;
+
+    JavaScriptRefInvocInterceptor(Object wireProxy, Class wireIfc, Scriptable instScope) {
+        this.actualProxy = wireProxy;
+        this.wireInterface = wireIfc;
+        this.instanceScope = instScope;
+    }
+
+    public Object invoke(Object arg0, Method method, Object[] args) throws Throwable {
+        // TODO Auto-generated method stub
+        Context cx = Context.enter();
+        try {
+            Method invokedMethod = getInvokedMethod(method.getName());
+            Object[] tranformedArgs = new Object[args.length];
+            for (int count = 0; count < args.length; ++count) {
+                tranformedArgs[count] = fromJavaScript(invokedMethod.getParameterTypes()[count], args[count]);
+            }
+
+            Object response = invokedMethod.invoke(actualProxy, tranformedArgs);
+            response = toJavaScript(response, instanceScope, cx);
+            return response;
+        } finally {
+            Context.exit();
+        }
+    }
+
+    private Method getInvokedMethod(String methodName) {
+        Method[] methods = wireInterface.getMethods();
+
+        for (int count = 0; count < methods.length; ++count) {
+            if (methods[count].getName().equals(methodName)) {
+                return methods[count];
+            }
+        }
+        throw new RuntimeException("Unable to find invocation method");
+    }
+
+    protected Object fromJavaScript(Class reqArgType, Object jsArg) throws Exception {
+        Object javaArg;
+        if (Context.getUndefinedValue().equals(jsArg)) {
+            javaArg = null;
+        } else if (jsArg instanceof XMLObject) {
+            // TODO: E4X Bug? Shouldn't need this copy, but without it the outer element gets lost???
+            Scriptable jsXML = (Scriptable) ScriptableObject.callMethod((Scriptable) jsArg, "copy", new Object[0]);
+            Wrapper wrapper = (Wrapper) ScriptableObject.callMethod(jsXML, "getXmlObject", new Object[0]);
+            javaArg = wrapper.unwrap();
+
+            XMLStreamReader xmlReader = StAXUtils.createXMLStreamReader(new ByteArrayInputStream(javaArg.toString().getBytes()));
+            StAXOMBuilder staxOMBuilder = new StAXOMBuilder(OMAbstractFactory.getOMFactory(), xmlReader);
+            javaArg = staxOMBuilder.getDocumentElement();
+        } else if (jsArg instanceof Wrapper) {
+            javaArg = ((Wrapper) jsArg).unwrap();
+        } else {
+            if (reqArgType != null) {
+                javaArg = Context.jsToJava(jsArg, reqArgType);
+            } else {
+                javaArg = Context.jsToJava(jsArg, String.class);
+            }
+        }
+
+        return javaArg;
+    }
+
+    protected Object toJavaScript(Object retVal, Scriptable scope, Context cx) throws RuntimeException {
+        Object jsRetVal;
+        if (retVal instanceof OMElement) {
+            try {
+                XmlObject xmlObject = XmlObject.Factory.parse(retVal.toString());
+                Object jsXML = cx.getWrapFactory().wrap(cx, scope, xmlObject, XmlObject.class);
+                jsRetVal = cx.newObject(scope, "XML", new Object[] { jsXML });
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        } else if (retVal instanceof XmlObject) {
+            Object jsXML = cx.getWrapFactory().wrap(cx, scope, (XmlObject) retVal, XmlObject.class);
+            jsRetVal = cx.newObject(scope, "XML", new Object[] { jsXML });
+        } else {
+            jsRetVal = Context.toObject(retVal, scope);
+        }
+
+        return jsRetVal;
+    }
+}

Propchange: incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptRefInvocInterceptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptRefInvocInterceptor.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptReferenceProxy.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptReferenceProxy.java?rev=437356&view=auto
==============================================================================
--- incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptReferenceProxy.java (added)
+++ incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptReferenceProxy.java Sun Aug 27 03:11:58 2006
@@ -0,0 +1,132 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.container.javascript;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+
+import net.sf.cglib.asm.ClassWriter;
+import net.sf.cglib.asm.CodeVisitor;
+import net.sf.cglib.asm.Constants;
+import net.sf.cglib.asm.Type;
+
+import org.apache.tuscany.spi.wire.WireInvocationHandler;
+import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Scriptable;
+import org.mozilla.javascript.ScriptableObject;
+import org.mozilla.javascript.Wrapper;
+import org.mozilla.javascript.xml.XMLObject;
+
+/**
+ * This is a proxy that will mediate reference calls from the JavaScript. The mediation code here will be reviewed when the DataMediation
+ * infrastructure is ready. This proxy assmes that there is no verloading of service methods on the reference interface i.e. there are no two service
+ * methods that have the same method name or operation name.
+ */
+public class JavaScriptReferenceProxy {
+
+    private Class interfaze;
+
+    private Object wireProxy;
+
+    private Scriptable instanceScope;
+
+    public JavaScriptReferenceProxy(Class interfaze, Object wireProxy, Scriptable instScope) {
+        this.interfaze = interfaze;
+        this.wireProxy = wireProxy;
+        this.instanceScope = instScope;
+    }
+
+    public Object createProxy() {
+        try {
+            GenericProxyClassLoader classloader = new GenericProxyClassLoader();
+            final byte[] byteCode = generateGenericInterface(interfaze);
+
+            Class genericInterface = classloader.defineClass(byteCode);
+            InvocationHandler proxyHandler = new JavaScriptRefInvocInterceptor(wireProxy,
+                    interfaze, instanceScope);
+            // return genericInterface.cast(Proxy.newProxyInstance(classloader, new Class[]{genericInterface}, proxyHandler));
+            return Proxy.newProxyInstance(classloader,
+                                          new Class[]{genericInterface},
+                                          proxyHandler);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    private static byte[] generateGenericInterface(Class serviceInterface) {
+        String interfazeName = serviceInterface.getCanonicalName();
+        ClassWriter cw = new ClassWriter(false);
+
+        cw.visit(Constants.V1_5,
+                 Constants.ACC_PUBLIC + Constants.ACC_ABSTRACT + Constants.ACC_INTERFACE,
+                 interfazeName.replace('.',
+                                       '/'),
+                 "java/lang/Object",
+                 null,
+                 serviceInterface.getSimpleName() + ".java");
+
+        StringBuffer argsAndReturn = new StringBuffer("(");
+        Method[] methods = serviceInterface.getMethods();
+        for (int count = 0; count < methods.length; ++count) {
+            argsAndReturn = new StringBuffer("(");
+            Class[] paramTypes = methods[count].getParameterTypes();
+            Class returnType = methods[count].getReturnType();
+
+            for (int paramCount = 0; paramCount < paramTypes.length; ++paramCount) {
+                argsAndReturn.append(Type.getType(Object.class));
+            }
+            argsAndReturn.append(")");
+            argsAndReturn.append(Type.getType(Object.class));
+
+            Class[] exceptionTypes = methods[count].getExceptionTypes();
+            String[] exceptions = new String[exceptionTypes.length];
+            for (int excCount = 0; excCount < exceptionTypes.length; ++excCount) {
+                exceptions[excCount] = exceptionTypes[excCount].getName();
+                exceptions[excCount] = exceptions[excCount].replace('.',
+                                                                    '/');
+            }
+
+            CodeVisitor cv = cw.visitMethod(Constants.ACC_PUBLIC + Constants.ACC_ABSTRACT,
+                                            methods[count].getName(),
+                                            argsAndReturn.toString(),
+                                            exceptions,
+                                            null);
+            cw.visitEnd();
+        }
+
+        cw.visitEnd();
+
+        return cw.toByteArray();
+    }
+
+    private class GenericProxyClassLoader extends ClassLoader {
+        public Class defineClass(byte[] byteArray) {
+            try {
+                return defineClass(null,
+                                   byteArray,
+                                   0,
+                                   byteArray.length);
+            } catch (Throwable e) {
+                return null;
+            }
+        }
+
+    }
+}

Propchange: incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptReferenceProxy.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/JavaScriptReferenceProxy.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/rhino/RhinoFunctionInvoker.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/rhino/RhinoFunctionInvoker.java?rev=437356&r1=437355&r2=437356&view=diff
==============================================================================
--- incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/rhino/RhinoFunctionInvoker.java (original)
+++ incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/rhino/RhinoFunctionInvoker.java Sun Aug 27 03:11:58 2006
@@ -18,6 +18,14 @@
  */
 package org.apache.tuscany.container.javascript.rhino;
 
+import java.io.ByteArrayInputStream;
+
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.axiom.om.OMAbstractFactory;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.impl.builder.StAXOMBuilder;
+import org.apache.axiom.om.util.StAXUtils;
 import org.apache.xmlbeans.XmlObject;
 import org.mozilla.javascript.Context;
 import org.mozilla.javascript.Function;
@@ -52,17 +60,28 @@
             Object response = fromJavaScript(jsResponse);
             return response;
 
-        } finally {
+        } catch ( Exception e ) {
+            throw new RuntimeException(e);
+        }
+        finally {
             Context.exit();
         }
     }
 
-    protected Object[] toJavaScript(Object[] arg, Scriptable scope, Context cx) {
+    protected Object[] toJavaScript(Object[] arg, Scriptable scope, Context cx) throws RuntimeException {
         Object[] jsArgs;
         if (arg == null) {
             jsArgs = new Object[0];
+        }  else if (arg.length == 1 && arg[0] instanceof OMElement) {
+            try {
+                XmlObject xmlObject = XmlObject.Factory.parse(arg[0].toString());
+                Object jsXML = cx.getWrapFactory().wrap(cx, scope, xmlObject, XmlObject.class);
+                jsArgs = new Object[] { cx.newObject(scope, "XML", new Object[] { jsXML }) };
+            } catch ( Exception e ) {
+                throw new RuntimeException(e);
+            } 
         } else if (arg.length == 1 && arg[0] instanceof XmlObject) {
-            Object jsXML = cx.getWrapFactory().wrap(cx, scope, (XmlObject) arg[0], XmlObject.class);
+            Object jsXML = cx.getWrapFactory().wrap(cx, scope, (XmlObject)arg[0], XmlObject.class);
             jsArgs = new Object[] { cx.newObject(scope, "XML", new Object[] { jsXML }) };
         } else {
             jsArgs = new Object[arg.length];
@@ -70,10 +89,11 @@
                 jsArgs[i] = Context.toObject(arg[i], scope);
             }
         }
+        
         return jsArgs;
     }
 
-    protected Object fromJavaScript(Object o) {
+    protected Object fromJavaScript(Object o) throws Exception {
         Object response;
         if (Context.getUndefinedValue().equals(o)) {
             response = null;
@@ -82,6 +102,12 @@
             Scriptable jsXML = (Scriptable) ScriptableObject.callMethod((Scriptable) o, "copy", new Object[0]);
             Wrapper wrapper = (Wrapper) ScriptableObject.callMethod(jsXML, "getXmlObject", new Object[0]);
             response = wrapper.unwrap();
+            
+            XMLStreamReader xmlReader = 
+                StAXUtils.createXMLStreamReader(new ByteArrayInputStream(response.toString().getBytes()));
+            StAXOMBuilder staxOMBuilder = new StAXOMBuilder(OMAbstractFactory.getOMFactory(), xmlReader);
+            response = staxOMBuilder.getDocumentElement();
+            
         } else if (o instanceof Wrapper) {
             response = ((Wrapper) o).unwrap();
         } else {

Modified: incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/rhino/RhinoScript.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/rhino/RhinoScript.java?rev=437356&r1=437355&r2=437356&view=diff
==============================================================================
--- incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/rhino/RhinoScript.java (original)
+++ incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/rhino/RhinoScript.java Sun Aug 27 03:11:58 2006
@@ -118,7 +118,7 @@
     /**
      * Initialize the Rhino Scope for this script instance
      */
-    protected Scriptable createInstanceScope(Map<String, Object> context) {
+    public Scriptable createInstanceScope(Map<String, Object> context) {
         Context cx = Context.enter();
         try {
 
@@ -138,7 +138,7 @@
     /**
      * Create a Rhino scope and compile the script into it
      */
-    protected void initScriptScope(String fileName, String scriptCode, Map context, ClassLoader cl) {
+    public void initScriptScope(String fileName, String scriptCode, Map context, ClassLoader cl) {
         Context cx = Context.enter();
         try {
             if (cl != null) {
@@ -201,6 +201,10 @@
     
     public RhinoSCAConfig getSCAConfig() {
         return new RhinoSCAConfig(getScriptScope());
+    }
+
+    public void setScript(String script) {
+        this.script = script;
     }
 
 }

Added: incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/CmdLineArgsHandler.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/CmdLineArgsHandler.java?rev=437356&view=auto
==============================================================================
--- incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/CmdLineArgsHandler.java (added)
+++ incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/CmdLineArgsHandler.java Sun Aug 27 03:11:58 2006
@@ -0,0 +1,26 @@
+/**
+ *
+ * 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.container.javascript.utils.xmlfromxsd;
+
+/**
+ * This interface is to be implemented by classes that wish to 
+ * handle commandline arguments.  
+ *
+ */
+public interface CmdLineArgsHandler {
+    public void handleArgument(String optionFlag, String argValue) throws IllegalArgumentException;
+}

Propchange: incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/CmdLineArgsHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/CmdLineArgsHandler.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/CmdLineArgsProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/CmdLineArgsProcessor.java?rev=437356&view=auto
==============================================================================
--- incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/CmdLineArgsProcessor.java (added)
+++ incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/CmdLineArgsProcessor.java Sun Aug 27 03:11:58 2006
@@ -0,0 +1,77 @@
+/**
+ *
+ * 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.container.javascript.utils.xmlfromxsd;
+
+/**
+ * This class provides a generic command line arguments processing utility.  The processArgs
+ * method of this class processes the command line arguments that could contain option flags, 
+ * options and values and calls a ArgumentHanlder instance for handling the agruments. 
+ *
+ */
+public class CmdLineArgsProcessor {
+    private String printUsageMessage = "No hints available on Usage!";
+
+    private CmdLineArgsHandler argsHandler = null;
+
+    public static final String HYPEN = "-";
+
+    public void processArgs(String[] args) {
+        try {
+            if (args.length == 0) {
+                printUsage();
+            } else {
+                parseAndHandleArgs(args);
+            }
+        } catch (Exception e) {
+            System.out.println("Exception in processing argument - " + e);
+            printUsage();
+        }
+
+    }
+
+    public void parseAndHandleArgs(String[] args) throws Exception {
+        int index = 0;
+        while (index < args.length - 1) {
+            if (args[index].startsWith(HYPEN) && !args[index + 1].startsWith(HYPEN)) {
+                argsHandler.handleArgument(args[index].substring(1), args[index + 1]);
+                index = index + 2;
+            } else {
+                throw new IllegalArgumentException("Wrong Usage of options!");
+            }
+        }
+    }
+
+    protected void printUsage() {
+
+    }
+
+    public CmdLineArgsHandler getArgsHandler() {
+        return argsHandler;
+    }
+
+    public void setArgsHandler(CmdLineArgsHandler argsHandler) {
+        this.argsHandler = argsHandler;
+    }
+
+    public String getPrintUsageMessage() {
+        return printUsageMessage;
+    }
+
+    public void setPrintUsageMessage(String printUsageMessage) {
+        this.printUsageMessage = printUsageMessage;
+    }
+}

Propchange: incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/CmdLineArgsProcessor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/CmdLineArgsProcessor.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/TuscanySampleXmlUtil.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/TuscanySampleXmlUtil.java?rev=437356&view=auto
==============================================================================
--- incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/TuscanySampleXmlUtil.java (added)
+++ incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/TuscanySampleXmlUtil.java Sun Aug 27 03:11:58 2006
@@ -0,0 +1,1079 @@
+package org.apache.tuscany.container.javascript.utils.xmlfromxsd;
+
+import org.apache.xmlbeans.SchemaType;
+import org.apache.xmlbeans.XmlCursor;
+import org.apache.xmlbeans.SchemaParticle;
+import org.apache.xmlbeans.SchemaLocalElement;
+import org.apache.xmlbeans.SchemaProperty;
+import org.apache.xmlbeans.GDuration;
+import org.apache.xmlbeans.GDurationBuilder;
+import org.apache.xmlbeans.GDate;
+import org.apache.xmlbeans.GDateBuilder;
+import org.apache.xmlbeans.XmlAnySimpleType;
+import org.apache.xmlbeans.SimpleValue;
+import org.apache.xmlbeans.XmlOptions;
+import org.apache.xmlbeans.XmlObject;
+import org.apache.xmlbeans.XmlInteger;
+import org.apache.xmlbeans.XmlDate;
+import org.apache.xmlbeans.XmlDateTime;
+import org.apache.xmlbeans.XmlTime;
+import org.apache.xmlbeans.XmlGYear;
+import org.apache.xmlbeans.XmlGYearMonth;
+import org.apache.xmlbeans.XmlGMonth;
+import org.apache.xmlbeans.XmlGMonthDay;
+import org.apache.xmlbeans.XmlGDay;
+import org.apache.xmlbeans.XmlDecimal;
+import org.apache.xmlbeans.XmlDuration;
+import org.apache.xmlbeans.soap.SchemaWSDLArrayType;
+import org.apache.xmlbeans.soap.SOAPArrayType;
+import org.apache.xmlbeans.impl.util.Base64;
+import org.apache.xmlbeans.impl.util.HexBin;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Random;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.Arrays;
+
+import javax.xml.namespace.QName;
+
+/**
+ * This class is a replication of the XMLBeans SampleXMLutil class.  This replication
+ * is required to overide the XMLBeans behaviour of this class in certain places.  Since
+ * most methods of the XMLBeans implementation of this class is private, no overiding 
+ * has been possible using inheritance.  Hence this replication.
+ *
+ */
+public class TuscanySampleXmlUtil {
+    private static final String BLANK_STRING = " ";
+
+    private boolean generate_sample_data = false;
+
+    private boolean _soapEnc;
+
+    private static final int MAX_ELEMENTS = 1000;
+
+    private int _nElements;
+
+    boolean flag = true;
+
+    private TuscanySampleXmlUtil(boolean soapEnc) {
+        _soapEnc = soapEnc;
+    }
+
+    public TuscanySampleXmlUtil() {
+        this(false);
+    }
+
+    public String createSampleForType(SchemaType sType) {
+        XmlObject object = XmlObject.Factory.newInstance();
+        XmlCursor cursor = object.newCursor();
+        // Skip the document node
+        cursor.toNextToken();
+        // Using the type and the cursor, call the utility method to get a
+        // sample XML payload for that Schema element
+        createSampleForType(sType, cursor);
+        // Cursor now contains the sample payload
+        // Pretty print the result.  Note that the cursor is positioned at the
+        // end of the doc so we use the original xml object that the cursor was
+        // created upon to do the xmlText() against.
+        XmlOptions options = new XmlOptions();
+        options.put(XmlOptions.SAVE_PRETTY_PRINT);
+        options.put(XmlOptions.SAVE_PRETTY_PRINT_INDENT, 2);
+        options.put(XmlOptions.SAVE_AGGRESSIVE_NAMESPACES);
+        String result = object.xmlText(options);
+        return result;
+    }
+
+    Random _picker = new Random(1);
+
+    /**
+     * Cursor position
+     * Before:
+     * <theElement>^</theElement>
+     * After:
+     * <theElement><lots of stuff/>^</theElement>
+     */
+    private void createSampleForType(SchemaType stype, XmlCursor xmlc) {
+        if (_typeStack.contains(stype))
+            //if ( !flag )
+            return;
+        //else
+        //	flag = false;
+
+        _typeStack.add(stype);
+
+        try {
+            if (stype.isSimpleType() || stype.isURType()) {
+                processSimpleType(stype, xmlc);
+                return;
+            }
+
+            // complex Type
+            // <theElement>^</theElement>
+            processAttributes(stype, xmlc);
+
+            // <theElement attri1="string">^</theElement>
+            switch (stype.getContentType()) {
+            case SchemaType.NOT_COMPLEX_TYPE:
+            case SchemaType.EMPTY_CONTENT:
+                // noop
+                break;
+            case SchemaType.SIMPLE_CONTENT: {
+                processSimpleType(stype, xmlc);
+            }
+                break;
+            case SchemaType.MIXED_CONTENT:
+                if (isGenerate_sample_data())
+                    xmlc.insertChars(pick(WORDS) + " ");
+                if (stype.getContentModel() != null) {
+                    processParticle(stype.getContentModel(), xmlc, true);
+                }
+                if (isGenerate_sample_data())
+                    xmlc.insertChars(pick(WORDS));
+
+                break;
+            case SchemaType.ELEMENT_CONTENT:
+                if (stype.getContentModel() != null) {
+                    processParticle(stype.getContentModel(), xmlc, false);
+                }
+                break;
+            }
+        } finally {
+            _typeStack.remove(_typeStack.size() - 1);
+        }
+    }
+
+    private void processSimpleType(SchemaType stype, XmlCursor xmlc) {
+        String sample = sampleDataForSimpleType(stype);
+        xmlc.insertChars(sample);
+
+    }
+
+    private String sampleDataForSimpleType(SchemaType sType) {
+        if (isGenerate_sample_data()) {
+            return generateSampleDataForSimpleType(sType);
+        } else {
+            return BLANK_STRING;
+        }
+    }
+
+    private String generateSampleDataForSimpleType(SchemaType sType) {
+        if (XmlObject.type.equals(sType))
+            return "anyType";
+
+        if (XmlAnySimpleType.type.equals(sType))
+            return "anySimpleType";
+
+        if (sType.getSimpleVariety() == SchemaType.LIST) {
+            SchemaType itemType = sType.getListItemType();
+            StringBuffer sb = new StringBuffer();
+            int length = pickLength(sType);
+            if (length > 0)
+                sb.append(sampleDataForSimpleType(itemType));
+            for (int i = 1; i < length; i += 1) {
+                sb.append(' ');
+                sb.append(sampleDataForSimpleType(itemType));
+            }
+            return sb.toString();
+        }
+
+        if (sType.getSimpleVariety() == SchemaType.UNION) {
+            SchemaType[] possibleTypes = sType.getUnionConstituentTypes();
+            if (possibleTypes.length == 0)
+                return "";
+            return sampleDataForSimpleType(possibleTypes[pick(possibleTypes.length)]);
+        }
+
+        XmlAnySimpleType[] enumValues = sType.getEnumerationValues();
+        if (enumValues != null && enumValues.length > 0) {
+            return enumValues[pick(enumValues.length)].getStringValue();
+        }
+
+        switch (sType.getPrimitiveType().getBuiltinTypeCode()) {
+        default:
+        case SchemaType.BTC_NOT_BUILTIN:
+            return "";
+
+        case SchemaType.BTC_ANY_TYPE:
+        case SchemaType.BTC_ANY_SIMPLE:
+            return "anything";
+
+        case SchemaType.BTC_BOOLEAN:
+            return pick(2) == 0 ? "true" : "false";
+
+        case SchemaType.BTC_BASE_64_BINARY: {
+            String result = null;
+            try {
+                result = new String(Base64.encode(formatToLength(pick(WORDS), sType).getBytes("utf-8")));
+            } catch (java.io.UnsupportedEncodingException e) { /* Can't possibly happen */
+            }
+            return result;
+        }
+
+        case SchemaType.BTC_HEX_BINARY:
+            return HexBin.encode(formatToLength(pick(WORDS), sType));
+
+        case SchemaType.BTC_ANY_URI:
+            return formatToLength("http://www." + pick(DNS1) + "." + pick(DNS2) + "/" + pick(WORDS) + "/" + pick(WORDS), sType);
+
+        case SchemaType.BTC_QNAME:
+            return formatToLength("qname", sType);
+
+        case SchemaType.BTC_NOTATION:
+            return formatToLength("notation", sType);
+
+        case SchemaType.BTC_FLOAT:
+            return "1.5E2";
+        case SchemaType.BTC_DOUBLE:
+            return "1.051732E7";
+        case SchemaType.BTC_DECIMAL:
+            switch (closestBuiltin(sType).getBuiltinTypeCode()) {
+            case SchemaType.BTC_SHORT:
+                return formatDecimal("1", sType);
+            case SchemaType.BTC_UNSIGNED_SHORT:
+                return formatDecimal("5", sType);
+            case SchemaType.BTC_BYTE:
+                return formatDecimal("2", sType);
+            case SchemaType.BTC_UNSIGNED_BYTE:
+                return formatDecimal("6", sType);
+            case SchemaType.BTC_INT:
+                return formatDecimal("3", sType);
+            case SchemaType.BTC_UNSIGNED_INT:
+                return formatDecimal("7", sType);
+            case SchemaType.BTC_LONG:
+                return formatDecimal("10", sType);
+            case SchemaType.BTC_UNSIGNED_LONG:
+                return formatDecimal("11", sType);
+            case SchemaType.BTC_INTEGER:
+                return formatDecimal("100", sType);
+            case SchemaType.BTC_NON_POSITIVE_INTEGER:
+                return formatDecimal("-200", sType);
+            case SchemaType.BTC_NEGATIVE_INTEGER:
+                return formatDecimal("-201", sType);
+            case SchemaType.BTC_NON_NEGATIVE_INTEGER:
+                return formatDecimal("200", sType);
+            case SchemaType.BTC_POSITIVE_INTEGER:
+                return formatDecimal("201", sType);
+            default:
+            case SchemaType.BTC_DECIMAL:
+                return formatDecimal("1000.00", sType);
+            }
+
+        case SchemaType.BTC_STRING: {
+            String result;
+            switch (closestBuiltin(sType).getBuiltinTypeCode()) {
+            case SchemaType.BTC_STRING:
+            case SchemaType.BTC_NORMALIZED_STRING:
+                result = "string";
+                break;
+
+            case SchemaType.BTC_TOKEN:
+                result = "token";
+                break;
+
+            default:
+                result = "string";
+                break;
+            }
+
+            return formatToLength(result, sType);
+        }
+
+        case SchemaType.BTC_DURATION:
+            return formatDuration(sType);
+
+        case SchemaType.BTC_DATE_TIME:
+        case SchemaType.BTC_TIME:
+        case SchemaType.BTC_DATE:
+        case SchemaType.BTC_G_YEAR_MONTH:
+        case SchemaType.BTC_G_YEAR:
+        case SchemaType.BTC_G_MONTH_DAY:
+        case SchemaType.BTC_G_DAY:
+        case SchemaType.BTC_G_MONTH:
+            return formatDate(sType);
+        }
+    }
+
+    // a bit from the Aenid
+    public static final String[] WORDS = new String[] { "ipsa", "iovis", "rapidum", "iaculata", "e", "nubibus", "ignem", "disiecitque", "rates",
+            "evertitque", "aequora", "ventis", "illum", "exspirantem", "transfixo", "pectore", "flammas", "turbine", "corripuit", "scopuloque",
+            "infixit", "acuto", "ast", "ego", "quae", "divum", "incedo", "regina", "iovisque", "et", "soror", "et", "coniunx", "una", "cum", "gente",
+            "tot", "annos", "bella", "gero", "et", "quisquam", "numen", "iunonis", "adorat", "praeterea", "aut", "supplex", "aris", "imponet",
+            "honorem", "talia", "flammato", "secum", "dea", "corde", "volutans", "nimborum", "in", "patriam", "loca", "feta", "furentibus",
+            "austris", "aeoliam", "venit", "hic", "vasto", "rex", "aeolus", "antro", "luctantis", "ventos", "tempestatesque", "sonoras", "imperio",
+            "premit", "ac", "vinclis", "et", "carcere", "frenat", "illi", "indignantes", "magno", "cum", "murmure", "montis", "circum", "claustra",
+            "fremunt", "celsa", "sedet", "aeolus", "arce", "sceptra", "tenens", "mollitque", "animos", "et", "temperat", "iras", "ni", "faciat",
+            "maria", "ac", "terras", "caelumque", "profundum", "quippe", "ferant", "rapidi", "secum", "verrantque", "per", "auras", "sed", "pater",
+            "omnipotens", "speluncis", "abdidit", "atris", "hoc", "metuens", "molemque", "et", "montis", "insuper", "altos", "imposuit", "regemque",
+            "dedit", "qui", "foedere", "certo", "et", "premere", "et", "laxas", "sciret", "dare", "iussus", "habenas", };
+
+    private static final String[] DNS1 = new String[] { "corp", "your", "my", "sample", "company", "test", "any" };
+
+    private static final String[] DNS2 = new String[] { "com", "org", "com", "gov", "org", "com", "org", "com", "edu" };
+
+    private int pick(int n) {
+        return _picker.nextInt(n);
+    }
+
+    private String pick(String[] a) {
+        return a[pick(a.length)];
+    }
+
+    private String pick(String[] a, int count) {
+        if (count <= 0)
+            return "";
+
+        int i = pick(a.length);
+        StringBuffer sb = new StringBuffer(a[i]);
+        while (count-- > 0) {
+            i += 1;
+            if (i >= a.length)
+                i = 0;
+            sb.append(' ');
+            sb.append(a[i]);
+        }
+        return sb.toString();
+    }
+
+    private String pickDigits(int digits) {
+        StringBuffer sb = new StringBuffer();
+        while (digits-- > 0)
+            sb.append(Integer.toString(pick(10)));
+        return sb.toString();
+    }
+
+    private int pickLength(SchemaType sType) {
+        XmlInteger length = (XmlInteger) sType.getFacet(SchemaType.FACET_LENGTH);
+        if (length != null)
+            return length.getBigIntegerValue().intValue();
+        XmlInteger min = (XmlInteger) sType.getFacet(SchemaType.FACET_MIN_LENGTH);
+        XmlInteger max = (XmlInteger) sType.getFacet(SchemaType.FACET_MAX_LENGTH);
+        int minInt, maxInt;
+        if (min == null)
+            minInt = 0;
+        else
+            minInt = min.getBigIntegerValue().intValue();
+        if (max == null)
+            maxInt = Integer.MAX_VALUE;
+        else
+            maxInt = max.getBigIntegerValue().intValue();
+        // We try to keep the length of the array within reasonable limits,
+        // at least 1 item and at most 3 if possible
+        if (minInt == 0 && maxInt >= 1)
+            minInt = 1;
+        if (maxInt > minInt + 2)
+            maxInt = minInt + 2;
+        if (maxInt < minInt)
+            maxInt = minInt;
+        return minInt + pick(maxInt - minInt);
+    }
+
+    /**
+     * Formats a given string to the required length, using the following operations:
+     * - append the source string to itself as necessary to pass the minLength;
+     * - truncate the result of previous step, if necessary, to keep it within minLength.
+     */
+    private String formatToLength(String s, SchemaType sType) {
+        String result = s;
+        try {
+            SimpleValue min = (SimpleValue) sType.getFacet(SchemaType.FACET_LENGTH);
+            if (min == null)
+                min = (SimpleValue) sType.getFacet(SchemaType.FACET_MIN_LENGTH);
+            if (min != null) {
+                int len = min.getIntValue();
+                while (result.length() < len)
+                    result = result + result;
+            }
+            SimpleValue max = (SimpleValue) sType.getFacet(SchemaType.FACET_LENGTH);
+            if (max == null)
+                max = (SimpleValue) sType.getFacet(SchemaType.FACET_MAX_LENGTH);
+            if (max != null) {
+                int len = max.getIntValue();
+                if (result.length() > len)
+                    result = result.substring(0, len);
+            }
+        } catch (Exception e) // intValue can be out of range
+        {
+        }
+        return result;
+    }
+
+    private String formatDecimal(String start, SchemaType sType) {
+        BigDecimal result = new BigDecimal(start);
+        XmlDecimal xmlD;
+        xmlD = (XmlDecimal) sType.getFacet(SchemaType.FACET_MIN_INCLUSIVE);
+        BigDecimal min = xmlD != null ? xmlD.getBigDecimalValue() : null;
+        xmlD = (XmlDecimal) sType.getFacet(SchemaType.FACET_MAX_INCLUSIVE);
+        BigDecimal max = xmlD != null ? xmlD.getBigDecimalValue() : null;
+        boolean minInclusive = true, maxInclusive = true;
+        xmlD = (XmlDecimal) sType.getFacet(SchemaType.FACET_MIN_EXCLUSIVE);
+        if (xmlD != null) {
+            BigDecimal minExcl = xmlD.getBigDecimalValue();
+            if (min == null || min.compareTo(minExcl) < 0) {
+                min = minExcl;
+                minInclusive = false;
+            }
+        }
+        xmlD = (XmlDecimal) sType.getFacet(SchemaType.FACET_MAX_EXCLUSIVE);
+        if (xmlD != null) {
+            BigDecimal maxExcl = xmlD.getBigDecimalValue();
+            if (max == null || max.compareTo(maxExcl) > 0) {
+                max = maxExcl;
+                maxInclusive = false;
+            }
+        }
+        xmlD = (XmlDecimal) sType.getFacet(SchemaType.FACET_TOTAL_DIGITS);
+        int totalDigits = -1;
+        if (xmlD != null) {
+            totalDigits = xmlD.getBigDecimalValue().intValue();
+
+            StringBuffer sb = new StringBuffer(totalDigits);
+            for (int i = 0; i < totalDigits; i++)
+                sb.append('9');
+            BigDecimal digitsLimit = new BigDecimal(sb.toString());
+            if (max != null && max.compareTo(digitsLimit) > 0) {
+                max = digitsLimit;
+                maxInclusive = true;
+            }
+            digitsLimit = digitsLimit.negate();
+            if (min != null && min.compareTo(digitsLimit) < 0) {
+                min = digitsLimit;
+                minInclusive = true;
+            }
+        }
+
+        int sigMin = min == null ? 1 : result.compareTo(min);
+        int sigMax = max == null ? -1 : result.compareTo(max);
+        boolean minOk = sigMin > 0 || sigMin == 0 && minInclusive;
+        boolean maxOk = sigMax < 0 || sigMax == 0 && maxInclusive;
+
+        // Compute the minimum increment
+        xmlD = (XmlDecimal) sType.getFacet(SchemaType.FACET_FRACTION_DIGITS);
+        int fractionDigits = -1;
+        BigDecimal increment;
+        if (xmlD == null)
+            increment = new BigDecimal(1);
+        else {
+            fractionDigits = xmlD.getBigDecimalValue().intValue();
+            if (fractionDigits > 0) {
+                StringBuffer sb = new StringBuffer("0.");
+                for (int i = 1; i < fractionDigits; i++)
+                    sb.append('0');
+                sb.append('1');
+                increment = new BigDecimal(sb.toString());
+            } else
+                increment = new BigDecimal(1.0);
+        }
+
+        if (minOk && maxOk) {
+            // OK 
+        } else if (minOk && !maxOk) {
+            // TOO BIG
+            if (maxInclusive)
+                result = max;
+            else
+                result = max.subtract(increment);
+        } else if (!minOk && maxOk) {
+            // TOO SMALL
+            if (minInclusive)
+                result = min;
+            else
+                result = min.add(increment);
+        } else {
+            // MIN > MAX!!
+        }
+
+        // We have the number
+        // Adjust the scale according to the totalDigits and fractionDigits
+        int digits = 0;
+        BigDecimal ONE = new BigDecimal(BigInteger.ONE);
+        for (BigDecimal n = result; n.abs().compareTo(ONE) >= 0; digits++)
+            n = n.movePointLeft(1);
+
+        if (fractionDigits > 0)
+            if (totalDigits >= 0)
+                result.setScale(Math.max(fractionDigits, totalDigits - digits));
+            else
+                result.setScale(fractionDigits);
+        else if (fractionDigits == 0)
+            result.setScale(0);
+
+        return result.toString();
+    }
+
+    private String formatDuration(SchemaType sType) {
+        XmlDuration d = (XmlDuration) sType.getFacet(SchemaType.FACET_MIN_INCLUSIVE);
+        GDuration minInclusive = null;
+        if (d != null)
+            minInclusive = d.getGDurationValue();
+
+        d = (XmlDuration) sType.getFacet(SchemaType.FACET_MAX_INCLUSIVE);
+        GDuration maxInclusive = null;
+        if (d != null)
+            maxInclusive = d.getGDurationValue();
+
+        d = (XmlDuration) sType.getFacet(SchemaType.FACET_MIN_EXCLUSIVE);
+        GDuration minExclusive = null;
+        if (d != null)
+            minExclusive = d.getGDurationValue();
+
+        d = (XmlDuration) sType.getFacet(SchemaType.FACET_MAX_EXCLUSIVE);
+        GDuration maxExclusive = null;
+        if (d != null)
+            maxExclusive = d.getGDurationValue();
+
+        GDurationBuilder gdurb = new GDurationBuilder();
+        BigInteger min, max;
+
+        gdurb.setSecond(pick(800000));
+        gdurb.setMonth(pick(20));
+
+        // Years
+        // Months
+        // Days
+        // Hours
+        // Minutes
+        // Seconds
+        // Fractions
+        if (minInclusive != null) {
+            if (gdurb.getYear() < minInclusive.getYear())
+                gdurb.setYear(minInclusive.getYear());
+            if (gdurb.getMonth() < minInclusive.getMonth())
+                gdurb.setMonth(minInclusive.getMonth());
+            if (gdurb.getDay() < minInclusive.getDay())
+                gdurb.setDay(minInclusive.getDay());
+            if (gdurb.getHour() < minInclusive.getHour())
+                gdurb.setHour(minInclusive.getHour());
+            if (gdurb.getMinute() < minInclusive.getMinute())
+                gdurb.setMinute(minInclusive.getMinute());
+            if (gdurb.getSecond() < minInclusive.getSecond())
+                gdurb.setSecond(minInclusive.getSecond());
+            if (gdurb.getFraction().compareTo(minInclusive.getFraction()) < 0)
+                gdurb.setFraction(minInclusive.getFraction());
+        }
+
+        if (maxInclusive != null) {
+            if (gdurb.getYear() > maxInclusive.getYear())
+                gdurb.setYear(maxInclusive.getYear());
+            if (gdurb.getMonth() > maxInclusive.getMonth())
+                gdurb.setMonth(maxInclusive.getMonth());
+            if (gdurb.getDay() > maxInclusive.getDay())
+                gdurb.setDay(maxInclusive.getDay());
+            if (gdurb.getHour() > maxInclusive.getHour())
+                gdurb.setHour(maxInclusive.getHour());
+            if (gdurb.getMinute() > maxInclusive.getMinute())
+                gdurb.setMinute(maxInclusive.getMinute());
+            if (gdurb.getSecond() > maxInclusive.getSecond())
+                gdurb.setSecond(maxInclusive.getSecond());
+            if (gdurb.getFraction().compareTo(maxInclusive.getFraction()) > 0)
+                gdurb.setFraction(maxInclusive.getFraction());
+        }
+
+        if (minExclusive != null) {
+            if (gdurb.getYear() <= minExclusive.getYear())
+                gdurb.setYear(minExclusive.getYear() + 1);
+            if (gdurb.getMonth() <= minExclusive.getMonth())
+                gdurb.setMonth(minExclusive.getMonth() + 1);
+            if (gdurb.getDay() <= minExclusive.getDay())
+                gdurb.setDay(minExclusive.getDay() + 1);
+            if (gdurb.getHour() <= minExclusive.getHour())
+                gdurb.setHour(minExclusive.getHour() + 1);
+            if (gdurb.getMinute() <= minExclusive.getMinute())
+                gdurb.setMinute(minExclusive.getMinute() + 1);
+            if (gdurb.getSecond() <= minExclusive.getSecond())
+                gdurb.setSecond(minExclusive.getSecond() + 1);
+            if (gdurb.getFraction().compareTo(minExclusive.getFraction()) <= 0)
+                gdurb.setFraction(minExclusive.getFraction().add(new BigDecimal(0.001)));
+        }
+
+        if (maxExclusive != null) {
+            if (gdurb.getYear() > maxExclusive.getYear())
+                gdurb.setYear(maxExclusive.getYear());
+            if (gdurb.getMonth() > maxExclusive.getMonth())
+                gdurb.setMonth(maxExclusive.getMonth());
+            if (gdurb.getDay() > maxExclusive.getDay())
+                gdurb.setDay(maxExclusive.getDay());
+            if (gdurb.getHour() > maxExclusive.getHour())
+                gdurb.setHour(maxExclusive.getHour());
+            if (gdurb.getMinute() > maxExclusive.getMinute())
+                gdurb.setMinute(maxExclusive.getMinute());
+            if (gdurb.getSecond() > maxExclusive.getSecond())
+                gdurb.setSecond(maxExclusive.getSecond());
+            if (gdurb.getFraction().compareTo(maxExclusive.getFraction()) > 0)
+                gdurb.setFraction(maxExclusive.getFraction());
+        }
+
+        gdurb.normalize();
+        return gdurb.toString();
+    }
+
+    private String formatDate(SchemaType sType) {
+        GDateBuilder gdateb = new GDateBuilder(new Date(1000L * pick(365 * 24 * 60 * 60) + (30L + pick(20)) * 365 * 24 * 60 * 60 * 1000));
+        GDate min = null, max = null;
+        GDate temp;
+
+        // Find the min and the max according to the type
+        switch (sType.getPrimitiveType().getBuiltinTypeCode()) {
+        case SchemaType.BTC_DATE_TIME: {
+            XmlDateTime x = (XmlDateTime) sType.getFacet(SchemaType.FACET_MIN_INCLUSIVE);
+            if (x != null)
+                min = x.getGDateValue();
+            x = (XmlDateTime) sType.getFacet(SchemaType.FACET_MIN_EXCLUSIVE);
+            if (x != null)
+                if (min == null || min.compareToGDate(x.getGDateValue()) <= 0)
+                    min = x.getGDateValue();
+
+            x = (XmlDateTime) sType.getFacet(SchemaType.FACET_MAX_INCLUSIVE);
+            if (x != null)
+                max = x.getGDateValue();
+            x = (XmlDateTime) sType.getFacet(SchemaType.FACET_MAX_EXCLUSIVE);
+            if (x != null)
+                if (max == null || max.compareToGDate(x.getGDateValue()) >= 0)
+                    max = x.getGDateValue();
+            break;
+        }
+        case SchemaType.BTC_TIME: {
+            XmlTime x = (XmlTime) sType.getFacet(SchemaType.FACET_MIN_INCLUSIVE);
+            if (x != null)
+                min = x.getGDateValue();
+            x = (XmlTime) sType.getFacet(SchemaType.FACET_MIN_EXCLUSIVE);
+            if (x != null)
+                if (min == null || min.compareToGDate(x.getGDateValue()) <= 0)
+                    min = x.getGDateValue();
+
+            x = (XmlTime) sType.getFacet(SchemaType.FACET_MAX_INCLUSIVE);
+            if (x != null)
+                max = x.getGDateValue();
+            x = (XmlTime) sType.getFacet(SchemaType.FACET_MAX_EXCLUSIVE);
+            if (x != null)
+                if (max == null || max.compareToGDate(x.getGDateValue()) >= 0)
+                    max = x.getGDateValue();
+            break;
+        }
+        case SchemaType.BTC_DATE: {
+            XmlDate x = (XmlDate) sType.getFacet(SchemaType.FACET_MIN_INCLUSIVE);
+            if (x != null)
+                min = x.getGDateValue();
+            x = (XmlDate) sType.getFacet(SchemaType.FACET_MIN_EXCLUSIVE);
+            if (x != null)
+                if (min == null || min.compareToGDate(x.getGDateValue()) <= 0)
+                    min = x.getGDateValue();
+
+            x = (XmlDate) sType.getFacet(SchemaType.FACET_MAX_INCLUSIVE);
+            if (x != null)
+                max = x.getGDateValue();
+            x = (XmlDate) sType.getFacet(SchemaType.FACET_MAX_EXCLUSIVE);
+            if (x != null)
+                if (max == null || max.compareToGDate(x.getGDateValue()) >= 0)
+                    max = x.getGDateValue();
+            break;
+        }
+        case SchemaType.BTC_G_YEAR_MONTH: {
+            XmlGYearMonth x = (XmlGYearMonth) sType.getFacet(SchemaType.FACET_MIN_INCLUSIVE);
+            if (x != null)
+                min = x.getGDateValue();
+            x = (XmlGYearMonth) sType.getFacet(SchemaType.FACET_MIN_EXCLUSIVE);
+            if (x != null)
+                if (min == null || min.compareToGDate(x.getGDateValue()) <= 0)
+                    min = x.getGDateValue();
+
+            x = (XmlGYearMonth) sType.getFacet(SchemaType.FACET_MAX_INCLUSIVE);
+            if (x != null)
+                max = x.getGDateValue();
+            x = (XmlGYearMonth) sType.getFacet(SchemaType.FACET_MAX_EXCLUSIVE);
+            if (x != null)
+                if (max == null || max.compareToGDate(x.getGDateValue()) >= 0)
+                    max = x.getGDateValue();
+            break;
+        }
+        case SchemaType.BTC_G_YEAR: {
+            XmlGYear x = (XmlGYear) sType.getFacet(SchemaType.FACET_MIN_INCLUSIVE);
+            if (x != null)
+                min = x.getGDateValue();
+            x = (XmlGYear) sType.getFacet(SchemaType.FACET_MIN_EXCLUSIVE);
+            if (x != null)
+                if (min == null || min.compareToGDate(x.getGDateValue()) <= 0)
+                    min = x.getGDateValue();
+
+            x = (XmlGYear) sType.getFacet(SchemaType.FACET_MAX_INCLUSIVE);
+            if (x != null)
+                max = x.getGDateValue();
+            x = (XmlGYear) sType.getFacet(SchemaType.FACET_MAX_EXCLUSIVE);
+            if (x != null)
+                if (max == null || max.compareToGDate(x.getGDateValue()) >= 0)
+                    max = x.getGDateValue();
+            break;
+        }
+        case SchemaType.BTC_G_MONTH_DAY: {
+            XmlGMonthDay x = (XmlGMonthDay) sType.getFacet(SchemaType.FACET_MIN_INCLUSIVE);
+            if (x != null)
+                min = x.getGDateValue();
+            x = (XmlGMonthDay) sType.getFacet(SchemaType.FACET_MIN_EXCLUSIVE);
+            if (x != null)
+                if (min == null || min.compareToGDate(x.getGDateValue()) <= 0)
+                    min = x.getGDateValue();
+
+            x = (XmlGMonthDay) sType.getFacet(SchemaType.FACET_MAX_INCLUSIVE);
+            if (x != null)
+                max = x.getGDateValue();
+            x = (XmlGMonthDay) sType.getFacet(SchemaType.FACET_MAX_EXCLUSIVE);
+            if (x != null)
+                if (max == null || max.compareToGDate(x.getGDateValue()) >= 0)
+                    max = x.getGDateValue();
+            break;
+        }
+        case SchemaType.BTC_G_DAY: {
+            XmlGDay x = (XmlGDay) sType.getFacet(SchemaType.FACET_MIN_INCLUSIVE);
+            if (x != null)
+                min = x.getGDateValue();
+            x = (XmlGDay) sType.getFacet(SchemaType.FACET_MIN_EXCLUSIVE);
+            if (x != null)
+                if (min == null || min.compareToGDate(x.getGDateValue()) <= 0)
+                    min = x.getGDateValue();
+
+            x = (XmlGDay) sType.getFacet(SchemaType.FACET_MAX_INCLUSIVE);
+            if (x != null)
+                max = x.getGDateValue();
+            x = (XmlGDay) sType.getFacet(SchemaType.FACET_MAX_EXCLUSIVE);
+            if (x != null)
+                if (max == null || max.compareToGDate(x.getGDateValue()) >= 0)
+                    max = x.getGDateValue();
+            break;
+        }
+        case SchemaType.BTC_G_MONTH: {
+            XmlGMonth x = (XmlGMonth) sType.getFacet(SchemaType.FACET_MIN_INCLUSIVE);
+            if (x != null)
+                min = x.getGDateValue();
+            x = (XmlGMonth) sType.getFacet(SchemaType.FACET_MIN_EXCLUSIVE);
+            if (x != null)
+                if (min == null || min.compareToGDate(x.getGDateValue()) <= 0)
+                    min = x.getGDateValue();
+
+            x = (XmlGMonth) sType.getFacet(SchemaType.FACET_MAX_INCLUSIVE);
+            if (x != null)
+                max = x.getGDateValue();
+            x = (XmlGMonth) sType.getFacet(SchemaType.FACET_MAX_EXCLUSIVE);
+            if (x != null)
+                if (max == null || max.compareToGDate(x.getGDateValue()) >= 0)
+                    max = x.getGDateValue();
+            break;
+        }
+        }
+
+        if (min != null && max == null) {
+            if (min.compareToGDate(gdateb) >= 0) {
+                // Reset the date to min + (1-8) hours
+                Calendar c = gdateb.getCalendar();
+                c.add(Calendar.HOUR_OF_DAY, pick(8));
+                gdateb = new GDateBuilder(c);
+            }
+        } else if (min == null && max != null) {
+            if (max.compareToGDate(gdateb) <= 0) {
+                // Reset the date to max - (1-8) hours
+                Calendar c = gdateb.getCalendar();
+                c.add(Calendar.HOUR_OF_DAY, 0 - pick(8));
+                gdateb = new GDateBuilder(c);
+            }
+        } else if (min != null && max != null) {
+            if (min.compareToGDate(gdateb) >= 0 || max.compareToGDate(gdateb) <= 0) {
+                // Find a date between the two
+                Calendar c = min.getCalendar();
+                Calendar cmax = max.getCalendar();
+                c.add(Calendar.HOUR_OF_DAY, 1);
+                if (c.after(cmax)) {
+                    c.add(Calendar.HOUR_OF_DAY, -1);
+                    c.add(Calendar.MINUTE, 1);
+                    if (c.after(cmax)) {
+                        c.add(Calendar.MINUTE, -1);
+                        c.add(Calendar.SECOND, 1);
+                        if (c.after(cmax)) {
+                            c.add(Calendar.SECOND, -1);
+                            c.add(Calendar.MILLISECOND, 1);
+                            if (c.after(cmax))
+                                c.add(Calendar.MILLISECOND, -1);
+                        }
+                    }
+                }
+                gdateb = new GDateBuilder(c);
+            }
+        }
+
+        gdateb.setBuiltinTypeCode(sType.getPrimitiveType().getBuiltinTypeCode());
+        if (pick(2) == 0)
+            gdateb.clearTimeZone();
+        return gdateb.toString();
+    }
+
+    private SchemaType closestBuiltin(SchemaType sType) {
+        while (!sType.isBuiltinType())
+            sType = sType.getBaseType();
+        return sType;
+    }
+
+    /**
+     * Cracks a combined QName of the form URL:localname
+     */
+    public static QName crackQName(String qName) {
+        String ns;
+        String name;
+
+        int index = qName.lastIndexOf(':');
+        if (index >= 0) {
+            ns = qName.substring(0, index);
+            name = qName.substring(index + 1);
+        } else {
+            ns = "";
+            name = qName;
+        }
+
+        return new QName(ns, name);
+    }
+
+    /**
+     * Cursor position:
+     * Before this call:
+     * <outer><foo/>^</outer>  (cursor at the ^)
+     * After this call:
+     * <<outer><foo/><bar/>som text<etc/>^</outer>
+     */
+    private void processParticle(SchemaParticle sp, XmlCursor xmlc, boolean mixed) {
+        int loop = determineMinMaxForSample(sp, xmlc);
+
+        while (loop-- > 0) {
+            switch (sp.getParticleType()) {
+            case (SchemaParticle.ELEMENT):
+                processElement(sp, xmlc, mixed);
+                break;
+            case (SchemaParticle.SEQUENCE):
+                processSequence(sp, xmlc, mixed);
+                break;
+            case (SchemaParticle.CHOICE):
+                processChoice(sp, xmlc, mixed);
+                break;
+            case (SchemaParticle.ALL):
+                processAll(sp, xmlc, mixed);
+                break;
+            case (SchemaParticle.WILDCARD):
+                processWildCard(sp, xmlc, mixed);
+                break;
+            default:
+                // throw new Exception("No Match on Schema Particle Type: " + String.valueOf(sp.getParticleType()));
+            }
+        }
+    }
+
+    private int determineMinMaxForSample(SchemaParticle sp, XmlCursor xmlc) {
+        int minOccurs = sp.getIntMinOccurs();
+        int maxOccurs = sp.getIntMaxOccurs();
+
+        if (minOccurs == maxOccurs)
+            return minOccurs;
+
+        int result = minOccurs;
+        if (result == 0 && _nElements < MAX_ELEMENTS)
+            result = 1;
+
+        if (sp.getParticleType() != SchemaParticle.ELEMENT)
+            return result;
+
+        // it probably only makes sense to put comments in front of individual elements that repeat
+
+        if (sp.getMaxOccurs() == null) {
+            // xmlc.insertComment("The next " + getItemNameOrType(sp, xmlc) + " may be repeated " + minOccurs + " or more times");
+            if (minOccurs == 0)
+                xmlc.insertComment("Zero or more repetitions:");
+            else
+                xmlc.insertComment(minOccurs + " or more repetitions:");
+        } else if (sp.getIntMaxOccurs() > 1) {
+            xmlc.insertComment(minOccurs + " to " + String.valueOf(sp.getMaxOccurs()) + " repetitions:");
+        } else {
+            xmlc.insertComment("Optional:");
+        }
+        return result;
+    }
+
+    /*
+     Return a name for the element or the particle type to use in the comment for minoccurs, max occurs
+     */
+    private String getItemNameOrType(SchemaParticle sp, XmlCursor xmlc) {
+        String elementOrTypeName = null;
+        if (sp.getParticleType() == SchemaParticle.ELEMENT) {
+            elementOrTypeName = "Element (" + sp.getName().getLocalPart() + ")";
+        } else {
+            elementOrTypeName = printParticleType(sp.getParticleType());
+        }
+        return elementOrTypeName;
+    }
+
+    private void processElement(SchemaParticle sp, XmlCursor xmlc, boolean mixed) {
+        // cast as schema local element
+        SchemaLocalElement element = (SchemaLocalElement) sp;
+        /// ^  -> <elemenname></elem>^
+        if (_soapEnc)
+            xmlc.insertElement(element.getName().getLocalPart()); // soap encoded? drop namespaces.
+        else
+            xmlc.insertElement(element.getName().getLocalPart(), element.getName().getNamespaceURI());
+        _nElements++;
+        /// -> <elem>^</elem>
+        xmlc.toPrevToken();
+        // -> <elem>stuff^</elem> 
+        createSampleForType(element.getType(), xmlc);
+        // -> <elem>stuff</elem>^
+        xmlc.toNextToken();
+
+    }
+
+    private void moveToken(int numToMove, XmlCursor xmlc) {
+        for (int i = 0; i < Math.abs(numToMove); i++) {
+            if (numToMove < 0) {
+                xmlc.toPrevToken();
+            } else {
+                xmlc.toNextToken();
+            }
+        }
+    }
+
+    private static final String formatQName(XmlCursor xmlc, QName qName) {
+        XmlCursor parent = xmlc.newCursor();
+        parent.toParent();
+        String prefix = parent.prefixForNamespace(qName.getNamespaceURI());
+        parent.dispose();
+        String name;
+        if (prefix == null || prefix.length() == 0)
+            name = qName.getLocalPart();
+        else
+            name = prefix + ":" + qName.getLocalPart();
+        return name;
+    }
+
+    private static final QName HREF = new QName("href");
+
+    private static final QName ID = new QName("id");
+
+    private static final QName XSI_TYPE = new QName("http://www.w3.org/2001/XMLSchema-instance", "type");
+
+    private static final QName ENC_ARRAYTYPE = new QName("http://schemas.xmlsoap.org/soap/encoding/", "arrayType");
+
+    private static final QName ENC_OFFSET = new QName("http://schemas.xmlsoap.org/soap/encoding/", "offset");
+
+    private static final Set SKIPPED_SOAP_ATTRS = new HashSet(Arrays.asList(new QName[] { HREF, ID, ENC_OFFSET }));
+
+    private void processAttributes(SchemaType stype, XmlCursor xmlc) {
+        if (_soapEnc) {
+            QName typeName = stype.getName();
+            if (typeName != null) {
+                xmlc.insertAttributeWithValue(XSI_TYPE, formatQName(xmlc, typeName));
+            }
+        }
+
+        SchemaProperty[] attrProps = stype.getAttributeProperties();
+        for (int i = 0; i < attrProps.length; i++) {
+            SchemaProperty attr = attrProps[i];
+            if (_soapEnc) {
+                if (SKIPPED_SOAP_ATTRS.contains(attr.getName()))
+                    continue;
+                if (ENC_ARRAYTYPE.equals(attr.getName())) {
+                    SOAPArrayType arrayType = ((SchemaWSDLArrayType) stype.getAttributeModel().getAttribute(attr.getName())).getWSDLArrayType();
+                    if (arrayType != null)
+                        xmlc.insertAttributeWithValue(attr.getName(), formatQName(xmlc, arrayType.getQName()) + arrayType.soap11DimensionString());
+                    continue;
+                }
+            }
+            String defaultValue = attr.getDefaultText();
+            xmlc.insertAttributeWithValue(attr.getName(), defaultValue == null ? sampleDataForSimpleType(attr.getType()) : defaultValue);
+        }
+    }
+
+    private void processSequence(SchemaParticle sp, XmlCursor xmlc, boolean mixed) {
+        SchemaParticle[] spc = sp.getParticleChildren();
+        for (int i = 0; i < spc.length; i++) {
+            /// <parent>maybestuff^</parent>
+            processParticle(spc[i], xmlc, mixed);
+            //<parent>maybestuff...morestuff^</parent>
+            if (mixed && i < spc.length - 1) {
+                if (isGenerate_sample_data()) {
+                    xmlc.insertChars(pick(WORDS));
+                } else {
+                    xmlc.insertChars("");
+                }
+            }
+        }
+    }
+
+    private void processChoice(SchemaParticle sp, XmlCursor xmlc, boolean mixed) {
+        SchemaParticle[] spc = sp.getParticleChildren();
+        xmlc.insertComment("You have a CHOICE of the next " + String.valueOf(spc.length) + " items at this level");
+        for (int i = 0; i < spc.length; i++) {
+            processParticle(spc[i], xmlc, mixed);
+        }
+    }
+
+    private void processAll(SchemaParticle sp, XmlCursor xmlc, boolean mixed) {
+        SchemaParticle[] spc = sp.getParticleChildren();
+        // xmlc.insertComment("You may enter the following " + String.valueOf(spc.length) + " items in any order");
+        for (int i = 0; i < spc.length; i++) {
+            processParticle(spc[i], xmlc, mixed);
+            if (mixed && i < spc.length - 1)
+                xmlc.insertChars(pick(WORDS));
+        }
+    }
+
+    private void processWildCard(SchemaParticle sp, XmlCursor xmlc, boolean mixed) {
+        xmlc.insertComment("You may enter ANY elements at this point");
+        xmlc.insertElement("AnyElement");
+    }
+
+    /**
+     * This method will get the base type for the schema type
+     */
+
+    private static QName getClosestName(SchemaType sType) {
+        while (sType.getName() == null)
+            sType = sType.getBaseType();
+
+        return sType.getName();
+    }
+
+    private String printParticleType(int particleType) {
+        StringBuffer returnParticleType = new StringBuffer();
+        returnParticleType.append("Schema Particle Type: ");
+
+        switch (particleType) {
+        case SchemaParticle.ALL:
+            returnParticleType.append("ALL\n");
+            break;
+        case SchemaParticle.CHOICE:
+            returnParticleType.append("CHOICE\n");
+            break;
+        case SchemaParticle.ELEMENT:
+            returnParticleType.append("ELEMENT\n");
+            break;
+        case SchemaParticle.SEQUENCE:
+            returnParticleType.append("SEQUENCE\n");
+            break;
+        case SchemaParticle.WILDCARD:
+            returnParticleType.append("WILDCARD\n");
+            break;
+        default:
+            returnParticleType.append("Schema Particle Type Unknown");
+            break;
+        }
+
+        return returnParticleType.toString();
+    }
+
+    private ArrayList _typeStack = new ArrayList();
+
+    public boolean isGenerate_sample_data() {
+        return generate_sample_data;
+    }
+
+    public void setGenerate_sample_data(boolean generate_sample_data) {
+        this.generate_sample_data = generate_sample_data;
+    }
+}

Propchange: incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/TuscanySampleXmlUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/containers/container.javascript/src/main/java/org/apache/tuscany/container/javascript/utils/xmlfromxsd/TuscanySampleXmlUtil.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org