/**
* 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.engine.entity.runtime.ActivityInstance;
import org.fireflow.engine.entity.runtime.ActivityInstanceState;
import org.fireflow.engine.entity.runtime.impl.ActivityInstanceHistory;
import org.fireflow.engine.entity.runtime.impl.ActivityInstanceImpl;
import org.fireflow.engine.modules.persistence.ActivityInstancePersister;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.LockMode;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateCallback;
/**
*
*
* @author 非也
* @version 2.0
*/
public class ActivityInstancePersisterHibernateImpl extends AbsPersisterHibernateImpl implements
ActivityInstancePersister {
/* (non-Javadoc)
* @see org.fireflow.engine.persistence.ActivityInstancePersister#countAliveActivityInstance(java.lang.String, java.lang.String)
*/
public int countAliveActivityInstance(final String processInstanceId,
final String nodeId) {
Object result = this.getHibernateTemplate().execute(new HibernateCallback(){
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Criteria criteria = session.createCriteria(ActivityInstanceImpl.class);
criteria.add(Restrictions.eq("processInstanceId", processInstanceId))
.add(Restrictions.eq("nodeId", nodeId))
.add(Restrictions.lt("state", ActivityInstanceState.DELIMITER))
.setProjection(Projections.rowCount());
return criteria.uniqueResult();
}
});
if (result instanceof Integer){
return (Integer)result;
}
else if (result instanceof Long){
return ((Long)result).intValue();
}
return 0;
}
/**
* 获得运行时表的对象class
* @return
*/
public Class getEntityClass4Runtime(Class interfaceClz){
return ActivityInstanceImpl.class;
}
/**
* 获得历史表的对象class
* @return
*/
public Class getEntityClass4History(Class interfaceClz){
return ActivityInstanceHistory.class;
}
public void lockActivityInstance(String activityInstanceId){
this.getHibernateTemplate().get(ActivityInstanceImpl.class, activityInstanceId,LockMode.UPGRADE);
}
/* (non-Javadoc)
* @see org.fireflow.engine.modules.persistence.ActivityInstancePersister#findActivityInstances(java.lang.String, java.lang.String)
*/
public List<ActivityInstance> findActivityInstances(
final String processInstanceId, final String activityId) {
Object result = this.getHibernateTemplate().execute(new HibernateCallback(){
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Criteria criteria = session.createCriteria(ActivityInstanceImpl.class);
criteria.add(Restrictions.eq("processInstanceId", processInstanceId))
.add(Restrictions.eq("nodeId", activityId))
.addOrder(Order.desc("stepNumber"));
return criteria.list();
}
});
return (List<ActivityInstance>)result;
}
public List<ActivityInstance> findActivityInstances(final String processInstanceId){
Object result = this.getHibernateTemplate().execute(new HibernateCallback(){
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Criteria criteria = session.createCriteria(ActivityInstanceImpl.class);
criteria.add(Restrictions.eq("processInstanceId", processInstanceId))
.addOrder(Order.desc("stepNumber"));
return criteria.list();
}
});
return (List<ActivityInstance>)result;
}
/* (non-Javadoc)
* @see org.fireflow.engine.modules.persistence.ActivityInstancePersister#deleteAllActivityInstances()
*/
public void deleteAllActivityInstances() {
this.getHibernateTemplate().execute(new HibernateCallback(){
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
String deleteActivityInstance = "Delete From org.fireflow.engine.entity.runtime.impl.ActivityInstanceImpl";
Query q4DeleteActivityInstance = session.createQuery(deleteActivityInstance);
q4DeleteActivityInstance.executeUpdate();
return null;
}
});
}
}