I am back on XML Schema design and I do really like it !
One of the challenge that I am facing now is including or not the UBL metalanguage in my schemas (see some video on the oasis website), an Oasis standard, as you can deduce.
As you can see from this file:
UBL metalanguage has elements which are based on the UN/CEFACT elements, see:
So as you can see UN/CEFACT has ComplexType which are extended by adding optional attributes, while the UBL elements are sometime restrictions on the attributes (by making them required) and sometimes the elements are just extended giving a freedom in a later moment to choose what to add.
Independently from the current problem, it happens that we might not need all the attributes or simply all the elements for our schema.
So either we add restrictions or we copy the elements that we need in our schema but simplified.
Adding restrictions can be possible in two ways:
1) Restrict on the patterns, like the max length of an element, they are so called facets, see: http://www.w3.org/TR/xmlschema-0/#SimpleTypeFacets
2) Restrict on the number of elements or attributes, in the case of the attributes we need to make them prohibited
Conceptually both are restrictions based on an another type and this creates a problem in Object Oriented languages, like Java (hence the tittle of this post) which supports extensions (at the end a restriction is a sort of extension of a base object with some changes).
Jaxb is the official standard used for databinding XML elements to Java objects which relies on XJC for the conversion. Such standard adds Java annotations to associate XML elements to Java objects. Further, Jaxb relies on the validator of the marshaller by using the setSchema() method, see for example the post of Blaise Doughan, so in any moment you can validated your object against the schema to be sure before sending out your xml message.
For the facets, Jaxb doesn’t create annotations, there is still an open issue where 2 subgroups are working to solve it but still none of them are officially approved:
- https://github.com/krasa/krasa-jaxb-tools which adds new Java annotations
- https://github.com/whummer/jaxb-facets which focus on extend Jaxb by adding such annotations
You need also to consider that facets can change in the future (the max length could be extended from 100 characters to 200), so which impact has changing the xml schema? Since Jaxb doesn’t generate annotations for facets you don’t need to change the java objects but other databindings might be.
For the restriction on the the number of elements/attributes this CANNOT be reflected in a Object Oriented language because it is not possible to restrict an extended class on inherited properties. Therefore I suggest to copy simplified elements (by keep only those mandatory and removing the optionals), in this way:
- you have less dependency
- the developer has less method generated (just those needed)
- you keep compatibility at the minimum if you want to convert the copied object into the original objects
Therefore I would recommend to avoid restrictions if possible, you can keep them for the sake of validation but you need to think about the impact on the objects generated with the databinding libraries. Such recommandation is also expressed by the HP XML schema best practices (search for “restrictions for complex types”) and in Microsoft xml schema design pattern.