- From: Stephan Zednik <zednis@rpi.edu>
- Date: Wed, 6 Feb 2013 20:08:20 -0700
- To: Luc Moreau <L.Moreau@ecs.soton.ac.uk>
- Cc: Curt Tilmes <Curt.Tilmes@nasa.gov>, "public-prov-wg@w3.org" <public-prov-wg@w3.org>
On Feb 6, 2013, at 4:58 PM, Luc Moreau <L.Moreau@ecs.soton.ac.uk> wrote:
> Hi Stephan and Curt,
>
> It is good to keep choice in documentElement. You both introduced it. Let's not remove it.
I agree, but the choice in documentElement will lead to the same problem with JAXB that a choice in attributes does.
Both Document and Bundle classes generated by JAXB's xjc use a single list for all available elements in a documentElement.
The generated code looks like the following:
protected List<JAXBElement<?>> entityOrActivityOrWasGeneratedBy;
/**
* Gets the value of the entityOrActivityOrWasGeneratedBy property.
*
* <p>
* This accessor method returns a reference to the live list,
* not a snapshot. Therefore any modification you make to the
* returned list will be present inside the JAXB object.
* This is why there is not a <CODE>set</CODE> method for the entityOrActivityOrWasGeneratedBy property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getEntityOrActivityOrWasGeneratedBy().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link JAXBElement }{@code <}{@link Association }{@code >}
* {@link JAXBElement }{@code <}{@link EmptyCollection }{@code >}
* {@link JAXBElement }{@code <}{@link Specialization }{@code >}
* {@link JAXBElement }{@code <}{@link Removal }{@code >}
* {@link JAXBElement }{@code <}{@link Dictionary }{@code >}
* {@link JAXBElement }{@code <}{@link Organization }{@code >}
* {@link JAXBElement }{@code <}{@link EmptyDictionary }{@code >}
* {@link JAXBElement }{@code <}{@link Plan }{@code >}
* {@link JAXBElement }{@code <}{@link Start }{@code >}
* {@link JAXBElement }{@code <}{@link Agent }{@code >}
* {@link JAXBElement }{@code <}{@link Collection }{@code >}
* {@link JAXBElement }{@code <}{@link Mention }{@code >}
* {@link JAXBElement }{@code <}{@link Generation }{@code >}
* {@link JAXBElement }{@code <}{@link SoftwareAgent }{@code >}
* {@link JAXBElement }{@code <}{@link Derivation }{@code >}
* {@link JAXBElement }{@code <}{@link KeyValuePair }{@code >}
* {@link JAXBElement }{@code <}{@link Object }{@code >}
* {@link JAXBElement }{@code <}{@link Communication }{@code >}
* {@link JAXBElement }{@code <}{@link Attribution }{@code >}
* {@link JAXBElement }{@code <}{@link Delegation }{@code >}
* {@link JAXBElement }{@code <}{@link Entity }{@code >}
* {@link JAXBElement }{@code <}{@link Influence }{@code >}
* {@link JAXBElement }{@code <}{@link Usage }{@code >}
* {@link JAXBElement }{@code <}{@link Alternate }{@code >}
* {@link JAXBElement }{@code <}{@link Membership }{@code >}
* {@link JAXBElement }{@code <}{@link Bundle }{@code >}
* {@link JAXBElement }{@code <}{@link End }{@code >}
* {@link JAXBElement }{@code <}{@link Insertion }{@code >}
* {@link JAXBElement }{@code <}{@link Activity }{@code >}
* {@link JAXBElement }{@code <}{@link Invalidation }{@code >}
* {@link JAXBElement }{@code <}{@link Person }{@code >}
* {@link JAXBElement }{@code <}{@link Revision }{@code >}
* {@link JAXBElement }{@code <}{@link Quotation }{@code >}
* {@link JAXBElement }{@code <}{@link PrimarySource }{@code >}
* {@link JAXBElement }{@code <}{@link DictionaryMembership }{@code >}
*
*
*/
public List<JAXBElement<?>> getEntityOrActivityOrWasGeneratedBy() {
if (entityOrActivityOrWasGeneratedBy == null) {
entityOrActivityOrWasGeneratedBy = new ArrayList<JAXBElement<?>>();
}
return this.entityOrActivityOrWasGeneratedBy;
}
>
> My concern about choice in prov attributes is that they lead, by default, to non natural object mapping with jaxb. I believe jaxb matters because jaxb is a community standard reaching well beyond the java community.
I agree. Would having a section in the FAQ which analyzes the problem in the context of a specific ORM technology and provides possible solutions (hints and/or alternate schemas) for that technology be satisfiable?
Also, looking at the JAXB generated class I think the manner in which the schema defines and uses prov:ref will result in a mapping that is not natural.
The following components from the schema
<xs:complexType name="Generation">
<xs:sequence>
<xs:element name="entity" type="prov:IDRef"/>
<xs:element name="activity" type="prov:IDRef" minOccurs="0"/>
<xs:element name="time" type="xs:dateTime" minOccurs="0"/>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="prov:location"/>
<xs:element ref="prov:role"/>
<xs:element ref="prov:label"/>
<xs:element ref="prov:type"/>
<xs:any namespace="##other"/>
</xs:choice>
</xs:sequence>
<xs:attribute ref="prov:id"/>
</xs:complexType>
<!-- note, this is not xs:IDREF -->
<xs:complexType name="IDRef">
<xs:attribute ref="prov:ref" use="required" />
</xs:complexType>
result in class members with type IDRef
protected IDRef entity;
protected IDRef activity;
Whose class is defined like so:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "IDRef")
public class IDRef {
@XmlAttribute(name = "ref", namespace = "http://www.w3.org/ns/prov#", required = true)
protected QName ref;
/**
* Gets the value of the ref property.
*
* @return
* possible object is
* {@link QName }
*
*/
public QName getRef() {
return ref;
}
/**
* Sets the value of the ref property.
*
* @param value
* allowed object is
* {@link QName }
*
*/
public void setRef(QName value) {
this.ref = value;
}
}
I think our modeling of prov:ref will likewise cause confusion among ORM generated classes.
--Stephan
>
> Now, I am not expert in jaxb. There may well be standard jaxb annotations that allow us To support a natural object mapping with an xsd choice. If so, we should go for xsd:choice.
>
> Curt's suggestion of a plugin (-simple) is a good, as long as plugin is maintained, which with my jaxb experience, is not encouraging, especially.
>
>
> In the absence of standard jaxb annotations that lead to natural jaxb mappings, my preference is to be conservative and go for ordered prov attributes.
>
>
> Professor Luc Moreau
> Electronics and Computer Science
> University of Southampton
> Southampton SO17 1BJ
> United Kingdom
>
> On 6 Feb 2013, at 20:08, "Stephan Zednik" <zednis@rpi.edu> wrote:
>
>> After having played around with JAB and gaining a better understanding of the problem I am more amenable to the idea of requiring element ordering for properties.
>>
>> I am still not sold on the idea of element ordering in documentElements and without that the generated class methods for Bundle will be a 'bag of hurt'.
>>
>> An alternate idea is a to have a section in the FAQ dedicated to providing ORM implementation-specific tips on how to generate 'nice' mappings.
>>
>> The plugin Curt has mentioned could be mentioned in a FAQ entry and we could provide an example of how to use external hints to JAXB. The FAQ could also contain links to a modified schema that uses ordered elements and is only intended to be used as a source for ORM mappings, but not as a schema to validate against.
>>
>> I think I like the second option best as it allows us to respond to ORM-mapping issues after the WG activity has completed and is a natural way to talk about implementation specific ORM issues.
>>
>> --Stephan
>>
>> On Feb 5, 2013, at 11:56 AM, Curt Tilmes <Curt.Tilmes@nasa.gov> wrote:
>>
>>> Luc,
>>>
>>> I haven't tested this yet, but is it possible that the jaxb
>>> "Simplify" plugin could address this problem with jaxb?
>>>
>>> http://confluence.highsource.org/display/J2B/Simplify+Plugin
>>>
>>> It seems (again, untested), that you could use it and specify
>>> some application hints for jaxb ("simplify:as-element-property")
>>> for the attributes that would instruct jaxb to model
>>> each attribute family (type, location, label, etc.) with
>>> its own list rather than bundling them together as it
>>> does by default with choices.
>>>
>>> Curt
>>>
>>> On 02/05/2013 01:37 AM, Luc Moreau wrote:
>>>> Hi Curt,
>>>>
>>>> Does the schema now impose an order on prov "attributes"?
>>>>
>>>> Without order, I have failed to define an object mapping (with jaxb)
>>> that is useful from an OO perspective. Likewise, i have not managed to
>>> define a meaningful ORM mapping. Now, this is my experience with these
>>> tools, maybe somebody has succeeded.
>>>>
>>>> In summary, The problem I encountered is as follows. If there is a
>>> choice (instead of sequence) between say, prov:type, prov:location,
>>> prov:label, all these elements are mapped to a single java method or a
>>> single sql column. This results in non natural code or SQL queries.
>>>>
>>>> Because of this, my preference is to keep these in a sequence. It does
>>> not at all reduce expressivity, I think.
>>>>
>>>>
>>>> Professor Luc Moreau
>>>> Electronics and Computer Science
>>>> University of Southampton
>>>> Southampton SO17 1BJ
>>>> United Kingdom
>>>>
>>>> On 5 Feb 2013, at 01:17, "Curt Tilmes" <Curt.Tilmes@nasa.gov> wrote:
>>>>
>>>>> Last week, we also briefly mentioned the PROV-XML element
>>>>> ordering issue, described here:
>>>>>
>>>>> https://www.w3.org/2011/prov/track/issues/572
>>>>>
>>>>> Are there strong opinions about changing anything (either
>>>>> arguments, or attributes or anything else from the way it
>>>>> is now?
>>>>>
>>>>> Tracker, this is ISSUE-572.
>>>>>
>>>>> Curt
>>>>>
>>>>
>>>>
>>>
>>>
>>> --
>>> Curt Tilmes, Ph.D.
>>> U.S. Global Change Research Program
>>> 1717 Pennsylvania Avenue NW, Suite 250
>>> Washington, D.C. 20006, USA
>>>
>>> +1 202-419-3479 (office)
>>> +1 443-987-6228 (cell)
>>> globalchange.gov
>>>
>>>
>>
>
>
Received on Thursday, 7 February 2013 03:08:52 UTC