Context-Prevayler2.02.004

4 respostas
Ironlynx

Pessoal,tô testando aqui o prevayler e tô notando algo estranho…tenho uma classe principal de negócios(Teste):

package net.testes;
import java.util.*;
import java.util.Date;
import java.util.HashMap;
import org.prevayler.*;
import org.prevayler.Clock;
import org.prevayler.implementation.clock.*;

public class Teste implements java.io.Serializable{
	//variaveis 
	private final Usuario[] usuarios;
    private final HashMap logados = new HashMap();
    
    public Teste(){//throws Exception{
    	usuarios=new Usuario[10];
    	 usuarios[0]=new Usuario("200002108901","Ruela,José","matriculado","INFO100","oi");
        
        addUsuario(usuarios[0]);

     }//fim do construtor
         
     
    public Usuario getUsuario(String matricula){
         return (Usuario)logados.get(matricula);
    } 
    
    public void addUsuario(Usuario aluno){
         logados.put(aluno.matricula,aluno);
    }
        
   }//fim da Classe Principal

e um Listener para tacar a aplicação no contexto:

package net.testes;
import java.io.IOException;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.prevayler.Prevayler; 
import org.prevayler.PrevaylerFactory; 

public class TesteListener implements ServletContextListener{
	Prevayler prevayler = null; 
	PrevaylerFactory factory=null; 
	Snaps snapshot = null; 

public void contextInitialized(ServletContextEvent sce){
   
   try{
   
   // Cria o prevayler 
   prevayler = PrevaylerFactory.createPrevayler(new Teste(),"BaseDeTeste"); 
   //torna o Prevayler conponente do Contexto da Aplicação
   sce.getServletContext().setAttribute("prevayler", prevayler);
   //atribui um objeto prevayler ao Temporizador de Snapshots   
   snapshot=new Snaps(prevayler);
   //dispara a thread de execução
   snapshot.start();
   
  // prevayler.execute(new Usuario("200002108101","Planck,Max","matriculado","INFO100","ueba")); 
   }
   catch(ClassNotFoundException e){
   	e.printStackTrace();
   }
   catch(IOException e) {
    e.printStackTrace();
   }
   System.out.println("SIAP2004-Contexto Iniciado!");
	
}

 public void contextDestroyed(ServletContextEvent sce){
	
	try {  System.out.println("Snapshot finalizado!");
            snapshot.interrupt();
            
        }
    catch(Exception e) {
            e.printStackTrace();            
        }
        System.out.println("SIAP2004 Protótipo de Testes-Contexto Destruído");

	
   }//destrói o Contexto da Aplicação 

}//fim da Classe SistemaAcademicoListener

Snaps eh uma classe q controla os snapshots a cada 2min e Usuario eh uma classe de negócio q implementa Serializable para ser persistido pelo prevayler.Analisando os logs do Tomcat,os snaps são tirados,mas a base jamais eh criada.Eu tô esquecendo alguma coisa?(extender uma classe,alguma interface?)

4 Respostas

Ironlynx
mesmo comentando esse trecho:
usuarios=new Usuario[10]; 
        usuarios[0]=new Usuario("200002108901","Ruela,José","matriculado","INFO100","oi"); 
        
        addUsuario(usuarios[0]);
e fazendo Usuario implementar Transaction:
package net.testes;
import java.io.Serializable;
import org.prevayler.*;

public class Usuario implements Serializable,Transaction{

    public final String matricula;
    public final String senha;
    public final String nome;
    public final String situacao;
    public final String curso;
    
  public Usuario(String matricula,String nome,String situacao,String curso,String senha) {
        this.matricula= matricula;
        this.nome=nome;
        this.situacao=situacao;
        this.curso=curso;
        this.senha= senha;    
        
  }
    
   public void executeOn(Object prevalentSystem, java.util.Date ignored){
   	  ((Teste)prevalentSystem).addUsuario(new Usuario(matricula,nome,situacao,curso,senha));
    		
    	}
         
    
}
e descomentando:
prevayler.execute(new Usuario("200002108101","Planck,Max","matriculado","INFO100","ueba"));
Os Snaps são disparados mas a Base não é efetivamente criada... Se alguma boa(ou má :twisted: )alma se interessar em testar,o web.xml eh:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
	<listener>
    	<listener-class>net.testes.TesteListener</listener-class>
  	</listener>
</web-app>
e o descritor do Contextlistener(deve ser colocado em Tomcat/conf/Catalina/localhost -agradeço a paulo silveira pela dica):
<?xml version='1.0' encoding='utf-8'?>
<Context docBase="C:/Testa" path="/Testa" reloadable="true">
</Context>
Mas nada da base funcionar... :roll: :?: :? :!: :evil:
Ironlynx
package net.testes;
import java.io.IOException;
import org.prevayler.Prevayler;

public class Snaps extends Thread {
   
    Prevayler prevayler;
   
    public Snaps(Prevayler prevayler) {
        this.prevayler = prevayler;
    }
       
    public void run()  {
        super.run();
       
   try {       
           while (true) {
                   Thread.sleep(1000 * 5);
                   prevayler.takeSnapshot();
                   System.out.println("Snapshot disparado as " + new java.util.Date());
           }
   } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }          
    }
}
tinha esquecido de postar os Snaps...
Ironlynx

mea culpa mode="on"

Eu disse q a base não tava sendo gerada,pessoal,descobri q não eh verdade!Usando Win2k e o tomcat como serviço,a base prevalente eh criada em winnt/system32/-Base-
Como meu winnt tava oculto,se o Jacob da lista internacional do prevayler não avisa,eu não ia saber(nem encontrar) nunca...
fica o aviso de atenção qdo usarem o prevayler no Tomcat!
mea culpa mode="off"

Agora,se meu objeto tah sendo persistido,pq raios eu não consigo me logar no Sistema? :?: :?: :?:

Opa!Tava esquecendo...meu Usuário na verdade tah assim:
package net.testes;
import java.io.Serializable;
import org.prevayler.*;

public class Usuario implements Serializable{ //,Transaction{

    public final String matricula;
    public final String senha;
    public final String nome;
    public final String situacao;
    public final String curso;
    
  public Usuario(String matricula,String nome,String situacao,String curso,String senha) {
        this.matricula= matricula;
        this.nome=nome;
        this.situacao=situacao;
        this.curso=curso;
        this.senha= senha;    
        
  }
    
  public boolean equals(Object obj){
  	if (obj == this) return true;
    if (obj == null) return false;
    if (getClass() != obj.getClass()) return false;
    Usuario aluno=(Usuario)obj;
    return (aluno.senha.equals(senha));
  }
  
  public int hashCode(){
  	int resultado=10;
  	resultado = 37 * resultado + senha.hashCode();
  	return resultado;

  }
    
  /* public void executeOn(Object prevalentSystem, java.util.Date ignored){
   	  ((Teste)prevalentSystem).addUsuario(new Usuario(matricula,nome,situacao,curso,senha));
    		
    	}*/  
    
}

E o Login.jsp:

<%@ page language="java" import="net.testes.*,org.prevayler.*" errorPage="/erro.jsp"  %> 
<% Prevayler prevayler=(Prevayler)this.getServletContext().getAttribute("prevayler"); 
Usuario usuario=((Teste)prevayler.prevalentSystem()).getUsuario(request.getParameter("matricula")); 

   String senha=request.getParameter("senha"); 
      
    
    
    if(usuario==null||!usuario.senha.equals(senha)){ 
 %> 
 <html><head><title>SIAP2004</title> 
 <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> 
 </head> 
  
 <body><p>Login/Senha inválida! Favor,<a href="javascript:history.back()">Clicar Aqui</a> 
 para tentar novamente.</p> 
 </body> 
 </html> 
 <% } 
  else{ 
     if(usuario.matricula.length()==12){ 
      session.setAttribute("usuario",usuario); 
      response.sendRedirect("Aluno.jsp"); 
        } 
     else 
      if(usuario.matricula.length()==5){ 
       session.setAttribute("usuario",usuario); 
       response.sendRedirect("Professor.jsp"); 
       }      
      } 
  %>
Ironlynx

Mãos a palmatória:
depois de escrever na lista do Prevayler,mandar email a torto e a direito,pentelhar o Daniel lah no ICQ,venho por meio desta comunicar que a Po-Ha do erro era um maldido name=“password” quando deveria ser name=“senha” para eu pegá-lo com o respectivo request.getParameter(“senha”); na minha Entrada.jsp…shit! :roll:
Como diria um antigo professor,tropeçei na pedrinha…

Criado 20 de outubro de 2004
Ultima resposta 25 de out. de 2004
Respostas 4
Participantes 1