sábado, 17 de abril de 2010

Gravar estado de objetos em arquivo binário.

Olá pessoal! Hoje vou mostrar como gravar objetos em arquivo binário usando Java. Com isso é possível salvar o estado do objeto preservando o valor de seus atributos independente do tipo de dado.
A algum tempo atrás, quando comecei a desenvolver aplicações para Desktop tive a necessidade de armazenar configurações do servidor de banco de dados, foi então que eu descobri que era possível guardar o estado de um objeto em arquivo binário. Isso foi muito útil.

So, Let's Go Kids!


Para isso, vamos usar a API de java.io, uma classe de configuração simples, e o método que irá gravar nosso objeto.
Abaixo segue a nossa classe de configuração.


Na classe acima, temos um modelo simplificado de uma configuração. Coloquei apenas atributos com tipo simples de dados, mas poderia ter usado qualquer tipo de dado, ou classe.

Agora a classe com o método que irá gerar nosso arquivo.


Acima, na linha 21, instancio o File onde será salvo o arquivo de configuração. O nome do arquivo e a extensão são irrelevantes pois independente disso, o conteúdo do arquivo é binário e não pode editado, caso isso seja feito o arquivo será corrompido e não será possível a recuperação. No entanto, é possível ler o valor dos atributos do tipo String, então, se for colocar a senha do banco no arquivo, use um array de char, pois assim, não será legível.

Nas linhas 23 e 24, criamos respectivamente um FileOutputStream e um ObjectOutputStream, que nos possibilitam gravar o objeto em arquivo. Na linha 26, gravamos efetivamente o estado do objeto no arquivo. Importante ressaltar que podemos gravar N objetos no mesmo arquivo. Após isso, descarregamos, e fechamos os Stream`s.
Mais abaixo na linha 36 instanciamos nosso objeto de configuração, e na linha 38 o método que grava o arquivo.

Lendo o arquivo e recuperando o objeto


Então pessoal, assim como precisamos salvar o estado do objeto, também precisamos lê-lo. Observem a figura abaixo.



Na linha 48 temos o método que fará a leitura do arquivo e resgatará nosso objeto. Nas linhas 51 e 52 temos respectivamente o FileInputStream e ObjectInputStream, e na linha 54 a leitura do arquivo e recuperação do objeto.
Voltando ao método main, fiz algumas modificações apenas ler o arquivo e imprimir a informação no console. Na linha 36, instancio o File informando o arquivo onde salvei o objeto, depois na linha 38 é só chamar o método que irá recuperar o objeto.

The Real Life!


Como eu já disse antes, você pode gerar um arquivo com um único objeto para salvar a configuração do banco de dados da aplicação. Além disso, outro uso interessante, é que você pode usar para armazenar tabelas que serão pré-carregadas na aplicação no ato da instalação do software, assim, não é necessário criar script`s de carga, e mandá-los com a instalação, o que deixaria exposto sua estrutura.

Grande abraço.

Referências:

http://java.sun.com/j2se/1.4.2/docs/api/java/io/FileOutputStream.html
http://java.sun.com/j2se/1.4.2/docs/api/java/io/ObjectOutputStream.html
http://java.sun.com/j2se/1.4.2/docs/api/java/io/FileInputStream.html
http://java.sun.com/j2se/1.4.2/docs/api/java/io/ObjectInputStream.html

domingo, 21 de março de 2010

Compactar arquivos com senha em Java!

Salve pessoal! Hoje vou falar sobre como compactar um arquivo com senha usando Java. Embora isso pareça trivial, é menos comum do que se pensa, pois isso depende da implementação de um algoritmo de criptografia, que no nosso caso, foi usado o algoritmo AES. É importante citar também que as rotinas de criptografia são disponibilizadas por http://www.bouncycastle.org/.

Bom, para fazer nosso trabalho vamos usar uma biblioteca chamada WinZipAES disponibilizada em http://code.google.com/p/winzipaes/ sob a licença da Apache versão 2.0. Desta vez, vamos usar o Eclipse pois vamos fazer um checkout do projeto, que é um projeto Eclipse. Acesse a página indicada acima, clique na aba 'Source' e observe as instruções para fazer o checkout como usuário anônimo através da url http://winzipaes.googlecode.com/svn/trunk/winzipaes/ . Para isso é importante que você tenha instalado no seu Eclipse o plugin para SVN, caso não tenha, veja como instalar aqui (http://www.eclipse.org/subversive/downloads.php).

So, Let's Go Kids!

Abra o Eclipse, eu estou usando o Galileo, mas fiquem a vontade para usar versões anteriores, ou se preferirem podem usar ainda o Netbeans, daí basta instalar o plugin para abrir projetos Eclipse. Abra a Perspectiva Svn, e clique em New -> Repository Location, na janela que abriu adicione a url citada na página do projeto WinZipAES, como na imagem abaixo.

Observe que o campo User, e Password estão vazios, o que indica que faremos acesso como usuário anônimo, e por isso, com permissão apenas de leitura. Clique em Finish,e depois com o botão direito do mouse sobre o repositório que apareceu na aba "SVN Repositories" do Eclipse e faça o checkout.

Troque de Perspectiva, e observe que apareceu agora um projeto chamado "winzipaes". Vá em src, e no pacote de.idyl.crypto.zip haverá duas classes exemplificando como compactar e descompactar arquivos usando senha.

Abra primeiro a classe AesZipFileEncrypter, vá no método "main", lá temos duas linhas de código como na figura abaixo.



Como podem observar na imagem acima, este já é o exemplo e teste da implementação. Na primeira linha do método estamos instanciando um objeto de AesZipFileEncrypter que recebe como parametro de entrada o caminho com o nome para o arquivo zip que terá a senha. Na segunda linha temos a chamada para o método "zipAndEncrypt", que compacta o arquivo e insere a senha passada no outro parametro.

Indo no diretório indicado na instancia do nosso objeto, você encontrará dois arquivos compactados, um com senha, e outro sem a senha. Isso acontece porque a implementação de exemplo contida nesta classe, cria um arquivo zip comum, e compacta-o em outro colocando a senha. Em um caso de uso real, você poderia passar para ser compactado um arquivo zip comum contendo vários outros arquivos, e passá-lo como parametro no lugar o arquivo txt.

Para descompactar, abra a classe AesZipFileDecrypter.java contida no mesmo pacote. O código esta como na figura abaixo.



Para descompactar o exemplo instancia um objeto da classe AesZipFileDecrypter que recebe como parametro o caminho para o nosso arquivo compactado com senha, e chama o metodo "extractEntry" na 3ª linha passando a entrada para o arquivo que se quer descompactar, o File destino deste arquivo, e a senha.


The Real Life!

Bom, daí vocês me perguntam, "Eu tenho o fonte, e como usar na minha aplicação?". Simples, por questão de segurança, comentem os métodos "main" das duas classes de exemplo, criem um .jar, e adicionem no classpath do seu projeto, seja ele em NetBeans, Eclipse, ou outra IDE qualquer. Ah! Aconselho criar dois métodos estáticos, um compactando, e outro descompactando, em alguma classe utilitária da sua aplicação.

Para quem se interessar, e quiser aprofundar no assunto, recomendo a leitura dos link's da referência.

Espero que tenham gostado. Grande abraço.

Thank you so much!

Referência:

http://www.bouncycastle.org/
http://www.winzip.com/aes_info.htm
http://www.eclipse.org/subversive/downloads.php

sábado, 13 de fevereiro de 2010

Explorando o Derby! Parte II

Mãos na massa

Na primeira parte vimos como instalar e configurar o Derby. Hoje vou mostrar como usar o Derby de forma embutida, ou, se preferirem, Embedded.

Vamos criar um cadastro simples de pessoas em que o banco de dados ficará embutido junto com a aplicação, e o usuário não precisará instalar nada além da própria aplicação.

Configurando o Ambiente

Para nosso exemplo, vou usar o NetBeans 6.8, que pode ser baixado em http://netbeans.org, e como provedor de persistência, o Hibernate, que já vem na instalação do NetBeans. Entretanto, para quem preferir o Eclipse, fique a vontade, pois não farei nada no Netbeans que não possa ser feito com o Eclipse.

Hora da prática

No Netbeans, vá em File > New Project, e escolha a Categoria 'Java', e o Projeto 'Java Application', clique em 'Next', e dê ao projeto o nome 'PostDerby'. Desmarque a opção de 'Create Main Class' e clique em 'Finish'.

Clique com o botão direito sobre a raiz do projeto e vá em Propriedades. Clique em Libraries, e depois no botão 'Add Library'. Selecione a opção 'Hibernate JPA', caso esta opção não esteja na lista, clique em 'Import', e selecione a outra janela que abrirá. Também adicione o arquivo derby.jar presente na pasta lib na sua instalação do Derby. Feche as propriedades clicando em 'OK'.

Agora, crie o pacote br.blog.javaempo.entidades, e nele a classe Pessoa.java como na figura abaixo:


Após criada a classe, vamos criar a nossa unidade de persistência. Siga os passos abaixo:

  1. Clique com o botão direito do mouse em 'Source Packages',
  2. acesse a opção New > Other,
  3. na janela que abriu vá na Categoria 'Other' e no Tipo de Arquivo, escolha 'Folder',
  4. clique em 'Next', e dê o nome de 'META-INF', e clique em 'Finish'.

Vamos agora criar o arquivo persistence.xml. Para isso, clique na pasta 'META-INF' e siga basicamente os passos anteriores, com a diferença que você deve criar um arquivo da Categoria 'XML', e escolher o tipo 'XML Document', clique em 'Next' e dê o nome de persistence.xml, clique em 'Next' e deixe a opção default selecionada que indica apenas que você vai escrever um documento xml comum.

Abra o arquivo persistence.xml, e preencha como na figura abaixo:



Observem na imagem acima, na linha 12, que no valor da propriedade "hibernate.connection.url", após o prefixo "jdbc:derby:" temos o diretório local onde está o banco de dados, e não o IP do servidor com a porta, como é de costume.
Além disso, logo após o endereço, temos o parametro "create=true", isto indica ao Derby, que ao conectar, ele deve criar o banco no endereço indicado caso não exista. Isso garante transparência à aplicação, ao usar o banco. Para mais informações sobre a passagem de parametros na url, veja a seção "Working with the database connection URL attributes" do Guia do Desenvolvedor Derby presente no diretorio docs/pdf/devguide dentro do diretório da instalação do Derby, conforme vimos na primeira parte deste Post.

Outra propriedade importante é a "hibernate.hbm2ddl.auto" com o valor "update". Desta forma, quando conectar pela primeira vez, o Hibernate criará automaticamente as tabelas, e caso você altere, ou crie alguma entidade, ao levantar a aplicação na próxima vez, estas alterações já serão refletidas no banco.

Vamos criar a interface gráfica. Crie um pacote chamado br.blog.javaempo.gui, e nele crie um JFrame chamado CadPessoa.java.

Bom pessoal, como nosso objetivo aqui, é o Derby, então vamos pedir licença aos Design Pattern's, e criar todo o controle da aplicação neste JFrame, que deve ficar como na figura abaixo.

Na próxima imagem temos alguns atributos para uso geral do cadastro e também o construtor da classe.



Nas linhas 16 e 17 criamos um entityManagerFactory usando a unidade de persistência presente no arquivo persistence.xml. Neste momento, o banco de dados é criado no diretório indicado. Logo abaixo, obtemos uma instância da classe EntityManager para nossas operações de persistência, fazemos uma consulta para obter uma lista de pessoas cadastradas, e caso esta não esteja vazia, setamos a primeira pessoa da lista na tela.

Na imagem abaixo segue alguns métodos utilitários para uso na nossa aplicação. Apenas um get, um set e um método para limpar a tela.


Abaixo segue a implementação dos botões 'Novo', 'Excluir' e 'Salvar'.

Na próxima imagem, segue a implementação dos botões de navegação, controlados pelo atributo 'posicao'.


Agora é só executar a aplicação. Observe que na primeira execução o sistema irá demorar mais a levantar que nas vezes subsequentes, e após isso será criado um diretório com os dados como pode ser observado na imagem abaixo.

Bom, com isso concluímos nossa segunda parte. Espero que tenham gostado. Até o próximo post, abraços.

domingo, 7 de fevereiro de 2010

Explorando o Derby! Parte I

      Derby, um subprojeto de Apache DB Project, é um banco de dados relacional, open source e totalmente implementado em Java e está disponível sob a licença Apache, Versão 2.0.
      O Derby pode ser implementado de várias maneiras diferentes. As opções de implementação incluem:

  • Incorporado a um aplicativo Java de um único usuário. O Derby pode ficar praticamente invisível ao usuário final, porque não requer administração e executa na mesma máquina virtual Java (JVM) que o aplicativo.
  • Incorporado a um aplicativo multiusuário como um servidor Web, um servidor de aplicativos, ou um ambiente de desenvolvimento compartilhado.
  • Incorporado a uma estrutura de servidor. Pode ser utilizado o Network Server com o driver de cliente da rede, ou um servidor de livre escolha.

      O Derby pode ser baixado em http://db.apache.org/derby/derby_downloads.html, que além da instalação trás consigo rica documentação em português além de exemplos envolvendo as formas de implementação descritas acima. A versão usada neste post é a versão 10.5.3.0.

Instalando e Configurando o Derby.

      Após fazer o download, descompacte a instalação em um diretório de sua preferência. O próximo passo é configurar o PATH para o diretório da instalação do Derby.
      No Linux Ubuntu, edite o arquivo /etc/profile (como root) e adicione as seguintes linhas:

# /opt/Derby é o diretório onde está instalado na minha máquina. #Substitua pelo diretório da sua instalação.

DERBY_INSTALL=/opt/Derby

export CLASSPATH=$DERBY_INSTALL/lib/derby.jar:$DERBY_INSTALL/lib/derbytools.jar:.

      No Windows, acesse as propriedades de "Meu Computador" e na aba "Avançado", clique no botão "Variáveis de Ambiente". Na lista de Variáveis do Sistema, clique em "Nova", crie a variável de nome DERBY_INSTALL, e no valor, coloque o diretório onde está instalado o Derby. Por exemplo: C:\Arquivos de Programas\Derby

      Depois procure na lista a variável PATH, e adicione o valor ;%DERBY_INSTALL%\bin;%DERBY_INSTALL%\lib\derby.jar;%DERBY_INSTALL%\lib\derbytools.jar

      Para testar, vamos abrir o IJ que é uma ferramenta distribuida juntamente com o Derby. Abra o shell, ou o prompt do MS-DOS e digite:


      java org.apache.derby.tools.ij

      Aparecerá como na imagem abaixo.



      Para conectar digite:

      connect 'jdbc:derby:/opt/Derby/demo/databases/toursdb';

      Observe que onde está escrito /opt/Derby, você deve substituir pelo diretório da instalação do Derby na sua máquina.
      Segundo o manual de referência, o Derby implementa um subconjunto do núcleo do SQL-92, assim como algumas funcionalidades do SQL-99.
      Então, uma vez conectado, é só usar e abusar da ferramenta.
      Para desconectar, digite: disconnect;
      Para sair do IJ, digite: exit;
      Pronto! O derby está instalado e configurado. Bom pessoal, vou ficando por aqui, na segunda parte, vamos deixar de conversa, e partiremos para a prática com uma aplicação em que pretendo explorar o uso do Derby embutido (Embedded).

      Grande abraço, muito obrigado.

Referências:
1. http://db.apache.org/derby/
2. Manual de Referência presente no diretório "docs/pdf/pt_BR/ref" da instalação do Derby.
3. Guia do Servidor e Administração do Derby presente no diretório "docs/pdf/pt_BR/adminguide" da instalação do Derby.
4. Derby Developer's Guide presente no diretório "docs/pdf/devguide" da instalação do Derby.

terça-feira, 2 de fevereiro de 2010

Boas Vindas!!

Boa noite pessoal,

Sejam bem vindos! Em breve começarei a postar aqui conteúdo Java, e de outras tecnologias relacionadas que são de uso frequente em meu cotidiano profissional. Aguardem!

Abraços,

dantas.