You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by Jarek Gawor <jg...@gmail.com> on 2007/07/03 19:48:31 UTC

Re: svn commit: r552920 - in /webservices/axis2/trunk/java/modules: jaxws/src/org/apache/axis2/jaxws/ jaxws/src/org/apache/axis2/jaxws/binding/ jaxws/src/org/apache/axis2/jaxws/handler/ jaxws/src/org/apache/axis2/jaxws/server/ jaxws/src/org/apache/ax

I'm sorry, I have to object to this commit. This is removing some of
the changes I've made before (and one change just got removed for the
second time!). For example I've added support for
HandlerLifecycleManager that works just like EndpointLifecycleManager
and can do injection/call PostConstruct and this commit just removed
calls to it. Please explain why is this necessary.

Jarek

On 7/3/07, nthaker@apache.org <nt...@apache.org> wrote:
> Author: nthaker
> Date: Tue Jul  3 10:14:00 2007
> New Revision: 552920
>
> URL: http://svn.apache.org/viewvc?view=rev&rev=552920
> Log:
> JIRA = AXIS2-2894
>
> Modified:
>     webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/BindingProvider.java
>     webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/binding/BindingImpl.java
>     webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/handler/HandlerResolverImpl.java
>     webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java
>     webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/spi/ServiceDelegate.java
>     webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/sample/AddNumbersHandlerTests.java
>     webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/ServiceDescription.java
>     webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java
>
> Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/BindingProvider.java
> URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/BindingProvider.java?view=diff&rev=552920&r1=552919&r2=552920
> ==============================================================================
> --- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/BindingProvider.java (original)
> +++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/BindingProvider.java Tue Jul  3 10:14:00 2007
> @@ -18,6 +18,11 @@
>   */
>  package org.apache.axis2.jaxws;
>
> +import java.util.Hashtable;
> +import java.util.Map;
> +
> +import javax.xml.ws.Binding;
> +import javax.xml.ws.handler.HandlerResolver;
>  import org.apache.axis2.jaxws.binding.BindingUtils;
>  import org.apache.axis2.jaxws.binding.SOAPBinding;
>  import org.apache.axis2.jaxws.client.PropertyValidator;
> @@ -29,11 +34,8 @@
>  import org.apache.axis2.jaxws.spi.ServiceDelegate;
>  import org.apache.axis2.transport.http.HTTPConstants;
>
> -import javax.xml.ws.Binding;
> -import javax.xml.ws.handler.HandlerResolver;
> -
> -import java.util.Hashtable;
> -import java.util.Map;
> +import org.apache.commons.logging.Log;
> +import org.apache.commons.logging.LogFactory;
>
>  public class BindingProvider implements org.apache.axis2.jaxws.spi.BindingProvider {
>
> @@ -46,7 +48,7 @@
>      protected ServiceDelegate serviceDelegate;
>
>      private Binding binding = null;
> -
> +    private static final Log log = LogFactory.getLog(BindingProvider.class);
>      public BindingProvider(ServiceDelegate svcDelegate, EndpointDescription epDesc) {
>          endpointDesc = epDesc;
>          serviceDelegate = svcDelegate;
> @@ -75,11 +77,23 @@
>          // so we can also set the handlerchain
>          if (binding == null) {
>              binding = BindingUtils.createBinding(endpointDesc);
> -
> +            if(log.isDebugEnabled()){
> +                log.debug("Lookign for Handler Resolver");
> +            }
>              // TODO should we allow the ServiceDelegate to figure out the default handlerresolver?  Probably yes, since a client app may look for one there.
> -            HandlerResolver handlerResolver =
> -                    serviceDelegate.getHandlerResolver() != null ? serviceDelegate.getHandlerResolver()
> -                            : new HandlerResolverImpl(endpointDesc);
> +            HandlerResolver handlerResolver = null;
> +            if(serviceDelegate.getHandlerResolver() != null){
> +                if(log.isDebugEnabled()){
> +                    log.debug("Reading default Handler Resolver ");
> +                }
> +                handlerResolver= serviceDelegate.getHandlerResolver();
> +            }
> +            else{
> +                handlerResolver = new HandlerResolverImpl(endpointDesc.getServiceDescription());
> +                if(log.isDebugEnabled()){
> +                    log.debug("Creating new Handler Resolver using HandlerResolverImpl");
> +                }
> +            }
>              binding.setHandlerChain(handlerResolver.getHandlerChain(endpointDesc.getPortInfo()));
>          }
>
>
> Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/binding/BindingImpl.java
> URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/binding/BindingImpl.java?view=diff&rev=552920&r1=552919&r2=552920
> ==============================================================================
> --- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/binding/BindingImpl.java (original)
> +++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/binding/BindingImpl.java Tue Jul  3 10:14:00 2007
> @@ -19,16 +19,15 @@
>
>  package org.apache.axis2.jaxws.binding;
>
> -import org.apache.axis2.jaxws.description.EndpointDescription;
> -import org.apache.axis2.jaxws.handler.HandlerResolverImpl;
> +import java.util.ArrayList;
> +import java.util.List;
> +import java.util.Set;
>
>  import javax.xml.ws.Binding;
>  import javax.xml.ws.handler.Handler;
>
> -import java.net.URI;
> -import java.util.ArrayList;
> -import java.util.List;
> -import java.util.Set;
> +import org.apache.axis2.jaxws.description.EndpointDescription;
> +import org.apache.axis2.jaxws.handler.HandlerResolverImpl;
>
>  /**
>   * @author rott classes that would normally "implement javax.xml.ws.Binding"
> @@ -63,11 +62,10 @@
>      }
>
>      public List<Handler> getHandlerChain() {
> -        if (handlers == null && endpointDesc != null) {
> -            handlers = new HandlerResolverImpl(endpointDesc).getHandlerChain(endpointDesc
> -                            .getPortInfo());
> -        }
>          if (handlers == null) {
> +            handlers =
> +                    new HandlerResolverImpl(endpointDesc.getServiceDescription()).getHandlerChain(endpointDesc.getPortInfo());
> +            if (handlers == null)
>              handlers = new ArrayList<Handler>(); // non-null so client
>                                                   // apps can manipulate
>          }
>
> Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/handler/HandlerResolverImpl.java
> URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/handler/HandlerResolverImpl.java?view=diff&rev=552920&r1=552919&r2=552920
> ==============================================================================
> --- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/handler/HandlerResolverImpl.java (original)
> +++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/handler/HandlerResolverImpl.java Tue Jul  3 10:14:00 2007
> @@ -18,36 +18,37 @@
>   */
>  package org.apache.axis2.jaxws.handler;
>
> -import java.security.PrivilegedActionException;
> -import java.security.PrivilegedExceptionAction;
> -import java.util.ArrayList;
> -import java.util.HashMap;
> -import java.util.Iterator;
> -import java.util.List;
> -import java.util.Map;
> -
> -import javax.xml.namespace.QName;
> -import javax.xml.ws.WebServiceException;
> -import javax.xml.ws.handler.Handler;
> -import javax.xml.ws.handler.HandlerResolver;
> -import javax.xml.ws.handler.LogicalHandler;
> -import javax.xml.ws.handler.PortInfo;
> -import javax.xml.ws.handler.soap.SOAPHandler;
> -
> +import org.apache.axis2.client.OperationClient;
>  import org.apache.axis2.java.security.AccessController;
>  import org.apache.axis2.jaxws.ExceptionFactory;
> -import org.apache.axis2.jaxws.core.MessageContext;
>  import org.apache.axis2.jaxws.description.EndpointDescription;
> +import org.apache.axis2.jaxws.description.ServiceDescription;
>  import org.apache.axis2.jaxws.description.xml.handler.HandlerChainType;
>  import org.apache.axis2.jaxws.description.xml.handler.HandlerChainsType;
>  import org.apache.axis2.jaxws.description.xml.handler.HandlerType;
> -import org.apache.axis2.jaxws.handler.lifecycle.factory.HandlerLifecycleManager;
> -import org.apache.axis2.jaxws.handler.lifecycle.factory.HandlerLifecycleManagerFactory;
>  import org.apache.axis2.jaxws.i18n.Messages;
> -import org.apache.axis2.jaxws.registry.FactoryRegistry;
> +import org.apache.axis2.jaxws.runtime.description.injection.ResourceInjectionServiceRuntimeDescription;
> +import org.apache.axis2.jaxws.runtime.description.injection.impl.ResourceInjectionServiceRuntimeDescriptionBuilder;
>  import org.apache.commons.logging.Log;
>  import org.apache.commons.logging.LogFactory;
>
> +import javax.xml.namespace.QName;
> +import javax.xml.ws.WebServiceException;
> +import javax.xml.ws.handler.Handler;
> +import javax.xml.ws.handler.HandlerResolver;
> +import javax.xml.ws.handler.LogicalHandler;
> +import javax.xml.ws.handler.PortInfo;
> +import javax.xml.ws.handler.soap.SOAPHandler;
> +
> +import java.lang.reflect.InvocationTargetException;
> +import java.lang.reflect.Method;
> +import java.security.PrivilegedActionException;
> +import java.security.PrivilegedExceptionAction;
> +import java.util.ArrayList;
> +import java.util.HashMap;
> +import java.util.Iterator;
> +import java.util.List;
> +import java.util.Map;
>  /*
>   * This class should be created by the ServiceDelegate.
>   * HandlerResolverImpl.getHandlerChain(PortInfo) will be called by the
> @@ -78,10 +79,12 @@
>        */
>
>      // we'll need to refer to this object to get the port, and thus handlers
> -    private EndpointDescription endpointDesc;
> +    //private EndpointDescription endpointDesc;
> +    private ServiceDescription serviceDesc;
>
> -    public HandlerResolverImpl(EndpointDescription ed) {
> -        this.endpointDesc = ed;
> +    public HandlerResolverImpl(ServiceDescription sd) { //EndpointDescription ed) {
> +        //this.endpointDesc = ed;
> +        this.serviceDesc = sd;
>      }
>
>      public ArrayList<Handler> getHandlerChain(PortInfo portinfo) {
> @@ -142,12 +145,25 @@
>
>          ArrayList<Handler> handlers = new ArrayList<Handler>();
>
> -               /*
> -                * TODO: do a better job checking that the return value matches up
> +        /*
> +         * TODO: do a better job checking that the return value matches up
>           * with the PortInfo object before we add it to the chain.
> -                */
> -
> -        HandlerChainsType handlerCT = endpointDesc.getHandlerChain();
> +         */
> +
> +        HandlerChainsType handlerCT = serviceDesc.getHandlerChain();
> +        // if there's a handlerChain on the serviceDesc, it means the WSDL defined an import for a HandlerChain.
> +        // the spec indicates that if a handlerchain also appears on the SEI on the client.
> +        EndpointDescription ed = null;
> +        if(portinfo !=null){
> +             ed = serviceDesc.getEndpointDescription(portinfo.getPortName());
> +        }
> +
> +        if (ed != null) {
> +            HandlerChainsType handlerCT_fromEndpointDesc = ed.getHandlerChain();
> +            if (handlerCT == null) {
> +                handlerCT = handlerCT_fromEndpointDesc;
> +            }
> +        }
>
>          Iterator it = handlerCT == null ? null : handlerCT.getHandlerChain().iterator();
>
> @@ -171,17 +187,21 @@
>                  // or will schema not allow it?
>                  String portHandler = handlerType.getHandlerClass().getValue();
>                  Handler handler;
> -
> -                // Create temporary MessageContext to pass information to HandlerLifecycleManager
> -                MessageContext ctx = new MessageContext();
> -                ctx.setEndpointDescription(endpointDesc);
> -
> -                HandlerLifecycleManager hlm = createHandlerlifecycleManager();
> -
> -                //  instantiate portHandler class
> +                // instantiate portHandler class
>                  try {
> -                    handler = hlm.createHandlerInstance(ctx, loadClass(portHandler));
> -                } catch (Exception e) {
> +                    // TODO: review: ok to use system classloader?
> +                    handler = (Handler) loadClass(portHandler).newInstance();
> +                    // TODO: must also do resource injection according to JAXWS 9.3.1
> +                    callHandlerPostConstruct(handler, serviceDesc);
> +                } catch (ClassNotFoundException e) {
> +                    // TODO: should we just ignore this problem?
> +                    // TODO: NLS log and throw
> +                    throw ExceptionFactory.makeWebServiceException(e);
> +                } catch (InstantiationException ie) {
> +                    // TODO: should we just ignore this problem?
> +                    // TODO: NLS log and throw
> +                    throw ExceptionFactory.makeWebServiceException(ie);
> +                } catch (IllegalAccessException e) {
>                      // TODO: should we just ignore this problem?
>                      // TODO: NLS log and throw
>                      throw ExceptionFactory.makeWebServiceException(e);
> @@ -210,11 +230,6 @@
>          return handlers;
>      }
>
> -    private HandlerLifecycleManager createHandlerlifecycleManager() {
> -        HandlerLifecycleManagerFactory elmf = (HandlerLifecycleManagerFactory)FactoryRegistry
> -                .getFactory(HandlerLifecycleManagerFactory.class);
> -        return elmf.createHandlerLifecycleManager();
> -    }
>
>      private static Class loadClass(String clazz) throws ClassNotFoundException {
>          try {
> @@ -272,6 +287,60 @@
>          }
>
>          return cl;
> +    }
> +
> +    private static void callHandlerPostConstruct(Handler handler, ServiceDescription serviceDesc)
> +                                                                                                 throws WebServiceException {
> +        ResourceInjectionServiceRuntimeDescription resInj =
> +                ResourceInjectionServiceRuntimeDescriptionBuilder.create(serviceDesc,
> +                                                                         handler.getClass());
> +        if (resInj != null) {
> +            Method pcMethod = resInj.getPostConstructMethod();
> +            if (pcMethod != null) {
> +                if (log.isDebugEnabled()) {
> +                    log.debug("Invoking Method with @PostConstruct annotation");
> +                }
> +                invokeMethod(handler, pcMethod, null);
> +                if (log.isDebugEnabled()) {
> +                    log.debug("Completed invoke on Method with @PostConstruct annotation");
> +                }
> +            }
> +        }
> +    }
> +    /*
> +     * Helper method to destroy all instantiated Handlers once the runtime
> +     * is done with them.
> +     */
> +    private static void callHandlerPreDestroy(Handler handler, ServiceDescription serviceDesc)
> +                                                                                              throws WebServiceException {
> +        ResourceInjectionServiceRuntimeDescription resInj =
> +                ResourceInjectionServiceRuntimeDescriptionBuilder.create(serviceDesc,
> +                                                                         handler.getClass());
> +        if (resInj != null) {
> +            Method pcMethod = resInj.getPreDestroyMethod();
> +            if (pcMethod != null) {
> +                if (log.isDebugEnabled()) {
> +                    log.debug("Invoking Method with @PostConstruct annotation");
> +                }
> +                invokeMethod(handler, pcMethod, null);
> +                if (log.isDebugEnabled()) {
> +                    log.debug("Completed invoke on Method with @PostConstruct annotation");
> +                }
> +            }
> +        }
> +    }
> +
> +    private static void invokeMethod(Handler handlerInstance, Method m, Object[] params)
> +                                                                                        throws WebServiceException {
> +        try {
> +            m.invoke(handlerInstance, params);
> +        } catch (InvocationTargetException e) {
> +            // TODO perhaps a "HandlerLifecycleException" would be better?
> +            throw ExceptionFactory.makeWebServiceException(e);
> +        } catch (IllegalAccessException e) {
> +            // TODO perhaps a "HandlerLifecycleException" would be better?
> +            throw ExceptionFactory.makeWebServiceException(e);
> +        }
>      }
>
>      private static boolean chainResolvesToPort(HandlerChainType handlerChainType, PortInfo portinfo) {
>
> Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java
> URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java?view=diff&rev=552920&r1=552919&r2=552920
> ==============================================================================
> --- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java (original)
> +++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java Tue Jul  3 10:14:00 2007
> @@ -110,9 +110,7 @@
>           * Since we're on the server, and there apparently is no Binding object
>           * anywhere to be found...
>           */
> -        if (ic.getHandlers() == null) {
> -            ic.setHandlers(new HandlerResolverImpl(endpointDesc).getHandlerChain(endpointDesc.getPortInfo()));
> -        }
> +        ic.setHandlers(new HandlerResolverImpl(endpointDesc.getServiceDescription()).getHandlerChain(endpointDesc.getPortInfo()));
>
>          if (!bindingTypesMatch(requestMsgCtx, endpointDesc.getServiceDescription())) {
>              Protocol protocol = requestMsgCtx.getMessage().getProtocol();
>
> Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/spi/ServiceDelegate.java
> URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/spi/ServiceDelegate.java?view=diff&rev=552920&r1=552919&r2=552920
> ==============================================================================
> --- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/spi/ServiceDelegate.java (original)
> +++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/spi/ServiceDelegate.java Tue Jul  3 10:14:00 2007
> @@ -282,6 +282,9 @@
>      * @see javax.xml.ws.spi.ServiceDelegate#getHandlerResolver()
>      */
>      public HandlerResolver getHandlerResolver() {
> +        if (handlerResolver == null) {
> +            handlerResolver = new HandlerResolverImpl(serviceDescription);
> +        }
>          return handlerResolver;
>      }
>
>
> Modified: webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/sample/AddNumbersHandlerTests.java
> URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/sample/AddNumbersHandlerTests.java?view=diff&rev=552920&r1=552919&r2=552920
> ==============================================================================
> --- webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/sample/AddNumbersHandlerTests.java (original)
> +++ webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/sample/AddNumbersHandlerTests.java Tue Jul  3 10:14:00 2007
> @@ -492,4 +492,19 @@
>
>          return new StreamSource(new StringReader(reqString));
>      }
> +
> +    public void testAddNumbersHandlerHandlerResolver() {
> +        try {
> +        System.out.println("----------------------------------");
> +        System.out.println("test: " + getName());
> +        AddNumbersHandlerService service = new AddNumbersHandlerService(); // will give NPE:
> +        List<Handler> handlers = service.getHandlerResolver().getHandlerChain(null);
> +        assertNotNull("Default handlers list should not be null but empty.", handlers);
> +        System.out.println("----------------------------------");
> +        } catch (Exception e) {
> +        e.printStackTrace();
> +        fail(e.getMessage());
> +        }
> +        }
> +
>  }
>
> Modified: webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/ServiceDescription.java
> URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/ServiceDescription.java?view=diff&rev=552920&r1=552919&r2=552920
> ==============================================================================
> --- webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/ServiceDescription.java (original)
> +++ webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/ServiceDescription.java Tue Jul  3 10:14:00 2007
> @@ -20,7 +20,7 @@
>
>  import org.apache.axis2.client.ServiceClient;
>  import org.apache.axis2.context.ConfigurationContext;
> -
> +import org.apache.axis2.jaxws.description.xml.handler.HandlerChainsType;
>  import javax.xml.namespace.QName;
>  import java.util.Collection;
>  import java.util.List;
> @@ -84,6 +84,7 @@
>
>      public abstract QName getServiceQName();
>
> +    public abstract HandlerChainsType getHandlerChain();
>      /**
>       * Returns a list of the ports for this serivce.  The ports returned are the - Ports declared
>       * ports for this Service.  They can be delcared in the WSDL or via annotations. - Dynamic ports
>
> Modified: webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java
> URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java?view=diff&rev=552920&r1=552919&r2=552920
> ==============================================================================
> --- webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java (original)
> +++ webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java Tue Jul  3 10:14:00 2007
> @@ -18,6 +18,39 @@
>   */
>  package org.apache.axis2.jaxws.description.impl;
>
> +import static org.apache.axis2.jaxws.description.builder.MDQConstants.RETURN_TYPE_FUTURE;
> +import static org.apache.axis2.jaxws.description.builder.MDQConstants.RETURN_TYPE_RESPONSE;
> +
> +import java.io.FileNotFoundException;
> +import java.io.IOException;
> +import java.io.InputStream;
> +import java.net.ConnectException;
> +import java.net.URL;
> +import java.net.UnknownHostException;
> +import java.util.ArrayList;
> +import java.util.Collection;
> +import java.util.Collections;
> +import java.util.Enumeration;
> +import java.util.HashMap;
> +import java.util.Hashtable;
> +import java.util.Iterator;
> +import java.util.List;
> +import java.util.Map;
> +import java.util.concurrent.ConcurrentHashMap;
> +
> +import javax.jws.HandlerChain;
> +import javax.wsdl.Definition;
> +import javax.wsdl.Port;
> +import javax.wsdl.PortType;
> +import javax.wsdl.Service;
> +import javax.wsdl.WSDLException;
> +import javax.wsdl.extensions.ExtensibilityElement;
> +import javax.xml.bind.JAXBContext;
> +import javax.xml.bind.JAXBElement;
> +import javax.xml.bind.Unmarshaller;
> +import javax.xml.namespace.QName;
> +import javax.xml.ws.soap.SOAPBinding;
> +
>  import org.apache.axis2.client.ServiceClient;
>  import org.apache.axis2.context.ConfigurationContext;
>  import org.apache.axis2.description.AxisService;
> @@ -32,36 +65,15 @@
>  import org.apache.axis2.jaxws.description.ServiceRuntimeDescription;
>  import org.apache.axis2.jaxws.description.builder.DescriptionBuilderComposite;
>  import org.apache.axis2.jaxws.description.builder.MDQConstants;
> -import static org.apache.axis2.jaxws.description.builder.MDQConstants.RETURN_TYPE_FUTURE;
> -import static org.apache.axis2.jaxws.description.builder.MDQConstants.RETURN_TYPE_RESPONSE;
>  import org.apache.axis2.jaxws.description.builder.MethodDescriptionComposite;
>  import org.apache.axis2.jaxws.description.builder.ParameterDescriptionComposite;
> +import org.apache.axis2.jaxws.description.xml.handler.HandlerChainsType;
>  import org.apache.axis2.jaxws.i18n.Messages;
>  import org.apache.axis2.jaxws.util.WSDL4JWrapper;
>  import org.apache.axis2.jaxws.util.WSDLWrapper;
>  import org.apache.commons.logging.Log;
>  import org.apache.commons.logging.LogFactory;
>
> -import javax.wsdl.Definition;
> -import javax.wsdl.Port;
> -import javax.wsdl.PortType;
> -import javax.wsdl.Service;
> -import javax.wsdl.WSDLException;
> -import javax.wsdl.extensions.ExtensibilityElement;
> -import javax.xml.namespace.QName;
> -import javax.xml.ws.soap.SOAPBinding;
> -import java.io.FileNotFoundException;
> -import java.io.IOException;
> -import java.net.ConnectException;
> -import java.net.URL;
> -import java.net.UnknownHostException;
> -import java.util.ArrayList;
> -import java.util.Collection;
> -import java.util.Collections;
> -import java.util.HashMap;
> -import java.util.Iterator;
> -import java.util.List;
> -import java.util.Map;
>
>  /** @see ../ServiceDescription */
>  class ServiceDescriptionImpl
> @@ -79,6 +91,10 @@
>      // TODO: Possibly remove Definition and delegate to the Defn on the AxisSerivce set as a paramater by WSDLtoAxisServicBuilder?
>      private WSDLWrapper wsdlWrapper;
>      private WSDLWrapper generatedWsdlWrapper;
> +
> +    //ANNOTATION: @HandlerChain
> +    private HandlerChain handlerChainAnnotation;
> +    private HandlerChainsType handlerChainsType;
>
>      private Map<QName, EndpointDescription> endpointDescriptions =
>              new HashMap<QName, EndpointDescription>();
> @@ -1322,8 +1338,87 @@
>          return wsdlSpecified;
>      }
>
> +
> +    // ===========================================
> +    // ANNOTATION: HandlerChain
> +    // ===========================================
> +
>      /**
> -     * Returns the WSDL definiton as specified in the metadata.  Note that this WSDL may not be
> +     * Returns a schema derived java class containing the the handler configuration filel
> +     *
> +     * @return HandlerChainsType This is the top-level element for the Handler configuration file
> +     *
> +     */
> +    public HandlerChainsType getHandlerChain() {
> +
> +        if (handlerChainsType == null) {
> +
> +            getAnnoHandlerChainAnnotation();
> +            if (handlerChainAnnotation != null) {
> +
> +                String handlerFileName = handlerChainAnnotation.file();
> +
> +                // TODO RAS & NLS
> +                if (log.isDebugEnabled()) {
> +                    if (composite != null) {
> +                        log.debug("EndpointDescriptionImpl.getHandlerChain: fileName: "
> +                                + handlerFileName + " className: " + composite.getClassName());
> +                    }
> +                    else {
> +                        log.debug("EndpointDescriptionImpl.getHandlerChain: fileName: "
> +                                + handlerFileName + " className: " + serviceClass.getName());
> +                    }
> +                }
> +
> +                String className =
> +                        (composite != null) ? composite.getClassName() : serviceClass.getName();
> +
> +                ClassLoader classLoader =
> +                        (composite != null) ? composite.getClassLoader() : this.getClass()
> +                                                                               .getClassLoader();
> +
> +                InputStream is =
> +                        DescriptionUtils.openHandlerConfigStream(handlerFileName,
> +                                                                 className,
> +                                                                 classLoader);
> +
> +                try {
> +
> +                    // All the classes we need should be part of this package
> +                    JAXBContext jc =
> +                            JAXBContext.newInstance("org.apache.axis2.jaxws.description.xml.handler",
> +                                                    this.getClass().getClassLoader());
> +
> +                    Unmarshaller u = jc.createUnmarshaller();
> +
> +                    JAXBElement<?> o = (JAXBElement<?>) u.unmarshal(is);
> +                    handlerChainsType = (HandlerChainsType) o.getValue();
> +
> +                } catch (Exception e) {
> +                    throw ExceptionFactory.makeWebServiceException("EndpointDescriptionImpl: getHandlerChain: thrown when attempting to unmarshall JAXB content");
> +                }
> +            }
> +        }
> +        return handlerChainsType;
> +    }
> +
> +
> +    /*
> +     * This is a client side only method. The generated service class may contain
> +     * handler chain annotations
> +     */
> +    public HandlerChain getAnnoHandlerChainAnnotation() {
> +        if (this.handlerChainAnnotation == null) {
> +                if (serviceClass != null) {
> +                    handlerChainAnnotation =
> +                            (HandlerChain) serviceClass.getAnnotation(HandlerChain.class);
> +            }
> +        }
> +
> +        return handlerChainAnnotation;
> +    }
> +
> +    /* Returns the WSDL definiton as specified in the metadata.  Note that this WSDL may not be
>       * complete.
>       */
>      public Definition getWSDLDefinition() {
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-cvs-help@ws.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: axis-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-dev-help@ws.apache.org


Re: svn commit: r552920 - in /webservices/axis2/trunk/java/modules: jaxws/src/org/apache/axis2/jaxws/ jaxws/src/org/apache/axis2/jaxws/binding/ jaxws/src/org/apache/axis2/jaxws/handler/ jaxws/src/org/apache/axis2/jaxws/server/ jaxws/src/org/apache/ax

Posted by Nikhil V Thaker <ni...@us.ibm.com>.
Jarek - This patch adds implementation for getHandlerChainResolver() in 
HandlerResolver. I have restored the HandlerLifeCycleManager code from 
HandlerResolverImpl in revision 552952.

Thanks,
Nikhil Thaker
office: 512 838 9964
nvthaker@us.ibm.com



"Jarek Gawor" <jg...@gmail.com> 
07/03/2007 12:48 PM
Please respond to
axis-dev@ws.apache.org


To
"axis-dev@ws.apache.org" <ax...@ws.apache.org>
cc

Subject
Re: svn commit: r552920 - in /webservices/axis2/trunk/java/modules: 
jaxws/src/org/apache/axis2/jaxws/ 
jaxws/src/org/apache/axis2/jaxws/binding/ 
jaxws/src/org/apache/axis2/jaxws/handler/ 
jaxws/src/org/apache/axis2/jaxws/server/ jaxws/src/org/apache/ax






I'm sorry, I have to object to this commit. This is removing some of
the changes I've made before (and one change just got removed for the
second time!). For example I've added support for
HandlerLifecycleManager that works just like EndpointLifecycleManager
and can do injection/call PostConstruct and this commit just removed
calls to it. Please explain why is this necessary.

Jarek

On 7/3/07, nthaker@apache.org <nt...@apache.org> wrote:
> Author: nthaker
> Date: Tue Jul  3 10:14:00 2007
> New Revision: 552920
>
> URL: http://svn.apache.org/viewvc?view=rev&rev=552920
> Log:
> JIRA = AXIS2-2894
>
> Modified:
> 
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/BindingProvider.java
> 
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/binding/BindingImpl.java
> 
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/handler/HandlerResolverImpl.java
> 
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java
> 
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/spi/ServiceDelegate.java
> 
webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/sample/AddNumbersHandlerTests.java
> 
webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/ServiceDescription.java
> 
webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java
>
> Modified: 
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/BindingProvider.java
> URL: 
http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/BindingProvider.java?view=diff&rev=552920&r1=552919&r2=552920

> 
==============================================================================
> --- 
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/BindingProvider.java 
(original)
> +++ 
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/BindingProvider.java 
Tue Jul  3 10:14:00 2007
> @@ -18,6 +18,11 @@
>   */
>  package org.apache.axis2.jaxws;
>
> +import java.util.Hashtable;
> +import java.util.Map;
> +
> +import javax.xml.ws.Binding;
> +import javax.xml.ws.handler.HandlerResolver;
>  import org.apache.axis2.jaxws.binding.BindingUtils;
>  import org.apache.axis2.jaxws.binding.SOAPBinding;
>  import org.apache.axis2.jaxws.client.PropertyValidator;
> @@ -29,11 +34,8 @@
>  import org.apache.axis2.jaxws.spi.ServiceDelegate;
>  import org.apache.axis2.transport.http.HTTPConstants;
>
> -import javax.xml.ws.Binding;
> -import javax.xml.ws.handler.HandlerResolver;
> -
> -import java.util.Hashtable;
> -import java.util.Map;
> +import org.apache.commons.logging.Log;
> +import org.apache.commons.logging.LogFactory;
>
>  public class BindingProvider implements 
org.apache.axis2.jaxws.spi.BindingProvider {
>
> @@ -46,7 +48,7 @@
>      protected ServiceDelegate serviceDelegate;
>
>      private Binding binding = null;
> -
> +    private static final Log log = 
LogFactory.getLog(BindingProvider.class);
>      public BindingProvider(ServiceDelegate svcDelegate, 
EndpointDescription epDesc) {
>          endpointDesc = epDesc;
>          serviceDelegate = svcDelegate;
> @@ -75,11 +77,23 @@
>          // so we can also set the handlerchain
>          if (binding == null) {
>              binding = BindingUtils.createBinding(endpointDesc);
> -
> +            if(log.isDebugEnabled()){
> +                log.debug("Lookign for Handler Resolver");
> +            }
>              // TODO should we allow the ServiceDelegate to figure out 
the default handlerresolver?  Probably yes, since a client app may look 
for one there.
> -            HandlerResolver handlerResolver =
> -                    serviceDelegate.getHandlerResolver() != null ? 
serviceDelegate.getHandlerResolver()
> -                            : new HandlerResolverImpl(endpointDesc);
> +            HandlerResolver handlerResolver = null;
> +            if(serviceDelegate.getHandlerResolver() != null){
> +                if(log.isDebugEnabled()){
> +                    log.debug("Reading default Handler Resolver ");
> +                }
> +                handlerResolver= serviceDelegate.getHandlerResolver();
> +            }
> +            else{
> +                handlerResolver = new 
HandlerResolverImpl(endpointDesc.getServiceDescription());
> +                if(log.isDebugEnabled()){
> +                    log.debug("Creating new Handler Resolver using 
HandlerResolverImpl");
> +                }
> +            }
> 
binding.setHandlerChain(handlerResolver.getHandlerChain(endpointDesc.getPortInfo()));
>          }
>
>
> Modified: 
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/binding/BindingImpl.java
> URL: 
http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/binding/BindingImpl.java?view=diff&rev=552920&r1=552919&r2=552920

> 
==============================================================================
> --- 
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/binding/BindingImpl.java 
(original)
> +++ 
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/binding/BindingImpl.java 
Tue Jul  3 10:14:00 2007
> @@ -19,16 +19,15 @@
>
>  package org.apache.axis2.jaxws.binding;
>
> -import org.apache.axis2.jaxws.description.EndpointDescription;
> -import org.apache.axis2.jaxws.handler.HandlerResolverImpl;
> +import java.util.ArrayList;
> +import java.util.List;
> +import java.util.Set;
>
>  import javax.xml.ws.Binding;
>  import javax.xml.ws.handler.Handler;
>
> -import java.net.URI;
> -import java.util.ArrayList;
> -import java.util.List;
> -import java.util.Set;
> +import org.apache.axis2.jaxws.description.EndpointDescription;
> +import org.apache.axis2.jaxws.handler.HandlerResolverImpl;
>
>  /**
>   * @author rott classes that would normally "implement 
javax.xml.ws.Binding"
> @@ -63,11 +62,10 @@
>      }
>
>      public List<Handler> getHandlerChain() {
> -        if (handlers == null && endpointDesc != null) {
> -            handlers = new 
HandlerResolverImpl(endpointDesc).getHandlerChain(endpointDesc
> -                            .getPortInfo());
> -        }
>          if (handlers == null) {
> +            handlers =
> +                    new 
HandlerResolverImpl(endpointDesc.getServiceDescription()).getHandlerChain(endpointDesc.getPortInfo());
> +            if (handlers == null)
>              handlers = new ArrayList<Handler>(); // non-null so client
>                                                   // apps can manipulate
>          }
>
> Modified: 
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/handler/HandlerResolverImpl.java
> URL: 
http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/handler/HandlerResolverImpl.java?view=diff&rev=552920&r1=552919&r2=552920

> 
==============================================================================
> --- 
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/handler/HandlerResolverImpl.java 
(original)
> +++ 
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/handler/HandlerResolverImpl.java 
Tue Jul  3 10:14:00 2007
> @@ -18,36 +18,37 @@
>   */
>  package org.apache.axis2.jaxws.handler;
>
> -import java.security.PrivilegedActionException;
> -import java.security.PrivilegedExceptionAction;
> -import java.util.ArrayList;
> -import java.util.HashMap;
> -import java.util.Iterator;
> -import java.util.List;
> -import java.util.Map;
> -
> -import javax.xml.namespace.QName;
> -import javax.xml.ws.WebServiceException;
> -import javax.xml.ws.handler.Handler;
> -import javax.xml.ws.handler.HandlerResolver;
> -import javax.xml.ws.handler.LogicalHandler;
> -import javax.xml.ws.handler.PortInfo;
> -import javax.xml.ws.handler.soap.SOAPHandler;
> -
> +import org.apache.axis2.client.OperationClient;
>  import org.apache.axis2.java.security.AccessController;
>  import org.apache.axis2.jaxws.ExceptionFactory;
> -import org.apache.axis2.jaxws.core.MessageContext;
>  import org.apache.axis2.jaxws.description.EndpointDescription;
> +import org.apache.axis2.jaxws.description.ServiceDescription;
>  import org.apache.axis2.jaxws.description.xml.handler.HandlerChainType;
>  import 
org.apache.axis2.jaxws.description.xml.handler.HandlerChainsType;
>  import org.apache.axis2.jaxws.description.xml.handler.HandlerType;
> -import 
org.apache.axis2.jaxws.handler.lifecycle.factory.HandlerLifecycleManager;
> -import 
org.apache.axis2.jaxws.handler.lifecycle.factory.HandlerLifecycleManagerFactory;
>  import org.apache.axis2.jaxws.i18n.Messages;
> -import org.apache.axis2.jaxws.registry.FactoryRegistry;
> +import 
org.apache.axis2.jaxws.runtime.description.injection.ResourceInjectionServiceRuntimeDescription;
> +import 
org.apache.axis2.jaxws.runtime.description.injection.impl.ResourceInjectionServiceRuntimeDescriptionBuilder;
>  import org.apache.commons.logging.Log;
>  import org.apache.commons.logging.LogFactory;
>
> +import javax.xml.namespace.QName;
> +import javax.xml.ws.WebServiceException;
> +import javax.xml.ws.handler.Handler;
> +import javax.xml.ws.handler.HandlerResolver;
> +import javax.xml.ws.handler.LogicalHandler;
> +import javax.xml.ws.handler.PortInfo;
> +import javax.xml.ws.handler.soap.SOAPHandler;
> +
> +import java.lang.reflect.InvocationTargetException;
> +import java.lang.reflect.Method;
> +import java.security.PrivilegedActionException;
> +import java.security.PrivilegedExceptionAction;
> +import java.util.ArrayList;
> +import java.util.HashMap;
> +import java.util.Iterator;
> +import java.util.List;
> +import java.util.Map;
>  /*
>   * This class should be created by the ServiceDelegate.
>   * HandlerResolverImpl.getHandlerChain(PortInfo) will be called by the
> @@ -78,10 +79,12 @@
>        */
>
>      // we'll need to refer to this object to get the port, and thus 
handlers
> -    private EndpointDescription endpointDesc;
> +    //private EndpointDescription endpointDesc;
> +    private ServiceDescription serviceDesc;
>
> -    public HandlerResolverImpl(EndpointDescription ed) {
> -        this.endpointDesc = ed;
> +    public HandlerResolverImpl(ServiceDescription sd) { 
//EndpointDescription ed) {
> +        //this.endpointDesc = ed;
> +        this.serviceDesc = sd;
>      }
>
>      public ArrayList<Handler> getHandlerChain(PortInfo portinfo) {
> @@ -142,12 +145,25 @@
>
>          ArrayList<Handler> handlers = new ArrayList<Handler>();
>
> -               /*
> -                * TODO: do a better job checking that the return value 
matches up
> +        /*
> +         * TODO: do a better job checking that the return value matches 
up
>           * with the PortInfo object before we add it to the chain.
> -                */
> -
> -        HandlerChainsType handlerCT = endpointDesc.getHandlerChain();
> +         */
> +
> +        HandlerChainsType handlerCT = serviceDesc.getHandlerChain();
> +        // if there's a handlerChain on the serviceDesc, it means the 
WSDL defined an import for a HandlerChain.
> +        // the spec indicates that if a handlerchain also appears on 
the SEI on the client.
> +        EndpointDescription ed = null;
> +        if(portinfo !=null){
> +             ed = 
serviceDesc.getEndpointDescription(portinfo.getPortName());
> +        }
> +
> +        if (ed != null) {
> +            HandlerChainsType handlerCT_fromEndpointDesc = 
ed.getHandlerChain();
> +            if (handlerCT == null) {
> +                handlerCT = handlerCT_fromEndpointDesc;
> +            }
> +        }
>
>          Iterator it = handlerCT == null ? null : 
handlerCT.getHandlerChain().iterator();
>
> @@ -171,17 +187,21 @@
>                  // or will schema not allow it?
>                  String portHandler = 
handlerType.getHandlerClass().getValue();
>                  Handler handler;
> -
> -                // Create temporary MessageContext to pass information 
to HandlerLifecycleManager
> -                MessageContext ctx = new MessageContext();
> -                ctx.setEndpointDescription(endpointDesc);
> -
> -                HandlerLifecycleManager hlm = 
createHandlerlifecycleManager();
> -
> -                //  instantiate portHandler class
> +                // instantiate portHandler class
>                  try {
> -                    handler = hlm.createHandlerInstance(ctx, 
loadClass(portHandler));
> -                } catch (Exception e) {
> +                    // TODO: review: ok to use system classloader?
> +                    handler = (Handler) 
loadClass(portHandler).newInstance();
> +                    // TODO: must also do resource injection according 
to JAXWS 9.3.1
> +                    callHandlerPostConstruct(handler, serviceDesc);
> +                } catch (ClassNotFoundException e) {
> +                    // TODO: should we just ignore this problem?
> +                    // TODO: NLS log and throw
> +                    throw ExceptionFactory.makeWebServiceException(e);
> +                } catch (InstantiationException ie) {
> +                    // TODO: should we just ignore this problem?
> +                    // TODO: NLS log and throw
> +                    throw ExceptionFactory.makeWebServiceException(ie);
> +                } catch (IllegalAccessException e) {
>                      // TODO: should we just ignore this problem?
>                      // TODO: NLS log and throw
>                      throw ExceptionFactory.makeWebServiceException(e);
> @@ -210,11 +230,6 @@
>          return handlers;
>      }
>
> -    private HandlerLifecycleManager createHandlerlifecycleManager() {
> -        HandlerLifecycleManagerFactory elmf = 
(HandlerLifecycleManagerFactory)FactoryRegistry
> -                .getFactory(HandlerLifecycleManagerFactory.class);
> -        return elmf.createHandlerLifecycleManager();
> -    }
>
>      private static Class loadClass(String clazz) throws 
ClassNotFoundException {
>          try {
> @@ -272,6 +287,60 @@
>          }
>
>          return cl;
> +    }
> +
> +    private static void callHandlerPostConstruct(Handler handler, 
ServiceDescription serviceDesc)
> +                          throws WebServiceException {
> +        ResourceInjectionServiceRuntimeDescription resInj =
> + ResourceInjectionServiceRuntimeDescriptionBuilder.create(serviceDesc,
> +  handler.getClass());
> +        if (resInj != null) {
> +            Method pcMethod = resInj.getPostConstructMethod();
> +            if (pcMethod != null) {
> +                if (log.isDebugEnabled()) {
> +                    log.debug("Invoking Method with @PostConstruct 
annotation");
> +                }
> +                invokeMethod(handler, pcMethod, null);
> +                if (log.isDebugEnabled()) {
> +                    log.debug("Completed invoke on Method with 
@PostConstruct annotation");
> +                }
> +            }
> +        }
> +    }
> +    /*
> +     * Helper method to destroy all instantiated Handlers once the 
runtime
> +     * is done with them.
> +     */
> +    private static void callHandlerPreDestroy(Handler handler, 
ServiceDescription serviceDesc)
> +                       throws WebServiceException {
> +        ResourceInjectionServiceRuntimeDescription resInj =
> + ResourceInjectionServiceRuntimeDescriptionBuilder.create(serviceDesc,
> +  handler.getClass());
> +        if (resInj != null) {
> +            Method pcMethod = resInj.getPreDestroyMethod();
> +            if (pcMethod != null) {
> +                if (log.isDebugEnabled()) {
> +                    log.debug("Invoking Method with @PostConstruct 
annotation");
> +                }
> +                invokeMethod(handler, pcMethod, null);
> +                if (log.isDebugEnabled()) {
> +                    log.debug("Completed invoke on Method with 
@PostConstruct annotation");
> +                }
> +            }
> +        }
> +    }
> +
> +    private static void invokeMethod(Handler handlerInstance, Method m, 
Object[] params)
> +                 throws WebServiceException {
> +        try {
> +            m.invoke(handlerInstance, params);
> +        } catch (InvocationTargetException e) {
> +            // TODO perhaps a "HandlerLifecycleException" would be 
better?
> +            throw ExceptionFactory.makeWebServiceException(e);
> +        } catch (IllegalAccessException e) {
> +            // TODO perhaps a "HandlerLifecycleException" would be 
better?
> +            throw ExceptionFactory.makeWebServiceException(e);
> +        }
>      }
>
>      private static boolean chainResolvesToPort(HandlerChainType 
handlerChainType, PortInfo portinfo) {
>
> Modified: 
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java
> URL: 
http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java?view=diff&rev=552920&r1=552919&r2=552920

> 
==============================================================================
> --- 
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java 
(original)
> +++ 
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java 
Tue Jul  3 10:14:00 2007
> @@ -110,9 +110,7 @@
>           * Since we're on the server, and there apparently is no 
Binding object
>           * anywhere to be found...
>           */
> -        if (ic.getHandlers() == null) {
> -            ic.setHandlers(new 
HandlerResolverImpl(endpointDesc).getHandlerChain(endpointDesc.getPortInfo()));
> -        }
> +        ic.setHandlers(new 
HandlerResolverImpl(endpointDesc.getServiceDescription()).getHandlerChain(endpointDesc.getPortInfo()));
>
>          if (!bindingTypesMatch(requestMsgCtx, 
endpointDesc.getServiceDescription())) {
>              Protocol protocol = 
requestMsgCtx.getMessage().getProtocol();
>
> Modified: 
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/spi/ServiceDelegate.java
> URL: 
http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/spi/ServiceDelegate.java?view=diff&rev=552920&r1=552919&r2=552920

> 
==============================================================================
> --- 
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/spi/ServiceDelegate.java 
(original)
> +++ 
webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/spi/ServiceDelegate.java 
Tue Jul  3 10:14:00 2007
> @@ -282,6 +282,9 @@
>      * @see javax.xml.ws.spi.ServiceDelegate#getHandlerResolver()
>      */
>      public HandlerResolver getHandlerResolver() {
> +        if (handlerResolver == null) {
> +            handlerResolver = new 
HandlerResolverImpl(serviceDescription);
> +        }
>          return handlerResolver;
>      }
>
>
> Modified: 
webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/sample/AddNumbersHandlerTests.java
> URL: 
http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/sample/AddNumbersHandlerTests.java?view=diff&rev=552920&r1=552919&r2=552920

> 
==============================================================================
> --- 
webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/sample/AddNumbersHandlerTests.java 
(original)
> +++ 
webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/sample/AddNumbersHandlerTests.java 
Tue Jul  3 10:14:00 2007
> @@ -492,4 +492,19 @@
>
>          return new StreamSource(new StringReader(reqString));
>      }
> +
> +    public void testAddNumbersHandlerHandlerResolver() {
> +        try {
> +        System.out.println("----------------------------------");
> +        System.out.println("test: " + getName());
> +        AddNumbersHandlerService service = new 
AddNumbersHandlerService(); // will give NPE:
> +        List<Handler> handlers = 
service.getHandlerResolver().getHandlerChain(null);
> +        assertNotNull("Default handlers list should not be null but 
empty.", handlers);
> +        System.out.println("----------------------------------");
> +        } catch (Exception e) {
> +        e.printStackTrace();
> +        fail(e.getMessage());
> +        }
> +        }
> +
>  }
>
> Modified: 
webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/ServiceDescription.java
> URL: 
http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/ServiceDescription.java?view=diff&rev=552920&r1=552919&r2=552920

> 
==============================================================================
> --- 
webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/ServiceDescription.java 
(original)
> +++ 
webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/ServiceDescription.java 
Tue Jul  3 10:14:00 2007
> @@ -20,7 +20,7 @@
>
>  import org.apache.axis2.client.ServiceClient;
>  import org.apache.axis2.context.ConfigurationContext;
> -
> +import 
org.apache.axis2.jaxws.description.xml.handler.HandlerChainsType;
>  import javax.xml.namespace.QName;
>  import java.util.Collection;
>  import java.util.List;
> @@ -84,6 +84,7 @@
>
>      public abstract QName getServiceQName();
>
> +    public abstract HandlerChainsType getHandlerChain();
>      /**
>       * Returns a list of the ports for this serivce.  The ports 
returned are the - Ports declared
>       * ports for this Service.  They can be delcared in the WSDL or via 
annotations. - Dynamic ports
>
> Modified: 
webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java
> URL: 
http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java?view=diff&rev=552920&r1=552919&r2=552920

> 
==============================================================================
> --- 
webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java 
(original)
> +++ 
webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java 
Tue Jul  3 10:14:00 2007
> @@ -18,6 +18,39 @@
>   */
>  package org.apache.axis2.jaxws.description.impl;
>
> +import static 
org.apache.axis2.jaxws.description.builder.MDQConstants.RETURN_TYPE_FUTURE;
> +import static 
org.apache.axis2.jaxws.description.builder.MDQConstants.RETURN_TYPE_RESPONSE;
> +
> +import java.io.FileNotFoundException;
> +import java.io.IOException;
> +import java.io.InputStream;
> +import java.net.ConnectException;
> +import java.net.URL;
> +import java.net.UnknownHostException;
> +import java.util.ArrayList;
> +import java.util.Collection;
> +import java.util.Collections;
> +import java.util.Enumeration;
> +import java.util.HashMap;
> +import java.util.Hashtable;
> +import java.util.Iterator;
> +import java.util.List;
> +import java.util.Map;
> +import java.util.concurrent.ConcurrentHashMap;
> +
> +import javax.jws.HandlerChain;
> +import javax.wsdl.Definition;
> +import javax.wsdl.Port;
> +import javax.wsdl.PortType;
> +import javax.wsdl.Service;
> +import javax.wsdl.WSDLException;
> +import javax.wsdl.extensions.ExtensibilityElement;
> +import javax.xml.bind.JAXBContext;
> +import javax.xml.bind.JAXBElement;
> +import javax.xml.bind.Unmarshaller;
> +import javax.xml.namespace.QName;
> +import javax.xml.ws.soap.SOAPBinding;
> +
>  import org.apache.axis2.client.ServiceClient;
>  import org.apache.axis2.context.ConfigurationContext;
>  import org.apache.axis2.description.AxisService;
> @@ -32,36 +65,15 @@
>  import org.apache.axis2.jaxws.description.ServiceRuntimeDescription;
>  import 
org.apache.axis2.jaxws.description.builder.DescriptionBuilderComposite;
>  import org.apache.axis2.jaxws.description.builder.MDQConstants;
> -import static 
org.apache.axis2.jaxws.description.builder.MDQConstants.RETURN_TYPE_FUTURE;
> -import static 
org.apache.axis2.jaxws.description.builder.MDQConstants.RETURN_TYPE_RESPONSE;
>  import 
org.apache.axis2.jaxws.description.builder.MethodDescriptionComposite;
>  import 
org.apache.axis2.jaxws.description.builder.ParameterDescriptionComposite;
> +import 
org.apache.axis2.jaxws.description.xml.handler.HandlerChainsType;
>  import org.apache.axis2.jaxws.i18n.Messages;
>  import org.apache.axis2.jaxws.util.WSDL4JWrapper;
>  import org.apache.axis2.jaxws.util.WSDLWrapper;
>  import org.apache.commons.logging.Log;
>  import org.apache.commons.logging.LogFactory;
>
> -import javax.wsdl.Definition;
> -import javax.wsdl.Port;
> -import javax.wsdl.PortType;
> -import javax.wsdl.Service;
> -import javax.wsdl.WSDLException;
> -import javax.wsdl.extensions.ExtensibilityElement;
> -import javax.xml.namespace.QName;
> -import javax.xml.ws.soap.SOAPBinding;
> -import java.io.FileNotFoundException;
> -import java.io.IOException;
> -import java.net.ConnectException;
> -import java.net.URL;
> -import java.net.UnknownHostException;
> -import java.util.ArrayList;
> -import java.util.Collection;
> -import java.util.Collections;
> -import java.util.HashMap;
> -import java.util.Iterator;
> -import java.util.List;
> -import java.util.Map;
>
>  /** @see ../ServiceDescription */
>  class ServiceDescriptionImpl
> @@ -79,6 +91,10 @@
>      // TODO: Possibly remove Definition and delegate to the Defn on the 
AxisSerivce set as a paramater by WSDLtoAxisServicBuilder?
>      private WSDLWrapper wsdlWrapper;
>      private WSDLWrapper generatedWsdlWrapper;
> +
> +    //ANNOTATION: @HandlerChain
> +    private HandlerChain handlerChainAnnotation;
> +    private HandlerChainsType handlerChainsType;
>
>      private Map<QName, EndpointDescription> endpointDescriptions =
>              new HashMap<QName, EndpointDescription>();
> @@ -1322,8 +1338,87 @@
>          return wsdlSpecified;
>      }
>
> +
> +    // ===========================================
> +    // ANNOTATION: HandlerChain
> +    // ===========================================
> +
>      /**
> -     * Returns the WSDL definiton as specified in the metadata.  Note 
that this WSDL may not be
> +     * Returns a schema derived java class containing the the handler 
configuration filel
> +     *
> +     * @return HandlerChainsType This is the top-level element for the 
Handler configuration file
> +     *
> +     */
> +    public HandlerChainsType getHandlerChain() {
> +
> +        if (handlerChainsType == null) {
> +
> +            getAnnoHandlerChainAnnotation();
> +            if (handlerChainAnnotation != null) {
> +
> +                String handlerFileName = handlerChainAnnotation.file();
> +
> +                // TODO RAS & NLS
> +                if (log.isDebugEnabled()) {
> +                    if (composite != null) {
> + log.debug("EndpointDescriptionImpl.getHandlerChain: fileName: "
> +                                + handlerFileName + " className: " + 
composite.getClassName());
> +                    }
> +                    else {
> + log.debug("EndpointDescriptionImpl.getHandlerChain: fileName: "
> +                                + handlerFileName + " className: " + 
serviceClass.getName());
> +                    }
> +                }
> +
> +                String className =
> +                        (composite != null) ? composite.getClassName() 
: serviceClass.getName();
> +
> +                ClassLoader classLoader =
> +                        (composite != null) ? 
composite.getClassLoader() : this.getClass()
> +        .getClassLoader();
> +
> +                InputStream is =
> + DescriptionUtils.openHandlerConfigStream(handlerFileName,
> + className,
> + classLoader);
> +
> +                try {
> +
> +                    // All the classes we need should be part of this 
package
> +                    JAXBContext jc =
> + 
JAXBContext.newInstance("org.apache.axis2.jaxws.description.xml.handler",
> + this.getClass().getClassLoader());
> +
> +                    Unmarshaller u = jc.createUnmarshaller();
> +
> +                    JAXBElement<?> o = (JAXBElement<?>) 
u.unmarshal(is);
> +                    handlerChainsType = (HandlerChainsType) 
o.getValue();
> +
> +                } catch (Exception e) {
> +                    throw 
ExceptionFactory.makeWebServiceException("EndpointDescriptionImpl: 
getHandlerChain: thrown when attempting to unmarshall JAXB content");
> +                }
> +            }
> +        }
> +        return handlerChainsType;
> +    }
> +
> +
> +    /*
> +     * This is a client side only method. The generated service class 
may contain
> +     * handler chain annotations
> +     */
> +    public HandlerChain getAnnoHandlerChainAnnotation() {
> +        if (this.handlerChainAnnotation == null) {
> +                if (serviceClass != null) {
> +                    handlerChainAnnotation =
> +                            (HandlerChain) 
serviceClass.getAnnotation(HandlerChain.class);
> +            }
> +        }
> +
> +        return handlerChainAnnotation;
> +    }
> +
> +    /* Returns the WSDL definiton as specified in the metadata.  Note 
that this WSDL may not be
>       * complete.
>       */
>      public Definition getWSDLDefinition() {
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-cvs-help@ws.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: axis-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-dev-help@ws.apache.org