Hi Dobri:

The WSDLSupplier, at least up until now, is something that gets added to the AxisService as a parameter programatically, not via configuration. The value is an actual WSDLSupplier, not a class name. However this could certainly be changed, and I kind of like your idea for doing so.

The one implementation of this we use in WSO2's Axis1Deployer (the link Saminda sent) has a specific constructor, because it needs to remember the active (Axis 1.4) AxisServer - so this is why we create it with custom code and insert it into the AxisService manually. (However, we could just put the AxisServer reference into another parameter and have it look for that, and then it could have a default constructor)

So here's my suggestion:

Let's leave the "WSDLSupplier" parameter as it is - so if someone puts an implementation in the AxisService, that particular object gets used. Then we add a "WSDLSupplierClass" parameter, which is expected to be a string classname. If we find one of *those* (as in the config examples you have below), we'll create one using a default constructor, and if that succeeds we load the result into the "WSDLSupplier" param.

Sound good?

--Glen

Dobri Kitipov wrote:
Hi Saminda,
I am not sure I get everything right. So let's clarify it.

1) My understanding is that I should create a JIRA about WSDLSupplier parameter, right? But I think this is a more or less feature than a bug? I mean, AFAIK when you add a parameter to services/axis2.xml it is supposed to be retrieved as String? May be there is a need of an additional new attribute like "type". E.g.:

<parameter name="WSDLSupplier " type="class">com.test.wsdlsupplier.MyWSDLSupplier</parameter>

or for example something like specifing the deployer into axis2.xml:
<deployer extension=".class" directory="pojo" class="org.apache.axis2.deployment.POJODeployer"/>

or in our case

<WSDLSupplier class="com.test.wsdlsupplier.MyWSDLSupplier"/> ?

We need to think more deeply which one is preferable. But anyway I can open a JIRA like this.

Anyway the effect should be that in this case axis will know the type of the artifact/parameter and will try to load it from the classpath.

2) I do not want to use "useOriginalWSDL", but dynamically generate and provide the WSDL at server side based on some criteria. So my understanding is that the mail thread http://marc.info/?l=axis-dev&m=118399944531093&w=2 <http://marc.info/?l=axis-dev&m=118399944531093&w=2> considers exactly this use case, providing the ability to hook an implementation of WSDLSupplier that should return the WSDL ? Am I wrong? I will change the message receiver and have a look at the link you provided to me.

Thank you in advance!

Dobri

On Feb 5, 2008 10:41 AM, Saminda Abeyruwan <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>> wrote:

    Hi Dobri,

    In deed, if the parameter is defined as prior, it would cause a
    class cast exception. This should be fixed. The intended used case
    for WSDLSupplier is IMHO not what you have identified. You'll be
    able to find a use case in [1].

    Since you are using
    org.apache.axis2.rpc.receivers.RPCMessageReceiver, this will
    generate the WSDL for your POJO. And if policy is applied, it will
    be correctly attached to the WSDL.

    If you have a pre-defined WSDL, please use the parameter

    <parameter name="useOrignalWSDL"> true </parameter>


Where wsdl's endpoint should be named exactly as the service name. In this case "Test1".

    Please do log a JIRA to prevent class cast exception.

    Thank you

    Saminda

    Reference:

    [1] .
    
https://wso2.org/repos/wso2/trunk/commons/deployers/axis1deployer/src/main/java/a1deployer/








    On Feb 4, 2008 8:52 PM, Dobri Kitipov <[EMAIL PROTECTED]
    <mailto:[EMAIL PROTECTED]>> wrote:

        Hi everybody,
        There is one mail thread
        http://marc.info/?l=axis-dev&m=118399944531093&w=2
        <http://marc.info/?l=axis-dev&m=118399944531093&w=2> that talks
        about using WSDLSupplier that gives you the possibility to hook
        your own WSDL on the fly. This is done implementing an interface
        org.apache.axis2.dataretrieval.WSDLSupplier.
        What I am currently trying to do is to test this feature. I
        implemented my own WSDLSupplier, but not sure how to specify it.
        Looking into the above mentioned thread we can read:

        "I added a check in printWSDL() to see if there was a
        WSDLSupplier sitting in the "WSDLSupplier" parameter of the
        AxisService.  If so, it attempts to call the WSDLSupplier to
        obtain the Definition object from there dynamically.  It then
runs that WSDL through the usual printDefinitionObject() API. This allows my custom service to plug in and generate its own WSDL."

        IMHO I should add a parameter into the services.xml file like:

        <serviceGroup>
          <service name="Test1">
            <description>Web Service Test1</description>
            <parameter
        name="WSDLSupplier">com.test.wsdlsupplier.MyWSDLSupplier</parameter>
            <messageReceivers>
              <messageReceiver
        class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"
        mep="http://www.w3.org/2004/08/wsdl/in-out"/>
            </messageReceivers>
            <operation name="echo"/>
          </service>
        </serviceGroup>

        The problem is that into
        org.apache.axis2.description.AxisService method public void
        printWSDL(OutputStream out, String requestIP) the check is:

        WSDLSupplier supplier =
        (WSDLSupplier)getParameterValue("WSDLSupplier");

        So I receive:
        java.lang.ClassCastException: java.lang.String
org.apache.axis2.description.AxisService.printWSDL(AxisService.java:1167)
        ...

which is something expected because getParameterValue("WSDLSupplier"); returns a String object, but
        not WSDLSupplier. So it is not possible to cast String to
        WSDLSupplier.

        Please, advise me how it should be done. I did not find anything
        that explains this.

        Thank you in advance!

        Dobri




-- Saminda Abeyruwan

    Senior Software Engineer
WSO2 Inc. - www.wso2.org <http://www.wso2.org>


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

Reply via email to