/* * Hibernate, Relational Persistence for Idiomatic Java * * License: GNU Lesser General Public License (LGPL), version 2.1 or later. * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.test.connections; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Map; import org.hibernate.ConnectionReleaseMode; import org.hibernate.Session; import org.hibernate.cfg.Environment; import org.hibernate.dialect.H2Dialect; import org.hibernate.engine.jdbc.connections.internal.UserSuppliedConnectionProviderImpl; import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; import org.hibernate.service.spi.Stoppable; import org.hibernate.tool.schema.internal.SchemaCreatorImpl; import org.hibernate.tool.schema.internal.SchemaDropperImpl; import org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase; import org.hibernate.testing.AfterClassOnce; import org.hibernate.testing.BeforeClassOnce; import org.hibernate.testing.RequiresDialect; import org.hibernate.testing.env.ConnectionProviderBuilder; import org.hibernate.test.util.DdlTransactionIsolatorTestingImpl; /** * Implementation of SuppliedConnectionTest. * * @author Steve Ebersole */ @RequiresDialect(H2Dialect.class) public class SuppliedConnectionTest extends ConnectionManagementTestCase { private ConnectionProvider cp; private Connection connectionUnderTest; @BeforeClassOnce @SuppressWarnings("UnusedDeclaration") private void prepareConnectionProvider() { cp = ConnectionProviderBuilder.buildConnectionProvider(); } @AfterClassOnce @SuppressWarnings("UnusedDeclaration") private void releaseConnectionProvider() { try { if ( cp instanceof Stoppable ) { ( ( Stoppable ) cp ).stop(); } cp = null; } catch( Throwable ignore ) { } } @Override protected Session getSessionUnderTest() throws Throwable { connectionUnderTest = cp.getConnection(); Session session = sessionFactory().withOptions().connection( connectionUnderTest ).openSession(); session.beginTransaction(); return session; } @Override protected void reconnect(Session session) { session.reconnect( connectionUnderTest ); } @Override protected void done() throws Throwable { cp.closeConnection( connectionUnderTest ); } @Override @SuppressWarnings("unchecked") protected void addSettings(Map settings) { super.addSettings( settings ); settings.put( Environment.RELEASE_CONNECTIONS, ConnectionReleaseMode.ON_CLOSE.toString() ); settings.put( Environment.CONNECTION_PROVIDER, UserSuppliedConnectionProviderImpl.class.getName() ); Connection connection; try { connection = cp.getConnection(); try { boolean supportsScroll = connection.getMetaData().supportsResultSetType( ResultSet.TYPE_SCROLL_INSENSITIVE ); settings.put( Environment.USE_SCROLLABLE_RESULTSET, "" + supportsScroll ); } finally { connection.close(); } } catch (SQLException ignore) { } } @Override public boolean createSchema() { return false; } @Override public boolean rebuildSessionFactoryOnError() { return false; } @Override protected void prepareTest() throws Exception { super.prepareTest(); try { Connection conn = cp.getConnection(); try { final GenerationTargetToDatabase target = new GenerationTargetToDatabase( new DdlTransactionIsolatorTestingImpl( serviceRegistry(), conn ), true ); new SchemaCreatorImpl( serviceRegistry() ).doCreation( metadata(), false, target ); } finally { cp.closeConnection( conn ); } } catch( Throwable ignore ) { } } @Override protected void cleanupTest() throws Exception { try { Connection conn = cp.getConnection(); try { final GenerationTargetToDatabase target = new GenerationTargetToDatabase( new DdlTransactionIsolatorTestingImpl( serviceRegistry(), conn ), true ); new SchemaDropperImpl( serviceRegistry() ).doDrop( metadata(), false, target ); } finally { cp.closeConnection( conn ); } } catch( Throwable ignore ) { } super.cleanupTest(); } }