terça-feira, 5 de agosto de 2014

Hibernate Validator

Que coisa linda é a implementação da JSR-303 !
Esse tal de Hibernate Validator, é muito foda!! Sabe-se lá quantos IF's ele pode evitar que vocês precise escrever, bastando definir annotations para validação dos atributos de sua classe.
A sensação de usar hibernate Validator no meu projeto é mais ou menos assim:

Gastando menos tempo com IF's de validações me sobra mais tempo para tomar cerveja, então vamos ver como implementar uma validação de 'caba homi', porque escrevendo menos aqui, já sabem! Sobra mais tempo para cervejas.

Na classe Receita, eu preciso validar  a quantidade de caracteres de um atributo, e se um outro é nullo. Então defini as constraints  através do annotation @Size, com o valor min, max ,mensagem da validação e @NotEmpty somente com a mensagem.

package com.blogspot.receitastecnologicas.entidade;

import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.NotEmpty;

/**
 *
 * @author receitas tecnologicas
 */
public class Receita {

    @Size(min = 10, max = 255, message = "A descrição da receita deve conter entre 10 e 255 caracteres")
    private String descricao;
    @NotEmpty(message = "Informe o autor!!")
    private String autor;

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.receita = receita;
    }

    public String getAutor() {
        return autor;
    }

    public void setAutor(String autor) {
        this.autor = autor;
    }

}

Agora vamos criar a classe de validação.

No meu objeto a ser validado, vou setar 5 caracters e nullo em seus atributos e depois submete-lo a validação das constraints usando uma instância de Validator.
O Validator retorna um conjunto de ConstraintViolantion (ou vazio, caso não viole nenhuma restrição), que será iterado a fim de exibir os erros . Como estou validando se A descrição da receita deve conter entre 10 e 255 caracteres e se o autor não é nulo, será printado o seguinte texto:
run:
3 [main] INFO org.hibernate.validator.util.Version - Hibernate Validator 4.0.2.GA
-----Erros --------
Campo: autor - ERRO-> Informe o autor!!
Campo: descricao - ERRO-> A descrição da receita deve conter entre 10 e 255 caracteres
CONSTRUÍDO COM SUCESSO (tempo total: 0 segundos)


package com.blogspot.receitastecnologicas;

import com.blogspot.receitastecnologicas.entidade.Receita;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;

/**
 *
 * @author receitas tecnologicas
 */
public class HibernateValidator {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {

            ValidatorFactory factory
                    = Validation.buildDefaultValidatorFactory();
            Validator validator = factory.getValidator();
            //Objeto a ser validado
            Receita receita = new Receita();
            receita.setDescricao("Farofa");//texto com 5 caracteres
            receita.setAutor(null);
//            receita.setDescricao("Bode assado na brasa com macaxeira frita");
//            receita.setAutor("Ojuara");

            //Validating the object and getting the result
            Set<ConstraintViolation<Receita>> constraintViolations = validator.validate(receita);
            if (constraintViolations.size() > 0) {
                System.out.println("-----Erros --------");
            }
            //printing the results
            for (ConstraintViolation<Receita> constraintViolation : constraintViolations) {
                System.out.println("Campo: " + constraintViolation.getPropertyPath() + " - ERRO-> "
                        + constraintViolation.getMessage());
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

Mais detalhes http://hibernate.org/validator/documentation/getting-started/

sábado, 26 de julho de 2014

NetBeans - Plug-in Personalizado

Warrior of the world united!

Em janeiro mudei de emprego e fiquei sem tempo de postar por aqui.
Pois é... após 3 anos produzindo praticamente nada devido ao meu chefe acreditar que ele era um cara inteligente, e que toda idéia boa para o projeto só poderia partir do intestino da cabeça dele.
Eu já não aguentava mais ensinar a ele como funciona um Singleton, e resolvi procurar um ambiente mais profissional. (Ps. durante os 3 anos, ganhei uma boa grana com free lances e fiz vários post aqui no blog, já que não tinha muita coisa para fazer no trampo).

Então... rapazzzz, em 3 meses trabalhei o dobro do que nos 3 anos descritos acima, e fiquei sem tempo de postar algo legal por aqui.

Um freelance aqui, um outro li. Comecei a perceber que precisava de um plugin no NetBeans que me ajudasse na inserção de códigos que se repetem em vários arquivos dos meus diversos projetos, então resolvi brincar com essa implementação  que originou esse post.

Achei pouco material em português, mas com inglês tabajara deu para fazer com que, ao clicar com o botão direito do mouse sobre um arquivo java, o menu de contexto exibisse uma Opção para alterar o conteúdo do arquivo selecionado.

O primeiro passo é criar um novo projeto do tipo MODULO e clicar em próximo.

 Informar as configurações básicas.

Com o botão direito no pacote do projeto, é preciso criar um novo tipo de arquivo "AÇÃO" (encontrado na categoria de 'desenvolvimento de modulo netbeans' ).



Configure a ação para ser ativado condicionalmente e sua classe de Cookie será a DataObject. Essa classe representa o arquivo selecionado, e será por ela que teremos acesso ao path, nome, tipo e várias outras informações.

No registro da GUI, marque a opção de Item de Menu de Contexto, escolha tipo de conteúdo em que deseja que a ação de contexto pode ser disparada (no nosso caso, java).


Informe o nome da classe, nome de exibição, ícone , pacote e click em finalizar.

Na classe que foi criada, fiz uma pequena implementação, para pegar as informações sobre o arquivo selecionado pela classe DataObject, ler seu conteúdo e adicionar um comentario no topo do arquivo.

package com.blogspot.receitastecnologicas;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.Scanner;
import javax.swing.JOptionPane;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.awt.ActionRegistration;
import org.openide.filesystems.FileObject;
import org.openide.loaders.DataObject;
import org.openide.nodes.Node;
import org.openide.util.Lookup;
import org.openide.util.NbBundle.Messages;

@ActionID(
        category = "File",
        id = "com.blogspot.receitastecnologicas.InsereComentario"
)
@ActionRegistration(
        displayName = "#CTL_InsereComentario"
)
@ActionReference(path = "Loaders/text/x-java/Actions", position = 150, separatorBefore = 125, separatorAfter = 175)
@Messages("CTL_InsereComentario=Inserir Comentário de descrição")
public final class InsereComentario implements ActionListener {

    private final DataObject context;

    public InsereComentario(DataObject context) {
        this.context = context;
    }

    @Override
    public void actionPerformed(ActionEvent ev) {
        StringBuilder comentarioCabecalho = new StringBuilder();
        comentarioCabecalho.append("/**\n");
        comentarioCabecalho.append("* Que beleza! Esse tutorial vai me lembrar os passoas de criação de um plugin NetBeans Platform\n");
        comentarioCabecalho.append("* Esse comentário foi criado via o menu de contexto do NetBeans, \n");
        comentarioCabecalho.append("* (Inserir Comentário) que  quando precionado,\n");
        comentarioCabecalho.append("* o arquivo do tipo java que foi selecionado, será re-escrito com esse texto incluido \n");
        comentarioCabecalho.append("* no topo do arquivo.\n");
        comentarioCabecalho.append("* \n");
        comentarioCabecalho.append("* Note: Acesse os post anteriores... talvez algum besteirol escrito aqui te ajude!\n");
        comentarioCabecalho.append("* 

\n");
        comentarioCabecalho.append("* Tem algumas receitas legais de comida, que até o Edu Guedes fica babando!\n");
        comentarioCabecalho.append("*\n");
        comentarioCabecalho.append("* @see Receitas tecnológicas\n");
        comentarioCabecalho.append("* @see Receitas tecnológicas: Salvando vidas\n");
        comentarioCabecalho.append("*\n");
        comentarioCabecalho.append("* @author Receitas tecnológicas\n");
        comentarioCabecalho.append("* @since 1.0\n");
        comentarioCabecalho.append("*/ \n\n\n");
        InputStream in = null;
        StringBuilder linha = new StringBuilder();
        try {

            in = new FileInputStream(context.getPrimaryFile().getPath());
            Scanner scan = new Scanner(in);
            while (scan.hasNext()) {
                //faça sua regra aqui
                linha.append(scan.nextLine()).append("\n");
            }
            linha.insert(0, comentarioCabecalho);
            System.out.println(linha.toString());
            OutputStream bytes;

            bytes = new FileOutputStream(context.getPrimaryFile().getPath(), false); // passado "true" para gravar no mesmo arquivo

            OutputStreamWriter chars = new OutputStreamWriter(bytes);
            BufferedWriter strings = new BufferedWriter(chars);
            strings.write(linha.toString());

            strings.close();

        } catch (FileNotFoundException ex) {
            JOptionPane.showMessageDialog(null, "O arquivo " + context.getName() + " não foi encontrado!", "FileNotFoundException!!", JOptionPane.ERROR_MESSAGE);
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(null, "Verifique se o arquivo " + context.getName() + " esta em uso por outro programa!", "FileNotFoundException!!", JOptionPane.ERROR_MESSAGE);
        }
    }
}

Após implementar chegou a hora do teste!  Click em "Executar Projeto" e uma nova instância do NetBeans será aberta. Selecione um arquivo java desejado, click com o botão direito do mouse e você terá sua opção disponível no menu de contexto. Click na sua opção e depois abra o arquivo para conferir se algo foi gravado.

https://netbeans.org/features/platform/all-docs.html

domingo, 11 de maio de 2014

Como organizar suas referências bibliográficas com o ZOTERO

Na época da minha graduação tive um grande problema para gerenciar minhas referencias bibliográficas... Era uma desgraça ter que baixar um arquivo e escrever em outro a data de acesso, e outras informações da bibliografia. Meus problemas acabaram quando o meu orientador me indicou o ZOTERO. Esse plugin é muito foda!! Ele possibilita trabalhar em grupo, e basta você clicar em um botão, e ele salva a url, e em alguns casos ele já atribui o nome e sobre nome do autor, e outras informações. Depois é só selecionar a coleção e exportar no padrão desejado.
https://www.zotero.org