package org.jboss.as.test.manualmode.jca.connectionlistener; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.annotation.PostConstruct; import javax.annotation.Resource; import javax.ejb.Stateless; import javax.ejb.TransactionManagement; import javax.ejb.TransactionManagementType; import javax.inject.Inject; import javax.sql.DataSource; import javax.transaction.SystemException; import javax.transaction.UserTransaction; import org.jboss.logging.Logger; import org.junit.Assert; /** * @author <a href="mailto:hsvabek@redhat.com">Hynek Svabek</a> */ @Stateless @TransactionManagement(TransactionManagementType.BEAN) public class JpaTestSlsb implements JpaTestSlsbRemote { private static final Logger log = Logger.getLogger(JpaTestSlsb.class); @Resource(mappedName = "java:jboss/datasources/StatDS") private DataSource ds; @Resource(mappedName = "java:jboss/datasources/StatXaDS") private DataSource xads; private DataSource dataSource; @Inject UserTransaction userTransaction; @PostConstruct public void postConstruct() { dataSource = ds; } public void initDataSource(boolean useXaDs) { if (useXaDs) { dataSource = xads; } else { dataSource = ds; } } public void insertRecord() throws SQLException { insertRecord(false); } public void insertRecord(boolean doRollback) throws SQLException { Connection conn = null; Statement statement = null; try { userTransaction.begin(); Assert.assertNotNull(dataSource); conn = dataSource.getConnection(); statement = conn.createStatement(); statement.executeUpdate("INSERT INTO test_table(description, type) VALUES ('add in bean', '2')"); if (doRollback) { throw new IllegalStateException("Rollback!"); } userTransaction.commit(); } catch (Exception e) { try { userTransaction.rollback(); } catch (IllegalStateException | SecurityException | SystemException e1) { log.warn(e1.getMessage()); } } finally { closeStatement(statement); closeConnection(conn); } } public void assertRecords(int expectedRecords) throws SQLException { Connection conn = null; Statement statement = null; ResultSet resultSet = null; try { conn = dataSource.getConnection(); statement = conn.createStatement(); resultSet = statement.executeQuery("SELECT COUNT(*) FROM test_table WHERE type = '1'"); resultSet.next(); int activatedCount = resultSet.getInt(1); log.trace("Activated count: " + activatedCount); closeResultSet(resultSet); closeStatement(statement); //Even if we only read from DB, activated listener insert record to DB. Assert.assertTrue("Count of records created activatedConnectionListener must be > our created records", activatedCount > expectedRecords); statement = conn.createStatement(); resultSet = statement.executeQuery("SELECT COUNT(*) FROM test_table WHERE type = '0'"); resultSet.next(); int passivatedCount = resultSet.getInt(1); closeResultSet(resultSet); closeStatement(statement); log.trace("Passivated count: " + passivatedCount); if (expectedRecords > 0) { Assert.assertTrue("Count of records created passivatedConnectionListener must be > 0", passivatedCount > 0); } else { Assert.assertTrue("Count of records created activatedConnectionListener must be >= 0", passivatedCount == 0); } statement = conn.createStatement(); resultSet = statement.executeQuery("SELECT COUNT(*) FROM test_table WHERE type = '2'"); resultSet.next(); int ourRecordsCount = resultSet.getInt(1); closeResultSet(resultSet); closeStatement(statement); log.trace("Records count: " + ourRecordsCount); Assert.assertTrue("Unexpected count of records.", expectedRecords == ourRecordsCount); } finally { closeResultSet(resultSet); closeStatement(statement); closeConnection(conn); } } public void assertExactCountOfRecords(int expectedRecords, int expectedActivated, int expectedPassivated) throws SQLException { Connection conn = null; Statement statement = null; ResultSet resultSet = null; try { conn = dataSource.getConnection(); statement = conn.createStatement(); resultSet = statement.executeQuery("SELECT COUNT(*) FROM test_table WHERE type = '1'"); resultSet.next(); int activatedCount = resultSet.getInt(1); closeResultSet(resultSet); closeStatement(statement); log.trace("Activated count: " + activatedCount); //Even if we only read from DB, activated listener insert record to DB. Assert.assertEquals("Activated count: ", expectedActivated, activatedCount); statement = conn.createStatement(); resultSet = statement.executeQuery("SELECT COUNT(*) FROM test_table WHERE type = '0'"); resultSet.next(); int passivatedCount = resultSet.getInt(1); closeResultSet(resultSet); closeStatement(statement); log.trace("Passivated count: " + passivatedCount); Assert.assertEquals("Passivated count: ", expectedPassivated, passivatedCount); statement = conn.createStatement(); resultSet = statement.executeQuery("SELECT COUNT(*) FROM test_table WHERE type = '2'"); resultSet.next(); int ourRecordsCount = resultSet.getInt(1); closeResultSet(resultSet); closeStatement(statement); log.trace("Records count: " + ourRecordsCount); Assert.assertEquals("Records count: ", expectedRecords, ourRecordsCount); } finally { closeResultSet(resultSet); closeStatement(statement); closeConnection(conn); } } private void closeResultSet(ResultSet resultSet) { try { if (resultSet != null && !resultSet.isClosed()) { resultSet.close(); } } catch (Exception e) { log.warn(e.getMessage()); } } private void closeConnection(Connection conn) { try { if (conn != null && !conn.isClosed()) { conn.close(); } } catch (Exception e) { log.warn(e.getMessage()); } } private void closeStatement(Statement statement) { try { if (statement != null && !statement.isClosed()) { statement.close(); } } catch (Exception e) { log.warn(e.getMessage()); } } }