Clássico "Hello World" com JColtrane
Agora faremos alguns processamentos usando o mesmo documento XML da seção anterior. Faremos isso em passos, de forma que você possa revê-los quando estiver usando JColtrane em suas aplicações.
Passo 1 - Criando uma Classe
Criemos uma classe com alguns métodos que você deseja executar durante o processamento do documento XML:
public class HelloWorld {
public void executeInStartDocument(){
System.out.println("Hello World!!!\n");
}
public void executeInEndDocument(){
System.out.println("Bye bye World!!!\n");
}
public void executeInStartElement(){
System.out.println("Executing something in start element\n");
}
public void executeInEndElement(){
System.out.println("Executing something in end element\n");
}
}
Escrevemos os métodos com nomes indicando quando desejamos executá-los somente por propósitos didáticos. É claro que você pode colocar qualquer nome nos métodos de sua aplicação.
Passo 2 - Definindo Condições
Agora que temos nossa classe , vamos dizer ao JColtrane quando executar os métodos:
public class HelloWorld {
@StartDocument
public void executeInStartDocument(){
System.out.println("Hello World!!!\n");
}
@EndDocument
public void executeInEndDocument(){
System.out.println("Bye bye World!!!\n");
}
@StartElement
public void executeInStartElement(){
System.out.println("Executing something in start element\n");
}
@EndElement
public void executeInEndElement(){
System.out.println("Executing something in end element\n");
}
}
Como você pode notar, apenas anotamos os método dizendo ao JColtrane quando executá-los. Essas 4 annotations (StartDocument, EndDocument, StartElement e EndElement) são as condições básicas do JColtrane. Veremos brevemente, em detalhes, como utilizá-las e como criar condições sofisticadas.
Passo 3 - Passando a Classe Criada como Parâmetro no Construtor do JColtraneXMLHandler
Agora temos uma classe nos quais o métodos estão devidamente anotados. Vamos entregar uma instância da classe HelloWorld para o JColtraneXMLHandler, classe que faz a mágica acontecer. Faremos isso na classe JColtraneHandlerTest, que é similar a SAXHandlerTest vista na seção anterior, modificando somente uma linha de código, que está marcada abaixo:
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class JColtraneHandlerTest {
public static void main(String[] args) {
SAXParser parser=null;
try {
parser= SAXParserFactory.newInstance().newSAXParser();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
File file=new File("examples\\example1\\Example1.xml");
if(parser!=null){
InputSource input=new InputSource(file.getAbsolutePath());
try {
parser.parse(input,new JColtraneXMLHandler(new HelloWorld()));
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Assim, depois de definir em quais condições executar os métodos, passando HelloWorld como parâmetro para JColtraneXMLHandler, usamos o handler do JColtrane exatamente como usamos o handler SAXHandler para processar o documento XML. A resposta do sistema quando se rodou o teste foi:
Hello World!!!
Executing something in start element
Executing something in start element
Executing something in start element
Executing something in end element
Executing something in end element
Executing something in end element
Bye bye World!!!
Nesse ponto, você pode pensar: "Tudo bem, fiz o JColtrane executar os métodos da forma que desejava, mas lembro do exemplo apresentado na seção passada que o sistema imprimia o galho corrente do XML bem como o seu corpo. Como eu posso acessar os parâmetros que necessito?". Assim, para reponder sua excelente pergunta, vamos ao passo 4.
Passo 4 - Escolhendo exatamente os Parâmetros que necessito
Quando se usa o SAX você precisa acessar alguns parâmetros que você pode usar para realizar seu processamento. Por exemplo, na seção anterior queríamos construir um galho corrente e o corpo dos elementos. Vamos fazer algumas mudanças na classe HelloWord. Essas mudanças estão destacadas:
public class HelloWorld {
@StartDocument
public void executeInStartDocument(){
System.out.println("Hello World!!!\n");
}
@EndDocument
public void executeInEndDocument(){
System.out.println("Bye bye World!!!\n");
}
@StartElement
public void executeInStartElement(@CurrentBrunch String currentBrunch){
System.out.println(currentBrunch);
System.out.println("Executing something in start element\n");
}
@EndElement
public void executeInEndElement(@CurrentBrunch String currentBrunch,@Body(tab=false, newLine=false) String body){
System.out.println(currentBrunch);
if(body.length()!=0)
System.out.println(body);
System.out.println("Executing something in end element\n");
}
}
Preste atenção nos parâmetros. Colocamos algumas anotações neles dizendo ao JColtrane quais parâmetros queríamos acessar. Ele é esperto o suficiente para nos dar os corretos.
Algumas conclusões
Nesse ponto, você pode pensar: "Esse pessoal pensa que não sou esperto, colacaram um exemplo específico somente para me convencer que o JColtrane é bom". O propósito desse pequeno exemplo foi somente dar ao leitor uma pequena noção do que o framework faz. Nossa intenção foi começar a responder as 4 questões do homesite do JColtrane:
- Por que o SAX não apresenta algumas condições padrão, me fornecendo uma uma maneira fácil para criar as minhas próprias condições, fazendo com que eu não precise codificar vários e entediantes blocos if/elses e, portanto, tornando a manutenção mais simples?
- Por que o SAX não mantem algumas informações sobre elementos passados para me ajudar, me economizando trabalho e tempo?
- Por que, quando se usa o SAX, tenho que extender uma classe (DefaultHandler), implementando métodos com vários parâmetros,uma vez que eu não preciso de todos eles, ou não preciso de todos os métodos implementados?
- Como faço um processo de análise XML extensível?
Com os conceitos apresentados nessa seção, iremos ao fundo das questões acima nas seções que se seguem. Comece com Anotações Básicas de Condição