Arquivo de Códigos - Página Inicial
Códigos-fonte
» Boletos Bancários
» Calendário de Eventos
Linguagens
» ActionScript
» Adobe AIR
» Adobe Flex
» AJAX
» C
» C#
» C++
» CSS
» Delphi
» DHTML - Dynamic HTML
» HTML/XHTML
» Java
» JavaFX
» JavaScript
» Java Servlets
» JSP - Java Server Pages
» Perl
» PHP
» PHP-GTK
» Python
» Ruby
» Tcl/Tk
» VB.NET
Bancos de Dados
» IBM DB2
» MySQL
Frameworks
» CodeIgniter
» jQuery
» JSF - Java Server Faces
» Qt
» Ruby On Rails
» Struts
» Struts 2
» wxWidgets
» Zend Framework
Container/Servidor
» Apache Tomcat
» Apache Web Server
Ferramentas
» Apache Ant
» iTextSharp (iText#)
Referências
» CSS1 e CSS2
» JavaScript
Serviços On-Line
» Qual é meu IP?
» Tabela Cores HTML I
» Tabela Cores HTML II
» Lista de Mime Types
» Códigos Teclas Virtuais
Usuários On-Line
Visitantes: 25
PHP
O que há de novo no PHP 5?
40 dicas e truques sobre como trabalhar com datas e horas em PHP
60 dicas e truques sobre como trabalhar com strings e caracteres em PHP
PHP e a Orientação a Objetos - POO (Curso Completo)

DHTML
Curso completo de DHTML para iniciantes

CSS
Como definir uma imagem de fundo fixa na página
Definindo uma imagem de fundo para botões HTML
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:
  1. Apresentação
  2. O que é o Apache Ant?
  3. Baixando e Instalando o Apache Ant
  4. Entendendo alvos, tarefas e o arquivo build.xml
  5. Criando diretórios e copiando arquivos usando Ant
  6. Usando variáveis durante o processo de automação de tarefas
  7. Como compilar arquivos Java usando Ant
  8. Uso do Ant na execução de aplicativos Java
  9. Exibindo mensagens durante o processo de automação das tarefas
  10. Empacotando aplicações web com o uso da tarefa War
  11. Usando a tarefa Unwar para extrair o conteúdo de um arquivo War
  12. Como gerar arquivos JAR usando Ant
  13. Interagindo com o Ant via console durante a execução dos arquivos de build
  14. Como obter valores via console durante a execução de um build Ant
  15. Como validar a entrada do usuário em um arquivo de build (como estender a classe Task do Ant)
 
 
Arquivo de Códigos - Página Inicial
Veja dicas, truques e anotações de AJAX
Veja dicas, truques e anotações de outras linguagens
PHP - Obter o número da semana de uma determinada data
C# (CSharp) - Como obter a quantidade de elementos em um array
ActionScript - Transformando em letras maiúsculas apenas as iniciais de cada palavra em uma string
ActionScript - Aprenda a construir datas em ActionScript
JSP (Java Server Pages) - Alterando o valor guardado em um cookie
C# (CSharp) - Como escrever um laço for infinito
C++ - Controlando o acesso a membros de uma classe C++ usando o modificar public
jQuery - Como selecionar todos os elementos HTML de uma determinada tag e executar alguma ação envolvendo todos eles
Java - Aplicando um filtro de arquivos a um JFileChooser
Delphi - Inserir uma checkbox em uma caixa de diálogo


http://www.arquivodecodigos.net
:: Arquivo de Códigos - Softwares e Consultoria em Programação ::
Todo o conteúdo deste site, quando não devidamente observado, pertence a seus idealizadores e não
poderá ser usado para outras finalidades senão estudo e aprimoramento de técnicas de programação.
Certifique-se de ler as notas legais antes de proceder com o acesso e leitura do
conteúdo disponibilizado nestas páginas.

Fale Conosco: (62) 3261-7018 / (62) 8185-0734

Desenvolvedor Responsável: Osmar J. Silva

Página Inicial Contatos Pesquisar Mapa do Site