Gerando Ligação Padrão e Código a partir do Esquema
É fácil gerar uma definição de ligação JiBX e o código Java correspondente, a partir de uma definição de esquema XML. Você aprenderá como nesta seção.
Introduzindo o Esquema de Exemplo Simples
Como um exemplo simples, iniciarei com um dos esquemas gerados na Parte 1. A Listagem 1 mostra uma versão abreviada desse esquema, que pretende representar um pedido de uma loja on-line. O esquema integral é fornecido como starter.xsd no diretório dwcode2 do código de amostra.
Listagem 1. Primeiro Esquema de Exemplo
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://jibx.org/starter" elementFormDefault="qualified"
targetNamespace="http://jibx.org/starter">
<xs:simpleType name="shipping">
<xs:annotation>
<xs:documentation>Supported shipment methods. The "INTERNATIONAL" shipment
methods can only be used for orders with shipping addresses outside the U.S., and
one of these methods is required in this case.</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:enumeration value="STANDARD_MAIL"/>
<xs:enumeration value="PRIORITY_MAIL"/>
<xs:enumeration value="INTERNATIONAL_MAIL"/>
...
</xs:restriction>
</xs:simpleType>
<xs:complexType name="item">
<xs:annotation>
<xs:documentation>Order line item information.</xs:documentation>
</xs:annotation>
<xs:sequence/>
<xs:attribute type="xs:string" use="required" name="id">
<xs:annotation>
<xs:documentation>Stock identifier. This is expected to be 12 characters in
length, with two leading alpha characters followed by ten decimal digits.
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute type="xs:int" use="required" name="quantity">
<xs:annotation>
<xs:documentation>Number of units ordered.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute type="xs:float" use="required" name="price">
<xs:annotation>
<xs:documentation>Price per unit.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
<xs:complexType name="address">
<xs:annotation>
<xs:documentation>Address information.</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element type="xs:string" name="street1">
<xs:annotation>
<xs:documentation>First line of street information (required).
</xs:documentation>
</xs:annotation>
</xs:element>
...
</xs:sequence>
<xs:attribute type="xs:string" name="state">
<xs:annotation>
<xs:documentation>State abbreviation (required for the U.S. and Canada,
optional otherwise).</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute type="xs:string" name="postCode">
<xs:annotation>
<xs:documentation>Postal code (required for the U.S. and Canada, optional
otherwise).</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
<xs:complexType name="customer">
<xs:annotation>
<xs:documentation>Customer information.</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element type="xs:long" name="customerNumber"/>
...
</xs:sequence>
</xs:complexType>
<xs:element type="tns:order" name="order"/>
<xs:complexType name="order">
<xs:annotation>
<xs:documentation>Order information.</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element type="xs:long" name="orderNumber"/>
<xs:element type="tns:customer" name="customer"/>
<xs:element type="tns:address" name="billTo">
<xs:annotation>
<xs:documentation>Billing address information.</xs:documentation>
</xs:annotation>
</xs:element>
...
<xs:element type="tns:item" name="item" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute type="xs:date" use="required" name="orderDate">
<xs:annotation>
<xs:documentation>Date order was placed with server.</xs:documentation>
</xs:annotation>
</xs:attribute>
...
</xs:complexType>
</xs:schema>
|
 |
Gerando a Ligação e o Código Padrão
Para gerar uma ligação de JiBX e classes Java a partir de um esquema XML, você simplesmente precisa executar a ferramenta org.jibx.schema.codegen.CodeGen incluída no jibx-tools.jar a partir da distribuição JiBX. Você pode executar a ferramenta diretamente a partir da linha de comandos ou indiretamente através de uma ferramenta de construção, como Apache Ant.
O download do tutorial inclui um script Ant build.xml com o destino codegen para executar a geração.
Para testar isso, abra um console no diretório dwcode2 do download instalado e digite ant codegen. Se você tiver Ant instalado em seu sistema e tiver instalado o código de download de acordo com as instruções, você deve ver saída semelhante à mostrada na Figura 1:
Figura 1. Usando a Construção Ant
Você também pode executar CodeGen diretamente a partir do console. Para fazer isso, você precisa:
- Incluir o jibx-tools.jar em seu caminho de classe Java.
- Especificar
org.jibx.schema.codegen.CodeGen como a classe a ser executada.
- Listar as definições de esquemas a serem geradas.
O destino codegen Ant fornecido usa dois parâmetros adicionais para indicar a CodeGen para usar o diretório gen/src como a raiz da estrutura do pacote do modelo de dados gerado e para limpar todos os arquivos existentes desse diretório antes de executar a geração. Segue a linha de comando Java para duplicar o destino codegen Ante a partir de um console no diretório dwcode2 (supondo que você tenha seguido as instruções de instalação recomendadas):
java -cp ../lib/jibx-tools.jar org.jibx.schema.codegen.CodeGen -t gen/src -w starter.xsd |
No Windows, o comando é:
java -cp ..\lib\jibx-tools.jar org.jibx.schema.codegen.CodeGen -t gen\src -w starter.xsd |
Você pode passar muitas outras opções para CodeGen a partir da linha de comando. Você dará uma olhada neles posteriormente no tutorial. Agora, vamos dar uma olhada no código Java gerado.
Artefatos Gerados
O código gerado consiste em cinco classes, correspondentes às definições tipo globais no esquema da
Listagem 1 . A Listagem 2 mostra algumas amostras do código gerado, com trechos da classe org.jibx.starter.Order e toda a classe org.jibx.starter.Shipping :
Listagem 2. Código Gerado
/**
* Informações de pedido.
*
* Fragmentos do esquema para essa classe:
* <pre>
* <xs:complexType xmlns:ns="http://jibx.org/starter"
xmlns:xs="http://www.w3.org/2001/XMLSchema" name="order">
* <xs:sequence>
* <xs:element type="xs:long" name="orderNumber"/>
* <xs:element type="ns:customer" name="customer"/>
* <xs:element type="ns:address" name="billTo"/>
* <xs:element type="ns:shipping" name="shipping"/>
* <xs:element type="ns:address" name="shipTo" minOccurs="0"/>
* <xs:element type="ns:item" name="item" minOccurs="0" maxOccurs="unbounded"/>
* </xs:sequence>
* <xs:attribute type="xs:date" use="required" name="orderDate"/>
* <xs:attribute type="xs:date" name="shipDate"/>
* <xs:attribute type="xs:float" name="total"/>
* </xs:complexType>
* </pre>
*/
public class Order
{
private long orderNumber;
private Customer customer;
private Address billTo;
private Shipping shipping;
private Address shipTo;
private List<Item> itemList = new ArrayList<Item>();
private Date orderDate;
private Date shipDate;
private Float total;
...
/**
* Obtenha o valor do elemento 'shipTo'. Informações do endereço de remessa. Se estiver faltando, o
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- Erro XML: A linha anterior não é maior do que o máximo de 90 caracteres ---------|
* endereço para cobrança também é usado como o endereço de remessa.
*/
public Address getShipTo() {
return shipTo;
}
/**
* Configure o valor do elemento 'shipTo'. Informações do endereço de remessa. Se estiver faltando, o
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- Erro XML: A linha anterior não é maior do que o máximo de 90 caracteres ---------|
* endereço para cobrança também é usado como o endereço de remessa.
*/
public void setShipTo(Address shipTo) {
this.shipTo = shipTo;
}
/**
* Obtenha a lista dos itens do elemento 'item'.
*/
public List<Item> getItems() {
return itemList;
}
/**
* Configure a lista de itens do elemento 'item'.
*/
public void setItems(List<Item> list) {
itemList = list;
}
...
}
/**
* Métodos de envio suportados. Os métodos de envio "INTERNATIONAL" podem ser usados somente para
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- Erro XML: A linha anterior não é maior do que o máximo de 90 caracteres ---------|
pedidos com endereços de remessa fora dos EUA e um desses métodos é necessário
nesse caso.
*
* Schema fragment(s) for this class:
* <pre>
* <xs:simpleType xmlns:xs="http://www.w3.org/2001/XMLSchema" name="shipping">
* <xs:restriction base="xs:string">
* <xs:enumeration value="STANDARD_MAIL"/>
* <xs:enumeration value="PRIORITY_MAIL"/>
* <xs:enumeration value="INTERNATIONAL_MAIL"/>
* <xs:enumeration value="DOMESTIC_EXPRESS"/>
* <xs:enumeration value="INTERNATIONAL_EXPRESS"/>
* </xs:restriction>
* </xs:simpleType>
* </pre>
*/
public enum Shipping {
STANDARD_MAIL, PRIORITY_MAIL, INTERNATIONAL_MAIL, DOMESTIC_EXPRESS,
INTERNATIONAL_EXPRESS
} |
Como pode ver na Listagem 2, CodeGen converte a documentação do esquema para Javadocs no código gerado (mostrado aqui como os comentários de orientação em cada Javadoc de classe e como parte dos comentários para os métodos getShipTo() e setShipTo() ). CodeGen, por padrão, também incorpora as definições reais de esquema nos Javadocs de classe e, para os métodos de acesso de propriedade get/set, descreve o componente do esquema que corresponde à propriedade.
Para valores repetidos, como o elemento do item de repetição na definição
complexType do pedido da Listagem 1, CodeGen gera uma lista do tipo Java 5 por padrão.
Para enumerações de restrições simpleType , como o tipo de remessa na Listagem 1, CodeGen gera um tipo de enumeração Java 5 por padrão.
O código gerado para ambas as instâncias é mostrado na Listagem 2.
Ligação JiBX Gerada
Além do código gerado, CodeGen também produz uma definição de ligação JiBX (como o arquivo binding.xml, neste caso), que indica ao compilador de ligação JiBX como fazer a conversão entre as classes Java e XML. As definições de ligação contêm detalhes integrais das conversões a serem feitas por JiBX, portanto, são necessariamente complexas. Felizmente, não é necessário entender a definição de ligação para trabalhar com JiBX usando ligação e geração de código CodeGen, de forma que este tutorial não cobre os detalhes.
|