Prevayler cade o

9 respostas
Hempx

peguei o prevayler prevayler2.00.001alpha e estava seguindo esse tutorial do guj

:arrow: http://www.guj.com.br/java.tutorial.artigo.45.1.guj

mas não estou achando a classe SnapshotPrevayler

achei algo parecido... SnapshotManager

peguei a versão mais antiga prevayler1.02.002production e então achei essa classe...

o que devo fazer??? SnapshotManager é uma nova versão de SnapshotPrevayler ???

caso sim... como ficaria essa parte do codigo:

public class PrestoListener implements ServletContextListener {
    
    SnapshotPrevayler prevayler;
    
    public void contextInitialized(ServletContextEvent sce)
    {
        try {
            prevayler = new SnapshotPrevayler(new PrestoSystem(), "/presto/prevalenceBase");
            sce.getServletContext().setAttribute("prevayler", prevayler);
            ClockActor clockActor = new ClockActor(prevayler);
        }
        catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("Presto Tutorial Context Initialized");
    }
    
    public void contextDestroyed(ServletContextEvent sce) 
    {
        try {
            prevayler.takeSnapshot();
        }
        catch (IOException e) {
            e.printStackTrace();            
        }
        System.out.println("Presto Tutorial Context Destroyed");
    }
}

9 Respostas

cv1

No Prevayler 2 vc nao precisa mais instanciar diretamente o seu Prevayler. Ao inves disso, vc usa a PrevaylerFactory:

Prevayler prevayler = PrevaylerFactory.createPrevayler(new MeuSistema(), "diretorio de logs");
Hempx

outra coisa TransactionWithQuery é uma interface
pq ele ta fazendo isso no tutorial

public class AccountCreateTransaction extends TransactionWithQuery {

e tem mais ainda…

no tutorial a assinatura do metodo execute é

public Object executeAndQuery(Object system) throws Exception

mas apenas achei o metado com essa assinatura

executeAndQuery(java.lang.Object prevalentSystem, java.util.Date executionTime)

acaso eu não precise da data da transação posso ficar colocando null que funciona blz???

e mais ainda… tava lendo o tutorial e adaptando para minhas necessiades que eh uma aplicação swing…

os beans e as transações fica tudo igual…
mas na parte do PrestoListener.java que eu citei ali em cima…
como fazeria isso para swing???

ou ficaria melhor eu colocar na minha classe principal… ex:

public class framePrincipal extends JFrame { private static Prevayler; ... ... }

Estou com duvida de como fazer isso do melhor jeito porque meu JFrame principal vai abrir varios JInternalFrames…

queria saber msm é um bom jeito de fazer isso… vlws =)

Hempx

foi mal pelas pergunta ae… mas é porque sou relativamente novo em java… e comecei a tentar aprender esse prevayler hj… e achei bem interessante porque parece um pouco de como estava fazendo a persistencia do meu programa só que bem mais planejado…

Hempx

ajudem-me… :frowning:

Hempx

:arrow: isso que eu fiz eh prevayler???
tem alguma coisa importante que estou esquecendo???

bean

public class Conta implements Serializable {
	private String nome;
	private String senha;
	
	public Conta( String nome, String senha ){
		this.nome = nome;
		this.senha = senha;
	}
	
	public Conta(){
		this( "", "" );
	}
	
	public void setNome( String nome ){
		this.nome = nome;
	}
	
	public String getNome(){
		return nome;
	}
	
	public void setSenha( String senha ){
		this.senha = senha;
	}
	
	public String getSenha(){
		return senha;
	}

}

transações

public class AdicionaConta implements Transaction {
	private String nome;
	private String senha;
	
	public AdicionaConta( String nome, String senha ){
		this.nome = nome;
		this.senha = senha;
	}
	
	public void executeOn( Object system, Date data ){
		Conta conta = null;
		Sistema contas = (Sistema)system;
		
		if( !contas.checkAdicionaConta( nome, senha ) )
		   throw new IllegalArgumentException( "Parametros de conta inválidos." );
		conta = new Conta( nome, senha );
		contas.addConta( conta );

	}
}
public class RecuperaConta implements TransactionWithQuery {
	private HashMap map;
	private String nome;
	
	public RecuperaConta( String nome ){
		this.nome = nome;		
	}
	
	public HashMap getMap(){
		return map;
	}
	
	public Object executeAndQuery( Object system, Date data ) throws Exception {
		Conta conta = null;
		Sistema contas = (Sistema)system;		
		conta = contas.getConta( nome );
		map = contas.getContas();
		
		return conta;		
	}
}

Sistema

public class Sistema implements Serializable{
	private final HashMap contas;
	
	public Sistema(){
		contas = new HashMap();
	}
	
	public Conta getConta( String nome ){
		return (Conta)contas.get( nome );
	}
	
	public HashMap getContas(){
		return contas;
	}
	
	public void addConta( Conta conta ){
		contas.put( conta.getNome(), conta );
	}
	

	public boolean checkAdicionaConta( String nome, String senha ){
		if( senha == null || senha.trim().equals( "" ) ) return false;
		if( nome == null || nome.trim().equals( "" ) ) return false;		
		if( getConta( nome ) != null ) return false;
		
		return true;
	}	
		
}

agora minhas telas em swing

public class Main extends JFrame implements ActionListener {
	private JLabel labelNome;
	private JLabel labelSenha;
	private JTextField txtNome;
	private JPasswordField txtSenha;
	private JButton bntCriaConta;
	private JButton bntMostraContas;
	private JButton bntOk;
	private JButton bntCancel;
	
	public static Prevayler prevayler;
	
	public Main(){
		super( "Prevayler test..." );
		setContentPane( new JPanel ( new GridBagLayout() ) );
		setSize( 200, 130 );
		initComponents();
		initPrevayler();
		
		show();		
			
	}
	
	private void initPrevayler(){
		try{
			prevayler = PrevaylerFactory.createPrevayler( new Sistema() );			
		}
		catch( ClassNotFoundException e ){
			e.printStackTrace();
		}
		catch( IOException e ){
			e.printStackTrace();
		}
		
	}
	
	public void finalizePrevayler(){
		try {
			prevayler.takeSnapshot();
		}
		catch( IOException e ){
			e.printStackTrace();
		}
		
	}
	
	private void initComponents(){
		JPanel panel = (JPanel)getContentPane();
		GridBagLayout  layout = (GridBagLayout)panel.getLayout();
		GridBagConstraints gbConstraints = new GridBagConstraints();
		gbConstraints.fill = GridBagConstraints.HORIZONTAL;
		
		labelNome = new JLabel( "Nome: " );
		gbConstraints.gridx = 0; gbConstraints.gridy = 0;
		layout.setConstraints( labelNome, gbConstraints );
		panel.add( labelNome );
		
		txtNome = new JTextField( 8 );
		gbConstraints.gridx = 1; gbConstraints.gridy = 0;
		layout.setConstraints( txtNome, gbConstraints );
		panel.add( txtNome );
		
		labelSenha = new JLabel( "Senha: " );
		gbConstraints.gridx = 0; gbConstraints.gridy = 1;
		layout.setConstraints( labelSenha, gbConstraints );
		panel.add( labelSenha );
		
		txtSenha = new JPasswordField( 8 );
		gbConstraints.gridx = 1; gbConstraints.gridy = 1;
		layout.setConstraints( txtSenha, gbConstraints );
		panel.add( txtSenha );
		
		bntCriaConta = new JButton( "Cria conta" );
		bntCriaConta.setPreferredSize( new Dimension( 90, 20 ) );
		bntCriaConta.addActionListener( this );
		gbConstraints.gridx = 0; gbConstraints.gridy = 3; 
		layout.setConstraints( bntCriaConta, gbConstraints );
		panel.add( bntCriaConta );
		
		bntMostraContas = new JButton( "Mostra contas" );
		bntMostraContas.setPreferredSize( new Dimension( 90, 20 ) );
		bntMostraContas.addActionListener( this );
		gbConstraints.gridx = 1; gbConstraints.gridy = 3; 
		layout.setConstraints( bntMostraContas, gbConstraints );
		panel.add( bntMostraContas );
		
		bntOk = new JButton( "Ok" );
		bntOk.setPreferredSize( new Dimension( 90, 20 ) );
		bntOk.addActionListener( this );
		gbConstraints.gridx = 0; gbConstraints.gridy = 2; 
		layout.setConstraints( bntOk, gbConstraints );
		panel.add( bntOk );
		
		bntCancel = new JButton( "Cancel" );
		bntCancel.setPreferredSize( new Dimension( 90, 20 ) );
		bntCancel.addActionListener( this );
		gbConstraints.gridx = 1; gbConstraints.gridy = 2; 
		layout.setConstraints( bntCancel, gbConstraints );
		panel.add( bntCancel );		
		
		
		
		
	}
	
	public void actionPerformed( ActionEvent e ){
		if( e.getSource() == bntCriaConta )
		   new CriaConta( this );
		else if( e.getSource() == bntOk )
		   confirma();
		else if( e.getSource() == bntCancel )
		   limpa();
		else if( e.getSource() == bntMostraContas )
		   mostraContas();
		
	}
	
	private void  mostraContas(){
		HashMap map = null;
		RecuperaConta transaction = new RecuperaConta( "" );
		
		try{
			
			Main.prevayler.execute( transaction );
			map = transaction.getMap();

		}
		catch( Exception e ){
			e.printStackTrace();
		}
		
		Collection nomes = map.values();
		Conta conta = null;
		String output = "";
		
		for( Iterator i = nomes.iterator(); i.hasNext(); ){
			conta = (Conta)i.next();
			output += "Nome: " + conta.getNome() + "
";
			
		}
		JOptionPane.showMessageDialog( this, output, "Mostra contas", JOptionPane.OK_OPTION );		
		
	}
	
	private void confirma(){
		Conta conta = null;
		String nome = txtNome.getText().trim();
		String senha = new String( txtSenha.getPassword() ).trim(); 
		RecuperaConta transaction = new RecuperaConta( nome );
		try{
			conta = (Conta)Main.prevayler.execute( transaction );		
		}
		catch( Exception e ){
			e.printStackTrace();
		}		
	
		if( conta == null || !nome.equals( conta.getNome() )  || !senha.equals( conta.getSenha() )  )
		   JOptionPane.showMessageDialog( this, "Senha invalida", "Senha invalida", JOptionPane.OK_OPTION );		   
		else JOptionPane.showMessageDialog( this, "Senha correta!", "Senha correta!", JOptionPane.OK_OPTION );
		limpa();
		
	}
	
	private void limpa(){
		txtNome.setText( "" );
		txtSenha.setText( "" );
	}	
	
	public static void main( String[] args ) {
		new Main();			
	}
	
}
public class CriaConta extends JDialog implements ActionListener{
	private JLabel labelNome;
	private JLabel labelSenha;
	private JTextField txtNome;
	private JPasswordField txtSenha;
	private JButton bntCancel;
	private JButton bntOk;
	
	public CriaConta( Frame owner ){
		super( owner, "Cria conta" );
		setDefaultCloseOperation( JDialog.DISPOSE_ON_CLOSE );
		setContentPane( new JPanel( new GridBagLayout() ) );
		setSize( 200, 100 );
		initComponents();
		
		show();
	}
	
	private void initComponents(){
		JPanel panel = (JPanel)getContentPane();
		GridBagLayout  layout = (GridBagLayout)panel.getLayout();
		GridBagConstraints gbConstraints = new GridBagConstraints();
		gbConstraints.fill = GridBagConstraints.HORIZONTAL;
		
		labelNome = new JLabel( "Nome: " );
		gbConstraints.gridx = 0; gbConstraints.gridy = 0;
		layout.setConstraints( labelNome, gbConstraints );
		panel.add( labelNome );
		
		txtNome = new JTextField( 8 );
		gbConstraints.gridx = 1; gbConstraints.gridy = 0;
		layout.setConstraints( txtNome, gbConstraints );
		panel.add( txtNome );
		
		labelSenha = new JLabel( "Senha: " );
		gbConstraints.gridx = 0; gbConstraints.gridy = 1;
		layout.setConstraints( labelSenha, gbConstraints );
		panel.add( labelSenha );
		
		txtSenha = new JPasswordField( 8 );
		gbConstraints.gridx = 1; gbConstraints.gridy = 1;
		layout.setConstraints( txtSenha, gbConstraints );
		panel.add( txtSenha );
		
		bntOk = new JButton( "ok" );
		bntOk.setPreferredSize( new Dimension( 90, 20 ) );
		bntOk.addActionListener( this );
		gbConstraints.gridx = 0; gbConstraints.gridy = 2; 
		layout.setConstraints( bntOk, gbConstraints );
		panel.add( bntOk );
		
		bntCancel = new JButton( "cancel" );
		bntCancel.setPreferredSize( new Dimension( 90, 20 ) );
		bntCancel.addActionListener( this );
		gbConstraints.gridx = 1; gbConstraints.gridy = 2; 
		layout.setConstraints( bntCancel, gbConstraints );
		panel.add( bntCancel );

	}
	
	public void actionPerformed( ActionEvent e ){
		if( e.getSource() == bntCancel )
		   dispose();
		else if( e.getSource() == bntOk )
		   criaConta();	
	}
	
	private void criaConta(){
		AdicionaConta transaction = new AdicionaConta( txtNome.getText(), new String( txtSenha.getPassword() )  );
		Main.prevayler.execute( transaction );
		dispose();		
	}
}

:arrow: prevayler da pra fazer esses tipo de programas???
:arrow: Caso eu queria deleta uma Conta… tem como eu deleta a conta que eu quero?

Hempx

aff… entendi acho que pelo menos o basico esse prevayler…
é bem mais simples q qualquer um posso imaginar…
e acho tbm que tem muito para esse prevayler evoluir mas parabéns…

:arrow: só to mas uma duvida aqui para variar… os logs antigos são apagos automáticamente?

cv1

Pelo menos por enquanto, nao, mais pra evitar alguma catastrofe :smiley:

E facil mudar o codigo do Prevayler pra apagar os arquivos se vc precisar, entao da um toque :wink:

Hempx

“cv”:
Pelo menos por enquanto, nao, mais pra evitar alguma catastrofe :smiley:

E facil mudar o codigo do Prevayler pra apagar os arquivos se vc precisar, entao da um toque ;)

não que eu queria mudar… mas se for fazendo muitos Snapshot isso não vai crescendo muito o tamanho gasto no HD não… não tem como fazer ele deixar apenas 1 ou 2 logs mais recentes de backup e ir substituindo esses qd necessario?

cv1

Acho que a pergunta eh: pq vc ta fazendo mto snapshot? :wink:

Criado 9 de março de 2004
Ultima resposta 12 de mar. de 2004
Respostas 9
Participantes 2