[Logo] Mentawai Forum - Mentawai Web Framework
  [Search] Search   [Recent Topics] Recent Topics   [Members]  Member Listing   [Groups] Back to home page 
[Register] Register / 
[Login] Login 

Forum Read-Only! Check the new site and forum here!

Messages posted by: Lucas Teixeira  XML
Profile for Lucas Teixeira -> Messages posted by Lucas Teixeira [9]
Author Message
Estou com o mesmo problema....
Não estou conseguindo fazer o parse de arquivos do velocity...

Alguem aí conseguiu?

[]s

RubemAzenha wrote:
Acho melhor adicionar um list do que criar uma coisa que por dentro deve encapsular um list...

Tem alguma vantagem de criar uma classe FilterStack ???
 


Hum... Acredito que não, List talvez seja a melhor coisa mesmo...

Talvez mais pra frente se precisar de algum tratamento mais bruto, aí sim uma classe pra encapsular cairia bem, mas acredito que com o List seria suficiente!

Hum.... Agora tenho minhas dúvidas quanto à hora de sair adicionando isso...

Code:
List filters = new ArrayList();

E agora?
Code:
filters.add(new FulanoFilter());

ou
Code:
filters.add(br.com.lucastex.filters.FulanoFilter.class);

Com o class ficaria melhor né... Ai na hora de serem verificados, o Mentawai poderia gerar as instâncias destes Filters, uma vez que a mesma lista de Filters poderá ser adicionada em diversas Actions diferentes!

(:

RubemAzenha wrote:
Code:
 try{
 //codigo que lança exceção
 }
 catch (Exception e) {
 throw new ActionException(e);
 }
 


não gosto muito disso

vendo os pontos dos colegas, voto no exception 


É complicado fazer isso para 7642342873 actions né!
Imagina com os Filters..

Dureza... Por isso sugeri propagar Exception! Acho que o programador tem que ter a consciencia disso... Em troca, eu ganhei minha liberdade!

Obrigado Sérgio!
Hehehehhe, Isso aí Sérgio....

Eu voto conscientemente para Exception, pq como eu já tentei te convencer, (mas vc parece mais difícil de convencer que o Klaus), e o Marcelo já disse, o tratamento está a cargo do Programador, e como eu tb já disse, ele tem que ter uma certa LIBERDADE na hora de programar!

Podemos usar a idéia do ExceptionFilter para isso, deu catch em uma exception, retorna EXCEPTION, que terá um globalResult fazendo um chain para outra Action....

Pronto Marcelo, teu Handler tá criado!


Barabing, Baraboom, Bara-Beakman! (Alguem lembra disso?)
Talvez pensando um pouco "a là WW", que tal a criação de Pilhas de Filters?

Tipo....

Code:
 FilterStack filterStack = new FilterStack();
 
 filterStack.addFilter(new FulanoFilter());
 filterStack.addFilter(new CiclanoFilter());
 filterStack.addFilter(new BeltranoFilter());
 
 ActionConfig ac = //ActionConfig.....
 ac.addFilter(filterStack);



Isso é muito útil caso vc queria colocar os mesmos 8634984 filters para várias actions (:
Que tal Sérgio?
Os arquivos.... (mais fácil)
É um projeto do eclipse, só descompactar e adicionar os JARs do mentawai, do velocity e do mysql-connector.


(:
E ai Sérgio...

Desacoplei totalmente a gerência da Conexão da API do Mentawai e da Action fazendo da seguinte forma...

O Dao pede a conexão para uma classe chamada "ConexaoUtils", que verifica na ThreadLocal se já existe uma conexão em andamento. Caso já exista ele usa esta mesma. Se não existir, ela pede ao ConnectionPool uma conexão limpa, armazena na ThreadLocal (para futuros usos) e retorna para o Dao em questao.
Também criei um ConnectionFilter que verifica a execução da Action, e após ela, fecha a conexão corrente usando a mesma ConexaoUtils (que sabe quem é a conexão corrente)!!!

Desta maneira, acredito que eu possa fazer chains e mais chains, e quantas consultas em quantos Daos eu quiser também, a conxão será sempre a mesma, diminuindo o custo para o banco também!

Assim, quem deve saber sobre a conexão sabe, quem não deve, não mete o bedelho! (:

Aqui os códigos (apenas para teste, precisam ser muito melhorados para usar em produção, e a implementação é um exemplo, de fato).

ConexaoAction
Code:
/*
  * Criado em 29/08/2005
  * Lucas Frare Teixeira
  * <a href="mailto:lucas.teixeira@gmail.com">lucas.teixeira@gmail.com</a>
  */
 package action;
 
 import org.mentawai.core.ActionException;
 import org.mentawai.core.BaseAction;
 
 import dao.NomesDao;
 
 public class ConexaoAction extends BaseAction {
 
     public String execute() throws ActionException {
         
         NomesDao nomesDao = new NomesDao();
         String nome = null;
         
         try {
             nome = nomesDao.getRandomName();
             output.setValue("nome", nome);
             return SUCCESS;
         } catch (Exception e) {
             e.printStackTrace();
             return ERROR;
         }
     }
 
 }


NomesDao
Code:
/*
  * Criado em 29/08/2005
  * Lucas Frare Teixeira
  * <a href="mailto:lucas.teixeira@gmail.com">lucas.teixeira@gmail.com</a>
  */
 package dao;
 
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
 public class NomesDao extends JdbcBaseDao {
     
     public String getRandomName() throws Exception {
         PreparedStatement ps = conn().prepareStatement("SELECT * FROM NOMES;");
         ResultSet rs = ps.executeQuery();
         List l = new ArrayList();
         while (rs.next()) {
             l.add(rs.getString(1));
         }
         if (l.size() > 0) {
             Collections.shuffle(l);
             return (String) l.get(0);
         } else 
             return null;
     }
 
 }


JdbcBaseDao
Code:
/*
  * Criado em 29/08/2005
  * Lucas Frare Teixeira
  * <a href="mailto:lucas.teixeira@gmail.com">lucas.teixeira@gmail.com</a>
  */
 package dao;
 
 import java.sql.Connection;
 
 import util.ConexaoUtils;
 
 public class JdbcBaseDao {
     
     private Connection conn;
     
     protected Connection conn() throws Exception {
         if (conn == null || conn.isClosed()) {
             conn = ConexaoUtils.conexaoCorrente();
         }
         return conn;
     }
 
 }
 


ConexaoUtils
Code:
/*
  * Criado em 29/08/2005
  * Lucas Frare Teixeira
  * <a href="mailto:lucas.teixeira@gmail.com">lucas.teixeira@gmail.com</a>
  */
 package util;
 
 import java.sql.Connection;
 
 public class ConexaoUtils {
     
     private static final ThreadLocal LOCAL = new ThreadLocal();
 
     public static Connection conexaoCorrente() throws Exception{
         Connection con = (Connection) LOCAL.get();
         if (con == null || con.isClosed()) {
             con = ConnectionPool.getConnection();
             LOCAL.set(con);
         }
         return con;
     }
 
     public static void closeConnection() throws Exception{
         Connection con = (Connection) LOCAL.get();
         if (con != null && !con.isClosed()) {
             con.close();
         }
         LOCAL.set(null);
     }
 }


ConnectionPool
Code:
/*
  * Criado em 29/08/2005
  * Lucas Frare Teixeira
  * <a href="mailto:lucas.teixeira@gmail.com">lucas.teixeira@gmail.com</a>
  */
 package util;
 
 import java.sql.Connection;
 import java.sql.DriverManager;
 
 public class ConnectionPool {
     
     public static boolean loaded = false;
     
     public static Connection getConnection() throws Exception {
         //Aqui a idéia é usar um pool como o C3P0, 
         //ou outro framework de IoC para a injeção de um DataSource
         
         if (!loaded) {
             Class.forName("com.mysql.jdbc.Driver");
         }
         
         return DriverManager.getConnection(
                     "jdbc:mysql://localhost/mentawai",
                     "root",
                     ""
                 );
         
     }
 
 }
 


ApplicationManager
Code:
/*
  * Criado em 29/08/2005
  * Lucas Frare Teixeira
  * <a href="mailto:lucas.teixeira@gmail.com">lucas.teixeira@gmail.com</a>
  */
 
 import org.mentawai.core.ActionConfig;
 import org.mentawai.core.Forward;
 
 import filter.ConnectionFilter;
 
 import action.ConexaoAction;
 
 public class ApplicationManager extends org.mentawai.core.ApplicationManager {
     
     public void loadActions() {       
         ActionConfig ac = new ActionConfig("/Conexao", ConexaoAction.class)
                 .addConsequence(ConexaoAction.SUCCESS, new Forward("/ok.vm"))
                 .addConsequence(ConexaoAction.ERROR, new Forward("/erro.vm"));
         ac.addFilter(new ConnectionFilter());
         addActionConfig(ac);
     }
 }


ConnectionFilter
Code:
/*
  * Criado em 29/08/2005
  * Lucas Frare Teixeira
  * <a href="mailto:lucas.teixeira@gmail.com">lucas.teixeira@gmail.com</a>
  */
 package filter;
 
 import org.mentawai.core.ActionException;
 import org.mentawai.core.Filter;
 import org.mentawai.core.FilterException;
 import org.mentawai.core.InvocationChain;
 
 import util.ConexaoUtils;
 
 public class ConnectionFilter implements Filter {
 
     public String filter(InvocationChain invocationChain) throws FilterException, ActionException {
         String r = invocationChain.invoke();
         
         try {
             ConexaoUtils.closeConnection();    
         } catch (Exception e) {
             throw new FilterException(e);
         }
         
         return r;
     }
 
     public void destroy() { }
 }
 
Sérgio, também estou pensando em algo. Assim que tiver algo convincente, posto aqui! Obrigado pelas dicas...

Ahhh, a idéia é manter o Dao ligado apenas à conexão, e nunca nem à API do Mentawai, nem a Action... Estou pensando em um Filter implementado por mim que possa gerenciar isto em uma Thread Local....

O que acha? Posto resultados assim que puder considerá-los como 'resultados'.

Heheheh, um abraço!

E ai pessoal,
Antes de tudo, parabéns pelo projeto, está simplesmente d+!

Minha dúvida é a seguinte. Vi que o Mentawai já me ajuda a fazer meu Connection Pooling com um Filter adequado, correto?
Mas eu vi que nos exemplos, a conexão é sempre resgatada diretamente na Action em questão - a Action onde o filter foi adicionado. Porém, pensando de uma forma um pouco mais habitual, vejo que não conseguiria ter um DAO acessado essa connection, a não ser que passasse ele para meu DAO, o que não considero uma boa alternativa. Teria como buscar a connection gerenciada pelo Filter em outra classe que não fosse minha Action? No caso, o DAO em questão?

Valeu galera, e novamente, parabéns!!!
 
Profile for Lucas Teixeira -> Messages posted by Lucas Teixeira [9]
Go to:   
Powered by JForum 2.1.6 © JForum Team