Avançar para a área de conteúdo

ir para o conteúdo principal

developerWorks Brasil  >  Software livre  >

JiBX 1.2, Parte 2: Esquema XML para Código Java

Gerar código Java customizado mais limpo a partir do esquema XML

developerWorks
Ir para a página anteriorPágina 3 de 14 Ir para a próxima página

Opções de documento

Código de amostra


Classificar este tutorial

Ajude-nos a melhorar este conteúdo


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>



Voltar para parte superior


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
Esquema para geração da construção de saída Ant

Você também pode executar CodeGen diretamente a partir do console. Para fazer isso, você precisa:

  1. Incluir o jibx-tools.jar em seu caminho de classe Java.
  2. Especificar org.jibx.schema.codegen.CodeGen como a classe a ser executada.
  3. 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.



Voltar para parte superior


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.



Voltar para parte superior



Ir para a página anteriorPágina 3 de 14 Ir para a próxima página