ago 01

Estados de um objeto gerenciado por um EntityManager

Neste post falarei um pouco de como a especificação JPA 2 trata as entidades manipuladas pelos EntityManagers. As principais funções dos EntityManagers são:

  1. Como o próprio nome já diz, gerenciar as entidades;
  2. Sincronizar o estado dos objetos com os dados correspondentes no banco de dados

Ao falarmos em gerenciar uma entidade nos referimos a como um EntityManager manipula uma entidade, e para isso é necessário entender os estados possíveis que uma instância pode assumir para um EntityManager. São 4 estados possíveis:

  • Transient

Neste estado seu objeto acabou de ser criado e o atributo que foi anotado com @Id não possui valor . Toda vez que você dá um new em um objeto de uma Entidade este é o estado que ele se encontrará.

  • Managed

Neste estado o objeto possui valor no atributo anotado com @Id, sendo este valor atribuido pelo EntityManager e não setado manualmente. Toda vez que ocorrer uma sincronização através de um flush ou um commit, os dados do objeto são atualizados no os dados do banco de dados.

  • Removed

Neste estado,assim como no estado managed, o objeto possui valor no atributo anotado com @Id, sendo este valor atribuido pelo EntityManager e não setado manualmente. Porém quando ocorrer uma sincronização através de um flush ou um commit, o objeto passa a não ter mais vínculo com o banco de dados.

  • Detached

Neste estado,assim como no estado managed, o objeto possui valor no atributo anotado com @Id, sendo este valor atribuido pelo EntityManager ou setado manualmente. Porém este objeto não possui mais vínculo com o EntityManager, logo ele não será mais sincronizado com o banco de dados, e qualquer alteração realizada com ele residirá somente na memória da aplicação e não no banco de dados.

Para trocar de estados o EntityManager nos fornece os seguinte métodos:

  • persist : Transient -> Managed
  • merge : Transient -> Managed / Detached -> Managed
  • evict, clear ou close : Managed -> Detached
  • remove : Managed -> Removed

 

Tendo esses estados em mente e também como transitar entre eles, você consegue ter um controle muito melhor sobre o que você está fazendo ao utilizar JPA.

Fica a dica!

 

 

jul 17

Adicionando um Datasource Postgresql ao Jboss 7.1

Pra quem usa ou usava jboss 6, era bem simples você adicionar um datasource novo, bastava você copiar o default e modificar as configurações, gravando esse novo arquivo na pasta deploy do seu server. Porém no Jboss 7 é um pouco diferente, e, diria eu, um tanto quanto burocrático.

Primeiramente é necessário baixar os drivers necessários de acordo com seu banco.

Em seguida copie para

jboss-as-7.1.1.Final/modules/org/postresql/main/

O jar baixado.

O jar precisa necessariamente estar embaixo da pasta main. Além disso nesta pasta main também tem que estar um arquivo xml : module.xml com o seguinte conteúdo:

 
<module xmlns="urn:jboss:module:1.1" name="org.postgresql">
    <properties>
        <property name="jboss.api" value="private"/>
    </properties>

    <resources>
        <resource-root path="postgresql-X.X-XXX.jdbcN.jar"/>
    </resources>

    <dependencies>
        <module name="javax.api"/>
    </dependencies>
</module>

Agora abra o arquivo jboss-as-7.1.1.Final/standalone/configuration/standalone.xml  e procure pela tag <subsystem xmlns=”urn:jboss:domain:datasources:1.0″>  . Dentro dela deverá ser adicionado o seguinte conteúdo:

<datasources>
    <datasource jta="false" jndi-name="java:/PostgresDS"
        pool-name="postgres-ds" enabled="true" use-ccm="false">
        <connection-url>jdbc:postgresql://localhost:5432/meu_banco
        </connection-url>
        <driver-class>org.postgresql.Driver</driver-class>
        <driver>postgresql</driver>
        <security>
            <user-name>usuario</user-name>
            <password>senha</password>
        </security>
        <validation>
            <validate-on-match>false</validate-on-match>
            <background-validation>false</background-validation>
        </validation>
        <statement>
            <share-prepared-statements>false</share-prepared-statements>
        </statement>
    </datasource>
    <drivers>
        <driver name="postgresql" module="org.postgresql" />
    </drivers>
</datasources>

Agora… Nada mais a ser feito, fora restartar o jboss, ufa né, bem chatinho criar um datasource a partir da versão 7 do jboss, mas é isso aí.

 

 

jun 22

Padrão Strategy aplicado com enum

Voltando a ativa, vou exemplificar algo simples e muito interessante de se utilizar, que é o padrão strategy. Uma maneira de identificar sua necessidade em um projeto é quando se tem um switch com muitos cases. Nesse caso você pode criar um enum da seguinte maneira:

 

     public enum MeuEnum {
          ITEM1 {
                public Object getLogicaItem() {
                      //código item 1
                 }
          },
           ITEM2 {
                public Object getLogicaItem() {
                      //código item 2
                 }
          };
          public abstract Object getLogicaItem();	
     }

 

E ao invés de utilizar um switch, basta agora atribuir o valor retornado do enum a variável desejada.

 

       Object item = ITEM1.getLogicaItem();

 

mai 03

Remoção de um item de datatable sem dar update no form inteiro no primefaces

Bom o título é grande mas o assunto é confuso. Contextualizando, imagine que você queira permitir ao seu usuário incluir vários campos de telefone, porém ele pode inserir N telefones, para isso você precisa que sejam campos dinâmicos.

No JSF  você pode fazer isso criando uma coleção no seu managedBean e utilizando o componente datatable. Assim ao inserir um novo telefone você chama um método que acrescenta um novo item a sua coleção e da update no datatable.

Porém digamos que o usuário adicionou acidentalmente um outro campo de telefone e queira removê-lo. Para isso é necessário um botão que faça tal ação, chamando um método do managedBean para remover o item desejado da lista.

Mas, porém, contudo, no entanto dentro de um datatable o update de um p:commandButton só funciona passando o parâmetro @form, que faz um refresh do formulário inteiro, o que nem sempre é desejado, pois somente queremos dar update no datatable.

Depois de muito discutir com amigos e pesquisar uma solução, descobri uma forma de fazer isso utilizando o componente p:remoteCommand, da seguinte maneira:

No botão de remover você faz:


<p:commandButton value="remover" type="button"
     onclick="removeRC({param:#{row}})" ></p:commandButton>

ATENÇÂO, a solução acima não se aplica para a versão 3.5+ do primefaces, caso esteja utilizando-a faça da seguinte maneira:


<p:commandButton value="remover" type="button"
     onclick="removeRC([{name:'param',value:#{row}}])" ></p:commandButton>

Onde row é o nome do atributo rowIndexVar do p:dataTable.

Aí fora da datatable vc usa um p:remoteCommand:


<p:remoteCommand name="removeRC" 
    update="datatableID" actionListener="#{MB.remove}">

</p:remoteCommand>

E pronto, é só agora fazer seu MB com os métodos como o exemplo abaixo e você conseguirá contornar esse bug do primefaces

@ManagedBean(name = "MB")
@ViewScoped
public class MB {

	private List<String> telefones;	

	public MB() {

		telefones = new ArrayList();
		for (int i = 0; i < 3; i++) {
			telefones.add(new String());
		}
	}		

	public void addList() {
		telefones.add(new String());
	}

	public void remove(ActionEvent event) {
		FacesContext context = FacesContext.getCurrentInstance();
		Map map = context.getExternalContext().getRequestParameterMap();		
		int row = Integer.parseInt(map.get("param"));
		telefones.remove(row);
	}

	public List getTelefones() {
		return telefones;
	}

	public void setTelefones(List telefones) {
		this.telefones = telefones;
	}
}

dez 14

Codigo Java dentro do javascript

Esse post vai ser bem curto, é só para mostrar que é possível chamar código java direto do html através de javascript, para fazer da seguinte maneira:

<script type="text/javascript">
           var data = new java.util.Date();
           alert(data);

</script>

Este código mostrará uma janela de alert com a data e hora do momento da execução, ele demonstra que para chamar alguma classe java deve-se declarar todo o caminho da classe. No caso de classes do pacote java é só chamar direto, no caso de classes personalizadas deve-se utilizar da seguinte maneira:

<script type="text/javascript">
           var minhaClasse = new Packages.meuPacote.minhaClasse();
           var retorno = minhaClasse.meuMetodo();
</script>

Para isso funcionar você precisa estar com essa classe no classpath da sua aplicação web. Mais informações basta olhar na documentação do Rhino

jul 25

Criando WebServices RESTful com Jersey, Maven e Tomcat no eclipse

Longo título, mas é isso que vou passar aqui nesse post. Se você procurar no google vai achar o passo-a-passo de introdução ao Jersey com maven. Porém em todos os tutoriais falta um detalhe que só consegui resolver depois de algumas muitas consultas ao google e tentativas frustradas.

Antes de tudo você deve instalar no seu eclipse o m2eclipse , é só copiar o update site e no seu eclipse ir em install new software e adicionar o update site.

Primeiramente a documentação do Jersey é muito boa, lá você tem tudo o que precisa para aprender a usá-lo. Portanto não vou falar detalhe a detalhe de como começar. Porém a introdução não mostra como integrar com Tomcat ( se você for na página de dependências ele mostra um link para como integrar com Servlets) .

Mas um tutorial bom e de fácil entendimento você encontra no MKYONG . Mas, porém contudo no entanto pule o passo 2, ao invés disso, crie um Dynamic Web Project no seu eclipse, e escolha como runtime environment o tomcat 6. Em seguida, clique com o botão direito no seu projeto e lá no finalzinho vai ter a opção Configure, escolha Convert to Maven Project . Após feito isso seu build path será todo desconfigurado. Você deverá então acessá-lo e reconfigurar a JRE, e apontar a pasta de códigos fontes na aba Source.

O build path agora está OK, porém ainda falta um passo, apontar para onde será feito o deploy dos fontes e das bibliotecas do maven.

Vá nas Propriedades do seu projeto e escolha Deployment Assembly, selecione add -> folder e escolha a pasta de códigos fonte , depois selecione add -> Java Build Path Entries e escolha Maven Dependencies . A pasta de códigos fontes deve ficar com o deploy path como WEB-INF/classes e a Maven Dependencies com o deploy path WEB-INF/lib como na figura abaixo.

 

Feito isso agora é só adicionar sua aplicação ao Tomcat e dar start.

jul 05

Upload de arquivos com primefaces

Quem usa JSF sabe que ele não tem tag nativa para upload de arquivos, para fazer funcionar , é preciso usar a tag html input e utilizar uma biblioteca da apache a commons-fileupload.

Porém algumas suites de componentes como richfaces , trinidad e tobago , e primefaces possuem essas tags. Nesse post vou focar no primefaces, pois considero a melhor dentre as apresentadas.

Antes é necessário que você baixe as seguintes bibliotecas e as adicione no classpath do seu projeto:

Em seguida você deve configurar seu web.xml caso você esteja usando Servlet 2.5, no caso do Servlet 3 eu não testei, mas acredito que não precise (quem usar, teste e comente por favor), adicionando o seguinte código abaixo:

        
	
        <filter>
                <filter-name>PrimeFaces FileUpload Filter</filter-name>
                <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
        </filter>
        <filter-mapping>
                <filter-name>PrimeFaces FileUpload Filter</filter-name>
                <servlet-name>Faces Servlet</servlet-name>
        </filter-mapping>

No sua página você deve usar a tag  p:fileUpload , ela possui vários atributos que podem ser setados, mas os principais são :

  • mode – que pode ser simple ou advanced, onde o simple ele renderiza um input file html comum; e o advanced (que é o default) ele renderiza apenas o botão de pesquisar e ao selecionar o arquivo ele já o valida, além de oferecer as opções de upload ou descartar.
  • allowTypes – lista-se as extensões que deverão ser aceitas
  • sizeLimit – tamanho máximo do arquivo
  • fileUploadListener – método do managed bean que quando for escolhido o mode advanced , trata o evento de upload( explicarei em seguida )
  • value – propriedade do tipo UploadedFile do managed bean que será feito o upload do arquivo, utiliza-se no caso do mode = simple

Exemplo:

    
<p:fileUpload fileUploadListener="#{mb.upload}"
     allowTypes="png,gif,jpg,jpeg" sizeLimit="10000"
     value="#{mb.arquivo}" mode="advanced"  />

Por fim deve-se no managed bean criar o método para o fileUploadListener :

     
private UploadedFile arquivo;
public void upload(FileUploadEvent event) {
    arquivo = event.getFile();
   /* implementação*//
}

E pronto. No labs do primefaces tem alguns exemplos de utilização, e usando você também descobre outras funcionalidades.

jun 06

Substituindo window.confirm() por jquery dialog

Para quem não conhece, jQuery é uma biblioteca javascript que simplifica e muito a programação em tal linguagem, com componentes visuais já prontos e fáceis de usar, além de interação ajax fácil e raidamente implementáveis. Tanto é bom que no framework primefaces, que pra mim é o melhor framework para jsf2 no momento, o utiliza.

Apresentações a parte, vou falar nesse post sobre como substituir as janelinhas de confirm nativas do javascript por outras mais agradáveis visualmente utilizando o jQuery junto com a jQuery UI.

Primeiramente você deve baixar os arquivos .js necessários e também ao baixar o jQuery UI escolher o tema de sua preferência para baixar o css necessário. Nesses links abaixo você poderá baixar aa útimaa versões  do jQuery e jQuery UI, podendo baixar a versão completa com comentários e identada, ideal para desenvolvimento e a minificada, ideal para ambientes de produção.

Após feitos os downloads você deverá adicionar ao seu projeto esses 3 arquivos no mínimo para funcionar (As versões aqui apresentadas são as últimas minificadas até esse post):

  • jquery-1.6.1.min.js
  • jquery-ui-1.8.13.custom.min.js
  • jquery-ui-1.8.13.custom.css

Com os arquivos baixados será necessário importá-los em suas página:

<link rel="stylesheet" href="css/jquery-ui-1.8.13.custom.css" type="text/css" media="all" />
<script src="js/jquery-ui-1.8.13.custom.min.js" type="text/javascript"></script>
<script src="js/jquery-1.5.1.min.js" type="text/javascript"></script>

Agora vamos ao que indica o título do post,  para que não sabe  confirm() é uma função javascript que exibe uma tela de confirmação, nossa! Como é óbvio,  com as opções de OK e Cancelar, retornando true ou false segundo o que foi selecionado. É bem simples, bastando usar dentro de um bloco de script o seguinte código:

var resposta = confirma("Tem certeza que deseja fazer isso?");


Porém essas janelinha mostrada pelo navegador não possui um layout muito bonito digamos assim, que coisa afeminada, mas cliente é cliente, e normalmente como diz o ditado peixe morre pela boca, levando para o lado da computação:  usuário  gosta mais do visual do sistema do que de suas funcionalidades.
Com isso utilizando jQuery, você consegue agregar um valor muito grande ao seu produto final, pois as interfaces são muito ricas e, o melhor de tudo, muito simples de se utilizar (para nós programadores).  Para substituir o confirm você pode utilizar o componente dialog do jQuery UI, mais precisamente um do tipo modal confirmation, não deixa de ser um dialog, mas com os devidos parâmetros setados ele fica com a cara de um confirm.Abaixo segue o código para tal:

function confirmJquery(message, titulo, f) {

	$("#dialog-confirm").dialog( {
		modal : true,
		resizable : false,
		width : 450,
		title : titulo,
		buttons : {
			"Sim" : function() {

				
				f(true);
				$(this).dialog("close");

			},
			"Nu00E3o" : function() {

				
				f(false);
				$(this).dialog("close");
			}

		}
	});
	$("#dialog-confirm").html("<p><span class='ui-icon ui-icon-help' style='float:left; margin:0 7px 50px 0;'></span>"+ message+"</p>");

}

Explicando o código, essa função deve ser chamada passando como parâmetro a mensagem a ser exibida, o título da caixa de diálogo e uma função javascript que receba como parametro uma variável booleana. E agora você se pergunta, mas por que isso? Seguinte, como o confirm() pára o processamento, o código que vem após ele não é executado enquanto o usuário não selecionar uma opção. Porém ao se utilizar o dialog do jQuery, ele vai criar o modal panel e continuar executando, portanto caso você tenha algo que dependa da resposta dada pelo usuário, quando o usuário clicar na resposta já terá passado pelo código, daí a necessidade de se continuar a lógica em outra função.

Por fim é necessário adicionar uma div no corpo da página com o id, no caso do meu exemplo , dialog-confirm:

<div id="dialog-confirm" >
</div>

e pronto, agora é só chamar a função confirmJquery(“mensagem”,”Titulo”,f), e você terá o funcionamento do dialog como um confirm.

mar 22

Logs no console usando android

Pra quem usa java está acostumdo ao famost System.out.println(), porém ao se programar para android, simplesmente esse comando não faz muita coisa, já que a máquina virtual do android  redireciona essa saída para a pasta dev/null . Então como logar sua aplicação? Simples utilizando a classe LOG do próprio android, fazendo com que todo log seja exibido no LogCat, que é a ferramenta do android para visualizar o log, para ver o LogCat basta selecionar no eclipse Window> ShowView>Other>Android>LogCat , no motodev normalmente essa view já é mostrada por default.

Para logar as informações o ideal é você criar sua própria categoria, para poder depois filtrar por tal e recuperar só o que lhe interessa. Abaixo segue um trecho de código de exemplo com os possível logs do android:

<blockquote>
public class Atividade extends Activity {

    private static final String CATEGORIA = "minhaCategoria";
    public void onCreate(Bundle savedInstance) {

        super.onCreate(savedInstance);
        setContentView(R.layout.main);

       Log.v(CATEGORIA, "verbose");
       Log.d(CATEGORIA,"debug");
       Log.i(CATEGORIA, "info");
       Log.w(CATEGORIA,"warning");
       Log.e(Categoria,"erro");
    }

}</blockquote>

Cada tipo de log é representado de uma cor diferente, e no próprio LogCat você também pode filtrar por tipo.

mar 11

Engatinhando com Android

Comecei agora a estudar para desenvolver minha dissertação de mestrado utilizando Android. A medida que for descobrindo coisas interessantes vou postando aqui, tanto para minha base de conhecimento como para informar a vocês.

Primeiramente, para você começar com Android é preciso saber JAVA, pois a programação dos aplicativos é nessa linguagem.

Segundo você precisa de um ambiente para desenvolver os aplicativos, eu andei pesquisando e a princípio tenho 2 opções:

1) Baixar eclipse + android SDK + plugin ADT

2) Baixar MOTODEV + android SDK

Vantagens e desvantagens:

O MOTODEV nada mais é do que um eclipse + plugin ADT , porém vem com mais opções, como por exemplo uma gui para o desenvolvimento dos layouts XML, os quais definem as interfaces. Fazendo um paralelo com SWING é como se fosse um jigloo ou VEP da vida. Além de outras coisas mais que ainda não tive tempo de fuçar. Devido a essa facilidade eu estou preferindo até o momento utilizar o MOTODEV (Uma observação a atentar, só porque é da motorola não significa que seus apps só rodarão em aparelhos motorola). Para baixá-lo basta se cadastrar no site, é gratuito.

Basicamente aplicativos do android são baseados em atividades (Activities) que é “um componente da aplicação que provê uma tela na qual os usuários podem interagir com intuito de fazer algo, tal como discar, tirar uma foto, mandar um email, ou visualizar um mapa.”( Android Dev Guide). Um aplicativo normalmente é composto de diversas atividades, pois cada atividade corresponde a uma tela da aplicação. Essas atividades são ligadas para se navegar pela aplicação, cada vez que uma nova atividade é aberta a anterior é fechada, mas é mantida empilhada conservando seu último estado. No link do Dev guide é melhor detalhado o que é, como funciona, o ciclo de vida de uma atividade, etc.

Isso é um resumo básico, a partir de agora começarei a postar coisas mais práticas, mais implementações, e sempre que possível colocarei as definições ou teorias, ou então o link para tais.