axis-java-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jay Blanton (JIRA)" <j...@apache.org>
Subject [jira] Updated: (AXIS2-3838) options.setTo(new EndpointReference(endpointInterface)) is overridden by AxisService.createClientSideAxisService and the address location in the WSDL port
Date Thu, 05 Jun 2008 16:37:45 GMT

     [ https://issues.apache.org/jira/browse/AXIS2-3838?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Jay Blanton updated AXIS2-3838:
-------------------------------

    Description: 
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;
    }

We have a current work around by doing the following when creating the AxisService Object:

                String wsdlUrlString = wsdlUrl.toString();
                AxisService svc = axisServices.get(wsdlUrlString);
                if(svc == null) {
                    svc = AxisService.createClientSideAxisService(wsdlUrl, wsdlServiceName,
portName, options);
                    EndpointReference endPntRef = options.getTo();
                    if (endPntRef != null) {
                        endPntRef.setAddress(endpointInterface);
                    }
                    else {
                        options.setTo(new EndpointReference(endpointInterface));
                    }
                mSender = new ServiceClient(null, axisServices.get(wsdlUrl.toString()));

Thanks -jay

  was:
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


Adding an example of the workaround that we are using.

> 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 
 the 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;
>     }
> We have a current work around by doing the following when creating the AxisService Object:
>                 String wsdlUrlString = wsdlUrl.toString();
>                 AxisService svc = axisServices.get(wsdlUrlString);
>                 if(svc == null) {
>                     svc = AxisService.createClientSideAxisService(wsdlUrl, wsdlServiceName,
portName, options);
>                     EndpointReference endPntRef = options.getTo();
>                     if (endPntRef != null) {
>                         endPntRef.setAddress(endpointInterface);
>                     }
>                     else {
>                         options.setTo(new EndpointReference(endpointInterface));
>                     }
>                 mSender = new ServiceClient(null, axisServices.get(wsdlUrl.toString()));
> 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: axis-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-dev-help@ws.apache.org


Mime
View raw message