ReflectionProxyHandler.fromXML() improperly handles complex response type
containing multiple child elements
------------------------------------------------------------------------------------------------------------
Key: MUSE-249
URL: https://issues.apache.org/jira/browse/MUSE-249
Project: Muse
Issue Type: Bug
Reporter: Vinh Nguyen
Assignee: Dan Jemiolo
This is somewhat related to MUSE-248 but is a separate problem on its own.
My server capability returns the following response:
<xs:element name="EnumerateResponse">
<xs:complexType>
<xs:sequence>
<xs:element name="Expires" type="tns:ExpirationType"
minOccurs="0"/>
<xs:element name="EnumerationContext"
type="tns:EnumerationContextType"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
</xs:element>
But, when my EnumerateResponseSerializer.fromXML() is called, it receives only
the first child element of the response (i.e. the "Expires" element).
The problem is in ReflectionProxyHandler.fromXML() in this code chunk:
//
// if the value is a simple type, use the root of the
// response body
//
Element child = XmlUtils.getFirstElement(xml);
Class returnType = getReturnType();
if (child == null || returnType.isArray())
child = xml;
//
// now we can deserialize the contents
//
return deserialize(child, returnType);
If the response is a complex type, Muse only takes the first child element and
sends it to the serializer. But my serializer is expecting the entire
EnumerateResponse because my client code needs all the child elements.
The easiest fix is to update to the following:
Element child = null;
Element[] all = XmlUtils.getAllElements(xml);
if (all.length == 0 || all.length > 1 || returnType.isArray())
child = xml;
else
child = all[0];
Basically, it just adds one additional logic: if there are multiple children,
deserialize the entire original Element. So only deserialize and return the
first child if that's the only child. I think we can safely assume that if an
operation returns a response containing multiple child elements, a client will
be expecting the deserialized response as one object. In this case, my client
can safely expect one EnumerateResponse object.
Just returning the children in an Object[] is useless unless the client knows
the exact types and how many children to expect beforehand. Also, a serializer
can only take in one object at at time, not an array of child objects.
Overall, I think the real problem is this:
A wsdl allows an operation response to contain multiple children. This is like
a method returning multiple non-homogenous objects not in a collection. This
is not possible in Java because a method can only return one object, or an
Object[], but not multiple objects that are not in a single collection. So for
web services, we have to assume that if a client receives a response that is
not a homogenous array of objects, the client can only work with the data if it
directly accessed the response wrapper object itself so that specific child
objects can be extracted as needed.
--
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]