quarta-feira, 14 de abril de 2010

Hibernate Annotations: Mapeando coleções de tipos primitivos

Um exemplo básico de mapeamento de coleções para tipos primitivos pode ser feito utilizando um List de String.

O Hibernate pode detectar automaticamente o tipo do elemento se você usar coleções genéricas. Se não, é necessário identificar o tipo do elemento com o atributo "targetElement":

@org.hibernate.annotations.CollectionOfElements(
    targetElement = java.lang.String.class
)

Para persistir os valores de sua lista, é necessário criar uma nova tabela no banco. A tabela que será criada, no exemplo abaixo, terá o nome de "CirurgiasPrevias" e possuirá um campo de chave estrangeira chamada "cdCirurgiasPrevias" (definido pelo @JoinColumn) e terá um campo chamado "cirurgiasPrevias" (definido pelo @Column).

@CollectionOfElements(fetch=FetchType.LAZY)
@JoinTable(
    name = "CirurgiasPrevias",
    joinColumns = @JoinColumn(name = "cdCirurgiasPrevias")
)
@Column(name = "cirurgiasPrevias")
private List<string> cirurgiasPrevias;

O exemplo acima foi baseado no livro "Java Persistence with Hibernate". Que pode ser baixado na integra aqui.

Palavras chave: Hibernate, Annotations, List, mapeamento de coleções

segunda-feira, 12 de abril de 2010

Gmail agora tem "subpastas" (Finalmente)

Finalmente o pessoal do Google Labs se tocou e criou o que faltava para tornar o Gmail mais "organizável".
Para quem é critico com organização, como eu, a criação de "subpastas" ou "submarcadores" demorou muito para aparecer, mas agora é só ativá-la no Labs.

Útil.

Fonte: Gizmodo

Leia também: Já fez backup de seus emails hoje?

segunda-feira, 22 de março de 2010

SQL Injection

Alguem ai sabe o que é SQL Injection?

Resumindo: SQL Injection ocorre quando o atacante consegue inserir uma série de intruções SQL dentro de uma 'query' através da manipulação das entrada de dados de uma aplicação.

Para quem não entendeu, segue um bom exemplo: 

quinta-feira, 11 de março de 2010

Java + Hibernate: Another GenericDAO

Fazendo um catado pela net e implementando um pouco de código, este é o DAO genérico que estou utilizando nos meus primeiros projetos utilizando Hibernate3 e Spring.

Não sou nenhum expert nesses frameworks, mas boa parte das minhas necessidades foram supridas com esses métodos.

Primeiramente segue minha interface:

package persistence;

import java.util.List;
import java.util.Map;

/**
 *
 * @author felipe sartor
 */
public interface GenericDAO<T, PK>{

    public void save(T t);
    public void remove(T t);
    public T refresh(T t);
    public T find(PK id);
    public T findParam(String query, Map<String, Object> params);
    public List<T> findEntities();
    public List<T> findEntities(String query);
    public List<T> findEntitiesParam(String query, Map<String, Object> params);
    public List<T> findEntitiesParam(String query, Map<String, Object> params, int max, int atual);

}
E agora segue a sua implementação:
package persistence;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import java.util.Map;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import org.hibernate.Query;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author felipe sartor
 */
public abstract class GenericDAOImpl<T, PK extends Serializable >
 extends HibernateDaoSupport implements GenericDAO<T, PK>
{
 private Class<T> persistenceClass = null;

 //Construtor usando Reflection
 @SuppressWarnings("unchecked")
 public GenericDAOImpl() {
  this.persistenceClass = (Class<T>)
   ((ParameterizedType) getClass().getGenericSuperclass())
   .getActualTypeArguments()[0];
 }

 //Set para a classe que será persistida.
 protected void setPersistenceClass(Class<T> persistenceClass) {
  this.persistenceClass = persistenceClass;
 }

 public Class<T> getPersistenceClass() {
  return persistenceClass;
 }

 /* @Transactional dá a classe automaticamente o poder de transação.
  *
  * Atributo:
  * readOnly - otimizações para transações somente de leitura
  */
 @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
 public void save(T t) {
  getHibernateTemplate().saveOrUpdate(t);
 }

 @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
 public void remove(T t) {
  getHibernateTemplate().delete(t);
 }

 @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
 public T refresh(T t) {
  getHibernateTemplate().merge(t);

  return t;
 }

 public T find(PK id) {
  return (T) getHibernateTemplate().get(persistenceClass, id);
 }

 public T findParam(String query, Map<String, Object> params) {
  Query q = getSession().createQuery(query);
  for(String chave : params.keySet()){
   q.setParameter(chave, params.get(chave));
  }
  try{
   List l = q.list();
   if(l.size() > 1){
    throw new NonUniqueResultException();
   } else {
    return (T) l.get(0);
   }
  } catch(NoResultException nre){
   return null;
  } catch(NonUniqueResultException nure){
   nure.printStackTrace();
   return null;
  }
 }

 public List<T> findEntities() {
  return getHibernateTemplate().find(
   "from "+ persistenceClass.getSimpleName()
   );
 }

 public List<T> findEntities(String query) {
  Query q = getSession().createQuery(query);
  return q.list();
 }

 public List<T> findEntitiesParam(
  String query, Map<String, Object> params)
 {
  Query q = getSession().createQuery(query);
  for(String chave : params.keySet()){
   q.setParameter(chave, params.get(chave));
  }
  return q.list();
 }

 public List<T> findEntitiesParam(String query,
  Map<String, Object> params, int max, int atual)
 {
  Query q = getSession().createQuery(query)
   .setMaxResults(max).setFirstResult(atual);

  for(String chave : params.keySet()){
   q.setParameter(chave, params.get(chave));
  }
  return q.list();
 }

} 


Comentários são bem vindos. Enjoy! ;]


Keywords: Java, Hibernate, Hibernate3, Spring

terça-feira, 9 de março de 2010

Código fonte formatado no Blogger com SyntaxHighlighter

Muitos posts existem ensinando a utilizar o SyntaxHighlighter, mas não funcionam bem com a nova versão desta ferramenta que utiliza javascript para formatar códigos-fonte de forma legível no seu blog, ou página web.

Ele possui algumas particularidades para serem utilizadas no Blogger, portanto siga os passos abaixo que tudo dará certo de forma simples, sem dores de cabeça.

Primeiramente, vá nas opções do seu blog, selecione a aba Layout e Editar HTML, em seguida cole esse trecho de código abaixo, exatamente antes da tag </head> de sua página:


<link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/> 
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCSharp.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushRuby.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'></script> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js' type='text/javascript'></script> 
<script language='javascript'> 
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.config.clipboardSwf = 'http://alexgorbatchev.com/pub/sh/current/scripts/clipboard.swf';
SyntaxHighlighter.all();
</script> 

Remova dessa lista as linguagens que você nunca utilizará, para agilizar um pouco o carregamento da página.

A principio, a ferramenta já está configurada pois, nesse caso, estou utilizando os arquivos hospedados pelo seu próprio criador, já que o Blogger não disponibiliza um espaço para armazenamento de arquivos. Sempre serão utilizados os arquivos mais recentes com esse endereço.

Caso você queira hospedá-lo em seu próprio host, faça o download aqui e mude os endereços http://alexgorbatchev.com/pub/sh/current para o novo local hospedado.


Agora é necessário utilizar uma tag especial para formatar o código que será apresentado no seu post.
Para isso, coloque seu código fonte dentro da seguinte estrutura, no editor de HTML da postagem:
<pre class="brush: html">

</pre>

Basta trocar o nome "brush: html" pela linguagem que você precisa. Por exemplo, "brush: java".

Dica: Você pode utilizar um encoder html (como este ou este) para remover as tags intrometidas que o código fonte gera dentro da sua página. Cole seu código fonte no editor e copie o código formatado já no formato correto para jogá-lo em sua página.

And thats it! ;]

sexta-feira, 5 de março de 2010

Ferramentas CASE (UML)

Um leitor me perguntou há algum tempo sobre ferramentas CASE que podem ser utilizadas para desenhar diagramas da UML.

 
Interface do JUDE


Antes da listinha, segue uma definição simples e direta (wikipédia neles!) sobre Ferramenta CASE:

Ferramentas CASE (do inglês Computer-Aided Software Engineering) é uma classificação que abrange todas ferramentas baseada em computadores que auxiliam atividades de engenharia de software, desde análise de requisitos e modelagem até programação e testes. Podem ser consideradas como ferramentas automatizadas que tem como objetivo auxiliar o desenvolvedor de sistemas em uma ou várias etapas do ciclo de desenvolvimento de software


Dentro das ferramentas frees, posso destacar o JUDE, pela sua interface gráfica, facilidade de uso e boa geração de código e o STAR UML, por abrir arquivos criados pelo Rational Rose, que é pago.
Segue a listinha de ferramentas para modelagem e desenho de diagramas:



        quarta-feira, 3 de março de 2010

        JSP e JSF: Criando uma tabela de seleção simples utilizando o Netbeans Visual Web Pack

        Como encontrei pouca informação sobre como montar uma tabela onde fosse possivel selecionar uma linha, vou postar uma solução para o problema.

        Estou utilizando o componente Table, que está disponivel na paleta do modo de edição visual do Netbeans (componente Woodstock Basic). Será criada uma coluna com Radio Buttons, onde será feita a seleção da linha desejada.


        1) Clique com o direito na tabela, selecione Table Layout e adicione uma nova coluna. Se quiser, deixe os campos Header Text e Footer Text em branco, e apague o que existir em Value Expression. Em Component Type selecione Radio Button.

        2) Adicione o código abaixo ao page bean referido à essa tela:

        
        private Object lastSelected="0"; 
        public Object getSelected(){
         String sv = (String)radioButton1.getSelectedValue();
         return sv.equals(lastSelected) ? sv : null; 
        } 
        
        public void setSelected(Object selected) {
         if (selected != null) {
          lastSelected = selected;         
         } 
        } 
        
        public Object getSelectedValue() {
         return tableRowGroup1.getRowKey().getRowId(); 
        }
        
        


        3) De volta ao modo visual, selecione o Radio Button em questão (vou utilizar o nome de radioButton1) e, na paleta de propriedades, edite o atributo name (da seção Advanced) para: buttonGroup

        4) Ainda nas propriedades do radioButton1, na seção Data procure pelo atributo select e clique no botão com [...]. Selecione Use Binding e vá na aba Bind to an object. Selecione o objeto: selected e clique OK.
        (A propriedade deve ficar parecida com #{SuaPagina.selected} )

        Com isso a aplicação utilizará os métodos getSelected() e setSelected() automaticamente para exibir e gravar as ações no componente.

        5) Volte à seção Advance do radioButton1 e procure pelo atributo selectedValue e clique no botão [...]. Selecione Use Binding e vá na aba Bind to an object. Selecione o objeto: selectedValue e clique OK.
        A propriedade deve ficar parecida com #{SuaPagina.selectedValue}.

        Com isso a aplicação utilizará o método getSelectedValue() para retornar o valor selecionado para o componente.

        OBS: Veja abaixo como devem ficar as propriedades do radioButton1:
        • Seção Advanced: 

          • name="buttonGroup"
          • selectedValue=#{SuaPagina.selectedValue}
        • Seção Data:

          • select=#{SuaPagina.selected}


        6) Para efetuar o teste, jogue um botão na tela. No meu caso, a tabela foi criada e preenchida automaticamente utilizando um provider de dados chamado pacienteProvider e, nesse caso, estou recuperando o item que foi selecionado na tabela.

        public String btnSelecionar_action() {
        
         String aRowId = (String)RadioButton.getSelected("buttonGroup");
        
         RowKey aRowKey =  pacienteProvider.getRowKey(aRowId);
         Paciente selectedPaciente = (Paciente) pacienteProvider.getObject(aRowKey);
        
         return null;
        }
        
        

        O objeto aRowId possui, nesse caso, o indice da linha que foi selecionada na tabela.
        O objeto à ser retornado será a String referente ao nome da próxima páginal, que deve estar previamente configurada no faces-config.xml.

        Utilizando um pouco de javascript, é possivel destacar toda a linha que foi selecionada.
        Veja um exemplo em: http://blogs.sun.com/winston/entry/single_selectable_row_table_component

        Keywords: selecionar linha tabela table jsf jsp netbeans visual web pack

        terça-feira, 29 de dezembro de 2009

        Calendário 2010 - Útil, Pequeno e Original


        Realmente achei bacana e queria compartilhar com vocês.
        O trabalho original pode ser encontrado aqui: http://www.grafishdesign.it/blog/the-small-calendar-eng
        E os downloads em diferentes linguas podem ser feitos aqui: http://www.grafishdesign.it/blog/calendardownload

        quarta-feira, 23 de dezembro de 2009

        NetBeans 6 - Resolvendo Estouros de Memória

        Se você está realizando alguma tarefa com muitos fontes, ou está encontrando qualquer problema relacionado com estouro de memória causado em alguma ação do NetBeans, você tem 2 coisas a fazer:

        Aumentar a capacidade máxima de alocação de memória do compilador para UM projeto

        1. Clique direito no projeto desejado, vá em Properties > Build > Compiling
        2. Em Additional Compiler Options entre com os valores -Xmx e opcionalmente -Xms.

        Por exemplo: -J-Xms128m -J-Xmx512m

        Onde:
        -J-Xms se refere ao valor minimo (opcional)

        -J-Xmx se refere ao valor máximo

        3. Clique Ok
        4. Certifique-se de que os valores serao utilizados no compilador, adicionando a seguinte linha ao arquivo nbproject/project.properties (pela aba Files):

        build.compiler=extJavac


        Aumentar a capacidade máxima de alocação de memória do compilador para TODOS os projetos

        1. Na pasta de instalação do seu NetBeans, navegue até o arquivo netbeans.conf (em NetBeans 6.X\etc\netbeans.conf). Abra-o com algum editor de texto.
        2. Você encontrará algumas linhas comentadas dizendo o seguinte:

        # Note that a default -Xmx is selected for you automatically.
        # You can find this value in var/log/messages.log file in your userdir.
        # The automatically selected value can be overridden by specifying -J-Xmx here
        # or on the command line.

        Abaixo disso, coloque o valor desejado, assim como citado anteriormente.

        3. Reinicie o NetBeans.

        Referências e possiveis erros nas configurações:
        http://wiki.netbeans.org/FaqOutofMemoryOnCompile
        http://javahowto.blogspot.com/2006/06/6-common-errors-in-setting-java-heap.html

        terça-feira, 20 de outubro de 2009

        Primeiro sistema operacional 100% livre de erros


        Passeando por alguns sites de ciência e tecnologia, me deparei com essa matéria.
        Infelizmente o artigo não diz qual foi a técnica utilizada, mas isso pode ser tema de uma nova pesquisa no google...... =D

        Vale a pena conferir.

        Fonte: inovacaotecnologica.com.br

        Pesquisadores australianos relataram que, pela primeira vez, conseguiram provar com rigor matemático que o núcleo principal de um sistema operacional - tecnicamente conhecido como kernel - está 100% livre de erros de programação (bugs).

        O avanço deverá ter implicações diretas no funcionamento e na segurança de computadores que controlam equipamentos que devem apresentar altíssima confiabilidade, como aparelhagens médicas de exames e cirurgias robotizadas, sistemas aeroespaciais e servidores de informática de missão crítica.

        ...

        O kernel 100% correto pertence a um sistema operacional do tipo embarcado (embedded system), que roda em computadores dedicados a tarefas específicas.

        A nova técnica de verificação, contudo, poderá ser utilizada no desenvolvimento de qualquer outro programa, seja um sistema operacional ou outro aplicativo qualquer.
        BuscaPé, líder em comparação de preços na América Latina
         
        BlogBlogs.Com.Br