Advertisement
Guest User

Untitled

a guest
Mar 29th, 2017
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.09 KB | None | 0 0
  1. package au.com.ds.eft;
  2.  
  3. import au.com.ds.ef.*;
  4. import au.com.ds.ef.call.*;
  5.  
  6. import static au.com.ds.ef.FlowBuilder.*;
  7. import static au.com.ds.eft.Main1.Events.*;
  8. import static au.com.ds.eft.Main1.States.*;
  9.  
  10. /**
  11. * User: andrey
  12. * Date: 23/09/13
  13. * Time: 10:27 PM
  14. */
  15. public class Main1 {
  16. private static class FlowContext extends StatefulContext {
  17. private int balance = 1000;
  18. private String pin;
  19. private int invalidPinCounter;
  20. private int withdrawAmt;
  21. }
  22.  
  23. public enum States implements StateEnum {
  24. SHOWING_WELCOME,
  25. WAITING_FOR_PIN,
  26. CHECKING_PIN,
  27. RETURNING_CARD,
  28. SHOWING_MAIN_MENU,
  29. SHOWING_PIN_INVALID,
  30. SHOWING_CARD_LOCKED,
  31. SHOWING_BALANCE,
  32. SHOWING_WITHDRAW_MENU,
  33. SHOWING_TAKE_CASH,
  34. TERMINATED
  35. }
  36.  
  37. public enum Events implements EventEnum {
  38. cardPresent,
  39. cardExtracted,
  40. pinProvided,
  41. pinValid,
  42. pinInvalid,
  43. tryAgain,
  44. noMoreTries,
  45. cancel,
  46. confirm,
  47. menuShowBalance,
  48. menuWithdrawCash,
  49. menuExit,
  50. switchOff,
  51. cashExtracted
  52. }
  53.  
  54. private IoController ioController;
  55.  
  56. private EasyFlow<FlowContext> easyFlow;
  57.  
  58. public static void main(String[] args) throws InterruptedException {
  59. Main1 m = new Main1();
  60.  
  61. m.initFlow();
  62. m.bindFlow();
  63. m.startFlow();
  64.  
  65. Thread.sleep(Long.MAX_VALUE);
  66. }
  67.  
  68. private void initFlow() {
  69. ioController = new IoController();
  70. ioController.init();
  71.  
  72. easyFlow =
  73.  
  74. from(SHOWING_WELCOME).transit(
  75. on(cardPresent).to(WAITING_FOR_PIN).transit(
  76. on(pinProvided).to(CHECKING_PIN).transit(
  77. on(pinValid).to(SHOWING_MAIN_MENU).transit(
  78. on(menuShowBalance).to(SHOWING_BALANCE).transit(
  79. on(cancel).to(SHOWING_MAIN_MENU)
  80. ),
  81. on(menuWithdrawCash).to(SHOWING_WITHDRAW_MENU).transit(
  82. on(cancel).to(SHOWING_MAIN_MENU),
  83. on(confirm).to(SHOWING_TAKE_CASH).transit(
  84. on(cashExtracted).to(SHOWING_MAIN_MENU)
  85. )
  86. ),
  87. on(menuExit).to(RETURNING_CARD)
  88. ),
  89. on(pinInvalid).to(SHOWING_PIN_INVALID).transit(
  90. on(tryAgain).to(WAITING_FOR_PIN),
  91. on(noMoreTries).to(SHOWING_CARD_LOCKED).transit(
  92. on(confirm).to(SHOWING_WELCOME)
  93. ),
  94. on(cancel).to(RETURNING_CARD)
  95. )
  96. ),
  97. on(cancel).to(RETURNING_CARD).transit(
  98. on(cardExtracted).to(SHOWING_WELCOME)
  99. )
  100. ),
  101. on(switchOff).finish(TERMINATED)
  102. );
  103. }
  104.  
  105. private void bindFlow() {
  106. easyFlow
  107.  
  108. .whenEnter(SHOWING_WELCOME, new ContextHandler<FlowContext>() {
  109. @Override
  110. public void call(final FlowContext context) throws Exception {
  111. ioController.println("\n\n*** Welcome ***\n---------------");
  112. showOption("Select your option and press [Enter]...\n 1 Insert card\n 2 Terminate ATM", new IoController.InputEventHandler() {
  113. @Override
  114. public void onInputEvent(String s) {
  115. if (s.equals("1")) {
  116. context.trigger(cardPresent);
  117. } else {
  118. context.trigger(switchOff);
  119. }
  120. }
  121. });
  122. context.invalidPinCounter = 0;
  123. }
  124. })
  125.  
  126. .whenEnter(WAITING_FOR_PIN, (new ContextHandler<FlowContext>() {
  127. @Override
  128. public void call(final FlowContext context) throws Exception {
  129. ioController.println("\n\n*** Waiting for PIN ***\n---------------");
  130. showOption("Please enter your PIN and press [Enter] or just press [Enter] to cancel (current PIN is 1234)...", new IoController.InputEventHandler() {
  131. @Override
  132. public void onInputEvent(String s) {
  133. if (s.length() == 4) {
  134. context.pin = s;
  135. context.trigger(pinProvided);
  136. } else {
  137. // no pin is provided - cancel
  138. context.trigger(cancel);
  139. }
  140. }
  141. });
  142. }
  143. }))
  144.  
  145. .whenEnter(CHECKING_PIN, new ContextHandler<FlowContext>() {
  146. @Override
  147. public void call(FlowContext context) throws Exception {
  148. if (context.pin.equals("1234")) {
  149. context.trigger(pinValid);
  150. } else {
  151. context.invalidPinCounter++;
  152. context.trigger(pinInvalid);
  153. }
  154. }
  155. })
  156.  
  157. .whenEnter(SHOWING_MAIN_MENU, new ContextHandler<FlowContext>() {
  158. @Override
  159. public void call(final FlowContext context) throws Exception {
  160. ioController.println("\n\n*** Main Menu ***\n---------------");
  161. showOption("Select your option and press [Enter]...\n1 See my balance\n2 Get cash\n3 Exit", new IoController.InputEventHandler() {
  162. @Override
  163. public void onInputEvent(String s) {
  164. if (s.equals("1")) {
  165. context.trigger(menuShowBalance);
  166. } else if (s.equals("2")) {
  167. context.trigger(menuWithdrawCash);
  168. } else if (s.equals("3")) {
  169. context.trigger(menuExit);
  170. }
  171. }
  172. });
  173. }
  174. })
  175.  
  176. .whenEnter(SHOWING_BALANCE, new ContextHandler<FlowContext>() {
  177. @Override
  178. public void call(final FlowContext context) throws Exception {
  179. ioController.println("\n\n*** Showing Balance ***\n---------------");
  180. ioController.println("You currently have $" + context.balance + " on your account");
  181. showOption("Press [Enter] to continue...", new IoController.InputEventHandler() {
  182. @Override
  183. public void onInputEvent(String s) {
  184. context.trigger(cancel);
  185. }
  186. });
  187. }
  188. })
  189.  
  190. .whenEnter(SHOWING_WITHDRAW_MENU, new ContextHandler<FlowContext>() {
  191. @Override
  192. public void call(final FlowContext context) throws Exception {
  193. ioController.println("\n\n*** Withdraw Cash ***\n---------------");
  194. ioController.println("How much cash do you want to withdraw?\n" +
  195. "Choose your option and press [Enter] to confirm...");
  196. showOption("\n1 for $50\n2 for $100\n3 for $200\n4 to cancel", new IoController.InputEventHandler() {
  197. @Override
  198. public void onInputEvent(String s) {
  199. int amt = 0;
  200.  
  201. if (s.equals("1")) {
  202. amt = 50;
  203. } else if (s.equals("2")) {
  204. amt = 100;
  205. } else if (s.equals("3")) {
  206. amt = 200;
  207. }
  208.  
  209. if (amt == 0) {
  210. context.trigger(cancel);
  211. } else {
  212. context.withdrawAmt = amt;
  213. context.trigger(confirm);
  214. }
  215. }
  216. });
  217. }
  218. })
  219.  
  220. .whenEnter(SHOWING_TAKE_CASH, new ContextHandler<FlowContext>() {
  221. @Override
  222. public void call(final FlowContext context) throws Exception {
  223. ioController.println("\n\n*** Take your cash ***\n---------------");
  224. ioController.println("Please, take your cash");
  225. showOption("Take my $" + context.withdrawAmt + " press [Enter]...", new IoController.InputEventHandler() {
  226. @Override
  227. public void onInputEvent(String s) {
  228. context.balance -= context.withdrawAmt;
  229. context.trigger(cashExtracted);
  230. }
  231. });
  232. }
  233. })
  234.  
  235. .whenEnter(SHOWING_PIN_INVALID, new ContextHandler<FlowContext>() {
  236. @Override
  237. public void call(final FlowContext context) throws Exception {
  238. boolean canTryAgain = context.invalidPinCounter < 3;
  239.  
  240. ioController.println("\n\n*** Invalid PIN ***\n---------------");
  241. ioController.println("You entered invalid PIN.\n(" + (3 - context.invalidPinCounter) + " attempts left)");
  242. if (canTryAgain) {
  243. showOption("Choose your option and press [Enter]...\n1 Try again\n2 Cancel", new IoController.InputEventHandler() {
  244. @Override
  245. public void onInputEvent(String s) {
  246. if (s.equals("1")) {
  247. context.trigger(tryAgain);
  248. } else {
  249. context.trigger(cancel);
  250. }
  251. }
  252. });
  253. } else {
  254. showOption("Press [Enter] to continue...", new IoController.InputEventHandler() {
  255. @Override
  256. public void onInputEvent(String s) {
  257. context.trigger(noMoreTries);
  258. }
  259. });
  260. }
  261. }
  262. })
  263.  
  264. .whenEnter(SHOWING_CARD_LOCKED, new ContextHandler<FlowContext>() {
  265. @Override
  266. public void call(final FlowContext context) throws Exception {
  267. ioController.println("\n\n*** Your Card has been locked ***\n---------------");
  268. ioController.println("You have entered invalid PIN 3 times so I swallowed your card.\n" +
  269. "Mmm... Yummy ;)");
  270. showOption("Press [Enter] to continue...", new IoController.InputEventHandler() {
  271. @Override
  272. public void onInputEvent(String s) {
  273. context.trigger(confirm);
  274. }
  275. });
  276. }
  277. })
  278.  
  279. .whenEnter(RETURNING_CARD, new ContextHandler<FlowContext>() {
  280. @Override
  281. public void call(final FlowContext context) throws Exception {
  282. ioController.println("\n\n*** Returning Card ***\n---------------");
  283. ioController.println("Thanks for using our ATM");
  284. showOption("Please take your card - press [Enter]...", new IoController.InputEventHandler() {
  285. @Override
  286. public void onInputEvent(String s) {
  287. context.trigger(cardExtracted);
  288. }
  289. });
  290. }
  291. })
  292.  
  293. .whenEnter(TERMINATED, new ContextHandler<FlowContext>() {
  294. @Override
  295. public void call(FlowContext flowContext) throws Exception {
  296. System.exit(0);
  297. }
  298. });
  299. }
  300.  
  301. private void startFlow() {
  302. easyFlow.start(new FlowContext());
  303. }
  304.  
  305. private void showOption(String title, final IoController.InputEventHandler handler) {
  306. ioController.println(title);
  307. ioController.setEventHandler(handler);
  308. }
  309. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement