You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by xu...@apache.org on 2011/05/10 06:33:47 UTC

svn commit: r1101307 - in /geronimo/bundles/trunk/axis2: pom.xml src/main/java/org/apache/axis2/jaxws/BindingProvider.java src/main/java/org/apache/axis2/jaxws/context/ src/main/java/org/apache/axis2/jaxws/context/WebServiceContextImpl.java

Author: xuhaihong
Date: Tue May 10 04:33:46 2011
New Revision: 1101307

URL: http://svn.apache.org/viewvc?rev=1101307&view=rev
Log:
Try AXIS2-5021 from Geronimo side

Added:
    geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/BindingProvider.java   (with props)
    geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/context/
    geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/context/WebServiceContextImpl.java   (with props)
Modified:
    geronimo/bundles/trunk/axis2/pom.xml

Modified: geronimo/bundles/trunk/axis2/pom.xml
URL: http://svn.apache.org/viewvc/geronimo/bundles/trunk/axis2/pom.xml?rev=1101307&r1=1101306&r2=1101307&view=diff
==============================================================================
--- geronimo/bundles/trunk/axis2/pom.xml (original)
+++ geronimo/bundles/trunk/axis2/pom.xml Tue May 10 04:33:46 2011
@@ -209,10 +209,67 @@
                 </exclusion>
             </exclusions>
         </dependency>
+        <dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-jaxws_2.2_spec</artifactId>
+            <version>1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-jaxb_2.2_spec</artifactId>
+            <version>1.0.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-saaj_1.3_spec</artifactId>
+            <version>1.1</version>
+        </dependency>
     </dependencies>
     <build>
         <plugins>
             <plugin>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>copy</goal>
+                        </goals>
+                        <configuration>
+                            <artifactItems>
+                                <artifactItem>
+                                    <groupId>org.apache.geronimo.specs</groupId>
+                                    <artifactId>geronimo-jaxb_2.2_spec</artifactId>
+                                </artifactItem>
+                                <artifactItem>
+                                    <groupId>org.apache.geronimo.specs</groupId>
+                                    <artifactId>geronimo-saaj_1.3_spec</artifactId>
+                                </artifactItem>
+                                <artifactItem>
+                                    <groupId>org.apache.geronimo.specs</groupId>
+                                    <artifactId>geronimo-jaxws_2.2_spec</artifactId>
+                                 </artifactItem>
+                            </artifactItems>
+                            <overWrite>true</overWrite>
+                            <outputDirectory>${project.build.directory}/endorsed</outputDirectory>
+                            <stripVersion>true</stripVersion>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <inherited>true</inherited>
+                <configuration>
+                    <compilerArgument>
+                        -Xbootclasspath/p:${project.build.directory}/endorsed/geronimo-jaxws_2.2_spec.jar${path.separator}${project.build.directory}/endorsed/geronimo-saaj_1.3_spec.jar${path.separator}${project.build.directory}/endorsed/geronimo-jaxb_2.2_spec.jar
+                    </compilerArgument>
+                    <compilerVersion>1.5</compilerVersion>
+                    <source>1.5</source>
+                    <target>1.5</target>                    
+                </configuration>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
@@ -257,7 +314,10 @@
                            org/apache/axis2/jaxws/description/impl/EndpointDescriptionImpl$4.class=target/classes/org/apache/axis2/jaxws/description/impl/EndpointDescriptionImpl$4.class,
                            org/apache/axis2/jaxws/description/impl/EndpointDescriptionImpl$5.class=target/classes/org/apache/axis2/jaxws/description/impl/EndpointDescriptionImpl$5.class,
                            org/apache/axis2/jaxws/description/impl/EndpointDescriptionImpl$6.class=target/classes/org/apache/axis2/jaxws/description/impl/EndpointDescriptionImpl$6.class,
-                           org/apache/axis2/transport/http/AbstractHTTPSender.class=target/classes/org/apache/axis2/transport/http/AbstractHTTPSender.class
+                           org/apache/axis2/transport/http/AbstractHTTPSender.class=target/classes/org/apache/axis2/transport/http/AbstractHTTPSender.class,
+                           org/apache/axis2/jaxws/context/WebServiceContextImpl.class=target/classes/org/apache/axis2/jaxws/context/WebServiceContextImpl.class,
+                           org/apache/axis2/jaxws/BindingProvider.class=target/classes/org/apache/axis2/jaxws/BindingProvider.class,
+                           org/apache/axis2/jaxws/BindingProvider$ValidatingClientContext.class=target/classes/org/apache/axis2/jaxws/BindingProvider$ValidatingClientContext.class
                         </Include-Resource>
                         <SPI-Provider>true</SPI-Provider>
                     </instructions>

Added: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/BindingProvider.java
URL: http://svn.apache.org/viewvc/geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/BindingProvider.java?rev=1101307&view=auto
==============================================================================
--- geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/BindingProvider.java (added)
+++ geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/BindingProvider.java Tue May 10 04:33:46 2011
@@ -0,0 +1,480 @@
+/*
+ * 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;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.axis2.addressing.AddressingConstants;
+import org.apache.axis2.addressing.AddressingHelper;
+import org.apache.axis2.description.AxisEndpoint;
+import org.apache.axis2.description.AxisService;
+import org.apache.axis2.jaxws.addressing.util.EndpointReferenceUtils;
+import org.apache.axis2.jaxws.binding.BindingUtils;
+import org.apache.axis2.jaxws.binding.SOAPBinding;
+import org.apache.axis2.jaxws.client.PropertyValidator;
+import org.apache.axis2.jaxws.core.InvocationContext;
+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.handler.HandlerResolverImpl;
+import org.apache.axis2.jaxws.i18n.Messages;
+import org.apache.axis2.jaxws.spi.ServiceDelegate;
+import org.apache.axis2.transport.http.HTTPConstants;
+import org.apache.axis2.util.LoggingControl;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.Binding;
+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.ArrayList;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+
+public class BindingProvider implements org.apache.axis2.jaxws.spi.BindingProvider {
+    private static final Log log = LogFactory.getLog(BindingProvider.class);
+
+    protected Map<String, Object> requestContext;
+
+    protected Map<String, Object> responseContext;
+
+    protected EndpointDescription endpointDesc;
+
+    // NOTE this reference to the ServiceDelegate MUST be a strong reference to keep the delegate
+    // from being GC'd when the Service instance in the client goes out of scope but ports under
+    // that service are still in use.
+    protected ServiceDelegate serviceDelegate;
+
+    private org.apache.axis2.jaxws.spi.Binding binding;
+
+    public static final String BINDING_PROVIDER = "org.apache.axis2.jaxws.BindingProvider";
+    
+    public BindingProvider(ServiceDelegate svcDelegate,
+                           EndpointDescription epDesc,
+                           org.apache.axis2.addressing.EndpointReference epr,
+                           String addressingNamespace,
+                           WebServiceFeature... features) {
+        this.endpointDesc = epDesc;
+        this.serviceDelegate = svcDelegate;
+        
+        initialize(epr, addressingNamespace, features);
+    }
+
+    /*
+     * Initialize any objects needed by the BindingProvider
+     */
+    private void initialize(org.apache.axis2.addressing.EndpointReference epr,
+                            String addressingNamespace,
+                            WebServiceFeature... features) {
+        requestContext = new ValidatingClientContext();
+        responseContext = new ValidatingClientContext();
+        
+        // Setting standard property defaults for the request context
+        requestContext.put(BindingProvider.SESSION_MAINTAIN_PROPERTY, Boolean.FALSE);
+        requestContext.put(BindingProvider.SOAPACTION_USE_PROPERTY, Boolean.TRUE);
+        
+        // Addressing is disabled by default unless it is turned on in the WSDL
+        String addressingFlagFromWSDL = AddressingHelper.getAddressingRequirementParemeterValue(endpointDesc.getAxisService());
+        if(AddressingConstants.ADDRESSING_UNSPECIFIED.equals(addressingFlagFromWSDL)){
+            requestContext.put(AddressingConstants.DISABLE_ADDRESSING_FOR_OUT_MESSAGES, Boolean.TRUE);
+        }
+        
+        // Set the endpoint address
+        String endpointAddress = (epr != null ) ? epr.getAddress() : endpointDesc.getEndpointAddress();        
+        if (endpointAddress != null && !"".equals(endpointAddress)) {
+            requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointAddress);                
+        }
+        
+        // JAXWS 9.2.1.1 requires that we go ahead and create the binding object
+        // so we can also set the handlerchain
+        binding = (org.apache.axis2.jaxws.spi.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 = null;
+        if(serviceDelegate.getHandlerResolver() != null){
+            if(log.isDebugEnabled()){
+                log.debug("Reading default Handler Resolver ");
+            }
+            handlerResolver = serviceDelegate.getHandlerResolver();
+        }
+        else{
+            handlerResolver = new HandlerResolverImpl(endpointDesc.getServiceDescription(), serviceDelegate);
+            if(log.isDebugEnabled()){
+                log.debug("Creating new Handler Resolver using HandlerResolverImpl");
+            }
+        }
+
+        // See if the metadata from creating the service indicates that MTOM, Addressing and/or RespectBinding should be enabled
+        if (binding instanceof SOAPBinding) {
+            configureBindingFromMetadata();
+        }
+                
+        // check for properties that need to be set on the BindingProvider
+        String seiName = null;
+        if(endpointDesc.getEndpointInterfaceDescription() != null 
+                &&
+                endpointDesc.getEndpointInterfaceDescription().getSEIClass() != null) {
+            seiName = endpointDesc.getEndpointInterfaceDescription().getSEIClass().getName();
+        }
+        String portQNameString = endpointDesc.getPortQName().toString();
+        String key = seiName + ":" + portQNameString;
+        Map<String, Object> bProps = endpointDesc.getServiceDescription().getBindingProperties(serviceDelegate, key);
+        if(bProps != null) {
+            if(log.isDebugEnabled()) {
+                log.debug("Setting binding props with size: " + bProps.size() + " on " +
+                "BindingProvider RequestContext");
+            }
+            requestContext.putAll(bProps);
+        }
+        
+        binding.setHandlerChain(handlerResolver.getHandlerChain(endpointDesc.getPortInfo()));
+        
+        //Set JAX-WS 2.1 related properties.
+        try {
+            binding.setAxis2EndpointReference(epr);
+            binding.setAddressingNamespace(addressingNamespace);
+            binding.setFeatures(features);
+        }
+        catch (Exception e) {
+            throw ExceptionFactory.makeWebServiceException(e);
+        }
+    }
+
+    /**
+     * 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 WebService Feature configuration
+        if(endpointDesc.getEndpointInterfaceDescription() != null
+                &&
+                endpointDesc.getEndpointInterfaceDescription().getSEIClass() != null) {
+            enableMTOMFromMetadata = endpointDesc.getServiceDescription().isMTOMEnabled(serviceDelegate, 
+                                                               endpointDesc.getEndpointInterfaceDescription().getSEIClass());
+            mtomThreshold = getMTOMThreshold(endpointDesc.getServiceDescription(), serviceDelegate,
+                    endpointDesc.getEndpointInterfaceDescription().getSEIClass());
+
+            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);
+            // 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();
+            enableMTOMFromMetadata = (bindingType.equals(SOAPBinding.SOAP11HTTP_MTOM_BINDING) || 
+                                      bindingType.equals(SOAPBinding.SOAP12HTTP_MTOM_BINDING));
+        }
+        
+        if (enableMTOMFromMetadata) {
+            ((SOAPBinding) binding).setMTOMEnabled(true);
+            ((SOAPBinding) binding).setMTOMThreshold(mtomThreshold);
+        }
+        
+        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, 
+            Class seiClass) {
+        boolean isEnabled = serviceDescription.isRespectBindingEnabled(serviceDelegateKey, seiClass);
+        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);
+        
+        return threshold;
+    }
+
+    public ServiceDelegate getServiceDelegate() {
+        return serviceDelegate;
+    }
+
+    public EndpointDescription getEndpointDescription() {
+        return endpointDesc;
+    }
+
+    public Binding getBinding() {
+        return binding;
+    }
+
+    public Map<String, Object> getRequestContext() {
+        return requestContext;
+    }
+
+    public Map<String, Object> getResponseContext() {
+        return responseContext;
+    }
+
+    /**
+     * Check for maintain session state enablement either in the
+     * MessageContext.isMaintainSession() or in the ServiceContext properties.
+     * 
+     * @param mc
+     * @param ic
+     */
+    protected void checkMaintainSessionState(MessageContext mc, InvocationContext ic) {
+        Map<String, Object> properties = ic.getServiceClient().getServiceContext().getProperties();
+        boolean bValue = false;
+
+        if (properties != null
+            && properties
+                         .containsKey(javax.xml.ws.BindingProvider.SESSION_MAINTAIN_PROPERTY)) {
+            bValue = (Boolean) properties
+                .get(javax.xml.ws.BindingProvider.SESSION_MAINTAIN_PROPERTY);
+        }
+        if (mc.isMaintainSession() || bValue == true) {
+            setupSessionContext(properties);
+        }
+    }
+
+    /*
+    * Ensure that the next request context contains the session value returned
+    * from previous request
+    */
+    protected void setupSessionContext(Map<String, Object> properties) {
+        String sessionKey = null;
+        Object sessionValue = null;
+
+        if (properties == null) {
+            throw ExceptionFactory.makeWebServiceException(Messages.getMessage("NoMaintainSessionProperty"));
+        } else if (properties.containsKey(HTTPConstants.HEADER_LOCATION)) {
+            sessionKey = HTTPConstants.HEADER_LOCATION;
+            sessionValue = properties.get(sessionKey);
+            if (sessionValue != null && !"".equals(sessionValue)) {
+                requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, sessionValue);
+            }
+        } else if (properties.containsKey(HTTPConstants.HEADER_COOKIE)) {
+            sessionKey = HTTPConstants.HEADER_COOKIE;
+            sessionValue = properties.get(sessionKey);
+            if (sessionValue != null && !"".equals(sessionValue)) {
+                requestContext.put(HTTPConstants.COOKIE_STRING, sessionValue);
+            }
+        } else if (properties.containsKey(HTTPConstants.HEADER_COOKIE2)) {
+            sessionKey = HTTPConstants.HEADER_COOKIE2;
+            sessionValue = properties.get(sessionKey);
+            if (sessionValue != null && !"".equals(sessionValue)) {
+                requestContext.put(HTTPConstants.COOKIE_STRING, sessionValue);
+            }
+        } else {
+            throw ExceptionFactory
+                    .makeWebServiceException(Messages.getMessage("NoMaintainSessionProperty"));
+        }
+
+        if (sessionValue == null) {
+            throw ExceptionFactory.makeWebServiceException(
+                    Messages.getMessage("NullValueForMaintainSessionProperty", sessionKey));
+        }
+    }
+
+    /**
+     * Returns a boolean value representing whether or not a SOAPAction header should be sent with
+     * the request.
+     */
+    protected boolean useSoapAction() {
+        //TODO: Add some bit of validation for this property so that we know
+        // it is actually a Boolean and not a String.
+        Boolean use = (Boolean)requestContext.get(BindingProvider.SOAPACTION_USE_PROPERTY);
+        if (use != null) {
+            if (use.booleanValue()) {
+                return true;
+            } else {
+                return false;
+            }
+        } else {
+            // If the value is not set, then just default to sending a SOAPAction
+            return true;
+        }
+    }
+
+    /*
+     *  (non-Javadoc)
+     * @see javax.xml.ws.BindingProvider#getEndpointReference()
+     */
+    public EndpointReference getEndpointReference() {
+        return getEndpointReference(W3CEndpointReference.class);
+    }
+
+    /*
+     *  (non-Javadoc)
+     * @see javax.xml.ws.BindingProvider#getEndpointReference(java.lang.Class)
+     */
+    public <T extends EndpointReference> T getEndpointReference(Class<T> clazz) {
+        EndpointReference jaxwsEPR = null;
+        String addressingNamespace = EndpointReferenceUtils.getAddressingNamespace(clazz);
+        
+        try {
+            org.apache.axis2.addressing.EndpointReference epr = binding.getAxis2EndpointReference();
+            
+            if (epr == null) {
+                String address =
+                    (String) requestContext.get(BindingProvider.ENDPOINT_ADDRESS_PROPERTY);
+                if (address == null)
+                    address = endpointDesc.getEndpointAddress();
+                QName service = endpointDesc.getServiceQName();
+                QName port = endpointDesc.getPortQName();
+                String wsdlLocation = "?wsdl";  // let the webcontainer redirect us to the real WSDL URL; it knows where it is
+
+                epr = EndpointReferenceUtils.createAxis2EndpointReference(address, service, port, wsdlLocation, addressingNamespace);
+                
+                // Add reference parameters from WSDL to the EPR
+                AxisService axisService = endpointDesc.getAxisService();
+                if (axisService != null) {
+                    AxisEndpoint axisEndpoint = axisService.getEndpoint(axisService.getEndpointName());
+                    
+                    if(axisEndpoint != null){
+                        ArrayList referenceParameters = (ArrayList) axisEndpoint.getParameterValue(AddressingConstants.REFERENCE_PARAMETER_PARAMETER);
+                        if (LoggingControl.debugLoggingAllowed && log.isTraceEnabled()) {
+                            log.trace("getEndpointReference: Adding reference parameters to EPR from WSDL: axisService = " + axisService + ", axisEndpoint = " + axisEndpoint.getName() + ", referenceParameters = " + referenceParameters);
+                        }
+                        if(referenceParameters!=null){
+                            Iterator iterator = referenceParameters.iterator();
+                            HashMap<QName, OMElement> refParamMap = new HashMap<QName, OMElement>();
+                            while (iterator.hasNext()) {
+                                OMElement omElement = (OMElement)iterator.next();
+                                refParamMap.put(omElement.getQName(), omElement);
+                            }
+                            epr.setReferenceParameters(refParamMap);
+                        }
+                    }
+                }
+            }
+            else if (!addressingNamespace.equals(binding.getAddressingNamespace())) {
+                throw ExceptionFactory.
+                   makeWebServiceException(Messages.getMessage("bindingProviderErr1",
+                                                               binding.getAddressingNamespace(),
+                                                               addressingNamespace));
+            }
+
+            jaxwsEPR = EndpointReferenceUtils.convertFromAxis2(epr, addressingNamespace);
+        } catch (UnsupportedOperationException e) {
+            throw e;
+        } catch (WebServiceException e) {
+            throw e;
+        } catch (Exception e) {
+            throw ExceptionFactory.
+                makeWebServiceException(Messages.getMessage("endpointRefConstructionFailure3", 
+                                                            e.toString()));
+        }
+        
+        return clazz.cast(jaxwsEPR);
+    }
+    
+    /*
+    * An inner class used to validate properties as they are set by the client.
+    */
+    class ValidatingClientContext extends Hashtable<String, Object> {
+        private static final long serialVersionUID = 3485112205801917858L;
+
+        @Override
+        public synchronized Object put(String key, Object value) {
+            // super.put rightly throws a NullPointerException if key or value is null, so don't continue if that's the case
+            if (value == null)
+                return null;
+            if (PropertyValidator.validate(key, value)) {
+                return super.put(key, value);
+            } else {
+                throw ExceptionFactory.makeWebServiceException(
+                        Messages.getMessage("invalidPropValue", key, value.getClass().getName(),
+                                            PropertyValidator.getExpectedValue(key).getName()));
+            }
+        }
+    }
+
+
+}

Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/BindingProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/BindingProvider.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/BindingProvider.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/context/WebServiceContextImpl.java
URL: http://svn.apache.org/viewvc/geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/context/WebServiceContextImpl.java?rev=1101307&view=auto
==============================================================================
--- geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/context/WebServiceContextImpl.java (added)
+++ geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/context/WebServiceContextImpl.java Tue May 10 04:33:46 2011
@@ -0,0 +1,181 @@
+/*
+ * 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.context;
+
+import org.apache.axis2.jaxws.ExceptionFactory;
+import org.apache.axis2.jaxws.addressing.util.EndpointReferenceUtils;
+import org.apache.axis2.jaxws.i18n.Messages;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.w3c.dom.Element;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.xml.namespace.QName;
+import javax.xml.ws.EndpointReference;
+import javax.xml.ws.WebServiceContext;
+import javax.xml.ws.handler.MessageContext;
+import javax.xml.ws.wsaddressing.W3CEndpointReference;
+
+import java.net.URI;
+import java.security.Principal;
+
+public class WebServiceContextImpl implements WebServiceContext {
+
+    private static final Log log = LogFactory.getLog(WebServiceContext.class);
+    
+    private MessageContext soapMessageContext;
+
+    public WebServiceContextImpl() {
+        super();
+    }
+
+    /* (non-Javadoc)
+     * @see javax.xml.ws.WebServiceContext#getMessageContext()
+     */
+    public MessageContext getMessageContext() {
+        
+        // Note that the MessageContext might not be set up yet, or it
+        // may have been released because the lifetime of the WebServiceContext is completed.
+        if (log.isDebugEnabled()) {
+            if (soapMessageContext == null) {
+                log.debug("The MessageContext is not available");
+            }
+        }
+        return soapMessageContext;
+    }
+
+    /* (non-Javadoc)
+     * @see javax.xml.ws.WebServiceContext#getUserPrincipal()
+     */
+    public Principal getUserPrincipal() {
+        
+        // Note that the MessageContext might not be set up yet, or it
+        // may have been released because the lifetime of the WebServiceContext is completed.
+        if (log.isDebugEnabled()) {
+            if (soapMessageContext == null) {
+                log.debug("The MessageContext is not available");
+            }
+        }
+        
+        if (soapMessageContext != null) {
+            HttpServletRequest request = (HttpServletRequest) soapMessageContext.get(MessageContext.SERVLET_REQUEST);
+            if (request != null) {
+                if (log.isDebugEnabled()) {
+                    log.debug("Access to the user Principal was requested.");
+                }
+                return request.getUserPrincipal();    
+            }
+            else {
+                if (log.isDebugEnabled()) {
+                    log.debug("No HttpServletRequest object was found, so no Principal can be found.");
+                }
+            }
+        }
+        
+        return null;
+    }
+
+    /* (non-Javadoc)
+     * @see javax.xml.ws.WebServiceContext#isUserInRole(java.lang.String)
+     */
+    public boolean isUserInRole(String user) {
+        
+        // Note that the MessageContext might not be set up yet, or it
+        // may have been released because the lifetime of the WebServiceContext is completed.
+        if (log.isDebugEnabled()) {
+            if (soapMessageContext == null) {
+                log.debug("The MessageContext is not available");
+            }
+        }
+        
+        if (soapMessageContext != null) {
+            HttpServletRequest request = (HttpServletRequest) soapMessageContext.get(MessageContext.SERVLET_REQUEST);
+            if (request != null) {
+                if (log.isDebugEnabled()) {
+                    log.debug("Checking to see if the user in the role.");
+                }
+                return request.isUserInRole(user);    
+            }
+            else {
+                if (log.isDebugEnabled()) {
+                    log.debug("No HttpServletRequest object was found, so no role check can be performed.");
+                }
+            }
+        }
+        
+        return false;
+    }
+
+    public void setSoapMessageContext(MessageContext soapMessageContext) {
+        this.soapMessageContext = soapMessageContext;
+    }
+
+    public <T extends EndpointReference> T getEndpointReference(Class<T> clazz, Element... referenceParameters) {
+        
+        // Note that the MessageContext might not be set up yet, or it
+        // may have been released because the lifetime of the WebServiceContext is completed.
+        if (log.isDebugEnabled()) {
+            if (soapMessageContext == null) {
+                log.debug("The MessageContext is not available");
+            }
+        }
+        
+        EndpointReference jaxwsEPR = null;
+        String addressingNamespace = EndpointReferenceUtils.getAddressingNamespace(clazz);
+        
+        if (soapMessageContext != null) {
+            QName service = (QName) soapMessageContext.get(MessageContext.WSDL_SERVICE);
+            QName endpoint = (QName) soapMessageContext.get(MessageContext.WSDL_PORT);
+            String wsdlLocation = "?wsdl";  // let the webcontainer redirect us to the real WSDL URL; it knows where it is
+            
+            org.apache.axis2.addressing.EndpointReference axis2EPR =
+                EndpointReferenceUtils.createAxis2EndpointReference(null, service, endpoint, wsdlLocation, addressingNamespace);
+            
+            try {
+                EndpointReferenceUtils.addReferenceParameters(axis2EPR, referenceParameters);
+                jaxwsEPR = EndpointReferenceUtils.convertFromAxis2(axis2EPR, addressingNamespace);
+            }
+            catch (Exception e) {
+                throw ExceptionFactory.makeWebServiceException(
+                       Messages.getMessage("endpointRefConstructionFailure3", e.toString()));
+            }
+        }
+        else {
+            throw new IllegalStateException(
+                      Messages.getMessage("webServiceContextErr1"));
+        }
+        
+        return clazz.cast(jaxwsEPR);
+    }
+
+    public EndpointReference getEndpointReference(Element... referenceParameters) {
+        return getEndpointReference(W3CEndpointReference.class, referenceParameters);
+    }
+    
+    /**
+     * Release objects held by WebServiceContext so that they can be garbage collected.
+     */
+    public void releaseResources() {
+        if (log.isDebugEnabled()) {
+            log.debug("Releasing WebServiceContextImpl resources");
+        }
+        soapMessageContext = null; // unlink the soapMessageContxt so that it can be gc'd
+    }
+}

Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/context/WebServiceContextImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/context/WebServiceContextImpl.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/context/WebServiceContextImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain