/* * JBoss, Home of Professional Open Source. * Copyright 2008, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.cts.ejb; import java.util.Collection; import javax.sql.DataSource; import java.sql.Connection; import java.sql.Statement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.Types; import java.sql.SQLException; import javax.naming.InitialContext; import javax.naming.Context; import javax.naming.NamingException; import javax.jms.JMSException; import javax.ejb.EntityBean; import javax.ejb.EntityContext; import javax.ejb.CreateException; import javax.ejb.DuplicateKeyException; import javax.ejb.FinderException; import javax.ejb.ObjectNotFoundException; import javax.ejb.NoSuchEntityException; import javax.ejb.EJBException; import org.jboss.test.cts.keys.AccountPK; import org.jboss.test.cts.jms.ContainerMBox; import org.jboss.test.cts.jms.MsgSender; /** * Class CtsBmpBean is a simple BMP entity bean for testing. * <p/> * If the table used for persistence here does not exist, ejbFindAll() * will create it. * * @author $Author: dimitris@jboss.org $ * @version $Revision: 81036 $ */ public class CtsBmpBean implements EntityBean { org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(getClass()); private static final String TABLE_NAME = "BMP_BEAN_TBL"; EntityContext ctx = null; DataSource ds = null; private MsgSender ms = null; // bmp fields String accountNumber; String personsName; /** * Create a new instance. * * @param pk The primary key of the new instance. * @param personsName Person name of the new instance. * @throws CreateException In case of database row creation failure. * @throws DuplicateKeyException If another instance with this primary key already exist. */ public AccountPK ejbCreate(AccountPK pk, String personsName) throws CreateException, DuplicateKeyException { log.debug("entry ejbCreate(\"" + pk.getKey() + "\", " + "\"" + personsName + "\")"); sendMsg(ContainerMBox.EJB_CREATE_MSG); try { Connection con = ds.getConnection(); try { PreparedStatement ps; // Check for duplicates. ps = con.prepareStatement("SELECT accountNumber " + "FROM " + TABLE_NAME + " " + "WHERE accountNumber=?"); try { ps.setString(1, pk.getKey()); ResultSet rs = ps.executeQuery(); if (rs.next()) throw new DuplicateKeyException("Bean with accountNumber=" + pk.getKey() + " already exists."); } finally { ps.close(); } // Create in database. ps = con.prepareStatement("INSERT INTO " + TABLE_NAME + " VALUES (?,?)"); try { ps.setString(1, pk.getKey()); ps.setString(2, personsName); ps.execute(); } finally { ps.close(); } } finally { con.close(); } } catch (SQLException e) { log.debug("failed", e); throw new CreateException("Entity bean creation failure: " + e.getMessage()); } this.accountNumber = pk.getKey(); this.personsName = personsName; log.debug("Created \"" + accountNumber + "\"."); return pk; } /** * Method ejbPostCreate */ public void ejbPostCreate(AccountPK pk, String personsName) { log.debug("ejbPostCreate(AccountPK, String) called"); sendMsg(ContainerMBox.EJB_POST_CREATE_MSG); } /** * Find a single instance by primary key. * * @param pk Primary key of the instance searched for. * @throws ObjectNotFoundException If no instance with this primary key exists. * @throws FinderException If the lookup failed. */ public AccountPK ejbFindByPrimaryKey(AccountPK pk) throws FinderException { log.debug("entry ejbFindByPrimaryKey"); try { Connection con = ds.getConnection(); try { PreparedStatement ps; ps = con.prepareStatement("SELECT accountNumber " + "FROM " + TABLE_NAME + " " + "WHERE accountNumber=?"); try { ps.setString(1, pk.getKey()); ResultSet rs = ps.executeQuery(); if (!rs.next()) throw new ObjectNotFoundException("No bean with " + "accountNumber=" + pk.getKey() + " found."); return pk; } finally { ps.close(); } } finally { con.close(); } } catch (SQLException e) { log.debug("failed", e); throw new FinderException("Could not find: " + e.getMessage()); } } /** * Find all instances. * * @throws FinderException If the lookup failed. */ public Collection ejbFindAll() throws FinderException { log.debug("entry ejbFindAll"); ensureTableExists(); Collection result = new java.util.LinkedList(); try { Connection con = ds.getConnection(); try { PreparedStatement ps; ps = con.prepareStatement("SELECT accountNumber " + "FROM " + TABLE_NAME); try { ResultSet rs = ps.executeQuery(); while (rs.next()) result.add(new AccountPK(rs.getString(1))); return result; } finally { ps.close(); } } finally { con.close(); } } catch (SQLException e) { log.debug("failed", e); throw new FinderException("Could not find: " + e.getMessage()); } } /** * Find all instances where the personsName property is * equal to the argument. * * @throws FinderException If the lookup failed. */ public Collection ejbFindByPersonsName(String guysName) throws FinderException { log.debug("entry ejbFindByPersonsName(\"" + guysName + "\")."); Collection result = new java.util.LinkedList(); try { Connection con = ds.getConnection(); try { PreparedStatement ps; ps = con.prepareStatement("SELECT accountNumber " + "FROM " + TABLE_NAME + " " + "WHERE name=?"); try { ps.setString(1, guysName); ResultSet rs = ps.executeQuery(); while (rs.next()) result.add(new AccountPK(rs.getString(1))); return result; } finally { ps.close(); } } finally { con.close(); } } catch (SQLException e) { log.debug("failed", e); throw new FinderException("Could not find: " + e.getMessage()); } } /** * Method ejbLoad */ public void ejbLoad() { log.debug("ejbLoad(\"" + ((AccountPK) ctx.getPrimaryKey()).getKey() + "\") called"); sendMsg(ContainerMBox.EJB_LOAD_MSG); try { Connection con = ds.getConnection(); try { PreparedStatement ps; ps = con.prepareStatement("SELECT accountNumber,name " + "FROM " + TABLE_NAME + " " + "WHERE accountNumber=?"); try { AccountPK pk = (AccountPK) ctx.getPrimaryKey(); ps.setString(1, pk.getKey()); ResultSet rs = ps.executeQuery(); if (rs.next() == false) throw new NoSuchEntityException("Instance " + pk.getKey() + " not found in database."); accountNumber = rs.getString(1); personsName = rs.getString(2); } finally { ps.close(); } } finally { con.close(); } } catch (SQLException e) { log.debug("failed", e); throw new EJBException(e); } log.debug("ejbLoad(\"" + ((AccountPK) ctx.getPrimaryKey()).getKey() + "\") returning"); } /** * Method ejbStore */ public void ejbStore() { log.debug("ejbStore(\"" + accountNumber + "\") called"); //Thread.currentThread().dumpStack(); sendMsg(ContainerMBox.EJB_STORE_MSG); try { Connection con = ds.getConnection(); try { PreparedStatement ps; ps = con.prepareStatement("UPDATE " + TABLE_NAME + " " + "SET name=? " + "WHERE accountNumber=?"); try { ps.setString(1, personsName); ps.setString(2, accountNumber); ps.executeUpdate(); } finally { ps.close(); } } finally { con.close(); } } catch (SQLException e) { log.debug("failed", e); throw new EJBException(e); } log.debug("ejbStore(\"" + accountNumber + "\") returning"); } /** * Method ejbRemove */ public void ejbRemove() { log.debug("ejbRemove(\"" + accountNumber + "\") called"); sendMsg(ContainerMBox.EJB_REMOVE_MSG); try { Connection con = ds.getConnection(); try { PreparedStatement ps; ps = con.prepareStatement("DELETE FROM " + TABLE_NAME + " " + "WHERE accountNumber=?"); try { ps.setString(1, accountNumber); ps.executeUpdate(); } finally { ps.close(); } } finally { con.close(); } } catch (SQLException e) { log.debug("failed", e); throw new EJBException(e); } log.debug("Removed \"" + accountNumber + "\"."); } /** * Method ejbActivate */ public void ejbActivate() { log.debug("ejbActivate() called"); sendMsg(ContainerMBox.EJB_ACTIVATE_MSG); } /** * Method ejbPassivate */ public void ejbPassivate() { log.debug("ejbPassivate() called"); sendMsg(ContainerMBox.EJB_PASSIVATE_MSG); // drop message sender if (ms != null) { try { ms.close(); } catch (JMSException e) { log.debug("failed", e); // otherwise ignore } ms = null; } } /** * Method setEntityContext */ public void setEntityContext(EntityContext ctx) { log.debug("setEntityContext() called"); sendMsg(ContainerMBox.SET_ENTITY_CONTEXT_MSG); this.ctx = ctx; // lookup the datasource try { Context context = new InitialContext(); ds = (DataSource) context.lookup("java:comp/env/datasource"); } catch (NamingException nex) { log.debug("failed", nex); throw new EJBException("Datasource not found: " + nex.getMessage()); } } /** * Method unsetEntityContext */ public void unsetEntityContext() { log.debug("unsetEntityContext() called"); sendMsg(ContainerMBox.UNSET_ENTITY_CONTEXT_MSG); ctx = null; ds = null; } // // Private methods // /** * Check if a good table exists, and create it if needed. */ private void ensureTableExists() { boolean exists = true; try { Connection con = ds.getConnection(); try { Statement s = con.createStatement(); try { ResultSet rs = s.executeQuery("SELECT * FROM " + TABLE_NAME); ResultSetMetaData md = rs.getMetaData(); if (md.getColumnCount() != 2) throw new SQLException("Not two columns"); if (!"ACCOUNTNUMBER".equals(md.getColumnName(1).toUpperCase())) throw new SQLException("First column name not \"accountNumber\""); if (!"NAME".equals(md.getColumnName(2).toUpperCase())) throw new SQLException("Second column name not \"name\""); if (md.getColumnType(1) != Types.VARCHAR) throw new SQLException("First column type not VARCHAR"); if (md.getColumnType(2) != Types.VARCHAR) throw new SQLException("Second column type not VARCHAR"); } finally { s.close(); } } finally { con.close(); } } catch (SQLException e) { exists = false; } if (!exists) initializeDatabaseTable(); } /** * Create the table, removing any old table first. */ private void initializeDatabaseTable() { log.debug("Initializing DATABASE tables for BMP test..."); try { Connection con = ds.getConnection(); try { Statement s; s = con.createStatement(); try { s.executeUpdate("DROP TABLE " + TABLE_NAME); log.debug("Dropped old table."); } catch (SQLException e) { // Ignore: Presume the table didn't exist. } finally { s.close(); } s = con.createStatement(); try { s.executeUpdate("CREATE TABLE " + TABLE_NAME + " " + "(accountNumber VARCHAR(25)," + " name VARCHAR(200))"); log.debug("Created new table."); } finally { s.close(); } } finally { con.close(); } } catch (SQLException e) { log.debug("failed", e); throw new EJBException(e); } log.debug("Initialized DATABASE tables for BMP test."); } /** * Send a JMS message. */ private void sendMsg(String msg) { if (ms == null) ms = new MsgSender(); ms.sendMsg(msg); } // // Business methods // /** * Setter for property personsName. */ public void setPersonsName(String personsName) { this.personsName = personsName; } /** * Getter for property personsName. */ public String getPersonsName() { return this.personsName; } }