You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by ad...@apache.org on 2008/07/08 07:19:32 UTC

svn commit: r674723 [2/4] - in /tuscany/sandbox/mobile-android: core-databinding/ core-databinding/src/ core-databinding/src/main/ core-databinding/src/main/java/ core-databinding/src/main/java/org/ core-databinding/src/main/java/org/apache/ core-datab...

Added: tuscany/sandbox/mobile-android/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataBindingRuntimeWireProcessor.java
URL: http://svn.apache.org/viewvc/tuscany/sandbox/mobile-android/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataBindingRuntimeWireProcessor.java?rev=674723&view=auto
==============================================================================
--- tuscany/sandbox/mobile-android/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataBindingRuntimeWireProcessor.java (added)
+++ tuscany/sandbox/mobile-android/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataBindingRuntimeWireProcessor.java Mon Jul  7 22:19:28 2008
@@ -0,0 +1,186 @@
+/*
+ * 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.sca.core.databinding.wire;
+
+import java.util.List;
+
+import org.apache.tuscany.sca.assembly.ComponentReference;
+import org.apache.tuscany.sca.databinding.DataBindingExtensionPoint;
+import org.apache.tuscany.sca.databinding.Mediator;
+import org.apache.tuscany.sca.interfacedef.DataType;
+import org.apache.tuscany.sca.interfacedef.FaultExceptionMapper;
+import org.apache.tuscany.sca.interfacedef.InterfaceContract;
+import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.invocation.Interceptor;
+import org.apache.tuscany.sca.invocation.InvocationChain;
+import org.apache.tuscany.sca.invocation.Phase;
+import org.apache.tuscany.sca.runtime.RuntimeWire;
+import org.apache.tuscany.sca.runtime.RuntimeWireProcessor;
+
+/**
+ * This processor is responsible to add an interceptor to invocation chain if
+ * the source and target operations have different databinding requirements
+ * 
+ * @version $Rev: 632064 $ $Date: 2008-02-28 09:18:51 -0800 (Thu, 28 Feb 2008) $
+ */
+public class DataBindingRuntimeWireProcessor implements RuntimeWireProcessor {
+    private Mediator mediator;
+    private DataBindingExtensionPoint dataBindings;
+    private FaultExceptionMapper faultExceptionMapper;
+
+    public DataBindingRuntimeWireProcessor(Mediator mediator,
+                                           DataBindingExtensionPoint dataBindings,
+                                           FaultExceptionMapper faultExceptionMapper) {
+        super();
+        this.mediator = mediator;
+        this.dataBindings = dataBindings;
+        this.faultExceptionMapper = faultExceptionMapper;
+    }
+
+    public boolean isTransformationRequired(DataType source, DataType target) {
+        if (source == null || target == null) { // void return type
+            return false;
+        }
+        if (source == target) {
+            return false;
+        }
+
+        // Output type can be null
+        if (source == null && target == null) {
+            return false;
+        } else if (source == null || target == null) {
+            return true;
+        }
+        String sourceDataBinding = source.getDataBinding();
+        String targetDataBinding = target.getDataBinding();
+        if (sourceDataBinding == targetDataBinding) {
+            return false;
+        }
+        if (sourceDataBinding == null || targetDataBinding == null) {
+            // TODO: If any of the databinding is null, then no transformation
+            return false;
+        }
+        return !sourceDataBinding.equals(targetDataBinding);
+    }
+
+    public boolean isTransformationRequired(Operation source, Operation target) {
+        if (source == target) {
+            return false;
+        }
+
+        if (source.isWrapperStyle() != target.isWrapperStyle()) {
+            return true;
+        }
+
+        // Check output type
+        DataType sourceOutputType = source.getOutputType();
+        DataType targetOutputType = target.getOutputType();
+
+        // Note the target output type is now the source for checking
+        // compatibility
+        if (isTransformationRequired(targetOutputType, sourceOutputType)) {
+            return true;
+        }
+
+        List<DataType> sourceInputType = source.getInputType().getLogical();
+        List<DataType> targetInputType = target.getInputType().getLogical();
+
+        int size = sourceInputType.size();
+        if (size != targetInputType.size()) {
+            // TUSCANY-1682: The wrapper style may have different arguments
+            return true;
+        }
+        for (int i = 0; i < size; i++) {
+            if (isTransformationRequired(sourceInputType.get(i), targetInputType.get(i))) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    private boolean isTransformationRequired(InterfaceContract sourceContract,
+                                             Operation sourceOperation,
+                                             InterfaceContract targetContract,
+                                             Operation targetOperation) {
+        if (targetContract == null) {
+            targetContract = sourceContract;
+        }
+        if (sourceContract == targetContract) {
+            return false;
+        }
+        return isTransformationRequired(sourceOperation, targetOperation);
+    }
+
+    public void process(RuntimeWire wire) {
+        InterfaceContract sourceContract = wire.getSource().getInterfaceContract();
+        InterfaceContract targetContract = wire.getTarget().getInterfaceContract();
+        if (targetContract == null) {
+            targetContract = sourceContract;
+        }
+
+        if (!sourceContract.getInterface().isRemotable()) {
+            return;
+        }
+        List<InvocationChain> chains = wire.getInvocationChains();
+        for (InvocationChain chain : chains) {
+            Operation sourceOperation = chain.getSourceOperation();
+            Operation targetOperation = chain.getTargetOperation();
+
+            Interceptor interceptor = null;
+            if (isTransformationRequired(sourceContract, sourceOperation, targetContract, targetOperation)) {
+                // Add the interceptor to the source side because multiple
+                // references can be wired to the same service
+                interceptor =
+                    new DataTransformationInterceptor(wire, sourceOperation, targetOperation, mediator,
+                                                      faultExceptionMapper);
+            } else {
+                // assume pass-by-values copies are required if interfaces are remotable and there is no data binding
+                // transformation, i.e. a transformation will result in a copy so another pass-by-value copy is unnecessary
+                if (isRemotable(chain, sourceOperation, targetOperation)) {
+                    interceptor =
+                        new PassByValueInterceptor(dataBindings, faultExceptionMapper, chain, targetOperation);
+                }
+            }
+            if (interceptor != null) {
+                String phase =
+                    (wire.getSource().getContract() instanceof ComponentReference) ? Phase.REFERENCE_INTERFACE
+                        : Phase.SERVICE_INTERFACE;
+                chain.addInterceptor(phase, interceptor);
+            }
+        }
+
+    }
+
+    /**
+     * Pass-by-value copies are required if the interfaces are remotable unless the
+     * implementation uses the @AllowsPassByReference annotation.
+     */
+    protected boolean isRemotable(InvocationChain chain, Operation sourceOperation, Operation targetOperation) {
+        if (!sourceOperation.getInterface().isRemotable()) {
+            return false;
+        }
+        if (!targetOperation.getInterface().isRemotable()) {
+            return false;
+        }
+        return true;
+    }
+
+}

Added: tuscany/sandbox/mobile-android/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataTransformationInterceptor.java
URL: http://svn.apache.org/viewvc/tuscany/sandbox/mobile-android/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataTransformationInterceptor.java?rev=674723&view=auto
==============================================================================
--- tuscany/sandbox/mobile-android/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataTransformationInterceptor.java (added)
+++ tuscany/sandbox/mobile-android/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataTransformationInterceptor.java Mon Jul  7 22:19:28 2008
@@ -0,0 +1,263 @@
+/*
+ * 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.sca.core.databinding.wire;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+
+import org.apache.tuscany.sca.databinding.DataBinding;
+import org.apache.tuscany.sca.databinding.Mediator;
+import org.apache.tuscany.sca.interfacedef.DataType;
+import org.apache.tuscany.sca.interfacedef.FaultExceptionMapper;
+import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl;
+import org.apache.tuscany.sca.interfacedef.util.FaultException;
+import org.apache.tuscany.sca.interfacedef.util.XMLType;
+import org.apache.tuscany.sca.invocation.DataExchangeSemantics;
+import org.apache.tuscany.sca.invocation.Interceptor;
+import org.apache.tuscany.sca.invocation.Invoker;
+import org.apache.tuscany.sca.invocation.Message;
+import org.apache.tuscany.sca.runtime.RuntimeWire;
+import org.osoa.sca.ServiceRuntimeException;
+
+/**
+ * An interceptor to transform data across databindings on the wire
+ * 
+ * @version $Rev: 643467 $ $Date: 2008-04-01 08:12:08 -0800 (Tue, 01 Apr 2008) $
+ */
+public class DataTransformationInterceptor implements Interceptor, DataExchangeSemantics {
+    private Invoker next;
+
+    private Operation sourceOperation;
+
+    private Operation targetOperation;
+    private RuntimeWire wire;
+    private Mediator mediator;
+    private FaultExceptionMapper faultExceptionMapper;
+
+    public DataTransformationInterceptor(RuntimeWire wire,
+                                         Operation sourceOperation,
+                                         Operation targetOperation,
+                                         Mediator mediator,
+                                         FaultExceptionMapper faultExceptionMapper) {
+        super();
+        this.sourceOperation = sourceOperation;
+        this.targetOperation = targetOperation;
+        this.mediator = mediator;
+        this.wire = wire;
+        this.faultExceptionMapper = faultExceptionMapper;
+    }
+
+    public Invoker getNext() {
+        return next;
+    }
+
+    public Message invoke(Message msg) {
+        Object input = transform(msg.getBody(), sourceOperation.getInputType(), targetOperation.getInputType(), false);
+        msg.setBody(input);
+        Message resultMsg = next.invoke(msg);
+        Object result = resultMsg.getBody();
+        if (sourceOperation.isNonBlocking()) {
+            // Not to reset the message body
+            return resultMsg;
+        }
+
+        // FIXME: Should we fix the Operation model so that getOutputType
+        // returns DataType<DataType<T>>?
+        DataType<DataType> targetType =
+            new DataTypeImpl<DataType>(DataBinding.IDL_OUTPUT, Object.class, targetOperation.getOutputType());
+
+        DataType<DataType> sourceType =
+            new DataTypeImpl<DataType>(DataBinding.IDL_OUTPUT, Object.class, sourceOperation.getOutputType());
+
+        if (resultMsg.isFault()) {
+
+            // FIXME: We need to figure out what fault type it is and then
+            // transform it
+            // back the source fault type
+            // throw new InvocationRuntimeException((Throwable) result);
+
+            if ((result instanceof Exception) && !(result instanceof RuntimeException)) {
+                // FIXME: How to match fault data to a fault type for the
+                // operation?
+
+                // If the result is from an InvocationTargetException look at
+                // the actual cause.
+                if (result instanceof InvocationTargetException) {
+                    result = ((InvocationTargetException)result).getCause();
+                }
+                DataType targetDataType = null;
+                for (DataType exType : targetOperation.getFaultTypes()) {
+                    if (((Class)exType.getPhysical()).isInstance(result)) {
+                        if (result instanceof FaultException) {
+                            DataType faultType = (DataType)exType.getLogical();
+                            if (((FaultException)result).isMatchingType(faultType.getLogical())) {
+                                targetDataType = exType;
+                                break;
+                            }
+                        } else {
+                            targetDataType = exType;
+                            break;
+                        }
+                    }
+                }
+
+                /*
+                if (targetDataType == null) {
+                    // Not a business exception
+                    return resultMsg;
+                }
+                */
+
+                DataType targetFaultType = getFaultType(targetDataType);
+                if (targetFaultType == null) {
+                    // No matching fault type, it's a system exception
+                    Throwable cause = (Throwable) result;
+                    throw new ServiceRuntimeException(cause);
+                }
+
+                // FIXME: How to match a source fault type to a target fault
+                // type?
+                DataType sourceDataType = null;
+                DataType sourceFaultType = null;
+                for (DataType exType : sourceOperation.getFaultTypes()) {
+                    DataType faultType = getFaultType(exType);
+                    // Match by the QName (XSD element) of the fault type
+                    if (faultType != null && typesMatch(targetFaultType.getLogical(), faultType.getLogical())) {
+                        sourceDataType = exType;
+                        sourceFaultType = faultType;
+                        break;
+                    }
+                }
+
+                if (sourceFaultType == null) {
+                    // No matching fault type, it's a system exception
+                    Throwable cause = (Throwable) result;
+                    throw new ServiceRuntimeException(cause);
+                }
+
+                Object newResult =
+                    transformException(result, targetDataType, sourceDataType, targetFaultType, sourceFaultType);
+                if (newResult != result) {
+                    resultMsg.setFaultBody(newResult);
+                }
+            }
+
+        } else {
+            assert !(result instanceof Throwable) : "Expected messages that are not throwable " + result;
+
+            Object newResult = transform(result, targetType, sourceType, true);
+            if (newResult != result) {
+                resultMsg.setBody(newResult);
+            }
+        }
+
+        return resultMsg;
+    }
+
+    private Object transform(Object source, DataType sourceType, DataType targetType, boolean isResponse) {
+        if (sourceType == targetType || (sourceType != null && sourceType.equals(targetType))) {
+            return source;
+        }
+        Map<String, Object> metadata = new HashMap<String, Object>();
+        metadata.put("source.operation", isResponse ? targetOperation : sourceOperation);
+        metadata.put("target.operation", isResponse ? sourceOperation : targetOperation);
+        metadata.put("wire", wire);
+        return mediator.mediate(source, sourceType, targetType, metadata);
+    }
+
+    private DataType getFaultType(DataType exceptionType) {
+        return exceptionType == null ? null : (DataType)exceptionType.getLogical();
+    }
+
+    private boolean typesMatch(Object first, Object second) {
+        if (first.equals(second)) {
+            return true;
+        }
+        if (first instanceof XMLType && second instanceof XMLType) {
+            XMLType t1 = (XMLType)first;
+            XMLType t2 = (XMLType)second;
+            return matches(t1.getElementName(), t2.getElementName()) || matches(t1.getTypeName(), t2.getTypeName());
+        }
+        return false;
+    }
+
+    /**
+     * @param qn1
+     * @param qn2
+     */
+    private boolean matches(QName qn1, QName qn2) {
+        if (qn1 == qn2) {
+            return true;
+        }
+        if (qn1 == null || qn2 == null) {
+            return false;
+        }
+        String ns1 = qn1.getNamespaceURI();
+        String ns2 = qn2.getNamespaceURI();
+        String e1 = qn1.getLocalPart();
+        String e2 = qn2.getLocalPart();
+        if (e1.equals(e2) && (ns1.equals(ns2) || ns1.equals(ns2 + "/") || ns2.equals(ns1 + "/"))) {
+            // Tolerating the trailing / which is required by JAX-WS java package --> xml ns mapping
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * @param source The source exception
+     * @param sourceExType The data type for the source exception
+     * @param targetExType The data type for the target exception
+     * @param sourceType The fault type for the source
+     * @param targetType The fault type for the target
+     * @return
+     */
+    private Object transformException(Object source,
+                                      DataType sourceExType,
+                                      DataType targetExType,
+                                      DataType sourceType,
+                                      DataType targetType) {
+        if (sourceType == targetType || (sourceType != null && sourceType.equals(targetType))) {
+            return source;
+        }
+        Map<String, Object> metadata = new HashMap<String, Object>();
+        metadata.put("source.operation", targetOperation);
+        metadata.put("target.operation", sourceOperation);
+        metadata.put("wire", wire);
+        DataType<DataType> eSourceDataType =
+            new DataTypeImpl<DataType>("idl:fault", sourceExType.getPhysical(), sourceType);
+        DataType<DataType> eTargetDataType =
+            new DataTypeImpl<DataType>("idl:fault", targetExType.getPhysical(), targetType);
+
+        return mediator.mediate(source, eSourceDataType, eTargetDataType, metadata);
+    }
+
+    public void setNext(Invoker next) {
+        this.next = next;
+    }
+
+    public boolean allowsPassByReference() {
+        return true;
+    }
+
+}

Added: tuscany/sandbox/mobile-android/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/PassByValueInterceptor.java
URL: http://svn.apache.org/viewvc/tuscany/sandbox/mobile-android/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/PassByValueInterceptor.java?rev=674723&view=auto
==============================================================================
--- tuscany/sandbox/mobile-android/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/PassByValueInterceptor.java (added)
+++ tuscany/sandbox/mobile-android/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/PassByValueInterceptor.java Mon Jul  7 22:19:28 2008
@@ -0,0 +1,247 @@
+/*
+ * 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.sca.core.databinding.wire;
+
+import java.io.Serializable;
+import java.lang.reflect.Array;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.IdentityHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.tuscany.sca.databinding.DataBinding;
+import org.apache.tuscany.sca.databinding.DataBindingExtensionPoint;
+import org.apache.tuscany.sca.databinding.javabeans.JavaBeansDataBinding;
+import org.apache.tuscany.sca.databinding.jaxb.JAXBDataBinding;
+import org.apache.tuscany.sca.interfacedef.DataType;
+import org.apache.tuscany.sca.interfacedef.FaultExceptionMapper;
+import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl;
+import org.apache.tuscany.sca.interfacedef.util.XMLType;
+import org.apache.tuscany.sca.invocation.Interceptor;
+import org.apache.tuscany.sca.invocation.InvocationChain;
+import org.apache.tuscany.sca.invocation.Invoker;
+import org.apache.tuscany.sca.invocation.Message;
+import org.osoa.sca.ServiceRuntimeException;
+
+/**
+ * Implementation of an interceptor that enforces pass-by-value semantics
+ * on operation invocations by copying the operation input and output data.
+ *
+ * @version $Rev: 639276 $ $Date: 2008-03-20 05:02:00 -0800 (Thu, 20 Mar 2008) $
+ */
+public class PassByValueInterceptor implements Interceptor {
+
+    private DataBindingExtensionPoint dataBindings;
+    private FaultExceptionMapper faultExceptionMapper;
+
+    private DataBinding[] inputDataBindings;
+    private DataBinding outputDataBinding;
+    private DataBinding javaBeanDataBinding;
+    private DataBinding jaxbDataBinding;
+    private Operation operation;
+    private Invoker nextInvoker;
+    private InvocationChain chain;
+
+    /**
+     * Constructs a new PassByValueInterceptor.
+     * @param dataBindings databinding extension point
+     * @param operation the intercepted operation
+     */
+    public PassByValueInterceptor(DataBindingExtensionPoint dataBindings,
+                                  FaultExceptionMapper faultExceptionMapper,
+                                  InvocationChain chain,
+                                  Operation operation) {
+        this.chain = chain;
+        this.operation = operation;
+
+        // Cache data bindings to use
+        this.dataBindings = dataBindings;
+        this.faultExceptionMapper = faultExceptionMapper;
+
+        jaxbDataBinding = dataBindings.getDataBinding(JAXBDataBinding.NAME);
+        javaBeanDataBinding = dataBindings.getDataBinding(JavaBeansDataBinding.NAME);
+
+        // Determine the input databindings
+        if (operation.getInputType() != null) {
+            List<DataType> inputTypes = operation.getInputType().getLogical();
+            inputDataBindings = new DataBinding[inputTypes.size()];
+            int i = 0;
+            for (DataType inputType : inputTypes) {
+                String id = inputType.getDataBinding();
+                inputDataBindings[i++] = dataBindings.getDataBinding(id);
+            }
+        }
+
+        // Determine the output databinding
+        if (operation.getOutputType() != null) {
+            String id = operation.getOutputType().getDataBinding();
+            outputDataBinding = dataBindings.getDataBinding(id);
+        }
+    }
+
+    public Message invoke(Message msg) {
+        if (chain.allowsPassByReference()) {
+            return nextInvoker.invoke(msg);
+        }
+
+        msg.setBody(copy((Object[])msg.getBody(), inputDataBindings));
+
+        Message resultMsg = nextInvoker.invoke(msg);
+
+        if (!msg.isFault() && operation.getOutputType() != null) {
+            resultMsg.setBody(copy(resultMsg.getBody(), outputDataBinding));
+        }
+
+        if (msg.isFault()) {
+            msg.setFaultBody(copyFault(msg.getBody()));
+        }
+        return resultMsg;
+    }
+
+    private Object copyFault(Object fault) {
+        if (faultExceptionMapper == null) {
+            return fault;
+        }
+        Throwable ex = (Throwable)fault;
+        DataType<DataType> exType =
+            new DataTypeImpl<DataType>(ex.getClass(), new DataTypeImpl<XMLType>(ex.getClass(), XMLType.UNKNOWN));
+        faultExceptionMapper.introspectFaultDataType(exType);
+        DataType faultType = exType.getLogical();
+        Object faultInfo = faultExceptionMapper.getFaultInfo(ex, faultType.getPhysical());
+        faultInfo = copy(faultInfo, dataBindings.getDataBinding(faultType.getDataBinding()));
+        fault = faultExceptionMapper.wrapFaultInfo(exType, ex.getMessage(), faultInfo, ex.getCause());
+        return fault;
+    }
+
+    /**
+     * Copy an array of data objects passed to an operation
+     * @param data array of objects to copy
+     * @return the copy
+     */
+    private Object[] copy(Object[] data, DataBinding[] dataBindings) {
+        if (data == null) {
+            return null;
+        }
+        Object[] copy = new Object[data.length];
+        Map<Object, Object> map = new IdentityHashMap<Object, Object>();
+        for (int i = 0; i < data.length; i++) {
+            Object arg = data[i];
+            if (arg == null) {
+                copy[i] = null;
+            } else {
+                Object copiedArg = map.get(arg);
+                if (copiedArg != null) {
+                    copy[i] = copiedArg;
+                } else {
+                    copiedArg = copy(arg, dataBindings[i]);
+                    map.put(arg, copiedArg);
+                    copy[i] = copiedArg;
+                }
+            }
+        }
+        return copy;
+    }
+
+    /**
+     * Copy data using the specified databinding.
+     * @param data input data
+     * @param dataBinding databinding to use
+     * @return a copy of the data
+     */
+    private Object copy(Object data, DataBinding dataBinding) {
+        if (data == null) {
+            return null;
+        }
+
+        // If no databinding was specified, introspect the given arg to
+        // determine its databinding
+        if (dataBinding == null) {
+            DataType<?> dataType = dataBindings.introspectType(data);
+            if (dataType != null) {
+                String db = dataType.getDataBinding();
+                dataBinding = dataBindings.getDataBinding(db);
+                if (dataBinding == null && db != null) {
+                    return data;
+                }
+            }
+            if (dataBinding == null) {
+
+                // Default to the JavaBean databinding
+                dataBinding = javaBeanDataBinding;
+            }
+        }
+
+        // Use the JAXB databinding to copy non-Serializable data
+        if (dataBinding == javaBeanDataBinding) {
+
+            // If the input data is an array containing non Serializable elements
+            // use JAXB
+            Class<?> clazz = data.getClass();
+            if (clazz.isArray()) {
+                if (Array.getLength(data) != 0) {
+                    Object element = Array.get(data, 0);
+                    if (element != null && !(element instanceof Serializable)) {
+                        dataBinding = jaxbDataBinding;
+                    }
+                }
+            } else {
+
+                // If the input data is not Serializable use JAXB
+                if (!(data instanceof Serializable)) {
+                    dataBinding = jaxbDataBinding;
+                }
+
+                if (data instanceof Cloneable) {
+                    Method clone;
+                    try {
+                        clone = data.getClass().getMethod("clone", (Class[])null);
+                        try {
+                            return clone.invoke(data, (Object[])null);
+                        } catch (InvocationTargetException e) {
+                            if (e.getTargetException() instanceof CloneNotSupportedException) {
+                                // Ignore 
+                            } else {
+                                throw new ServiceRuntimeException(e);
+                            }
+                        } catch (Exception e) {
+                            throw new ServiceRuntimeException(e);
+                        }
+                    } catch (NoSuchMethodException e) {
+                        // Ignore it
+                    }
+                }
+            }
+        }
+
+        Object copy = dataBinding.copy(data);
+        return copy;
+    }
+
+    public Invoker getNext() {
+        return nextInvoker;
+    }
+
+    public void setNext(Invoker next) {
+        this.nextInvoker = next;
+    }
+
+}

Added: tuscany/sandbox/mobile-android/core-databinding/src/main/resources/META-INF/services/org.apache.tuscany.sca.core.ModuleActivator
URL: http://svn.apache.org/viewvc/tuscany/sandbox/mobile-android/core-databinding/src/main/resources/META-INF/services/org.apache.tuscany.sca.core.ModuleActivator?rev=674723&view=auto
==============================================================================
--- tuscany/sandbox/mobile-android/core-databinding/src/main/resources/META-INF/services/org.apache.tuscany.sca.core.ModuleActivator (added)
+++ tuscany/sandbox/mobile-android/core-databinding/src/main/resources/META-INF/services/org.apache.tuscany.sca.core.ModuleActivator Mon Jul  7 22:19:28 2008
@@ -0,0 +1,18 @@
+# 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. 
+# Implementation class for the ExtensionActivator
+org.apache.tuscany.sca.core.databinding.module.DataBindingModuleActivator

Added: tuscany/sandbox/mobile-android/core-databinding/src/test/java/org/apache/tuscany/sca/core/databinding/processor/DataBindingJavaInterfaceProcessorTestCase.java
URL: http://svn.apache.org/viewvc/tuscany/sandbox/mobile-android/core-databinding/src/test/java/org/apache/tuscany/sca/core/databinding/processor/DataBindingJavaInterfaceProcessorTestCase.java?rev=674723&view=auto
==============================================================================
--- tuscany/sandbox/mobile-android/core-databinding/src/test/java/org/apache/tuscany/sca/core/databinding/processor/DataBindingJavaInterfaceProcessorTestCase.java (added)
+++ tuscany/sandbox/mobile-android/core-databinding/src/test/java/org/apache/tuscany/sca/core/databinding/processor/DataBindingJavaInterfaceProcessorTestCase.java Mon Jul  7 22:19:28 2008
@@ -0,0 +1,88 @@
+/*
+ * 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.sca.core.databinding.processor;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.sca.databinding.DataBindingExtensionPoint;
+import org.apache.tuscany.sca.databinding.DefaultDataBindingExtensionPoint;
+import org.apache.tuscany.sca.databinding.annotation.DataBinding;
+import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException;
+import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.interfacedef.impl.OperationImpl;
+import org.apache.tuscany.sca.interfacedef.java.DefaultJavaInterfaceFactory;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterface;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceContract;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;
+import org.osoa.sca.annotations.Remotable;
+import org.w3c.dom.Node;
+
+/**
+ * 
+ */
+public class DataBindingJavaInterfaceProcessorTestCase extends TestCase {
+
+    /**
+     * @see junit.framework.TestCase#setUp()
+     */
+    @Override
+    protected void setUp() throws Exception {
+    }
+
+    /**
+     * @throws InvalidServiceContractException
+     */
+    public final void testVisitInterface() throws InvalidInterfaceException {
+        DataBindingExtensionPoint registry = new DefaultDataBindingExtensionPoint();
+        DataBindingJavaInterfaceProcessor processor = new DataBindingJavaInterfaceProcessor(registry);
+        JavaInterfaceFactory javaFactory = new DefaultJavaInterfaceFactory();
+        
+        JavaInterface contract = javaFactory.createJavaInterface();
+        contract.setJavaClass(MockInterface.class);
+        JavaInterfaceContract interfaceContract = javaFactory.createJavaInterfaceContract();
+        interfaceContract.setInterface(contract);
+        Operation operation = newOperation("call");
+        Operation operation1 = newOperation("call1");
+        contract.getOperations().add(operation);
+        contract.getOperations().add(operation1);
+        contract.setRemotable(true);
+        processor.visitInterface(contract);
+        // Assert.assertEquals("org.w3c.dom.Node", contract.getDataBinding());
+        // Assert.assertEquals("org.w3c.dom.Node",
+        // contract.getOperations().get("call").getDataBinding());
+        // Assert.assertEquals("xml:string",
+        // contract.getOperations().get("call1").getDataBinding());
+    }
+
+    @DataBinding("org.w3c.dom.Node")
+    @Remotable
+    public static interface MockInterface {
+        Node call(Node msg);
+
+        @DataBinding("xml:string")
+        String call1(String msg);
+    }
+
+    private static Operation newOperation(String name) {
+        Operation operation = new OperationImpl();
+        operation.setName(name);
+        return operation;
+    }
+}

Added: tuscany/sandbox/mobile-android/core-databinding/src/test/java/org/apache/tuscany/sca/core/databinding/transformers/IDLTransformerTestCase.java.fixme
URL: http://svn.apache.org/viewvc/tuscany/sandbox/mobile-android/core-databinding/src/test/java/org/apache/tuscany/sca/core/databinding/transformers/IDLTransformerTestCase.java.fixme?rev=674723&view=auto
==============================================================================
--- tuscany/sandbox/mobile-android/core-databinding/src/test/java/org/apache/tuscany/sca/core/databinding/transformers/IDLTransformerTestCase.java.fixme (added)
+++ tuscany/sandbox/mobile-android/core-databinding/src/test/java/org/apache/tuscany/sca/core/databinding/transformers/IDLTransformerTestCase.java.fixme Mon Jul  7 22:19:28 2008
@@ -0,0 +1,229 @@
+/*
+ * 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.core.databinding.transformers;
+
+import static org.apache.tuscany.spi.databinding.DataBinding.IDL_INPUT;
+import static org.apache.tuscany.spi.databinding.DataBinding.IDL_OUTPUT;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.databinding.impl.DataBindingRegistryImpl;
+import org.apache.tuscany.databinding.impl.MediatorImpl;
+import org.apache.tuscany.databinding.impl.TransformationContextImpl;
+import org.apache.tuscany.databinding.impl.TransformerRegistryImpl;
+import org.apache.tuscany.databinding.javabeans.DOMNode2JavaBeanTransformer;
+import org.apache.tuscany.databinding.javabeans.JavaBean2DOMNodeTransformer;
+import org.apache.tuscany.databinding.xml.DOMDataBinding;
+import org.apache.tuscany.databinding.xml.Node2String;
+import org.apache.tuscany.databinding.xml.String2Node;
+import org.apache.tuscany.interfacedef.DataType;
+import org.apache.tuscany.interfacedef.Operation;
+import org.apache.tuscany.interfacedef.impl.DataTypeImpl;
+import org.apache.tuscany.interfacedef.impl.OperationImpl;
+import org.apache.tuscany.interfacedef.util.ElementInfo;
+import org.apache.tuscany.interfacedef.util.TypeInfo;
+import org.apache.tuscany.interfacedef.util.WrapperInfo;
+import org.apache.tuscany.interfacedef.util.XMLType;
+import org.apache.tuscany.spi.databinding.DataBindingRegistry;
+import org.apache.tuscany.spi.databinding.TransformationContext;
+import org.apache.tuscany.spi.databinding.extension.DOMHelper;
+import org.apache.tuscany.spi.databinding.extension.SimpleTypeMapperExtension;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public class IDLTransformerTestCase extends TestCase {
+    private static final String IPO_XML = "<?xml version=\"1.0\"?>" + "<order1"
+                                          + "  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
+                                          + "  xmlns:ipo=\"http://www.example.com/IPO\""
+                                          + "  xsi:schemaLocation=\"http://www.example.com/IPO ipo.xsd\""
+                                          + "  orderDate=\"1999-12-01\">"
+                                          + "  <shipTo exportCode=\"1\" xsi:type=\"ipo:UKAddress\">"
+                                          + "    <name>Helen Zoe</name>"
+                                          + "    <street>47 Eden Street</street>"
+                                          + "    <city>Cambridge</city>"
+                                          + "    <postcode>CB1 1JR</postcode>"
+                                          + "  </shipTo>"
+                                          + "  <billTo xsi:type=\"ipo:USAddress\">"
+                                          + "    <name>Robert Smith</name>"
+                                          + "    <street>8 Oak Avenue</street>"
+                                          + "    <city>Old Town</city>"
+                                          + "    <state>PA</state>"
+                                          + "    <zip>95819</zip>"
+                                          + "  </billTo>"
+                                          + "  <items>"
+                                          + "    <item partNum=\"833-AA\">"
+                                          + "      <productName>Lapis necklace</productName>"
+                                          + "      <quantity>1</quantity>"
+                                          + "      <USPrice>99.95</USPrice>"
+                                          + "      <ipo:comment>Want this for the holidays</ipo:comment>"
+                                          + "      <shipDate>1999-12-05</shipDate>"
+                                          + "    </item>"
+                                          + "  </items>"
+                                          + "</order1>";
+
+    private static final String URI_ORDER_XSD = "http://example.com/order.xsd";
+
+    /**
+     * @see junit.framework.TestCase#setUp()
+     */
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    public void testTransform() throws Exception {
+        List<DataType> types0 = new ArrayList<DataType>();
+        DataType<XMLType> wrapperType = new DataTypeImpl<XMLType>(null, Object.class,
+                                                                  new XMLType(new QName(URI_ORDER_XSD,
+                                                                                        "checkOrderStatus"), null));
+        types0.add(wrapperType);
+        DataType<List<DataType>> inputType0 = new DataTypeImpl<List<DataType>>(IDL_INPUT,
+                                                                                                 Object[].class, types0);
+
+        List<DataType> types1 = new ArrayList<DataType>();
+        DataType<XMLType> customerIdType = new DataTypeImpl<XMLType>(
+                                                                     null,
+                                                                     Object.class,
+                                                                     new XMLType(
+                                                                                 new QName(URI_ORDER_XSD, "customerId"),
+                                                                                 null));
+        DataType<XMLType> orderType = new DataTypeImpl<XMLType>(null, Object.class,
+                                                                new XMLType(new QName(URI_ORDER_XSD, "order"), null));
+        DataType<XMLType> flagType = new DataTypeImpl<XMLType>(null, Object.class, new XMLType(new QName(URI_ORDER_XSD,
+                                                                                                         "flag"), null));
+        types1.add(customerIdType);
+        types1.add(orderType);
+        types1.add(flagType);
+
+        DataType<XMLType> statusType = new DataTypeImpl<XMLType>(null, Object.class,
+                                                                 new XMLType(new QName(URI_ORDER_XSD, "status"), null));
+        DataType<XMLType> responseType = new DataTypeImpl<XMLType>(null, Object.class,
+                                                                   new XMLType(new QName(URI_ORDER_XSD,
+                                                                                         "checkOrderStatusResponse"),
+                                                                               null));
+
+        Operation op = new OperationImpl("checkOrderStatus");
+        op.setInputType(inputType0);
+        op.setOutputType(responseType);
+//        op.setDataBinding(DOMDataBinding.NAME);
+//
+//        inputType0.setOperation(op);
+        op.setWrapperStyle(true);
+        ElementInfo inputElement = new ElementInfo(new QName(URI_ORDER_XSD, "checkOrderStatus"), new TypeInfo(null,
+                                                                                                              false,
+                                                                                                              null));
+//        wrapperType.setMetadata(ElementInfo.class.getName(), inputElement);
+
+        ElementInfo customerId = new ElementInfo(new QName("", "customerId"),
+                                                 SimpleTypeMapperExtension.XSD_SIMPLE_TYPES.get("string"));
+        ElementInfo order = new ElementInfo(new QName("", "order"), new TypeInfo(new QName(URI_ORDER_XSD), false, null));
+        ElementInfo flag = new ElementInfo(new QName("", "flag"), SimpleTypeMapperExtension.XSD_SIMPLE_TYPES.get("int"));
+
+//        customerIdType.setMetadata(ElementInfo.class.getName(), customerId);
+//        orderType.setMetadata(ElementInfo.class.getName(), order);
+//        flagType.setMetadata(ElementInfo.class.getName(), flag);
+//
+//        customerIdType.setOperation(op);
+//        orderType.setOperation(op);
+//        flagType.setOperation(op);
+
+        List<ElementInfo> inputElements = new ArrayList<ElementInfo>();
+        inputElements.add(customerId);
+        inputElements.add(order);
+        inputElements.add(flag);
+
+        ElementInfo statusElement = new ElementInfo(new QName("", "status"), SimpleTypeMapperExtension.XSD_SIMPLE_TYPES
+            .get("string"));
+
+//        statusType.setMetadata(ElementInfo.class.getName(), statusElement);
+//        statusType.setOperation(op);
+
+        List<ElementInfo> outputElements = new ArrayList<ElementInfo>();
+        outputElements.add(statusElement);
+
+        ElementInfo outputElement = new ElementInfo(new QName(URI_ORDER_XSD, "checkOrderStatusResponse"),
+                                                    new TypeInfo(null, false, null));
+
+//        responseType.setMetadata(ElementInfo.class.getName(), inputElement);
+//        responseType.setOperation(op);
+
+        WrapperInfo wrapperInfo = new WrapperInfo(DOMDataBinding.NAME, inputElement, outputElement, inputElements,
+                                                  outputElements);
+        op.setWrapper(wrapperInfo);
+//        op.setDataBinding(DOMDataBinding.NAME);
+
+        MediatorImpl m = new MediatorImpl();
+        TransformerRegistryImpl tr = new TransformerRegistryImpl();
+        tr.registerTransformer(new String2Node());
+        tr.registerTransformer(new Node2String());
+        tr.registerTransformer(new DOMNode2JavaBeanTransformer());
+        tr.registerTransformer(new JavaBean2DOMNodeTransformer());
+        m.setTransformerRegistry(tr);
+        DataBindingRegistry dataBindingRegistry = new DataBindingRegistryImpl();
+        dataBindingRegistry.register(new DOMDataBinding());
+        m.setDataBindingRegistry(dataBindingRegistry);
+
+        Object[] source = new Object[] {"cust001", IPO_XML, Integer.valueOf(1)};
+        Input2InputTransformer t = new Input2InputTransformer();
+        t.setMediator(m);
+
+        TransformationContext context = new TransformationContextImpl();
+        context.setSourceOperation(op);
+        List<DataType<Class>> types = new ArrayList<DataType<Class>>();
+        types.add(new DataTypeImpl<Class>(Object.class.getName(), String.class, String.class));
+        types.add(new DataTypeImpl<Class>("java.lang.String", String.class, String.class));
+        types.add(new DataTypeImpl<Class>(Object.class.getName(), int.class, int.class));
+        DataType<List<DataType<Class>>> inputType1 = new DataTypeImpl<List<DataType<Class>>>(IDL_INPUT, Object[].class,
+                                                                                             types);
+        context.setSourceDataType(inputType1);
+        context.setTargetDataType(op.getInputType());
+        Object[] results = t.transform(source, context);
+        assertEquals(1, results.length);
+        assertTrue(results[0] instanceof Element);
+        Element element = (Element)results[0];
+        assertEquals("http://example.com/order.xsd", element.getNamespaceURI());
+        assertEquals("checkOrderStatus", element.getLocalName());
+
+        TransformationContext context1 = new TransformationContextImpl();
+        DataType<DataType> sourceType = new DataTypeImpl<DataType>(IDL_OUTPUT, Object.class, op.getOutputType());
+
+        context1.setSourceDataType(sourceType);
+        DataType<DataType> targetType = new DataTypeImpl<DataType>(IDL_OUTPUT, Object.class,
+                                                                   new DataTypeImpl<Class>("java.lang.Object",
+                                                                                           String.class, String.class));
+        context1.setTargetDataType(targetType);
+
+        Document factory = DOMHelper.newDocument();
+        Element responseElement = factory
+            .createElementNS("http://example.com/order.wsdl", "p:checkOrderStatusResponse");
+        Element status = factory.createElement("status");
+        responseElement.appendChild(status);
+        status.appendChild(factory.createTextNode("shipped"));
+        Output2OutputTransformer t2 = new Output2OutputTransformer();
+        t2.setMediator(m);
+        Object st = t2.transform(responseElement, context1);
+        assertEquals("shipped", st);
+
+    }
+
+}

Added: tuscany/sandbox/mobile-android/interface-java-jaxws/.classpath
URL: http://svn.apache.org/viewvc/tuscany/sandbox/mobile-android/interface-java-jaxws/.classpath?rev=674723&view=auto
==============================================================================
--- tuscany/sandbox/mobile-android/interface-java-jaxws/.classpath (added)
+++ tuscany/sandbox/mobile-android/interface-java-jaxws/.classpath Mon Jul  7 22:19:28 2008
@@ -0,0 +1,42 @@
+<classpath>
+  <classpathentry kind="src" path="src/main/java"/>
+  <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
+  <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
+  <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
+  <classpathentry kind="src" path="target/jaxws-source" output="target/test-classes"/>
+  <classpathentry kind="output" path="target/classes"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+  <classpathentry kind="var" path="M2_REPO/javax/xml/ws/jaxws-api/2.1/jaxws-api-2.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/javax/xml/bind/jaxb-api/2.1/jaxb-api-2.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/javax/xml/stream/stax-api/1.0-2/stax-api-1.0-2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/javax/activation/activation/1.1/activation-1.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/javax/xml/soap/saaj-api/1.3/saaj-api-1.3.jar"/>
+  <classpathentry kind="var" path="M2_REPO/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/javax/jws/jsr181-api/1.0-MR1/jsr181-api-1.0-MR1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/junit/junit/4.2/junit-4.2.jar"/>
+  <classpathentry kind="src" path="/tuscany-core-spi"/>
+  <classpathentry kind="src" path="/tuscany-extensibility"/>
+  <classpathentry kind="src" path="/tuscany-sca-api"/>
+  <classpathentry kind="src" path="/tuscany-assembly"/>
+  <classpathentry kind="src" path="/tuscany-policy"/>
+  <classpathentry kind="src" path="/tuscany-interface"/>
+  <classpathentry kind="src" path="/tuscany-definitions"/>
+  <classpathentry kind="src" path="/tuscany-contribution"/>
+  <classpathentry kind="var" path="M2_REPO/stax/stax-api/1.0.1/stax-api-1.0.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/xml-apis/xml-apis/1.3.03/xml-apis-1.3.03.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/codehaus/woodstox/wstx-asl/3.2.1/wstx-asl-3.2.1.jar"/>
+  <classpathentry kind="src" path="/tuscany-databinding-jaxb"/>
+  <classpathentry kind="src" path="/tuscany-databinding"/>
+  <classpathentry kind="src" path="/tuscany-core"/>
+  <classpathentry kind="src" path="/tuscany-contribution-java"/>
+  <classpathentry kind="src" path="/tuscany-interface-java"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/geronimo/specs/geronimo-commonj_1.1_spec/1.0/geronimo-commonj_1.1_spec-1.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/cglib/cglib-nodep/2.1_3/cglib-nodep-2.1_3.jar"/>
+  <classpathentry kind="src" path="/tuscany-interface-java-xml"/>
+  <classpathentry kind="src" path="/tuscany-assembly-xml"/>
+  <classpathentry kind="src" path="/tuscany-contribution-namespace"/>
+  <classpathentry kind="var" path="M2_REPO/xalan/xalan/2.7.0/xalan-2.7.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/com/sun/xml/bind/jaxb-impl/2.1.6/jaxb-impl-2.1.6.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jvnet/jaxb/reflection/jaxb2-reflection/2.1.4/jaxb2-reflection-2.1.4.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/easymock/easymock/2.2/easymock-2.2.jar"/>
+</classpath>
\ No newline at end of file

Added: tuscany/sandbox/mobile-android/interface-java-jaxws/.project
URL: http://svn.apache.org/viewvc/tuscany/sandbox/mobile-android/interface-java-jaxws/.project?rev=674723&view=auto
==============================================================================
--- tuscany/sandbox/mobile-android/interface-java-jaxws/.project (added)
+++ tuscany/sandbox/mobile-android/interface-java-jaxws/.project Mon Jul  7 22:19:28 2008
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>tuscany-interface-java-jaxws</name>
+	<comment>Parent POM defining settings that can be used across Tuscany</comment>
+	<projects>
+		<project>tuscany-core-spi</project>
+		<project>tuscany-extensibility</project>
+		<project>tuscany-sca-api</project>
+		<project>tuscany-assembly</project>
+		<project>tuscany-policy</project>
+		<project>tuscany-interface</project>
+		<project>tuscany-definitions</project>
+		<project>tuscany-contribution</project>
+		<project>tuscany-databinding-jaxb</project>
+		<project>tuscany-databinding</project>
+		<project>tuscany-core</project>
+		<project>tuscany-contribution-java</project>
+		<project>tuscany-interface-java</project>
+		<project>tuscany-interface-java-xml</project>
+		<project>tuscany-assembly-xml</project>
+		<project>tuscany-contribution-namespace</project>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
+			<triggers>full,incremental,</triggers>
+			<arguments>
+				<dictionary>
+					<key>LaunchConfigHandle</key>
+					<value>&lt;project&gt;/.externalToolBuilders/org.eclipse.jdt.core.javabuilder (82).launch</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>

Added: tuscany/sandbox/mobile-android/interface-java-jaxws/DISCLAIMER
URL: http://svn.apache.org/viewvc/tuscany/sandbox/mobile-android/interface-java-jaxws/DISCLAIMER?rev=674723&view=auto
==============================================================================
--- tuscany/sandbox/mobile-android/interface-java-jaxws/DISCLAIMER (added)
+++ tuscany/sandbox/mobile-android/interface-java-jaxws/DISCLAIMER Mon Jul  7 22:19:28 2008
@@ -0,0 +1,8 @@
+Apache Tuscany is an effort undergoing incubation at The Apache Software
+Foundation (ASF), sponsored by the Apache Web Services PMC. Incubation is
+required of all newly accepted projects until a further review indicates that
+the infrastructure, communications, and decision making process have stabilized
+in a manner consistent with other successful ASF projects. While incubation
+status is not necessarily a reflection of the completeness or stability of the
+code, it does indicate that the project has yet to be fully endorsed by the ASF.
+

Added: tuscany/sandbox/mobile-android/interface-java-jaxws/LICENSE
URL: http://svn.apache.org/viewvc/tuscany/sandbox/mobile-android/interface-java-jaxws/LICENSE?rev=674723&view=auto
==============================================================================
--- tuscany/sandbox/mobile-android/interface-java-jaxws/LICENSE (added)
+++ tuscany/sandbox/mobile-android/interface-java-jaxws/LICENSE Mon Jul  7 22:19:28 2008
@@ -0,0 +1,205 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   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.
+
+
+

Added: tuscany/sandbox/mobile-android/interface-java-jaxws/NOTICE
URL: http://svn.apache.org/viewvc/tuscany/sandbox/mobile-android/interface-java-jaxws/NOTICE?rev=674723&view=auto
==============================================================================
--- tuscany/sandbox/mobile-android/interface-java-jaxws/NOTICE (added)
+++ tuscany/sandbox/mobile-android/interface-java-jaxws/NOTICE Mon Jul  7 22:19:28 2008
@@ -0,0 +1,6 @@
+${pom.name}
+Copyright (c) 2005 - 2007 The Apache Software Foundation
+
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
+

Added: tuscany/sandbox/mobile-android/interface-java-jaxws/pom.xml
URL: http://svn.apache.org/viewvc/tuscany/sandbox/mobile-android/interface-java-jaxws/pom.xml?rev=674723&view=auto
==============================================================================
--- tuscany/sandbox/mobile-android/interface-java-jaxws/pom.xml (added)
+++ tuscany/sandbox/mobile-android/interface-java-jaxws/pom.xml Mon Jul  7 22:19:28 2008
@@ -0,0 +1,188 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    * 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.    
+-->
+<project>
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.tuscany.sca</groupId>
+        <artifactId>tuscany-modules</artifactId>
+        <version>2.0-incubating-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <artifactId>tuscany-interface-java-jaxws</artifactId>
+    <name>Apache Tuscany Java Interface for JAXWS</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-core-spi</artifactId>
+            <version>2.0-incubating-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-databinding-jaxb</artifactId>
+            <version>2.0-incubating-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-interface-java-xml</artifactId>
+            <version>2.0-incubating-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.2</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>javax.xml.ws</groupId>
+            <artifactId>jaxws-api</artifactId>
+            <version>2.1</version>
+        </dependency>
+
+    </dependencies>
+
+    <repositories>
+        <repository>
+            <id>java.net</id>
+            <name>java.net Maven 1.x Repository</name>
+            <url>http://download.java.net/maven/1</url>
+            <layout>legacy</layout>
+        </repository>
+    </repositories>
+
+    <pluginRepositories>
+        <pluginRepository>
+            <id>java.net2</id>
+            <name>java.net Maven 2.x Repository</name>
+            <url>http://download.java.net/maven/2</url>
+        </pluginRepository>
+    </pluginRepositories>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <argLine>-Djava.endorsed.dirs=target/endorsed</argLine>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy</id>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>copy</goal>
+                        </goals>
+                        <configuration>
+                            <artifactItems>
+                                <artifactItem>
+                                    <groupId>javax.xml.ws</groupId>
+                                    <artifactId>jaxws-api</artifactId>
+                                    <version>2.1</version>
+                                    <type>jar</type>
+                                </artifactItem>
+                                <artifactItem>
+                                    <groupId>javax.xml.bind</groupId>
+                                    <artifactId>jaxb-api</artifactId>
+                                    <version>2.1</version>
+                                    <type>jar</type>
+                                </artifactItem>
+                            </artifactItems>
+                            <outputDirectory>${project.build.directory}/endorsed</outputDirectory>
+                            <overWriteReleases>false</overWriteReleases>
+                            <overWriteSnapshots>true</overWriteSnapshots>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <version>1.0</version>
+                <executions>
+                    <execution>
+                        <id>add-test-source</id>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>add-test-source</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>target/jaxws-source</source>
+                            </sources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>jaxws-maven-plugin</artifactId>
+                <version>1.9</version>
+                <executions>
+                    <execution>
+                        <phase>process-resources</phase>
+                        <goals>
+                            <goal>wsimport</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <packageName>com.example.stock</packageName>
+                    <wsdlDirectory>${basedir}/src/test/resources/wsdl</wsdlDirectory>
+                    <wsdlFiles>
+                        <!-- 
+                            <wsdlFile>StockQuotes.wsdl</wsdlFile>
+                        -->
+                        <wsdlFile>StockExceptionTest.wsdl</wsdlFile>
+                    </wsdlFiles>
+                    <sourceDestDir>${project.build.directory}/jaxws-source</sourceDestDir>
+                    <verbose>false</verbose>
+                    <xnocompile>true</xnocompile>
+                </configuration>
+            </plugin>
+            <!-- 
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>jaxws-maven-plugin</artifactId>
+                <version>1.9</version>
+                <configuration>
+                    <sei>org.apache.tuscany.sca.interfacedef.java.jaxws.MyServiceImpl</sei>
+                    <genWsdl>true</genWsdl>
+                </configuration>
+                <executions>
+                    <execution>
+                        <phase>process-test-classes</phase>
+                        <goals>
+                            <goal>wsgen-test</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            -->
+        </plugins>
+    </build>
+
+</project>