7faf5e8f2d0bd6cbd3e1de17eab02678204524ef
[samba.git] / swat / apps / swat / source / class / swat / module / AbstractModuleFsm.js
1 /*
2 #module(swat_module)
3 */
4
5 /**
6  * Common facilities for modules' finite state machines.  Each module's FSM
7  * should extend this class.
8  */
9 qx.OO.defineClass("swat.module.AbstractModuleFsm", qx.core.Object, function()
10 {
11   qx.core.Object.call(this);
12 });
13
14
15 qx.Proto.buildFsm = function(module)
16 {
17   throw new Error("Module must overload buildFsm() " +
18                   "to build its custom finite state machine.");
19 };
20
21 qx.Proto.addAwaitRpcResultState = function(module)
22 {
23   var fsm = module.fsm;
24
25   /*
26    * State: AwaitRpcResult
27    *
28    * Actions upon entry:
29    *  - enable any objects in group "swat.module.fsmUtils.enable_during_rpc"
30    *  - disable any objects in group "swat.module.fsmUtils.disable_during_rpc"
31    *
32    * Actions upon exit:
33    *   - disable any objects in group "group_enable_during_rpc"
34    *   - enable any objects in group "group_disable_during_rpc"
35    *
36    * Transition on:
37    *  "completed" (on RPC)
38    *  "failed" (on RPC)
39    *  "execute" on swat.module.fsmUtils.abort_rpc
40    */
41   var state = new qx.util.fsm.State(
42     "State_AwaitRpcResult",
43     {
44       "autoActionsBeforeOnentry" :
45       {
46         // The name of a function.
47         "setEnabled" :
48         [
49           {
50             // We want to enable objects in the group
51             // swat.module.fsmUtils.enable_during_rpc
52             "parameters" : [ true ],
53
54             // Call this.getObject(<object>).setEnabled(true) on
55             // state entry, for each <object> in the group called
56             // "swat.module.fsmUtils.enable_during_rpc".
57             "groups"      : [ "swat.module.fsmUtils.enable_during_rpc" ]
58           },
59
60           {
61             // We want to disable objects in the group
62             // swat.module.fsmUtils.disable_during_rpc
63             "parameters" : [ false ],
64
65             // Call this.getObject(<object>).setEnabled(false) on
66             // state entry, for each <object> in the group called
67             // "swat.module.fsmUtils.disable_during_rpc".
68             "groups"      : [ "swat.module.fsmUtils.disable_during_rpc" ]
69           }
70         ]
71       },
72
73       "autoActionsBeforeOnexit" :
74       {
75         // The name of a function.
76         "setEnabled" :
77         [
78           {
79             // We want to re-disable objects we had enabled, in the group
80             // swat.module.fsmUtils.enable_during_rpc
81             "parameters" : [ false ],
82
83             // Call this.getObject(<object>).setEnabled(false) on
84             // state entry, for each <object> in the group called
85             // "swat.module.fsmUtils.enable_during_rpc".
86             "groups"      : [ "swat.module.fsmUtils.enable_during_rpc" ]
87           },
88
89           {
90             // We want to re-enable objects we had disabled, in the group
91             // swat.module.fsmUtils.disable_during_rpc
92             "parameters" : [ true ],
93
94             // Call this.getObject(<object>).setEnabled(true) on
95             // state entry, for each <object> in the group called
96             // "swat.module.fsmUtils.disable_during_rpc".
97             "groups"      : [ "swat.module.fsmUtils.disable_during_rpc" ]
98           }
99         ]
100       },
101
102       "events" :
103       {
104         "execute"  :
105         {
106           "swat.module.fsmUtils.abort_rpc" :
107             "Transition_AwaitRpcResult_to_AwaitRpcResult_via_button_abort"
108         },
109
110         "completed" :
111           "Transition_AwaitRpcResult_to_Idle_via_complete",
112
113         "failed" :
114           "Transition_AwaitRpcResult_to_Idle_via_failed"
115       }
116     });
117   fsm.addState(state);
118
119   /*
120    * Transition: AwaitRpcResult to AwaitRpcResult
121    *
122    * Cause: "execute" on swat.module.fsmUtils.abort_rpc
123    */
124   var trans = new qx.util.fsm.Transition(
125     "Transition_AwaitRpcResult_to_AwaitRpcResult_via_button_abort",
126     {
127       "nextState" :
128         "State_AwaitRpcResult",
129
130       "ontransition" :
131         function(fsm, event)
132         {
133           // Get the request object
134           var request = fsm.getObject("swat.module.fsmUtils.request");
135
136           // Issue an abort for the pending request
137           request.abort();
138         }
139     });
140   state.addTransition(trans);
141
142   /*
143    * Transition: AwaitRpcResult to Idle
144    *
145    * Cause: "complete" (on RPC)
146    */
147   var trans = new qx.util.fsm.Transition(
148     "Transition_AwaitRpcResult_to_Idle_via_complete",
149     {
150       "nextState" :
151         "State_Idle",
152
153       "ontransition" :
154         function(fsm, event)
155         {
156           // Get the request object
157           var request = fsm.getObject("swat.module.fsmUtils.request");
158           
159           // Generate the result for a completed request
160           request.result =
161           {
162             type : "complete",
163             data : event.getData()
164           };
165         }
166     });
167   state.addTransition(trans);
168
169   /*
170    * Transition: AwaitRpcResult to Idle
171    *
172    * Cause: "failed" (on RPC)
173    */
174   var trans = new qx.util.fsm.Transition(
175     "Transition_AwaitRpcResult_to_Idle_via_failed",
176     {
177       "nextState" :
178         "State_Idle",
179
180       "ontransition" :
181         function(fsm, event)
182         {
183           // Get the request object
184           var request = fsm.getObject("swat.module.fsmUtils.request");
185           
186           // Generate the result for a completed request
187           request.result =
188           {
189             type : "failed",
190             data : event.getData()
191           };
192         }
193     });
194   state.addTransition(trans);
195 };
196
197
198 /**
199  * Singleton Instance Getter
200  */
201 qx.Class.getInstance = qx.util.Return.returnInstance;