View Javadoc
1 package org.smartcomps.twister.engine.priv.core.dynamic.impl; 2 3 import org.smartcomps.twister.engine.priv.core.dynamic.PickEC; 4 import org.smartcomps.twister.engine.priv.core.dynamic.ExecutionContext; 5 import org.smartcomps.twister.engine.priv.core.dynamic.ExecutionContextFactory; 6 import org.smartcomps.twister.engine.priv.core.dynamic.impl.xao.VariableXAO; 7 import org.smartcomps.twister.engine.priv.core.definition.Activity; 8 import org.smartcomps.twister.engine.priv.core.definition.Pick; 9 import org.smartcomps.twister.engine.priv.core.definition.AlarmEvent; 10 11 import org.smartcomps.twister.engine.priv.expression.ExpressionProcessorFactory; 12 13 import org.smartcomps.twister.engine.priv.timer.PickECTask; 14 import org.smartcomps.twister.engine.priv.timer.EngineTimer; 15 import org.smartcomps.twister.engine.exception.ExecutionException; 16 import org.smartcomps.twister.engine.exception.XPathEvaluationException; 17 import org.smartcomps.twister.common.persistence.DBSessionException; 18 import org.smartcomps.twister.common.persistence.XMLSessionException; 19 import org.dom4j.Document; 20 21 import java.util.*; 22 23 /*** 24 * Persistent implementation of the PickEC interface. 25 * @see Pick 26 */ 27 public class PickECImpl extends StructuredECImpl implements PickEC { 28 29 private int executedActivityIndex = -1; 30 31 private transient Collection timerTasks = null; 32 33 public int getExecutedActivityIndex() { 34 return executedActivityIndex; 35 } 36 37 public void setExecutedActivityIndex(int executedActivityIndex) { 38 this.executedActivityIndex = executedActivityIndex; 39 } 40 41 public void execute() { 42 this.setStatus(ACTIVE); 43 44 // Notify the container for execution 45 notifyExecutionToContainer(); 46 47 // Registering declared alarm events 48 Pick origin = (Pick) getActivity(); 49 Map alarmEvents = origin.getActivityAlarmEvents(); 50 timerTasks = new ArrayList(); 51 for (Iterator alarmIter = alarmEvents.keySet().iterator(); alarmIter.hasNext();) { 52 Activity activity = (Activity) alarmIter.next(); 53 AlarmEvent event = (AlarmEvent) alarmEvents.get(activity); 54 Date expiration = null; 55 if (event.getType() == AlarmEvent.DEADLINE_EXPR) { 56 try { 57 expiration = ExpressionProcessorFactory.getBPELExpressionProcessor().evaluateAsDate( 58 fetchInstance(), event.getTimeExpression()); 59 } catch (XPathEvaluationException e) { 60 throw new ExecutionException(e); 61 } 62 } else { 63 try { 64 expiration = ExpressionProcessorFactory.getBPELExpressionProcessor().evaluateDurationAsDate( 65 fetchInstance(), event.getTimeExpression()); 66 } catch (XPathEvaluationException e) { 67 throw new ExecutionException(e); 68 } 69 } 70 PickECTask pickECTask = new PickECTask(getId(), origin.getActivities().indexOf(activity)); 71 EngineTimer.schedule(pickECTask, expiration); 72 timerTasks.add(pickECTask); 73 } 74 } 75 76 public void notifyExecution(ExecutionContext ec) { 77 this.setStatus(ACTIVE); 78 notifyExecutionToContainer(); 79 } 80 81 public void notifyTermination(ExecutionContext ec) { 82 this.setStatus(COMPLETED); 83 EngineTimer.cancelTaskFor(getId()); 84 notifyTerminationToContainer(); 85 } 86 87 public Activity getActivityForChildContext(ExecutionContext ec) { 88 return (Activity) getActivity().getActivities().get(getExecutedActivityIndex()); 89 } 90 91 public void notifyAlarm(int activityPos) { 92 // If the activity is not active, it has been completed already or is in error 93 // so notifying alarm is now useless. 94 if (getStatus() == ACTIVE) { 95 Activity activity = (Activity) getActivity().getActivities().get(activityPos); 96 executedActivityIndex = activityPos; 97 98 ExecutionContext context = null; 99 try { 100 context = ExecutionContextFactory.createExecutionContext(activity, this); 101 } catch (DBSessionException e) { 102 throw new ExecutionException("An error occured when trying to create an execution context " + 103 "for activity " + activity + " in the alarm of a pick execution context " + this, e); 104 } 105 context.execute(); 106 } 107 } 108 109 public void acknowledgeMessage(Activity activity, Document message) { 110 if (getStatus() == ACTIVE) { 111 String variableToSet = ((Pick)getActivity()).getMessageEvent(activity).getVariable(); 112 if (variableToSet != null && message != null) { 113 ProcessInstanceImpl thisInstance = (ProcessInstanceImpl) fetchInstance(); 114 try { 115 VariableXAO.createVariable(thisInstance.getProcess().getName(), variableToSet 116 , thisInstance.getId(), message); 117 } catch (XMLSessionException e) { 118 throw new ExecutionException("Could not set a variable in XML database " + 119 variableToSet, e); 120 } 121 } 122 123 executedActivityIndex = getActivity().getActivities().indexOf(activity); 124 ExecutionContext context = null; 125 try { 126 context = ExecutionContextFactory.createExecutionContext(activity, this); 127 } catch (DBSessionException e) { 128 throw new ExecutionException("An error occured when trying to create an execution context " + 129 "for activity " + activity + " in pick execution context " + this, e); 130 } 131 context.execute(); 132 } else { 133 throw new ExecutionException("This pick execution context is at status " + getStatus() + 134 " it can't acknowledge the message " + message.asXML()); 135 } 136 } 137 138 public ExecutionContext getExecution(Activity childActivity) { 139 if (executedActivityIndex == -1) { 140 return null; 141 } else { 142 int index = getActivity().getActivities().indexOf(childActivity); 143 if (executedActivityIndex != index) { 144 return null; 145 } else { 146 return (ExecutionContext) getExecutionContexts().get(0); 147 } 148 } 149 } 150 }

This page was automatically generated by Maven