summaryrefslogtreecommitdiffstats
path: root/sca-java-2.x/trunk/modules/core-databinding
diff options
context:
space:
mode:
authorbdaniel <bdaniel@13f79535-47bb-0310-9956-ffa450edef68>2010-09-17 18:10:18 +0000
committerbdaniel <bdaniel@13f79535-47bb-0310-9956-ffa450edef68>2010-09-17 18:10:18 +0000
commit51e5ca754d3d79393793fddcfd6079f3b0c70d8a (patch)
tree596d6a05fc034ec253af5caea34b735b6e4f72ac /sca-java-2.x/trunk/modules/core-databinding
parent7cb62d52d3c3b680c6984b987a1b212445c1bef8 (diff)
TUSCANY-3664 Migrate 1.x Holder support to 2.x and add support for non-void methods and multiple Holders
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@998232 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-java-2.x/trunk/modules/core-databinding')
-rw-r--r--sca-java-2.x/trunk/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataTransformationInterceptor.java52
1 files changed, 51 insertions, 1 deletions
diff --git a/sca-java-2.x/trunk/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataTransformationInterceptor.java b/sca-java-2.x/trunk/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataTransformationInterceptor.java
index de29088c1d..7bf9833d04 100644
--- a/sca-java-2.x/trunk/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataTransformationInterceptor.java
+++ b/sca-java-2.x/trunk/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataTransformationInterceptor.java
@@ -19,11 +19,16 @@
package org.apache.tuscany.sca.core.databinding.wire;
+import java.lang.reflect.Method;
+import java.lang.reflect.Type;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import org.apache.tuscany.sca.databinding.Mediator;
+import org.apache.tuscany.sca.interfacedef.DataType;
import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.interfacedef.java.JavaOperation;
import org.apache.tuscany.sca.invocation.Interceptor;
import org.apache.tuscany.sca.invocation.Invoker;
import org.apache.tuscany.sca.invocation.Message;
@@ -50,6 +55,21 @@ public class DataTransformationInterceptor implements Interceptor {
super();
this.sourceOperation = sourceOperation;
this.targetOperation = targetOperation;
+ if ( sourceOperation instanceof JavaOperation ) {
+ JavaOperation javaOp = (JavaOperation) sourceOperation;
+ Method sourceMethod = javaOp.getJavaMethod();
+ }
+ // Holder pattern. In order to perform data mediation on Holder return types, it is
+ // necessary to set up a data transformation on the Holder<T> class T. on return.
+ DataType<DataType> returnTargetType = getFirstHolderType( sourceOperation.getInputType() );
+ if ( returnTargetType != null ) {
+ this.sourceOperation.setOutputType(returnTargetType);
+ }
+ returnTargetType = getFirstHolderType( targetOperation.getInputType() );
+ if ( returnTargetType != null ) {
+ this.targetOperation.setOutputType(returnTargetType);
+ }
+
this.mediator = mediator;
this.invocable = invocable;
}
@@ -64,12 +84,14 @@ public class DataTransformationInterceptor implements Interceptor {
Object input = mediator.mediateInput(msg.getBody(), sourceOperation, targetOperation, metadata);
msg.setBody(input);
Message resultMsg = next.invoke(msg);
- Object result = resultMsg.getBody();
+
if (sourceOperation.isNonBlocking()) {
// Not to reset the message body
return resultMsg;
}
+ Object result = resultMsg.getBody();
+
if (resultMsg.isFault()) {
Object transformedFault = null;
if ((result instanceof Exception) && !(result instanceof RuntimeException)) {
@@ -95,4 +117,32 @@ public class DataTransformationInterceptor implements Interceptor {
this.next = next;
}
+ /**
+ * Returns return type for first Holder in input list.
+ * Returns null if the inputs do not contain a Holder.
+ */
+ protected static DataType<DataType> getFirstHolderType( DataType<List<DataType>> inputTypes ) {
+ if (inputTypes != null) {
+ List<DataType> logicalType = inputTypes.getLogical();
+ if (logicalType != null) {
+ for (int i = 0; i < logicalType.size(); i++) {
+ DataType dataType = logicalType.get(i);
+ if (isHolder(dataType.getGenericType())) {
+ // Fix up output from void to returned data type.
+ // System.out.println("DataTransformationInterceptor.<> source input[" + i + "] is Holder, logicalType=" + dataType);
+ return dataType;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ protected static boolean isHolder( Type type ) {
+ String typeString = type.toString();
+ if ( typeString.startsWith( "javax.xml.ws.Holder" ) ) {
+ return true;
+ }
+ return false;
+ }
}