- From: Stephan Zednik <zednis2@rpi.edu>
- Date: Wed, 3 Apr 2013 11:25:52 -0600
- To: "Hua, Hook (398C)" <hook.hua@jpl.nasa.gov>
- Cc: "public-prov-wg@w3.org" <public-prov-wg@w3.org>
- Message-Id: <65E90BC7-E220-4BD4-AB70-19A37D6FD1B7@rpi.edu>
On Apr 3, 2013, at 11:16 AM, "Hua, Hook (398C)" <hook.hua@jpl.nasa.gov> wrote:
> Hi Stephan,
>
> Proposed solution (b) of <xs:complexType name="Others"> is an interesting one. Though it validates, do you still see JAXBElements in the generated JAXB bindings?
Did you try it yourself?
With prov:internalElement still in the document/bundle sequences you still get the JAXBElements in the generated JAXB bindings. If you remove prov:internalElement, as we would suggest in the FAQ-entry, then you no longer get JAXBElements in the generated bindings.
--Stephan
>
> --Hook
>
>
> From: Stephan Zednik <zednis2@rpi.edu>
> Date: Tue, 2 Apr 2013 20:07:04 -0600
> To: Luc Moreau <L.Moreau@ecs.soton.ac.uk>
> Cc: <public-prov-wg@w3.org>
> Subject: Re: ISSUE-648: Can schema be made a bit more jaxb friendly?
> Resent-From: <public-prov-wg@w3.org>
> Resent-Date: Wed, 3 Apr 2013 02:07:34 +0000
>
>
> On Apr 2, 2013, at 2:25 PM, Luc Moreau <L.Moreau@ecs.soton.ac.uk> wrote:
>
>> Hi Stephan,
>> Thanks for still looking into a solution for this issue, and summarizing the options.
>>
>> May I suggest option 1.5.
>>
>> a) keep use of abstract element and substitution,
>> but in FAQ, add an xml processing step, that inserts all included files in a single one,
>> and replaces the abstract element with the concrete ones.
>>
>> With this, you keep the modularity, but offer a JAXB way of handling it.
>>
>> b) introduce a mechanism to support any non prov element.
>> I am not sure what the right option is.
>>
>> I think this option is not as radical as your option 1.
>>
>>
>> An option for xsd:any not discussed yet I think is to introduce a new element:
>> <prov:others>
>> here, xsd:any non-prov element
>> </prov:others>
>>
>> Thoughts?
>
> I made this update locally and all our example xml files still validate so we weren't using any non-prov elements at the document or bundle level (just as attributes) in our examples. I will do a quick check to ensure that all examples in the Note are still valid but they were based on the xml examples in the repository so I expect that to be the case.
>
> I propose we hold a straw poll by email regarding adopting Luc's suggestions above so I can implement tonight and get the note staged for review (may go to stage early tomorrow morning).
>
> PROPOSED:
>
> a) keep use of abstract element and substitution,
> but in FAQ, add an xml processing step, that inserts all included files in a single one,
> and replaces the abstract element with the concrete ones.
>
> b) introduce a new element:
>
> <prov:others>
> <!-- here, xsd:any non-prov element -->
> </prov:others>
>
> to be implemented as:
>
> <xs:element name="others" type="prov:Others"/>
>
> <xs:complexType name="Others">
> <xs:sequence>
> <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
> </xs:sequence>
> </xs:complexType>
>
> and the prov:others element to be referenced in the document and bundle sequences.
>
> --Stephan
>
>> Luc
>>
>> On 02/04/13 20:56, Stephan Zednik wrote:
>>> Hi Luc,
>>>
>>> I've looked into ways to update the schema while retaining our current encapsulation strategy of having extension schemas uses substitution group elements on the prov:internalElement element and I have yet to figure out a way to do it. I also have yet to figure out if we can provide a solution to improve JAXB binding without forcing all non-prov elements to be after the prov elements in document and bundle containers.
>>>
>>> We are getting to the end of our timeframe for addressing this so we should make a decision ASAP.
>>>
>>> Possible solutions:
>>>
>>> 1) implement the changes mentioned by Luc, which would be:
>>>
>>> a) remove use of abstract element and substitution groups in prov-core and extension schemas
>>> b) introduce ordering that requires xsd:any after prov elements in document and element containers
>>>
>>> these changes would force us to also do the following:
>>>
>>> c) remove include statements from prov.xsd and extension schemas, all schemas contain local declarations of prov core types
>>> d) update the Note document to reflect changes
>>>
>>> PROS:
>>> - Removes the JAXBElement.class type from the @XmlElementRef annotations in generated classes
>>>
>>> CONS:
>>> - Removes our strategy for modularity and encapsulation in the schemas
>>> - Restricts non-prov elements to only be valid after prov-elements in bundle and document containers
>>>
>>> 2) leave the schema and Note as they are; look into developing a separate JAXB-friendly schema which can be introduced in a FAQ entry. Write FAQ entry about our experiences with JAXB binding irregardless of if a separate JAXB-friendly schema can be successfully developed.
>>>
>>> PROS:
>>> - Increases our window to get the work done, we may not have determined the best solution yet
>>> - Does not require a change to the existing Note or schema
>>> - Allows us to introduce jaxb annotations in the FAQ schema that may help with the schema binding
>>> - Preserves exiting modularity and encapsulation in the schemas
>>>
>>> CONS:
>>> - The JAX-friendly schema will likely need to be a more restrictive schema than the official schema (such as perhaps requiring xs:any elements outside of choices at the end of sequences), this may lead to problems in trying to unmarshall valid PROV-XML that does not conform to the JAXB-friendly schema.
>>>
>>> 3) Do nothing
>>>
>>> I prefer 2) or 1) over not addressing this request.
>>>
>>> --Stephan
>>>
>>>> Hi
>>>>
>>>> I have ported the ProvToolbox and the ProvValidator to the new XML schema.
>>>> I just wanted to report on my experience with the schema and JAXB.
>>>> Obviously, others may have better experience with JAXB and may be able
>>>> to help on some of the issues I encountered.
>>>>
>>>> Everything worked fine, except:
>>>> - <xs:element ref="prov:internalElement abstract=true/>
>>>> - extensibility <xs:any namespace="##other"/> in Document and Bundle
>>>>
>>>>
>>>> These two constructs, while processable by JAXB, are not JAXB-friendly.
>>>>
>>>> Indeed, JAXB compiles the schema in a list containing all possible statements.
>>>>
>>>> protected List<Object> entityAndActivityAndWasGeneratedBy;
>>>>
>>>> However, the presence on an abstract element and an <any/> element result in the
>>>> content of that list to be of type:
>>>>
>>>>
>>>> @XmlElementRefs({
>>>> @XmlElementRef(name = "used", namespace = "http://www.w3.org/ns/prov#", type = JAXBElement.class),
>>>> @XmlElementRef(name = "wasAssociatedWith", namespace = "http://www.w3.org/ns/prov#", type = JAXBElement.class),
>>>> @XmlElementRef(name = "person", namespace = "http://www.w3.org/ns/prov#", type = JAXBElement.class),
>>>> @XmlElementRef(name = "entity", namespace = "http://www.w3.org/ns/prov#", type = JAXBElement.class),
>>>> @XmlElementRef(name = "wasInfluencedBy", namespace = "http://www.w3.org/ns/prov#"
>>>> ....
>>>> })
>>>>
>>>> @XmlAnyElement(lax = true)
>>>> protected List<Object> entityAndActivityAndWasGeneratedBy;
>>>>
>>>> where all data structures are wrapped up in this unpleasant JAXBElement.
>>>>
>>>> Without these features, we get a much more natural mapping:
>>>> @XmlElements({
>>>> @XmlElement(name = "entity", namespace = "http://www.w3.org/ns/prov#", type = Entity.class),
>>>> @XmlElement(name = "activity", namespace = "http://www.w3.org/ns/prov#", type = Activity.class),
>>>> @XmlElement(name = "wasGeneratedBy", namespace = "http://www.w3.org/ns/prov#", type = WasGeneratedBy.class),
>>>> @XmlElement(name = "used", namespace = "http://www.w3.org/ns/prov#", type = Used.class),
>>>> @XmlElement(name = "wasInformedBy", namespace = "http://www.w3.org/ns/prov#", type = WasInformedBy.class),
>>>> ...
>>>> })
>>>>
>>>> So, how I did I solve the problem? I inserted the extension schemas into the schema file, and hence got rid of the abstract element. I am ok with this. We could possible provide the utility to that transformation.
>>>>
>>>> For the extensibility, I used a different definition. It happens to
>>>> parse prov-xml compliant xml. When serializing, it puts all
>>>> extensibility elements at the end. This is not a satisfactory
>>>> solution, and is likely to be dependent of the jaxb implementation (though I am not entirely sure).
>>>>
>>>>
>>>> <xs:complexType name="Document">
>>>> <xs:sequence>
>>>> <xs:choice maxOccurs="unbounded">
>>>> <xs:group ref="prov:documentElements"/>
>>>> <xs:element name="bundleContent" type="prov:NamedBundle"/>
>>>> </xs:choice>
>>>> <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
>>>> </xs:sequence>
>>>> </xs:complexType>
>>>>
>>>> Can something be done to make the XML schema a bit more jaxb friendly,
>>>> while still keeping the same flexibility? Thoughts welcome.
>>>>
>>>> Cheers,
>>>> Luc
>>
>> --
>> Professor Luc Moreau
>> Electronics and Computer Science tel: +44 23 8059 4487
>> University of Southampton fax: +44 23 8059 2865
>> Southampton SO17 1BJ email: l.moreau@ecs.soton.ac.uk
>> United Kingdom http://www.ecs.soton.ac.uk/~lavm
>
Received on Wednesday, 3 April 2013 17:26:03 UTC