Friday, December 07, 2012

Conexão para HSQLDB embutido aplicações desktop (jar)

O HSQLDB é uma ótima opção para projetos demonstração e POCs (prova de conceitos). Na YaW nós desenvolvimento algumas aplicações seguindo o modelo client server (Desktop), utilizando o HSQLDB como banco de dados. Em algumas dessas apps o HSQLDB é distribuído junto com as classes Java,  embutido no arquivo JAR.

O detalhe dessa estratégia é utilizar a protocolo res para criar a conexão com HSQLDB. Com ele os arquivos do banco de dados são carregados como recursos da aplicação da mesma forma que classes Java.

public static Connection openConnection() {
  Connection conn = null;
  try {
    Class.forName("org.hsqldb.jdbcDriver");

    String bd = "meuDB";
    //url da conexao
    String url = "jdbc:hsqldb:file:/"+db;
    String user = "sa";
    String password = "";

    conn = DriverManager.getConnection(url, user, password);
    return conn;
  } catch (ClassNotFoundException e) {
    String errorMsg = "Driver nao encontrado";
    throw new RuntimeException(errorMsg, e);
  } catch (SQLException e) {
    String errorMsg = "Erro ao obter a conexao";
    throw new RuntimeException(errorMsg, e);
  }
}


Os arquivos para o meuDB, devem ser armazenados no diretório META-INF do jar (pelo menos meuDB.log, meuDB.properties, meuDB.script).

Uma caracteristica muito importante desse protocolo, é que a conexão será criada como somente leitura (read-only). As manipulações (insert/update/delete) ocorrem somente em memória.

Outra referencia é o tópico sobre protocolos de conexão na documentação do HSQLDB.

@edermag

Tuesday, December 04, 2012

Assinar um arquivo jar com jarsigner

Um assinatura digital é uma sequência de bits calculados a partir de algumas informações e de uma chave privada (certificado). Um arquivo "assinado" garante autenticidade, uma garantia a quem for utilizar. Caso o arquivo seja modificado a assinatura passa a não ter valor.

Em alguns casos é necessário assinar arquivos jar (Java ARchive), por exemplo ao distribuir uma aplicação Swing via Java Web Start que utiliza I/O (saiba mais sobre as restrições impostas pela JVM). No kit de desenvolvimento Java (JDK), o jarsigner é o programa responsável por gerar e verificar assinaturas em um arquivo jar.

O jarsigner utiliza informações da chave e certificado digital para gerar a assinatura. Um exemplo:

$ jarsigner -keystore /home/yaw -storepass mykeypass 
  -keypass mykeypass aplicacaoSegura.jar mykey

Detalhes do comando:
  • -keystore: o local (path) da chave;
  • -storepass e -keypass: a senha pra acessar e a senha da chave;
  • aplicaoSegura.jar: o nome do arquivo jar;
  • mykey: o alias da chave;
O jarsigner também é útil para verificar se um arquivo já possui alguma assinatura. Veja:

$ jarsigner -verify aplicacaoSegura.jar

Também é possível assinar um jar pelo ANT, veja um exemplo de target para isso:

<target name="pack-and-sign">
  <echo message="Assinando o jar aplicaoSegura.jar"></echo>

  <signjar alias="mykey" jar="aplicaoSegura.jar" 
    keypass="mykeypass" keystore="/home/yaw" storepass="mykeypass">
  </signjar>
</target>


Na página do jarsigner é possível obter maiores detalhes sobre o programa. Em outro post descrevo como gerar chaves com o keytool, outra ferramenta do JDK.

@edermag

Monday, December 03, 2012

Gerando chaves pública e privada com keytool

O keytool é um programa fornecido junto com kit de desenvolvimento (SDK) Java. É uma ferramenta para segurança, com ela é possível gerar certificados self-signed (assinado e certificado pela mesma entidade).

O comando a seguir gera o par de chaves pública e privada:
$ keytool -genkeypair 
  -dname 'cn=yaw, ou=tecnologia, o=YaW Tecnologia, l=SBC, s=SP, c=BR'
  -alias mykey -keystore /home/yaw -storepass mykeypass -validity 180

Na opção -dname indicamos as propriedades referentes a organização:
  • cn: nome comum;
  • ou: unidade/setor da organização
  • o: nome da organização;
  • l: localização;
  • s: estado;
  • c: país;

A opção -alias determina o identificador, enquanto -keystore o local aonde a chave será amarzenada. Já -storepass determina uma senha para proteção da chave. Por fim a opção -validity indica o período de validade do certificado, no exemplo 180 dias.

Há algum tempo fiz um post usando o keytool para importar certificado na JVM. Na página do keytool é possível obter mais informações.

@edermag

Thursday, November 29, 2012

Executando Java Applet/Swing App com certificado (sign) no Mountain Lion

Problemas ao executar uma aplicação Java (Applet / Swing)  via JWS (Java Web Start) com certificado no Mac OS X Mountain Lion? É provavel que este post te ajude.


No Mac OS X Mountain Lion, caso você faça download de uma aplicação Java (Applet / Swing) assinadas com um certificado "caseiro" (gerado pelo desenvolvedor, por exemplo) o browser apresenta uma mensagem indicando que a aplicação utilizará recursos da sua máquina, e que o certificado digital não é conhecido. Esse procedimento é normal e também ocorre em outros SOs, como Ubuntu e Windows. O detalhe é que, no caso do Mountain Lion, o botão Allow não está habilitado.

Exemplo:

Por default o Mountain Lion trava o download de aplicações com certificados digitais desconhecidos. Para mudar esse comportamento basta acessar:

Preferences -> Security & Privacy > Allow applications downloaded from:
E selecionar Anywhere


Pronto, o botão Allow poderá ser acionado.

@edermag

Monday, November 26, 2012

JDO para App Engine: ClassNotFoundException em DatastoreJDOPersistenceManagerFactory

Durante a execução de uma aplicação desenvolvida para o App Engine, utilizando o plugin mais recente do Goole para o Eclipse (Juno), pode ocorrer um ClassNotFoundException para a classe: org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManagerFactory.

DatastoreJDOPersistenceManagerFactory é uma factory para o gestor de persistência do JDO. Uma extensão de JDOPersistenceManagerFactory, disponibilizada com o datanucleus-appengine (plugin do App Engine).

Essa classe não existe no pacote datanucleus-appengine versão 2. Portanto se você tentar executar uma aplicação desenvolvida para App Engine com JDO fique atento a versão que o plugin do Eclipse está assumindo.

Para evitar o erro acessa a tela do Eclipse com as propriedades App Engine do Projeto (Properties -> Google -> App Engine), e modifique o campo Datanucleus JDO/JPA version para v1.


@edermag
www.yaw.com.br

Monday, November 12, 2012

Acessar repositórios no github com proxy HTTP (http.proxy do git)

No ambiente corporativo é muito comum o uso de proxy HTTP. Portanto para trabalhar com os repositórios remotos do git, com o github via HTTP(s), é necessário considerar as configurações do proxy.

Antes de fazer clone, pull ou push dos fontes no github faça as seguintes configurações do git:
$ git config --global http.proxy http://usuario:senha@host:port

Aonde:
  • usuario: deve contar o login para o proxy;
  • senha: a senha do proxy;
  • host: o ip do servidor proxy;
  • port: a porta do proxy;

Para testar, o comando pra clonar um repo:
$ git clone https://github.com/yaw/produtividade-eclipse.git

Pronto!

@edermag
www.yaw.com.br

Friday, October 19, 2012

Como executar um jar pelo Apache Maven

Executar um arquivo jar, acionando uma classe com método main, no Maven é algo bem simples. Pra demonstrar como isso pode ser feito, irei utilizar o plugin exec. Esse plugin faz do projeto Mojo, que reúne uma coleção de plugins para o Maven.

$ mvn exec:java -Dexec.mainClass=br.com.yaw.mavendemo.App

O primeiro detalhe é que o plugin deve ser acionado na pasta raiz do projeto ( diretório do pom.xml). Outra observação é a propriedade exec.mainClass, nela você deve informar o caminho da classe com o método main que deverá ser executada.

@edermag
www.yaw.com.br

Tuesday, August 14, 2012

Detalhes sobre contexto do Spring Security em aplicações Swing

O Spring security é sem dúvidas uma excelente alternativa para implementar módulos de autenticação e autorização em aplicativos Java Web e (por que não?) Swing.

Depois de autenticar o Spring Security mantém as credenciais do usuário em um contexto (na memória durante algum tempo). Dessa forma caso necessário podemos solicitar informações do usuário para o framework.

O componente SecurityContextHolder é responsável por esse trabalho. Por padrão ele está vinculado ao ThreadLocal, na web ele mantém os dados enquanto a requisição é processada.

Mas para aplicativos Swing, o uso do ThreadLocal não é a solução indicada, visto que componentes do framework trabalham com threads. Nesse caso devemos configurar o Spring Security para usar a estratégia de armazenamento global através de SecurityContextHolder.MODE_GLOBAL. No startup da aplicação, em um bloco static por exemplo, você pode definir essa forma de armazenamento:
static {
  SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_GLOBAL);
}

[]s
@edermag
http://www.yaw.com.br/

Tuesday, July 24, 2012

Problemas do JavaHL com Subclipse no Ubuntu

Post com dicas de como resolver problemas durante a instalação e uso do Subclipse no Eclipse Juno. O Subclipse é um plugin para trabalhar com svn dentro do IDE, desenvolvido pelo próprio time do Eclipse.

Subversion Native Library Not Available

Após instalar o Subclipse o primeiro problema apresentado pelo Eclipse foi a falta do JavaHL com a mensagem: "No libsvnjavahl-1 in java.librarypath ...". 
O JavaHL é uma biblioteca Java (C++) desenvolvida para acessar a API nativa do Subversion. Essa biblioteca é desenvolvida de acordo com o sistema operacional. Usuários do Windows não encontram esse problema.

Usuários do Ubuntu precisam instalar o JavaHL separadamente para resolver o problema. Isso é muito simples:

$ sudo apt-get install libsvn-java


Com esse comando é possível instalar a versão mais atual do JavaHL nos respositórios do Ubuntu. Mas isso ainda não resolveu meus problemas.

Incompatible JavaHL library loaded. 1.7.x or later required 

O novo problema ocorria por incompabilidade entre JavaHL instalado no Ubuntu (12) e o Subclipse instalado no Eclipse Juno. Para resolver esse problema basta seguir os comandos seguintes:

$ sudo apt-add-repository ppa:dominik-stadler/subversion-1.7
$ sudo apt-get update
$ sudo apt-get dist-upgrade
Pronto, agora é possível trabalhar com Subclipse no Eclipse Juno.

@edermag
www.yaw.com.br

Wednesday, July 04, 2012

A YaW Tecnologia no TDC 2012

Chegou a hora do #TDC2012, a 6a edição do The Developers Conference, um evento sobre desenvolvimento de software feito por desenvolvedores para desenvolvedores, organizado pela Globalcode. Essa será a nossa quinta participação no evento, é um momento muito especial para nós da YaW.

O TDC ficou conhecido pela plularidade, não é por menos que ganhou o título de evento mais democrático da comunidade de desenvolvimento brasileira. Esse ano evento conta com 37 trilhas de diferentes tribos, mas com uma nova modadalidade: as trilhas University!

As trilhas University foram criadas para estudantes ou desenvolvedores que estam começando a trabalhar com tecnologia. Essas trilhas abordaram temas como Java, .NET, Android, Java EE, Testes, Windows 8 e outros.

#TDC2012
No #TDC2012 a YaW Tecnologia participará de 6 trilhas!


Na trilha Java University participo do Debate: Carreira do Programador Java.




#TDC2012 - Trilha Java EE University
Na trilha Java EE University eu realizo a coordenação e apresento a palestra Introdução ao Java EE. O Rafael Nunes apreseta a palestra sobre Desenvolvimento Rest em Java. Também irei participar da Mesa redonda sobre Frameworks Java.
 
#TDC2012 - Trilha Java EE

Na trilha Java EE eu realizo a coordenação e apresento a palestra: Java EE 7, na era do Cloud Computing.
#TDC2012 - Trilha Java


Na trilha Java vou apresentar a palestra JDK 8: uma visão sobre Lambda, Jigsaw e outras novidades.




Na trilha Python o Rafael Nunes atuará na coordenação.




Na trilha Cloud Computing o Rafael Nunes também atuará na coordenação.




A expecativa e ansiendade para o evento são grandes! Além de muito conteúdo vai ser uma ótima oportunidade pra encontrar uma galera gente boa e claro rever vários amigos.

@edermag
www.yaw.com.br

Monday, June 25, 2012

Customizar mensagens de formatação/conversão no Spring MVC 3

O Spring MVC provê funcionalidades para conversão e validação dos dados de formulários web, resolvendo a entrada de valores numéricos e datas, algo rotineiro em desenvolvimento de aplicações web. No Spring MVC versão 3, além do suporte a anotações, algumas melhorias foram implementadas nesse setor.

Objetivo desse post é demonstrar como customizar/modificar as mensagens de erro geradas pelo Spring MVC durante a conversão de valores (string) para data e/ou número.

De acordo com o trecho de código, a seguir, o bean Pedido é define alguns critérios para conversão e validação de dados:
import java.util.Date;
import java.math.BigDecimal;
public classe Pedido {

   @NotNull
   @DateTimeFormat(pattern = "dd/MM/yyyy")
   private Date dataAbertura;

   @NotNull
   @Digits(integer = 8, fraction = 2)
   @NumberFormat(style=Style.NUMBER)
   private BigDecimal valor;

   ...
}

As anotações @NotNull@Digits são definidas em Bean Validation (JSR 303), o Spring as utiliza para validar o estado do objeto Pedido no lado servidor. As outras duas anotações são definidas pelo Spring Framework:

  • @DateTimeFormat: indica qual formato deve ser aplicado durante a conversão do conteúdo de um atributo data e/ou hora. A propriedade pattern, utilizada no exemplo acima, indica que a string informada pelo usuário deve respeitar dia/mês/ano. Outra opção é utilizar a propriedade style, que pré-define formatos para a data. Essa anotação pode demarcar atributos do tipo Date, Calendar, Long ou atributos do Joda Time.
  • @NumberFormat: indica qual formato deve ser aplicado durante a conversão do conteúdo de um atributo numérico. A propriedade style, utilizada no exemplo acima, indica que a string informada pelo usuário deve respeitar um número decimal de acordo com as configurações do locale corrente. Outra alternativa seria utilizar propriedade pattern, e estipular o formato numérico suportado. 

O próximo código demonstra um trecho da controller de pedidos, mais especificamente a assinatura do método que persiste (inclui) o objeto pedido:
...
@RequestMapping("/pedidos") @Controller
public class PedidoController {

  @RequestMapping(method = RequestMethod.POST)
  public String create(@Valid Pedido pedido,
        BindingResult bindingResult, Model uiModel) {
   
       if (bindingResult.hasErrors()) {
          //validador não aceitou o pedido, ele nao devera ser persistido
         ...
       }
       //o pedido foi validado com sucesso, pode ser persistido.
       ...
  }

}


O argumento pedido é um objeto preenchido com as informações inseridas pelo usuário, no formulário. Note que a variável foi demarcada com @Valid (outra anotação de Bean Validation), dessa forma o Spring MVC valida essas informações, no lado servidor, de acordo com as definições da classe. Caso exista alguma(s) inconsistência(s), o Spring MVC preenche o objeto bindingResult com o(s) erro(s). Por exemplo, se a data do pedido não for preenchida o if dentro do método deve cancelar o fluxo de inserção e retornar para o formulário.

Imagine que no formulário HTML o usuário preencheu um conteúdo incoerente para o campo valor do pedido, por exemplo: 'abc'. Considerando que o formulário não realiza nenhuma validação/formatação no lado cliente (browser), como o Spring MVC se comportará ?

No momento de carregar o objeto o Spring MVC não consegue resolver 'abc' como um número decimal para o atributo (propriedade) valor. O objeto pedido é carregado com as informações que o Spring consegue converter. Antes de acionar o método na controller, o objeto bindingResult é notificado sobre o erro durante a conversão. Ao entrar no método create, em PedidoController, o atributo valor do pedido é null, o mesmo trecho que valida o estado do pedido (bindingResult.hasErrors()) é executado.

Dessa forma o formulário é recarregado, e o Spring MVC apresenta uma mensagem de erro contendo o seguinte texto:

"Failed to convert property value of type java.lang.String to required type java.math.BigDecimal"

Em outro cenário de conversão de dados, caso o usuário entre com o conteúdo inválido no campo da data, o mesmo fluxo é executado, mas a mensagem apresentada será:

"Failed to convert property value of type java.lang.String to required type java.util.Date"

É possível customizar as mensagens com erro(s) de conversão do Spring?

Sim! No arquivo properties, com as mensagens internacionalizadas (messages.properties) é possível modificar o conteúdo default as mensagens de conversão do Spring MVC.

É possível definir duas mensagens com erro de conversão de acordo com o tipo do atributo. O exemplo a seguir determina duas mensagens quer serão apresentadas para todos os atributos da aplicação, do tipo java.util.Date e java.math.BigDecimal. A seguir um exemplo de como isso pode ser feito:
typeMismatch.java.util.Date=Conteúdo inválido para campo data!
typeMismatch.java.math.BigDecimal=Conteúdo inválido para campo numérico!

Outra opção é definir uma mensagem especifica para um determinado atributo. O exemplo a seguir determina um mensagem exclusiva para o atributo valor do objeto pedido (pedido deve ser o nome do argumento definido no método dentro da controller):

typeMismatch.pedido.valor=O valor do pedido não foi preenchido corretamente!

Seguindo essa estratégia você utiliza o mecanismo de conversão e validação do Spring MVC, com uma mensagem mais amigável para o usuário.

Na documentação do Spring é possível encontrar mais detalhes sobre o mecanismo de validação e conversão adotado pelo framework MVC.

@edermag
www.yaw.com.br

Monday, April 16, 2012

Ubuntu 11.* não carrega a barra de menus do SpringSource Tool Suite! Como resolver?

Ao executar o SpringSource Tool Suite (STS) 2.9.1 (versão de 03/2012) no  Ubuntu 11.*, somente o menu Window é apresentado na barra superior.

Na verdade o problema ocorre no STS, por não implementar as opções de menu no formato adotado pelo Unity.

Um workaround (gambiarra) para resolver o problema, é desabilitar o menu global no ubuntu. Isso pode ser feito através de um script shell com o seguinte conteúdo (arquivo STS_aux.sh):

#!/bin/bash
export UBUNTU_MENUPROXY=0
/home/yaw/springsource/sts-2.9.1.RELEASE/STS

Importante: A terceira linha, executa o arquivo de inicializa do STS. Pronto, é só executar o arquivo STS_aux.sh que a aplicação será inicializada com todos os menus na barra superior do Unity/Ubuntu.

Enquanto o pessoal do SpringSource não ajusta o aplicativo, essa alternativa pode ser utilizada.

Curiosidade: O mesmo problema ocorre e pode ser resolvido no Aptana Studio 3, ambas as aplicações são variações do Eclipse IDE.

@edermag
www.yaw.com.br

Saturday, March 17, 2012

Gerar hash SHA-256 no terminal do linux

Comando útil para gerar hash SHA-256, por exemplo, a partir do terminal do linux:

$ echo -n conteudo_a_cifrar | sha256sum

É só o valor adequado, ao invés de conteudo_a_cifrar, e pronto. O comando gera na saída o hash SHA-256.

@edermag
www.yaw.com.br

Friday, March 16, 2012

Projeto demonstração do Java 7

Subi no github o projeto com os fontes demonstrando as novidades do Java 7. Esse projeto nasceu junto com o minicurso JDK7 - Modificações na linguagem.

No código disponibilizei exemplos com os tópicos:
  • Separador de liteiras numéricas _
  • Operador switch com suporte a String
  • Operador Diamond (Generics)
  • AutoCloseable, o novo try-finally
  • Multicatch
  • Rethrow
  • JDBC 4.1
  • Nova API de IO (NIO.2)
  • @SafeVargs: Varargs com Generics

@edermag
www.yaw.com.br

Friday, January 20, 2012

Como redirecionar URL com Django

Implementar o redirecionamento de url's com Django é extremamente simples! Basta utilizar a função django.views.generic.simple.redirect_to no arquivo de configurações para urls (ROOT_URLCONF).

Um exemplo do site da yaw:
from django.views.generic.simple import redirect_to

urlpatterns = patterns('',
  ...
 (r'^treinamentos/academiaJava.html/$', redirect_to, {'url': '/treinamentos/academia_java/'}),
  ...
)

Dessa forma quando a url http://www.yaw.com.br/treinamentos/academiaJava.html for requisitada o Django retorna para o browser o código http 301 (Moved Permanently), redirecionando para a página http://www.yaw.com.br/treinamentos/academia_java.

Simples!


@edermag
www.yaw.com.br