Blog

InfoQ: Entendendo como funciona a SCJP

Olá Pessoal,

O post desta semana está no InfoQBrasil. Primeiramente, estou bastante feliz pela equipe do InfoQ ter aceitado meu post e publicado.Desde já agradeço à equipe pela atenção e o apoio na revisão do artigo. Neste post estou falando sobre à SCJP, porém dessa vez abordo um pouco sobre o exame, tirando dúvidas tais como:

  • qual versão fazer 5 ou 6?

  • inglês ou português?

  • O tempo é suficiente?

  • Compensa investir na SCJP?

Outro ponto que não deixei de lado foi abordar as mudanças que a Oracle tem feito nas certificações Java e no processo de aquisição do voucher.

Também aproveitei o momento para responder algumas dúvidas se meu livro Guia do Exame serve para SCJP 6. Se você quer saber todas as respostas confira o post no link a seguir:

http://www.infoq.com/br/articles/como-funciona-a-scjp

Abracos, see you next post. :).

Projetos com RedMine

Olá Pessoal,

O post desta semana é algo bem diferente dos demais. Vou falar um pouco sobre RedMine. Quem conhece?

Até algumas semanas não conhecia a tecnologia, já tinha usado algo bem semelhante para gerenciamento de projetos, tais como: OpenProject, Grant. Apesar dos recursos dessas tecnologias serem legais, mas eu queria algo um pouco diferente, algo que pudesse acessar remotamente. Foi quando em uma conversa com Edson Gonçalves, veio a recomendação da tecnologia.

Vamos conhecer…

lets go..

Mas, por que usar RedMine?

Tenho usado RedMine para gerenciar meus projetos IT. Com RedMine, crio as tarefas que precisam e quando devem ser concluída e informo quem tem que fazer. O destinatário da tarefa recebe um email de notificação do trabalho a ser feito e quando este deve ser iniciado, pode-se mudar o status da task e manter todo o time atualizado. Informar quantos % já foi concluído, outro desenvolvedor, testador pode inserir um comentário, há um log de atualização no ticket que foi aberto. E ainda a ferramenta dar suporte ao nosso idioma, isso ajuda aos times, aonde o segundo idioma pode ser um problema.

Mais algumas funcionalidades:

  • – posso importar informações do meu Gantt/OpenProject;
  • – posso usar um controle de versão como Subversion em sincronização com a ferramenta. Assim que sempre uma nova tag, ou um branch for atualizado no meu controle de versão vou ter isso atualizado no projeto;
  • – pode-se adicionar arquivos(.doc, .pdf etc) em um ticket;
  • – informar o nível de prioridade que tal tarefa deve ser concluída.;
  • – ao fechar o ticket informar quantas horas foram gastas;
  • – ao abrir um ticket informar quanto tempo previsto levará para ser implementado;
  • – informar quem pode ter acesso a um determinado ticket. (toda equipe? Ou somente os desenvolvedores?) Por exemplo, há tickets que somente os gerentes e engenheiros tem acesso, por serem informações confidenciais do projeto e não cabe o programador/desenvolvedor saber delas.
  • – Dar para medir as horas já gastas no projeto e assim prever se haverá OverTime;
  • – podemos gerenciar N projetos no mesmo ambiente RedMine. O melhor que não há limitações para criação de projetos .

Abaixo temos alguns printscreen que criei de um projeto apenas para o post. Quem tiver interesse pode testar a tecnologia no próprio site redmine.org basta se cadastrar e ver realmente como é simples e mais produtivo usar RedMine para controle dos seus projetos ou ciclo de desenvolvimento.

“Fico feliz quando eu abro um projeto e vejo o que foi feito nos dias anteriores e o que há para ser feito no dia seguinte e ainda o que está atrasado”. Essa é a sensação.

Acredito que a ferramenta não chega substituir Project Manager da Microsoft ou o RTC da IBM, mas entre custo e benefícios é excelente. E para ter a mesma rodando de forma remota com custo x beneficios.Bastar ter um domínio e comprar uma hospedagem no integrator.com.br.

img1pagebeginredmine

Aqui temos a pagina inicial do RedMine, uma vez que o login/senha estavam OK.

projectblogredmine

Criando um projeto.

emailredmine

Aqui configuramos para que as notificações por email funcione. Nunca habilitei.

developer

Adicionando um novo membro ao time.

repositorioredmine

Configurando o redmine com um controle de versão. Ou seja, se uma tag foi cortada vc vai poder acompanhar tudo daqui. E melhor que dar suporte aos mais usados no mercado.

ticketstatusredmine

Aqui vc configura os status que serão usados na criação de uma tarefa.

gant

Cronograma do projeto, e o melhor pode exportar em pdf.

contaredmine

Configurando sua conta.

calendar

Calendário das atividades, olha a legenda no final.

Vou ficando por aqui espero que tenham gostado do post.

Abracos, guys! See you next post.

Usando UML no Eclipse

olá Pessoal,

Que tal usar UML dentro do Eclipse? Pois eh, para quem não sabe é possivel ter esse recurso dentro dessa poderosa IDE, usando um plugin chamado omondo (www.omondo.com ) que pode facilitar a vida no momento da criação dos diagramas de classes, já que teremos tudo no mesmo ambiente. Há algumas limitações na ferramenta, mas tem boa parte dos recursos básicos da UML.

Lets go…

Outra ferramenta free que já usei/uso e recomendo: ArgoUML

Curiosidade para quem não sabe: O NetBeans a partir da versão 6.1/superior, já traz o processo de diagramação com UML por default. Para os que gostam da IDE, enjoy!! Eu cheguei até testar, porem não gostei muito não.

Sobre o Omondo: www.omondo.com

Fazendo o Download: vá no site acima e clique em Downloads.

Se você já tem o Eclipse na sua máquina sendo uma das versões (3.4, 3.5)suportadas pelo plugin, você precisa apenas baixar a versão correspondente do omondo. Agora se você não tem o Eclipse, pode pegar a versão que já vem com o omondo configurado.

Eclipse 3.5.1 & EclipseUML Studio 2.2 package

Stand Alone zip file which contains the latest Eclipse 3.5.1, EclipseUML 2.2 Studio Edition, EMF, GEF and UML2.

Algumas caracteristicas:

  • gera code clear a partir da diagramação

  • UML 2.0

  • Fácil instalação/configuração

  • Não é “pesado”

Instalando/Configurando no Eclipse

note: Vamos considerar que você já tem o Eclipse, e pretende apenas instalar omondo na sua IDE.

  • Após ter feito o download do omondo UML, você deve descompactar a pasta .zip em qualquer lugar.

  • Copie todo o conteúdo de plugin que estar no diretório descompactado e cole dentro da pasta plugin do seu eclipse.

    Atenção: localize onde estar a pasta do seu eclipse, aquela que tem o arquivo de execução da IDE. (faça um backup antes e deixe o eclipse fechado)

  • Copie da pasta descompactada omondo, os arquivos do diretório feature e cole dentro da pasta feature da IDE (está na mesma raiz da pasta plugin)

    imgidepastas

  • E para testar crie um novo projeto java e vá em File ==> new File ==> UML . O resto é com você.

Espero que tenham gostado, sendo assim não é preciso ter programas pesados para pequenas modelagens com UML, aproveite os recursos do poderoso Eclipse + Omondo e Enjoy!!

Abraços e espero que tenham gostado.

selectOneMenu JSF com BD

olá Pessoal,

Hoje vou mostrar como criar preencher um selectOneMenu com dados vindo do Banco de Dados. Há várias formas de fazer isso, no blog o rponte você vai ver alguns posts bem interessante sobre o assunto. Vou mostrar abaixo como deixar seu selectOneMenu dinâmico pegando os dados do BD.

Tive como referência o livro do autor Edson Gonçalves em seu livro Dominando JSF.

lets go…

Posts Recomendados

Note: Para o exemplo a seguir usei o Hibernate puro para persistência e o TomCat 6 como servidor.

Preparando o ambiente:

  1. crie seu projeto JSF e sua página jsp ou xhtml

Aqui vamos usar xhtml, mas nada impede de usar .jsp o código JSF não vai mudar se vc criou um dos dois arquivos acima.

  1. Não esqueça de criar uma tabela no seu banco de dados. Aqui chamamos ela de cargo

Desenvolvendo

  1. Na sua classe DAO, crie um método que vai retornar todos cargos cadastrados:

    //retorna todos os cargos cadastrados
    	public List listaCargo(){
    		Query query = getSession().createQuery("from Cargo");
    		Listlista = query.list(); 
    
    		return lista;
    	}
  2. Na ControllerCargo você deve ter o método e a variável abaixo.

    public class ControllerCargo {
    	private Cargo cargo;
    	private Map cargoitem=null;
    	private ListDataModel model; 
    
    	public ControllerCargo() {
    		cargo = new Cargo();
    	}
    //outros codes foram omitidos, pois não tem importância para o objetivo do post
    
    //será armazenado no selectOneMenu
    	public Map getCargos(){
    	CargoDAO cargodao = new CargoDAO();
    	cargoitem = new LinkedHashMap();
    	for(Iterator iter =cargodao.listaCargo().iterator();iter.hasNext();){
    	Cargo c = (Cargo) iter.next();
    	 //armazenando os cargos encontrados no bd em um map
    		cargoitem.put(c.getFuncao(), c.getFuncao());
    	}
    	return cargoitem;}
  3. Essa aqui é nossa classe cargo:

    public class Cargo {
    	private int id;
    	private String funcao;
    	private String area;
    //gets/sets omitidos
  4. criamos uma página em xhtml (poderia ser em JSP) que tem o selectOneMenu carregado com os cargos que estao na tabela no BD, veja como ficou o code:
<input jsfc=”h:selectOneMenu” value=”#{controllerUser.usuario.funcao}” >
<f:selectItems value=”#{controllerCargo.cargos}” />
</input>

<input jsfc=”h:selectOneMenu” value=”#{controllerUser.usuario.funcao}” >

<f:selectItems value=”#{controllerCargo.cargos}” />

</input>


    Erro comum

    1. um erro comum é não prestar atencao no S que temos entre selectItems e seletecItem, se vc deixar no singular, terá problemas ao executar a página. Afinal de contas você informou que vai receber uma coleção de dados.

    Teste

    Veja abaixo o exemplo do selectOneMenu pegando informações que vem do BD. temos um formulário e logo a seguir um select do banco de dados.

    selectonebdjsf

    Vou ficando por aqui pessoal e até a proxima, espero que tenham gostado, o objetivo aqui foi apresentar um ponto bem especifico, por isso não coloquei todo o código para não perder o foco. Até porque nada mudou nas outras classes.

    Abracos, see you next post.

    Open Session View – Hibernate Solução

    solutionproblem

    olá Pessoal,

    No post de hoje vou falar de um problema que todos que estão trabalhando com Hibernate não está livre de se deparar com ele. É o velho LazyInitializationException que acontece e deixa o pobre do desenvolvedor stressado.

    Neste post pretendo ser menos teórico e mais prático, pois tem muita coisa na net explicando o porque temos o LazyInitializationException, porém poucos explicaram de forma prática a solução. O mais próximo foi este site. Que se você reparar direito tem um pequeno erro no mapeamento do filtro.

    Então aqui vou mostrar como resolver o problema, pois também fui afetado com este problema e levei umas quase 3 horas para resolver. E agora vejo que era algo simples, mas eu precisava entender o por que?! de cada exceção que vinha recebendo. Para este este post usei o post que está no Jboss Community, porém fiz algumas adaptações.

    Lets go…

    Vou usar a técnica de reutilização da informação então o Paulo da Caelum já fez uma abordagem excelente do porque desse problema , veja.

    Desenvolvendo

    Se você não quer desenvolver os codes a seguir, então mude o relacionamento para EAGER ao invés de usar o LAZY. Os codes a seguir é útil para quem necessita de ser LAZY o relacionamento.

    1. crie um novo package no seu projeto o meu chamei de : br.com.filtro

    O pessoal do Jboss Community não colocou quais classes deveriamos importar, um programador inexperiente pode se atrapalhar e importar classes inapropriadas. Em função disso coloquei abaixo o código completo.

    1. Crie a classe HibernateSessionRequestFilter conforme abaixo: (fique atento ao meu comentário na classe)

      package br.com.filtro;
      
      import java.io.IOException;
      
      import javax.servlet.Filter;
      import javax.servlet.FilterChain;
      import javax.servlet.FilterConfig;
      import javax.servlet.ServletException;
      import javax.servlet.ServletRequest;
      import javax.servlet.ServletResponse;
      
      import org.apache.commons.logging.Log;
      import org.apache.commons.logging.LogFactory;
      import org.hibernate.SessionFactory;
      import org.hibernate.StaleObjectStateException;
      
      import br.com.dao.DAO;
      
      public class HibernateSessionRequestFilter implements Filter {
      
      	 private static Log log = LogFactory.getLog(HibernateSessionRequestFilter.class);
      
      	    private SessionFactory sf;
      
      	    public void doFilter(ServletRequest request,
      	                         ServletResponse response,
      	                         FilterChain chain)
      	            throws IOException, ServletException {
      
      	        try {
      	          System.out.println("iniciando a transacao com o DB");
      	            sf.getCurrentSession().beginTransaction();
      
      	            // Call the next filter (continue request processing)
      	            chain.doFilter(request, response);
      
      	            // Commit and cleanup
      	            log.debug("Committing the database transaction");
      	          sf.getCurrentSession().getTransaction().commit();
      
      	        } catch (StaleObjectStateException staleEx) {
      	            log.error("This interceptor does not implement optimistic concurrency control!");
      	            log.error("Your application will not work until you add compensation actions!");
      	            // Rollback, close everything, possibly compensate for any permanent changes
      	            // during the conversation, and finally restart business conversation. Maybe
      	            // give the user of the application a chance to merge some of his work with
      	            // fresh data... what you do here depends on your applications design.
      	            throw staleEx;
      	        } catch (Throwable ex) {
      	            // Rollback only
      	            ex.printStackTrace();
      	            try {
      	                if (sf.getCurrentSession().getTransaction().isActive()) {
      	                    log.debug("Trying to rollback database transaction after exception");
      	                    sf.getCurrentSession().getTransaction().rollback();
      	                }
      	            } catch (Throwable rbEx) {
      	                log.error("Could not rollback transaction after exception!", rbEx);
      	            }
      
      	            // Let others handle it... maybe another interceptor for exceptions?
      	            throw new ServletException(ex);
      	        }
      	    }
      
      	    public void init(FilterConfig filterConfig) throws ServletException {
      	        //log.debug("Initializing filter...");
      	       // log.debug("Obtaining SessionFactory from static HibernateUtil singleton");
      	        sf = DAO.getSessionFactory();//vem da minha classe DAO
      	    }
      
      	    public void destroy() {}
      
      }
    2. Agora veja como está meu DAO:

      package br.com.dao;
      
      import org.hibernate.Session;
      import org.hibernate.SessionFactory;
      import org.hibernate.cfg.Configuration;
      
      public class DAO {
      	private static ThreadLocal threadlocal = new ThreadLocal();
      	private static SessionFactory sessionFactory = new Configuration().configure().
      	buildSessionFactory(); 
      
      public DAO() {
      	// TODO Auto-generated constructor stub
      }
      public static  Session getSession(){
      	Session session = (Session) threadlocal.get();
      	if(session == null){
      		session = sessionFactory.openSession();
      		threadlocal.set(session);
      	}
      	return session;
      }
      	public void begin(){
      		getSession().beginTransaction();
      
      	}
      public void commit(){
      	getSession().getTransaction().commit();
      }
      
      public void rollback(){
      	getSession().getTransaction().rollback();
      }
      public void close(){
      	getSession().close();
      }
      public static void shutdown() {
      	// Close caches and connection pools
      	getSessionFactory().close();
      	}
      //passamos ele para o Filter
      public static SessionFactory getSessionFactory() {
      	return sessionFactory;
      }
      public static void setSessionFactory(SessionFactory sessionFactory) {
      	DAO.sessionFactory = sessionFactory;
      }
      
      }

    Não precisei alterar nada da configuração padrão do hibernate.

    1. Abra seu arquivo hibernate.cfg.xml e adicione a linha abaixo:

      < property name=”hibernate.current_session_context_class”>thread  < /property>

    2. Salve e execute sua aplicação, veja se os println do Filter serão impressos (claro, os que estão nos catches nem devem aparecer). Em caso positivo está tudo ok.

    3. Agora teste várias vezes sua app e veja se verá o problema com LazyInitializationException. Aqui ele sumiu de vez, graças à deus.

    A única coisa que mudei na classe HibernateSessionRequestFilter, foi informar meu SessionFactory e o resto o Filter fez o trabalho dele.

    Bom vou ficando por aqui, espero que tenham gostado do post. Não posso deixar de agradecer ao autor Edson Gonçalves que contribuiu bastante para este post, desde a indicação do link, como as explanações pelo mesmo que foi contribuindo  até encontrar a solução, o colega Rafael Viana (GUJ) já tinha passado por um problema parecido e compartilhou sua experiência opinando como poderia ser resolvido.

    Fica ai agora a versão em português do problema. Abracos, see you next post.