Re: [wsrp] Event payload's root element name

From
Qich Shompson
Date
2007-10-16T16:28:03+00:00
ID
Thread
Re: [wsrp] Event payload's root element name
Digging a bit deeper, it appears the
fundamental issue is a mismatch between JAXB and XML. XML has complete
separation between semantics (element name) and syntax (element type) while
JAXB embeds annotations about semantic naming into the syntactic layer
(in this case Java class definition) such that one can not use annotations
and have two different elements be of the same type.

One might argue that we could have said
the type name would be the root element since we already carry the event
name in a separate field (required to cover use cases without a payload),
but that would leave an issue when the type is not supplied (i.e. opaque
payload). My preference would be to leave the spec as is and solve this
in those layers which need to provide JAXB mapping ... is that possible?

Rich 

Richard Jacob <>

10/16/2007 08:21 AM

To



cc



Subject

[wsrp] Event payload's root element
name

In 4.1.11 EventDescriptionType we mandate that the event's payload root

element name becomes the event's (q)name.

Although this is not a conformance statement, I would ask if this is really

necessary although I can see some use to it.

I would be greatly interested in opinions and perhaps implementation

choices you have choosen here for the sake of interoperability.

The current problem that I see is that JSR286 does not mandate to have
the

class definition be annotated with a namespace and name element.

E.g. the following class could be defined by a portlet programmer:

@XmlRootElement

class foo {

  @XmlAttribute

  String attribute;

  @XmlElement

  String value;

}

A typical JAXB serializer would serialize this to:

<foo attribute="someASttributeValue">

  <value>someValue</value>

</foo>

This means that for WSRP the Producer would have to change the root element

name to match the event name, e.g.:

<fooEvent xmlns:x="http://example.org/eventnamespace"

attribute="someASttributeValue">

  <value>someValue</value>

</foo>

In this case when a portlet would receive <fooEvent>, it might not
be able

to deserialize that event payload, because the JAXB unmarshaller would

expect <foo> as the root element name.

Note that when transforming the root element's name, the initial name gets

lost on event distribution.

I see the following solutions to this problem:

1. do no require/mandate that the root element has a certain name

The root element is of no meaning because typically the event source would

match the event's type from it's definition which is a 1:1 relation of
name

and type.

So unmarshallers need to be prepared to cope with payloads with arbitrary

root element names - the type is important here. This is explicitly allowed

by the JAXB spec to unmarshall XML strings which have a different root
name

element.

And since the target portlet would need to have the same class defined
I

guess this way would be easiser for portlet programmers as well as for

container developers.

2. make sure that container implementation always marshal java classes
with

a root element who's namespace and name is the event's qname defined in
the

DD.

This would make the transformation to wsrp payload easy, producer would

just need to stuff in the JAXB serialized XML String as the event payload.

The same applies here to unmashalling as in 1. The unmarshalling code needs

to invoke the JAXB unmarshaller with the XML String and class name (type

information) which would then generate the according portlet class

referenced in the DD. I would presume most implementation would do that

anyway and don't care about the root element's name because they have a)

the event qname and b) the matching class at hand.

3. mandate in the JSR286 spec that JAXB annotated classes need to annoted

the root element with namespace & name matching the event name, e.g.:

@XmlRootElement(namespace="http://example.org/eventnamespace",

name="fooEvent")

class foo {

  @XmlAttribute

  String attribute;

  @XmlElement

  String value;

}

If the root element annotation contains no namespace and name attributes,

then the JSR286 container's JAXB serializer would create the root element

according to above rules.

Note that some convention like this is also necessary for JSR286 event

payloads consisting of simple types like java.lang.String.

There is no definition about what the root name will be in this case in
the

JAXB spec, I guess JAXB implementation can choose an arbitrary naming

algorithm here.

I guess a similar convention would come handy in the JSR286 spec, too.

Although I realize that this is more a directive to container

implementations rather than portlet programmers.

Typically portlet programmers will never need to deal with the form the

JAXB serializer chooses.

Mit freundlichen Gruessen / best regards,

        Richard Jacob

______________________________________________________

IBM Lab Boeblingen, Germany

Dept. 2289, WebSphere Portal Server Development 1

WSRP Team Lead

WSRP Architecture & Standardization

Phone: ++49 7031 16-3469  -  Fax: ++49 7031 16-4888

IBM Deutschland Entwicklung GmbH

Vorsitzender des Aufsichtsrats: Martin Jetter

Geschäftsführung: Herbert Kircher

Sitz der Gesellschaft: Böblingen

Registergericht: Amtsgericht Stuttgart, HRB 243294