You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by ba...@apache.org on 2006/10/07 20:17:12 UTC
svn commit: r453977 [1/2] - in /webservices/axis2/trunk/java/modules/jaxws:
src/org/apache/axis2/jaxws/client/factory/
src/org/apache/axis2/jaxws/client/proxy/
src/org/apache/axis2/jaxws/description/ src/org/apache/axis2/jaxws/i18n/
src/org/apache/axis...
Author: barrettj
Date: Sat Oct 7 11:17:10 2006
New Revision: 453977
URL: http://svn.apache.org/viewvc?view=rev&rev=453977
Log:
AXIS2-1321 AXIS2-1322
Patch submitted by Nikhil Thaker
Added:
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/proxy/JAXWSProxyHandler.java
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/DocLitBareMethodMarshaller.java
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/DocLitWrappedMethodMarshaller.java
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/MethodMarshaller.java
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/MethodParameter.java
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/factory/
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/factory/MethodMarshallerFactory.java
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/DocLitBareMethodMarshallerImpl.java
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/DocLitWrappedMethodMarshallerImpl.java
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/MethodMarshallerImpl.java
Removed:
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/factory/DescriptorFactory.java
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/factory/ProxyHandlerFactory.java
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/proxy/BaseProxyHandler.java
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/proxy/DocLitProxyHandler.java
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/proxy/ProxyDescriptor.java
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/proxy/RPCLitProxyHandler.java
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/Mapper.java
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/MapperImpl.java
Modified:
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/proxy/ProxyAsyncListener.java
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/OperationDescription.java
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/i18n/resource.properties
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/registry/FactoryRegistry.java
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/JavaBeanDispatcher.java
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/spi/ServiceDelegate.java
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/wrapper/JAXBWrapperTool.java
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/wrapper/impl/JAXBWrapperToolImpl.java
webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/description/AnnotationServiceImplDescriptionTests.java
webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/framework/JAXWSTest.java
webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/sample/AddNumbersTests.java
webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/sample/BareTests.java
webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/sample/NonWrapTests.java
webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/sample/WrapTests.java
webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/sample/nonwrap/DocLitNonWrapPortTypeImpl.java
webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/sample/nonwrap/META-INF/services.xml
webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/sample/wrap/DocLitWrapImpl.java
Added: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/proxy/JAXWSProxyHandler.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/proxy/JAXWSProxyHandler.java?view=auto&rev=453977
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/proxy/JAXWSProxyHandler.java (added)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/proxy/JAXWSProxyHandler.java Sat Oct 7 11:17:10 2006
@@ -0,0 +1,412 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ * Copyright 2006 International Business Machines Corp.
+ *
+ * Licensed 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.axis2.jaxws.client.proxy;
+
+import java.beans.IntrospectionException;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.concurrent.Future;
+
+import javax.jws.soap.SOAPBinding;
+import javax.jws.soap.SOAPBinding.ParameterStyle;
+import javax.xml.bind.JAXBException;
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.ws.AsyncHandler;
+import javax.xml.ws.Binding;
+import javax.xml.ws.Response;
+import javax.xml.ws.WebServiceException;
+
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.jaxws.AxisController;
+import org.apache.axis2.jaxws.BindingProvider;
+import org.apache.axis2.jaxws.ExceptionFactory;
+import org.apache.axis2.jaxws.core.InvocationContext;
+import org.apache.axis2.jaxws.core.InvocationContextFactory;
+import org.apache.axis2.jaxws.core.MessageContext;
+import org.apache.axis2.jaxws.core.controller.AxisInvocationController;
+import org.apache.axis2.jaxws.core.controller.InvocationController;
+import org.apache.axis2.jaxws.description.EndpointDescription;
+import org.apache.axis2.jaxws.description.OperationDescription;
+import org.apache.axis2.jaxws.description.ServiceDescription;
+import org.apache.axis2.jaxws.handler.PortData;
+import org.apache.axis2.jaxws.i18n.Messages;
+import org.apache.axis2.jaxws.impl.AsyncListener;
+import org.apache.axis2.jaxws.marshaller.MethodMarshaller;
+import org.apache.axis2.jaxws.marshaller.factory.MethodMarshallerFactory;
+import org.apache.axis2.jaxws.message.Message;
+import org.apache.axis2.jaxws.message.MessageException;
+import org.apache.axis2.jaxws.message.Protocol;
+import org.apache.axis2.jaxws.registry.FactoryRegistry;
+import org.apache.axis2.jaxws.spi.ServiceDelegate;
+import org.apache.axis2.jaxws.util.WSDLWrapper;
+import org.apache.axis2.jaxws.wrapper.impl.JAXBWrapperException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+// import com.sun.xml.bind.v2.runtime.reflect.Lister;
+
+/**
+ * ProxyHandler is the java.lang.reflect.InvocationHandler implementation.
+ * When jaxws client calls the method on proxy object that it gets using the getPort
+ * ServiceDelegate api, the Inovke method on ProxyHandler is Invoked.
+ * ProxyHandler uses EndpointInterfaceDescriptor and finds out if
+ * 1) The client call is Document Literal or Rpc Literal
+ * 2) The WSDL is wrapped or unWrapped.
+ *
+ * ProxyHandler then reads OperationDescription using Method name called by Client
+ * From OperationDescription it does the following
+ * 1) if the wsdl isWrapped() reads RequestWrapper Class and responseWrapperClass
+ * 2) then reads the webParams for the Operation.
+ *
+ * isWrapped() = true and DocLiteral then
+ * ProxyHandler then uses WrapperTool to create Request that is a Wrapped JAXBObject.
+ * Creates JAXBBlock using JAXBBlockFactory
+ * Creates MessageContext->Message and sets JAXBBlock to xmlPart as RequestMsgCtx in InvocationContext.
+ * Makes call to InvocationController.
+ * Reads ResponseMsgCtx ->MessageCtx->Message->XMLPart.
+ * Converts that to JAXBlock using JAXBBlockFactory and returns the BO from this JAXBBlock.
+ *
+ * isWrapped() != true and DocLiteral then
+ * ProxyHandler creates the JAXBBlock for the input request creates a
+ * MessageContext that is then used by IbvocationController to invoke.
+ * Response is read and return object is derived using @Webresult annotation.
+ * A JAXBBlock is created from the Response and the BO from JAXBBlock is
+ * returned.
+ *
+ * RPCLiteral
+ * TBD
+ *
+ */
+
+public class JAXWSProxyHandler extends BindingProvider implements
+ InvocationHandler {
+ private static Log log = LogFactory.getLog(JAXWSProxyHandler.class);
+
+ //Reference to ServiceDelegate instance that was used to create the Proxy
+ private ServiceDelegate delegate = null;
+ protected ServiceDescription serviceDesc = null;
+ protected EndpointDescription endpointDesc = null;
+ protected OperationDescription operationDesc = null;
+ protected MethodMarshaller methodMarshaller = null;
+ private PortData port = null;
+ private Class seiClazz = null;
+ private Method method = null;
+
+ public JAXWSProxyHandler(ServiceDelegate delegate, Class seiClazz, PortData port) {
+ super();
+ this.delegate = delegate;
+ this.seiClazz = seiClazz;
+ this.port = port;
+ this.serviceDesc=delegate.getServiceDescription();
+// FIXME: This probably needs to be more robust; can there be > 1 endpoints; if so, how choose which one?
+ this.endpointDesc = serviceDesc.getEndpointDescription(seiClazz)[0];
+ initRequestContext();
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
+ *
+ * Invoke method checks to see if BindingProvider method was invoked by client if yes, it uses reflection and invokes the BindingProvider method.
+ * If SEI method was called then it delegates to InvokeSEIMethod().
+ */
+ public Object invoke(Object proxy, Method method, Object[] args)
+ throws Throwable {
+ if (log.isDebugEnabled()) {
+ log.debug("Attemping to invoke Method: " +method.getName());
+ }
+
+ this.method = method;
+
+ if(!isValidMethodCall(method)){
+ throw ExceptionFactory.makeWebServiceException(Messages.getMessage("proxyErr1",method.getName(), seiClazz.getName()));
+ }
+
+ if(!isPublic(method)){
+ throw ExceptionFactory.makeWebServiceException("Invalid Method Call, Method "+method.getName() + " not a public method");
+ }
+
+ if(isBindingProviderInvoked(method)){
+ if (log.isDebugEnabled()) {
+ log.debug("Invoking method on Binding Provider");
+ }
+ try{
+ return method.invoke(this, args);
+ }catch(Throwable e){
+ throw ExceptionFactory.makeMessageException(e);
+ }
+
+ }
+ else{
+ operationDesc = endpointDesc.getEndpointInterfaceDescription().getOperation(method);
+ if(isMethodExcluded()){
+ throw ExceptionFactory.makeWebServiceException("Invalid Method Call, Method "+method.getName() + " has been excluded using @webMethod annotation");
+ }
+ try{
+ return InvokeSEIMethod(method, args);
+ }catch(Throwable e){
+ throw ExceptionFactory.makeWebServiceException(e);
+ }
+ }
+ }
+
+ /**
+ * InvokeSEIMethod invokes Axis engine using methods on InvocationController. Create request Invocation context, instantiates AxisInvocationController and
+ * runs invoke.
+ *
+ */
+ private Object InvokeSEIMethod(Method method, Object[] args)throws Throwable{
+ if (log.isDebugEnabled()) {
+ log.debug("Attempting to Invoke SEI Method "+ method.getName());
+ }
+ initialize();
+ InvocationContext requestIC = InvocationContextFactory.createInvocationContext(null);
+ MessageContext requestContext = createRequest(method, args);
+ //Enable MTOM on the Message if the property was
+ //set on the SOAPBinding.
+ Binding bnd = getBinding();
+ if (bnd != null && bnd instanceof SOAPBinding) {
+ javax.xml.ws.soap.SOAPBinding soapBnd = (javax.xml.ws.soap.SOAPBinding) bnd;
+ if (soapBnd.isMTOMEnabled()) {
+ Message requestMsg = requestContext.getMessage();
+ requestMsg.setMTOMEnabled(true);
+ }
+ }
+ requestContext.setOperationDescription(operationDesc);
+ requestIC.setRequestMessageContext(requestContext);
+ InvocationController controller = new AxisInvocationController();
+ requestIC.setServiceClient(delegate.getServiceClient(port.getPortName()));
+
+ //check if the call is OneWay, Async or Sync
+ //if(operationDesc.isOneWay() || method.getReturnType().getName().equals("void")){
+ if(operationDesc.isOneWay()){
+ if(log.isDebugEnabled()){
+ log.debug("OneWay Call");
+ }
+ controller.invokeOneWay(requestIC);
+ }
+
+ if(method.getReturnType().isAssignableFrom(Future.class)){
+ if(log.isDebugEnabled()){
+ log.debug("Async Callback");
+ }
+ //Get AsyncHandler from Objects and sent that to InvokeAsync
+ AsyncHandler asyncHandler = null;
+ for(Object obj:args){
+ if(obj !=null && AsyncHandler.class.isAssignableFrom(obj.getClass())){
+ asyncHandler = (AsyncHandler)obj;
+ break;
+ }
+ }
+ if(asyncHandler == null){
+ throw ExceptionFactory.makeWebServiceException("AynchHandler null for Async callback, Invalid AsyncHandler callback Object");
+ }
+ AsyncListener listener = createProxyListener(args);
+ requestIC.setAsyncListener(listener);
+ requestIC.setExecutor(delegate.getExecutor());
+ return controller.invokeAsync(requestIC, asyncHandler);
+ }
+
+ if(method.getReturnType().isAssignableFrom(Response.class)){
+ if(log.isDebugEnabled()){
+ log.debug("Async Polling");
+ }
+ AsyncListener listener = createProxyListener(args);
+ requestIC.setAsyncListener(listener);
+ requestIC.setExecutor(delegate.getExecutor());
+ return controller.invokeAsync(requestIC);
+ }
+
+ if(!operationDesc.isOneWay()){
+ InvocationContext responseIC = controller.invoke(requestIC);
+
+ MessageContext responseContext = responseIC.getResponseMessageContext();
+ Object responseObj = createResponse(method, args, responseContext);
+ return responseObj;
+ }
+ return null;
+ }
+
+ private AsyncListener createProxyListener(Object[] args){
+ ProxyAsyncListener listener = new ProxyAsyncListener();
+ listener.setHandler(this);
+ listener.setInputArgs(args);
+ return listener;
+ }
+
+ protected boolean isAsync(){
+ String methodName = method.getName();
+ Class returnType = method.getReturnType();
+ return methodName.endsWith("Async") && (returnType.isAssignableFrom(Response.class) || returnType.isAssignableFrom(Future.class));
+ }
+ /**
+ * Create request context for the method call. This request context will be used by InvocationController to route the method call to axis engine.
+ * @param method
+ * @param args
+ * @return
+ */
+ protected MessageContext createRequest(Method method, Object[] args) throws Throwable{
+ if (log.isDebugEnabled()) {
+ log.debug("Converting objects to Message");
+ }
+ Message message = methodMarshaller.marshalRequest(args);
+
+ if (log.isDebugEnabled()) {
+ log.debug("Objects converted to Message");
+ }
+ MessageContext request = new MessageContext();
+ request.setMessage(message);
+ request.getProperties().putAll(getRequestContext());
+ if (log.isDebugEnabled()) {
+ log.debug("Request Created");
+ }
+ return request;
+ }
+
+ /**
+ * Creates response context for the method call. This response context will be used to create response result to the client call.
+ * @param method
+ * @param responseContext
+ * @return
+ */
+ protected Object createResponse(Method method, Object[] args, MessageContext responseContext)throws Throwable{
+ Message responseMsg = responseContext.getMessage();
+ if (log.isDebugEnabled()) {
+ log.debug("Converting Message to Response Object");
+ }
+ Object object = methodMarshaller.demarshalResponse(responseMsg, args);
+ if (log.isDebugEnabled()) {
+ log.debug("Message Converted to response Object");
+ }
+ return object;
+ }
+
+ private boolean isBindingProviderInvoked(Method method){
+ Class methodsClass = method.getDeclaringClass();
+ return (seiClazz == methodsClass)?false:true;
+ }
+
+ private boolean isValidMethodCall(Method method){
+ Class clazz = method.getDeclaringClass();
+ if(clazz == javax.xml.ws.BindingProvider.class || clazz == seiClazz){
+ return true;
+ }
+ return false;
+ }
+
+ public void setDelegate(ServiceDelegate delegate) {
+ this.delegate = delegate;
+ }
+
+ protected void initRequestContext() {
+ String soapAddress = null;
+ String soapAction = null;
+ String endPointAddress = port.getEndpointAddress();
+ WSDLWrapper wsdl = delegate.getServiceDescription().getWSDLWrapper();
+ QName serviceName = delegate.getServiceName();
+ QName portName = port.getPortName();
+ if (wsdl != null) {
+ soapAddress = wsdl.getSOAPAddress(serviceName, portName);
+ soapAction = wsdl.getSOAPAction(serviceName, portName);
+ }
+ super.initRequestContext(endPointAddress, soapAddress, soapAction);
+ }
+
+ protected ServiceDelegate getDelegate() {
+ return delegate;
+ }
+
+ private boolean isPublic(Method method){
+ return Modifier.isPublic(method.getModifiers());
+ }
+
+ private boolean isMethodExcluded(){
+ return operationDesc.isWebMethodExcluded();
+ }
+
+ public PortData getPort() {
+ return port;
+ }
+
+ public void setPort(PortData port) {
+ this.port = port;
+ }
+
+ public Class getSeiClazz() {
+ return seiClazz;
+ }
+
+ public void setSeiClazz(Class seiClazz) {
+ this.seiClazz = seiClazz;
+ }
+ private void initialize(){
+ SOAPBinding.Style styleOnSEI = endpointDesc.getEndpointInterfaceDescription().getSoapBindingStyle();
+ SOAPBinding.Style styleOnMethod = operationDesc.getSoapBindingStyle();
+ if(styleOnMethod!=null && styleOnSEI!=styleOnMethod){
+ throw ExceptionFactory.makeWebServiceException(Messages.getMessage("proxyErr2"));
+ }
+
+ MethodMarshallerFactory cf = (MethodMarshallerFactory) FactoryRegistry.getFactory(MethodMarshallerFactory.class);
+ if(styleOnSEI == SOAPBinding.Style.DOCUMENT){
+ methodMarshaller = createDocLitMethodMarshaller(cf);
+ }
+ if(styleOnSEI == SOAPBinding.Style.RPC){
+ methodMarshaller = createRPCLitMethodMarshaller(cf);
+
+ }
+
+ }
+ private MethodMarshaller createDocLitMethodMarshaller(MethodMarshallerFactory cf){
+ ParameterStyle parameterStyle = null;
+ if(isDocLitBare()){
+ parameterStyle = SOAPBinding.ParameterStyle.BARE;
+ }
+ if(isDocLitWrapped()){
+ parameterStyle = SOAPBinding.ParameterStyle.WRAPPED;
+ }
+ //FIXME: The protocol should actually come from the binding information included in
+ // either the WSDL or an annotation.
+ return cf.createDocLitMethodMarshaller(parameterStyle, serviceDesc, endpointDesc, operationDesc, Protocol.soap11);
+ }
+
+ private MethodMarshaller createRPCLitMethodMarshaller(MethodMarshallerFactory cf){
+ return cf.createDocLitMethodMarshaller(null, serviceDesc, endpointDesc, operationDesc, Protocol.soap11);
+ }
+ protected boolean isDocLitBare(){
+ SOAPBinding.ParameterStyle methodParamStyle = operationDesc.getSoapBindingParameterStyle();
+ if(methodParamStyle!=null){
+ return methodParamStyle == SOAPBinding.ParameterStyle.BARE;
+ }
+ else{
+ SOAPBinding.ParameterStyle SEIParamStyle = endpointDesc.getEndpointInterfaceDescription().getSoapBindingParameterStyle();
+ return SEIParamStyle == SOAPBinding.ParameterStyle.BARE;
+ }
+ }
+
+ protected boolean isDocLitWrapped(){
+ SOAPBinding.ParameterStyle methodParamStyle = operationDesc.getSoapBindingParameterStyle();
+ if(methodParamStyle!=null){
+ return methodParamStyle == SOAPBinding.ParameterStyle.WRAPPED;
+ }
+ else{
+ SOAPBinding.ParameterStyle SEIParamStyle = endpointDesc.getEndpointInterfaceDescription().getSoapBindingParameterStyle();
+ return SEIParamStyle == SOAPBinding.ParameterStyle.WRAPPED;
+ }
+ }
+}
Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/proxy/ProxyAsyncListener.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/proxy/ProxyAsyncListener.java?view=diff&rev=453977&r1=453976&r2=453977
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/proxy/ProxyAsyncListener.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/proxy/ProxyAsyncListener.java Sat Oct 7 11:17:10 2006
@@ -16,13 +16,6 @@
*/
package org.apache.axis2.jaxws.client.proxy;
-import java.util.concurrent.ExecutionException;
-
-import org.apache.axiom.om.OMElement;
-import org.apache.axiom.soap.SOAPBody;
-import javax.xml.ws.WebServiceException;
-
-import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.axis2.jaxws.AxisCallback;
import org.apache.axis2.jaxws.ExceptionFactory;
import org.apache.axis2.jaxws.core.MessageContext;
@@ -37,18 +30,23 @@
*/
public class ProxyAsyncListener extends AsyncListener {
- BaseProxyHandler handler = null;
+ JAXWSProxyHandler handler = null;
+ Object[] inputArgs = null;
public ProxyAsyncListener() {
super();
}
-
- public BaseProxyHandler getHandler() {
+
+ public JAXWSProxyHandler getHandler() {
return handler;
}
- public void setHandler(BaseProxyHandler handler) {
+ public void setHandler(JAXWSProxyHandler handler) {
this.handler = handler;
}
+
+ public void setInputArgs(Object[] inputArgs){
+ this.inputArgs = inputArgs;
+ }
/**
* @param cb
@@ -62,8 +60,8 @@
try{
//I will delegate the request to create respose to proxyHandler since it has all the logic written to create response for Sync and oneWay.
- return handler.createResponse(null, mc);
- }catch(Exception e){
+ return handler.createResponse(null,inputArgs, mc);
+ }catch(Throwable e){
throw ExceptionFactory.makeWebServiceException(e);
}
}
Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/OperationDescription.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/OperationDescription.java?view=diff&rev=453977&r1=453976&r2=453977
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/OperationDescription.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/description/OperationDescription.java Sat Oct 7 11:17:10 2006
@@ -26,6 +26,7 @@
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
+import javax.jws.WebParam.Mode;
import javax.jws.soap.SOAPBinding;
import javax.xml.namespace.QName;
import javax.xml.ws.RequestWrapper;
@@ -138,6 +139,7 @@
// TODO: Should WebParam annotation be moved to the ParameterDescription?
private WebParam[] webParamAnnotations;
private String[] webParamNames;
+ private Mode[] webParamMode;
private String[] webParamTNS;
@@ -439,14 +441,7 @@
ArrayList<String> buildNames = new ArrayList<String>();
WebParam[] webParams = getWebParam();
for (WebParam currentParam:webParams) {
- // TODO: Is skipping param names of "asyncHandler" correct? This came from original ProxyDescription class and ProxyTest fails without this code
- // Due to code in DocLitProxyHandler.getParamValues() which does not add values for AsyncHandler objects.
- // It probably DOES need to be skipped, albeit more robustly (check that the type of the param is javax.xml.ws.AsyncHandler also)
- // The reason is that the handler is part of the JAX-WS async callback programming model; it is NOT part of the formal params
- // to the actual method and therefore is NOT part of the JAXB request wrapper
- if(!currentParam.name().equals("asyncHandler")){
buildNames.add(currentParam.name());
- }
}
webParamNames = buildNames.toArray(new String[0]);
}
@@ -459,20 +454,24 @@
ArrayList<String> buildNames = new ArrayList<String>();
WebParam[] webParams = getWebParam();
for (WebParam currentParam:webParams) {
- // TODO: Is skipping param names of "asyncHandler" correct? This came from original ProxyDescription class and ProxyTest fails without this code
- // Due to code in DocLitProxyHandler.getParamValues() which does not add values for AsyncHandler objects.
- // It probably DOES need to be skipped, albeit more robustly (check that the type of the param is javax.xml.ws.AsyncHandler also)
- // The reason is that the handler is part of the JAX-WS async callback programming model; it is NOT part of the formal params
- // to the actual method and therefore is NOT part of the JAXB request wrapper
- if(!currentParam.name().equals("asyncHandler")){
- buildNames.add(currentParam.targetNamespace());
- }
+ buildNames.add(currentParam.targetNamespace());
}
webParamTNS = buildNames.toArray(new String[0]);
}
return webParamTNS;
}
+ public Mode[] getWebParamModes(){
+ if(webParamMode == null){
+ ArrayList<Mode> buildModes = new ArrayList<Mode>();
+ WebParam[] webParams = getWebParam();
+ for (WebParam currentParam:webParams){
+ buildModes.add(currentParam.mode());
+ }
+ webParamMode = buildModes.toArray(new Mode[0]);
+ }
+ return webParamMode;
+ }
public String getWebParamTNS(String name){
WebParam[] webParams = getWebParam();
for (WebParam currentParam:webParams){
@@ -584,4 +583,13 @@
}
return onewayIsOneway.booleanValue();
}
+
+ public boolean isWebMethodExcluded(){
+ WebMethod webMethod = getWebMethod();
+ if(webMethod == null){
+ return false;
+ }
+
+ return webMethod.exclude();
+ }
}
Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/i18n/resource.properties
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/i18n/resource.properties?view=diff&rev=453977&r1=453976&r2=453977
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/i18n/resource.properties (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/i18n/resource.properties Sat Oct 7 11:17:10 2006
@@ -60,6 +60,7 @@
ICCreateOpClientErr1=Cannot create OperationClient. ServiceClient is null.
ICCreateOpClientErr2=Cannot create OperationClient. Operation qname is null.
proxyErr1=An attempt was made to invoke method {0}, but this method is not available on the javax.xml.ws.BindingProvider or {1} class.
+proxyErr2=@SOAPBinding annotation Style on SEI and @SOAPBinding annotation Style on Method should be same.
JAXWSMessageReceiverNoServiceClass=No service class was found for this AxisService.
EndpointControllerErr2=No Service class is configured for this endpoint. Processing cannot continue.
EndpointControllerErr4=Error loading the provider implementation class {0}. Processing cannot continue.
@@ -91,6 +92,7 @@
JAXBWrapperErr4=Internal Assertion Error. Number of child objects does not match the number of child names in wrap() method.
JAXBWrapperErr5=Internal Assertion Error. Number of child names does not match the number of bean properties in JAXB class {0}.
JAXBWrapperErr6=Internal Assertion Error. JAXB object {0} does not have a bean property named {1}.
+JAXBWrapperErr7=Internal Assertion Error. Method Parameters that holds child objects to create JAXBObject is null.
JAXBSourceNamespaceErr=The DOMSource must be Namespace Aware.
AttachmentsNotSupported=SAAJ Attachments are not supported yet.
protoNotFound00=An associated Protocol was not found for the binding {0}.
@@ -100,4 +102,9 @@
AsyncListenerErr1=AxisCallback Object cannot be null, Internal error.
DocLitProxyHandlerErr1=As per WS-I compliance, Multi part WSDL not allowed for Doc/Lit NON Wrapped request, Method invoked has multiple input parameter.
DocLitProxyHandlerErr2 = Method Input parameter for NON Wrapped Request cannot be null.
-SOAP12WithSAAJ12Err=A SOAP 1.2 Message cannot be rendered in an SAAJ 1.2 Object Model.
\ No newline at end of file
+DocLitProxyHandlerErr3=Method parameter type javax.xml.ws.AsyncHandler should only be used with Async Callback operations, method is Async if it returns a Future<?> and endswith letters 'Async'.
+DocLitProxyHandlerErr4=WebParam annotation's Mode cannot be IN for input parameter of type Holder.
+DocLitProxyHandlerErr5=Object Not a Holder type.
+JavaBeanDispatcherErr1=No Java method was found for the operation, if WSDL Operation Name is different from java Method name, make sure you have @WebMethod annotation name present.DocLitProxyHandlerErr2 = Method Input parameter for NON Wrapped Request cannot be null.
+SOAP12WithSAAJ12Err=A SOAP 1.2 Message cannot be rendered in an SAAJ 1.2 Object Model.
+SOAP12WithSAAJ12Err=A SOAP 1.2 Message cannot be rendered in an SAAJ 1.2 Object Model.
Added: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/DocLitBareMethodMarshaller.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/DocLitBareMethodMarshaller.java?view=auto&rev=453977
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/DocLitBareMethodMarshaller.java (added)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/DocLitBareMethodMarshaller.java Sat Oct 7 11:17:10 2006
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ * Copyright 2006 International Business Machines Corp.
+ *
+ * Licensed 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.axis2.jaxws.marshaller;
+
+public interface DocLitBareMethodMarshaller extends MethodMarshaller {
+
+}
Added: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/DocLitWrappedMethodMarshaller.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/DocLitWrappedMethodMarshaller.java?view=auto&rev=453977
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/DocLitWrappedMethodMarshaller.java (added)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/DocLitWrappedMethodMarshaller.java Sat Oct 7 11:17:10 2006
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ * Copyright 2006 International Business Machines Corp.
+ *
+ * Licensed 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.axis2.jaxws.marshaller;
+
+public interface DocLitWrappedMethodMarshaller extends MethodMarshaller {
+
+}
Added: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/MethodMarshaller.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/MethodMarshaller.java?view=auto&rev=453977
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/MethodMarshaller.java (added)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/MethodMarshaller.java Sat Oct 7 11:17:10 2006
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ * Copyright 2006 International Business Machines Corp.
+ *
+ * Licensed 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.axis2.jaxws.marshaller;
+
+import javax.xml.bind.JAXBException;
+import javax.xml.stream.XMLStreamException;
+
+import org.apache.axis2.jaxws.message.Message;
+import org.apache.axis2.jaxws.message.MessageException;
+import org.apache.axis2.jaxws.wrapper.impl.JAXBWrapperException;
+/*
+ * This is a helper class that converts org.apache.axis2.jaxws.message.Message to java Objects
+ * or JAXBObject. It also converts java objects or JAXBObject to org.apache.axis2.jaxws.message.Message.
+ */
+
+public interface MethodMarshaller {
+
+ /**
+ * This method converts java Objects in to a Message. Used on Client side to convert input method object to Message that is sent on wire.
+ *
+ * NONWRAP CASE:
+ * creates a request message. The input object to a non wrapped wsdl will be a object (mainly a JAXB Object) that will
+ * have all the payload data or method parameter data already setup. So the message will be created by converting input object in to a JAXBBlock and
+ * attaching the Block Message to soap body.
+ *
+ * WRAP CASE:
+ *
+ * create request message. It reads RequestWrapper annotation from OperationDescription and reads the class name, then reads
+ * all the webParam annotation on the method and uses JAXBWrapTool to wrap the request as jaxbObject. Create JAXBblock from the jaxbObject
+ * reads Biniding provider properties and set them on request message and return request message.
+ * @param object
+ * @return
+ */
+ public Message marshalRequest(Object[] object) throws IllegalAccessException, InstantiationException, ClassNotFoundException, JAXBWrapperException, JAXBException, MessageException, javax.xml.stream.XMLStreamException;
+
+ /**
+ * This method creates Message from a returnObject and input parameters of holder type. This is a case where we have method with return
+ * type and input parameters as holders. Used on Server side to convert service methods return type to Message that is then sent on wire.
+ * @param jaxbObject
+ * @return
+ */
+ public Message marshalResponse(Object returnObject, Object[] holderObjects)throws ClassNotFoundException, JAXBException, MessageException, JAXBWrapperException, XMLStreamException, InstantiationException, IllegalAccessException;
+
+ /**
+ * This method creates Fault Message from a Throbale input parameter.
+ * Used on Server side to convert Exceptions to Fault Message that is then sent on wire.
+ * @param jaxbObject
+ * @return
+ */
+ public Message marshalFaultResponse(Throwable throwable);
+ /**
+ * This method converts Message to java objects. Used on Server Side to this extract method input parameters from message and invokes method on service
+ * with found input parameters on ServiceEndpoint.
+ * @param message
+ * @return
+ */
+ public Object[] demarshalRequest(Message message)throws ClassNotFoundException, JAXBException, MessageException, JAXBWrapperException, XMLStreamException, InstantiationException, IllegalAccessException;
+
+ /**
+ * This method converts Message to Object. Used on Client side when converting response message from Server to ResponseWrapper/return type of method that
+ * Client uses to map.
+ *
+ * NONWRAP CASE:
+ * creates return result that client expects from the method call. This method reads the method return type
+ * or uses webResult annotation and creates JAXBBlock from the response context and returns the business object associated with the JAXBBlock.
+ *
+ * WRAP CASE:
+ * creates return result that client expects from the method call. It reads response wrapper annotation then reads OM from the
+ * response message context and creates JAXBBlock from the OMElement on messageContext. It then reads the webresult annotation to gather the return parameter
+ * name and creates the result object for it by reading the property object from JAXBBlock's business object using PropertyDescriptor.
+ *
+ * @param message
+ * @return
+ */
+ public Object demarshalResponse(Message message, Object[] inputArgs) throws IllegalAccessException, InstantiationException, ClassNotFoundException, JAXBWrapperException, JAXBException, XMLStreamException, MessageException;
+ /**
+ * This method converts Fault Message to fault java objects. Used on Client Side to extract Fault Object expected by client from message.
+ * @param message
+ * @return
+ */
+ public Object demarshalFaultResponse(Message message);
+
+ /**
+ * Indicates if message contains fault.
+ * @param message
+ * @return
+ */
+ public boolean isFault(Message message);
+
+
+}
Added: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/MethodParameter.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/MethodParameter.java?view=auto&rev=453977
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/MethodParameter.java (added)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/MethodParameter.java Sat Oct 7 11:17:10 2006
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ * Copyright 2006 International Business Machines Corp.
+ *
+ * Licensed 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.axis2.jaxws.marshaller;
+
+import javax.jws.WebParam.Mode;
+
+
+/**
+ * Stores Method Parameter as Name and Value. Method Parameter can be an input Method Parameter or output Method parameter.
+ * input Method Parameter is a input to a java Method.
+ * output Method Parameter is a return parameter from a java Method.
+ */
+public class MethodParameter {
+
+ private String name = null;
+ private Object value = null;
+ private Mode mode = null;
+ private Class type = null;
+ private Class actualType = null; //If parameter is a GenericType, this property stores the actual Type
+ private boolean isHolder = false;
+
+ public MethodParameter(String name, Object value, Mode mode) {
+ super();
+ this.name = name;
+ this.value = value;
+ this.mode = mode;
+ }
+ public MethodParameter(String name, Object value, Mode mode, Class type, Class actualType, boolean isHolder) {
+ this(name,value,mode);
+ this.type = type;
+ this.isHolder = isHolder;
+ this.actualType = actualType;
+ }
+ public String getName() {
+ return name;
+ }
+ public Object getValue() {
+ return value;
+ }
+ public Mode getMode() {
+ return mode;
+ }
+ public Class getType() {
+ return type;
+ }
+ public void setType(Class type) {
+ this.type = type;
+ }
+ public Class getActualType() {
+ return this.actualType;
+ }
+ public void setActualType(Class actualType) {
+ this.actualType = actualType;
+ }
+ public boolean isHolder() {
+ return isHolder;
+ }
+ public void setHolder(boolean isHolder) {
+ this.isHolder = isHolder;
+ }
+}
Added: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/factory/MethodMarshallerFactory.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/factory/MethodMarshallerFactory.java?view=auto&rev=453977
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/factory/MethodMarshallerFactory.java (added)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/factory/MethodMarshallerFactory.java Sat Oct 7 11:17:10 2006
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ * Copyright 2006 International Business Machines Corp.
+ *
+ * Licensed 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.axis2.jaxws.marshaller.factory;
+
+import javax.jws.soap.SOAPBinding;
+
+import org.apache.axis2.jaxws.description.EndpointDescription;
+import org.apache.axis2.jaxws.description.OperationDescription;
+import org.apache.axis2.jaxws.description.ServiceDescription;
+import org.apache.axis2.jaxws.marshaller.MethodMarshaller;
+import org.apache.axis2.jaxws.marshaller.impl.DocLitBareMethodMarshallerImpl;
+import org.apache.axis2.jaxws.marshaller.impl.DocLitWrappedMethodMarshallerImpl;
+import org.apache.axis2.jaxws.message.Protocol;
+
+
+public class MethodMarshallerFactory {
+
+ public MethodMarshallerFactory() {
+ super();
+
+ }
+
+ public MethodMarshaller createDocLitMethodMarshaller(SOAPBinding.ParameterStyle style, ServiceDescription serviceDesc, EndpointDescription endpointDesc, OperationDescription operationDesc, Protocol protocol){
+ if(style == SOAPBinding.ParameterStyle.WRAPPED){
+ return new DocLitWrappedMethodMarshallerImpl(serviceDesc, endpointDesc, operationDesc, protocol);
+ }
+ if(style == SOAPBinding.ParameterStyle.BARE){
+ return new DocLitBareMethodMarshallerImpl(serviceDesc, endpointDesc, operationDesc, protocol);
+ }
+ return null;
+ }
+
+ public MethodMarshaller createRPCLitMethodMarshaller(SOAPBinding.ParameterStyle style, ServiceDescription serviceDesc, EndpointDescription endpointDesc, OperationDescription operationDesc, Protocol protocol){
+ throw new UnsupportedOperationException("RPC/LIT not supported");
+ }
+}
Added: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/DocLitBareMethodMarshallerImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/DocLitBareMethodMarshallerImpl.java?view=auto&rev=453977
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/DocLitBareMethodMarshallerImpl.java (added)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/DocLitBareMethodMarshallerImpl.java Sat Oct 7 11:17:10 2006
@@ -0,0 +1,234 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ * Copyright 2006 International Business Machines Corp.
+ *
+ * Licensed 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.axis2.jaxws.marshaller.impl;
+
+import java.util.ArrayList;
+
+import javax.naming.OperationNotSupportedException;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.ws.Holder;
+
+import org.apache.axis2.jaxws.ExceptionFactory;
+import org.apache.axis2.jaxws.description.EndpointDescription;
+import org.apache.axis2.jaxws.description.OperationDescription;
+import org.apache.axis2.jaxws.description.ServiceDescription;
+import org.apache.axis2.jaxws.i18n.Messages;
+import org.apache.axis2.jaxws.marshaller.DocLitBareMethodMarshaller;
+import org.apache.axis2.jaxws.marshaller.MethodParameter;
+import org.apache.axis2.jaxws.message.Message;
+import org.apache.axis2.jaxws.message.MessageException;
+import org.apache.axis2.jaxws.message.Protocol;
+import org.apache.axis2.jaxws.wrapper.impl.JAXBWrapperException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class DocLitBareMethodMarshallerImpl extends MethodMarshallerImpl
+ implements DocLitBareMethodMarshaller {
+ private static int SIZE = 1;
+ private static Log log = LogFactory.getLog(DocLitBareMethodMarshallerImpl.class);
+ /**
+ * @param serviceDesc
+ * @param endpointDesc
+ * @param operationDesc
+ */
+ public DocLitBareMethodMarshallerImpl(ServiceDescription serviceDesc,
+ EndpointDescription endpointDesc, OperationDescription operationDesc, Protocol protocol) {
+ super(serviceDesc, endpointDesc, operationDesc, protocol);
+ // TODO Auto-generated constructor stub
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.axis2.jaxws.convertor.impl.MessageConvertorImpl#toJAXBObject(org.apache.axis2.jaxws.message.Message)
+ */
+ @Override
+ public Object demarshalResponse(Message message, Object[] inputArgs) throws IllegalAccessException, InstantiationException, ClassNotFoundException, JAXBWrapperException, JAXBException, XMLStreamException, MessageException{
+
+ Class returnType = getReturnType();
+ String resultName = operationDesc.getWebResultName();
+ Object bo = null;
+ if(returnType.getName().equals("void")){
+ ArrayList<MethodParameter> mps = toInputMethodParameters(inputArgs);
+ for(MethodParameter mp:mps){
+ if(mp.isHolder()){
+ returnType = mp.getActualType();
+ }
+ }
+
+ }
+ bo = createBusinessObject(returnType, message);
+ //In a bare case there should not be a situation where there is a return type and a holder.
+ createResponseHolders(bo, inputArgs, true);
+
+ return bo;
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.axis2.jaxws.convertor.impl.MessageConvertorImpl#toObjects(org.apache.axis2.jaxws.message.Message)
+ */
+ @Override
+ public Object[] demarshalRequest(Message message)throws ClassNotFoundException, JAXBException, MessageException, JAXBWrapperException, XMLStreamException, InstantiationException, IllegalAccessException{
+
+ ArrayList<Class> inputParams = getInputTypes();
+ //Method has no input parameters
+ if(inputParams.size() == 0){
+ return null;
+ }
+ if(inputParams.size() > SIZE){
+ if (log.isDebugEnabled()) {
+ log.debug("As per WS-I compliance, Multi part WSDL not allowed for Doc/Lit NON Wrapped request, Method invoked has multiple input parameter");
+ }
+ throw ExceptionFactory.makeWebServiceException(Messages.getMessage("DocLitProxyHandlerErr1"));
+ }
+
+ Class jaxbClass = inputParams.get(0);
+
+ Object jaxbObject = createBusinessObject(jaxbClass, message);
+
+ if (log.isDebugEnabled()) {
+ log.debug("reading input method parameters");
+ }
+ Class rawType = operationDesc.getSEIMethod().getParameterTypes()[0];
+
+ if(isHolder(rawType)){
+
+ return new Object[]{createHolder(rawType, jaxbObject)};
+ }
+ else{
+ return new Object[]{jaxbObject};
+ }
+
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.axis2.jaxws.convertor.impl.MessageConvertorImpl#fromJAXBObject(java.lang.Object)
+ */
+ @Override
+ public Message marshalResponse(Object returnObject, Object[] holderObjects) throws ClassNotFoundException, JAXBException, MessageException, JAXBWrapperException, XMLStreamException, InstantiationException, IllegalAccessException{
+ // Response wrapper is basically the return type. so the return object is a jaxbObject. If there is a holder objects then that is the responsewrapper.
+ Class wrapperClazz = getReturnType();
+ String wrapperClazzName = wrapperClazz.getName();
+ String webResult = operationDesc.getWebResultName();
+
+ //create all holders list
+ ArrayList<Object> objectList = new ArrayList<Object>();
+ if(holderObjects!=null){
+ objectList = toArrayList(holderObjects);
+ for(Object obj:holderObjects){
+ if(!(isHolder(obj))){
+ objectList.remove(obj);
+ }
+ }
+ }
+ if(objectList.size()> SIZE){
+ //More than one holder input parameter found, this is a WS-I violation.
+ if (log.isDebugEnabled()) {
+ log.debug("As per WS-I compliance, Multi part WSDL not allowed for Doc/Lit NON Wrapped request, Method invoked has multiple input parameter");
+ }
+ throw ExceptionFactory.makeWebServiceException(Messages.getMessage("DocLitProxyHandlerErr1"));
+ }
+ Message message = null;
+ ArrayList<MethodParameter> mps = new ArrayList<MethodParameter>();
+ if(objectList.size() == 0 && wrapperClazz.getName().equals("void")){
+ //No holders and return type void example --> public void someMethod() I will return empty ResponseWrapper in message body for this case.
+ //doNothing as there is nothing to wrap
+
+ }
+ if(objectList.size() == 0 && !wrapperClazz.getName().equals("void")){
+ //No holders but a return type example --> public ReturnType someMethod()
+
+ message = createMessage(returnObject, wrapperClazz, wrapperClazzName);
+ }
+ else{
+ //Holders found and return type or no return type. example --> public ReturnType someMethod(Holder<AHolder>) or public void someMethod(Holder<AHolder>)
+ //Note that SEI implementation will wrap return type in a holder if method has a return type and input param as holder.
+ //WSGen and WsImport Generate Holders with return type as one of the Holder JAXBObject property, if wsdl schema forces a holder and a return type.
+ ArrayList<Class> holderType = getInputTypes();
+ Holder holder = (Holder)objectList.get(0);
+ Object value = holder.value;
+ message = createMessage(value, holderType.get(0), holderType.get(0).getName());
+ }
+
+ return message;
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.axis2.jaxws.convertor.impl.MessageConvertorImpl#fromObjects(java.lang.Object[])
+ */
+ @Override
+ public Message marshalRequest(Object[] objects) throws IllegalAccessException, InstantiationException, ClassNotFoundException, JAXBWrapperException, JAXBException, MessageException, javax.xml.stream.XMLStreamException{
+
+
+ ArrayList<MethodParameter> mps = toInputMethodParameters(objects);
+
+ //WSDL wrapped and running wsImport with non-wrap binding or wsdl un-Wrapped and running wsImport with no binding, EITHER WAYS
+ //there can be only 0 or 1 Body parts as per WS-I.
+ if(mps.size()> SIZE){
+ if (log.isDebugEnabled()) {
+ log.debug("As per WS-I compliance, Multi part WSDL not allowed for Doc/Lit NON Wrapped request, Method invoked has multiple input parameter");
+ }
+ throw ExceptionFactory.makeWebServiceException(Messages.getMessage("DocLitProxyHandlerErr1"));
+ }
+
+ //Lets handle case where there is one message part or one input parameter
+ Message message = null;
+ if(mps.size() !=0){
+ Object requestObject = null;
+ String requestObjectName = null;
+ Class requestObjectType = null;
+ JAXBContext ctx = null;
+ for(MethodParameter mp : mps){
+ requestObject = mp.getValue();
+ requestObjectName = mp.getName();
+ requestObjectType = mp.getActualType();
+ if(requestObject == null){
+ if (log.isDebugEnabled()) {
+ log.debug("Method Input parameter for NON Wrapped Request cannot be null");
+ }
+ throw ExceptionFactory.makeWebServiceException(Messages.getMessage("DocLitProxyHandlerErr2"));
+ }
+ }
+
+ message = createMessage(requestObject, requestObjectType, requestObjectName);
+ }
+ //no message part case or no input parameter
+ if(mps.size() == 0){
+ message = createEmptyMessage();
+ }
+
+ return message;
+ }
+
+ @Override
+ public Object demarshalFaultResponse(Message message) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean isFault(Message message) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public Message marshalFaultResponse(Throwable throwable) {
+ throw new UnsupportedOperationException();
+ }
+}
Added: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/DocLitWrappedMethodMarshallerImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/DocLitWrappedMethodMarshallerImpl.java?view=auto&rev=453977
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/DocLitWrappedMethodMarshallerImpl.java (added)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/DocLitWrappedMethodMarshallerImpl.java Sat Oct 7 11:17:10 2006
@@ -0,0 +1,204 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ * Copyright 2006 International Business Machines Corp.
+ *
+ * Licensed 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.axis2.jaxws.marshaller.impl;
+
+import java.util.ArrayList;
+
+import javax.naming.OperationNotSupportedException;
+import javax.xml.bind.JAXBException;
+import javax.xml.stream.XMLStreamException;
+
+import org.apache.axis2.jaxws.description.EndpointDescription;
+import org.apache.axis2.jaxws.description.OperationDescription;
+import org.apache.axis2.jaxws.description.ServiceDescription;
+import org.apache.axis2.jaxws.marshaller.DocLitWrappedMethodMarshaller;
+import org.apache.axis2.jaxws.marshaller.MethodParameter;
+import org.apache.axis2.jaxws.message.Message;
+import org.apache.axis2.jaxws.message.MessageException;
+import org.apache.axis2.jaxws.message.Protocol;
+import org.apache.axis2.jaxws.wrapper.JAXBWrapperTool;
+import org.apache.axis2.jaxws.wrapper.impl.JAXBWrapperException;
+import org.apache.axis2.jaxws.wrapper.impl.JAXBWrapperToolImpl;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class DocLitWrappedMethodMarshallerImpl extends MethodMarshallerImpl
+ implements DocLitWrappedMethodMarshaller {
+ private static Log log = LogFactory.getLog(DocLitWrappedMethodMarshallerImpl.class);
+
+ /**
+ * @param serviceDesc
+ * @param endpointDesc
+ * @param operationDesc
+ */
+ public DocLitWrappedMethodMarshallerImpl(ServiceDescription serviceDesc,
+ EndpointDescription endpointDesc, OperationDescription operationDesc, Protocol protocol) {
+ super(serviceDesc, endpointDesc, operationDesc, protocol);
+ // TODO Auto-generated constructor stub
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.axis2.jaxws.convertor.impl.MessageConvertorImpl#toJAXBObject(org.apache.axis2.jaxws.message.Message)
+ */
+ @Override
+ public Object demarshalResponse(Message message, Object[] inputArgs) throws IllegalAccessException, InstantiationException, ClassNotFoundException, JAXBWrapperException, JAXBException, javax.xml.stream.XMLStreamException, MessageException{
+ Class wrapperClazz = null;
+ String className = operationDesc.getResponseWrapperClassName();
+ //TODO Move this to Operation Description.
+ if(className == null || (className!=null && className.length()==0)){
+ wrapperClazz = getReturnType();
+ }
+ else{
+ wrapperClazz = loadClass(className);
+ }
+ String resultName = operationDesc.getWebResultName();
+ Object bo = createBusinessObject(wrapperClazz, message);
+ createResponseHolders(bo, inputArgs, false);
+ //if result name is null and that means there is no webResult meaning its a void return.
+ if(resultName !=null){
+ //if ReturnType is not of same type as JAXBBlock business Object then I will look for resultName in Business Object and return that.
+ Object resultObject = findProperty(resultName, bo);
+ return resultObject;
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.axis2.jaxws.convertor.impl.MessageConvertorImpl#toObjects(org.apache.axis2.jaxws.message.Message)
+ */
+ @Override
+ public Object[] demarshalRequest(Message message)throws ClassNotFoundException, JAXBException, MessageException, JAXBWrapperException, XMLStreamException, InstantiationException, IllegalAccessException {
+ String className = operationDesc.getRequestWrapperClassName();
+ Class requestWrapperClazz = loadClass(className);
+ Object jaxbObject = createBusinessObject(requestWrapperClazz, message);
+
+ if (log.isDebugEnabled()) {
+ log.debug("reading input method parameters");
+ }
+ ArrayList<MethodParameter> mps = toInputMethodParameter(jaxbObject);
+ if (log.isDebugEnabled()) {
+ log.debug("done reading input method parameters");
+ }
+
+ Object[] contents = new Object[mps.size()];
+ int i =0;
+ for (MethodParameter mp:mps){
+ contents[i++] =mp.getValue();
+ }
+
+ if (log.isDebugEnabled()) {
+ log.debug("Object unwrapped");
+ }
+
+ return contents;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.axis2.jaxws.convertor.impl.MessageConvertorImpl#fromJAXBObject(java.lang.Object)
+ */
+ @Override
+ public Message marshalResponse(Object returnObject, Object[] holderObjects)throws ClassNotFoundException, JAXBException, MessageException, JAXBWrapperException, XMLStreamException, InstantiationException, IllegalAccessException {
+ Class wrapperClazz = null;
+ String wrapperClazzName = operationDesc.getResponseWrapperClassName();
+ String webResult = operationDesc.getWebResultName();
+ //TODO Move this to Operation Description.
+ if(wrapperClazzName == null || (wrapperClazzName!=null && wrapperClazzName.length()==0)){
+ wrapperClazz = getReturnType();
+ wrapperClazzName = wrapperClazz.getName();
+ if(log.isDebugEnabled()){
+ log.debug("No ResponseWrapper annotation found, using return type of method as response object");
+ }
+ }
+ else{
+ wrapperClazz = loadClass(wrapperClazzName);
+ }
+ //create all holders list
+ ArrayList<Object> objectList = new ArrayList<Object>();
+ if(holderObjects!=null){
+ objectList = toArrayList(holderObjects);
+ for(Object obj:holderObjects){
+ if(!(isHolder(obj))){
+ objectList.remove(obj);
+ }
+ }
+ }
+ //No Holders found
+ ArrayList<MethodParameter> mps = new ArrayList<MethodParameter>();
+ if(objectList.size() == 0 && wrapperClazz.getName().equals("void")){
+ //No holders and return type void example --> public void someMethod() I will return empty ResponseWrapper in message body for this case.
+ //doNothing as there is nothing to wrap
+ }
+ if(objectList.size() == 0 && !wrapperClazz.getName().equals("void")){
+ //No holders but a return type example --> public ReturnType someMethod()
+ mps = toOutputMethodParameter(returnObject);
+ }
+ else{
+ //Holders found and return type or no return type. example --> public ReturnType someMethod(Holder<String>) or public void someMethod(Holder<String>)
+ mps = toOutputMethodParameter(returnObject, objectList.toArray());
+ }
+
+ JAXBWrapperTool wrapperTool = new JAXBWrapperToolImpl();
+ Object wrapper = wrapperTool.wrap(wrapperClazz,
+ wrapperClazzName, mps);
+
+ Message message = createMessage(wrapper, wrapperClazz, wrapperClazzName);
+ return message;
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.axis2.jaxws.convertor.impl.MessageConvertorImpl#fromObjects(java.lang.Object[])
+ */
+ @Override
+ public Message marshalRequest(Object[] objects) throws IllegalAccessException, InstantiationException, ClassNotFoundException, JAXBWrapperException, JAXBException, MessageException, javax.xml.stream.XMLStreamException {
+
+ String className = operationDesc.getRequestWrapperClassName();
+ Class wrapperClazz = loadClass(className);
+ String localName = operationDesc.getRequestWrapperLocalName();
+
+ //Get Name Value pair for input parameter Objects, skip AsyncHandler and identify Holders.
+ ArrayList<MethodParameter> methodParameters = toInputMethodParameters(objects);
+ JAXBWrapperTool wrapTool = new JAXBWrapperToolImpl();
+ if (log.isDebugEnabled()) {
+ log.debug("JAXBWrapperTool attempting to wrap propertes in WrapperClass :" + wrapperClazz);
+ }
+
+ Object jaxbObject = wrapTool.wrap(wrapperClazz, localName, methodParameters);
+ if (log.isDebugEnabled()) {
+ log.debug("JAXBWrapperTool wrapped following propertes :");
+ }
+
+ Message message = createMessage(jaxbObject, wrapperClazz, localName);
+ return message;
+ }
+
+ @Override
+ public Object demarshalFaultResponse(Message message) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean isFault(Message message) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public Message marshalFaultResponse(Throwable throwable) {
+ throw new UnsupportedOperationException();
+ }
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org