/*
* Copyright (c) 2005-2016 Vincent Vandenschrick. All rights reserved.
*
* This file is part of the Jspresso framework.
*
* Jspresso is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Jspresso is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Jspresso. If not, see <http://www.gnu.org/licenses/>.
*/
package org.jspresso.framework.application.startup.development;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.jspresso.framework.application.backend.BackendControllerHolder;
import org.jspresso.framework.application.backend.persistence.hibernate.HibernateBackendController;
import org.jspresso.framework.model.component.IComponent;
import org.jspresso.framework.model.entity.IEntity;
import org.jspresso.framework.model.entity.IEntityFactory;
/**
* A utility class used to persist some test data.
*
* @author Vincent Vandenschrick
*/
public abstract class AbstractHibernateTestDataPersister {
private final BeanFactory beanFactory;
/**
* Constructs a new {@code AbstractHibernateTestDataPersister} instance.
*
* @param beanFactory
* the spring bean factory to use.
*/
public AbstractHibernateTestDataPersister(BeanFactory beanFactory) {
this.beanFactory = beanFactory;
}
/**
* Creates and persist the test data.
*/
public final void persistTestData() {
HibernateBackendController hbc = (HibernateBackendController) BackendControllerHolder
.getThreadBackendController();
boolean wasNull = false;
if (hbc == null) {
wasNull = true;
hbc = (HibernateBackendController) beanFactory
.getBean("applicationBackController");
BackendControllerHolder.setThreadBackendController(hbc);
}
try {
createAndPersistTestData();
} finally {
hbc.cleanupRequestResources();
if (wasNull) {
BackendControllerHolder.setThreadBackendController(null);
}
}
}
/**
* Creates and persist the test data. This method must be overridden in
* subclasses.
*/
protected abstract void createAndPersistTestData();
/**
* Creates a component instance.
*
* @param <T>
* the actual component type.
* @param componentContract
* the component contract.
* @return the created component.
*/
protected <T extends IComponent> T createComponentInstance(
Class<T> componentContract) {
return getEntityFactory().createComponentInstance(componentContract);
}
/**
* Creates an entity instance.
*
* @param <T>
* the actual entity type.
* @param entityContract
* the entity contract.
* @return the created entity.
*/
protected <T extends IEntity> T createEntityInstance(Class<T> entityContract) {
return getEntityFactory().createEntityInstance(entityContract);
}
/**
* Persists or update an entity.
*
* @param entity
* the entity to persist or update.
*/
protected void saveOrUpdate(final IEntity entity) {
final HibernateBackendController hibernateBackendController = getBackendController();
hibernateBackendController.getTransactionTemplate().execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
hibernateBackendController.registerForUpdate(hibernateBackendController.cloneInUnitOfWork(entity));
}
});
}
/**
* Query entities.
*
* @param queryString
* the HQL query string.
* @return the entity list.
*/
protected List<?> find(String queryString) {
return getHibernateSession().createQuery(queryString).list();
}
/**
* Query entities by criteria.
*
* @param criteria
* the Hibernate detached criteria.
* @return the entity list.
*/
protected List<?> findByCriteria(DetachedCriteria criteria) {
return criteria.getExecutableCriteria(getHibernateSession()).list();
}
/**
* Gets the backend controller.
*
* @return the backend controller.
*/
protected HibernateBackendController getBackendController() {
return (HibernateBackendController) BackendControllerHolder
.getCurrentBackendController();
}
/**
* Gets the entityFactory.
*
* @return the entityFactory.
*/
protected IEntityFactory getEntityFactory() {
return getBackendController().getEntityFactory();
}
/**
* Gets the hibernateSession.
*
* @return the hibernateSession.
*/
protected Session getHibernateSession() {
return getBackendController().getHibernateSession();
}
}