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

org.ow2.bonita.util.ProcessUtil Maven / Gradle / Ivy

package org.ow2.bonita.util;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import org.ow2.bonita.definition.InternalProcess;
import org.ow2.bonita.deployment.PVMProcessBuilder;
import org.ow2.bonita.facade.def.element.AttachmentDefinition;
import org.ow2.bonita.facade.def.majorElement.DataFieldDefinition;
import org.ow2.bonita.facade.def.majorElement.ProcessDefinition;
import org.ow2.bonita.facade.exception.ProcessNotFoundException;
import org.ow2.bonita.facade.impl.FacadeUtil;
import org.ow2.bonita.facade.uuid.ProcessDefinitionUUID;
import org.ow2.bonita.facade.uuid.ProcessInstanceUUID;
import org.ow2.bonita.pvm.internal.type.Converter;
import org.ow2.bonita.pvm.internal.type.Type;
import org.ow2.bonita.pvm.internal.type.Variable;
import org.ow2.bonita.pvm.internal.type.VariableTypeResolver;
import org.ow2.bonita.pvm.internal.type.variable.NullVariable;
import org.ow2.bonita.pvm.internal.type.variable.UnpersistableVariable;
import org.ow2.bonita.pvm.internal.wire.WireContext;
import org.ow2.bonita.runtime.InternalExecution;
import org.ow2.bonita.runtime.InternalInstance;
import org.ow2.bonita.services.LargeDataRepository;
import org.ow2.bonita.services.Recorder;

public class ProcessUtil {

	public static Map createVariables(Collection datafields) {
		if (datafields == null || datafields.isEmpty()) {
			return null;
		}
		Map variables = new HashMap();
		for (final DataFieldDefinition df : datafields) {
			final String key = df.getName();
			final Object value = WireContext.create(PVMProcessBuilder.getInitialValueDescriptor(df.getInitialValue(), df.getDataTypeClassName()));
			variables.put(key, createVariable(key, value));
		}
		return variables;
	}

	public static Variable createVariable(final String key, final Object value) {
		Type type = null;
		final VariableTypeResolver variableTypeResolver = EnvTool.getVariableTypeResolver();
		if (variableTypeResolver != null) {
			if (type == null) {
				type = variableTypeResolver.findTypeByMatch(key, value);
			}
		}
		Variable variable = null;

		if (type != null) {
			final Class variableClass = type.getVariableClass();
			try {
				variable = (Variable) variableClass.newInstance();
			} catch (final Exception e) {
				String message = ExceptionManager.getInstance().getFullMessage("bp_EI_14", variableClass.getName());
				throw new BonitaRuntimeException(message);
			}
			final Converter converter = type.getConverter();
			variable.setConverter(converter);

		} else {
			if (value == null) {
				variable = new NullVariable();
			} else {
				variable = new UnpersistableVariable();
			}
		}

		variable.setKey(key);
		variable.setValue(value);

		return variable;
	}
	
	public static InternalExecution createProcessInstance(final ProcessDefinitionUUID processUUID, Map variables, Map attachments, final ProcessInstanceUUID parentInstanceUUID) throws ProcessNotFoundException {
	    final InternalProcess process = FacadeUtil.getProcessDefinition(processUUID);
	    final InternalExecution rootExecution = (InternalExecution) process.beginProcessInstance();
	    
	    final InternalInstance instance = rootExecution.getInstance();
	    final ProcessInstanceUUID instanceUUID = instance.getUUID();

	    final ProcessDefinition processDef = EnvTool.getJournalQueriers().getProcess(processUUID);
	    
	    final Recorder recorder = EnvTool.getRecorder();
	    Map givenVariables = CopyTool.createVariableMap(variables);
	    
	    Map processVariables = ProcessUtil.createVariables(processDef.getDataFields());
	    
	    Map initialVariables = new HashMap();
	    if (processVariables != null) {
	    	initialVariables.putAll(processVariables);
	    }
	    if (givenVariables != null) {
	    	initialVariables.putAll(givenVariables);
	    }
	    
	    Map initialAttachments = new HashMap();
	    for (AttachmentDefinition attach : processDef.getAttachments().values()) {
	      initialAttachments.put(attach.getName(), attach.getInitialValue());
	    }
      if (attachments != null) {
        initialAttachments.putAll(attachments);
      }
	    
	    recorder.recordInstanceStarted(instanceUUID, parentInstanceUUID, EnvTool.getUserId(), initialVariables);
	    
	    LargeDataRepository largeDataRepository = EnvTool.getLargeDataRepository();
	    for (Map.Entry attachToStore : initialAttachments.entrySet()) {
	      largeDataRepository.storeData(Misc.getAttachmentCategories(instanceUUID), attachToStore.getKey(), attachToStore.getValue(), true);
	    }
	    
	    return rootExecution;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy