package org.appfuse.dao; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.search.FullTextSession; import org.hibernate.search.Search; import org.junit.runner.RunWith; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.transaction.Transactional; import java.util.*; /** * Base class for running DAO tests. * * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a> * @author jgarcia (updated: migrate to hibernate 4; moved from compass-search to hibernate-search */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration( locations = {"classpath:/applicationContext-resources.xml", "classpath:/applicationContext-dao.xml", "classpath*:/applicationContext.xml", "classpath:**/applicationContext*.xml"}) @Transactional public abstract class BaseDaoTestCase { @Autowired private SessionFactory sessionFactory; /** * Log variable for all child classes. Uses LogFactory.getLog(getClass()) from Commons Logging */ protected final Log log = LogFactory.getLog(getClass()); /** * ResourceBundle loaded from src/test/resources/${package.name}/ClassName.properties (if exists) */ protected ResourceBundle rb; /** * Default constructor - populates "rb" variable if properties file exists for the class in * src/test/resources. */ public BaseDaoTestCase() { // Since a ResourceBundle is not required for each class, just // do a simple check to see if one exists String className = this.getClass().getName(); try { rb = ResourceBundle.getBundle(className); } catch (MissingResourceException mre) { log.trace("No resource bundle found for: " + className); } } /** * Utility method to populate a javabean-style object with values * from a Properties file * * @param obj the model object to populate * @return Object populated object * @throws Exception if BeanUtils fails to copy properly */ protected Object populate(final Object obj) throws Exception { // loop through all the beans methods and set its properties from its .properties file Map<String, String> map = new HashMap<String, String>(); for (Enumeration<String> keys = rb.getKeys(); keys.hasMoreElements(); ) { String key = keys.nextElement(); map.put(key, rb.getString(key)); } BeanUtils.copyProperties(obj, map); return obj; } /** * Create a HibernateTemplate from the SessionFactory and call flush() and clear() on it. * Designed to be used after "save" methods in tests: http://issues.appfuse.org/browse/APF-178. * * @throws org.springframework.beans.BeansException when can't find 'sessionFactory' bean */ protected void flush() throws BeansException { Session currentSession = sessionFactory.getCurrentSession(); currentSession.flush(); } /** * Flush search indexes, to be done after a reindex() or reindexAll() operation */ public void flushSearchIndexes() { Session currentSession = sessionFactory.getCurrentSession(); final FullTextSession fullTextSession = Search.getFullTextSession(currentSession); fullTextSession.flushToIndexes(); } }