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 nt...@apache.org on 2007/07/03 19:14:02 UTC

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/axis2/ja...

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