/**
 * ProcessFactory.java
 * Created Dec 31, 2008
 * Copyright (c) Tandberg Television 2008
 */
package com.tandbergtv.workflow.driver.internal;

import java.util.Map;

import org.jbpm.graph.def.ProcessDefinition;

import com.tandbergtv.workflow.core.CustomToken;
import com.tandbergtv.workflow.core.WorkflowProcess;
import com.tandbergtv.workflow.core.graph.IProcessFactory;
import com.tandbergtv.workflow.core.service.ServiceRegistry;
import com.tandbergtv.workflow.driver.DriverException;
import com.tandbergtv.workflow.driver.DriverRuntimeException;
import com.tandbergtv.workflow.driver.service.IProcessManagerService;

/**
 * Process factory implementation. Just delegates to the {@link IProcessManagerService}
 * 
 * @author Sahil Verma
 */
public class ProcessFactory implements IProcessFactory {

	/* (non-Javadoc)
	 * @see com.tandbergtv.workflow.core.graph.IProcessFactory#create(org.jbpm.graph.def.ProcessDefinition, java.util.Map)
	 */
	@Override
	public WorkflowProcess create(ProcessDefinition template, Map<String, Object> parameters) {
		WorkflowProcess process = null;
		
		try {
			process = getService().create(template, parameters).getProcessInstance();
		} catch (DriverException e) {
			throw new DriverRuntimeException(e);
		}
		
		return process;
	}

	/* (non-Javadoc)
	 * @see com.tandbergtv.workflow.core.graph.IProcessFactory#create(com.tandbergtv.workflow.core.CustomToken, org.jbpm.graph.def.ProcessDefinition, java.util.Map)
	 */
	@Override
	public WorkflowProcess create(CustomToken token, ProcessDefinition template, Map<String, Object> parameters) {
		WorkflowProcess process = null;
		
		try {
			process = getService().create(token, template, parameters).getProcessInstance();
		} catch (DriverException e) {
			throw new DriverRuntimeException(e);
		}
		
		return process;
	}

	/* (non-Javadoc)
	 * @see com.tandbergtv.workflow.core.graph.IProcessFactory#start(org.jbpm.graph.def.ProcessDefinition, java.util.Map)
	 */
	@Override
	public WorkflowProcess start(ProcessDefinition template, Map<String, Object> parameters) {
		WorkflowProcess process = create(template, parameters);
		
		try {
			getService().start(process.getRootToken());
		} catch (DriverException e) {
			throw new DriverRuntimeException(e);
		}
		
		return process;
	}

	/* (non-Javadoc)
	 * @see com.tandbergtv.workflow.core.graph.IProcessFactory#start(com.tandbergtv.workflow.core.CustomToken, org.jbpm.graph.def.ProcessDefinition, java.util.Map)
	 */
	@Override
	public WorkflowProcess start(CustomToken token, ProcessDefinition template, Map<String, Object> parameters) {
		WorkflowProcess process = create(token, template, parameters);
		
		try {
			getService().start(process.getRootToken());
		} catch (DriverException e) {
			throw new DriverRuntimeException(e);
		}
		
		return process;
	}
	
	private IProcessManagerService getService() {
		return ServiceRegistry.getDefault().lookup(IProcessManagerService.class);
	}
}
