package jadex.bpmn.runtime.handler;
import jadex.bpmn.model.MActivity;
import jadex.bpmn.model.MSequenceEdge;
import jadex.bpmn.runtime.BpmnInterpreter;
import jadex.bpmn.runtime.ProcessThread;
import jadex.commons.IFilter;
import java.util.List;
/**
* Event intermediate multi handler.
*/
public class EventIntermediateMultipleActivityHandler extends DefaultActivityHandler
{
/**
* Execute an activity.
* @param activity The activity to execute.
* @param instance The process instance.
* @param thread The process thread.
*/
public void execute(MActivity activity, BpmnInterpreter instance, ProcessThread thread)
{
// System.out.println("Executed: "+activity+", "+instance);
// Call all connected intermediate event handlers.
List outgoing = activity.getOutgoingSequenceEdges();
if(outgoing==null)
throw new UnsupportedOperationException("Activity must have connected activities: "+activity);
// Execute all connected activities.
final IFilter[] filters = new IFilter[outgoing.size()];
Object[] waitinfos = new Object[outgoing.size()];
for(int i=0; i<outgoing.size(); i++)
{
MSequenceEdge next = (MSequenceEdge)outgoing.get(i);
MActivity act = next.getTarget();
instance.getActivityHandler(act).execute(act, instance, thread);
// Remember wait setting and delete them in the thread.
filters[i] = thread.getWaitFilter();
waitinfos[i] = thread.getWaitInfo();
thread.setWaitFilter(null);
thread.setWaitInfo(null);
}
// Set waiting state and filter.
// thread.setWaitingState(ProcessThread.WAITING_FOR_MULTI);
thread.setWaiting(true);
thread.setWaitFilter(new OrFilter(filters));
thread.setWaitInfo(waitinfos);
}
/**
* Execute an activity.
* @param activity The activity to execute.
* @param instance The process instance.
* @param thread The process thread.
* @param info The info object.
*/
public void cancel(MActivity activity, BpmnInterpreter instance, ProcessThread thread)
{
List outgoing = activity.getOutgoingSequenceEdges();
Object[] waitinfos = (Object[])thread.getWaitInfo();
for(int i=0; i<outgoing.size(); i++)
{
MSequenceEdge next = (MSequenceEdge)outgoing.get(i);
MActivity act = next.getTarget();
thread.setWaitInfo(waitinfos[i]);
instance.getActivityHandler(act).cancel(act, instance, thread);
}
}
}
/**
* Or filter implementation.
*/
class OrFilter implements IFilter
{
//-------- attributes ---------
/** The filters. */
protected IFilter[] filters;
//-------- constructors --------
/**
* Create a new or filter.
*/
public OrFilter(IFilter[] filters)
{
this.filters = filters;
}
//-------- methods --------
/**
* Test if an object passes the filter.
* @return True, if passes the filter.
*/
public boolean filter(Object obj)
{
boolean ret = false;
for(int i=0; !ret && i<filters.length; i++)
{
if(filters[i]!=null)
{
try
{
ret = filters[i].filter(obj);
}
catch(Exception e)
{
// just catch.
}
}
}
return ret;
}
/**
* Get the filters.
* @return The filters.
*/
public IFilter[] getFilters()
{
return filters;
}
}