diff options
author | rfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68> | 2009-04-23 18:23:06 +0000 |
---|---|---|
committer | rfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68> | 2009-04-23 18:23:06 +0000 |
commit | 561690e6ecf5aa4eb7ddd1093ada36b0f0433cb4 (patch) | |
tree | 84c18d965e9ba436755b96a045a883fceacc80ab /branches/sca-java-1.x/modules/implementation-java-runtime/src | |
parent | 310e9fb3277f36407eac8146745517d90ba15285 (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.java | 73 |
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); } |