activity.xml 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622
  1. <class name="ActivityExecutor">
  2. <relationships>
  3. <inheritance class="tk.Toplevel" priority="1"/>
  4. <inheritance class="SCCDWidget" priority="0"/>
  5. <association name="activity_browse" class="A"/>
  6. <association name="model_browse_button" class="Button"/>
  7. <association name="model_browse_entry" class="Entry"/>
  8. <association name="model_browse_label" class="Label"/>
  9. <association name="browsers" class="Browser"/>
  10. <association name="parent" class="A"/>
  11. </relationships>
  12. <constructor>
  13. <super class="tk.TopLevel"/>
  14. <super class="SCCDWidget"/>
  15. <body>
  16. self.activity_frame = tk.Frame(self)
  17. self.input_frame = tk.Frame(self)
  18. self.output_frame = tk.Frame(self)
  19. self.exec_frame = tk.Frame(self)
  20. self.activity_frame.pack()
  21. tk.Label(self, text="Inputs").pack()
  22. self.input_frame.pack()
  23. tk.Label(self, text="Outputs").pack()
  24. self.output_frame.pack()
  25. self.exec_frame.pack()
  26. self.stored_associations = {}
  27. self.current = None
  28. self.activity = None
  29. self.exec_input_signature = {}
  30. self.exec_output_signature = {}
  31. </body>
  32. </constructor>
  33. <destructor>
  34. <body>
  35. self.destroy()
  36. </body>
  37. </destructor>
  38. <scxml initial="all">
  39. <state id="all" initial="create_activity_browse_label">
  40. <state id="create_activity_browse_label" initial="create">
  41. <state id="create">
  42. <onentry>
  43. <raise event="create_instance" scope="cd">
  44. <parameter expr="'activity_browse'"/>
  45. <parameter expr="'Label'"/>
  46. <parameter expr="{'parent': self.activity_frame, 'text': 'Activity'}"/>
  47. </raise>
  48. </onentry>
  49. <transition event="instance_created" target="../pack">
  50. <parameter name="assoc_name"/>
  51. <raise event="start_instance" scope="cd">
  52. <parameter expr="assoc_name"/>
  53. </raise>
  54. </transition>
  55. </state>
  56. <state id="pack">
  57. <transition event="tk_widget" target="../../create_activity_browse_entry">
  58. <parameter name="tk_widget"/>
  59. <script>
  60. tk_widget.grid(row=0,column=0)
  61. </script>
  62. </transition>
  63. </state>
  64. </state>
  65. <state id="create_activity_browse_entry" initial="create">
  66. <state id="create">
  67. <onentry>
  68. <raise event="create_instance" scope="cd">
  69. <parameter expr="'activity_browse'"/>
  70. <parameter expr="'Entry'"/>
  71. <parameter expr="{'parent': self.activity_frame, 'name': 'activity_entry', 'value': '(none)', 'readonly': True}"/>
  72. </raise>
  73. </onentry>
  74. <transition event="instance_created" target="../pack">
  75. <parameter name="assoc_name"/>
  76. <raise event="start_instance" scope="cd">
  77. <parameter expr="assoc_name"/>
  78. </raise>
  79. <script>
  80. self.activity_entry = assoc_name
  81. </script>
  82. </transition>
  83. </state>
  84. <state id="pack">
  85. <transition event="tk_widget" target="../../create_activity_browse_button">
  86. <parameter name="tk_widget"/>
  87. <script>
  88. tk_widget.grid(row=0,column=1)
  89. </script>
  90. </transition>
  91. </state>
  92. </state>
  93. <state id="create_activity_browse_button" initial="create">
  94. <state id="create">
  95. <onentry>
  96. <raise event="create_instance" scope="cd">
  97. <parameter expr="'activity_browse'"/>
  98. <parameter expr="'Button'"/>
  99. <parameter expr="{'parent': self.activity_frame, 'event_parameters': 'browse_activity', 'visual': TextVisual('...'), 'tooltip_text': 'Browse for a activity'}"/>
  100. </raise>
  101. </onentry>
  102. <transition event="instance_created" target="../pack">
  103. <parameter name="assoc_name"/>
  104. <raise event="start_instance" scope="cd">
  105. <parameter expr="assoc_name"/>
  106. </raise>
  107. </transition>
  108. </state>
  109. <state id="pack">
  110. <transition event="tk_widget" target="../../create_exec">
  111. <parameter name="tk_widget"/>
  112. <script>
  113. tk_widget.grid(row=0,column=2)
  114. </script>
  115. </transition>
  116. </state>
  117. </state>
  118. <state id="create_exec" initial="create">
  119. <state id="create">
  120. <onentry>
  121. <raise event="create_instance" scope="cd">
  122. <parameter expr="'activity_browse'"/>
  123. <parameter expr="'Button'"/>
  124. <parameter expr="{'parent': self.exec_frame, 'event_parameters': 'execute', 'visual': TextVisual('EXECUTE'), 'tooltip_text': 'Execute the activity'}"/>
  125. </raise>
  126. </onentry>
  127. <transition event="instance_created" target="../pack">
  128. <parameter name="assoc_name"/>
  129. <raise event="start_instance" scope="cd">
  130. <parameter expr="assoc_name"/>
  131. </raise>
  132. </transition>
  133. </state>
  134. <state id="pack">
  135. <transition event="tk_widget" target="../../ready">
  136. <parameter name="tk_widget"/>
  137. <script>
  138. tk_widget.pack()
  139. </script>
  140. </transition>
  141. </state>
  142. </state>
  143. <state id="ready">
  144. <transition event="button_pressed" cond="event_name == 'browse_activity'" target="../browse_activity">
  145. <parameter name="event_name"/>
  146. </transition>
  147. <transition event="button_pressed" cond="event_name.startswith('input_') or event_name.startswith('output_')" target="../browse_model">
  148. <parameter name="event_name"/>
  149. <script>
  150. self.current = event_name
  151. if event_name.startswith('input_'):
  152. self.required_type = [self.input_signature[event_name.split("input_", 1)[1]]]
  153. else:
  154. # We will overwrite the model anyway, so doesn't matter what it is!
  155. self.required_type = None
  156. </script>
  157. </transition>
  158. <transition event="changed_entry" target=".">
  159. <parameter name="event_name"/>
  160. <parameter name="value"/>
  161. <script>
  162. if event_name.startswith('input_'):
  163. self.exec_input_signature[event_name.split("input_", 1)[1]] = value
  164. else:
  165. self.exec_output_signature[event_name.split("output_", 1)[1]] = value
  166. </script>
  167. </transition>
  168. <transition event="button_pressed" cond="event_name == 'execute'" target="../execute">
  169. <parameter name="event_name"/>
  170. </transition>
  171. </state>
  172. <state id="execute" initial="check_args">
  173. <state id="check_args">
  174. <onentry>
  175. <raise event="change_bg" scope="narrow" target="[self.stored_associations['input_%s' % i] for i in self.input_signature.keys()]">
  176. <parameter expr="'light grey'"/>
  177. </raise>
  178. </onentry>
  179. <transition cond="set(self.exec_input_signature.keys()) == set(self.input_signature.keys())" target="../execute">
  180. <raise event="disable" scope="narrow" target="'model_browse_entry'"/>
  181. </transition>
  182. <transition cond="set(self.exec_input_signature.keys()) != set(self.input_signature.keys())" target="../../ready">
  183. <script>
  184. actual = set(self.exec_input_signature.keys())
  185. formal = set(self.input_signature.keys())
  186. missing = formal - actual
  187. print("Missing input values for: " + str(missing))
  188. </script>
  189. <raise event="change_bg" scope="narrow" target="[self.stored_associations['input_%s' % i] for i in missing]">
  190. <parameter expr="'red'"/>
  191. </raise>
  192. </transition>
  193. </state>
  194. <state id="execute">
  195. <onentry>
  196. <script>
  197. print("Executing activity %s" % self.activity)
  198. print(" Inputs " + str(self.exec_input_signature))
  199. print(" Outputs " + str(self.exec_output_signature))
  200. </script>
  201. <raise event="mv_request" scope="broad">
  202. <parameter expr="'transformation_execute'"/>
  203. <parameter expr="[self.activity, self.exec_input_signature, self.exec_output_signature]"/>
  204. </raise>
  205. </onentry>
  206. <transition event="mv_response" target="../in_context">
  207. <parameter name="context"/>
  208. <script>
  209. self.current_context = context
  210. </script>
  211. </transition>
  212. </state>
  213. <state id="in_context">
  214. <!-- TODO Add data_input and data_output -->
  215. <onentry>
  216. <script>
  217. print("Waiting in context: " + str(self.current_context))
  218. </script>
  219. </onentry>
  220. <onexit>
  221. <script>
  222. print("Finished context: " + str(self.current_context))
  223. </script>
  224. </onexit>
  225. <transition event="mv_response" cond="result == True" target="../alter_context_result">
  226. <parameter name="result"/>
  227. </transition>
  228. <transition event="mv_response" cond="result == False" target="../../ready">
  229. <parameter name="result"/>
  230. </transition>
  231. </state>
  232. <state id="alter_context_result" initial="check_next">
  233. <state id="check_next">
  234. <transition cond="self.exec_output_signature" target="../add"/>
  235. <transition cond="not self.exec_output_signature" target="../../../closing"/>
  236. </state>
  237. <state id="add">
  238. <onentry>
  239. <script>
  240. tag, model = self.exec_output_signature.popitem()
  241. metamodel = self.output_signature[tag]
  242. print("Setting context for " + str((model, metamodel)))
  243. </script>
  244. <raise event="mv_request" scope="broad">
  245. <parameter expr="'alter_context'"/>
  246. <parameter expr="[model, metamodel]"/>
  247. </raise>
  248. </onentry>
  249. <transition event="mv_response" target="../check_next"/>
  250. </state>
  251. </state>
  252. </state>
  253. <state id="browse_activity" initial="create_browser">
  254. <state id="create_browser">
  255. <onentry>
  256. <raise event="create_instance" scope="cd">
  257. <parameter expr="'browsers'"/>
  258. <parameter expr="'Browser'"/>
  259. <parameter expr="'Select activity to execute.'"/>
  260. <parameter expr="None"/>
  261. </raise>
  262. </onentry>
  263. <transition event="instance_created" target="../waiting_for_decision">
  264. <parameter name="assoc_name"/>
  265. <raise event="start_instance" scope="cd">
  266. <parameter expr="assoc_name"/>
  267. </raise>
  268. </transition>
  269. </state>
  270. <state id="waiting_for_decision">
  271. <transition event="browse_result" target=".">
  272. <parameter name="activity"/>
  273. <script>
  274. self.activity = activity
  275. </script>
  276. <raise event="change_value" target="self.activity_entry">
  277. <parameter expr="self.activity"/>
  278. </raise>
  279. </transition>
  280. <transition event="close_window" target="../../redraw_signature">
  281. <raise event="delete_instance" scope="cd">
  282. <parameter expr="'browsers'"/>
  283. </raise>
  284. </transition>
  285. </state>
  286. </state>
  287. <state id="redraw_signature" initial="clear_previous">
  288. <state id="clear_previous">
  289. <transition target="../read_signature">
  290. <raise event="delete_instance" scope="cd">
  291. <parameter expr="'model_browse_label'"/>
  292. </raise>
  293. <raise event="delete_instance" scope="cd">
  294. <parameter expr="'model_browse_button'"/>
  295. </raise>
  296. <raise event="delete_instance" scope="cd">
  297. <parameter expr="'model_browse_entry'"/>
  298. </raise>
  299. </transition>
  300. </state>
  301. <state id="read_signature">
  302. <onentry>
  303. <raise event="mv_request" scope="broad">
  304. <parameter expr="'transformation_signature'"/>
  305. <parameter expr="[self.activity]"/>
  306. </raise>
  307. </onentry>
  308. <transition event="mv_response" target="../add_input">
  309. <parameter name="result"/>
  310. <script>
  311. self.input_signature, self.output_signature = result
  312. self.input_signature_iter = dict(self.input_signature)
  313. self.output_signature_iter = dict(self.output_signature)
  314. </script>
  315. </transition>
  316. </state>
  317. <state id="add_input" initial="check_next">
  318. <onentry>
  319. <script>
  320. self.counter = -1
  321. </script>
  322. </onentry>
  323. <state id="check_next">
  324. <transition cond="self.input_signature_iter" target="../create_label">
  325. <script>
  326. self.counter += 1
  327. self.current = self.input_signature_iter.popitem()
  328. </script>
  329. </transition>
  330. <transition cond="not self.input_signature_iter" target="../../add_output"/>
  331. </state>
  332. <state id="create_label">
  333. <onentry>
  334. <raise event="create_instance" scope="cd">
  335. <parameter expr="'model_browse_label'"/>
  336. <parameter expr="'Label'"/>
  337. <parameter expr="{'parent': self.input_frame, 'text': '%s : %s' % self.current}"/>
  338. </raise>
  339. </onentry>
  340. <transition event="instance_created" target="../pack_label">
  341. <parameter name="assoc_name"/>
  342. <raise event="start_instance" scope="cd">
  343. <parameter expr="assoc_name"/>
  344. </raise>
  345. </transition>
  346. </state>
  347. <state id="pack_label">
  348. <transition event="tk_widget" target="../create_entry">
  349. <parameter name="tk_widget"/>
  350. <script>
  351. tk_widget.grid(row=self.counter,column=0)
  352. </script>
  353. </transition>
  354. </state>
  355. <state id="create_entry">
  356. <onentry>
  357. <raise event="create_instance" scope="cd">
  358. <parameter expr="'model_browse_entry'"/>
  359. <parameter expr="'Entry'"/>
  360. <parameter expr="{'parent': self.input_frame, 'name': 'input_%s' % self.current[0], 'value': '', 'readonly': True}"/>
  361. </raise>
  362. </onentry>
  363. <transition event="instance_created" target="../pack_entry">
  364. <parameter name="assoc_name"/>
  365. <raise event="start_instance" scope="cd">
  366. <parameter expr="assoc_name"/>
  367. </raise>
  368. <script>
  369. self.stored_associations["input_%s" % self.current[0]] = assoc_name
  370. </script>
  371. </transition>
  372. </state>
  373. <state id="pack_entry">
  374. <transition event="tk_widget" target="../create_button">
  375. <parameter name="tk_widget"/>
  376. <script>
  377. tk_widget.grid(row=self.counter, column=1)
  378. </script>
  379. </transition>
  380. </state>
  381. <state id="create_button">
  382. <onentry>
  383. <raise event="create_instance" scope="cd">
  384. <parameter expr="'model_browse_button'"/>
  385. <parameter expr="'Button'"/>
  386. <parameter expr="{'parent': self.input_frame, 'visual': TextVisual('...'), 'tooltip_text': 'Select input model for tag %s.' % self.current[0], 'event_parameters': 'input_%s' % self.current[0]}"/>
  387. </raise>
  388. </onentry>
  389. <transition event="instance_created" target="../pack_button">
  390. <parameter name="assoc_name"/>
  391. <raise event="start_instance" scope="cd">
  392. <parameter expr="assoc_name"/>
  393. </raise>
  394. </transition>
  395. </state>
  396. <state id="pack_button">
  397. <transition event="tk_widget" target="../check_next">
  398. <parameter name="tk_widget"/>
  399. <script>
  400. tk_widget.grid(row=self.counter, column=2)
  401. </script>
  402. </transition>
  403. </state>
  404. </state>
  405. <state id="add_output" initial="check_next">
  406. <onentry>
  407. <script>
  408. self.counter = -1
  409. </script>
  410. </onentry>
  411. <state id="check_next">
  412. <transition cond="self.output_signature_iter" target="../create_label">
  413. <script>
  414. self.counter += 1
  415. self.current = self.output_signature_iter.popitem()
  416. </script>
  417. </transition>
  418. <transition cond="not self.output_signature_iter" target="../../../ready"/>
  419. </state>
  420. <state id="create_label">
  421. <onentry>
  422. <raise event="create_instance" scope="cd">
  423. <parameter expr="'model_browse_label'"/>
  424. <parameter expr="'Label'"/>
  425. <parameter expr="{'parent': self.output_frame, 'text': '%s : %s' % self.current}"/>
  426. </raise>
  427. </onentry>
  428. <transition event="instance_created" target="../pack_label">
  429. <parameter name="assoc_name"/>
  430. <raise event="start_instance" scope="cd">
  431. <parameter expr="assoc_name"/>
  432. </raise>
  433. </transition>
  434. </state>
  435. <state id="pack_label">
  436. <transition event="tk_widget" target="../create_entry">
  437. <parameter name="tk_widget"/>
  438. <script>
  439. tk_widget.grid(row=self.counter, column=0)
  440. </script>
  441. </transition>
  442. </state>
  443. <state id="create_entry">
  444. <onentry>
  445. <raise event="create_instance" scope="cd">
  446. <parameter expr="'model_browse_entry'"/>
  447. <parameter expr="'Entry'"/>
  448. <parameter expr="{'parent': self.output_frame, 'name': 'output_%s' % self.current[0], 'value': '', 'readonly': False}"/>
  449. </raise>
  450. </onentry>
  451. <transition event="instance_created" target="../pack_entry">
  452. <parameter name="assoc_name"/>
  453. <raise event="start_instance" scope="cd">
  454. <parameter expr="assoc_name"/>
  455. </raise>
  456. <script>
  457. self.stored_associations["output_%s" % self.current[0]] = assoc_name
  458. </script>
  459. </transition>
  460. </state>
  461. <state id="pack_entry">
  462. <transition event="tk_widget" target="../create_button">
  463. <parameter name="tk_widget"/>
  464. <script>
  465. tk_widget.grid(row=self.counter, column=1)
  466. </script>
  467. </transition>
  468. </state>
  469. <state id="create_button">
  470. <onentry>
  471. <raise event="create_instance" scope="cd">
  472. <parameter expr="'model_browse_button'"/>
  473. <parameter expr="'Button'"/>
  474. <parameter expr="{'parent': self.output_frame, 'visual': TextVisual('...'), 'tooltip_text': 'Select output model for tag %s.' % self.current[0], 'event_parameters': 'output_%s' % self.current[0]}"/>
  475. </raise>
  476. </onentry>
  477. <transition event="instance_created" target="../pack_button">
  478. <parameter name="assoc_name"/>
  479. <raise event="start_instance" scope="cd">
  480. <parameter expr="assoc_name"/>
  481. </raise>
  482. </transition>
  483. </state>
  484. <state id="pack_button">
  485. <transition event="tk_widget" target="../check_next">
  486. <parameter name="tk_widget"/>
  487. <script>
  488. tk_widget.grid(row=self.counter, column=2)
  489. </script>
  490. </transition>
  491. </state>
  492. </state>
  493. </state>
  494. <state id="browse_model" initial="create_browser">
  495. <state id="create_browser">
  496. <onentry>
  497. <raise event="create_instance" scope="cd">
  498. <parameter expr="'browsers'"/>
  499. <parameter expr="'Browser'"/>
  500. <parameter expr="'Select model to use.'"/>
  501. <parameter expr="self.required_type"/>
  502. </raise>
  503. </onentry>
  504. <transition event="instance_created" target="../waiting_for_decision">
  505. <parameter name="assoc_name"/>
  506. <raise event="start_instance" scope="cd">
  507. <parameter expr="assoc_name"/>
  508. </raise>
  509. </transition>
  510. </state>
  511. <state id="waiting_for_decision">
  512. <transition event="browse_result" target=".">
  513. <parameter name="model"/>
  514. <script>
  515. if self.current.startswith('input_'):
  516. self.exec_input_signature[self.current.split("input_", 1)[1]] = model
  517. else:
  518. self.exec_output_signature[self.current.split("output_", 1)[1]] = model
  519. </script>
  520. <raise event="change_value" scope="narrow" target="self.stored_associations[self.current]">
  521. <parameter expr="model"/>
  522. </raise>
  523. </transition>
  524. <transition event="close_window" target="../../ready">
  525. <raise event="delete_instance" scope="cd">
  526. <parameter expr="'browsers'"/>
  527. </raise>
  528. </transition>
  529. </state>
  530. </state>
  531. <state id="closing">
  532. <transition target="../closed">
  533. <raise event="delete_instance" scope="cd">
  534. <parameter expr="'model_browse_button'"/>
  535. </raise>
  536. <raise event="delete_instance" scope="cd">
  537. <parameter expr="'activity_browse'"/>
  538. </raise>
  539. <raise event="delete_instance" scope="cd">
  540. <parameter expr="'model_browse_entry'"/>
  541. </raise>
  542. <raise event="delete_instance" scope="cd">
  543. <parameter expr="'model_browse_label'"/>
  544. </raise>
  545. </transition>
  546. </state>
  547. <state id="closed">
  548. <onentry>
  549. <raise event="window_close" scope="narrow" target="'parent'"/>
  550. </onentry>
  551. </state>
  552. <transition event="window-close" cond="id(self) == ID" target="closing">
  553. <parameter name="ID"/>
  554. </transition>
  555. </state>
  556. </scxml>
  557. </class>