 | Introduzindo Cistomizações de CodeGen
Nesta seção, você aprenderá o básico da customização de CodeGen para controlar a estrutura do código gerado a partir de um esquema simples.
Um Exemplo de Customização Simples
CodeGen suporta customizações extensivas para muitos aspectos de geração de código e de ligação. O conjunto de customizações a serem aplicadas é passado para CodeGen como um documento XML, com elementos aninhados relacionados a esquemas ou componentes de esquemas. A Listagem 5 fornece um exemplo simples:
Listagem 5. Exemplo de Customizações Simples
<schema prefer-inline="true" show-schema="false" enumeration-type="simple"
generate-all="false" includes="order item"/> |
A customização da Listagem 5 consiste em um único elemento de esquema sem espaço de nome com diversos atributos diferentes que fornecem as customizações específicas a serem aplicadas.
(Até o momento, você está trabalhando somente com uma única definição de esquema, portanto, essa forma de customização muito simples pode ser usada.
Posteriormente neste tutorial, você verá exemplos de customizações para trabalhar com diversos esquemas.) O primeiro atributo de customização — prefer-inline="true" — indica CodeGen para definições de esquema sequencial que são referidas somente uma vez, em vez de usar o comportamento padrão de mantê-las como classes separadas. O segundo atributo — show-schema="false" — bloqueia a integração das definições de esquema nos Javadocs de classe. enumeration-type="simple" gera enumerações typesafe simples,em vez de enumerações Java 5.
O par final de atributos funciona junto. CodeGen, por padrão, gera uma classe de nível superior separada para cada definição de tipo global nos esquemas especificados como entrada, juntamente com um mapeamento abstrato correspondente na ligação JiBX gerada para cada complexType. O atributo generate-all="false" altera esse comportamento padrão, gerando, explicitamente, somente os complexTypes incluídos especificamente ou referidos a partir de um tipo incluído. O atributo includes="order item" fornece, então, os nomes a serem gerados, que foram escolhidos para manter a compatibilidade com o programa de teste — o elemento <order> é necessário, pois esse é o elemento-raiz dos documentos da instância e o item complexType é necessário, pois o programa de teste espera localizar uma classe separada de nível superior para esse tipo quando soma o valor total do pedido.
Você pode testar essas customizações usando a tarefa Ant custgen em vez de a tarefa codegen (ou simplesmente usar a tarefa full , que executa a sequência completa de destinos clean custgen compile bind run). A Listagem 6 mostra trechos do código gerado, que você pode comparar ao código gerado padrão mostrado na Listagem 2. As grandes diferenças (além dos Javadocs de classe simplificados) são que a classe Customer agora é sequencial e a classe Shipping agora é uma classe interna que usa uma classe de enumeração typesafe customizada.
Listagem 6. Código Gerado com Customização
/**
* Informações do pedido.
*/
public class Order
{
private long orderNumber;
private long customerCustomerNumber;
private String customerFirstName;
private String customerLastName;
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;
...
/**
* Métodos de remessa 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.
*/
public static class Shipping
{
private final String value;
public static final Shipping STANDARD_MAIL = new Shipping(
"STANDARD_MAIL");
public static final Shipping PRIORITY_MAIL = new Shipping(
"PRIORITY_MAIL");
public static final Shipping INTERNATIONAL_MAIL = new Shipping(
"INTERNATIONAL_MAIL");
public static final Shipping DOMESTIC_EXPRESS = new Shipping(
"DOMESTIC_EXPRESS");
public static final Shipping INTERNATIONAL_EXPRESS = new Shipping(
"INTERNATIONAL_EXPRESS");
private static final String[] values = new String[]{"DOMESTIC_EXPRESS",
"INTERNATIONAL_EXPRESS", "INTERNATIONAL_MAIL", "PRIORITY_MAIL",
"STANDARD_MAIL"};
private static final Shipping[] instances = new Shipping[]{
DOMESTIC_EXPRESS, INTERNATIONAL_EXPRESS, INTERNATIONAL_MAIL,
PRIORITY_MAIL, STANDARD_MAIL};
private Shipping(String value) {
this.value = value;
}
public String toString() {
return value;
}
public static Shipping convert(String value) {
int index = java.util.Arrays.binarySearch(values, value);
if (index >= 0) {
return instances[index];
} else {
return null;
}
}
public static Shipping fromValue(String text) {
Shipping value = convert(text);
if (value == null) {
throw new IllegalArgumentException("Value \'" + text
+ "\' is not allowed");
} else {
return value;
}
}
}
} |
Muitas customizações adicionais estão disponíveis para uso com CodeGen. Você verá alguns exemplos disso posteriormente neste tutorial, mas para ter uma melhor ideia do poder dessas customizações, é necessário seguir para um esquema mais complexo.
|  |