= jaxb =
 * http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/1.5/tutorial/doc/JAXBUsing.html
 * With JAXB you can:
  * Generate JAXB Java classes from an XML schema
  * Use schema-derived JAXB classes to unmarshal and marshal XML content in a Java application
  * Create a Java content tree from scratch using schema-derived JAXB classes
  * Validate XML content during unmarshalling and at runtime
  * Customize JAXB schema-to-Java bindings

== XSD data types ==
 * http://docs.oracle.com/javaee/5/tutorial/doc/bnazq.html
|| '''XSD type''' || '''Java type''' ||
||xsd:string || java.lang.String||
||xsd:integer || java.math.BigInteger||
||xsd:int || int||
||xsd.long || long||
||xsd:short || short||
||xsd:decimal || java.math.BigDecimal||
||xsd:float || float||
||xsd:double || double||
||xsd:boolean || boolean||
||xsd:byte || byte||
||xsd:QName || javax.xml.namespace.QName||
||xsd:dateTime || javax.xml.datatype.XMLGregorianCalendar||
||xsd:base64Binary || byte[]||
||xsd:hexBinary || byte[]||
||xsd:unsignedInt || long||
||xsd:unsignedShort || int||
||xsd:unsignedByte || short||
||xsd:time || javax.xml.datatype.XMLGregorianCalendar||
||xsd:date || javax.xml.datatype.XMLGregorianCalendar||
||xsd:g || javax.xml.datatype.XMLGregorianCalendar||
||xsd:anySimpleType || java.lang.Object||
||xsd:anySimpleType || java.lang.String||
||xsd:duration || javax.xml.datatype.Duration||
||xsd:NOTATION || javax.xml.namespace.QName||

== xjc command generation example ==
{{{#!highlight sh
cd /tmp
mkdir -p xjctest/xsd
cd xjctest
}}}

nano simple.xjb
{{{#!highlight xml
<jaxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
           xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
           jaxb:extensionBindingPrefixes="xjc"
           jaxb:version="2.0">
  <jaxb:globalBindings generateValueClass="true">
    <xjc:simple />
    <xjc:serializable uid="12343"/> <!-- marks generated class as Serializable-->
    <jaxb:javaType name="java.util.Calendar" xmlType="xs:dateTime"
      parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime"
      printMethod="javax.xml.bind.DatatypeConverter.printDateTime" />
  </jaxb:globalBindings>
</jaxb:bindings>
}}}

'''nano xsd/test.xsd'''
{{{#!highlight xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="test" type="Test"/>
  <xs:complexType name="Test">
    <xs:sequence>
      <xs:element name="name" type="xs:string" minOccurs="0"/>
      <xs:element name="birthDate" type="xs:dateTime" minOccurs="0"/>
      <xs:element name="dummyInt" type="xs:int" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>
}}}

Run command 
{{{#!highlight sh
xjc xsd/test.xsd -b simple.xjb -extension -npa
}}}
{{{
parsing a schema...
compiling a schema...
generated/ObjectFactory.java
generated/Test.java
org/w3/_2001/xmlschema/Adapter1.java
}}}

To generate a proper Date it might be necessary to use an adapter for xjb. 

== Generate Java classes with Maven, xjc and XSD ==
{{{#!highlight sh
 * mkdir -p /tmp/xjctest/src/main/resources
}}}
=== pom.xml ===
{{{#!highlight xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.allowed.bitarus</groupId>
  <artifactId>xjctest</artifactId>
  <version>0.1.0</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <version>0.11.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>generate</goal>
                        </goals>                        
                    </execution>
                </executions>
                <configuration>
                        <schemaDirectory>src/main/resources</schemaDirectory>
                        <schemaIncludes>
                            <include>*.xsd</include>
                        </schemaIncludes>
                        <bindingDirectory>src/main/resources</bindingDirectory>
                        <bindingIncludes>
                            <include>*.xjb</include>
                        </bindingIncludes>                   
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
}}}
 * Copy test.xsd and and simple.xjb to /tmp/xjctest/src/main/resources
 * run mvn clean install
 * The source code is created in /tmp/xjctest/target/generated-sources/xjc/ 

== Generate classes with jaxb in Java 17 ==

Will generate files to src/main/java with package test.org.types.Client from the xsd file.
 * test/org/types/Client.java
 * test/org/types/ObjectFactory.java
 * org/w3/_2001/xmlschema/Adapter1.java

{{{#!highlight sh
cd ~
wget https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-ri/4.0.2/jaxb-ri-4.0.2.zip
yum install unzip 
unzip jaxb-ri-4.0.2.zip
jaxb-ri/bin/xjc.sh
mkdir ~/xjctest
cd xjctest
mkdir -p src/main/resources
mkdir -p src/main/java
~/jaxb-ri/bin/xjc.sh src/main/resources/test.xsd -b src/main/resources/simple.xjb -d src/main/java -p org.example -extension -npa
}}}

=== pom.xml  ===
{{{#!highlight xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.allowed.bitarus</groupId>
  <artifactId>xjctest</artifactId>
  <version>0.1.0</version>
  <dependencies>
    <dependency>
      <groupId>jakarta.xml.bind</groupId>
      <artifactId>jakarta.xml.bind-api</artifactId>
      <version>4.0.0</version>
    </dependency>
    <dependency>
      <groupId>javax.xml.bind</groupId>
      <artifactId>jaxb-api</artifactId>
      <version>2.3.1</version>
    </dependency>
  </dependencies>
</project>
}}}

=== src/main/resources/simple.xjb ===
{{{#!highlight xml
<jaxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:jaxb="https://jakarta.ee/xml/ns/jaxb"
           xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
           jaxb:extensionBindingPrefixes="xjc"
           jaxb:version="3.0">
  <jaxb:globalBindings generateValueClass="true">
    <xjc:simple />
    <xjc:serializable uid="12343"/> <!-- marks generated class as Serializable-->
    <jaxb:javaType name="java.util.Calendar" xmlType="xs:dateTime"
      parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime"
      printMethod="javax.xml.bind.DatatypeConverter.printDateTime" />
  </jaxb:globalBindings>
</jaxb:bindings>
}}}

=== src/main/resources/test.xsd ===
{{{#!highlight xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://org.test/types" >
  <xs:complexType name="Client">
    <xs:sequence>
      <xs:element name="name" type="xs:string" minOccurs="0"/>
      <xs:element name="creationDate" type="xs:dateTime" minOccurs="0"/>
      <xs:element name="id" type="xs:int" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>
}}}