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 | |
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 '')
9 files changed, 168 insertions, 146 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; + } + } diff --git a/branches/sca-java-1.x/samples/pom.xml b/branches/sca-java-1.x/samples/pom.xml index 1624c2991f..53bfce00bf 100644 --- a/branches/sca-java-1.x/samples/pom.xml +++ b/branches/sca-java-1.x/samples/pom.xml @@ -86,9 +86,7 @@ <module>helloworld-ws-reference-secure</module> <module>helloworld-ws-sdo</module> <module>helloworld-ws-sdo-webapp</module> - <!-- <module>holder-ws-service</module> - --> <module>implementation-composite</module> <module>implementation-crud</module> <module>implementation-crud-extension</module> |