Author: barrettj
Date: Tue May  4 00:25:24 2010
New Revision: 940682

URL: http://svn.apache.org/viewvc?rev=940682&view=rev
Log:
Add Addressing support on client side configurable via metadata.  Add 
associated TDD tests.

Added:
    
axis/axis2/java/core/trunk/modules/jaxws/test/org/apache/axis2/jaxws/client/proxy/ProxyAddressingMetadataTest.java
    
axis/axis2/java/core/trunk/modules/jaxws/test/org/apache/axis2/jaxws/spi/ClientMetadataAddressingFeatureTests.java
Modified:
    
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/BindingProvider.java
    
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/binding/SOAPBinding.java
    
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/client/proxy/JAXWSProxyHandler.java
    
axis/axis2/java/core/trunk/modules/metadata/src/org/apache/axis2/jaxws/description/ServiceDescription.java
    
axis/axis2/java/core/trunk/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java

Modified: 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/BindingProvider.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/BindingProvider.java?rev=940682&r1=940681&r2=940682&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/BindingProvider.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/BindingProvider.java
 Tue May  4 00:25:24 2010
@@ -43,6 +43,7 @@ import javax.xml.ws.EndpointReference;
 import javax.xml.ws.WebServiceException;
 import javax.xml.ws.WebServiceFeature;
 import javax.xml.ws.handler.HandlerResolver;
+import javax.xml.ws.soap.AddressingFeature.Responses;
 import javax.xml.ws.wsaddressing.W3CEndpointReference;
 import java.util.Hashtable;
 import java.util.Map;
@@ -122,7 +123,7 @@ public class BindingProvider implements 
             }
         }
 
-        // See if the metadata from creating the service indicates that MTOM 
and/or RespectBinding should be enabled
+        // See if the metadata from creating the service indicates that MTOM, 
Addressing and/or RespectBinding should be enabled
         if (binding instanceof SOAPBinding) {
             configureBindingFromMetadata();
         }
@@ -159,16 +160,20 @@ public class BindingProvider implements 
     }
 
     /**
-     * Configure the binding from the Metadata for MTOM and RespectBinding.
+     * Configure the binding from the Metadata for WebService Features.
      */
     private void configureBindingFromMetadata() {
         // MTOM can be enabled either at the ServiceDescription level (via the 
WSDL binding type) or
         // at the EndpointDescription level via the binding type used to 
create a Dispatch.
         boolean enableMTOMFromMetadata = false;
         int mtomThreshold = 0;
+        boolean isAddressingConfiguredViaMetadata = false;
         boolean enableRespectBindingdFromMetadata = false;
+        boolean enableAddressingFromMetadata = false;
+        boolean requireAddressingFromMetadata = false;
+        Responses addressingResponses = null;
         
-        // if we have an SEI for the port, then we'll use it in order to 
search for MTOM configuration
+        // if we have an SEI for the port, then we'll use it in order to 
search for WebService Feature configuration
         if(endpointDesc.getEndpointInterfaceDescription() != null
                 &&
                 endpointDesc.getEndpointInterfaceDescription().getSEIClass() 
!= null) {
@@ -179,11 +184,24 @@ public class BindingProvider implements 
 
             enableRespectBindingdFromMetadata = 
isRespectBindingEnabled(endpointDesc.getServiceDescription(), serviceDelegate,
                     
endpointDesc.getEndpointInterfaceDescription().getSEIClass());
+            
+            isAddressingConfiguredViaMetadata = 
isAddressingConfigured(endpointDesc.getServiceDescription(), serviceDelegate,
+                    
endpointDesc.getEndpointInterfaceDescription().getSEIClass());
+            if (isAddressingConfiguredViaMetadata) {
+                enableAddressingFromMetadata = 
isAddressingEnabled(endpointDesc.getServiceDescription(), serviceDelegate,
+                        
endpointDesc.getEndpointInterfaceDescription().getSEIClass());
+                requireAddressingFromMetadata = 
isAddressingRequired(endpointDesc.getServiceDescription(), serviceDelegate,
+                        
endpointDesc.getEndpointInterfaceDescription().getSEIClass());
+                addressingResponses = 
getAddressingResponses(endpointDesc.getServiceDescription(), serviceDelegate,
+                        
endpointDesc.getEndpointInterfaceDescription().getSEIClass());
+            }
+           
+            
         }
         else {
             enableMTOMFromMetadata = 
endpointDesc.getServiceDescription().isMTOMEnabled(serviceDelegate);
-            // Threshold & RespectBinding does not need to be set here based 
on the sparse composite (i.e. depolyment descriptor)
-            // since it can only be applied to a port injection (i.e. an SEI) 
using a DD.
+            // MTOM.Threshold, RespectBinding, and Addressing does not need to 
be set here based on the sparse composite 
+            // (i.e. depolyment descriptor) since it can only be applied to a 
port injection (i.e. an SEI) using a DD.
         }
         if (!enableMTOMFromMetadata) {
             String bindingType = endpointDesc.getClientBindingID();
@@ -199,6 +217,13 @@ public class BindingProvider implements 
         if (enableRespectBindingdFromMetadata) {
             ((SOAPBinding) binding).setRespectBindingEnabled(true);
         }
+        
+        if (isAddressingConfiguredViaMetadata) {
+            ((SOAPBinding) binding).setAddressingConfigured(true);
+            ((SOAPBinding) 
binding).setAddressingEnabled(enableAddressingFromMetadata);
+            ((SOAPBinding) 
binding).setAddressingRequired(requireAddressingFromMetadata);
+            ((SOAPBinding) 
binding).setAddressingResponses(addressingResponses);
+        }
     }
 
     private boolean isRespectBindingEnabled(ServiceDescription 
serviceDescription, ServiceDelegate serviceDelegateKey, 
@@ -207,6 +232,42 @@ public class BindingProvider implements 
         return isEnabled;
     }
 
+    
+    /**
+     * Answer if addressing was explicitly configured via metadata.  Note that 
if Addressing was not explicitly configured,
+     * then the related methods will return default values.  If Addressing was 
explicitly configured, the related 
+     * methods will return values based on whatever configuration was 
specified.
+     * @see #isAddressingEnabled(ServiceDescription, ServiceDelegate, Class) 
+     * @see #isAddressingRequired(ServiceDescription, ServiceDelegate, Class)
+     * @see #getAddressingResponses(ServiceDescription, ServiceDelegate, Class)
+     * @param serviceDescription
+     * @param serviceDelegateKey
+     * @param seiClass
+     * @return true if addressing was explicitly configured via metadata, 
false otherwise.
+     */
+    private boolean isAddressingConfigured(ServiceDescription 
serviceDescription, ServiceDelegate serviceDelegateKey, 
+            Class seiClass) {
+        boolean isConfigured = 
serviceDescription.isAddressingConfigured(serviceDelegateKey, seiClass);
+        return isConfigured;
+    }
+    
+    private boolean isAddressingEnabled(ServiceDescription serviceDescription, 
ServiceDelegate serviceDelegateKey, 
+            Class seiClass) {
+        boolean isEnabled = 
serviceDescription.isAddressingEnabled(serviceDelegateKey, seiClass);
+        return isEnabled;
+    }
+
+    private boolean isAddressingRequired(ServiceDescription 
serviceDescription, ServiceDelegate serviceDelegateKey, 
+            Class seiClass) {
+        boolean isRequired = 
serviceDescription.isAddressingRequired(serviceDelegateKey, seiClass);
+        return isRequired;
+    }
+    private Responses getAddressingResponses(ServiceDescription 
serviceDescription, ServiceDelegate serviceDelegateKey, 
+            Class seiClass) {
+        Responses responses = 
serviceDescription.getAddressingResponses(serviceDelegateKey, seiClass);
+        return responses;
+    }
+
     private int getMTOMThreshold(ServiceDescription serviceDescription, 
ServiceDelegate serviceDelegate, Class seiClass) {
         int threshold = serviceDescription.getMTOMThreshold(serviceDelegate, 
seiClass);
         

Modified: 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/binding/SOAPBinding.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/binding/SOAPBinding.java?rev=940682&r1=940681&r2=940682&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/binding/SOAPBinding.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/binding/SOAPBinding.java
 Tue May  4 00:25:24 2010
@@ -32,6 +32,8 @@ import javax.xml.soap.SOAPConstants;
 import javax.xml.soap.SOAPException;
 import javax.xml.soap.SOAPFactory;
 import javax.xml.ws.WebServiceException;
+import javax.xml.ws.soap.AddressingFeature.Responses;
+
 import java.util.HashSet;
 import java.util.Set;
 
@@ -45,6 +47,10 @@ public class SOAPBinding extends Binding
     private boolean mtomEnabled = false;
     private int mtomThreshold = 0;
     private boolean respectBindingEnabled = false;
+    private boolean addressingConfigured = false;
+    private boolean addressingEnabled = false;
+    private boolean addressingRequired = false;
+    private Responses addressingResponses = Responses.ALL;
 
     private static Log log = LogFactory.getLog(SOAPBinding.class);
     
@@ -68,6 +74,67 @@ public class SOAPBinding extends Binding
     public void setRespectBindingEnabled(boolean enabled) {
         respectBindingEnabled = enabled;
     }
+    
+    /**
+     * Indicates if Addressing was configured explicitly via metadata, such as 
through a deployment descriptor.
+     * If an AddressingAnnot was specified in the DBC, then this will answer 
true.  The related addressing methods
+     * will return a default value if this method returns false.
+     * @see #isAddressingEnabled()
+     * @see #isAddressingRequired()
+     * @see #getAddressingResponses()
+     * @return true if addressing was explicitly configured via an 
AddressingAnnot in the DBC; false otherwise.
+     */
+    public boolean isAddressingConfigured() {
+        return addressingConfigured;
+    }
+    
+    /**
+     * Set whether Addressing was explicitly configured via metadata.  The 
default is false.
+     * @param configured boolean indicating of addressing was configured via 
metadata.
+     */
+    public void setAddressingConfigured(boolean configured) {
+        addressingConfigured = configured;
+    }
+    
+    /**
+     * Indicates if addressing is enabled or disabled.
+     * Note that if addressing was not explicitly configured via metadata, 
this will return a default value.
+     * @see #isAddressingConfigured()
+     * @return true if addressing is enabled, false (default) otherwise.
+     */
+    public boolean isAddressingEnabled() {
+        return addressingEnabled;
+    }
+    public void setAddressingEnabled(boolean enabled) {
+        addressingEnabled = enabled;
+    }
+    
+    /**
+     * Indicates if addressing is required or not.
+     * Note that if addressing was not explicitly configured via metadata, 
this will return a default value.
+     * @see #isAddressingConfigured()
+     * @return true if addressing is required, false (default) otherwise.
+     */
+    public boolean isAddressingRequired() {
+        return addressingRequired;
+    }
+    public void setAddressingRequired(boolean required) {
+        addressingRequired = required;
+    }
+    
+    /**
+     * Return the type of responses required by Addressing.
+     * Note that if addressing was not explicitly configured via metadata, 
this will return a default value.
+     * @see #isAddressingConfigured()
+     * @return AddressingFeature.Responses ENUM value indicating what type of 
addressing responses are required. 
+     */
+    public Responses getAddressingResponses() {
+        return addressingResponses;
+    }
+    public void setAddressingResponses(Responses responses) {
+        addressingResponses = responses;
+    }
+    
     /*
      * (non-Javadoc)
      * 

Modified: 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/client/proxy/JAXWSProxyHandler.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/client/proxy/JAXWSProxyHandler.java?rev=940682&r1=940681&r2=940682&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/client/proxy/JAXWSProxyHandler.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/client/proxy/JAXWSProxyHandler.java
 Tue May  4 00:25:24 2010
@@ -19,7 +19,9 @@
 
 package org.apache.axis2.jaxws.client.proxy;
 
+import org.apache.axis2.addressing.AddressingConstants;
 import org.apache.axis2.addressing.EndpointReference;
+import org.apache.axis2.addressing.AddressingConstants.Final;
 import org.apache.axis2.jaxws.BindingProvider;
 import org.apache.axis2.jaxws.ExceptionFactory;
 import org.apache.axis2.jaxws.client.async.AsyncResponse;
@@ -265,6 +267,10 @@ public class JAXWSProxyHandler extends B
                 Constants.APPLICATION_CONTEXT_MIGRATOR_LIST_ID, 
                 getRequestContext(), request);
 
+        // Note that configuring the MessageContext for addressing based on 
the metadata and for any 
+        // WebService Features needs to be done after the application context 
migration since it will move properties
+        // from the JAXWS RequestContext onto the Axis2 Message context, 
overwritting any that are already set.
+        configureAddressing(request, this);
         // Perform the WebServiceFeature configuration requested by the user.
         bnd.configure(request, this);
 
@@ -385,6 +391,44 @@ public class JAXWSProxyHandler extends B
         return null;
     }
     
+    /**
+     * For a SOAP Binding, configure the Addressing-related properties on the 
message context based on the
+     * addressing configuration specified via metadata (such as a deployment 
descriptor).  Note that if
+     * addressing was not explicitly configured, then the Addressing-related 
propertes will not be set on the
+     * message context.
+     * <p>
+     * This code is similar to the client-side Addressing configurator what 
the properties on the message context
+     * are set to.
+     * @see org.apache.axis2.jaxws.client.config.AddressingConfigurator
+     * @param messageContext The message context on which Addressing 
properties will be set
+     * @param bindingProvider Instance of the binding provider for which 
property values will be determined
+     */
+    private void configureAddressing(MessageContext messageContext, 
BindingProvider bindingProvider) {
+        
+        Binding binding = (Binding) bindingProvider.getBinding();
+        if (binding != null && binding instanceof SOAPBinding) {
+            SOAPBinding soapBinding = (SOAPBinding) binding;
+            org.apache.axis2.jaxws.binding.SOAPBinding implBinding = 
(org.apache.axis2.jaxws.binding.SOAPBinding) soapBinding;
+            if (implBinding.isAddressingConfigured()) {
+                String addressingNamespace = 
implBinding.getAddressingNamespace();
+                Boolean disableAddressing = new Boolean(true);
+                
+                if (implBinding.isAddressingEnabled()) {
+                    addressingNamespace = Final.WSA_NAMESPACE;
+                    disableAddressing = new Boolean(false);
+                }
+                
+                
messageContext.setProperty(AddressingConstants.WS_ADDRESSING_VERSION, 
addressingNamespace);                        
+                
messageContext.setProperty(AddressingConstants.DISABLE_ADDRESSING_FOR_OUT_MESSAGES,
 disableAddressing);
+            
+                // If the Addressing feature was specified, then get the 
responses value from it and map to the value 
+                // the addressing handler expects
+                
messageContext.setProperty(AddressingConstants.WSAM_INVOCATION_PATTERN_PARAMETER_NAME,
 
+                        
org.apache.axis2.jaxws.server.config.AddressingConfigurator.mapResponseAttributeToAddressing(implBinding.getAddressingResponses()));
+            }
+        }
+    }
+
     private AsyncResponse createProxyListener(Object[] args, 
OperationDescription operationDesc) {
         ProxyAsyncListener listener = new ProxyAsyncListener(operationDesc);
         listener.setHandler(this);

Added: 
axis/axis2/java/core/trunk/modules/jaxws/test/org/apache/axis2/jaxws/client/proxy/ProxyAddressingMetadataTest.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/test/org/apache/axis2/jaxws/client/proxy/ProxyAddressingMetadataTest.java?rev=940682&view=auto
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/jaxws/test/org/apache/axis2/jaxws/client/proxy/ProxyAddressingMetadataTest.java
 (added)
+++ 
axis/axis2/java/core/trunk/modules/jaxws/test/org/apache/axis2/jaxws/client/proxy/ProxyAddressingMetadataTest.java
 Tue May  4 00:25:24 2010
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *      
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axis2.jaxws.client.proxy;
+
+import org.apache.axis2.addressing.AddressingConstants;
+import org.apache.axis2.addressing.AddressingConstants.Final;
+import org.apache.axis2.jaxws.client.InterceptableClientTestCase;
+import org.apache.axis2.jaxws.client.TestClientInvocationController;
+import org.apache.axis2.jaxws.core.InvocationContext;
+import org.apache.axis2.jaxws.core.MessageContext;
+import org.apache.axis2.jaxws.description.builder.AddressingAnnot;
+import org.apache.axis2.jaxws.description.builder.DescriptionBuilderComposite;
+import org.apache.axis2.jaxws.description.builder.MDQConstants;
+import org.apache.axis2.jaxws.spi.ServiceDelegate;
+
+import javax.jws.WebService;
+import javax.xml.namespace.QName;
+import javax.xml.ws.Service;
+import javax.xml.ws.soap.AddressingFeature.Responses;
+
+import java.lang.annotation.Annotation;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Validate that addressing can be configured via metadata (such as via a 
deployment descriptor)
+ */
+public class ProxyAddressingMetadataTest extends InterceptableClientTestCase {
+    
+    /**
+     * Validate when no addressing-related metadata is set.
+     */
+    public void testAddressingNoMetadata() {
+        Service svc = Service.create(new QName("http://test";, 
"ProxyAddressingService"));
+        ProxyAddressingService proxy = 
svc.getPort(ProxyAddressingService.class);
+        assertNotNull(proxy);
+        
+        proxy.doSomething("12345");
+        
+        TestClientInvocationController testController = 
getInvocationController();
+        InvocationContext ic = testController.getInvocationContext();
+        MessageContext request = ic.getRequestMessageContext();
+        
+        String version = (String) 
request.getProperty(AddressingConstants.WS_ADDRESSING_VERSION);
+        Boolean disabled = (Boolean) 
request.getProperty(AddressingConstants.DISABLE_ADDRESSING_FOR_OUT_MESSAGES);
+        String responses = (String) 
request.getProperty(AddressingConstants.WSAM_INVOCATION_PATTERN_PARAMETER_NAME);
+        
+        assertNull(version);
+        assertTrue(disabled);
+        assertNull(responses);
+    }
+
+    /**
+     * Validate correct behavior when addressing-related metadata is specified 
in a sparse composite, such as
+     * would be used to represent configuration via a Deployment Descriptor.
+     */
+    public void testAddressingMetadata() {
+        Map<String, List<Annotation>> map = new HashMap();
+        ArrayList<Annotation> wsFeatures = new ArrayList<Annotation>();
+        AddressingAnnot addressingFeature = new AddressingAnnot();
+        addressingFeature.setEnabled(true);
+        addressingFeature.setRequired(true);
+        addressingFeature.setResponses(Responses.NON_ANONYMOUS);
+        wsFeatures.add(addressingFeature);
+        map.put(ProxyAddressingService.class.getName(), wsFeatures);
+        DescriptionBuilderComposite serviceDBC = new 
DescriptionBuilderComposite();
+        serviceDBC.getProperties().put(MDQConstants.SEI_FEATURES_MAP, map);
+        ServiceDelegate.setServiceMetadata(serviceDBC);
+
+        Service svc = Service.create(new QName("http://test";, 
"ProxyAddressingService"));
+        ProxyAddressingService proxy = 
svc.getPort(ProxyAddressingService.class);
+        assertNotNull(proxy);
+        
+        proxy.doSomething("12345");
+        
+        TestClientInvocationController testController = 
getInvocationController();
+        InvocationContext ic = testController.getInvocationContext();
+        MessageContext request = ic.getRequestMessageContext();
+        
+        String version = (String) 
request.getProperty(AddressingConstants.WS_ADDRESSING_VERSION);
+        assertNotNull("Version not set", version);
+        assertEquals("Wrong addressing version", Final.WSA_NAMESPACE, version);
+
+        Boolean disabled = (Boolean) 
request.getProperty(AddressingConstants.DISABLE_ADDRESSING_FOR_OUT_MESSAGES);
+        assertNotNull("Disabled not set", disabled);
+        assertFalse("Addressing disabled", disabled);
+
+        String responses = (String) 
request.getProperty(AddressingConstants.WSAM_INVOCATION_PATTERN_PARAMETER_NAME);
+        assertNotNull("Responses not set", responses);
+        assertEquals("Wrong responses value", 
AddressingConstants.WSAM_INVOCATION_PATTERN_ASYNCHRONOUS, responses);
+        
+    }
+
+    @WebService()
+    public interface ProxyAddressingService {
+    
+        public String doSomething(String id);
+        
+    }
+
+}

Added: 
axis/axis2/java/core/trunk/modules/jaxws/test/org/apache/axis2/jaxws/spi/ClientMetadataAddressingFeatureTests.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/test/org/apache/axis2/jaxws/spi/ClientMetadataAddressingFeatureTests.java?rev=940682&view=auto
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/jaxws/test/org/apache/axis2/jaxws/spi/ClientMetadataAddressingFeatureTests.java
 (added)
+++ 
axis/axis2/java/core/trunk/modules/jaxws/test/org/apache/axis2/jaxws/spi/ClientMetadataAddressingFeatureTests.java
 Tue May  4 00:25:24 2010
@@ -0,0 +1,171 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *      
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axis2.jaxws.spi;
+
+import org.apache.axis2.jaxws.binding.SOAPBinding;
+import org.apache.axis2.jaxws.description.builder.AddressingAnnot;
+import org.apache.axis2.jaxws.description.builder.DescriptionBuilderComposite;
+import org.apache.axis2.jaxws.description.builder.MDQConstants;
+
+import javax.jws.WebService;
+import javax.xml.namespace.QName;
+import javax.xml.ws.Service;
+import javax.xml.ws.soap.AddressingFeature.Responses;
+
+import java.lang.annotation.Annotation;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+/**
+ * Validate the setting up of the Addressing WebServiceFeature on the client 
side via meta-data 
+ * (such as a deployment descriptor)
+ */
+public class ClientMetadataAddressingFeatureTests extends TestCase {
+    static final String namespaceURI = 
"http://description.jaxws.axis2.apache.org";;
+    static final String svcLocalPart = "svcLocalPart";
+    static final String multiPortWsdl = "ClientMetadataMultiPort.wsdl";
+    
+    public void testAddressingEnabled() {
+        Service service = createService();
+        ClientMetadataAddressingPortSEI port = 
service.getPort(ClientMetadataAddressingPortSEI.class);
+        
+        BindingProvider bindingProvider = (BindingProvider) port;
+        SOAPBinding soapBinding = (SOAPBinding) bindingProvider.getBinding();
+        assertTrue("Addressing is not configured", 
soapBinding.isAddressingConfigured());
+        assertTrue("Addressing is not enabled", 
soapBinding.isAddressingEnabled());
+    }
+    
+    public void testAddressingDisabled() {
+        QName serviceQName = new QName(namespaceURI, svcLocalPart);
+        URL wsdlUrl = ClientMetadataTest.getWsdlURL(multiPortWsdl);
+        DescriptionBuilderComposite serviceDBC = new 
DescriptionBuilderComposite();
+        
+        Map<String, List<Annotation>> map = new HashMap();
+        ArrayList<Annotation> wsFeatures = new ArrayList<Annotation>();
+        AddressingAnnot addressingFeature = new AddressingAnnot();
+        addressingFeature.setEnabled(false);
+        wsFeatures.add(addressingFeature);
+        map.put(ClientMetadataAddressingPortSEI.class.getName(), wsFeatures);
+        serviceDBC.getProperties().put(MDQConstants.SEI_FEATURES_MAP, map);
+        ServiceDelegate.setServiceMetadata(serviceDBC);
+        Service service = Service.create(wsdlUrl, serviceQName);
+        ClientMetadataAddressingPortSEI port = 
service.getPort(ClientMetadataAddressingPortSEI.class);
+
+        BindingProvider bindingProvider = (BindingProvider) port;
+        SOAPBinding soapBinding = (SOAPBinding) bindingProvider.getBinding();
+        assertTrue("Addressing is not configured", 
soapBinding.isAddressingConfigured());
+        assertFalse("Addressing is enabled", 
soapBinding.isAddressingEnabled());
+    }
+    
+    public void testAddressingRequired() {
+        Service service = createService();
+        ClientMetadataAddressingPortSEI port = 
service.getPort(ClientMetadataAddressingPortSEI.class);
+        
+        BindingProvider bindingProvider = (BindingProvider) port;
+        SOAPBinding soapBinding = (SOAPBinding) bindingProvider.getBinding();
+        assertTrue("Addressing is not configured", 
soapBinding.isAddressingConfigured());
+        assertTrue("Addressing is not required", 
soapBinding.isAddressingRequired());
+    }
+    
+    public void testAddressingNotRequired() {
+        QName serviceQName = new QName(namespaceURI, svcLocalPart);
+        URL wsdlUrl = ClientMetadataTest.getWsdlURL(multiPortWsdl);
+        DescriptionBuilderComposite serviceDBC = new 
DescriptionBuilderComposite();
+        
+        Map<String, List<Annotation>> map = new HashMap();
+        ArrayList<Annotation> wsFeatures = new ArrayList<Annotation>();
+        AddressingAnnot addressingFeature = new AddressingAnnot();
+        addressingFeature.setEnabled(true);
+        addressingFeature.setRequired(false);
+        wsFeatures.add(addressingFeature);
+        map.put(ClientMetadataAddressingPortSEI.class.getName(), wsFeatures);
+        serviceDBC.getProperties().put(MDQConstants.SEI_FEATURES_MAP, map);
+        ServiceDelegate.setServiceMetadata(serviceDBC);
+        Service service = Service.create(wsdlUrl, serviceQName);
+        ClientMetadataAddressingPortSEI port = 
service.getPort(ClientMetadataAddressingPortSEI.class);
+
+        BindingProvider bindingProvider = (BindingProvider) port;
+        SOAPBinding soapBinding = (SOAPBinding) bindingProvider.getBinding();
+        assertTrue("Addressing is not configured", 
soapBinding.isAddressingConfigured());
+        assertFalse("Addressing is required", 
soapBinding.isAddressingRequired());
+    }
+    
+    public void testAddressingResponses() {
+        Service service = createService();
+        ClientMetadataAddressingPortSEI port = 
service.getPort(ClientMetadataAddressingPortSEI.class);
+        
+        BindingProvider bindingProvider = (BindingProvider) port;
+        SOAPBinding soapBinding = (SOAPBinding) bindingProvider.getBinding();
+        assertTrue("Addressing is not configured", 
soapBinding.isAddressingConfigured());
+        assertEquals("Addressing Responses incorrect", 
Responses.NON_ANONYMOUS, soapBinding.getAddressingResponses());
+    }
+    
+    public void testDefaultAddressingValues() {
+        QName serviceQName = new QName(namespaceURI, svcLocalPart);
+        URL wsdlUrl = ClientMetadataTest.getWsdlURL(multiPortWsdl);
+        DescriptionBuilderComposite serviceDBC = new 
DescriptionBuilderComposite();
+        
+        Service service = Service.create(wsdlUrl, serviceQName);
+        ClientMetadataAddressingPortSEI port = 
service.getPort(ClientMetadataAddressingPortSEI.class);
+
+        BindingProvider bindingProvider = (BindingProvider) port;
+        SOAPBinding soapBinding = (SOAPBinding) bindingProvider.getBinding();
+        assertFalse("Addressing is configured", 
soapBinding.isAddressingConfigured());
+        assertFalse("Addressing is enabled", 
soapBinding.isAddressingEnabled());
+        assertFalse("Addressing is required", 
soapBinding.isAddressingRequired());
+        assertEquals("Addressing responses incorrect", Responses.ALL, 
soapBinding.getAddressingResponses());
+    }
+    
+    /**
+     * Create a service as would be done via injection or lookup, including a 
sparse composite that 
+     * contains features (as might be set by a deployment descriptor).
+     * 
+     * @return a Service created as done via injection or lookup.
+     */
+    private Service createService() {
+        // Even for a port injection or lookup, the service will also be 
treated as an injection or lookup
+        // So we need to setup the sparse DBC to create the service
+        QName serviceQName = new QName(namespaceURI, svcLocalPart);
+        URL wsdlUrl = ClientMetadataTest.getWsdlURL(multiPortWsdl);
+        DescriptionBuilderComposite serviceDBC = new 
DescriptionBuilderComposite();
+        
+        Map<String, List<Annotation>> map = new HashMap();
+        ArrayList<Annotation> wsFeatures = new ArrayList<Annotation>();
+        AddressingAnnot addressingFeature = new AddressingAnnot();
+        addressingFeature.setEnabled(true);
+        addressingFeature.setRequired(true);
+        addressingFeature.setResponses(Responses.NON_ANONYMOUS);
+        wsFeatures.add(addressingFeature);
+        map.put(ClientMetadataAddressingPortSEI.class.getName(), wsFeatures);
+        serviceDBC.getProperties().put(MDQConstants.SEI_FEATURES_MAP, map);
+        ServiceDelegate.setServiceMetadata(serviceDBC);
+        Service service = Service.create(wsdlUrl, serviceQName);
+        return service;
+    }
+    
+    @WebService(name="EchoMessagePortType", 
targetNamespace="http://description.jaxws.axis2.apache.org";)
+    interface ClientMetadataAddressingPortSEI {
+        public String echoMessage(String string);
+    }
+}
\ No newline at end of file

Modified: 
axis/axis2/java/core/trunk/modules/metadata/src/org/apache/axis2/jaxws/description/ServiceDescription.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/metadata/src/org/apache/axis2/jaxws/description/ServiceDescription.java?rev=940682&r1=940681&r2=940682&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/metadata/src/org/apache/axis2/jaxws/description/ServiceDescription.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/metadata/src/org/apache/axis2/jaxws/description/ServiceDescription.java
 Tue May  4 00:25:24 2010
@@ -26,6 +26,8 @@ import org.apache.axis2.jaxws.descriptio
 
 import javax.xml.namespace.QName;
 import javax.xml.ws.handler.PortInfo;
+import javax.xml.ws.soap.AddressingFeature.Responses;
+
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -237,4 +239,50 @@ public interface ServiceDescription {
      */
     public abstract boolean isRespectBindingEnabled(Object serviceDelegateKey, 
Class seiClass);
 
+    /**
+     * Answer whether Addressing was explicitly configured via metadata (such 
as a deployment descriptor) on the
+     * service-requester.  Note that the related methods will return default 
values if Addressing was not explicitly
+     * configured; otherwise they will return values set based on the metadata 
configuration.
+     * @see #isAddressingEnabled(Object, Class)
+     * @see #isAddressingRequired(Object, Class)
+     * @see #getAddressingResponses(Object, Class)
+     * @param serviceDelegateKey The instance of the service delegate related 
to this service
+     * @param seiClass The SEI for the port to retrieve the setting for.
+     * @return true if Addressing was explicitly set via metadata, false 
otherwise.
+     */
+    public abstract boolean isAddressingConfigured(Object serviceDelegateKey, 
Class seiClass);
+
+    /**
+     * Answer whether Addressing is enabled on the service-requester.
+     * Note that if addressing was not configured via metadata, then this 
method will return a default value,
+     * otherwise it will return the value configured via metadata.
+     * @see #isAddressingConfigured(Object, Class)
+     * @param serviceDelegateKey The instance of the service delegate related 
to this service
+     * @param seiClass The SEI for the port to retrieve the setting for.
+     * @return true if Addressing is enabled on the service-requester, false 
(default) otherwise 
+     */
+    public abstract boolean isAddressingEnabled(Object serviceDelegateKey, 
Class seiClass);
+
+    /**
+     * Answer whether Addressing is required on the service-requester.
+     * Note that if addressing was not configured via metadata, then this 
method will return a default value,
+     * otherwise it will return the value configured via metadata.
+     * @see #isAddressingConfigured(Object, Class)
+     * @param serviceDelegateKey The instance of the service delegate related 
to this service
+     * @param seiClass The SEI for the port to retrieve the setting for.
+     * @return true if Addressing is required on the service-requester, false 
(default) otherwise 
+     */
+    public abstract boolean isAddressingRequired(Object serviceDelegateKey, 
Class seiClass);
+
+    /**
+     * Answer the type of Addressing responses required by the 
service-requester.
+     * Note that if addressing was not configured via metadata, then this 
method will return a default value,
+     * otherwise it will return the value configured via metadata.
+     * @see #isAddressingConfigured(Object, Class)
+     * @param serviceDelegateKey The instance of the service delegate related 
to this service
+     * @param seiClass The SEI for the port to retrieve the setting for.
+     * @return AddressingFeature.Responses vale corresponding to the type of 
responses required by service-requester. 
+     */
+    public abstract Responses getAddressingResponses(Object 
serviceDelegateKey, Class seiClass);
+
 }

Modified: 
axis/axis2/java/core/trunk/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java?rev=940682&r1=940681&r2=940682&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java
 Tue May  4 00:25:24 2010
@@ -21,7 +21,6 @@ package org.apache.axis2.jaxws.descripti
 
 import org.apache.axis2.client.ServiceClient;
 import org.apache.axis2.context.ConfigurationContext;
-import org.apache.axis2.description.AxisService;
 import org.apache.axis2.description.Parameter;
 import org.apache.axis2.java.security.AccessController;
 import org.apache.axis2.jaxws.ClientConfigurationFactory;
@@ -36,6 +35,7 @@ import org.apache.axis2.jaxws.descriptio
 import org.apache.axis2.jaxws.description.ServiceDescriptionJava;
 import org.apache.axis2.jaxws.description.ServiceDescriptionWSDL;
 import org.apache.axis2.jaxws.description.ServiceRuntimeDescription;
+import org.apache.axis2.jaxws.description.builder.AddressingAnnot;
 import org.apache.axis2.jaxws.description.builder.DescriptionBuilderComposite;
 import org.apache.axis2.jaxws.description.builder.MDQConstants;
 import org.apache.axis2.jaxws.description.builder.MTOMAnnot;
@@ -69,6 +69,8 @@ import javax.xml.ws.WebServiceClient;
 import javax.xml.ws.WebServiceException;
 import javax.xml.ws.handler.PortInfo;
 import javax.xml.ws.soap.SOAPBinding;
+import javax.xml.ws.soap.AddressingFeature.Responses;
+
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
@@ -2962,4 +2964,79 @@ public class ServiceDescriptionImpl
         }
         return enabled;
     }
+    
+    public boolean isAddressingConfigured(Object serviceDelegateKey, Class 
seiClass) {
+        boolean configured = false;
+        List<Annotation> seiFeatureList = 
getSEIFeatureList(serviceDelegateKey, seiClass);
+        if (log.isDebugEnabled()) {
+            log.debug("Feature list for delegate: " + serviceDelegateKey + ", 
and SEI: " + seiClass
+                    + ", is: " + seiFeatureList);
+        }
+        if (seiFeatureList != null) {
+            for (int i = 0; i < seiFeatureList.size(); i++) {
+                Annotation checkAnnotation = seiFeatureList.get(i);
+                if (checkAnnotation instanceof AddressingAnnot) {
+                    AddressingAnnot addressingAnnot = (AddressingAnnot) 
checkAnnotation;
+                    configured = true;
+                }
+            }
+        }
+        return configured;
+    }
+    
+    public boolean isAddressingEnabled(Object serviceDelegateKey, Class 
seiClass) {
+        boolean enabled = false;
+        List<Annotation> seiFeatureList = 
getSEIFeatureList(serviceDelegateKey, seiClass);
+        if (log.isDebugEnabled()) {
+            log.debug("Feature list for delegate: " + serviceDelegateKey + ", 
and SEI: " + seiClass
+                    + ", is: " + seiFeatureList);
+        }
+        if (seiFeatureList != null) {
+            for (int i = 0; i < seiFeatureList.size(); i++) {
+                Annotation checkAnnotation = seiFeatureList.get(i);
+                if (checkAnnotation instanceof AddressingAnnot) {
+                    AddressingAnnot addressingAnnot = (AddressingAnnot) 
checkAnnotation;
+                    enabled = addressingAnnot.enabled();
+                }
+            }
+        }
+        return enabled;
+    }
+    public boolean isAddressingRequired(Object serviceDelegateKey, Class 
seiClass) {
+        boolean enabled = false;
+        List<Annotation> seiFeatureList = 
getSEIFeatureList(serviceDelegateKey, seiClass);
+        if (log.isDebugEnabled()) {
+            log.debug("Feature list for delegate: " + serviceDelegateKey + ", 
and SEI: " + seiClass
+                    + ", is: " + seiFeatureList);
+        }
+        if (seiFeatureList != null) {
+            for (int i = 0; i < seiFeatureList.size(); i++) {
+                Annotation checkAnnotation = seiFeatureList.get(i);
+                if (checkAnnotation instanceof AddressingAnnot) {
+                    AddressingAnnot addressingAnnot = (AddressingAnnot) 
checkAnnotation;
+                    enabled = addressingAnnot.required();
+                }
+            }
+        }
+        return enabled;
+    }
+    public Responses getAddressingResponses(Object serviceDelegateKey, Class 
seiClass) {
+        Responses responses = null;
+        List<Annotation> seiFeatureList = 
getSEIFeatureList(serviceDelegateKey, seiClass);
+        if (log.isDebugEnabled()) {
+            log.debug("Feature list for delegate: " + serviceDelegateKey + ", 
and SEI: " + seiClass
+                    + ", is: " + seiFeatureList);
+        }
+        if (seiFeatureList != null) {
+            for (int i = 0; i < seiFeatureList.size(); i++) {
+                Annotation checkAnnotation = seiFeatureList.get(i);
+                if (checkAnnotation instanceof AddressingAnnot) {
+                    AddressingAnnot addressingAnnot = (AddressingAnnot) 
checkAnnotation;
+                    responses = addressingAnnot.responses();
+                }
+            }
+        }
+        return responses;
+    }
+
 }


Reply via email to