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

org.ow2.bonita.definition.activity.ThrowingSignalEvent Maven / Gradle / Ivy

/**
 * Copyright (C) 2010-2012  BonitaSoft S.A.
 * BonitaSoft, 31 rue Gustave Eiffel - 38000 Grenoble
 * This library is free software; you can redistribute it and/or modify it under the terms
 * of the GNU Lesser General Public License as published by the Free Software Foundation
 * version 2.1 of the License.
 * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Lesser General Public License for more details.
 * You should have received a copy of the GNU Lesser General Public License along with this
 * program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
 * Floor, Boston, MA  02110-1301, USA.
 **/
package org.ow2.bonita.definition.activity;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import org.ow2.bonita.facade.def.InternalActivityDefinition;
import org.ow2.bonita.facade.def.majorElement.EventProcessDefinition;
import org.ow2.bonita.facade.def.majorElement.ProcessDefinition;
import org.ow2.bonita.facade.def.majorElement.TransitionDefinition;
import org.ow2.bonita.facade.runtime.ProcessInstance;
import org.ow2.bonita.runtime.event.EventConstants;
import org.ow2.bonita.runtime.event.IncomingEventInstance;
import org.ow2.bonita.runtime.event.Job;
import org.ow2.bonita.runtime.event.JobBuilder;
import org.ow2.bonita.runtime.model.Execution;
import org.ow2.bonita.services.EventService;
import org.ow2.bonita.util.EnvTool;

/**
 * 
 * @author Matthieu Chaffotte
 *
 */
public class ThrowingSignalEvent extends AbstractActivity {

	private static final long serialVersionUID = 964406244645103100L;

	protected ThrowingSignalEvent() {
		super();
	}

	public ThrowingSignalEvent(String eventName) {
		super(eventName);
	}

	@Override
	protected boolean bodyStartAutomatically() {
		return true;
	}

	@Override
	protected boolean executeBusinessLogic(Execution execution) {
		final ProcessDefinition processDefinition = execution.getProcessDefinition();
	    final EventService eventService = EnvTool.getEventService();
	    final InternalActivityDefinition activity = execution.getNode();
	    final List eventSubProcesses = processDefinition.getEventSubProcesses();
	    if (!eventSubProcesses.isEmpty()) {
	      final List processNames = new ArrayList();
	      for (EventProcessDefinition eventProcessDefinition : eventSubProcesses) {
	        final String processName = eventProcessDefinition.getName();
	        processNames.add(processName);
	      }
	      final String signalCode = activity.getTimerCondition();
	      final IncomingEventInstance signalSubProcess = eventService.getSignalStartIncomingEvent(processNames, signalCode);
	      if (signalSubProcess != null) {
	        throwEvent(eventService, activity);
	        return false;
	      }
	    }

	    final Set outgoingTransitions = activity.getOutgoingTransitions();
	    final Set incomingTransitions = activity.getIncomingTransitions();
	    if (!outgoingTransitions.isEmpty() && !incomingTransitions.isEmpty()) {
	      throwEvent(eventService, activity);
	    } else if (outgoingTransitions.isEmpty()) {
	      throwEvent(eventService, activity);
	      final ProcessInstance instance = execution.getInstance();
	      if (instance.getParentInstanceUUID() != null) {
	        return false;
	      }
	    }
	    return true;
	}

	private void throwEvent(final EventService eventService, final InternalActivityDefinition activity) {
		//TODO rootInstanceUUID
		final String signalCode = activity.getTimerCondition();
		Set signalIncomingEvents = eventService.getSignalIncomingEvents(signalCode);
		for (IncomingEventInstance signalIncomingEvent : signalIncomingEvents) {
			Job signal = null;
			if (signalIncomingEvent.getSignal().equals(EventConstants.SIGNAL_START_EVENT)) {
				signal = JobBuilder.startSignalJob(signalIncomingEvent.getName(), signalIncomingEvent.getActivityDefinitionUUID());
				signal.setEventSubProcessRootInstanceUUID(signalIncomingEvent.getEventSubProcessRootInstanceUUID());
			} else if (signalIncomingEvent.getSignal().equals(EventConstants.SIGNAL_BOUNDARY_EVENT)) {
				signal = JobBuilder.boundarySignalJob(signalIncomingEvent.getActivityName(), null, signalIncomingEvent.getExecutionUUID(), signalIncomingEvent.getInstanceUUID()); 
				eventService.removeEvent(signalIncomingEvent);
			} else {
				signal = JobBuilder.intermediateSignalJob(signalIncomingEvent.getName(), null, signalIncomingEvent.getExecutionUUID(), signalIncomingEvent.getInstanceUUID());
				eventService.removeEvent(signalIncomingEvent);
			}
			eventService.storeJob(signal);
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy