/*
* 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.serialization;
import org.junit.Test;
import org.hibernate.HibernateException;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.cfg.Configuration;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.internal.SessionFactoryRegistry;
import org.hibernate.internal.util.SerializationHelper;
import org.hibernate.testing.junit4.BaseUnitTestCase;
import org.hibernate.type.TypeFactory;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.fail;
/**
* @author Gail Badner
*/
public class TypeFactorySerializationTest extends BaseUnitTestCase {
private static String NAME = "test name";
@Test
public void testWithSameRegisteredSessionFactory() throws Exception {
Configuration cfg = new Configuration()
.setProperty( AvailableSettings.SESSION_FACTORY_NAME, NAME )
.setProperty( AvailableSettings.SESSION_FACTORY_NAME_IS_JNDI, "false" ); // default is true
SessionFactoryImplementor factory = (SessionFactoryImplementor) cfg.buildSessionFactory();
// Session factory is registered.
assertSame( factory, SessionFactoryRegistry.INSTANCE.getNamedSessionFactory( NAME ) );
TypeFactory typeFactory = factory.getTypeResolver().getTypeFactory();
byte[] typeFactoryBytes = SerializationHelper.serialize( typeFactory );
typeFactory = (TypeFactory) SerializationHelper.deserialize( typeFactoryBytes );
assertSame( factory, typeFactory.resolveSessionFactory() );
factory.close();
}
@Test
public void testUnregisterSerializeRegisterSameSessionFactory() throws Exception {
Configuration cfg = new Configuration()
.setProperty( AvailableSettings.SESSION_FACTORY_NAME, NAME )
.setProperty( AvailableSettings.SESSION_FACTORY_NAME_IS_JNDI, "false" ); // default is true
SessionFactoryImplementor factory = (SessionFactoryImplementor) cfg.buildSessionFactory();
assertSame( factory, SessionFactoryRegistry.INSTANCE.getNamedSessionFactory( NAME ) );
// Remove the session factory from the registry
SessionFactoryRegistry.INSTANCE.removeSessionFactory( factory.getUuid(), NAME, false, null );
assertNull( SessionFactoryRegistry.INSTANCE.findSessionFactory( factory.getUuid(), NAME ) );
TypeFactory typeFactory = factory.getTypeResolver().getTypeFactory();
byte[] typeFactoryBytes = SerializationHelper.serialize( typeFactory );
typeFactory = (TypeFactory) SerializationHelper.deserialize( typeFactoryBytes );
try {
typeFactory.resolveSessionFactory();
fail( "should have failed with HibernateException because session factory is not registered." );
}
catch ( HibernateException ex ) {
// expected because the session factory is not registered.
}
// Re-register the same session factory.
SessionFactoryRegistry.INSTANCE.addSessionFactory( factory.getUuid(), NAME, false, factory, null );
// Session factory resolved from typeFactory should be the new session factory
// (because it is resolved from SessionFactoryRegistry.INSTANCE)
assertSame( factory, typeFactory.resolveSessionFactory() );
factory.close();
}
@Test
public void testUnregisterSerializeRegisterSameSessionFactoryNoName() throws Exception {
Configuration cfg = new Configuration();
SessionFactoryImplementor factory = (SessionFactoryImplementor) cfg.buildSessionFactory();
assertSame( factory, SessionFactoryRegistry.INSTANCE.findSessionFactory( factory.getUuid(), null ) );
// Remove the session factory from the registry
SessionFactoryRegistry.INSTANCE.removeSessionFactory( factory.getUuid(), null, false, null );
assertNull( SessionFactoryRegistry.INSTANCE.findSessionFactory( factory.getUuid(), null ) );
TypeFactory typeFactory = factory.getTypeResolver().getTypeFactory();
byte[] typeFactoryBytes = SerializationHelper.serialize( typeFactory );
typeFactory = (TypeFactory) SerializationHelper.deserialize( typeFactoryBytes );
try {
typeFactory.resolveSessionFactory();
fail( "should have failed with HibernateException because session factory is not registered." );
}
catch ( HibernateException ex ) {
// expected because the session factory is not registered.
}
// Re-register the same session factory.
SessionFactoryRegistry.INSTANCE.addSessionFactory( factory.getUuid(), null, false, factory, null );
// Session factory resolved from typeFactory should be the new session factory
// (because it is resolved from SessionFactoryRegistry.INSTANCE)
assertSame( factory, typeFactory.resolveSessionFactory() );
factory.close();
}
@Test
public void testUnregisterSerializeRegisterDiffSessionFactory() throws Exception {
Configuration cfg = new Configuration()
.setProperty( AvailableSettings.SESSION_FACTORY_NAME, NAME )
.setProperty( AvailableSettings.SESSION_FACTORY_NAME_IS_JNDI, "false" ); // default is true
SessionFactoryImplementor factory = (SessionFactoryImplementor) cfg.buildSessionFactory();
assertSame( factory, SessionFactoryRegistry.INSTANCE.getNamedSessionFactory( NAME ) );
// Remove the session factory from the registry
SessionFactoryRegistry.INSTANCE.removeSessionFactory( factory.getUuid(), NAME, false, null );
assertNull( SessionFactoryRegistry.INSTANCE.findSessionFactory( factory.getUuid(), NAME ) );
TypeFactory typeFactory = factory.getTypeResolver().getTypeFactory();
byte[] typeFactoryBytes = SerializationHelper.serialize( typeFactory );
typeFactory = (TypeFactory) SerializationHelper.deserialize( typeFactoryBytes );
try {
typeFactory.resolveSessionFactory();
fail( "should have failed with HibernateException because session factory is not registered." );
}
catch ( HibernateException ex ) {
// expected because the session factory is not registered.
}
// Now create a new session factory with the same name; it will have a different UUID.
SessionFactoryImplementor factoryWithSameName = (SessionFactoryImplementor) cfg.buildSessionFactory();
assertSame( factoryWithSameName, SessionFactoryRegistry.INSTANCE.getNamedSessionFactory( NAME ) );
assertFalse( factory.getUuid().equals( factoryWithSameName.getUuid() ) );
// Session factory resolved from typeFactory should be the new session factory
// (because it is resolved from SessionFactoryRegistry.INSTANCE)
assertSame( factoryWithSameName, typeFactory.resolveSessionFactory() );
factory.close();
factoryWithSameName.close();
}
@Test
public void testUnregisterSerializeRegisterDiffSessionFactoryNoName() throws Exception {
Configuration cfg = new Configuration();
SessionFactoryImplementor factory = (SessionFactoryImplementor) cfg.buildSessionFactory();
assertSame( factory, SessionFactoryRegistry.INSTANCE.getSessionFactory( factory.getUuid() ) );
// Remove the session factory from the registry
SessionFactoryRegistry.INSTANCE.removeSessionFactory( factory.getUuid(), null, false, null );
assertNull( SessionFactoryRegistry.INSTANCE.getSessionFactory( factory.getUuid() ) );
TypeFactory typeFactory = factory.getTypeResolver().getTypeFactory();
byte[] typeFactoryBytes = SerializationHelper.serialize( typeFactory );
typeFactory = (TypeFactory) SerializationHelper.deserialize( typeFactoryBytes );
try {
typeFactory.resolveSessionFactory();
fail( "should have failed with HibernateException because session factory is not registered." );
}
catch ( HibernateException ex ) {
// expected because the session factory is not registered.
}
// Now create a new session factory with the same name; it will have a different UUID.
SessionFactoryImplementor factoryWithDiffUuid = (SessionFactoryImplementor) cfg.buildSessionFactory();
assertSame( factoryWithDiffUuid, SessionFactoryRegistry.INSTANCE.getSessionFactory( factoryWithDiffUuid.getUuid() ) );
assertFalse( factory.getUuid().equals( factoryWithDiffUuid.getUuid() ) );
// It should not be possible to resolve the session factory with no name configured.
try {
typeFactory.resolveSessionFactory();
fail( "should have failed with HibernateException because session factories were not registered with the same non-null name." );
}
catch ( HibernateException ex ) {
// expected
}
factory.close();
factoryWithDiffUuid.close();
}
}