[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]
Subject: 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
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]