All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.springmodules.workflow.jbpm30.JbpmTemplate Maven / Gradle / Ivy

/*
 * Copyright 2002-2005 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.springmodules.workflow.jbpm30;

import java.sql.SQLException;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.jbpm.db.JbpmSession;
import org.jbpm.db.JbpmSessionFactory;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.def.Transition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.graph.exe.Token;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;

/**
 * Helper class that simplifies jBPM data access code.
 *   
 * @author Rob Harrop
 * @auhtor Costin Leau
 */
public class JbpmTemplate implements JbpmOperations, InitializingBean {

	private static final Log logger = LogFactory.getLog(JbpmTemplate.class);

	private JbpmSessionFactory jbpmSessionFactory;

	private ProcessDefinition processDefinition;

	private boolean allowCreate = true;

	private HibernateTemplate hibernateTemplate;

	public JbpmTemplate() {
	}

	public JbpmTemplate(JbpmSessionFactory jbpmSessionFactory) {
		this.jbpmSessionFactory = jbpmSessionFactory;
		afterPropertiesSet();
	}

	public JbpmTemplate(JbpmSessionFactory jbpmSessionFactory, ProcessDefinition processDefinition) {
		this.jbpmSessionFactory = jbpmSessionFactory;
		this.processDefinition = processDefinition;
		afterPropertiesSet();
	}

	/**
	 * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
	 */
	public void afterPropertiesSet() {
		if (jbpmSessionFactory == null)
			throw new IllegalArgumentException("jbpmSessionFactory must be set");
		// init the hbTemplate that will be used to prepare and handle the HB Session
		hibernateTemplate = new HibernateTemplate(jbpmSessionFactory.getSessionFactory());
		hibernateTemplate.setAllowCreate(allowCreate);
	}

	public void setJbpmSessionFactory(JbpmSessionFactory jbpmSessionFactory) {
		this.jbpmSessionFactory = jbpmSessionFactory;
	}

	/**
	 * Utility method for converting the jbpm exceptions.
	 * 
	 * @param exception
	 * @return
	 */
	public RuntimeException convertJbpmException(RuntimeException exception) {
		return JbpmSessionFactoryUtils.convertJbpmException(exception);
	}

	public Long saveProcessInstance(final ProcessInstance processInstance) {
		return (Long) execute(new JbpmCallback() {

			public Object doInJbpm(JbpmSession session) {
				session.getGraphSession().saveProcessInstance(processInstance);
				return new Long(processInstance.getId());
			}
		});
	}

	public ProcessInstance findProcessInstance(final Long processInstanceId) {
		return (ProcessInstance) execute(new JbpmCallback() {

			public Object doInJbpm(JbpmSession session) {
				return session.getGraphSession().loadProcessInstance(processInstanceId.longValue());
			}
		});
	}

	public List findProcessInstances() {
		return (List) execute(new JbpmCallback() {

			public Object doInJbpm(JbpmSession session) {
				return session.getGraphSession().findProcessInstances(processDefinition.getId());
			}
		});
	}

	public void signal(final ProcessInstance processInstance) {
		execute(new JbpmCallback() {

			public Object doInJbpm(JbpmSession session) {
				processInstance.signal();
				return null;
			}
		});
	}

	public void signal(final ProcessInstance processInstance, final String transitionId) {
		execute(new JbpmCallback() {

			public Object doInJbpm(JbpmSession session) {
				processInstance.signal(transitionId);
				return null;
			}
		});
	}

	public void signal(final ProcessInstance processInstance, final Transition transition) {
		execute(new JbpmCallback() {

			public Object doInJbpm(JbpmSession session) {
				processInstance.signal(transition);
				return null;
			}
		});
		throw new UnsupportedOperationException();
	}

	public List findPooledTaskInstances(final String actorId) {
		return (List) execute(new JbpmCallback() {

			public Object doInJbpm(JbpmSession session) {
				return session.getTaskMgmtSession().findPooledTaskInstances(actorId);
			}
		});
	}

	public List findPooledTaskInstances(final List actorIds) {
		return (List) execute(new JbpmCallback() {

			public Object doInJbpm(JbpmSession session) {
				return session.getTaskMgmtSession().findPooledTaskInstances(actorIds);
			}
		});
	}

	public List findTaskInstances(final String actorId) {
		return (List) execute(new JbpmCallback() {

			public Object doInJbpm(JbpmSession session) {
				return session.getTaskMgmtSession().findTaskInstances(actorId);
			}
		});
	}

	public List findTaskInstances(final String[] actorIds) {
		return (List) execute(new JbpmCallback() {

			public Object doInJbpm(JbpmSession session) {
				return session.getTaskMgmtSession().findTaskInstances(actorIds);
			}
		});
	}

	public List findTaskInstances(final List actorIds) {
		return (List) execute(new JbpmCallback() {

			public Object doInJbpm(JbpmSession session) {
				return session.getTaskMgmtSession().findTaskInstances(actorIds);
			}
		});
	}

	public List findTaskInstancesByToken(Token token) {
		return findTaskInstancesByToken(token.getId());
	}

	public List findTaskInstancesByToken(final long tokenId) {
		return (List) execute(new JbpmCallback() {

			public Object doInJbpm(JbpmSession session) {
				return session.getTaskMgmtSession().findTaskInstancesByToken(tokenId);
			}
		});
	}

	/**
	 * Execute the action specified by the given action object within a JbpmSession.
	 * 
	 * @param callback
	 * @return
	 */
	public Object execute(final JbpmCallback callback) {
		final JbpmSession jbpmSession = getSession();
		boolean existingTransaction = JbpmSessionFactoryUtils.isTransactional(jbpmSession,
				this.jbpmSessionFactory);

		if (existingTransaction) {
			logger.debug("Found thread-bound Session for JbpmTemplate");
		}

		try {
			return hibernateTemplate.execute(new HibernateCallback() {
				/**
				 * @see org.springframework.orm.hibernate3.HibernateCallback#doInHibernate(org.hibernate.Session)
				 */
				public Object doInHibernate(Session session) throws HibernateException, SQLException {
					return callback.doInJbpm(jbpmSession);
				}
			}, true);
		}
		catch (RuntimeException ex) {
			throw convertJbpmException(ex);
		}
		finally {
			if (existingTransaction) {
				logger.debug("Not closing pre-bound jBPM Session after JbpmTemplate");
			}
			else {
				releaseSession(jbpmSession);
			}
		}
	}

	protected void releaseSession(JbpmSession jbpmSession) {
		JbpmSessionFactoryUtils.releaseSession(jbpmSession, this.jbpmSessionFactory);
	}

	protected JbpmSession getSession() {
		return JbpmSessionFactoryUtils.getSession(this.jbpmSessionFactory);
	}

	/**
	 * @param allowCreate The allowCreate to set.
	 */
	public void setAllowCreate(boolean allowCreate) {
		this.allowCreate = allowCreate;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy