package org.jbpm.pvm.internal.hibernate;
|
|
import java.io.Serializable;
|
import java.lang.reflect.Method;
|
import java.sql.PreparedStatement;
|
import java.sql.ResultSet;
|
import java.sql.SQLException;
|
import java.sql.Types;
|
import java.util.Properties;
|
|
import org.hibernate.HibernateException;
|
import org.hibernate.usertype.ParameterizedType;
|
import org.hibernate.usertype.UserType;
|
import org.jbpm.api.Execution;
|
import org.jbpm.internal.log.Log;
|
import org.jbpm.pvm.internal.model.ExecutionImpl;
|
import org.jbpm.pvm.internal.model.ActivityImpl;
|
import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
|
import org.jbpm.pvm.internal.util.ReflectUtil;
|
|
public class ExecutionType implements UserType, ParameterizedType {
|
|
private static final long serialVersionUID = 1L;
|
private static final Log log = Log.getLog(ExecutionType.class.getName());
|
|
int[] sqlTypes = new int[]{Types.VARCHAR};
|
|
protected String processResource;
|
protected ProcessDefinitionImpl processDefinition;
|
|
public void setParameterValues(Properties properties) {
|
}
|
|
public int[] sqlTypes() {
|
return sqlTypes;
|
}
|
|
// JDBC - object translation
|
|
public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
|
ExecutionImpl execution = createExecution(owner);
|
String activityName = rs.getString(names[0]);
|
ActivityImpl activity = (ActivityImpl) execution.getProcessDefinition().getActivity(activityName);
|
execution.setActivity(activity);
|
execution.setState(Execution.STATE_ACTIVE_ROOT);
|
return execution;
|
}
|
|
private ExecutionImpl createExecution(Object owner) {
|
ExecutionImpl execution = new ExecutionImpl();
|
execution.setProcessDefinition(getProcessDefinition(owner));
|
return execution;
|
}
|
|
private synchronized ProcessDefinitionImpl getProcessDefinition(Object owner) {
|
if (processDefinition!=null) {
|
return processDefinition;
|
}
|
Class<?> ownerClass = owner.getClass();
|
try {
|
Method method = ownerClass.getDeclaredMethod("getProcessDefinition");
|
processDefinition = (ProcessDefinitionImpl) ReflectUtil.invoke(method, null, null);
|
} catch (Exception e) {
|
throw new RuntimeException("couldn't get process definition for "+owner, e);
|
}
|
|
return processDefinition;
|
}
|
|
public void nullSafeSet(PreparedStatement st, Object owner, int index) throws HibernateException, SQLException {
|
if (owner!=null) {
|
ExecutionImpl execution = (ExecutionImpl) owner;
|
String activityName = execution.getActivity().getName();
|
log.trace("binding 'execution-state{"+activityName+"}' to parameter: "+index);
|
st.setString(index, activityName);
|
}
|
}
|
|
// for dirty checking ?
|
|
public Object deepCopy(Object object) throws HibernateException {
|
if (object==null) {
|
return null;
|
}
|
|
ExecutionImpl original = (ExecutionImpl) object;
|
|
ActivityImpl activity = new ActivityImpl();
|
activity.setName(original.getActivity().getName());
|
|
ExecutionImpl copy = new ExecutionImpl();
|
copy.setActivity(activity);
|
|
return copy;
|
}
|
|
public boolean equals(Object arg0, Object arg1) throws HibernateException {
|
if ( (arg0==null) || (arg1==null)) return false;
|
|
ExecutionImpl execution0 = (ExecutionImpl) arg0;
|
ExecutionImpl execution1 = (ExecutionImpl) arg1;
|
|
String activityName0 = execution0.getActivity().getName();
|
String activityName1 = execution1.getActivity().getName();
|
|
return activityName0.equals(activityName1);
|
}
|
|
public int hashCode(Object object) throws HibernateException {
|
return object.hashCode();
|
}
|
|
public boolean isMutable() {
|
return true;
|
}
|
|
public Class<?> returnedClass() {
|
return Execution.class;
|
}
|
|
// merge functionality //////////////////////////////////////////////////////
|
|
public Object replace(Object arg0, Object arg1, Object arg2) throws HibernateException {
|
return null;
|
}
|
|
// serialization for cache //////////////////////////////////////////////////
|
|
public Object assemble(Serializable arg0, Object arg1) throws HibernateException {
|
return null;
|
}
|
|
public Serializable disassemble(Object arg0) throws HibernateException {
|
return null;
|
}
|
}
|