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

org.aperteworkflow.service.AperteWorkflowProcessServiceImpl Maven / Gradle / Ivy

The newest version!
package org.aperteworkflow.service;

import org.aperteworkflow.service.fault.AperteWsWrongArgumentException;
import org.aperteworkflow.util.AperteErrorCheckUtil;
import org.aperteworkflow.util.AperteIllegalArgumentCodes;
import pl.net.bluesoft.rnd.processtool.ProcessToolContext;
import pl.net.bluesoft.rnd.processtool.ReturningProcessToolContextCallback;
import pl.net.bluesoft.rnd.processtool.bpm.ProcessToolBpmConstants;
import pl.net.bluesoft.rnd.processtool.bpm.ProcessToolBpmSession;
import pl.net.bluesoft.rnd.processtool.bpm.StartProcessResult;
import pl.net.bluesoft.rnd.processtool.model.ProcessInstance;
import pl.net.bluesoft.rnd.processtool.model.UserData;
import pl.net.bluesoft.rnd.processtool.model.nonpersistent.BpmTaskBean;
import pl.net.bluesoft.rnd.processtool.model.nonpersistent.ProcessQueueBean;
import pl.net.bluesoft.rnd.processtool.plugins.deployment.ProcessDeployer;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import java.io.ByteArrayInputStream;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Set;

import static org.aperteworkflow.util.ContextUtil.withContext;
import static org.aperteworkflow.util.HibernateBeanUtil.fetchHibernateData;
import static pl.net.bluesoft.rnd.processtool.model.nonpersistent.BpmTaskBean.asBeans;
import static pl.net.bluesoft.rnd.processtool.plugins.ProcessToolRegistry.Util.getRegistry;

/**
 * Most of WebMethods works, some of them are taged as (exclude=true), because they allow for too much interference in the aperet workflow  data.
 * To make them work again just delete WebMethod annotaion.
 * @author [email protected]  
 * @author [email protected]
 */

@WebService
public class AperteWorkflowProcessServiceImpl implements AperteWorkflowProcessService {
	private static final String PROCESS_INSTANCE_SOURCE ="portlet";

	@Override
	@WebMethod
	public ProcessInstance createProcessInstance(@WebParam(name="bpmDefinitionKey")final String bpmDefinitionKey,
												 @WebParam(name="externalKey")final String externalKey,
												 @WebParam(name="source")final String source,
												 @WebParam(name="userLogin")final String userLogin) {
		return withContext(new ReturningProcessToolContextCallback() {
			@Override
			public ProcessInstance processWithContext(ProcessToolContext ctx) {
				StartProcessResult result = getSession(userLogin).startProcess(bpmDefinitionKey, externalKey, source);
				return fetchHibernateData(result.getProcessInstance());
			}
		});
	}

	@Override
	@WebMethod
	public ProcessInstance startProcessInstance(@WebParam(name="bpmDefinitionKey")final String bpmDefinitionKey,
												@WebParam(name="userLogin")final String userLogin) throws AperteWsWrongArgumentException {
		AperteErrorCheckUtil.checkCorrectnessOfArgument(bpmDefinitionKey, AperteIllegalArgumentCodes.DEFINITION);

		return withContext(new ReturningProcessToolContextCallback() {
			@Override
			public ProcessInstance processWithContext(ProcessToolContext ctx) {
				StartProcessResult result = getSession(userLogin).startProcess(bpmDefinitionKey, null, PROCESS_INSTANCE_SOURCE);
				return fetchHibernateData(result.getProcessInstance());
			}
		});
	}

	@Override
	@WebMethod
	public Collection getUserAvailableQueues(@WebParam(name="userLogin") final String userLogin) throws  AperteWsWrongArgumentException {
		return withContext(new ReturningProcessToolContextCallback>() {
			@Override
			public Collection processWithContext(ProcessToolContext ctx) {
				return ProcessQueueBean.asBeans(getSession(userLogin).getUserAvailableQueues());
			}
		});
	}

	@Override
	@WebMethod
	public BpmTaskBean assignTaskFromQueue(@WebParam(name="queueName")final String queueName,
										   @WebParam(name="userLogin")final String userLogin) {
		return withContext(new ReturningProcessToolContextCallback() {
			@Override
			public BpmTaskBean processWithContext(ProcessToolContext ctx) {
				return fetchHibernateData(new BpmTaskBean(getSession(userLogin).assignTaskFromQueue(queueName)));
			}
		});
	}

	@Override
	@WebMethod
	public BpmTaskBean assignSpecificTaskFromQueue(@WebParam(name="queueName")final String queueName,
												   @WebParam(name="taskId")final String taskId,
												   @WebParam(name="userLogin")final String userLogin) {
		return withContext(new ReturningProcessToolContextCallback() {
			@Override
			public BpmTaskBean processWithContext(ProcessToolContext ctx) {
				return fetchHibernateData(new BpmTaskBean(getSession(userLogin).assignTaskFromQueue(queueName, taskId)));
			}
		});
	}

	@Override
	@WebMethod
	public void assignTaskToUser(@WebParam(name="taskId")final String taskId, @WebParam(name="userLogin")final String userLogin) throws AperteWsWrongArgumentException {
		withContext(new ReturningProcessToolContextCallback() {
			@Override
			public ProcessInstance processWithContext(ProcessToolContext ctx) {
				getSession(userLogin).assignTaskToUser(taskId, userLogin);
				return null;
			}
		});
	}

	@Override
	@WebMethod
	public BpmTaskBean getTaskData(@WebParam(name="taskId")final String taskId) throws AperteWsWrongArgumentException {
		AperteErrorCheckUtil.checkCorrectnessOfArgument(taskId, AperteIllegalArgumentCodes.TASK_ID);

		return withContext(new ReturningProcessToolContextCallback() {
			@Override
			public BpmTaskBean processWithContext(ProcessToolContext ctx) {
				return fetchHibernateData(new BpmTaskBean(getSession().getTaskData(taskId)));
			}
		});
	}

	@Override
	@WebMethod
	public List findUserTasks(@WebParam(name="internalId") final String internalId,
										   @WebParam(name="userLogin") final String userLogin) throws AperteWsWrongArgumentException {
		return withContext(new ReturningProcessToolContextCallback>() {
			@Override
			public List processWithContext(ProcessToolContext ctx) {
				ProcessToolBpmSession session = getSession(userLogin);
				ProcessInstance processInstance = ctx.getProcessInstanceDAO().getProcessInstanceByInternalId(internalId);
				return fetchHibernateData(asBeans(session.findUserTasks(processInstance)));
			}
		});
	}

	@Override
	@WebMethod
	public List findUserTasksPaging(@WebParam(name="offset")final Integer offset,
												 @WebParam(name="limit")final Integer limit,
												 @WebParam(name="userLogin")final String userLogin) throws AperteWsWrongArgumentException {
		return withContext(new ReturningProcessToolContextCallback>() {
			@Override
			public List processWithContext(ProcessToolContext ctx) {
				return fetchHibernateData(asBeans(getSession(userLogin).findUserTasks(offset, limit)));
			}
		});
	}

	@Override
	@WebMethod
	public List findProcessTasks(@WebParam(name="internalId")final String internalId,
											  @WebParam(name="userLogin")final String userLogin) throws AperteWsWrongArgumentException {
		return withContext(new ReturningProcessToolContextCallback>() {
			@Override
			public List processWithContext(ProcessToolContext ctx) {
				ProcessToolBpmSession session = getSession(userLogin);
				ProcessInstance processInstance = ctx.getProcessInstanceDAO().getProcessInstanceByInternalId(internalId);
				return fetchHibernateData(asBeans(session.findProcessTasks(processInstance)));
			}
		});
	}

	@Override
	@WebMethod
	public List findProcessTasksByNames(@WebParam(name="internalId")final String internalId,
													 @WebParam(name="userLogin")final String userLogin,
													 @WebParam(name="taskNames")final Set taskNames) {
		return withContext(new ReturningProcessToolContextCallback>() {
			@Override
			public List processWithContext(ProcessToolContext ctx) {
				ProcessInstance processInstance = ctx.getProcessInstanceDAO().getProcessInstanceByInternalId(internalId);
				return fetchHibernateData(asBeans(getSession(userLogin).findProcessTasks(processInstance, userLogin, taskNames)));
			}
		});
	}

	@Override
	@WebMethod
	public int getRecentTasksCount(@WebParam(name="minDate")final Date minDate,
								   @WebParam(name="userLogin")final String userLogin) {
		return withContext(new ReturningProcessToolContextCallback() {
			@Override
			public Integer processWithContext(ProcessToolContext ctx) {
				return getSession(userLogin).getRecentTasksCount(minDate);
			}
		});
	}

	@Override
	@WebMethod
	public List getAllTasks(@WebParam(name="userLogin")final String userLogin) {
		return withContext(new ReturningProcessToolContextCallback>() {
			@Override
			public List processWithContext(ProcessToolContext ctx) {
				return fetchHibernateData(asBeans(getSession(userLogin).getAllTasks()));
			}
		});
	}

	@Override
	@WebMethod
	public void performAction(@WebParam(name="actionName")final String actionName,
							  @WebParam(name="taskId")final String taskId,
							  @WebParam(name="userLogin")final String userLogin) throws AperteWsWrongArgumentException {
		withContext(new ReturningProcessToolContextCallback() {
			@Override
			public BpmTaskBean processWithContext(ProcessToolContext ctx) {
				getSession(userLogin).performAction(actionName, taskId);
				return null;
			}
		});
	}

	@Override
	@WebMethod
	public void adminCancelProcessInstance(@WebParam(name="internalId") final String internalId) throws AperteWsWrongArgumentException {
		withContext(new ReturningProcessToolContextCallback() {
			@Override
			public ProcessInstance processWithContext(ProcessToolContext ctx) {
				getRegistry().getProcessToolSessionFactory().createAutoSession().adminCancelProcessInstance(internalId);
				return null;
			}
		});
	}

	@Override
	@WebMethod (exclude=true)
	public void adminReassignProcessTask(@WebParam(name="taskId")final String taskId,
										 @WebParam(name="userLogin")final String userLogin) {
		withContext(new ReturningProcessToolContextCallback() {
			@Override
			public ProcessInstance processWithContext(ProcessToolContext ctx) {

				getRegistry().getProcessToolSessionFactory().createAutoSession()
						.adminReassignProcessTask(taskId, userLogin);
				return null;
			}
		});
	}

	@Override
	@WebMethod (exclude=true)
	public void adminCompleteTask(@WebParam(name="taskId") final String taskId,
								  @WebParam(name="actionName") final String actionName) {
		withContext(new ReturningProcessToolContextCallback() {
			@Override
			public ProcessInstance processWithContext(ProcessToolContext ctx) {
				getRegistry().getProcessToolSessionFactory().createAutoSession()
						.adminCompleteTask(taskId, actionName);
				return null;
			}
		});
	}

	//TODO GraphElement has to be an api
//	@Override
//    @WebMethod
//    public List getProcessHistory(@WebParam(name="internalId")final String internalId) throws AperteWebServiceError {
//		final ProcessInstance processInstance = getProcessData(internalId);
//		 
//        return withContext(new ReturningProcessToolContextCallback>() {
//            @Override
//            public List processWithContext(ProcessToolContext ctx) {
//                return ctx.getProcessToolSessionFactory().createAutoSession().getProcessHistory(processInstance);
//            }
//        });
//    }

	/*
	 * FIXME
	 * Service does not work,It fails when it try to update queues (When queues are empty, everything works), 
	 * the problem is known from queuing mechanism update. Exception occurs: 
	 * "[Hibernate] NonUniqueObjectException: a different object with the same 
	 * identifier value was already associated with the session" probably swap in the classroom: 
	 * "ProcessDefinitionDaoImpl" in the method: "updateOrCreateQueueConfigs" "save" to "merge" or "saveOrUpdate" solve the problem.
	 * 
	 * 
	 */

	@Override
	@WebMethod (exclude=true)
	public void deployProcessDefinition(@WebParam(name="cfgXmlFile")final byte[] cfgXmlFile,
										@WebParam(name="queueXmlFile")final byte[] queueXmlFile,
										@WebParam(name="processMapDefinition")final byte[] processMapDefinition,
										@WebParam(name="processMapImageStream")final byte[] processMapImageStream,
										@WebParam(name="logo")final byte[] logo) {
		withContext(new ReturningProcessToolContextCallback() {
			@Override
			public Object processWithContext(ProcessToolContext ctx)
			{
				ProcessDeployer processDeployer = new ProcessDeployer(ctx);

				processDeployer.deployOrUpdateProcessDefinition(
						new ByteArrayInputStream(processMapDefinition),
						new ByteArrayInputStream(cfgXmlFile),
						new ByteArrayInputStream(queueXmlFile),
						processMapImageStream != null ? new ByteArrayInputStream(processMapImageStream) : null,
						logo != null ? new ByteArrayInputStream(logo) : null);
				return null;
			}
		});
	}

	private ProcessToolBpmSession getSession() {
		return getSession(ProcessToolBpmConstants.SYSTEM_USER.getLogin());
	}

	private ProcessToolBpmSession getSession(String userLogin) {
		UserData user = getRegistry().getUserSource().getUserByLogin(userLogin);
		if (user == null) {
			throw new RuntimeException("No user with login: " + userLogin);
		}
		return getRegistry().getProcessToolSessionFactory().createSession(userLogin);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy