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
        BuscaPé, líder em comparação de preços na América Latina
         
        BlogBlogs.Com.Br