All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.hibernate.testing.junit5.SessionFactoryScopeExtension Maven / Gradle / Ivy

/*
 * 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.testing.junit5;

import java.util.Optional;

import org.junit.jupiter.api.extension.AfterAllCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.TestExecutionExceptionHandler;
import org.junit.jupiter.api.extension.TestInstancePostProcessor;

import org.jboss.logging.Logger;

import static org.junit.jupiter.api.extension.ExtensionContext.Namespace.create;

/**
 * @asciidoc
 *
 * The thing that actually manages lifecycle of the SessionFactory related to a
 * test class.  Work in conjunction with SessionFactoryScope and SessionFactoryScopeContainer
 *
 * todo (6.0) ?? - allow annotation-driven definition of the test mappings and settings
 *
 * [code]
 * .Annotation-driven example
 * ````
 *
 * @FunctionalSessionFactoryTesting(
 * 		model = @ModelToTest(
 * 			true, // export
 * 			standardModels = {
 * 				@DomainModel( AvailableDomainModel.CONTACTS )
 *  		},
 *  		annotatedClasses = {
 *  			SomeAdditionalClass.class
 *  		},
 *  		mappings = {
 *  			"some-orm-mappings.xml"
 *  		},
 *  		...
 * 		),
 * 		config = @PersistenceUnit(
 * 			sessionFactoryName = "a-special-name",
 * 			...
 * 		)
 * )
 * public class MyTest {
 *
 * }
 *
 * ````
 *
 *
 * @see SessionFactoryScope
 * @see SessionFactoryScopeContainer
 * @see SessionFactoryProducer
 *
 * @author Steve Ebersole
 */
public class SessionFactoryScopeExtension
		implements TestInstancePostProcessor, AfterAllCallback, TestExecutionExceptionHandler {

	private static final Logger log = Logger.getLogger( SessionFactoryScopeExtension.class );

	public static final Object SESSION_FACTORY_KEY = "SESSION_FACTORY";

	public static ExtensionContext.Namespace namespace(Object testInstance) {
		return create( SessionFactoryScopeExtension.class.getName(), testInstance );
	}

	public static Optional findSessionFactoryScope(ExtensionContext context) {
		final ExtensionContext.Namespace namespace = namespace( context.getRequiredTestInstance() );
		final SessionFactoryScope storedScope = (SessionFactoryScope) context.getStore( namespace ).get( SESSION_FACTORY_KEY );

		return Optional.ofNullable( storedScope );
	}


	public SessionFactoryScopeExtension() {
		log.trace( "SessionFactoryScopeExtension#" );
	}


	// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// TestInstancePostProcessor

	@Override
	public void postProcessTestInstance(Object testInstance, ExtensionContext context) {
		log.trace( "SessionFactoryScopeExtension#postProcessTestInstance" );
		if ( SessionFactoryScopeContainer.class.isInstance( testInstance ) ) {
			final SessionFactoryScopeContainer scopeContainer = SessionFactoryScopeContainer.class.cast(
					testInstance );
			final SessionFactoryScope scope = new SessionFactoryScope( scopeContainer.getSessionFactoryProducer() );
			context.getStore( namespace( testInstance ) ).put( SESSION_FACTORY_KEY, scope );

			scopeContainer.injectSessionFactoryScope( scope );
		}
	}


	// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// AfterAllCallback

	@Override
	public void afterAll(ExtensionContext context) {
		final SessionFactoryScope scope = (SessionFactoryScope) context.getStore( namespace( context.getRequiredTestInstance() ) )
				.remove( SESSION_FACTORY_KEY );
		if ( scope != null ) {
			scope.releaseSessionFactory();
		}
	}


	// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// TestExecutionExceptionHandler

	@Override
	public void handleTestExecutionException(ExtensionContext context, Throwable throwable) throws Throwable {
		final Optional scopeOptional = findSessionFactoryScope( context );
		if ( ! scopeOptional.isPresent() ) {
			log.debug( "Could not locate SessionFactoryScope on exception" );
		}
		else {
			scopeOptional.get().releaseSessionFactory();
		}

		throw throwable;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy