10 and compose it with
Advanced Topics 233
namespace SP
{
enum Mode { Sent, CancelRequested }
enum Status { Cancelled, Completed }
[Feature]
class Cancellation
{
static Map
mode = Map.EmptyMap;
[Action("ReqSetup(m,_)")]
[Action("ReqWork(m,_)")]
static void Req(int m) { mode = mode.Add(m, Mode.Sent); }
static bool ReqEnabled(int m) { return !mode.ContainsKey(m); }
[Action]
static void Cancel(int m)
{
if (mode.ContainsKey(m) && mode[m] == Mode.Sent)
mode = mode.Override(m, Mode.CancelRequested);
}
[Action("ResSetup(m,_,s)")]
[Action("ResWork(m,_,s)")]
public static void Res(int m, Status s)
{
mode = mode.RemoveKey(m);
}
public static bool ResEnabled(int m, Status s)
{
return mode.ContainsKey(m) &&
(s != Status.Cancelled || mode[m] == Mode.CancelRequested);
}
[AcceptingStateCondition]
static bool IsAcceptingState() { return mode.IsEmpty; }
}
}
Figure 14.7. Cancellation feature model program.
234 Compositional Modeling
FSM(0, AcceptingStates(0),
Transitions(t(0,Cancel(2),0), t(0,ReqSetup(2),0), t(0,ResSetup(2),0)),
Vocabulary("ResWork", "ReqWork"))
Figure 14.8. A scnenario used to restrict the cancellation model program.
Map() Cancel(2)
Map(2 -> Mode("Sent"))
ReqSetup(2,_) ResSetup(2, _, Status("Completed"))
Map(2 -> Mode("CancelRequested"))
Cancel(2)
ResSetup(2, _, Status("Cancelled"))
ResSetup(2, _, Status("Completed"))
Cancel(2)
Figure 14.
Pages:
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312