import javax.ejb.*;
import java.sql.*;
import javax.sql.DataSource;
import javax.naming.InitialContext;

public class AtutaloBean implements SessionBean {

    private DataSource ds;

    public void ejbRemove(){}
    public void ejbActivate(){}
    public void ejbPassivate(){}
    public void setSessionContext( SessionContext sc ){}

    public void ejbCreate(){
        try {
            InitialContext ic = new InitialContext();
            ds = (DataSource) ic.lookup("java:comp/env/jdbc/bank");
        } catch( Exception e ){ throw new EJBException(e); }
    }

    public void átutal( String honnan, String hova, int mennyit )
    throws AtutalasException {
        try {
            Connection c = ds.getConnection();
            try {
                c.setAutoCommit(false);
                Statement s = c.createStatement();
                módosít(s,honnan,-mennyit);
                módosít(s,hova,mennyit);
                naplóz(s,"utal "+honnan+" "+hova+" "+mennyit);
                s.close();
                c.commit();
            } catch ( Exception e ){
                try { c.rollback(); }
                catch (Exception ex) { throw new Exception(ex+" ("+e+")"); }
                throw e;
            } finally { c.close(); }
        }
        catch (AtutalasException exc){ throw exc; }
        catch (Exception exc){ throw new EJBException(exc); }
    }

    static void módosít (Statement s, String számla, int összeg)
    throws SQLException, AtutalasException {
       ResultSet rs = s.executeQuery("SELECT egyenleg FROM szamla WHERE szam='"
                                                                 +számla+"'");
       if( rs.next() ){
          int újEgyenleg = rs.getInt(1) + összeg;
          if( újEgyenleg<0 )
            throw new AtutalasException("Nincs elég pénz a számlán. ("+számla+")");
          s.executeUpdate("UPDATE szamla SET egyenleg="+újEgyenleg+
                         " WHERE szam='"+számla+"'");
      } else throw new AtutalasException("Nincs ilyen számú számla: "+számla);
      rs.close();
    }

    static void naplóz (Statement s, String szöveg) throws SQLException {
        long idő = (new java.util.Date()).getTime();
        s.executeUpdate("INSERT INTO naplo VALUES ("+idő+",'"+szöveg+"')");
    }

}
