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