You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by rf...@apache.org on 2008/02/22 22:55:39 UTC

svn commit: r630333 - in /incubator/tuscany/java/sca/modules: binding-feed-atom/src/main/java/org/apache/tuscany/sca/binding/feed/provider/ core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/ core-spi/src/main/java/org/apache/t...

Author: rfeng
Date: Fri Feb 22 13:55:36 2008
New Revision: 630333

URL: http://svn.apache.org/viewvc?rev=630333&view=rev
Log:
A few enhancements to PBV: support fault copy, honor clone() and allowsPBR

Modified:
    incubator/tuscany/java/sca/modules/binding-feed-atom/src/main/java/org/apache/tuscany/sca/binding/feed/provider/FeedBindingListenerServlet.java
    incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataBindingRuntimeWireProcessor.java
    incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/PassByValueInterceptor.java
    incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/invocation/InvocationChain.java
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/InvocationChainImpl.java

Modified: incubator/tuscany/java/sca/modules/binding-feed-atom/src/main/java/org/apache/tuscany/sca/binding/feed/provider/FeedBindingListenerServlet.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/binding-feed-atom/src/main/java/org/apache/tuscany/sca/binding/feed/provider/FeedBindingListenerServlet.java?rev=630333&r1=630332&r2=630333&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/binding-feed-atom/src/main/java/org/apache/tuscany/sca/binding/feed/provider/FeedBindingListenerServlet.java (original)
+++ incubator/tuscany/java/sca/modules/binding-feed-atom/src/main/java/org/apache/tuscany/sca/binding/feed/provider/FeedBindingListenerServlet.java Fri Feb 22 13:55:36 2008
@@ -22,7 +22,6 @@
 import java.io.OutputStreamWriter;
 import java.io.UnsupportedEncodingException;
 import java.io.Writer;
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.StringTokenizer;
 import java.util.logging.Logger;
@@ -38,7 +37,6 @@
 import org.apache.abdera.model.Content;
 import org.apache.abdera.model.Entry;
 import org.apache.abdera.model.Feed;
-import org.apache.abdera.model.Link;
 import org.apache.abdera.model.Service;
 import org.apache.abdera.model.Workspace;
 import org.apache.commons.codec.binary.Base64;
@@ -53,8 +51,6 @@
 import org.apache.tuscany.sca.invocation.MessageFactory;
 import org.apache.tuscany.sca.runtime.RuntimeWire;
 
-import com.sun.xml.bind.v2.schemagen.xmlschema.List;
-
 
 
 /**
@@ -103,6 +99,7 @@
         // Get the invokers for the supported operations
         Operation getOperation = null;
         for (InvocationChain invocationChain : this.wire.getInvocationChains()) {
+            invocationChain.setAllowsPassByReference(true);
             Operation operation = invocationChain.getTargetOperation();
             String operationName = operation.getName();
             if (operationName.equals("getFeed")) {

Modified: incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataBindingRuntimeWireProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataBindingRuntimeWireProcessor.java?rev=630333&r1=630332&r2=630333&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataBindingRuntimeWireProcessor.java (original)
+++ incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataBindingRuntimeWireProcessor.java Fri Feb 22 13:55:36 2008
@@ -153,7 +153,8 @@
                 // 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, chain, targetOperation);
+                    interceptor =
+                        new PassByValueInterceptor(dataBindings, faultExceptionMapper, chain, targetOperation);
                 }
             }
             if (interceptor != null) {

Modified: incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/PassByValueInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/PassByValueInterceptor.java?rev=630333&r1=630332&r2=630333&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/PassByValueInterceptor.java (original)
+++ incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/PassByValueInterceptor.java Fri Feb 22 13:55:36 2008
@@ -21,6 +21,7 @@
 
 import java.io.Serializable;
 import java.lang.reflect.Array;
+import java.lang.reflect.Method;
 import java.util.IdentityHashMap;
 import java.util.List;
 import java.util.Map;
@@ -30,11 +31,15 @@
 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
@@ -45,6 +50,8 @@
 public class PassByValueInterceptor implements Interceptor {
 
     private DataBindingExtensionPoint dataBindings;
+    private FaultExceptionMapper faultExceptionMapper;
+
     private DataBinding[] inputDataBindings;
     private DataBinding outputDataBinding;
     private DataBinding javaBeanDataBinding;
@@ -58,12 +65,17 @@
      * @param dataBindings databinding extension point
      * @param operation the intercepted operation
      */
-    public PassByValueInterceptor(DataBindingExtensionPoint dataBindings, InvocationChain chain, Operation 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);
 
@@ -97,9 +109,28 @@
         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
@@ -176,6 +207,20 @@
                 // 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 (Exception e) {
+                            throw new ServiceRuntimeException(e);
+                        } 
+                    } catch (NoSuchMethodException e) {
+                        // Ignore it
+                    }
                 }
             }
         }

Modified: incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/invocation/InvocationChain.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/invocation/InvocationChain.java?rev=630333&r1=630332&r2=630333&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/invocation/InvocationChain.java (original)
+++ incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/invocation/InvocationChain.java Fri Feb 22 13:55:36 2008
@@ -29,7 +29,7 @@
  *
  * @version $Rev$ $Date$
  */
-public interface InvocationChain extends PassByValueAware {
+public interface InvocationChain {
     /**
      * Returns the target operation for this invocation chain.
      *
@@ -86,5 +86,11 @@
      * @param interceptor The interceptor to add
      */
     void addInterceptor(int index, Interceptor interceptor);
-
+    
+    /**
+     * Indicate if the data can be passed in by reference as they won't be mutated.
+     * @return true if pass-by-reference is allowed
+     */
+    boolean allowsPassByReference();
+    void setAllowsPassByReference(boolean allowsPBR);
 }

Modified: incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/InvocationChainImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/InvocationChainImpl.java?rev=630333&r1=630332&r2=630333&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/InvocationChainImpl.java (original)
+++ incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/InvocationChainImpl.java Fri Feb 22 13:55:36 2008
@@ -36,6 +36,7 @@
     private Operation sourceOperation;
     private Operation targetOperation;
     private List<Invoker> invokers = new ArrayList<Invoker>();
+    private boolean allowsPassByReference;
 
     public InvocationChainImpl(Operation operation) {
         assert operation != null;
@@ -117,6 +118,10 @@
     }
 
     public boolean allowsPassByReference() {
+        if(allowsPassByReference) {
+            // No need to check the invokers
+            return true;
+        }
         // Check if any of the invokers allows pass-by-reference
         boolean allowsPBR = false;
         for (Invoker i : invokers) {
@@ -128,6 +133,10 @@
             }
         }
         return allowsPBR;
+    }
+
+    public void setAllowsPassByReference(boolean allowsPBR) {
+        this.allowsPassByReference = allowsPBR;
     }
 
 }



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