Precisa de um freelancer, códigos-fonte e exemplos completos?
Bem-vindo(a) ao meu site. Além de realizar alguns serviços como freelancer eu tenho alguns códigos-fonte e exemplos completos de Java, Delphi, PHP, Python, C/C++, Hibernate, JPA, Spring, JSP, Servlets, Ruby, Ruby On Rails e muitas outras linguagens e frameworks. Veja como falar comigo clicando aqui.
 
Arquivo de Códigos - Página Inicial
Códigos-fonte
» Códigos-fonte e exemplos completos
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: 122
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 DHTML (Dynamic HTML)
Como obter o elemento pai de um determinado elemento usando parentNode
Aprenda a criar botões (button) dinâmicamente
Como listar todas as propriedades e eventos disponíveis para um elemento HTML
Entenda a propriedade innerHTML
Usando o método getElementsByTagName
Entenda a propriedade parentNode
Aprenda a usar o método getElementById
Veja dicas, truques e anotações de outras linguagens
Java Servlets - Obtendo a URL completa da requisição atual
Java - Selecionar múltiplos arquivos em um JFileChooser
Perl - Usando o laço for da linguagem Perl
VB.NET - Como verificar a desigualdade de duas strings usando o operador <>
Java - Como interromper a execução de uma thread
C - Escrevendo palavras ou textos em um arquivo usando a função fputs()
Java - Aprenda a adicionar elementos em uma Stack
C - Implementando uma função strtoupper com retorno char*
PHP - Entendendo o tipo de dados resource (recurso) do PHP
C# (CSharp) - Como validar o conteúdo de uma caixa de texto usando o evento Validating da classe Control

       

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