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]