options.setTo(new EndpointReference(endpointInterface)) is overridden by 
AxisService.createClientSideAxisService and the address location in the WSDL 
port
----------------------------------------------------------------------------------------------------------------------------------------------------------

                 Key: AXIS2-3838
                 URL: https://issues.apache.org/jira/browse/AXIS2-3838
             Project: Axis 2.0 (Axis2)
          Issue Type: Bug
          Components: client-api
    Affects Versions: 1.3
         Environment: Windows XP, Eclipse 3.3, WebLogic 9.2 (Web Application), 
JDK 1.5, AquaLogic Service Bus (ESB), WebLogic 10 (Service Container)
            Reporter: Jay Blanton


Assuming this is how the Options works, we create the Options object and set 
some of its attributes such as timeout, how to handle soap faults, as well as 
the EndpointReference.  Currently we cannot use the address that is located in 
the port section of the WSDL because our ESB overrides this location with a 
server specific name and we need our EndpointReference to be an internal domain 
that will route through our security firewalls, etc.  So because of this, we 
cannot just pull down the WSDL and post to that serviceName/portName's address 
location.  Because of this, we set the EndpointReference to the specific URL 
that we know should be used for submitting the service.

In order to help some performance, it was recommended in the Forums that one of 
the things that could be cached was the AxisService object.  So after we create 
the Options object, we check in a static map (with the WSDL URL as the key) to 
see if we already have an AxisService object created, if not, then we use the 
AxisService.createClientSideAxisService to create an AxisService by passing in 
the wsdlUrl/serviceName/portName/options.  After we get the AxisService object 
back, we store it in a static map for later retrieval from subsequent requests. 
 We then create a ServiceClient object with a null ConfigurationContext and the 
AxisService object we just cached.  After we do this we set the Options (even 
thought we used it in the constructor in the 
createClientSideAxisService...mainly because we create the ServiceClient a 
different way for testing).  Once this is complete, we return the ServiceClient 
and then we submit that request with the ServiceClient method that maps to th
 e MEP.

The problem that occurs is that the first service POST is posted to the WSDL 
Address Location and the second (and subsequent requests) are POST'd to the URL 
that we specify in the EndpointReference.  So what you will see in the code is 
the following:

First Request
1) Create an Options Object
2) Has the AxisService Object already been created for this WSDL 
3) The answer is no
4) Create the AxisService Object with the createClientSideAxisService method 
passing in the wsdlUrl, serviceName, portName, and the Options Object
5) Internally in the Axis2 API, a get request is sent to retrieve the wsdlUrl 
and the port address in the WSDL is set to override the value in the Options 
Object and so now the Options Object has been modified with the 
EndpointReference set to the one in the WSDL.
6) We create a ServiceClient object
7) We set the Options to the ServiceClient (and the Options object has been 
modified by the createClientSideAxisService method)
8) We return the ServiceClient, the POST is then made to the EndpointReference 
that has the WSDL port's address

Second Request
1) Create an Options Object
2) Has the AxisService Object already been created for this WSDL
3) The answer is yes
4) Retrieve the AxisService Object thats was cached with the incorrect 
EndpointReference (pointing to the WSDL's port address)
5) We create a ServiceClient object
6) We set the Options to the ServiceClient (and the Options object is newly 
created with the correct EndpointReference)
7) We return the ServiceClient, the POST is then made to the correct 
EndpointReference

So the question or bug is related to the fact that if you set the 
EndpointReference in the Options object, this should override any address found 
in the WSDL port location.  I would assume this because if I exclude the 
EndpointReference from the Options object, it correctly posts to the WSDL port 
location everytime.

    /**
     * Gets the service client.
     *
     * @return the service client
     */
    private ServiceClient getServiceClient() {
        ServiceClient mSender = null;

        try {
            WebMethod webMethod =
                
(WebMethod)AnnotationsHelper.getMethodAnnotation(getRequestWrapper().getMethodName(),
                    getRequestWrapper().getDaoClass(), WebMethod.class);
            WebService webService =
                
(WebService)getRequestWrapper().getDaoClass().getAnnotation(WebService.class);
            String endpointInterface =
                
WebServicePropertiesHelper.getProperty(webService.propertiesFile(),
                    webService.endpointInterface());
            String timeout =
                
WebServicePropertiesHelper.getProperty(webService.propertiesFile(),
                    webService.timeout());
            String envelopeNamespace =
                
WebServicePropertiesHelper.getProperty(webService.propertiesFile(),
                    webService.envelopeNamespace());
            String portName =
                
WebServicePropertiesHelper.getProperty(webService.propertiesFile(),
                    webService.portName());
            String serviceName =
                
WebServicePropertiesHelper.getProperty(webService.propertiesFile(),
                    webService.serviceName());

            //Setting the options for the service client
            Options options = new Options();
            options.setProperty(HTTPConstants.SO_TIMEOUT, new Integer(timeout));
            options.setProperty(HTTPConstants.CONNECTION_TIMEOUT, new 
Integer(timeout));
            options.setSoapVersionURI(envelopeNamespace);
            options.setTo(new EndpointReference(endpointInterface));
            options.setExceptionToBeThrownOnSOAPFault(true);
            options.setCallTransportCleanup(true);
            
if(webService.endpointInterface().toUpperCase().startsWith("HTTP:")) {
                options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
            }
            else 
if(webService.endpointInterface().toUpperCase().startsWith("HTTPS:")) {
                options.setTransportInProtocol(Constants.TRANSPORT_HTTPS);
            }

            if(StringUtils.isNotEmpty(webMethod.action())) {
                options.setAction(webMethod.action());
            }

            //Narrowing the service details by retrieving and creating a 
wsdlServiceName
            //and including the portName in the ServiceClient instantiation if 
those
            //values exist.
            QName wsdlServiceName = null;

            if(StringUtils.isNotEmpty(webService.targetNamespace()) &&
                  StringUtils.isNotEmpty(serviceName)) {
                wsdlServiceName = new QName(webService.targetNamespace(), 
serviceName);
            }

            mSender = null;

            if(mockedService) {
                mSender = new ServiceClient();
            }
            else {
                String wsdlUrlString = wsdlUrl.toString();
                if(!axisServices.containsKey(wsdlUrlString)) {
                    axisServices.put(wsdlUrlString, 
AxisService.createClientSideAxisService(wsdlUrl, wsdlServiceName, portName, 
options));
                }
                mSender = new ServiceClient(null, 
axisServices.get(wsdlUrl.toString()));
            }
            mSender.setOptions(options);
        }
        catch(NumberFormatException e) {
            throw new WebServiceException(e);
        }
        catch(AxisFault e) {
            throw new WebServiceException(e);
        }

        return mSender;
    }

Thanks -jay

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to