|
Arquivo de Códigos - Página Inicial
|
| Você
está aqui:
Inicio
-> Tutoriais
-> Apache Ant |
|
|
Como validar a entrada do usuário
em um arquivo de build (como estender a classe Task do Ant) |
No exemplo
anterior vimos como é possível efetuar uma
tarefa baseada em um valor informado pelo usuário durante
a execução do arquivo de build. No entanto, a
prática tem mostrado que nem sempre é uma boa
idéia confiar nos valores fornecidos pelos usuários.
Programadores experientes sempre validam os dados recebidos
antes de os fornecerem para processamento.
Sabemos que tanto o Linux quanto o Windows impõem algumas
regras para os nomes de diretórios. No Windows os caracteres
"\", "/", "*" e outros não
são permitidos. Porém o espaço é
permitido. No Linux qualquer nome de diretório contendo
caracteres especiais ou espaços é considerado
inválido.
Nosso próximo exemplo é bem avançado no
sentido que mostra a você como estender a classe Task,
uma das muitas classes que acompanham a ferramenta Ant. O fato
de você ser capaz de estender ou implementar as muitas
classes e interfaces do Ant possibilitará a você
maior poder sobre a ferramenta. Não se surpreenda se,
em pouco tempo, você estiver criando suas próprias
tarefas.
O primeiro passo para a execução do exemplo proposto
é escrever a classe Java que estende a classe Task.
Veja a listagem seguinte:
Listagem para Validar.java
(clique para baixar): import
org.apache.tools.ant.*;
import java.util.regex.*;
public class Validar extends Task{
String message;
Pattern p;
Matcher m;
public void setMessage(String msg){
message = msg;
}
public void execute() throws BuildException{
if(message ==
null){
throw
new BuildException("O atributo 'message' deve ser
devidamente
informado.");
}
log("Validando a string informada");
p = Pattern.compile("[_0-9a-z]*");
m = p.matcher(message);
getProject().setProperty("isvalid",
Boolean.toString(m.matches()));
}
}
Como estamos importando classes presentes no pacote org.apache.tools.ant.*,
esta classe deverá ser compilada da seguinte forma:
C:\testes>javac
-classpath c:\ant\lib\ant.jar Validar.java
No momento ainda não vamos entender os detalhes desta
classe. Vamos escrever o arquivo de build que nos permitirá
testá-la. Crie o seguinte arquivo build.xml:
<project name="teste" basedir="."
default="dir"> <property
name="isvalid" location="true"/>
<taskdef
name="validar" classname="Validar">
<classpath
path="${basedir}" /> </taskdef>
<target
name="dir"> <input
message="Forneca
um nome para o diretorio a ser criado e
pressione Enter:" addproperty="diretorio"
/> <validar
message="${diretorio}" /> <condition
property="sair"> <equals
arg1="false" arg2="${isvalid}" />
</condition>
<fail
if="sair">O nome do diretorio a ser criado
nao
e valido.</fail> <mkdir
dir="${diretorio}" /> </target>
</project>
Execute este arquivo a partir do diretório de testes
e forneça o valor "estudos_ant" para o diretório
a ser criado. O resultado será o mesmo mostrado abaixo:
C:\testes>ant
Buildfile: build.xml
dir:
[input] Forneca um nome para o diretorio
a ser criado e
pressione Enter:
estudos_ant
[validar] Validando a string informada
[mkdir] Created dir: C:\testes\estudos_ant
BUILD SUCCESSFUL
Total time: 4 seconds
Experimente agora com o valor "java 2" (com um espaço
entre "java" e "2"). Veja o resultado:
C:\testes>ant
Buildfile: build.xml
dir:
[input] Forneca um nome para o diretorio
a ser criado e
pressione Enter:
java 2
[validar] Validando a string informada
BUILD FAILED
C:\testes\build.xml:20: O nome do diretorio a ser criado nao
e valido.
Total time: 3 seconds
Experimente um pouco mais, fornecendo nomes com acentos e espaços.
Certifique-se de que o código está funcionando
como pretendido e vamos começar nossa analise detalhada
tanto da classe Validar quanto do arquivo build.xml.
Para um perfeito entendimento da explicação a
seguir você devera manter aberto os dois arquivos (Validar.java
e build.xml). Observe a definição
da propriedade isvalid no arquivo de build:
<property name="isvalid"
location="true"/>
Esta propriedade é de muita importância para o
que pretendemos. Mantenha a em mente enquanto prosseguimos.
Observe agora a tarefa: <taskdef
name="validar" classname="Validar">
<classpath path="${basedir}"
/>
</taskdef>
Esta tarefa serve para adicionar uma tarefa definida pelo usuário
ao arquivo de build. Seria algo como "um tipo definido
pelo usuário" do Ant. Veja que esta tarefa possui
três argumentos. São eles:
a) name = Define o nome pelo qual a tarefa
será conhecido no arquivo de build;
b) classname = Indica o nome da classe na qual
a tarefa é implementada;
c) classpath = É o caminho completo
para o arquivo .class em que a tarefa é
implementada. No nosso exemplo usamos o diretório atual,
mas, a classe poderia muito bem fazer parte de um pacote.
Observe agora o trecho que solicita ao usuário que informe
um nome para o diretório a ser criado: <input
message="Forneca um nome para o
diretorio a ser criado
e pressione Enter:"
addproperty="diretorio" />
Assim que o usuário informar o valor e pressionar Enter,
o valor informado será armazenado na propriedade "diretorio".
E é aqui que o código começa a ficar interessante.
Veja o trecho seguinte: <validar
message="${diretorio}" />
Aqui nós definimos uma chamada à tarefa validar
(que representa nossa classe personalizada) e fornecemos o valor
informado pelo usuário para a propriedade message.
Hora de analisarmos a classe personalizada para entender o que
acontece agora. Logo após a abertura da classe Validar
temos a definição de três membros de classe:
String message;
Pattern p;
Matcher m;
A variável message será usada
para recebermos o valor enviado à classe personalizada
por meio da propriedade message da tarefa validar
no arquivo de build. As variáveis p
e m representarão instancias das classes
Pattern e Matcher do pacote
java.util.regex.*. Expressões regulares não é
o objetivo deste tutorial, de modo que a funcionalidade destas
classes não será discutida. No momento desta leitura
provavelmente teremos um tutorial sobre expressões regulares
em nosso site. Caso você sinta a necessidade de se aprofundar
no assunto, clique aqui e faça
uma pesquisa.
Quando a classe Validar é instanciada
temos uma chamada ao seu método setMessage.
Este método requer uma string e nos permite receber o
valor da propriedade message do arquivo de build: public
void setMessage(String msg){
message = msg;
}
Em seguida o método execute da classe
Validar é disparado: public
void execute() throws BuildException{
if(message == null){
throw new BuildException("O
atributo 'message' deve ser
devidamente
informado.");
}
log("Validando a string informada");
p = Pattern.compile("[_0-9a-z]*");
m = p.matcher(message);
getProject().setProperty("isvalid",
Boolean.toString(m.matches()));
}
Este método dispara uma exceção do tipo
BuildException. Esta exceção
causa a interrupção imediata da execução
do arquivo de build. No trecho: if(message
== null){
throw new BuildException("O atributo
'message' deve ser
devidamente
informado.");
}
Nós testamos se a variável message
ainda é nula. Isso pode acontecer se o valor para o atributo
message da tarefa validar não foi fornecido no arquivo
de build. É importante perceber que, se o atributo message
da tarefa não for definido, a chamada ao método
setMessage não acontecerá.
Em seguida enviamos um trecho de texto para o console usando
o método log da classe Task:
log("Validando
a string informada");
O passo seguinte é testar se o valor informado pelo usuário
é válido. A linha: p
= Pattern.compile("[_0-9a-z]*");
faz uma chamada ao método compile da classe Pattern
para compilar a expressão regular fornecida e atribuir
o resultado à referência p. Este
expressão regular aceitará qualquer quantidade
de caracteres de "a" a "z" (minúsculos),
de 0 a 9 e o caractere "underline". Assim, a linha
seguinte: m
= p.matcher(message);
faz uma chamada ao método matcher da classe Pattern
e atribui o resultado da comparação entre a expressão
regular e o valor que estamos validando, na referencia a um
objeto da classe Matcher. A linha final:
getProject().setProperty("isvalid",
Boolean.toString(m.matches()));
Faz uma chamada ao método getProject
da classe Task para obter uma referencia ao
projeto Ant sendo executado. De posse desta referencia, uma
chamada ao método setProperty nos permite
manipular o valor da propriedade isvalid definida
no arquivo de build. Esta propriedade assumirá o resultado
de uma chamada ao método matches da
classe Matcher. Este resultado é do
tipo Boolean, de forma que devemos efetuar uma chamada a
Boolean.toString para transformar o resultado em string
e assim atribuí-lo corretamente ao atributo isvalid.
De volta ao arquivo build.xml podemos ver o
elemento condition que testa o valor da propriedade
isvalid. Se este valor for false, a execução
do build é interrompida. <condition property="sair">
<equals arg1="false" arg2="${isvalid}"
/> </condition> <fail if="sair">O
nome do diretorio a ser criado
nao e valido.</fail>
Se você entendeu todos os passos necessários à
realização deste exemplo, está no caminho
certo para a construção de tarefas personalizadas
para o Ant. Para fechar o estudo recomendo que você investigue
as várias tarefas disponíveis no Ant e experimente
agora criar suas próprias tarefas. As possibilidades
são imensas.
Caso deseje discutir o conteúdo deste tutorial basta
enviar sua mensagem para Osmar J. Silva a partir
da nossa página
de contatos. |
Este tutorial contém as seguintes
seções:
- Apresentação
- O que é o Apache Ant?
- Baixando e Instalando o Apache
Ant
- Entendendo alvos, tarefas e
o arquivo build.xml
- Criando diretórios e
copiando arquivos usando Ant
- Usando variáveis durante
o processo de automação de tarefas
- Como compilar arquivos Java
usando Ant
- Uso do Ant na execução
de aplicativos Java
- Exibindo mensagens durante o
processo de automação das tarefas
- Empacotando aplicações
web com o uso da tarefa War
- Usando a tarefa Unwar para
extrair o conteúdo de um arquivo War
- Como gerar arquivos JAR usando
Ant
- Interagindo com o Ant via console
durante a execução dos arquivos de build
- Como obter valores via console
durante a execução de um build Ant
- Como validar a entrada do usuário em um
arquivo de build (como estender a classe Task do Ant)
|
|
| |
|
| |
|