/* * 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.jca.ejb; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import javax.ejb.EJBException; import javax.ejb.SessionBean; import javax.ejb.SessionContext; import javax.naming.InitialContext; import javax.sql.DataSource; import javax.transaction.UserTransaction; import org.jboss.logging.Logger; import org.jboss.resource.adapter.jdbc.WrappedConnection; /** * LocalWrapperCleanupTestSessionBean.java * * @author <a href="mailto:d_jencks@users.sourceforge.net">David Jencks</a> * @version $Revision: 81036 $ * * @ejb:bean name="LocalWrapperCleanupTestSession" * jndi-name="LocalWrapperCleanupTestSession" * view-type="remote" * type="Stateless" * */ public class LocalWrapperCleanupTestSessionBean implements SessionBean { /** The serialVersionUID */ private static final long serialVersionUID = 1L; /** The log */ private static final Logger log = Logger.getLogger(LocalWrapperCleanupTestSessionBean.class); public void testAutoCommitInReturnedConnection() { Connection c = null; try { DataSource ds = (DataSource) new InitialContext().lookup("java:/SingleConnectionDS"); c = ds.getConnection(); if (c.getAutoCommit() == false) { throw new EJBException("Initial autocommit state false!"); } c.setAutoCommit(false); c.commit(); c.close(); c = null; c = ds.getConnection(); if (c.getAutoCommit() == false) { throw new EJBException("Returned and reaccessed autocommit state false!"); } c.close(); c = null; } catch (EJBException e) { throw e; } catch (Exception e) { log.error("Error", e); throw new EJBException("Untested problem in test: " + e); } finally { try { if (c != null) c.close(); } catch (Throwable ignored) { } } } public void testAutoCommit() { Connection c1 = null; Connection c2 = null; try { DataSource ds = (DataSource) new InitialContext().lookup("java:/DefaultDS"); c1 = ds.getConnection(); Connection uc1 = ((WrappedConnection) c1).getUnderlyingConnection(); if (c1.getAutoCommit() == false) { throw new EJBException("Initial autocommit state false!"); } c2 = ds.getConnection(); if (c2.getAutoCommit() == false) { throw new EJBException("Initial autocommit state false!"); } Statement s1 = c1.createStatement(); Statement s2 = c2.createStatement(); s1.execute("create table autocommittest (id integer)"); try { s1.execute("insert into autocommittest values (1)"); uc1.rollback(); ResultSet rs2 = s2.executeQuery("select * from autocommittest where id = 1"); if (!rs2.next()) { throw new EJBException("Row not visible to other connection, autocommit failed"); } rs2.close(); } finally { s1.execute("drop table autocommittest"); } } catch (EJBException e) { throw e; } catch (Exception e) { log.error("Error", e); throw new EJBException("Untested problem in test: " + e); } finally { try { if (c1 != null) c1.close(); } catch (Throwable ignored) { } try { if (c2 != null) c2.close(); } catch (Throwable ignored) { } } } public void testAutoCommitOffInUserTx() { Connection c1 = null; try { DataSource ds = (DataSource) new InitialContext().lookup("java:/DefaultDS"); c1 = ds.getConnection(); Connection uc1 = ((WrappedConnection) c1).getUnderlyingConnection(); if (c1.getAutoCommit() == false) { throw new EJBException("Initial autocommit state false!"); } Statement s1 = c1.createStatement(); s1.execute("create table autocommittest (id integer)"); try { UserTransaction ut = (UserTransaction) new InitialContext().lookup("UserTransaction"); ut.begin(); s1.execute("insert into autocommittest values (1)"); if (uc1.getAutoCommit()) { throw new EJBException("Underlying autocommit is true in user tx!"); } ut.rollback(); ResultSet rs1 = s1.executeQuery("select * from autocommittest where id = 1"); if (rs1.next()) { throw new EJBException("Row committed, autocommit still on!"); } rs1.close(); } finally { s1.execute("drop table autocommittest"); } } catch (EJBException e) { throw e; } catch (Exception e) { log.error("Error", e); throw new EJBException("Untested problem in test: " + e); } finally { try { if (c1 != null) c1.close(); } catch (Throwable ignored) { } } } public void testAutoCommitOffInUserTx2() { try { createTable(); UserTransaction ut = (UserTransaction) new InitialContext().lookup("UserTransaction"); ut.begin(); insertAndCheckAutoCommit(); ut.rollback(); } catch (EJBException e) { throw e; } catch (Exception e) { log.error("Error", e); throw new EJBException("Untested problem in test: " + e); } finally { checkRowAndDropTable(); } } public void testReadOnly() { Connection c1 = null; try { DataSource ds = (DataSource) new InitialContext().lookup("java:/DefaultDS"); c1 = ds.getConnection(); Connection uc1 = ((WrappedConnection) c1).getUnderlyingConnection(); if (uc1.isReadOnly() == true) throw new EJBException("Initial underlying readonly true!"); if (c1.isReadOnly() == true) throw new EJBException("Initial readonly true!"); c1.setReadOnly(true); if (uc1.isReadOnly() == true) throw new EJBException("Read Only should be lazy!"); if (c1.isReadOnly() == false) throw new EJBException("Changed readonly false!"); c1.createStatement(); if (uc1.isReadOnly() == false) throw new EJBException("Lazy read only failed!"); if (c1.isReadOnly() == false) throw new EJBException("Read only changed unexpectedly!"); } catch (EJBException e) { throw e; } catch (Exception e) { log.error("Error", e); throw new EJBException("Untested problem in test: " + e); } finally { try { if (c1 != null) c1.close(); } catch (Throwable ignored) { } } } public void createTable() { try { DataSource ds = (DataSource) new InitialContext().lookup("java:/DefaultDS"); Connection c1 = ds.getConnection(); try { if (c1.getAutoCommit() == false) throw new EJBException("Initial autocommit state false!"); Statement s1 = c1.createStatement(); s1.execute("create table autocommittest (id integer)"); } finally { c1.close(); } } catch (EJBException e) { throw e; } catch (Exception e) { log.error("Error", e); throw new EJBException("Untested problem in test: " + e); } } public void insertAndCheckAutoCommit() { try { DataSource ds = (DataSource) new InitialContext().lookup("java:/DefaultDS"); Connection c1 = ds.getConnection(); Connection uc1 = ((WrappedConnection) c1).getUnderlyingConnection(); try { Statement s1 = c1.createStatement(); s1.execute("insert into autocommittest values (1)"); if (uc1.getAutoCommit()) throw new EJBException("Underlying autocommit is true in user tx!"); } finally { c1.close(); } } catch (EJBException e) { throw e; } catch (Exception e) { log.error("Error", e); throw new EJBException("Untested problem in test: " + e); } } public void testManualNoCommitRollback() { try { DataSource ds = (DataSource) new InitialContext().lookup("java:/DefaultDS"); Connection c1 = ds.getConnection(); try { c1.setAutoCommit(false); Statement s1 = c1.createStatement(); s1.execute("insert into autocommittest values (1)"); } finally { c1.close(); } } catch (EJBException e) { throw e; } catch (Exception e) { log.error("Error", e); throw new EJBException("Untested problem in test: " + e); } } public void testManualSecondNoCommitRollback() { try { DataSource ds = (DataSource) new InitialContext().lookup("java:/DefaultDS"); Connection c1 = ds.getConnection(); try { c1.setAutoCommit(false); Statement s1 = c1.createStatement(); s1.execute("insert into autocommittest values (0)"); c1.commit(); s1.execute("insert into autocommittest values (1)"); } finally { c1.close(); } } catch (EJBException e) { throw e; } catch (Exception e) { log.error("Error", e); throw new EJBException("Untested problem in test: " + e); } } public void checkRowAndDropTable() { try { DataSource ds = (DataSource) new InitialContext().lookup("java:/DefaultDS"); Connection c1 = ds.getConnection(); try { if (c1.getAutoCommit() == false) throw new EJBException("Initial autocommit state false!"); Statement s1 = c1.createStatement(); ResultSet rs1 = s1.executeQuery("select * from autocommittest where id = 1"); if (rs1.next()) throw new EJBException("Row committed, autocommit still on!"); } finally { try { Statement s1 = c1.createStatement(); s1.execute("drop table autocommittest"); } catch (Throwable t) { log.warn("Ignored", t); } c1.close(); } } catch (EJBException e) { throw e; } catch (Exception e) { log.error("Error", e); throw new EJBException("Untested problem in test: " + e); } } public void addRowCheckAndDropTable() { try { DataSource ds = (DataSource) new InitialContext().lookup("java:/DefaultDS"); Connection c1 = ds.getConnection(); try { if (c1.getAutoCommit() == false) throw new EJBException("Initial autocommit state false!"); c1.setAutoCommit(false); Statement s1 = c1.createStatement(); s1.execute("insert into autocommittest values (2)"); c1.commit(); ResultSet rs1 = s1.executeQuery("select * from autocommittest where id = 1"); if (rs1.next()) throw new EJBException("Row committed, didn't rollback!"); } finally { try { Statement s1 = c1.createStatement(); s1.execute("drop table autocommittest"); } catch (Throwable ignored) { } c1.close(); } } catch (EJBException e) { throw e; } catch (Exception e) { log.error("Error", e); throw new EJBException("Untested problem in test: " + e); } } public void ejbCreate() { } public void ejbActivate() { } public void ejbPassivate() { } public void ejbRemove() { } public void setSessionContext(SessionContext ctx) { } public void unsetSessionContext() { } }