Shantanu Sen wrote:
--- Aleksander Slominski <[EMAIL PROTECTED]> wrote:
Shantanu Sen wrote:
Sorry, I sent out the previou mail without finishing
it...here is the complete one..
--- Shantanu Sen <[EMAIL PROTECTED]> wrote:
Please see below for my response
--- Aleksander Slominski <[EMAIL PROTECTED]>
wrote:
Shantanu Sen wrote:
What is the version of the wsdl4j.jar that is
present
in the current CVS repo of WSIF? It says
wsdl4j-20030807.jar
I tried to run with the wsdl4j-1.5.1 - but it
fails
at
runtime although the WSIF build is fine.
The error is that when parsing a WSDL with the
1.5.1
version the
Definition.getTypes().getExtensibilityElements()
returns a list of objects of type
com.ibm.wsdl.extensions.schema.SchemaImpl.
But when I invoke the
org.apache.wsif.schema.Parser.getAllSchemaTypes,
it
invokes the Parser.getTypesSchemas method, which
expects the list of extensibility elements
returned
by
the above call to be of type
UnknownExtensibilityElement.
Hence a ClassCastException is thrown.
So, is there any plan to upgrade to the latest
wsdl4j?
Does the latest wsdl4j give us any added benefit?
I am curious - is the latest version correct in
using
SchemaImpl as the type of the extensibility
elements
rather than the UnknownExtensibilityElement?
hi,
i have added a check to Parser.getTypesSchemas to
skip non
UnknownExtensibilityElement and i have also
upgraded
the WSIF in CVS to
use the 1.5.1 WSDL4J and i have updated AXIS to
1.2.1 - that should help
to avoid jar linking problems.
please try the version from CVS or nightly build
(in
few hours) and send
email if you find other problems.
thanks,
alek
Alek,
This will not work. The def.getTypes() returns the
types section of the document and that has typically
one child element - the schema. The code that you
added is skipping over that element since it is no
longer an UnknownExtensibilityElement, but a
com.ibm.wsdl.extensions.schema.SchemaImpl which is
an
ExtensibilityElement.
Here is the part of the code that you added
===============================
Types types = def.getTypes();
if (types != null) {
Iterator extEleIt =
types.getExtensibilityElements().iterator();
while (extEleIt.hasNext()) {
Object nextEl = extEleIt.next();
--- added by you in the current CVS tree
if(!(nextEl instanceof
UnknownExtensibilityElement)) {
continue;
}
-------------------
UnknownExtensibilityElement typesElement =
(UnknownExtensibilityElement) nextEl;
Element schemaEl = typesElement.getElement();
....
=============
I think it should test for an ExtensibilityElement
rather than UnkownExtensibilityElement since both
SchemaImpl and UnknownExtensibilityElement are a
type
of ExtensibilityElement.
I thought that we could check for
ExtensibilityElement, but unfortunately it does not
have a getElement API.
The other option is to check if the element (the
object nextEl above) is of type
javax.wsdl.extensions.schema.Schema and cast it to
that:
------------
Element schemaEl = null;
if(nextEl instanceof
javax.wsdl.extensions.schema.Schema) {
javax.wsdl.extensions.schema.Schema typesElement =
(javax.wsdl.extensions.schema.Schema)nextEl;
schemaEl = typesElement.getElement();
} else if (nextEl instanceof
UnknownExtensibilityElement)) {
UnknownExtensibilityElement typesElement =
(UnknownExtensibilityElement) nextEl;
schemaEl = typesElement.getElement();
} else {
continue;
}
------------
The issue is that once you add
javax.wsdl.extensions.schema.Schema reference in the
code, you can no longer build with the previous
version of wsdl4j since I think this type was added
later in WSDL4J.
Please let me know what you think.
it starts to look really complicated - what do you think would eb the
best solution that works for you assuming we do depend on the latest WSDL4J?
thanks,
alek
--
The best way to predict the future is to invent it - Alan Kay
I think the code that I supplied should satsify all of us.
=====
if(nextEl instanceof javax.wsdl.extensions.schema.Schema) {
javax.wsdl.extensions.schema.Schema typesElement =
(javax.wsdl.extensions.schema.Schema)nextEl;
schemaEl = typesElement.getElement();
} else if (nextEl instanceof UnknownExtensibilityElement)) {
UnknownExtensibilityElement typesElement = (UnknownExtensibilityElement)
nextEl;
schemaEl = typesElement.getElement();
} else {
continue;
}
============
Note the following about this code:
1. It takes care of the possibility of a child element of types to be of type
UnknownExtensibilityElement
2. It takes care of the current scenario with WSDL4J1.5 - where the type is of
javax.wsdl.extensions.schema.Schema.
3. It ignores any other type - so if the WSDL contains other types in the types
section
then there will not be any classcastexception.
This satisfies all the cases that I can think of. If you think of anything that
I am
missing please let me know. Else, I feel this should work.
The only drawback is that we cannot compile against a previous version of
WSDL4J. But I
think that should be acceptable - there is no requirement for it to be backward
compatible right?
Shantanu,
i will try to apply this patch to SVN and see what happens. could you open JIRA
issue for it?
thanks,
alek
--
The best way to predict the future is to invent it - Alan Kay