/*
* Copyright 2002-2008 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.orm.hibernate3;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import javax.transaction.TransactionManager;
import junit.framework.TestCase;
import org.easymock.MockControl;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Interceptor;
import org.hibernate.SessionFactory;
import org.hibernate.cache.CacheProvider;
import org.hibernate.cache.NoCacheProvider;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.hibernate.cfg.ImprovedNamingStrategy;
import org.hibernate.cfg.Mappings;
import org.hibernate.cfg.NamingStrategy;
import org.hibernate.connection.UserSuppliedConnectionProvider;
import org.hibernate.engine.FilterDefinition;
import org.hibernate.event.MergeEvent;
import org.hibernate.event.MergeEventListener;
import org.hibernate.mapping.TypeDef;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
/**
* @author Juergen Hoeller
* @since 05.03.2005
*/
public class LocalSessionFactoryBeanTests extends TestCase {
public void testLocalSessionFactoryBeanWithDataSource() throws Exception {
final DriverManagerDataSource ds = new DriverManagerDataSource();
final List invocations = new ArrayList();
LocalSessionFactoryBean sfb = new LocalSessionFactoryBean() {
protected Configuration newConfiguration() {
return new Configuration() {
public Configuration addInputStream(InputStream is) {
try {
is.close();
}
catch (IOException ex) {
}
invocations.add("addResource");
return this;
}
};
}
protected SessionFactory newSessionFactory(Configuration config) {
assertEquals(LocalDataSourceConnectionProvider.class.getName(),
config.getProperty(Environment.CONNECTION_PROVIDER));
assertEquals(ds, LocalSessionFactoryBean.getConfigTimeDataSource());
invocations.add("newSessionFactory");
return null;
}
};
sfb.setDataSource(ds);
sfb.afterPropertiesSet();
assertTrue(sfb.getConfiguration() != null);
assertEquals("newSessionFactory", invocations.get(0));
}
public void testLocalSessionFactoryBeanWithCacheProvider() throws Exception {
final CacheProvider cacheProvider = new NoCacheProvider();
final List invocations = new ArrayList();
LocalSessionFactoryBean sfb = new LocalSessionFactoryBean() {
protected Configuration newConfiguration() {
return new Configuration() {
public Configuration addInputStream(InputStream is) {
try {
is.close();
}
catch (IOException ex) {
}
invocations.add("addResource");
return this;
}
};
}
protected SessionFactory newSessionFactory(Configuration config) {
assertEquals(LocalCacheProviderProxy.class.getName(),
config.getProperty(Environment.CACHE_PROVIDER));
assertSame(cacheProvider, LocalSessionFactoryBean.getConfigTimeCacheProvider());
invocations.add("newSessionFactory");
return null;
}
};
sfb.setCacheProvider(cacheProvider);
sfb.afterPropertiesSet();
assertTrue(sfb.getConfiguration() != null);
assertEquals("newSessionFactory", invocations.get(0));
}
public void testLocalSessionFactoryBeanWithTransactionAwareDataSource() throws Exception {
final DriverManagerDataSource ds = new DriverManagerDataSource();
final List invocations = new ArrayList();
LocalSessionFactoryBean sfb = new LocalSessionFactoryBean() {
protected Configuration newConfiguration() {
return new Configuration() {
public Configuration addInputStream(InputStream is) {
try {
is.close();
}
catch (IOException ex) {
}
invocations.add("addResource");
return this;
}
};
}
protected SessionFactory newSessionFactory(Configuration config) {
assertEquals(TransactionAwareDataSourceConnectionProvider.class.getName(),
config.getProperty(Environment.CONNECTION_PROVIDER));
assertEquals(ds, LocalSessionFactoryBean.getConfigTimeDataSource());
invocations.add("newSessionFactory");
return null;
}
};
sfb.setDataSource(ds);
sfb.setUseTransactionAwareDataSource(true);
sfb.afterPropertiesSet();
assertTrue(sfb.getConfiguration() != null);
assertEquals("newSessionFactory", invocations.get(0));
}
public void testLocalSessionFactoryBeanWithDataSourceAndMappingResources() throws Exception {
final DriverManagerDataSource ds = new DriverManagerDataSource();
MockControl tmControl = MockControl.createControl(TransactionManager.class);
final TransactionManager tm = (TransactionManager) tmControl.getMock();
final List invocations = new ArrayList();
LocalSessionFactoryBean sfb = new LocalSessionFactoryBean() {
protected Configuration newConfiguration() {
return new Configuration() {
public Configuration addInputStream(InputStream is) {
try {
is.close();
}
catch (IOException ex) {
}
invocations.add("addResource");
return this;
}
};
}
protected SessionFactory newSessionFactory(Configuration config) {
assertEquals(LocalJtaDataSourceConnectionProvider.class.getName(),
config.getProperty(Environment.CONNECTION_PROVIDER));
assertEquals(ds, LocalSessionFactoryBean.getConfigTimeDataSource());
assertEquals(LocalTransactionManagerLookup.class.getName(),
config.getProperty(Environment.TRANSACTION_MANAGER_STRATEGY));
assertEquals(tm, LocalSessionFactoryBean.getConfigTimeTransactionManager());
invocations.add("newSessionFactory");
return null;
}
};
sfb.setMappingResources(new String[]{
"/org/springframework/beans/factory/xml/test.xml",
"/org/springframework/beans/factory/xml/child.xml"});
sfb.setDataSource(ds);
sfb.setJtaTransactionManager(tm);
sfb.afterPropertiesSet();
assertTrue(sfb.getConfiguration() != null);
assertEquals("addResource", invocations.get(0));
assertEquals("addResource", invocations.get(1));
assertEquals("newSessionFactory", invocations.get(2));
}
public void testLocalSessionFactoryBeanWithDataSourceAndMappingJarLocations() throws Exception {
final DriverManagerDataSource ds = new DriverManagerDataSource();
final Set invocations = new HashSet();
LocalSessionFactoryBean sfb = new LocalSessionFactoryBean() {
protected Configuration newConfiguration() {
return new Configuration() {
public Configuration addJar(File file) {
invocations.add("addResource " + file.getPath());
return this;
}
};
}
protected SessionFactory newSessionFactory(Configuration config) {
assertEquals(LocalDataSourceConnectionProvider.class.getName(),
config.getProperty(Environment.CONNECTION_PROVIDER));
assertEquals(ds, LocalSessionFactoryBean.getConfigTimeDataSource());
invocations.add("newSessionFactory");
return null;
}
};
sfb.setMappingJarLocations(new Resource[]{
new FileSystemResource("mapping.hbm.jar"), new FileSystemResource("mapping2.hbm.jar")});
sfb.setDataSource(ds);
sfb.afterPropertiesSet();
assertTrue(sfb.getConfiguration() != null);
assertTrue(invocations.contains("addResource mapping.hbm.jar"));
assertTrue(invocations.contains("addResource mapping2.hbm.jar"));
assertTrue(invocations.contains("newSessionFactory"));
}
public void testLocalSessionFactoryBeanWithDataSourceAndProperties() throws Exception {
final DriverManagerDataSource ds = new DriverManagerDataSource();
final Set invocations = new HashSet();
LocalSessionFactoryBean sfb = new LocalSessionFactoryBean() {
protected Configuration newConfiguration() {
return new Configuration() {
public Configuration addInputStream(InputStream is) {
try {
is.close();
}
catch (IOException ex) {
}
invocations.add("addResource");
return this;
}
};
}
protected SessionFactory newSessionFactory(Configuration config) {
assertEquals(LocalDataSourceConnectionProvider.class.getName(),
config.getProperty(Environment.CONNECTION_PROVIDER));
assertEquals(ds, LocalSessionFactoryBean.getConfigTimeDataSource());
assertEquals("myValue", config.getProperty("myProperty"));
invocations.add("newSessionFactory");
return null;
}
};
sfb.setMappingLocations(new Resource[]{
new ClassPathResource("/org/springframework/beans/factory/xml/test.xml")});
sfb.setDataSource(ds);
Properties prop = new Properties();
prop.setProperty(Environment.CONNECTION_PROVIDER, "myClass");
prop.setProperty("myProperty", "myValue");
sfb.setHibernateProperties(prop);
sfb.afterPropertiesSet();
assertTrue(sfb.getConfiguration() != null);
assertTrue(invocations.contains("addResource"));
assertTrue(invocations.contains("newSessionFactory"));
}
public void testLocalSessionFactoryBeanWithValidProperties() throws Exception {
final Set invocations = new HashSet();
LocalSessionFactoryBean sfb = new LocalSessionFactoryBean() {
protected SessionFactory newSessionFactory(Configuration config) {
assertEquals(UserSuppliedConnectionProvider.class.getName(),
config.getProperty(Environment.CONNECTION_PROVIDER));
assertEquals("myValue", config.getProperty("myProperty"));
invocations.add("newSessionFactory");
return null;
}
};
Properties prop = new Properties();
prop.setProperty(Environment.CONNECTION_PROVIDER, UserSuppliedConnectionProvider.class.getName());
prop.setProperty("myProperty", "myValue");
sfb.setHibernateProperties(prop);
sfb.afterPropertiesSet();
assertTrue(sfb.getConfiguration() != null);
assertTrue(invocations.contains("newSessionFactory"));
}
public void testLocalSessionFactoryBeanWithInvalidProperties() throws Exception {
LocalSessionFactoryBean sfb = new LocalSessionFactoryBean();
sfb.setMappingResources(new String[0]);
Properties prop = new Properties();
prop.setProperty(Environment.CONNECTION_PROVIDER, "myClass");
sfb.setHibernateProperties(prop);
try {
sfb.afterPropertiesSet();
}
catch (HibernateException ex) {
// expected, provider class not found
}
}
public void testLocalSessionFactoryBeanWithInvalidMappings() throws Exception {
LocalSessionFactoryBean sfb = new LocalSessionFactoryBean();
sfb.setMappingResources(new String[]{"mapping.hbm.xml"});
try {
sfb.afterPropertiesSet();
}
catch (IOException ex) {
// expected, mapping resource not found
}
}
public void testLocalSessionFactoryBeanWithCustomSessionFactory() throws Exception {
MockControl factoryControl = MockControl.createControl(SessionFactory.class);
final SessionFactory sessionFactory = (SessionFactory) factoryControl.getMock();
sessionFactory.close();
factoryControl.setVoidCallable(1);
factoryControl.replay();
LocalSessionFactoryBean sfb = new LocalSessionFactoryBean() {
protected SessionFactory newSessionFactory(Configuration config) {
return sessionFactory;
}
};
sfb.setMappingResources(new String[0]);
sfb.setDataSource(new DriverManagerDataSource());
sfb.setExposeTransactionAwareSessionFactory(false);
sfb.afterPropertiesSet();
assertTrue(sessionFactory == sfb.getObject());
sfb.destroy();
factoryControl.verify();
}
public void testLocalSessionFactoryBeanWithEntityInterceptor() throws Exception {
LocalSessionFactoryBean sfb = new LocalSessionFactoryBean() {
protected Configuration newConfiguration() {
return new Configuration() {
public Configuration setInterceptor(Interceptor interceptor) {
throw new IllegalArgumentException(interceptor.toString());
}
};
}
};
sfb.setMappingResources(new String[0]);
sfb.setDataSource(new DriverManagerDataSource());
MockControl interceptorControl = MockControl.createControl(Interceptor.class);
Interceptor entityInterceptor = (Interceptor) interceptorControl.getMock();
interceptorControl.replay();
sfb.setEntityInterceptor(entityInterceptor);
try {
sfb.afterPropertiesSet();
fail("Should have thrown IllegalArgumentException");
}
catch (IllegalArgumentException ex) {
// expected
assertTrue("Correct exception", ex.getMessage().equals(entityInterceptor.toString()));
}
}
public void testLocalSessionFactoryBeanWithNamingStrategy() throws Exception {
LocalSessionFactoryBean sfb = new LocalSessionFactoryBean() {
protected Configuration newConfiguration() {
return new Configuration() {
public Configuration setNamingStrategy(NamingStrategy namingStrategy) {
throw new IllegalArgumentException(namingStrategy.toString());
}
};
}
};
sfb.setMappingResources(new String[0]);
sfb.setDataSource(new DriverManagerDataSource());
sfb.setNamingStrategy(ImprovedNamingStrategy.INSTANCE);
try {
sfb.afterPropertiesSet();
fail("Should have thrown IllegalArgumentException");
}
catch (IllegalArgumentException ex) {
// expected
assertTrue("Correct exception", ex.getMessage().equals(ImprovedNamingStrategy.INSTANCE.toString()));
}
}
public void testLocalSessionFactoryBeanWithCacheStrategies() throws Exception {
final Properties registeredClassCache = new Properties();
final Properties registeredCollectionCache = new Properties();
LocalSessionFactoryBean sfb = new LocalSessionFactoryBean() {
protected Configuration newConfiguration() {
return new Configuration() {
public Configuration setCacheConcurrencyStrategy(String clazz, String concurrencyStrategy) {
registeredClassCache.setProperty(clazz, concurrencyStrategy);
return this;
}
public Configuration setCollectionCacheConcurrencyStrategy(String collectionRole, String concurrencyStrategy) {
registeredCollectionCache.setProperty(collectionRole, concurrencyStrategy);
return this;
}
};
}
protected SessionFactory newSessionFactory(Configuration config) {
return null;
}
};
sfb.setMappingResources(new String[0]);
sfb.setDataSource(new DriverManagerDataSource());
Properties classCache = new Properties();
classCache.setProperty("org.springframework.beans.TestBean", "read-write");
sfb.setEntityCacheStrategies(classCache);
Properties collectionCache = new Properties();
collectionCache.setProperty("org.springframework.beans.TestBean.friends", "read-only");
sfb.setCollectionCacheStrategies(collectionCache);
sfb.afterPropertiesSet();
assertEquals(classCache, registeredClassCache);
assertEquals(collectionCache, registeredCollectionCache);
}
public void testLocalSessionFactoryBeanWithCacheStrategiesAndRegions() throws Exception {
final Properties registeredClassCache = new Properties();
final Properties registeredCollectionCache = new Properties();
LocalSessionFactoryBean sfb = new LocalSessionFactoryBean() {
protected Configuration newConfiguration() {
return new Configuration() {
public void setCacheConcurrencyStrategy(String clazz, String concurrencyStrategy, String regionName) {
registeredClassCache.setProperty(clazz, concurrencyStrategy + "," + regionName);
}
public void setCollectionCacheConcurrencyStrategy(String collectionRole, String concurrencyStrategy, String regionName) {
registeredCollectionCache.setProperty(collectionRole, concurrencyStrategy + "," + regionName);
}
};
}
protected SessionFactory newSessionFactory(Configuration config) {
return null;
}
};
sfb.setMappingResources(new String[0]);
sfb.setDataSource(new DriverManagerDataSource());
Properties classCache = new Properties();
classCache.setProperty("org.springframework.beans.TestBean", "read-write,myRegion");
sfb.setEntityCacheStrategies(classCache);
Properties collectionCache = new Properties();
collectionCache.setProperty("org.springframework.beans.TestBean.friends", "read-only,myRegion");
sfb.setCollectionCacheStrategies(collectionCache);
sfb.afterPropertiesSet();
assertEquals(classCache, registeredClassCache);
assertEquals(collectionCache, registeredCollectionCache);
}
public void testLocalSessionFactoryBeanWithEventListeners() throws Exception {
final Map registeredListeners = new HashMap();
LocalSessionFactoryBean sfb = new LocalSessionFactoryBean() {
protected Configuration newConfiguration() {
return new Configuration() {
public void setListener(String type, Object listener) {
registeredListeners.put(type, listener);
}
};
}
protected SessionFactory newSessionFactory(Configuration config) {
return null;
}
};
sfb.setMappingResources(new String[0]);
sfb.setDataSource(new DriverManagerDataSource());
Map listeners = new HashMap();
listeners.put("flush", "myListener");
listeners.put("create", "yourListener");
sfb.setEventListeners(listeners);
sfb.afterPropertiesSet();
assertEquals(listeners, registeredListeners);
}
public void testLocalSessionFactoryBeanWithEventListenerSet() throws Exception {
final Map registeredListeners = new HashMap();
LocalSessionFactoryBean sfb = new LocalSessionFactoryBean() {
protected Configuration newConfiguration() {
return new Configuration() {
public void setListeners(String type, Object[] listeners) {
assertTrue(listeners instanceof MergeEventListener[]);
registeredListeners.put(type, new HashSet(Arrays.asList(listeners)));
}
};
}
protected SessionFactory newSessionFactory(Configuration config) {
return null;
}
};
sfb.setMappingResources(new String[0]);
sfb.setDataSource(new DriverManagerDataSource());
Map listeners = new HashMap();
Set mergeSet = new HashSet();
mergeSet.add(new DummyMergeEventListener());
mergeSet.add(new DummyMergeEventListener());
listeners.put("merge", mergeSet);
sfb.setEventListeners(listeners);
sfb.afterPropertiesSet();
assertEquals(listeners, registeredListeners);
}
public void testLocalSessionFactoryBeanWithFilterDefinitions() throws Exception {
XmlBeanFactory xbf = new XmlBeanFactory(new ClassPathResource("filterDefinitions.xml", getClass()));
FilterTestLocalSessionFactoryBean sf = (FilterTestLocalSessionFactoryBean) xbf.getBean("&sessionFactory");
assertEquals(2, sf.registeredFilterDefinitions.size());
FilterDefinition filter1 = (FilterDefinition) sf.registeredFilterDefinitions.get(0);
FilterDefinition filter2 = (FilterDefinition) sf.registeredFilterDefinitions.get(1);
assertEquals("filter1", filter1.getFilterName());
assertEquals(2, filter1.getParameterNames().size());
assertEquals(Hibernate.STRING, filter1.getParameterType("param1"));
assertEquals(Hibernate.LONG, filter1.getParameterType("otherParam"));
assertEquals("someCondition", filter1.getDefaultFilterCondition());
assertEquals("filter2", filter2.getFilterName());
assertEquals(1, filter2.getParameterNames().size());
assertEquals(Hibernate.INTEGER, filter2.getParameterType("myParam"));
}
public void testLocalSessionFactoryBeanWithTypeDefinitions() throws Exception {
XmlBeanFactory xbf = new XmlBeanFactory(new ClassPathResource("typeDefinitions.xml", getClass()));
TypeTestLocalSessionFactoryBean sf = (TypeTestLocalSessionFactoryBean) xbf.getBean("&sessionFactory");
TypeDef type1 = (TypeDef) sf.mappings.getTypeDef("type1");
TypeDef type2 = (TypeDef) sf.mappings.getTypeDef("type2");
assertEquals("mypackage.MyTypeClass", type1.getTypeClass());
assertEquals(2, type1.getParameters().size());
assertEquals("value1", type1.getParameters().getProperty("param1"));
assertEquals("othervalue", type1.getParameters().getProperty("otherParam"));
assertEquals("mypackage.MyOtherTypeClass", type2.getTypeClass());
assertEquals(1, type2.getParameters().size());
assertEquals("myvalue", type2.getParameters().getProperty("myParam"));
}
public static class FilterTestLocalSessionFactoryBean extends LocalSessionFactoryBean {
public List registeredFilterDefinitions = new LinkedList();
protected Configuration newConfiguration() throws HibernateException {
return new Configuration() {
public void addFilterDefinition(FilterDefinition definition) {
registeredFilterDefinitions.add(definition);
}
};
}
protected SessionFactory newSessionFactory(Configuration config) {
return null;
}
}
public static class TypeTestLocalSessionFactoryBean extends LocalSessionFactoryBean {
public Mappings mappings;
protected SessionFactory newSessionFactory(Configuration config) {
this.mappings = config.createMappings();
return null;
}
}
public static class DummyMergeEventListener implements MergeEventListener {
public void onMerge(MergeEvent event) throws HibernateException {
}
public void onMerge(MergeEvent event, Map copiedAlready) throws HibernateException {
}
}
}