How to reorder the XML unmarshalling - jaxb

I need to know if we can unmarshal the object to the order we want.
ex: we have three classes A, B and C. order of unmarshalling is also in the same order.
As my concepts are not that clear but as far as I know the unmarshalling happens in the order in which it was marshaled.
As there is a development constrains I cannot change the order of marshalling objects. so is there a way to change the order to unmarshal B's objects first before A's objects.
I am using JAXB api's.
Thanks,
Suvidh

JAXB (JSR-222) implementations do not require that the elements in the XML document strictly match the order defined in the XML schema. If you wish to enforce an order then you can set an instance of javax.xml.validation.Schema on the Unmarshaller.

Related

How to specify the unique identifier of a Class

I have to indicate for the Employee class that each employee can be clearly identified by his personal number. I do not know if I think too complicated, because I have no real idea.
Attributes:
final int personelNumber
...
You don't even need an OCL constraint to express that in UML.
There is a property isID on the Property metaclass that ensures this:
From UML 2.5 specification § 9.5.3 (p. 111)
A Property may be marked, via the property isID, as being (part of)
the identifier (if any) for Classifiers of which it is a member. The
interpretation of this is left open but this could be mapped to
implementations such as primary keys for relational database tables or
ID attributes in XML. If multiple Properties are marked as isID
(possibly in generalizing Classifiers) then it is the combination of
the (Property, value) tuples that will logically provide the
uniqueness for any instance. Hence there is no need for any
specification of order and it is possible for some of the Property
values to be empty. If the Property is multivalued then all values are
included.
The notation for this property is similar to that of other constraints
using
{id} after the name and type of the attribute
You don't provide your metamodel, and clearly wrt to each Employee their personelNumber is single valued and so necessarily unique. Presumably it is within some scope such as a Company that the personelNumber should be unique, so the answer is often something like.
context Company
inv UniquePersonelNumber: employees->isUnique(personelNumber)
Two alternative OCL expressions can be found in the following question:
Why allInstance not for isUnique?
In your case, it would be:
context Employee
inv personalNumberUnique : Employee.allInstances() -> isUnique(personalNumber)

How to generated extra annotations on JAXB2 generated Java from XSD

I have the following type of structures in my XSD's..
And this is generating code that enumerations that serialize correctly back-and-forth from XML.
Now, those same XML/SOAP services are being implemented as REST using Jackson and RestEASY. It all works correctly with no further additional settings, except for the enumerations which are constrained values that we want to serialize to those generated Java enums. However, the classes are devoid of JSon annotations, causing them serialize and deserialize the string values of the generated enumerations instead.
What I need it to generate the code with #JsonValue and #JsonCreator so that we can process the enumerations based on their assigned values instead...
How can I modify the JaxB2 generator to have it add add the Json annotations as well? There are several hundred enumerations in the system, so a systemic solution is called for.

Sharp Architecture Value Objects

I'm checking out Sharp Architecture's code. So far it's cool, but I'm having problems getting my head around how to implement DDD value objects in the framework (doesn't seem to be anything mentioning this in the code). I'm assuming the base Entity class and Repository base are to be used for entities only. Any ideas on how to implement value objects in the framework?
In Sharp Arch there is a class ValueObject in namespace SharpArch.Domain.DomainModel. This object inherits from BaseObject and overrides the == and != operators and the Equals() and GetHashCode() methods. The method overrides just calls the BaseObject versions of those two methods which in turn uses GetTypeSpecificSignatureProperties() method to get the properties to use in the equality comparison.
Bottom line is that Entity's equality is determined by
Reference equality
Same type?
Id's are the same
Comparison of all properties decorated with the [DomainSignature] attribute
For ValueObjects, the BaseObject's Equals method is used
Reference equality
Same type?
Compare all public properties
This is a little bit simplified, I suggest you get the latest code from github and read through the code in the mentioned 3 classes yourself.
Edit: Regarding persistence, this SO question might help. Other than that, refer to the official NH and Fluent NH documentation
Value objects are simple objects that don't require a base class. (The only reason entities have base classes is to provide equality based on the identity). Implementing a value object just means creating a class to represent a value from your domain. A lot of times value objects should be immutable and provide equality comparison methods to determine equality to other value objects of the same type. Take a look here.

JAXB #XmlSeeAlso being overwritten

I've defined a few types in a common.xsd I have multiple XSDs which have types that extend from the same type in common. When I generate the classes the #XmlSeeAlso attribute keeps getting updated to the most recent xsd being used.
Is it possible to tell the compiler that when the common class is generated there are more than one classes which can extend from it ?

Representing byte array as an XSD schema

What is the best way to represent a byte array as an XSD schema? I have a byte input which I need to parse and to feed to Java objects generated by JAXB out of an XSD schema for future validation. Every piece of information in my input is defined by offset and the length. I would like to attach this information to my elements so I could then read it from generated classes and use for parsing. The only way to attach such additional information to an Element I can think of is representing every Element as a Complex Type and then adding attributes to the complex Element and restrictions – to the simple Element wrapped by this complex Element. The problem with this approach (in addition to the Schema looking messy) is that JAXB will create separate class for every Element (Complex Type). And I will have a lot of fields in my input. :) The second issue is that I will in fact attach attributes and restrictions (which I need for validation) to different elements (wrapped simple element and the complex wrapper). So I will need to find a way to figure out that they in fact represent the same piece of information. I hope all this make sense. :) Basically my question is: can you think of a more elegant way to attach position and length information to an XSD element that represents the corresponding piece of a byte array? Thanks!
What is the best way to represent a
byte array as an XSD schema? I have a
byte input which I need to parse and
to feed to Java objects generated by
JAXB out of an XSD schema for future
validation.
JAXB will convert a byte[] to/from elements and attributes of type xsd:base64Binary.
For information on starting from XML schema see:
http://bdoughan.blogspot.com/2011/05/schema-to-java-xmlmimetype.html
For information on starting from Java classes see:
http://bdoughan.blogspot.com/2011/03/jaxb-web-services-and-binary-data.html

Resources