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