summaryrefslogtreecommitdiffstats
path: root/branches/sca-java-1.x/modules/implementation-java-runtime/src
diff options
context:
space:
mode:
authorrfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68>2009-04-23 18:23:06 +0000
committerrfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68>2009-04-23 18:23:06 +0000
commit561690e6ecf5aa4eb7ddd1093ada36b0f0433cb4 (patch)
tree84c18d965e9ba436755b96a045a883fceacc80ab /branches/sca-java-1.x/modules/implementation-java-runtime/src
parent310e9fb3277f36407eac8146745517d90ba15285 (diff)
Improve the handling of INOUT and OUT parameters using JAX-WS Holder
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@768005 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'branches/sca-java-1.x/modules/implementation-java-runtime/src')
-rw-r--r--branches/sca-java-1.x/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationInvoker.java73
1 files changed, 24 insertions, 49 deletions
diff --git a/branches/sca-java-1.x/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationInvoker.java b/branches/sca-java-1.x/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationInvoker.java
index f86d6c750c..0d1dcd96f8 100644
--- a/branches/sca-java-1.x/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationInvoker.java
+++ b/branches/sca-java-1.x/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationInvoker.java
@@ -33,6 +33,7 @@ import org.apache.tuscany.sca.implementation.java.JavaImplementation;
import org.apache.tuscany.sca.interfacedef.ConversationSequence;
import org.apache.tuscany.sca.interfacedef.DataType;
import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.interfacedef.ParameterMode;
import org.apache.tuscany.sca.interfacedef.java.impl.JavaInterfaceUtil;
import org.apache.tuscany.sca.invocation.DataExchangeSemantics;
import org.apache.tuscany.sca.invocation.Invoker;
@@ -72,7 +73,6 @@ public class JavaImplementationInvoker implements Invoker, DataExchangeSemantics
@SuppressWarnings("unchecked")
public Message invoke(Message msg) {
- int argumentHolderCount = 0;
Operation op = msg.getOperation();
if (op == null) {
op = this.operation;
@@ -130,28 +130,21 @@ public class JavaImplementationInvoker implements Invoker, DataExchangeSemantics
}
}
+ int argumentHolderCount = 0;
+
// Holder pattern. Any payload parameters <T> which are should be in holders are placed in Holder<T>.
// Only check Holder for remotable interfaces
if (imethod != null && op.getInterface().isRemotable()) {
- Class<?>[] params = imethod.getParameterTypes();
- if (params != null) {
- for (int i = 0; i < params.length; i++) {
- Class<?> parameter = params[i];
- if (Holder.class == parameter) {
- // System.out.println( "JavaImplementationInvoker.invoke parameter " + i + " is Holder. Payload isArray=" + (payload != null ? payload.getClass().isArray() : "null" ));
- if (payload != null && !payload.getClass().isArray()) {
- // Promote single param from <T> to Holder<T>
- payload = new Holder(payload);
- } else {
- // Promote array params from [<T>] to [Holder<T>]
- Object[] payloadArray = (Object[])payload;
- for (int j = 0; payloadArray != null && j < payloadArray.length; j++) {
- Object item = payloadArray[j];
- payloadArray[j] = new Holder(item);
- }
- }
- argumentHolderCount++;
+ List<DataType> inputTypes = op.getInputType().getLogical();
+ for (int i = 0, size = inputTypes.size(); i < size; i++) {
+ if (ParameterMode.IN != op.getParameterModes().get(i)) {
+ // Promote array params from [<T>] to [Holder<T>]
+ Object[] payloadArray = (Object[])payload;
+ for (int j = 0; payloadArray != null && j < payloadArray.length; j++) {
+ Object item = payloadArray[j];
+ payloadArray[j] = new Holder(item);
}
+ argumentHolderCount++;
}
}
}
@@ -175,29 +168,16 @@ public class JavaImplementationInvoker implements Invoker, DataExchangeSemantics
if (argumentHolderCount > 0) {
// Holder pattern. Any payload Holder<T> types are returned as the message body.
List returnArgs = new ArrayList<Object>();
- int foundHolders = 0;
if (imethod != null) {
- Class<?>[] params = imethod.getParameterTypes();
- if (params != null) {
- for (int i = 0; i < params.length; i++) {
- Class<?> parameter = params[i];
- // System.out.println( "JavaImplementationInvoker.invoke return parameter " + i + " type=" + parameter.getClass().getName() );
- if (Holder.class == parameter) {
- if (payload != null && !payload.getClass().isArray()) {
- // Demote params from Holder<T> to <T>.
- Holder<Object> holder = (Holder<Object>)payload;
- returnArgs.add(holder.value);
- foundHolders++;
- } else {
- // Demote array params from Holder<T> to <T>.
- Object[] payloadArray = (Object[])payload;
- for (int j = 0; j < payloadArray.length; j++) {
- Holder<Object> item = (Holder<Object>)payloadArray[j];
- payloadArray[j] = item.value;
- returnArgs.add(payloadArray[j]);
- }
- foundHolders++;
- }
+ for (int i = 0, size = op.getParameterModes().size(); i < size; i++) {
+ // System.out.println( "JavaImplementationInvoker.invoke return parameter " + i + " type=" + parameter.getClass().getName() );
+ if (ParameterMode.IN != op.getParameterModes().get(i)) {
+ // Demote array params from Holder<T> to <T>.
+ Object[] payloadArray = (Object[])payload;
+ for (int j = 0; j < payloadArray.length; j++) {
+ Holder<Object> item = (Holder<Object>)payloadArray[j];
+ payloadArray[j] = item.value;
+ returnArgs.add(payloadArray[j]);
}
}
}
@@ -205,15 +185,10 @@ public class JavaImplementationInvoker implements Invoker, DataExchangeSemantics
// Although payload items are returned in a list, currently only support 1 return type.
if (returnArgs.size() == 1) {
Object value = returnArgs.get(0);
- if ((value != null) && (value.getClass().isArray())) {
- Object[] values = (Object[])value;
- if ((values != null) && (values.length > 0)) {
- msg.setBody(values[0]);
- }
- } else
- msg.setBody(value);
- } else
+ msg.setBody(value);
+ } else {
msg.setBody(returnArgs.toArray());
+ }
} else {
msg.setBody(ret);
}