package study.ejb3.projectbank.agency.ejb; import javax.annotation.PreDestroy; import javax.annotation.Resource; import javax.ejb.PrePassivate; import javax.ejb.Remove; import javax.ejb.SessionContext; import javax.ejb.Stateful; import javax.interceptor.Interceptors; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import study.ejb3.projectbank.account.Account; import study.ejb3.projectbank.agency.Agency; import study.ejb3.projectbank.agency.AgencyException; import study.ejb3.projectbank.interceptors.AgencyLogger; @Stateful public class AgencyFacadeBean implements AgencyFacade { @Resource private SessionContext ctx; @PersistenceContext(unitName = "BANK_DB_UNIT") private EntityManager em; private Agency agency; private int getNewAccountNumber() { return Math.abs((int) System.currentTimeMillis()); } public void initiateSession(long agencyNumber) throws AgencyException { if(agencyNumber <= 0) { throw new AgencyException("Invalid agency."); } Query query = em.createNamedQuery(Agency.FIND_AGENCY); query.setParameter(1, agencyNumber); this.agency = (Agency) query.getSingleResult(); if(agency == null) { throw new AgencyException("Agency not found, check the agency number."); } } @PreDestroy @Remove @PrePassivate public void remove() { this.agency = null; this.em = null; this.ctx = null; } @Interceptors(AgencyLogger.class) public void createAccount(String name, double balance) throws AgencyException { if(name == null || name.length() < 5) { throw new AgencyException("Invalid name."); } else if(balance < 0) { throw new AgencyException("Invalid balance, must be greater or equals 0."); } Account account = new Account(agency.getAgencyNumber(), name, balance); account.setAccountNumber(getNewAccountNumber()); // creates the account em.persist(account); System.out.println("Account created"); } public String getAgencyInformation() { return agency.getAgencyNumber() + " - " + agency.getAddress(); } }