summaryrefslogtreecommitdiffstats
path: root/branches/sca-java-1.x/modules
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
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')
-rw-r--r--branches/sca-java-1.x/modules/binding-corba-runtime/src/test/java/org/apache/tuscany/sca/binding/corba/testing/service/mocks/TestOperation.java19
-rw-r--r--branches/sca-java-1.x/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/JDKInvocationHandler.java26
-rw-r--r--branches/sca-java-1.x/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaImplementationInvoker.java73
-rw-r--r--branches/sca-java-1.x/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/JAXWSJavaInterfaceProcessor.java28
-rw-r--r--branches/sca-java-1.x/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/impl/JavaInterfaceIntrospectorImpl.java34
-rw-r--r--branches/sca-java-1.x/modules/interface/src/main/java/org/apache/tuscany/sca/interfacedef/Operation.java62
-rw-r--r--branches/sca-java-1.x/modules/interface/src/main/java/org/apache/tuscany/sca/interfacedef/ParameterMode.java28
-rw-r--r--branches/sca-java-1.x/modules/interface/src/main/java/org/apache/tuscany/sca/interfacedef/impl/OperationImpl.java42
8 files changed, 168 insertions, 144 deletions
diff --git a/branches/sca-java-1.x/modules/binding-corba-runtime/src/test/java/org/apache/tuscany/sca/binding/corba/testing/service/mocks/TestOperation.java b/branches/sca-java-1.x/modules/binding-corba-runtime/src/test/java/org/apache/tuscany/sca/binding/corba/testing/service/mocks/TestOperation.java
index 58b161d587..07a9119afb 100644
--- a/branches/sca-java-1.x/modules/binding-corba-runtime/src/test/java/org/apache/tuscany/sca/binding/corba/testing/service/mocks/TestOperation.java
+++ b/branches/sca-java-1.x/modules/binding-corba-runtime/src/test/java/org/apache/tuscany/sca/binding/corba/testing/service/mocks/TestOperation.java
@@ -6,15 +6,15 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
- * under the License.
+ * under the License.
*/
package org.apache.tuscany.sca.binding.corba.testing.service.mocks;
@@ -28,6 +28,7 @@ import org.apache.tuscany.sca.interfacedef.ConversationSequence;
import org.apache.tuscany.sca.interfacedef.DataType;
import org.apache.tuscany.sca.interfacedef.Interface;
import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.interfacedef.ParameterMode;
import org.apache.tuscany.sca.interfacedef.util.WrapperInfo;
import org.apache.tuscany.sca.interfacedef.util.XMLType;
import org.apache.tuscany.sca.policy.Intent;
@@ -78,7 +79,7 @@ public class TestOperation implements Operation {
public WrapperInfo getInputWrapper() {
return null;
}
-
+
public WrapperInfo getOutputWrapper() {
return null;
}
@@ -98,7 +99,7 @@ public class TestOperation implements Operation {
public boolean isInputWrapperStyle() {
return false;
}
-
+
public boolean isOutputWrapperStyle() {
return false;
}
@@ -150,7 +151,7 @@ public class TestOperation implements Operation {
public void setInputWrapper(WrapperInfo wrapperInfo) {
}
-
+
public void setOutputWrapper(WrapperInfo wrapperInfo) {
}
@@ -158,7 +159,7 @@ public class TestOperation implements Operation {
public void setInputWrapperStyle(boolean wrapperStyle) {
}
-
+
public void setOutputWrapperStyle(boolean wrapperStyle) {
}
@@ -187,4 +188,8 @@ public class TestOperation implements Operation {
public void setType(IntentAttachPointType type) {
}
+ public List<ParameterMode> getParameterModes() {
+ return null;
+ }
+
}
diff --git a/branches/sca-java-1.x/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/JDKInvocationHandler.java b/branches/sca-java-1.x/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/JDKInvocationHandler.java
index 5bb648ce61..b2b30db558 100644
--- a/branches/sca-java-1.x/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/JDKInvocationHandler.java
+++ b/branches/sca-java-1.x/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/JDKInvocationHandler.java
@@ -46,6 +46,7 @@ import org.apache.tuscany.sca.interfacedef.DataType;
import org.apache.tuscany.sca.interfacedef.Interface;
import org.apache.tuscany.sca.interfacedef.InterfaceContract;
import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.interfacedef.ParameterMode;
import org.apache.tuscany.sca.interfacedef.java.JavaOperation;
import org.apache.tuscany.sca.invocation.InvocationChain;
import org.apache.tuscany.sca.invocation.Invoker;
@@ -154,18 +155,15 @@ public class JDKInvocationHandler implements InvocationHandler, Serializable {
Object result = invoke(chain, args, wire, source);
- Operation operation = chain.getTargetOperation();
+ Operation operation = chain.getSourceOperation();
if (operation != null && operation.getInterface().isRemotable()) {
+ List<DataType> inputTypes = operation.getInputType().getLogical();
// Returned Holder data <T> are placed back in Holder<T>.
- Class<?>[] parameters = method.getParameterTypes();
- if (parameters != null) {
- for (int i = 0; i < parameters.length; i++) {
- Class<?> parameterType = parameters[i];
- if (Holder.class == parameterType) {
- // Pop results and place in holder (demote).
- Holder holder = (Holder)args[i];
- holder.value = result;
- }
+ for (int i = 0, size = inputTypes.size(); i < size; i++) {
+ if (operation.getParameterModes().get(i) != ParameterMode.IN) {
+ // Pop results and place in holder (demote).
+ Holder holder = (Holder)args[i];
+ holder.value = result;
}
}
}
@@ -295,7 +293,7 @@ public class JDKInvocationHandler implements InvocationHandler, Serializable {
// Holder pattern. Items stored in a Holder<T> are promoted to T.
// After the invoke, the returned data <T> are placed back in Holder<T>.
if (operation != null && operation.getInterface().isRemotable()) {
- args = promoteHolderArgs(args);
+ args = promoteHolderArgs(chain.getSourceOperation(), args);
}
msg.setBody(args);
@@ -543,16 +541,16 @@ public class JDKInvocationHandler implements InvocationHandler, Serializable {
* @param args containing Holders and other objects.
* @return Object []
*/
- protected static Object[] promoteHolderArgs(Object[] args) {
+ protected static Object[] promoteHolderArgs(Operation operation, Object[] args) {
if (args == null)
return args;
Object[] promotedArgs = new Object[args.length];
-
+ List<ParameterMode> modes = operation.getParameterModes();
for (int i = 0; i < args.length; i++) {
Object argument = args[i];
if (argument != null) {
- if (isHolder(argument)) {
+ if (modes.get(i) != ParameterMode.IN) {
promotedArgs[i] = ((Holder)argument).value;
} else {
promotedArgs[i] = args[i];
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);
}
diff --git a/branches/sca-java-1.x/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/JAXWSJavaInterfaceProcessor.java b/branches/sca-java-1.x/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/JAXWSJavaInterfaceProcessor.java
index 79a304bc2b..7471427a3d 100644
--- a/branches/sca-java-1.x/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/JAXWSJavaInterfaceProcessor.java
+++ b/branches/sca-java-1.x/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/JAXWSJavaInterfaceProcessor.java
@@ -6,15 +6,15 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
- * under the License.
+ * under the License.
*/
package org.apache.tuscany.sca.interfacedef.java.jaxws;
@@ -33,6 +33,7 @@ import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
+import javax.jws.WebParam.Mode;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
import javax.xml.namespace.QName;
@@ -47,6 +48,7 @@ import org.apache.tuscany.sca.interfacedef.DataType;
import org.apache.tuscany.sca.interfacedef.FaultExceptionMapper;
import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException;
import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.interfacedef.ParameterMode;
import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl;
import org.apache.tuscany.sca.interfacedef.java.JavaInterface;
import org.apache.tuscany.sca.interfacedef.java.JavaOperation;
@@ -59,7 +61,7 @@ import org.apache.tuscany.sca.interfacedef.util.XMLType;
/**
* Introspect the java class/interface with JSR-181 and JAXWS annotations
- *
+ *
* @version $Rev$ $Date$
*/
public class JAXWSJavaInterfaceProcessor implements JavaInterfaceVisitor {
@@ -91,6 +93,16 @@ public class JAXWSJavaInterfaceProcessor implements JavaInterfaceVisitor {
}
}
+ private ParameterMode getParameterMode(WebParam.Mode mode) {
+ if (mode == Mode.INOUT) {
+ return ParameterMode.INOUT;
+ } else if (mode == Mode.OUT) {
+ return ParameterMode.OUT;
+ } else {
+ return ParameterMode.IN;
+ }
+ }
+
public void visitInterface(JavaInterface contract) throws InvalidInterfaceException {
final Class<?> clazz = contract.getJavaClass();
@@ -170,6 +182,7 @@ public class JAXWSJavaInterfaceProcessor implements JavaInterfaceVisitor {
if (logical instanceof XMLType) {
((XMLType)logical).setElementName(element);
}
+ operation.getParameterModes().set(i, getParameterMode(param.mode()));
}
}
WebResult result = method.getAnnotation(WebResult.class);
@@ -279,6 +292,9 @@ public class JAXWSJavaInterfaceProcessor implements JavaInterfaceVisitor {
type = ((XMLType)logical).getTypeName();
}
inputElements.add(new ElementInfo(element, new TypeInfo(type, false, null)));
+ if (param != null) {
+ operation.getParameterModes().set(i, getParameterMode(param.mode()));
+ }
}
List<ElementInfo> outputElements = new ArrayList<ElementInfo>();
@@ -301,11 +317,11 @@ public class JAXWSJavaInterfaceProcessor implements JavaInterfaceVisitor {
}
String db = inputWrapperDT != null ? inputWrapperDT.getDataBinding() : JAXB_DATABINDING;
-
+
WrapperInfo inputWrapperInfo =
new WrapperInfo(db, new ElementInfo(inputWrapper, null), inputElements);
WrapperInfo outputWrapperInfo =
- new WrapperInfo(db, new ElementInfo(outputWrapper, null), outputElements);
+ new WrapperInfo(db, new ElementInfo(outputWrapper, null), outputElements);
inputWrapperInfo.setWrapperType(inputWrapperDT);
outputWrapperInfo.setWrapperType(outputWrapperDT);
diff --git a/branches/sca-java-1.x/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/impl/JavaInterfaceIntrospectorImpl.java b/branches/sca-java-1.x/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/impl/JavaInterfaceIntrospectorImpl.java
index fe99adccec..bfada23663 100644
--- a/branches/sca-java-1.x/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/impl/JavaInterfaceIntrospectorImpl.java
+++ b/branches/sca-java-1.x/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/impl/JavaInterfaceIntrospectorImpl.java
@@ -6,15 +6,15 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
- * under the License.
+ * under the License.
*/
package org.apache.tuscany.sca.interfacedef.java.impl;
@@ -33,6 +33,7 @@ import java.util.Map;
import java.util.Set;
import javax.xml.namespace.QName;
+import javax.xml.ws.Holder;
import org.apache.tuscany.sca.interfacedef.ConversationSequence;
import org.apache.tuscany.sca.interfacedef.DataType;
@@ -41,6 +42,7 @@ import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException;
import org.apache.tuscany.sca.interfacedef.InvalidOperationException;
import org.apache.tuscany.sca.interfacedef.Operation;
import org.apache.tuscany.sca.interfacedef.OverloadedOperationException;
+import org.apache.tuscany.sca.interfacedef.ParameterMode;
import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl;
import org.apache.tuscany.sca.interfacedef.java.JavaInterface;
import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;
@@ -55,7 +57,7 @@ import org.osoa.sca.annotations.Remotable;
/**
* Default implementation of a Java interface introspector.
- *
+ *
* @version $Rev$ $Date$
*/
public class JavaInterfaceIntrospectorImpl {
@@ -219,6 +221,9 @@ public class JavaInterfaceIntrospectorImpl {
conversationSequence = ConversationSequence.CONVERSATION_CONTINUE;
}
+ JavaOperation operation = new JavaOperationImpl();
+ operation.setName(name);
+
// Set outputType to null for void
XMLType xmlReturnType = new XMLType(new QName(ns, "return"), null);
DataType<XMLType> returnDataType =
@@ -233,16 +238,19 @@ public class JavaInterfaceIntrospectorImpl {
XMLType xmlParamType = new XMLType(new QName(ns, "arg" + i), null);
DataTypeImpl<XMLType> xmlDataType = new DataTypeImpl<XMLType>(
UNKNOWN_DATABINDING, paramType, genericParamTypes[i],xmlParamType);
+ ParameterMode mode = ParameterMode.IN;
// Holder pattern. Physical types of Holder<T> classes are updated to <T> to aid in transformations.
- if ( isHolder( paramType )) {
+ if ( Holder.class == paramType ) {
Type firstActual = getFirstActualType( genericParamTypes[ i ] );
if ( firstActual != null ) {
xmlDataType.setPhysical( (Class<?>)firstActual );
+ mode = ParameterMode.INOUT;
}
}
paramDataTypes.add( xmlDataType);
+ operation.getParameterModes().add(mode);
}
-
+
// Fault types
List<DataType> faultDataTypes = new ArrayList<DataType>(faultTypes.length);
Type[] genericFaultTypes = method.getGenericExceptionTypes();
@@ -262,8 +270,6 @@ public class JavaInterfaceIntrospectorImpl {
DataType<List<DataType>> inputType =
new DataTypeImpl<List<DataType>>(IDL_INPUT, Object[].class, paramDataTypes);
- JavaOperation operation = new JavaOperationImpl();
- operation.setName(name);
operation.setInputType(inputType);
operation.setOutputType(returnDataType);
operation.setFaultTypes(faultDataTypes);
@@ -276,18 +282,6 @@ public class JavaInterfaceIntrospectorImpl {
}
/**
- * Given a Class, tells if it is a Holder by comparing to "javax.xml.ws.Holder"
- * @param testClass
- * @return boolean whether testClass is Holder type.
- */
- protected static boolean isHolder( Class testClass ) {
- if ( testClass.getName().startsWith( "javax.xml.ws.Holder" )) {
- return true;
- }
- return false;
- }
-
- /**
* Given a Class<T>, returns T, otherwise null.
* @param testClass
* @return
diff --git a/branches/sca-java-1.x/modules/interface/src/main/java/org/apache/tuscany/sca/interfacedef/Operation.java b/branches/sca-java-1.x/modules/interface/src/main/java/org/apache/tuscany/sca/interfacedef/Operation.java
index 51b7645e57..395960d04f 100644
--- a/branches/sca-java-1.x/modules/interface/src/main/java/org/apache/tuscany/sca/interfacedef/Operation.java
+++ b/branches/sca-java-1.x/modules/interface/src/main/java/org/apache/tuscany/sca/interfacedef/Operation.java
@@ -6,15 +6,15 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
- * under the License.
+ * under the License.
*/
package org.apache.tuscany.sca.interfacedef;
@@ -35,28 +35,28 @@ import org.apache.tuscany.sca.policy.PolicySetAttachPoint;
public interface Operation extends Cloneable, PolicySetAttachPoint {
/**
* Returns the name of the operation.
- *
+ *
* @return the name of the operation
*/
String getName();
/**
* Sets the name of the operation.
- *
+ *
* @param name the name of the operation
*/
void setName(String name);
/**
* Returns true if the model element is unresolved.
- *
+ *
* @return true if the model element is unresolved.
*/
boolean isUnresolved();
/**
* Sets whether the model element is unresolved.
- *
+ *
* @param unresolved whether the model element is unresolved
*/
void setUnresolved(boolean unresolved);
@@ -64,11 +64,11 @@ public interface Operation extends Cloneable, PolicySetAttachPoint {
/**
* Get the data type that represents the input of this operation. The logic
* type is a list of data types and each element represents a parameter
- *
+ *
* @return the inputType
*/
DataType<List<DataType>> getInputType();
-
+
/**
* @param inputType
*/
@@ -76,11 +76,11 @@ public interface Operation extends Cloneable, PolicySetAttachPoint {
/**
* Get the data type for the output
- *
+ *
* @return the outputType
*/
DataType getOutputType();
-
+
/**
* @param outputType
*/
@@ -88,51 +88,51 @@ public interface Operation extends Cloneable, PolicySetAttachPoint {
/**
* Get a list of data types to represent the faults/exceptions
- *
+ *
* @return the faultTypes
*/
List<DataType> getFaultTypes();
-
+
/**
* @param faultTypes
*/
void setFaultTypes(List<DataType> faultTypes);
-
+
/**
* Get the owning interface
* @return
*/
Interface getInterface();
-
+
/**
* Set the owning interface
* @param interfaze
*/
void setInterface(Interface interfaze);
-
+
/**
* Get the sequence of the conversation
* @return
*/
ConversationSequence getConversationSequence();
-
+
/**
* Set the sequence of conversation for the operation
* @param sequence
*/
void setConversationSequence(ConversationSequence sequence);
-
+
/**
* Indicate if the operation is non-blocking
* @return
*/
boolean isNonBlocking();
-
+
/**
* Set the operation to be non-blocking
*/
void setNonBlocking(boolean nonBlocking);
-
+
/**
* @return the inputWrapperInfo
*/
@@ -142,7 +142,7 @@ public interface Operation extends Cloneable, PolicySetAttachPoint {
* @param wrapperInfo the inputWrapperInfo to set
*/
void setInputWrapper(WrapperInfo wrapperInfo);
-
+
/**
* @return the outputWrapperInfo
*/
@@ -152,7 +152,7 @@ public interface Operation extends Cloneable, PolicySetAttachPoint {
* @param wrapperInfo the outputWrapperInfo to set
*/
// TODO - WI
- void setOutputWrapper(WrapperInfo wrapperInfo);
+ void setOutputWrapper(WrapperInfo wrapperInfo);
/**
* @return the inputWrapperStyle
@@ -163,7 +163,7 @@ public interface Operation extends Cloneable, PolicySetAttachPoint {
* @param inputWrapperStyle the wrapperStyle to set
*/
void setInputWrapperStyle(boolean wrapperStyle);
-
+
/**
* @return the outputWrapperStyle
*/
@@ -173,7 +173,7 @@ public interface Operation extends Cloneable, PolicySetAttachPoint {
* @param outputWrapperStyle the wrapperStyle to set
*/
void setOutputWrapperStyle(boolean wrapperStyle);
-
+
/**
* @deprecated This should be the WrapperInfo.getDataBinding()
* Get the databinding for the operation
@@ -181,7 +181,7 @@ public interface Operation extends Cloneable, PolicySetAttachPoint {
*/
@Deprecated
String getDataBinding();
-
+
/**
* @deprecated This should be the WrapperInfo.setDataBinding()
* Set the databinding for the operation
@@ -189,10 +189,10 @@ public interface Operation extends Cloneable, PolicySetAttachPoint {
*/
@Deprecated
void setDataBinding(String dataBinding);
-
+
/**
* Returns true if the operation is dynamic.
- *
+ *
* @return true if the operation is dynamic otherwise false
*/
boolean isDynamic();
@@ -205,11 +205,11 @@ public interface Operation extends Cloneable, PolicySetAttachPoint {
/**
* Get the synthesized fault beans for this operation
- *
+ *
* @return the fault beans
*/
Map<QName, List<DataType<XMLType>>> getFaultBeans();
-
+
/**
* Set the synthesized fault beans for this operation
* @param faultBeans
@@ -220,5 +220,7 @@ public interface Operation extends Cloneable, PolicySetAttachPoint {
* Implementations must support cloning.
*/
Object clone() throws CloneNotSupportedException;
-
+
+ List<ParameterMode> getParameterModes();
+
}
diff --git a/branches/sca-java-1.x/modules/interface/src/main/java/org/apache/tuscany/sca/interfacedef/ParameterMode.java b/branches/sca-java-1.x/modules/interface/src/main/java/org/apache/tuscany/sca/interfacedef/ParameterMode.java
new file mode 100644
index 0000000000..c4244a3480
--- /dev/null
+++ b/branches/sca-java-1.x/modules/interface/src/main/java/org/apache/tuscany/sca/interfacedef/ParameterMode.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tuscany.sca.interfacedef;
+
+/**
+ * Parameter mode
+ * @see http://java.sun.com/javase/6/docs/api/javax/jws/WebParam.Mode.html
+ */
+public enum ParameterMode {
+ IN, OUT, INOUT;
+}
diff --git a/branches/sca-java-1.x/modules/interface/src/main/java/org/apache/tuscany/sca/interfacedef/impl/OperationImpl.java b/branches/sca-java-1.x/modules/interface/src/main/java/org/apache/tuscany/sca/interfacedef/impl/OperationImpl.java
index 8aca0d52e3..de4514c168 100644
--- a/branches/sca-java-1.x/modules/interface/src/main/java/org/apache/tuscany/sca/interfacedef/impl/OperationImpl.java
+++ b/branches/sca-java-1.x/modules/interface/src/main/java/org/apache/tuscany/sca/interfacedef/impl/OperationImpl.java
@@ -6,15 +6,15 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
- * under the License.
+ * under the License.
*/
package org.apache.tuscany.sca.interfacedef.impl;
@@ -29,6 +29,7 @@ import org.apache.tuscany.sca.interfacedef.ConversationSequence;
import org.apache.tuscany.sca.interfacedef.DataType;
import org.apache.tuscany.sca.interfacedef.Interface;
import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.interfacedef.ParameterMode;
import org.apache.tuscany.sca.interfacedef.util.WrapperInfo;
import org.apache.tuscany.sca.interfacedef.util.XMLType;
import org.apache.tuscany.sca.policy.Intent;
@@ -37,7 +38,7 @@ import org.apache.tuscany.sca.policy.PolicySet;
/**
* Represents an operation on a service interface.
- *
+ *
* @version $Rev$ $Date$
*/
public class OperationImpl implements Operation {
@@ -49,6 +50,7 @@ public class OperationImpl implements Operation {
private List<DataType> faultTypes;
private Interface interfaze;
private ConversationSequence conversationSequence = ConversationSequence.CONVERSATION_NONE;
+ private List<ParameterMode> parameterModes = new ArrayList<ParameterMode>();
private boolean nonBlocking;
// TODO - WI
//private WrapperInfo wrapper;
@@ -58,7 +60,7 @@ public class OperationImpl implements Operation {
private WrapperInfo outputWrapper;
private boolean dynamic;
private Map<QName, List<DataType<XMLType>>> faultBeans;
-
+
private List<PolicySet> applicablePolicySets = new ArrayList<PolicySet>();
private List<PolicySet> policySets = new ArrayList<PolicySet>();
private List<Intent> requiredIntents = new ArrayList<Intent>();
@@ -254,19 +256,19 @@ public class OperationImpl implements Operation {
//public void setWrapper(WrapperInfo wrapperInfo) {
// this.wrapper = wrapperInfo;
//}
-
+
public WrapperInfo getInputWrapper() {
return inputWrapper;
}
-
+
public void setInputWrapper(WrapperInfo inputWrapper) {
this.inputWrapper = inputWrapper;
}
-
+
public WrapperInfo getOutputWrapper() {
return outputWrapper;
}
-
+
public void setOutputWrapper(WrapperInfo outputWrapper) {
this.outputWrapper = outputWrapper;
}
@@ -284,7 +286,7 @@ public class OperationImpl implements Operation {
public void setInputWrapperStyle(boolean wrapperStyle) {
this.inputWrapperStyle = wrapperStyle;
}
-
+
/**
* @return the outputWrapperStyle
*/
@@ -297,8 +299,8 @@ public class OperationImpl implements Operation {
*/
public void setOutputWrapperStyle(boolean wrapperStyle) {
this.outputWrapperStyle = wrapperStyle;
- }
-
+ }
+
// TODO - WI
// These are deprecated and are a little awkward now that
// we split input wrapper from output wrapper
@@ -322,11 +324,11 @@ public class OperationImpl implements Operation {
public void setDynamic(boolean b) {
this.dynamic = b;
}
-
+
public Map<QName, List<DataType<XMLType>>> getFaultBeans() {
return faultBeans;
}
-
+
public void setFaultBeans(Map<QName, List<DataType<XMLType>>> faultBeans) {
this.faultBeans = faultBeans;
}
@@ -334,7 +336,7 @@ public class OperationImpl implements Operation {
@Override
public OperationImpl clone() throws CloneNotSupportedException {
OperationImpl copy = (OperationImpl) super.clone();
-
+
final List<DataType> clonedFaultTypes = new ArrayList<DataType>(this.faultTypes.size());
for (DataType t : this.faultTypes) {
clonedFaultTypes.add((DataType) t.clone());
@@ -350,11 +352,11 @@ public class OperationImpl implements Operation {
new DataTypeImpl<List<DataType>>(inputType.getPhysical(), clonedLogicalTypes);
clonedInputType.setDataBinding(inputType.getDataBinding());
copy.inputType = clonedInputType;
-
+
if (this.outputType != null) {
copy.outputType = (DataType) this.outputType.clone();
}
-
+
return copy;
}
@@ -377,5 +379,9 @@ public class OperationImpl implements Operation {
public void setType(IntentAttachPointType type) {
this.type = type;
}
-
+
+ public List<ParameterMode> getParameterModes() {
+ return parameterModes;
+ }
+
}