/**
* Copyright 2007-2010 非也
* All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation。
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses. *
*/
package org.fireflow.engine.modules.persistence.hibernate;
import java.sql.SQLException;
import java.util.List;
import org.fireflow.client.WorkflowQuery;
import org.fireflow.engine.entity.WorkflowEntity;
import org.fireflow.engine.entity.runtime.ScheduleJob;
import org.fireflow.engine.entity.runtime.WorkItem;
import org.fireflow.engine.modules.persistence.PersistenceService;
import org.fireflow.engine.modules.persistence.Persister;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.Projections;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
*
*
* @author 非也
* @version 2.0
*/
public abstract class AbsPersisterHibernateImpl // extends HibernateDaoSupport
implements Persister {
protected PersistenceService persistenceService = null;
/* (non-Javadoc)
* @see org.fireflow.engine.persistence.Persister#List(org.fireflow.engine.WorkflowQuery)
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public <T extends WorkflowEntity> java.util.List<T> list(final WorkflowQuery<T> q) {
Class tmp = null;
if (q.isQueryFromHistory()){
tmp = this.getEntityClass4History(q.getEntityClass());
}else{
tmp = this.getEntityClass4Runtime(q.getEntityClass());
}
final Class entityClass = tmp;
if (entityClass==null) return null;
Object result = this.getHibernateTemplate().execute(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Criteria criteria = session.createCriteria(entityClass);
if (isConnectToActivityInstance(q)){
criteria.createAlias("activityInstance", "activityInstance");
}
List<? extends org.fireflow.client.query.Criterion> fireCriterions = q
.getAllCriterions();
if (fireCriterions != null && fireCriterions.size() > 0) {
for (org.fireflow.client.query.Criterion fireCriterion : fireCriterions) {
org.hibernate.criterion.Criterion hibernateCriterion = PersisterUtils
.fireCriterion2HibernateCriterion(fireCriterion);
criteria.add(hibernateCriterion);
}
}
List<org.fireflow.client.query.Order> fireOrders = q
.getAllOrders();
if (fireOrders != null && fireOrders.size() > 0) {
for (org.fireflow.client.query.Order fireOrder : fireOrders) {
org.hibernate.criterion.Order hibernateOrder = PersisterUtils
.fireOrder2HibernateOrder(fireOrder);
criteria.addOrder(hibernateOrder);
}
}
if (q.getPageNumber()>0){
int pageSize = q.DEFAULT_PAGE_SIZE;
if (q.getPageSize()>0){
pageSize = q.getPageSize();
}
int first = (q.getPageNumber()-1)*pageSize;
criteria.setFirstResult(first);//从0开始计数;
criteria.setMaxResults(pageSize);
}
return criteria.list();
}
});
return (java.util.List<T>)result;
}
/* (non-Javadoc)
* @see org.fireflow.engine.persistence.Persister#count(org.fireflow.engine.WorkflowQuery)
*/
public <T extends WorkflowEntity> int count(final WorkflowQuery<T> q) {
Class tmp = null;
if (q.isQueryFromHistory()){
tmp = this.getEntityClass4History(q.getEntityClass());
}else{
tmp = this.getEntityClass4Runtime(q.getEntityClass());
}
final Class entityClass = tmp;
if (entityClass==null) return 0;
Object result = this.getHibernateTemplate().execute(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Criteria criteria = session.createCriteria(entityClass);
if (isConnectToActivityInstance(q)){
criteria.createAlias("activityInstance", "activityInstance");
}
List<? extends org.fireflow.client.query.Criterion> fireCriterions = q
.getAllCriterions();
if (fireCriterions != null && fireCriterions.size() > 0) {
for (org.fireflow.client.query.Criterion fireCriterion : fireCriterions) {
org.hibernate.criterion.Criterion hibernateCriterion = PersisterUtils
.fireCriterion2HibernateCriterion(fireCriterion);
criteria.add(hibernateCriterion);
}
}
criteria.setProjection(Projections.rowCount());
return criteria.uniqueResult();
}
});
if (result instanceof Integer) {
return (Integer) result;
} else if (result instanceof Long) {
return ((Long) result).intValue();
}
return 0;
}
/* (non-Javadoc)
* @see org.fireflow.engine.persistence.Persister#find(java.lang.Class, java.lang.String)
*/
public <T extends WorkflowEntity> T fetch(Class<T> entityClz, String entityId) {
if (entityId==null || entityId.trim().equals(""))return null;
Class clz = this.getEntityClass4Runtime(entityClz);
Object obj = null;
if (clz!=null){
obj = this.getHibernateTemplate().get(clz, entityId);
}
if (obj==null){
clz = this.getEntityClass4History(entityClz);
obj = this.getHibernateTemplate().get(clz, entityId);
}
return (T)obj;
}
/* (non-Javadoc)
* @see org.fireflow.engine.persistence.Persister#saveOrUpdate(java.lang.Object)
*/
public void saveOrUpdate(Object entity) {
this.getHibernateTemplate().saveOrUpdate(entity);
}
// public abstract <T> Class<T> getEntityClass(WorkflowQuery<T> q);
/**
* 获得运行时表的对象class
* @return
*/
public abstract Class getEntityClass4Runtime(Class interfaceClz);
/**
* 获得历史表的对象class
* @return
*/
public Class getEntityClass4History(Class interfaceClz){
return null;
}
private boolean isConnectToActivityInstance(WorkflowQuery q){
/*
List<org.fireflow.client.query.Criterion> criterionList = q.getAllCriterions();
if (criterionList!=null){
for (org.fireflow.client.query.Criterion c : criterionList){
if (c.getEntityProperty().getColumnName().startsWith("ACTIVITY_INSTANCE_$_")){
return true;
}
}
}
List<org.fireflow.client.query.Order> fireOrders = q.getAllOrders();
if (fireOrders!=null){
for (org.fireflow.client.query.Order order : fireOrders){
if(order.getEntityProperty().getColumnName().startsWith("ACTIVITY_INSTANCE_$_")){
return true;
}
}
}
return false;
*/
/* 所有的对象间关联被取消,2014-12-30 非也,
Class entityClass = q.getEntityClass();
if (entityClass.isAssignableFrom(WorkItem.class) || entityClass.isAssignableFrom(ScheduleJob.class)) {
return true;
}
*/
return false;
}
/**
* @return the persistenceService
*/
public PersistenceService getPersistenceService() {
return persistenceService;
}
/**
* @param persistenceService the persistenceService to set
*/
public void setPersistenceService(PersistenceService persistenceService) {
this.persistenceService = persistenceService;
}
public HibernateTemplate getHibernateTemplate(){
PersistenceServiceHibernateImpl svc = (PersistenceServiceHibernateImpl)this.getPersistenceService();
return svc.getHibernateTemplate();
}
}