roby 0.8.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (644) hide show
  1. checksums.yaml +7 -0
  2. data/.deep-cover.rb +3 -0
  3. data/.gitattributes +1 -0
  4. data/.gitignore +24 -0
  5. data/.simplecov +10 -0
  6. data/.travis.yml +17 -0
  7. data/.yardopts +4 -0
  8. data/Gemfile +15 -0
  9. data/README.md +11 -0
  10. data/Rakefile +47 -177
  11. data/benchmark/{alloc_misc.rb → attic/alloc_misc.rb} +2 -2
  12. data/benchmark/{discovery_latency.rb → attic/discovery_latency.rb} +19 -19
  13. data/benchmark/{garbage_collection.rb → attic/garbage_collection.rb} +9 -9
  14. data/benchmark/{genom.rb → attic/genom.rb} +0 -0
  15. data/benchmark/attic/transactions.rb +62 -0
  16. data/benchmark/plan_basic_operations.rb +28 -0
  17. data/benchmark/relations/graph.rb +63 -0
  18. data/benchmark/ruby/identity.rb +18 -0
  19. data/benchmark/ruby/set_intersect_vs_hash_merge.rb +39 -0
  20. data/benchmark/ruby/yield_vs_block.rb +35 -0
  21. data/benchmark/run +5 -0
  22. data/benchmark/synthetic_plan_modifications_with_transactions.rb +79 -0
  23. data/benchmark/transactions.rb +99 -51
  24. data/bin/roby +38 -197
  25. data/bin/roby-display +14 -0
  26. data/bin/roby-log +3 -176
  27. data/doc/guide/{src → attic}/abstraction/achieve_with.page +1 -1
  28. data/doc/guide/{src → attic}/abstraction/forwarding.page +1 -1
  29. data/doc/guide/{src → attic}/abstraction/hierarchy.page +1 -1
  30. data/doc/guide/{src → attic}/abstraction/index.page +1 -1
  31. data/doc/guide/{src → attic}/abstraction/task_models.page +1 -1
  32. data/doc/guide/{overview.rdoc → attic/cycle/api_overview.rdoc} +6 -1
  33. data/doc/guide/{src → attic}/cycle/cycle-overview.png +0 -0
  34. data/doc/guide/{src → attic}/cycle/cycle-overview.svg +0 -0
  35. data/doc/guide/attic/cycle/error_handling.page +98 -0
  36. data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.png +0 -0
  37. data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.svg +0 -0
  38. data/doc/guide/{src/cycle/error_handling.page → attic/cycle/error_sources.page} +46 -89
  39. data/doc/guide/{src → attic}/cycle/garbage_collection.page +1 -1
  40. data/doc/guide/{src → attic}/cycle/index.page +1 -1
  41. data/doc/guide/{src → attic}/cycle/propagation.page +11 -1
  42. data/doc/guide/{src → attic}/cycle/propagation_diamond.png +0 -0
  43. data/doc/guide/{src → attic}/cycle/propagation_diamond.svg +0 -0
  44. data/doc/guide/attic/plans/building_plans.page +89 -0
  45. data/doc/guide/attic/plans/code.page +192 -0
  46. data/doc/guide/{src/basics → attic/plans}/events.page +3 -4
  47. data/doc/guide/attic/plans/index.page +7 -0
  48. data/doc/guide/{plan_modifications.rdoc → attic/plans/plan_modifications.rdoc} +5 -3
  49. data/doc/guide/{src/basics → attic/plans}/plan_objects.page +2 -1
  50. data/doc/guide/attic/plans/querying_plans.page +5 -0
  51. data/doc/guide/{src/basics → attic/plans}/tasks.page +20 -20
  52. data/doc/guide/config.yaml +7 -4
  53. data/doc/guide/ext/extended_menu.rb +29 -0
  54. data/doc/guide/ext/init.rb +6 -0
  55. data/doc/guide/ext/rdoc_links.rb +7 -6
  56. data/doc/guide/src/advanced_concepts/history.page +5 -0
  57. data/doc/guide/src/advanced_concepts/index.page +11 -0
  58. data/doc/guide/src/advanced_concepts/recognizing_patterns.page +83 -0
  59. data/doc/guide/src/advanced_concepts/scheduling.page +87 -0
  60. data/doc/guide/src/advanced_concepts/transactions.page +5 -0
  61. data/doc/guide/src/advanced_concepts/unreachability.page +42 -0
  62. data/doc/guide/src/base.template +96 -0
  63. data/doc/guide/src/basics_shell_header.txt +5 -7
  64. data/doc/guide/src/building/action_coordination.page +96 -0
  65. data/doc/guide/src/building/actions.page +124 -0
  66. data/doc/guide/src/building/file_layout.page +71 -0
  67. data/doc/guide/src/building/index.page +50 -0
  68. data/doc/guide/src/building/patterns.page +86 -0
  69. data/doc/guide/src/building/patterns_forwarding.png +0 -0
  70. data/doc/guide/src/building/patterns_forwarding.svg +277 -0
  71. data/doc/guide/src/building/runtime.page +95 -0
  72. data/doc/guide/src/building/task_models.page +94 -0
  73. data/doc/guide/src/building/tasks.page +284 -0
  74. data/doc/guide/src/concepts/error_handling.page +100 -0
  75. data/doc/guide/src/concepts/exception_propagation.png +0 -0
  76. data/doc/guide/src/concepts/exception_propagation.svg +445 -0
  77. data/doc/guide/src/concepts/execution.page +85 -0
  78. data/doc/guide/src/concepts/execution.png +0 -0
  79. data/doc/guide/src/concepts/execution.svg +573 -0
  80. data/doc/guide/src/concepts/execution_cycle.png +0 -0
  81. data/doc/guide/src/concepts/garbage_collection.page +57 -0
  82. data/doc/guide/src/concepts/index.page +27 -0
  83. data/doc/guide/src/concepts/plans.page +101 -0
  84. data/doc/guide/src/concepts/policy.page +31 -0
  85. data/doc/guide/src/concepts/reactor.page +61 -0
  86. data/doc/guide/src/concepts/simple_plan_example.png +0 -0
  87. data/doc/guide/src/concepts/simple_plan_example.svg +376 -0
  88. data/doc/guide/src/default.template +9 -74
  89. data/doc/guide/src/event_relations/forward.page +71 -0
  90. data/doc/guide/src/event_relations/index.page +12 -0
  91. data/doc/guide/src/event_relations/scheduling_constraints.page +43 -0
  92. data/doc/guide/src/event_relations/signal.page +55 -0
  93. data/doc/guide/src/event_relations/temporal_constraints.page +77 -0
  94. data/doc/guide/src/htmldoc.metainfo +21 -8
  95. data/doc/guide/src/index.page +8 -3
  96. data/doc/guide/src/{introduction/install.page → installation/index.page} +37 -25
  97. data/doc/guide/src/installation/publications.page +14 -0
  98. data/doc/guide/src/{introduction → installation}/videos.page +14 -7
  99. data/doc/guide/src/interacting/index.page +16 -0
  100. data/doc/guide/src/interacting/run.page +33 -0
  101. data/doc/guide/src/interacting/shell.page +95 -0
  102. data/doc/guide/src/plugins/creating_plugins.page +72 -0
  103. data/doc/guide/src/plugins/index.page +27 -5
  104. data/doc/guide/src/plugins/{fault_tolerance.page → standard_plugins/fault_tolerance.page} +2 -2
  105. data/doc/guide/src/plugins/standard_plugins/index.page +11 -0
  106. data/doc/guide/src/plugins/{subsystems.page → standard_plugins/subsystems.page} +2 -2
  107. data/doc/guide/src/style_screen.css +687 -0
  108. data/doc/guide/src/task_relations/dependency.page +107 -0
  109. data/doc/guide/src/task_relations/executed_by.page +77 -0
  110. data/doc/guide/src/task_relations/index.page +12 -0
  111. data/doc/guide/src/task_relations/new_relations.page +119 -0
  112. data/doc/guide/src/task_relations/planned_by.page +46 -0
  113. data/doc/guide/src/tutorial/app.page +117 -0
  114. data/doc/guide/src/{basics → tutorial}/code_examples.page +6 -5
  115. data/doc/guide/src/{basics → tutorial}/dry.page +15 -15
  116. data/doc/guide/src/{basics → tutorial}/errors.page +43 -68
  117. data/doc/guide/src/tutorial/events.page +195 -0
  118. data/doc/guide/src/{basics → tutorial}/hierarchy.page +53 -52
  119. data/doc/guide/src/tutorial/index.page +13 -0
  120. data/doc/guide/src/tutorial/log_replay/goForward_1.png +0 -0
  121. data/doc/guide/src/tutorial/log_replay/goForward_2.png +0 -0
  122. data/doc/guide/src/tutorial/log_replay/goForward_3.png +0 -0
  123. data/doc/guide/src/{basics → tutorial}/log_replay/goForward_4.png +0 -0
  124. data/doc/guide/src/tutorial/log_replay/goForward_5.png +0 -0
  125. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_1.png +0 -0
  126. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_2.png +0 -0
  127. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_3.png +0 -0
  128. data/doc/guide/src/tutorial/log_replay/moveto_code_error.png +0 -0
  129. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_1.png +0 -0
  130. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_2.png +0 -0
  131. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_3.png +0 -0
  132. data/doc/guide/src/tutorial/log_replay/plan_repair_4.png +0 -0
  133. data/doc/guide/src/tutorial/log_replay/roby_log_main_window.png +0 -0
  134. data/doc/guide/src/{basics → tutorial}/log_replay/roby_log_relation_window.png +0 -0
  135. data/doc/guide/src/{basics → tutorial}/log_replay/roby_replay_event_representation.png +0 -0
  136. data/doc/guide/src/tutorial/relations_display.page +153 -0
  137. data/doc/guide/src/{basics → tutorial}/roby_cycle_overview.png +0 -0
  138. data/doc/guide/src/tutorial/shell.page +121 -0
  139. data/doc/guide/src/{basics → tutorial}/summary.page +1 -1
  140. data/doc/guide/src/tutorial/tasks.page +374 -0
  141. data/lib/roby.rb +102 -47
  142. data/lib/roby/actions.rb +17 -0
  143. data/lib/roby/actions/action.rb +80 -0
  144. data/lib/roby/actions/interface.rb +45 -0
  145. data/lib/roby/actions/library.rb +23 -0
  146. data/lib/roby/actions/models/action.rb +224 -0
  147. data/lib/roby/actions/models/coordination_action.rb +58 -0
  148. data/lib/roby/actions/models/interface.rb +22 -0
  149. data/lib/roby/actions/models/interface_base.rb +294 -0
  150. data/lib/roby/actions/models/library.rb +12 -0
  151. data/lib/roby/actions/models/method_action.rb +90 -0
  152. data/lib/roby/actions/task.rb +114 -0
  153. data/lib/roby/and_generator.rb +125 -0
  154. data/lib/roby/app.rb +2795 -829
  155. data/lib/roby/app/autotest_console_reporter.rb +138 -0
  156. data/lib/roby/app/base.rb +21 -0
  157. data/lib/roby/app/cucumber.rb +2 -0
  158. data/lib/roby/app/cucumber/controller.rb +439 -0
  159. data/lib/roby/app/cucumber/helpers.rb +280 -0
  160. data/lib/roby/app/cucumber/world.rb +32 -0
  161. data/lib/roby/app/debug.rb +136 -0
  162. data/lib/roby/app/gen.rb +2 -0
  163. data/lib/roby/app/rake.rb +178 -38
  164. data/lib/roby/app/robot_config.rb +9 -0
  165. data/lib/roby/app/robot_names.rb +115 -0
  166. data/lib/roby/app/run.rb +3 -2
  167. data/lib/roby/app/scripts.rb +72 -0
  168. data/lib/roby/app/scripts/autotest.rb +173 -0
  169. data/lib/roby/app/scripts/display.rb +2 -0
  170. data/lib/roby/app/scripts/restart.rb +52 -0
  171. data/lib/roby/app/scripts/results.rb +17 -8
  172. data/lib/roby/app/scripts/run.rb +155 -24
  173. data/lib/roby/app/scripts/shell.rb +147 -62
  174. data/lib/roby/app/scripts/test.rb +107 -22
  175. data/lib/roby/app/test_reporter.rb +74 -0
  176. data/lib/roby/app/test_server.rb +159 -0
  177. data/lib/roby/app/vagrant.rb +47 -0
  178. data/lib/roby/backports.rb +16 -0
  179. data/lib/roby/cli/display.rb +190 -0
  180. data/lib/roby/cli/exceptions.rb +17 -0
  181. data/lib/roby/cli/gen/actions/class.rb +5 -0
  182. data/lib/roby/cli/gen/actions/test.rb +6 -0
  183. data/lib/roby/cli/gen/app/.yardopts +6 -0
  184. data/lib/roby/cli/gen/app/README.md +28 -0
  185. data/lib/roby/cli/gen/app/Rakefile +15 -0
  186. data/{app → lib/roby/cli/gen/app}/config/app.yml +29 -39
  187. data/lib/roby/cli/gen/app/models/.gitattributes +1 -0
  188. data/{app → lib/roby/cli/gen/app/scripts}/controllers/.gitattributes +0 -0
  189. data/{app/data/.gitattributes → lib/roby/cli/gen/app/test/.gitignore} +0 -0
  190. data/lib/roby/cli/gen/class/class.rb +6 -0
  191. data/lib/roby/cli/gen/class/test.rb +7 -0
  192. data/lib/roby/cli/gen/helpers.rb +203 -0
  193. data/lib/roby/cli/gen/module/module.rb +5 -0
  194. data/lib/roby/cli/gen/module/test.rb +6 -0
  195. data/lib/roby/cli/gen/roby_app/config/init.rb +17 -0
  196. data/lib/roby/cli/gen/roby_app/config/robots/robot.rb +40 -0
  197. data/lib/roby/cli/gen/task/class.rb +44 -0
  198. data/lib/roby/cli/gen/task/test.rb +6 -0
  199. data/lib/roby/cli/gen_main.rb +120 -0
  200. data/lib/roby/cli/log.rb +276 -0
  201. data/lib/roby/cli/log/flamegraph.html +499 -0
  202. data/lib/roby/cli/log/flamegraph_renderer.rb +88 -0
  203. data/lib/roby/cli/main.rb +153 -0
  204. data/lib/roby/coordination.rb +60 -0
  205. data/lib/roby/coordination/action_script.rb +25 -0
  206. data/lib/roby/coordination/action_state_machine.rb +125 -0
  207. data/lib/roby/coordination/actions.rb +106 -0
  208. data/lib/roby/coordination/base.rb +145 -0
  209. data/lib/roby/coordination/calculus.rb +40 -0
  210. data/lib/roby/coordination/child.rb +28 -0
  211. data/lib/roby/coordination/event.rb +29 -0
  212. data/lib/roby/coordination/fault_handler.rb +25 -0
  213. data/lib/roby/coordination/fault_handling_task.rb +13 -0
  214. data/lib/roby/coordination/fault_response_table.rb +110 -0
  215. data/lib/roby/coordination/models/action_script.rb +64 -0
  216. data/lib/roby/coordination/models/action_state_machine.rb +224 -0
  217. data/lib/roby/coordination/models/actions.rb +191 -0
  218. data/lib/roby/coordination/models/arguments.rb +55 -0
  219. data/lib/roby/coordination/models/base.rb +176 -0
  220. data/lib/roby/coordination/models/capture.rb +86 -0
  221. data/lib/roby/coordination/models/child.rb +35 -0
  222. data/lib/roby/coordination/models/event.rb +41 -0
  223. data/lib/roby/coordination/models/exceptions.rb +42 -0
  224. data/lib/roby/coordination/models/fault_handler.rb +219 -0
  225. data/lib/roby/coordination/models/fault_response_table.rb +77 -0
  226. data/lib/roby/coordination/models/root.rb +22 -0
  227. data/lib/roby/coordination/models/script.rb +283 -0
  228. data/lib/roby/coordination/models/task.rb +184 -0
  229. data/lib/roby/coordination/models/task_from_action.rb +50 -0
  230. data/lib/roby/coordination/models/task_from_as_plan.rb +33 -0
  231. data/lib/roby/coordination/models/task_from_instanciation_object.rb +31 -0
  232. data/lib/roby/coordination/models/task_from_variable.rb +27 -0
  233. data/lib/roby/coordination/models/task_with_dependencies.rb +48 -0
  234. data/lib/roby/coordination/models/variable.rb +32 -0
  235. data/lib/roby/coordination/script.rb +200 -0
  236. data/lib/roby/coordination/script_instruction.rb +12 -0
  237. data/lib/roby/coordination/task.rb +45 -0
  238. data/lib/roby/coordination/task_base.rb +69 -0
  239. data/lib/roby/coordination/task_script.rb +293 -0
  240. data/lib/roby/coordination/task_state_machine.rb +308 -0
  241. data/lib/roby/decision_control.rb +33 -21
  242. data/lib/roby/distributed_object.rb +76 -0
  243. data/lib/roby/droby.rb +17 -0
  244. data/lib/roby/droby/droby_id.rb +6 -0
  245. data/lib/roby/droby/enable.rb +153 -0
  246. data/lib/roby/droby/event_logger.rb +189 -0
  247. data/lib/roby/droby/event_logging.rb +57 -0
  248. data/lib/roby/droby/exceptions.rb +14 -0
  249. data/lib/roby/droby/identifiable.rb +22 -0
  250. data/lib/roby/droby/logfile.rb +141 -0
  251. data/lib/roby/droby/logfile/client.rb +176 -0
  252. data/lib/roby/droby/logfile/file_format.md +97 -0
  253. data/lib/roby/droby/logfile/index.rb +117 -0
  254. data/lib/roby/droby/logfile/reader.rb +139 -0
  255. data/lib/roby/droby/logfile/server.rb +199 -0
  256. data/lib/roby/droby/logfile/writer.rb +114 -0
  257. data/lib/roby/droby/marshal.rb +264 -0
  258. data/lib/roby/droby/marshallable.rb +12 -0
  259. data/lib/roby/droby/null_event_logger.rb +25 -0
  260. data/lib/roby/droby/object_manager.rb +205 -0
  261. data/lib/roby/droby/peer_id.rb +6 -0
  262. data/lib/roby/droby/plan_rebuilder.rb +373 -0
  263. data/lib/roby/droby/rebuilt_plan.rb +160 -0
  264. data/lib/roby/droby/remote_droby_id.rb +6 -0
  265. data/lib/roby/droby/timepoints.rb +205 -0
  266. data/lib/roby/droby/timepoints_ctf.metadata.erb +101 -0
  267. data/lib/roby/droby/timepoints_ctf.rb +125 -0
  268. data/lib/roby/droby/v5.rb +14 -0
  269. data/lib/roby/droby/v5/builtin.rb +120 -0
  270. data/lib/roby/droby/v5/droby_class.rb +45 -0
  271. data/lib/roby/droby/v5/droby_constant.rb +81 -0
  272. data/lib/roby/droby/v5/droby_dump.rb +1026 -0
  273. data/lib/roby/droby/v5/droby_id.rb +44 -0
  274. data/lib/roby/droby/v5/droby_model.rb +82 -0
  275. data/lib/roby/droby/v5/peer_id.rb +10 -0
  276. data/lib/roby/droby/v5/remote_droby_id.rb +42 -0
  277. data/lib/roby/event.rb +79 -957
  278. data/lib/roby/event_constraints.rb +835 -0
  279. data/lib/roby/event_generator.rb +1047 -0
  280. data/lib/roby/event_structure/causal_link.rb +6 -0
  281. data/lib/roby/event_structure/forwarding.rb +6 -0
  282. data/lib/roby/event_structure/precedence.rb +7 -0
  283. data/lib/roby/event_structure/signal.rb +8 -0
  284. data/lib/roby/event_structure/temporal_constraints.rb +640 -0
  285. data/lib/roby/exceptions.rb +446 -152
  286. data/lib/roby/executable_plan.rb +549 -0
  287. data/lib/roby/execution_engine.rb +1997 -950
  288. data/lib/roby/filter_generator.rb +26 -0
  289. data/lib/roby/gui/chronicle_view.rb +225 -0
  290. data/lib/roby/gui/chronicle_widget.rb +925 -0
  291. data/lib/roby/gui/dot_id.rb +11 -0
  292. data/lib/roby/gui/exception_view.rb +44 -0
  293. data/lib/roby/gui/log_display.rb +273 -0
  294. data/lib/roby/gui/model_views.rb +2 -0
  295. data/lib/roby/gui/model_views/action_interface.rb +53 -0
  296. data/lib/roby/gui/model_views/task.rb +47 -0
  297. data/lib/roby/gui/model_views/task.rhtml +41 -0
  298. data/lib/roby/gui/object_info_view.rb +89 -0
  299. data/lib/roby/gui/plan_dot_layout.rb +427 -0
  300. data/lib/roby/gui/plan_rebuilder_widget.rb +357 -0
  301. data/lib/roby/gui/qt4_toMSecsSinceEpoch.rb +8 -0
  302. data/lib/roby/gui/relations_view.rb +278 -0
  303. data/lib/roby/gui/relations_view/relations.ui +139 -0
  304. data/lib/roby/gui/relations_view/relations_canvas.rb +1088 -0
  305. data/lib/roby/gui/relations_view/relations_config.rb +292 -0
  306. data/lib/roby/gui/relations_view/relations_view.ui +53 -0
  307. data/lib/roby/gui/scheduler_view.css +24 -0
  308. data/lib/roby/gui/scheduler_view.rb +46 -0
  309. data/lib/roby/gui/scheduler_view.rhtml +53 -0
  310. data/lib/roby/gui/stepping.rb +93 -0
  311. data/lib/roby/gui/stepping.ui +181 -0
  312. data/lib/roby/gui/styles.rb +81 -0
  313. data/lib/roby/gui/task_display_configuration.rb +42 -0
  314. data/lib/roby/gui/task_state_at.rb +38 -0
  315. data/lib/roby/hooks.rb +26 -0
  316. data/lib/roby/interface.rb +136 -469
  317. data/lib/roby/interface/async.rb +20 -0
  318. data/lib/roby/interface/async/action_monitor.rb +188 -0
  319. data/lib/roby/interface/async/interface.rb +498 -0
  320. data/lib/roby/interface/async/job_monitor.rb +213 -0
  321. data/lib/roby/interface/async/log.rb +238 -0
  322. data/lib/roby/interface/async/new_job_listener.rb +79 -0
  323. data/lib/roby/interface/async/ui_connector.rb +183 -0
  324. data/lib/roby/interface/client.rb +553 -0
  325. data/lib/roby/interface/command.rb +24 -0
  326. data/lib/roby/interface/command_argument.rb +16 -0
  327. data/lib/roby/interface/command_library.rb +92 -0
  328. data/lib/roby/interface/droby_channel.rb +174 -0
  329. data/lib/roby/interface/exceptions.rb +22 -0
  330. data/lib/roby/interface/interface.rb +655 -0
  331. data/lib/roby/interface/job.rb +47 -0
  332. data/lib/roby/interface/rest.rb +10 -0
  333. data/lib/roby/interface/rest/api.rb +29 -0
  334. data/lib/roby/interface/rest/helpers.rb +24 -0
  335. data/lib/roby/interface/rest/server.rb +212 -0
  336. data/lib/roby/interface/server.rb +154 -0
  337. data/lib/roby/interface/shell_client.rb +468 -0
  338. data/lib/roby/interface/shell_subcommand.rb +24 -0
  339. data/lib/roby/interface/subcommand_client.rb +35 -0
  340. data/lib/roby/interface/tcp.rb +168 -0
  341. data/lib/roby/models/arguments.rb +112 -0
  342. data/lib/roby/models/plan_object.rb +83 -0
  343. data/lib/roby/models/task.rb +835 -0
  344. data/lib/roby/models/task_event.rb +62 -0
  345. data/lib/roby/models/task_service.rb +78 -0
  346. data/lib/roby/or_generator.rb +88 -0
  347. data/lib/roby/plan.rb +1751 -864
  348. data/lib/roby/plan_object.rb +611 -0
  349. data/lib/roby/plan_service.rb +200 -0
  350. data/lib/roby/promise.rb +332 -0
  351. data/lib/roby/queries.rb +23 -0
  352. data/lib/roby/queries/and_matcher.rb +32 -0
  353. data/lib/roby/queries/any.rb +27 -0
  354. data/lib/roby/queries/code_error_matcher.rb +58 -0
  355. data/lib/roby/queries/event_generator_matcher.rb +9 -0
  356. data/lib/roby/queries/execution_exception_matcher.rb +165 -0
  357. data/lib/roby/queries/index.rb +165 -0
  358. data/lib/roby/queries/localized_error_matcher.rb +149 -0
  359. data/lib/roby/queries/matcher_base.rb +107 -0
  360. data/lib/roby/queries/none.rb +27 -0
  361. data/lib/roby/queries/not_matcher.rb +30 -0
  362. data/lib/roby/queries/op_matcher.rb +8 -0
  363. data/lib/roby/queries/or_matcher.rb +30 -0
  364. data/lib/roby/queries/plan_object_matcher.rb +363 -0
  365. data/lib/roby/queries/query.rb +188 -0
  366. data/lib/roby/queries/task_event_generator_matcher.rb +86 -0
  367. data/lib/roby/queries/task_matcher.rb +344 -0
  368. data/lib/roby/relations.rb +42 -678
  369. data/lib/roby/relations/bidirectional_directed_adjacency_graph.rb +492 -0
  370. data/lib/roby/relations/directed_relation_support.rb +268 -0
  371. data/lib/roby/relations/event_relation_graph.rb +19 -0
  372. data/lib/roby/relations/fork_merge_visitor.rb +154 -0
  373. data/lib/roby/relations/graph.rb +533 -0
  374. data/lib/roby/relations/models/directed_relation_support.rb +11 -0
  375. data/lib/roby/relations/models/graph.rb +75 -0
  376. data/lib/roby/relations/models/task_relation_graph.rb +18 -0
  377. data/lib/roby/relations/space.rb +380 -0
  378. data/lib/roby/relations/task_relation_graph.rb +20 -0
  379. data/lib/roby/robot.rb +85 -38
  380. data/lib/roby/schedulers/basic.rb +155 -25
  381. data/lib/roby/schedulers/null.rb +20 -0
  382. data/lib/roby/schedulers/reporting.rb +31 -0
  383. data/lib/roby/schedulers/state.rb +129 -0
  384. data/lib/roby/schedulers/temporal.rb +91 -0
  385. data/lib/roby/singletons.rb +87 -0
  386. data/lib/roby/standalone.rb +4 -2
  387. data/lib/roby/standard_errors.rb +405 -82
  388. data/lib/roby/state.rb +6 -3
  389. data/lib/roby/state/conf_model.rb +5 -0
  390. data/lib/roby/state/events.rb +181 -95
  391. data/lib/roby/state/goal_model.rb +77 -0
  392. data/lib/roby/state/open_struct.rb +591 -0
  393. data/lib/roby/state/open_struct_model.rb +68 -0
  394. data/lib/roby/state/pos.rb +45 -45
  395. data/lib/roby/state/shapes.rb +11 -11
  396. data/lib/roby/state/state_model.rb +303 -0
  397. data/lib/roby/state/task.rb +43 -0
  398. data/lib/roby/support.rb +88 -148
  399. data/lib/roby/task.rb +1361 -1750
  400. data/lib/roby/task_arguments.rb +428 -0
  401. data/lib/roby/task_event.rb +127 -0
  402. data/lib/roby/task_event_generator.rb +337 -0
  403. data/lib/roby/task_service.rb +6 -0
  404. data/lib/roby/task_structure/conflicts.rb +104 -0
  405. data/lib/roby/task_structure/dependency.rb +932 -0
  406. data/lib/roby/task_structure/error_handling.rb +118 -0
  407. data/lib/roby/task_structure/executed_by.rb +234 -0
  408. data/lib/roby/task_structure/planned_by.rb +90 -0
  409. data/lib/roby/tasks/aggregator.rb +37 -0
  410. data/lib/roby/tasks/external_process.rb +275 -0
  411. data/lib/roby/tasks/group.rb +27 -0
  412. data/lib/roby/tasks/null.rb +19 -0
  413. data/lib/roby/tasks/parallel.rb +43 -0
  414. data/lib/roby/tasks/sequence.rb +88 -0
  415. data/lib/roby/tasks/simple.rb +21 -0
  416. data/lib/roby/{thread_task.rb → tasks/thread.rb} +50 -24
  417. data/lib/roby/tasks/timeout.rb +17 -0
  418. data/lib/roby/tasks/virtual.rb +55 -0
  419. data/lib/roby/template_plan.rb +7 -0
  420. data/lib/roby/test/aruba_minitest.rb +74 -0
  421. data/lib/roby/test/assertion.rb +16 -0
  422. data/lib/roby/test/assertions.rb +490 -0
  423. data/lib/roby/test/common.rb +368 -591
  424. data/lib/roby/test/dsl.rb +149 -0
  425. data/lib/roby/test/error.rb +18 -0
  426. data/lib/roby/test/event_reporter.rb +83 -0
  427. data/lib/roby/test/execution_expectations.rb +1134 -0
  428. data/lib/roby/test/expect_execution.rb +151 -0
  429. data/lib/roby/test/minitest_helpers.rb +166 -0
  430. data/lib/roby/test/roby_app_helpers.rb +200 -0
  431. data/lib/roby/test/run_planners.rb +155 -0
  432. data/lib/roby/test/self.rb +112 -0
  433. data/lib/roby/test/spec.rb +198 -0
  434. data/lib/roby/test/tasks/empty_task.rb +4 -4
  435. data/lib/roby/test/tasks/goto.rb +28 -27
  436. data/lib/roby/test/teardown_plans.rb +100 -0
  437. data/lib/roby/test/testcase.rb +239 -307
  438. data/lib/roby/test/tools.rb +159 -155
  439. data/lib/roby/test/validate_state_machine.rb +75 -0
  440. data/lib/roby/transaction.rb +1125 -0
  441. data/lib/roby/transaction/event_generator_proxy.rb +63 -0
  442. data/lib/roby/transaction/plan_object_proxy.rb +99 -0
  443. data/lib/roby/transaction/plan_service_proxy.rb +43 -0
  444. data/lib/roby/transaction/proxying.rb +120 -0
  445. data/lib/roby/transaction/task_event_generator_proxy.rb +19 -0
  446. data/lib/roby/transaction/task_proxy.rb +135 -0
  447. data/lib/roby/until_generator.rb +30 -0
  448. data/lib/roby/version.rb +5 -0
  449. data/lib/roby/yard.rb +169 -0
  450. data/lib/yard-roby.rb +1 -0
  451. data/manifest.xml +32 -6
  452. data/roby.gemspec +59 -0
  453. metadata +788 -587
  454. data/Manifest.txt +0 -321
  455. data/NOTES +0 -4
  456. data/README.txt +0 -166
  457. data/TODO.txt +0 -146
  458. data/app/README.txt +0 -24
  459. data/app/Rakefile +0 -8
  460. data/app/config/ROBOT.rb +0 -5
  461. data/app/config/init.rb +0 -33
  462. data/app/config/roby.yml +0 -3
  463. data/app/controllers/ROBOT.rb +0 -2
  464. data/app/planners/ROBOT/main.rb +0 -6
  465. data/app/planners/main.rb +0 -5
  466. data/app/scripts/distributed +0 -3
  467. data/app/scripts/generate/bookmarks +0 -3
  468. data/app/scripts/replay +0 -3
  469. data/app/scripts/results +0 -3
  470. data/app/scripts/run +0 -3
  471. data/app/scripts/server +0 -3
  472. data/app/scripts/shell +0 -3
  473. data/app/scripts/test +0 -3
  474. data/app/tasks/.gitattributes +0 -0
  475. data/app/tasks/ROBOT/.gitattributes +0 -0
  476. data/bin/roby-shell +0 -25
  477. data/doc/guide/src/basics/app.page +0 -139
  478. data/doc/guide/src/basics/index.page +0 -11
  479. data/doc/guide/src/basics/log_replay/goForward_1.png +0 -0
  480. data/doc/guide/src/basics/log_replay/goForward_2.png +0 -0
  481. data/doc/guide/src/basics/log_replay/goForward_3.png +0 -0
  482. data/doc/guide/src/basics/log_replay/goForward_5.png +0 -0
  483. data/doc/guide/src/basics/log_replay/plan_repair_4.png +0 -0
  484. data/doc/guide/src/basics/log_replay/roby_log_main_window.png +0 -0
  485. data/doc/guide/src/basics/relations_display.page +0 -203
  486. data/doc/guide/src/basics/shell.page +0 -102
  487. data/doc/guide/src/default.css +0 -319
  488. data/doc/guide/src/introduction/index.page +0 -29
  489. data/doc/guide/src/introduction/publications.page +0 -14
  490. data/doc/guide/src/relations/dependency.page +0 -89
  491. data/doc/guide/src/relations/index.page +0 -12
  492. data/ext/droby/dump.cc +0 -175
  493. data/ext/droby/extconf.rb +0 -3
  494. data/ext/graph/algorithm.cc +0 -746
  495. data/ext/graph/extconf.rb +0 -7
  496. data/ext/graph/graph.cc +0 -575
  497. data/ext/graph/graph.hh +0 -183
  498. data/ext/graph/iterator_sequence.hh +0 -102
  499. data/ext/graph/undirected_dfs.hh +0 -226
  500. data/ext/graph/undirected_graph.hh +0 -421
  501. data/lib/roby/app/scripts/generate/bookmarks.rb +0 -162
  502. data/lib/roby/app/scripts/replay.rb +0 -31
  503. data/lib/roby/app/scripts/server.rb +0 -18
  504. data/lib/roby/basic_object.rb +0 -151
  505. data/lib/roby/config.rb +0 -14
  506. data/lib/roby/distributed.rb +0 -36
  507. data/lib/roby/distributed/base.rb +0 -448
  508. data/lib/roby/distributed/communication.rb +0 -875
  509. data/lib/roby/distributed/connection_space.rb +0 -616
  510. data/lib/roby/distributed/distributed_object.rb +0 -206
  511. data/lib/roby/distributed/drb.rb +0 -62
  512. data/lib/roby/distributed/notifications.rb +0 -531
  513. data/lib/roby/distributed/peer.rb +0 -555
  514. data/lib/roby/distributed/protocol.rb +0 -529
  515. data/lib/roby/distributed/proxy.rb +0 -343
  516. data/lib/roby/distributed/subscription.rb +0 -311
  517. data/lib/roby/distributed/transaction.rb +0 -498
  518. data/lib/roby/external_process_task.rb +0 -225
  519. data/lib/roby/graph.rb +0 -160
  520. data/lib/roby/log.rb +0 -3
  521. data/lib/roby/log/chronicle.rb +0 -303
  522. data/lib/roby/log/console.rb +0 -74
  523. data/lib/roby/log/data_stream.rb +0 -275
  524. data/lib/roby/log/dot.rb +0 -279
  525. data/lib/roby/log/event_stream.rb +0 -161
  526. data/lib/roby/log/file.rb +0 -396
  527. data/lib/roby/log/gui/basic_display.ui +0 -83
  528. data/lib/roby/log/gui/basic_display_ui.rb +0 -89
  529. data/lib/roby/log/gui/chronicle.rb +0 -26
  530. data/lib/roby/log/gui/chronicle_view.rb +0 -40
  531. data/lib/roby/log/gui/chronicle_view.ui +0 -70
  532. data/lib/roby/log/gui/chronicle_view_ui.rb +0 -90
  533. data/lib/roby/log/gui/data_displays.rb +0 -171
  534. data/lib/roby/log/gui/data_displays.ui +0 -155
  535. data/lib/roby/log/gui/data_displays_ui.rb +0 -146
  536. data/lib/roby/log/gui/notifications.rb +0 -26
  537. data/lib/roby/log/gui/relations.rb +0 -269
  538. data/lib/roby/log/gui/relations.ui +0 -123
  539. data/lib/roby/log/gui/relations_ui.rb +0 -120
  540. data/lib/roby/log/gui/relations_view.rb +0 -185
  541. data/lib/roby/log/gui/relations_view.ui +0 -149
  542. data/lib/roby/log/gui/relations_view_ui.rb +0 -144
  543. data/lib/roby/log/gui/replay.rb +0 -366
  544. data/lib/roby/log/gui/replay_controls.rb +0 -206
  545. data/lib/roby/log/gui/replay_controls.ui +0 -282
  546. data/lib/roby/log/gui/replay_controls_ui.rb +0 -249
  547. data/lib/roby/log/gui/runtime.rb +0 -130
  548. data/lib/roby/log/hooks.rb +0 -186
  549. data/lib/roby/log/logger.rb +0 -203
  550. data/lib/roby/log/notifications.rb +0 -244
  551. data/lib/roby/log/plan_rebuilder.rb +0 -468
  552. data/lib/roby/log/relations.rb +0 -1084
  553. data/lib/roby/log/server.rb +0 -547
  554. data/lib/roby/log/sqlite.rb +0 -47
  555. data/lib/roby/log/timings.rb +0 -233
  556. data/lib/roby/plan-object.rb +0 -371
  557. data/lib/roby/planning.rb +0 -13
  558. data/lib/roby/planning/loops.rb +0 -309
  559. data/lib/roby/planning/model.rb +0 -1012
  560. data/lib/roby/planning/task.rb +0 -180
  561. data/lib/roby/query.rb +0 -655
  562. data/lib/roby/relations/conflicts.rb +0 -67
  563. data/lib/roby/relations/dependency.rb +0 -358
  564. data/lib/roby/relations/ensured.rb +0 -19
  565. data/lib/roby/relations/error_handling.rb +0 -22
  566. data/lib/roby/relations/events.rb +0 -7
  567. data/lib/roby/relations/executed_by.rb +0 -208
  568. data/lib/roby/relations/influence.rb +0 -10
  569. data/lib/roby/relations/planned_by.rb +0 -63
  570. data/lib/roby/state/information.rb +0 -55
  571. data/lib/roby/state/state.rb +0 -367
  572. data/lib/roby/task-operations.rb +0 -186
  573. data/lib/roby/task_index.rb +0 -80
  574. data/lib/roby/test/distributed.rb +0 -230
  575. data/lib/roby/test/tasks/simple_task.rb +0 -23
  576. data/lib/roby/transactions.rb +0 -507
  577. data/lib/roby/transactions/proxy.rb +0 -325
  578. data/plugins/fault_injection/History.txt +0 -4
  579. data/plugins/fault_injection/README.txt +0 -34
  580. data/plugins/fault_injection/Rakefile +0 -12
  581. data/plugins/fault_injection/TODO.txt +0 -0
  582. data/plugins/fault_injection/app.rb +0 -52
  583. data/plugins/fault_injection/fault_injection.rb +0 -89
  584. data/plugins/fault_injection/test/test_fault_injection.rb +0 -78
  585. data/plugins/subsystems/README.txt +0 -37
  586. data/plugins/subsystems/Rakefile +0 -13
  587. data/plugins/subsystems/app.rb +0 -182
  588. data/plugins/subsystems/test/app/README +0 -24
  589. data/plugins/subsystems/test/app/Rakefile +0 -8
  590. data/plugins/subsystems/test/app/config/app.yml +0 -71
  591. data/plugins/subsystems/test/app/config/init.rb +0 -12
  592. data/plugins/subsystems/test/app/config/roby.yml +0 -3
  593. data/plugins/subsystems/test/app/planners/main.rb +0 -20
  594. data/plugins/subsystems/test/app/scripts/distributed +0 -3
  595. data/plugins/subsystems/test/app/scripts/replay +0 -3
  596. data/plugins/subsystems/test/app/scripts/results +0 -3
  597. data/plugins/subsystems/test/app/scripts/run +0 -3
  598. data/plugins/subsystems/test/app/scripts/server +0 -3
  599. data/plugins/subsystems/test/app/scripts/shell +0 -3
  600. data/plugins/subsystems/test/app/scripts/test +0 -3
  601. data/plugins/subsystems/test/app/tasks/services.rb +0 -15
  602. data/plugins/subsystems/test/test_subsystems.rb +0 -78
  603. data/test/distributed/test_communication.rb +0 -195
  604. data/test/distributed/test_connection.rb +0 -284
  605. data/test/distributed/test_execution.rb +0 -378
  606. data/test/distributed/test_mixed_plan.rb +0 -341
  607. data/test/distributed/test_plan_notifications.rb +0 -238
  608. data/test/distributed/test_protocol.rb +0 -525
  609. data/test/distributed/test_query.rb +0 -106
  610. data/test/distributed/test_remote_plan.rb +0 -491
  611. data/test/distributed/test_transaction.rb +0 -466
  612. data/test/mockups/external_process +0 -28
  613. data/test/mockups/tasks.rb +0 -27
  614. data/test/planning/test_loops.rb +0 -432
  615. data/test/planning/test_model.rb +0 -427
  616. data/test/planning/test_task.rb +0 -126
  617. data/test/relations/test_conflicts.rb +0 -42
  618. data/test/relations/test_dependency.rb +0 -324
  619. data/test/relations/test_ensured.rb +0 -38
  620. data/test/relations/test_executed_by.rb +0 -224
  621. data/test/relations/test_planned_by.rb +0 -56
  622. data/test/suite_core.rb +0 -29
  623. data/test/suite_distributed.rb +0 -10
  624. data/test/suite_planning.rb +0 -4
  625. data/test/suite_relations.rb +0 -8
  626. data/test/tasks/test_external_process.rb +0 -126
  627. data/test/tasks/test_thread_task.rb +0 -70
  628. data/test/test_bgl.rb +0 -528
  629. data/test/test_event.rb +0 -969
  630. data/test/test_exceptions.rb +0 -591
  631. data/test/test_execution_engine.rb +0 -987
  632. data/test/test_gui.rb +0 -20
  633. data/test/test_interface.rb +0 -43
  634. data/test/test_log.rb +0 -125
  635. data/test/test_log_server.rb +0 -133
  636. data/test/test_plan.rb +0 -418
  637. data/test/test_query.rb +0 -424
  638. data/test/test_relations.rb +0 -260
  639. data/test/test_state.rb +0 -432
  640. data/test/test_support.rb +0 -16
  641. data/test/test_task.rb +0 -1181
  642. data/test/test_testcase.rb +0 -138
  643. data/test/test_transactions.rb +0 -610
  644. data/test/test_transactions_proxy.rb +0 -216
@@ -0,0 +1,120 @@
1
+ require 'set'
2
+
3
+ module Roby
4
+ module DRoby
5
+ module V5
6
+ module Builtins
7
+ module ClassDumper
8
+ def droby_dump(peer)
9
+ # Ancestry marshalling stops at the last class that has
10
+ # ClassDumper built-in. This class is expected to be
11
+ # resolvable by the remote object manager
12
+ super_c = superclass
13
+ super_c = if super_c.kind_of?(ClassDumper)
14
+ peer.dump(super_c)
15
+ end
16
+
17
+ DRobyClass.new(
18
+ name,
19
+ peer.known_siblings_for(self),
20
+ super_c)
21
+ end
22
+ end
23
+
24
+ module ExceptionDumper
25
+ def droby_dump(peer, droby_class: DRoby)
26
+ formatted = Roby.format_exception(self)
27
+ droby = droby_class.new(
28
+ peer.dump(self.class),
29
+ formatted,
30
+ message)
31
+ droby.set_backtrace backtrace
32
+ droby
33
+ end
34
+
35
+ class DRoby < Exception
36
+ attr_reader :exception_class
37
+ attr_reader :formatted_message
38
+
39
+ def initialize(exception_class, formatted_message, message = nil)
40
+ @exception_class, @formatted_message =
41
+ exception_class, formatted_message
42
+ super(message)
43
+ end
44
+
45
+ def pretty_print(pp)
46
+ pp.seplist(formatted_message) do |line|
47
+ pp.text line
48
+ end
49
+ end
50
+
51
+ def proxy(peer)
52
+ exception = self.class.new(peer.local_object(exception_class), formatted_message, message)
53
+ exception.set_backtrace backtrace
54
+ exception
55
+ end
56
+
57
+ def kind_of?(obj)
58
+ if exception_class.kind_of?(Class)
59
+ exception_class <= obj
60
+ else
61
+ super
62
+ end
63
+ end
64
+ end
65
+ end
66
+
67
+ module ArrayDumper
68
+ def droby_dump(peer)
69
+ map do |obj|
70
+ peer.dump(obj)
71
+ end
72
+ end
73
+
74
+ def proxy(peer) # :nodoc:
75
+ map do |element|
76
+ peer.local_object(element)
77
+ end
78
+ end
79
+ end
80
+
81
+ module HashDumper
82
+ def droby_dump(peer)
83
+ result = Hash.new
84
+ each do |k, v|
85
+ result[peer.dump(k)] = peer.dump(v)
86
+ end
87
+ result
88
+ end
89
+
90
+ def proxy(peer) # :nodoc:
91
+ result = Hash.new
92
+ each do |k, v|
93
+ result[peer.local_object(k)] = peer.local_object(v)
94
+ end
95
+ result
96
+ end
97
+ end
98
+
99
+ module SetDumper
100
+ def droby_dump(peer)
101
+ result = Set.new
102
+ each do |v|
103
+ result << peer.dump(v)
104
+ end
105
+ result
106
+ end
107
+
108
+ def proxy(peer) # :nodoc:
109
+ result = Set.new
110
+ each do |element|
111
+ result << peer.local_object(element)
112
+ end
113
+ result
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
120
+
@@ -0,0 +1,45 @@
1
+ module Roby
2
+ module DRoby
3
+ module V5
4
+ # Dumps a class and its ancestry
5
+ #
6
+ # Use {ClassDumper} to add the corresponding standard {#droby_dump}
7
+ class DRobyClass
8
+ # The class name
9
+ attr_reader :name
10
+ # The known siblings for this class
11
+ attr_reader :remote_siblings
12
+ # The class superclass
13
+ attr_reader :superclass
14
+
15
+ # Initialize a DRobyModel object with the given set of ancestors
16
+ def initialize(name, remote_siblings, superclass)
17
+ @name = name
18
+ @remote_siblings = remote_siblings
19
+ @superclass = superclass
20
+ end
21
+
22
+ # Returns a local Class object to match this class
23
+ def proxy(peer)
24
+ # We have to manually call find_local_model here as it
25
+ # resolves classes by name as well as by ID
26
+ if m = peer.find_local_model(self)
27
+ return m
28
+ elsif !superclass # this class was supposed to be present
29
+ raise NoLocalObject, "cannot find local class #{name} as expected by the protocol"
30
+ else
31
+ name = self.name
32
+ local_class = Class.new(peer.local_model(superclass))
33
+ if name
34
+ local_class.singleton_class.class_eval do
35
+ define_method(:name) { name }
36
+ end
37
+ end
38
+ peer.register_model(local_class, remote_siblings)
39
+ local_class
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,81 @@
1
+ module Roby
2
+ module DRoby
3
+ module V5
4
+ # Dumps a constant by using its name. On reload, #proxy searches for a
5
+ # constant with the same name, and raises ArgumentError if none exists.
6
+ #
7
+ # @example dump instances of a class that are registered as constants
8
+ # class Klass
9
+ # include DRobyConstant::Dump
10
+ # end
11
+ # # Obj can pass through droby
12
+ # Obj = Klass.new
13
+ #
14
+ # @example dump classes. You usually would prefer using {DRobyModel}
15
+ # # Klass can pass through droby
16
+ # class Klass
17
+ # extend DRobyConstant::Dump
18
+ # end
19
+ class DRobyConstant
20
+ def self.clear_cache
21
+ @@valid_constants.clear
22
+ end
23
+
24
+ @@valid_constants = Hash.new
25
+ def self.valid_constants; @@valid_constants end
26
+ def to_s; "#<dRoby:Constant #{name}>" end
27
+
28
+ # Generic implementation of the constant-dumping method. This is to
29
+ # be included in all kind of classes which should be dumped by their
30
+ # constant name (for intance Relations::Graph).
31
+ module Dump
32
+ class ConstantResolutionFailed < RuntimeError; end
33
+ class MismatchingLocalConstant < ConstantResolutionFailed; end
34
+
35
+ # Returns a DRobyConstant object which references +self+. It
36
+ # checks that +self+ can actually be referenced locally by
37
+ # calling <tt>constant(name)</tt>, or raises ArgumentError if
38
+ # it is not the case.
39
+ def droby_dump(peer)
40
+ if constant = DRobyConstant.valid_constants[self]
41
+ return constant
42
+ elsif !name
43
+ raise ConstantResolutionFailed, "#{self}#name returned nil"
44
+ end
45
+
46
+ name = "::#{self.name}"
47
+
48
+ begin
49
+ local_constant = constant(name)
50
+ rescue Exception => e
51
+ Roby.warn "could not resolve constant name for #{self}"
52
+ Roby.log_exception(e, Roby, :warn)
53
+ raise ConstantResolutionFailed, "cannot resolve constant name for #{self}"
54
+ end
55
+
56
+ if (local_constant == self)
57
+ DRobyConstant.valid_constants[self] = DRobyConstant.new(name, peer.known_siblings_for(self))
58
+ else
59
+ raise MismatchingLocalConstant, "got DRobyConstant whose name '#{name}' resolves to #{local_constant}(#{local_constant.class}), not itself (#{self})"
60
+ end
61
+ end
62
+ end
63
+
64
+ attr_reader :remote_siblings
65
+
66
+ # The constant name
67
+ attr_reader :name
68
+
69
+ def initialize(name, remote_siblings = Hash.new)
70
+ @name = name
71
+ @remote_siblings = remote_siblings
72
+ end
73
+ # Returns the local object which can be referenced by this name, or
74
+ # raises ArgumentError.
75
+ def proxy(peer); constant(name) end
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+
@@ -0,0 +1,1026 @@
1
+ module Roby
2
+ module DRoby
3
+ module V5
4
+ module BidirectionalGraphDumper
5
+ class DRoby
6
+ attr_reader :vertices
7
+ attr_reader :edges
8
+
9
+ def initialize(vertices, edges)
10
+ @vertices = vertices
11
+ @edges = edges
12
+ end
13
+
14
+ def proxy(peer)
15
+ graph = Relations::BidirectionalDirectedAdjacencyGraph.new
16
+ peer.load_groups(vertices) do |vertices|
17
+ vertices.each { |v| graph.add_vertex(v) }
18
+ edges.each_slice(3) do |u, v, info|
19
+ graph.add_edge(
20
+ peer.local_object(u),
21
+ peer.local_object(v),
22
+ peer.local_object(info))
23
+ end
24
+ end
25
+ graph
26
+ end
27
+ end
28
+
29
+ def droby_dump(peer)
30
+ peer.dump_groups(self.vertices) do |vertices|
31
+ edges = Array.new
32
+ each_edge.each do |u, v, info|
33
+ edges << peer.dump(u) << peer.dump(v) << peer.dump(info)
34
+ end
35
+ DRoby.new(vertices, edges)
36
+ end
37
+ end
38
+ end
39
+
40
+ module ModelDumper
41
+ def droby_dump(peer)
42
+ DRobyModel.new(
43
+ name,
44
+ peer.known_siblings_for(self),
45
+ DRobyModel.dump_supermodel(peer, self),
46
+ DRobyModel.dump_provided_models_of(peer, self))
47
+ end
48
+ end
49
+
50
+ module ExceptionBaseDumper
51
+ include Builtins::ExceptionDumper
52
+
53
+ def droby_dump(peer)
54
+ droby = super(peer, droby_class: DRoby)
55
+ droby.original_exceptions.concat(peer.dump(original_exceptions))
56
+ droby
57
+ end
58
+
59
+ class DRoby < Builtins::ExceptionDumper::DRoby
60
+ attr_reader :original_exceptions
61
+
62
+ def initialize(exception_class, formatted_class, message = nil)
63
+ super
64
+ @original_exceptions = Array.new
65
+ end
66
+
67
+ def proxy(peer)
68
+ exception = super
69
+ exception.original_exceptions.
70
+ concat(peer.local_object(self.original_exceptions))
71
+ exception
72
+ end
73
+ end
74
+ end
75
+
76
+ # Exception class used on the unmarshalling of LocalizedError for exception
77
+ # classes that do not have their own marshalling
78
+ class UntypedLocalizedError < LocalizedError
79
+ attr_accessor :formatted_message
80
+ attr_accessor :exception_class
81
+
82
+ def initialize(failure_point, fatal: nil)
83
+ super(failure_point)
84
+ @fatal = fatal
85
+ end
86
+
87
+ def fatal?
88
+ @fatal
89
+ end
90
+
91
+ def pretty_print(pp)
92
+ pp.seplist(formatted_message) do |line|
93
+ pp.text line
94
+ end
95
+ end
96
+
97
+ def kind_of?(obj)
98
+ exception_class <= obj
99
+ end
100
+ end
101
+
102
+ module LocalizedErrorDumper
103
+ # Returns an intermediate representation of +self+ suitable to be sent to
104
+ # the +dest+ peer.
105
+ def droby_dump(peer)
106
+ formatted = Roby.format_exception(self)
107
+ DRoby.new(peer.dump_model(self.class),
108
+ peer.dump(failure_point),
109
+ fatal?,
110
+ message,
111
+ backtrace,
112
+ peer.dump(original_exceptions),
113
+ formatted)
114
+ end
115
+
116
+ # Intermediate representation used to marshal/unmarshal a LocalizedError
117
+ class DRoby
118
+ attr_reader :model, :failure_point, :fatal, :message, :backtrace,
119
+ :original_exceptions, :formatted_message
120
+ def initialize(model, failure_point, fatal, message, backtrace,
121
+ original_exceptions, formatted_message = [])
122
+ @model, @failure_point, @fatal, @message, @backtrace,
123
+ @original_exceptions, @formatted_message =
124
+ model, failure_point, fatal, message, backtrace,
125
+ original_exceptions, formatted_message
126
+ end
127
+
128
+ def proxy(peer)
129
+ failure_point = peer.local_object(self.failure_point)
130
+ error = UntypedLocalizedError.new(failure_point, fatal: fatal)
131
+ error = error.exception(message)
132
+ error.original_exceptions.concat(peer.local_object(original_exceptions))
133
+ error.set_backtrace(backtrace)
134
+ error.exception_class = peer.local_object(model)
135
+ error.formatted_message = formatted_message
136
+ error
137
+ end
138
+ end
139
+ end
140
+
141
+ module PlanningFailedErrorDumper
142
+ def droby_dump(peer)
143
+ DRoby.new(peer.dump(planned_task),
144
+ peer.dump(planning_task),
145
+ peer.dump(failure_reason))
146
+ end
147
+
148
+ class DRoby
149
+ attr_reader :planned_task
150
+ attr_reader :planning_task
151
+ attr_reader :failure_reason
152
+ def initialize(planned_task, planning_task, failure_reason)
153
+ @planned_task = planned_task
154
+ @planning_task = planning_task
155
+ @failure_reason = failure_reason
156
+ end
157
+ def proxy(peer)
158
+ planned_task = peer.local_object(self.planned_task)
159
+ planning_task = peer.local_object(self.planning_task)
160
+ failure_reason = peer.local_object(self.failure_reason)
161
+ PlanningFailedError.new(planned_task, planning_task, failure_reason: failure_reason)
162
+ end
163
+ end
164
+ end
165
+
166
+ module ExecutionExceptionDumper
167
+ def droby_dump(peer)
168
+ DRoby.new(peer.dump(trace),
169
+ peer.dump(exception),
170
+ handled)
171
+ end
172
+
173
+ class DRoby
174
+ attr_reader :trace
175
+ attr_reader :exception
176
+ attr_reader :handled
177
+
178
+ def initialize(trace, exception, handled)
179
+ @trace, @exception, @handled = trace, exception, handled
180
+ end
181
+
182
+ def proxy(peer)
183
+ trace = peer.local_object(self.trace)
184
+ exception = peer.local_object(self.exception)
185
+ result = ExecutionException.new(exception)
186
+ result.trace.replace(trace)
187
+ result.handled = self.handled
188
+ result
189
+ end
190
+ end
191
+ end
192
+
193
+ module Models
194
+ module TaskDumper
195
+ # Used to tag anything that is extended by TaskDumper as
196
+ # "ready to be dumped"
197
+ include ModelDumper
198
+
199
+ def droby_dump(peer)
200
+ arguments = __arguments.each_value.map do |arg|
201
+ if arg.has_default?
202
+ [arg.name, true, peer.dump(arg.default), arg.doc]
203
+ else
204
+ [arg.name, false, nil, arg.doc]
205
+ end
206
+ end
207
+
208
+ DRoby.new(
209
+ name,
210
+ peer.known_siblings_for(self),
211
+ arguments,
212
+ DRobyModel.dump_supermodel(peer, self),
213
+ DRobyModel.dump_provided_models_of(peer, self),
214
+ each_event.map { |_, ev| [ev.symbol, ev.controlable?, ev.terminal?] })
215
+ end
216
+
217
+ class DRoby < DRobyModel
218
+ attr_reader :events
219
+ attr_reader :arguments
220
+
221
+ def initialize(name, remote_siblings, arguments, supermodel, provided_models, events)
222
+ super(name, remote_siblings, supermodel, provided_models)
223
+ @arguments = arguments
224
+ @events = events
225
+ end
226
+
227
+ def unmarshal_dependent_models(peer)
228
+ super
229
+
230
+ @arguments.each do |name, has_default, default, doc|
231
+ if has_default
232
+ peer.local_object(default)
233
+ end
234
+ end
235
+ end
236
+
237
+ def update(peer, local_object, fresh_proxy: false)
238
+ if @argument_set # Backward compatibility
239
+ arguments = @argument_set.map { |name| [name, false, nil, nil] }
240
+ end
241
+
242
+ @arguments.each do |name, has_default, default, doc|
243
+ if !local_object.has_argument?(name)
244
+ if !has_default
245
+ default = Roby::Models::Task::NO_DEFAULT_ARGUMENT
246
+ end
247
+ local_object.argument name, default: peer.local_object(default), doc: doc
248
+ end
249
+ end
250
+ events.each do |name, controlable, terminal|
251
+ if !local_object.has_event?(name)
252
+ local_object.event name, controlable: controlable, terminal: terminal
253
+ end
254
+ end
255
+ end
256
+ end
257
+ end
258
+
259
+ module TaskServiceModelDumper
260
+ include ModelDumper
261
+ end
262
+ end
263
+
264
+ module DistributedObjectDumper
265
+ class DRoby
266
+ # The set of remote siblings for that object, as known by the peer who
267
+ # called #droby_dump. This is used to match object identity among plan
268
+ # managers.
269
+ attr_reader :remote_siblings
270
+ # The set of owners for that object.
271
+ attr_reader :owners
272
+ # Create a DistributedObject::DRoby object with the given information
273
+ def initialize(remote_siblings, owners)
274
+ @remote_siblings, @owners = remote_siblings, owners
275
+ end
276
+
277
+ # Update an existing proxy, using the information stored in this DRoby
278
+ # object.
279
+ def update(peer, proxy, fresh_proxy: false)
280
+ proxy.clear_owners
281
+ owners.each do |m_owner|
282
+ proxy.add_owner(peer.local_object(m_owner))
283
+ end
284
+ end
285
+ end
286
+ end
287
+
288
+ # Base class for all marshalled plan objects.
289
+ module PlanObjectDumper
290
+ class DRoby < DistributedObjectDumper::DRoby
291
+ # The model for this plan object
292
+ attr_reader :model
293
+ # The droby_id of this object's plan
294
+ attr_reader :plan_id
295
+
296
+ # Create a DRoby object with the given information
297
+ #
298
+ # @see DistributedObject::DRoby
299
+ def initialize(remote_siblings, owners, model, plan_id)
300
+ super(remote_siblings, owners)
301
+ @model, @plan_id = model, plan_id
302
+ end
303
+
304
+ def local_plan(peer)
305
+ if plan_id
306
+ peer.local_plan(plan_id)
307
+ else TemplatePlan.new
308
+ end
309
+ end
310
+ end
311
+ end
312
+
313
+ module EventGeneratorDumper
314
+ # Returns an intermediate representation of +self+ suitable to be sent
315
+ # to the +dest+ peer.
316
+ def droby_dump(peer)
317
+ DRoby.new(peer.known_siblings_for(self),
318
+ peer.dump(owners),
319
+ peer.dump(model),
320
+ plan.droby_id,
321
+ controlable?, emitted?)
322
+ end
323
+
324
+ # An intermediate representation of EventGenerator objects suitable to
325
+ # be sent to our peers.
326
+ class DRoby < PlanObjectDumper::DRoby
327
+ # True if the generator is controlable
328
+ attr_reader :controlable
329
+ # True if the generator has already been emitted once at the time
330
+ # EventGenerator#droby_dump has been called.
331
+ attr_reader :emitted
332
+
333
+ # Create a DRoby object with the given information. See also
334
+ # PlanObject::DRoby
335
+ def initialize(remote_siblings, owners, model, plan_id, controlable, emitted)
336
+ super(remote_siblings, owners, model, plan_id)
337
+ @controlable, @emitted = controlable, emitted
338
+ end
339
+
340
+ # Create a new proxy which maps the object of +peer+ represented by
341
+ # this communication intermediate.
342
+ def proxy(peer)
343
+ local_object = peer.local_object(model).new(plan: local_plan(peer))
344
+ if controlable
345
+ local_object.command = lambda { }
346
+ end
347
+ local_object
348
+ end
349
+
350
+ # Updates an already existing proxy using the information contained
351
+ # in this object.
352
+ def update(peer, proxy, fresh_proxy: false)
353
+ super
354
+
355
+ if emitted && !proxy.emitted?
356
+ proxy.instance_eval { @emitted = true }
357
+ end
358
+ end
359
+ end
360
+ end
361
+
362
+ module EventDumper
363
+ # Returns an intermediate representation of +self+ suitable to be sent
364
+ # to the +dest+ peer.
365
+ def droby_dump(dest)
366
+ DRoby.new(propagation_id, time, dest.dump(generator), dest.dump(context))
367
+ end
368
+
369
+ class DRoby
370
+ attr_reader :propagation_id
371
+ attr_reader :time
372
+ attr_reader :generator
373
+ attr_reader :context
374
+
375
+ def initialize(propagation_id, time, generator, context)
376
+ @propagation_id, @time, @generator, @context = propagation_id, time, generator, context
377
+ end
378
+
379
+ def proxy(peer)
380
+ generator = peer.local_object(self.generator)
381
+ context = peer.local_object(self.context)
382
+ generator.new(context, propagation_id, time)
383
+ end
384
+ end
385
+ end
386
+
387
+ module TaskEventGeneratorDumper
388
+ # Returns an intermediate representation of +self+ suitable to be sent
389
+ # to the +dest+ peer.
390
+ def droby_dump(peer)
391
+ DRoby.new(peer.known_siblings_for(self), emitted?, peer.dump(task), symbol)
392
+ end
393
+
394
+ # An intermediate representation of TaskEventGenerator objects suitable
395
+ # to be sent to our peers.
396
+ class DRoby
397
+ # This event's siblings
398
+ attr_reader :remote_siblings
399
+ # True if the generator has already emitted once at the time
400
+ # TaskEventGenerator#droby_dump has been called.
401
+ attr_reader :emitted
402
+ # An object representing the task of this generator on our remote
403
+ # peer.
404
+ attr_reader :task
405
+ # The event name
406
+ attr_reader :symbol
407
+
408
+ # Create a new DRoby object with the given information
409
+ def initialize(remote_siblings, emitted, task, symbol)
410
+ @remote_siblings = remote_siblings
411
+ @emitted = emitted
412
+ @task = task
413
+ @symbol = symbol
414
+ end
415
+
416
+ def to_s # :nodoc:
417
+ "#<dRoby:#{task}/#{symbol}>"
418
+ end
419
+
420
+ # Create a new proxy which maps the object of +peer+ represented by
421
+ # this communication intermediate.
422
+ def proxy(peer)
423
+ task = peer.local_object(self.task)
424
+ event = task.event(symbol)
425
+ if emitted && !event.emitted?
426
+ event.instance_eval { @emitted = true }
427
+ end
428
+ event
429
+ end
430
+ end
431
+ end
432
+
433
+ module DefaultArgumentDumper
434
+ def droby_dump(peer)
435
+ DRoby.new(peer.dump(value))
436
+ end
437
+
438
+ class DRoby
439
+ def initialize(value)
440
+ @value = value
441
+ end
442
+
443
+ def proxy(peer)
444
+ DefaultArgument.new(peer.local_object(@value))
445
+ end
446
+ end
447
+ end
448
+
449
+ module DelayedArgumentFromObjectDumper
450
+ def droby_dump(peer)
451
+ DRoby.new(
452
+ peer.dump(self.class),
453
+ peer.dump(@object),
454
+ @methods,
455
+ @weak)
456
+ end
457
+
458
+ class DRoby
459
+ def initialize(klass, object, methods, weak)
460
+ @klass, @object, @methods, @weak = klass, object, methods, weak
461
+ end
462
+ def proxy(peer)
463
+ base = peer.local_object(@klass).new(peer.local_object(@object), @weak)
464
+ @methods.inject(base) do |delayed_arg, m|
465
+ delayed_arg.send(m)
466
+ end
467
+ end
468
+ end
469
+ end
470
+
471
+ module TaskArgumentsDumper
472
+ class DRoby
473
+ attr_reader :values
474
+ def initialize(values)
475
+ @values = values
476
+ end
477
+
478
+ def proxy(peer)
479
+ obj = TaskArguments.new(nil)
480
+ obj.values.merge!(peer.local_object(values))
481
+ obj
482
+ end
483
+ end
484
+
485
+ def droby_dump(peer)
486
+ DRoby.new(peer.dump(values))
487
+ end
488
+ end
489
+
490
+ module TaskDumper
491
+ # Returns an intermediate representation of +self+ suitable to be sent
492
+ # to the +dest+ peer.
493
+ def droby_dump(peer)
494
+ arguments = Hash.new
495
+ model.arguments.each do |arg_name|
496
+ if self.arguments.assigned?(arg_name)
497
+ arguments[arg_name] = self.arguments.raw_get(arg_name)
498
+ end
499
+ end
500
+
501
+ d_model = peer.dump_model(model)
502
+ d_arguments = peer.dump(arguments)
503
+ d_data = peer.dump(data)
504
+
505
+ DRoby.new(peer.known_siblings_for(self),
506
+ peer.dump(owners),
507
+ d_model,
508
+ plan.droby_id,
509
+ d_arguments,
510
+ d_data,
511
+ mission: mission?, started: started?,
512
+ finished: finished?, success: success?)
513
+ end
514
+
515
+ # An intermediate representation of Task objects suitable
516
+ # to be sent to our peers.
517
+ class DRoby < PlanObjectDumper::DRoby
518
+ # The set of dRoby-formatted arguments
519
+ attr_reader :arguments
520
+ # The task's internal data
521
+ attr_reader :data
522
+ # A set of boolean flags which describe the task's status. It is a
523
+ # symbol => bool flag where the following parameters are save:
524
+ # started:: if the task has started
525
+ # finished:: if the task has finished
526
+ # success:: if the task has finished with success
527
+ # mission:: if the task is a mission in its plan
528
+ attr_reader :flags
529
+
530
+ # Create a new DRoby object with the given information
531
+ def initialize(remote_siblings, owners, model, plan_id, arguments, data, **flags)
532
+ super(remote_siblings, owners, model, plan_id)
533
+ @arguments, @data, @flags = arguments, data, flags
534
+ end
535
+
536
+ # Create a new proxy which maps the object of +peer+ represented by
537
+ # this communication intermediate.
538
+ def proxy(peer)
539
+ model = peer.local_object(self.model)
540
+ arguments = peer.local_object(self.arguments)
541
+ model.new(plan: local_plan(peer), **arguments)
542
+ end
543
+
544
+ # Updates an already existing proxy using the information contained
545
+ # in this object.
546
+ def update(peer, task, fresh_proxy: false)
547
+ super
548
+
549
+ task.started = flags[:started]
550
+ task.finished = flags[:finished]
551
+ task.success = flags[:success]
552
+
553
+ if task.mission? != flags[:mission]
554
+ if flags[:mission]
555
+ task.plan.add_mission_task(task)
556
+ else
557
+ task.plan.unmark_mission_task(task)
558
+ end
559
+ end
560
+
561
+ if !fresh_proxy
562
+ task.arguments.merge!(peer.local_object(arguments))
563
+ end
564
+ task.instance_variable_set("@data", peer.local_object(data))
565
+ end
566
+ end
567
+ end
568
+
569
+ module PlanDumper
570
+ def droby_dump(peer)
571
+ peer.dump_groups(tasks, task_events, free_events) do |tasks, task_events, free_events|
572
+ mission_tasks = peer.dump(self.mission_tasks)
573
+ permanent_tasks = peer.dump(self.permanent_tasks)
574
+ permanent_events = peer.dump(self.permanent_events)
575
+ task_relation_graphs = each_task_relation_graph.map do |g|
576
+ edges = peer.dump(g.each_edge.flat_map { |*args| args })
577
+ [peer.dump_model(g.class), edges]
578
+ end
579
+ event_relation_graphs = each_event_relation_graph.map do |g|
580
+ edges = peer.dump(g.each_edge.flat_map { |*args| args })
581
+ [peer.dump_model(g.class), edges]
582
+ end
583
+
584
+ DRoby.new(
585
+ DRobyConstant.new(self.class), droby_id,
586
+ tasks, task_events, free_events,
587
+ mission_tasks, permanent_tasks, permanent_events,
588
+ task_relation_graphs, event_relation_graphs)
589
+ end
590
+ end
591
+
592
+ class DRoby
593
+ attr_reader :plan_class
594
+ attr_reader :droby_id
595
+ attr_reader :groups
596
+ attr_reader :tasks
597
+ attr_reader :task_events
598
+ attr_reader :free_events
599
+ attr_reader :mission_tasks
600
+ attr_reader :permanent_tasks
601
+ attr_reader :permanent_events
602
+ attr_reader :task_relation_graphs
603
+ attr_reader :event_relation_graphs
604
+
605
+ def initialize(plan_class, droby_id,
606
+ tasks, task_events, free_events,
607
+ mission_tasks, permanent_tasks, permanent_events,
608
+ task_relation_graphs, event_relation_graphs)
609
+ @plan_class = plan_class
610
+ @droby_id = droby_id
611
+ @tasks = tasks
612
+ @task_events = task_events
613
+ @free_events = free_events
614
+ @mission_tasks = mission_tasks
615
+ @permanent_tasks = permanent_tasks
616
+ @permanent_events = permanent_events
617
+ @task_relation_graphs = task_relation_graphs
618
+ @event_relation_graphs = event_relation_graphs
619
+ end
620
+
621
+ def proxy(peer)
622
+ plan = Plan.new
623
+ peer.with_object(droby_id => plan) do
624
+ peer.load_groups(tasks, task_events, free_events) do |tasks, task_events, free_events|
625
+ plan.tasks.merge(tasks)
626
+ plan.task_events.merge(task_events)
627
+ plan.free_events.merge(free_events)
628
+
629
+ plan.mission_tasks.replace(peer.local_object(mission_tasks))
630
+ plan.permanent_tasks.replace(peer.local_object(permanent_tasks))
631
+ plan.permanent_events.replace(peer.local_object(permanent_events))
632
+
633
+ task_relation_graphs.each do |rel_id, edges|
634
+ rel = peer.local_object(rel_id)
635
+ g = plan.task_relation_graph_for(rel)
636
+ peer.local_object(edges).each_slice(3) do |from, to, info|
637
+ g.add_edge(from, to, info)
638
+ end
639
+ end
640
+ event_relation_graphs.each do |rel_id, edges|
641
+ rel = peer.local_object(rel_id)
642
+ g = plan.event_relation_graph_for(rel)
643
+ peer.local_object(edges).each_slice(3) do |from, to, info|
644
+ g.add_edge(from, to, info)
645
+ end
646
+ end
647
+ end
648
+ end
649
+ plan
650
+ end
651
+ end
652
+ end
653
+
654
+ module Actions
655
+ module ActionDumper
656
+ def droby_dump(peer)
657
+ result = dup
658
+ result.droby_dump!(peer)
659
+ result
660
+ end
661
+
662
+ def droby_dump!(peer)
663
+ @model = peer.dump(model)
664
+ @arguments = peer.dump(arguments)
665
+ end
666
+
667
+ def proxy(peer)
668
+ result = dup
669
+ result.proxy!(peer)
670
+ result
671
+ end
672
+
673
+ def proxy!(peer)
674
+ @model = peer.local_object(model)
675
+ @arguments = peer.local_object(arguments)
676
+ end
677
+ end
678
+
679
+ module Models
680
+ module ActionDumper
681
+ def droby_dump(dest)
682
+ dump = self.dup
683
+ dump.droby_dump!(dest)
684
+ dump
685
+ end
686
+
687
+ def droby_dump!(peer)
688
+ @returned_type = peer.dump_model(returned_type)
689
+ @arguments = peer.dump(arguments)
690
+ # This is a cached value, invalidate it
691
+ @returned_task_type = nil
692
+ end
693
+
694
+ def proxy(peer)
695
+ result = self.dup
696
+ result.proxy!(peer)
697
+ result
698
+ end
699
+
700
+ def proxy!(peer)
701
+ @returned_type = peer.local_model(returned_type)
702
+ @arguments = peer.local_object(arguments)
703
+ end
704
+ end
705
+
706
+ module InterfaceActionDumper
707
+ def droby_dump!(peer)
708
+ super
709
+ @action_interface_model = peer.dump(action_interface_model)
710
+ end
711
+
712
+ def proxy_from_existing(peer)
713
+ interface_model = peer.local_object(@action_interface_model)
714
+ if action = interface_model.find_action_by_name(name)
715
+ # Load the return type and the default values, we must
716
+ # make sure that any dumped droby-identifiable object
717
+ # is loaded nonetheless
718
+ peer.local_model(returned_type)
719
+ arguments.each { |arg| peer.local_object(arg.default) }
720
+ end
721
+ return action, interface_model
722
+ end
723
+ end
724
+
725
+ module MethodActionDumper
726
+ include InterfaceActionDumper
727
+
728
+ def proxy(peer, resolve_existing: true)
729
+ if resolve_existing
730
+ existing, _interface_model = proxy_from_existing(peer)
731
+ if existing
732
+ return existing
733
+ end
734
+ end
735
+
736
+ interface_model = peer.local_object(@action_interface_model)
737
+ action = super(peer)
738
+ action.action_interface_model = interface_model
739
+ action
740
+ end
741
+ end
742
+
743
+ module CoordinationActionDumper
744
+ include InterfaceActionDumper
745
+
746
+ def proxy(peer)
747
+ existing, interface_model = proxy_from_existing(peer)
748
+ if existing
749
+ return existing
750
+ else
751
+ action = super(peer)
752
+ action.coordination_model =
753
+ interface_model.create_coordination_model(action, Coordination::Actions) {}
754
+ action
755
+ end
756
+ end
757
+
758
+ def droby_dump!(peer)
759
+ super
760
+ @coordination_model = nil
761
+ end
762
+ end
763
+
764
+ class Action
765
+ module ArgumentDumper
766
+ def droby_dump(peer)
767
+ result = self.dup
768
+ result.droby_dump!(peer)
769
+ result
770
+ end
771
+
772
+ def droby_dump!(peer)
773
+ self.default = peer.dump(default)
774
+ end
775
+
776
+ def proxy(peer)
777
+ result = dup
778
+ result.proxy!(peer)
779
+ result
780
+ end
781
+
782
+ def proxy!(peer)
783
+ self.default = peer.local_object(default)
784
+ end
785
+ end
786
+ end
787
+ end
788
+ end
789
+
790
+ module Queries
791
+ module AndMatcherDumper
792
+ # An intermediate representation of AndMatcher objects suitable to
793
+ # be sent to our peers.
794
+ class DRoby
795
+ attr_reader :ops
796
+ def initialize(ops)
797
+ @ops = ops
798
+ end
799
+ def proxy(peer)
800
+ Roby::Queries::AndMatcher.new(*peer.local_object(ops))
801
+ end
802
+ end
803
+
804
+ # Returns an intermediate representation of +self+ suitable to be sent
805
+ # to the +dest+ peer.
806
+ def droby_dump(peer)
807
+ DRoby.new(peer.dump(@ops))
808
+ end
809
+ end
810
+
811
+ module NotMatcherDumper
812
+ # An intermediate representation of NegateTaskMatcher objects suitable to
813
+ # be sent to our peers.
814
+ class DRoby
815
+ def initialize(op)
816
+ @op = op
817
+ end
818
+ def proxy(peer)
819
+ Roby::Queries::NotMatcher.new(peer.local_object(@op))
820
+ end
821
+ end
822
+
823
+ # Returns an intermediate representation of +self+ suitable to be sent
824
+ # to the +dest+ peer.
825
+ def droby_dump(peer)
826
+ DRoby.new(peer.dump(@op))
827
+ end
828
+ end
829
+
830
+ module OrMatcherDumper
831
+ # An intermediate representation of OrMatcher objects suitable to
832
+ # be sent to our peers.
833
+ class DRoby
834
+ attr_reader :ops
835
+ def initialize(ops)
836
+ @ops = ops
837
+ end
838
+ def proxy(peer)
839
+ Roby::Queries::OrMatcher.new(*peer.local_object(ops))
840
+ end
841
+ end
842
+
843
+ # Returns an intermediate representation of +self+ suitable to be sent
844
+ # to the +dest+ peer.
845
+ def droby_dump(dest)
846
+ DRoby.new(dest.dump(@ops))
847
+ end
848
+ end
849
+
850
+ module ExecutionExceptionMatcherDumper
851
+ # An intermediate representation of ExecutionExceptionMatcher objects suitable to
852
+ # be sent to our peers.
853
+ class DRoby
854
+ attr_reader :exception_matcher, :involved_tasks_matchers
855
+ def initialize(exception_matchers, involved_tasks_matchers)
856
+ @exception_matcher = exception_matcher
857
+ @involved_tasks_matchers = involved_tasks_matchers
858
+ end
859
+ def proxy(peer)
860
+ matcher = Roby::Queries::ExecutionExceptionMatcher.new
861
+ matcher.with_exception(peer.local_object(exception_matcher))
862
+ involved_tasks_matchers.each do |m|
863
+ matcher.involving(peer.local_object(m))
864
+ end
865
+ matcher
866
+ end
867
+ end
868
+
869
+ # Returns an intermediate representation of +self+ suitable to be sent
870
+ # to the +dest+ peer.
871
+ def droby_dump(peer)
872
+ DRoby.new(
873
+ peer.dump(exception_matcher),
874
+ peer.dump(involved_tasks_matchers))
875
+ end
876
+ end
877
+
878
+ module LocalizedErrorMatcherDumper
879
+ # An intermediate representation of OrMatcher objects suitable to
880
+ # be sent to our peers.
881
+ class DRoby
882
+ attr_reader :model, :failure_point_matcher
883
+ def initialize(model, failure_point_matcher)
884
+ @model = model
885
+ @failure_point_matcher = failure_point_matcher
886
+ end
887
+ def proxy(peer)
888
+ matcher = Roby::Queries::LocalizedErrorMatcher.new
889
+ matcher.with_model(peer.local_model(model))
890
+ matcher.with_origin(peer.local_object(failure_point_matcher))
891
+ matcher
892
+ end
893
+ end
894
+
895
+ # Returns an intermediate representation of +self+ suitable to be sent
896
+ # to the +dest+ peer.
897
+ def droby_dump(peer)
898
+ DRoby.new(
899
+ peer.dump_model(model),
900
+ peer.dump(failure_point_matcher))
901
+ end
902
+ end
903
+
904
+ module PlanObjectMatcherDumper
905
+ # An intermediate representation of TaskMatcher objects suitable to be
906
+ # sent to our peers.
907
+ class DRoby
908
+ # The exact match class that has been marshalled using this object
909
+ attr_reader :model
910
+ attr_reader :predicates
911
+ attr_reader :neg_predicates
912
+ attr_reader :indexed_predicates
913
+ attr_reader :indexed_neg_predicates
914
+ attr_reader :parents
915
+ attr_reader :children
916
+ attr_reader :owners
917
+
918
+ def initialize(model, predicates, neg_predicates, indexed_predicates, indexed_neg_predicates, owners, parents, children)
919
+ @model = model
920
+ @predicates, @neg_predicates, @indexed_predicates, @indexed_neg_predicates =
921
+ predicates, neg_predicates, indexed_predicates, indexed_neg_predicates
922
+ @owners = owners
923
+ @parents = parents
924
+ @children = children
925
+ end
926
+
927
+ # Common initialization of a TaskMatcher object from the given
928
+ # argument set. This is to be used by DRoby-dumped versions of
929
+ # subclasses of TaskMatcher.
930
+ def proxy(peer, matcher: Roby::Queries::PlanObjectMatcher.new)
931
+ model = self.model.map { |m| peer.local_model(m) }
932
+ owners = peer.local_object(self.owners)
933
+
934
+ matcher.with_model(model)
935
+ matcher.predicates.concat(predicates)
936
+ matcher.neg_predicates.concat(neg_predicates)
937
+ matcher.indexed_predicates.concat(indexed_predicates)
938
+ matcher.indexed_neg_predicates.concat(indexed_neg_predicates)
939
+ matcher.parents.merge!(peer.local_object(parents))
940
+ matcher.children.merge!(peer.local_object(children))
941
+ matcher.owners.concat(owners)
942
+ matcher
943
+ end
944
+ end
945
+
946
+ # Returns an intermediate representation of +self+ suitable to be sent
947
+ # to the +dest+ peer. +klass+ is the actual class of the intermediate
948
+ # representation. It is used for code reuse by subclasses of
949
+ # TaskMatcher.
950
+ def droby_dump(peer, droby: DRoby)
951
+ droby.new(model.map { |m| peer.dump_model(m) },
952
+ predicates, neg_predicates, indexed_predicates, indexed_neg_predicates,
953
+ peer.dump(owners),
954
+ peer.dump(parents), peer.dump(children))
955
+ end
956
+ end
957
+
958
+ module TaskMatcherDumper
959
+ # An intermediate representation of TaskMatcher objects suitable to be
960
+ # sent to our peers.
961
+ class DRoby < PlanObjectMatcherDumper::DRoby
962
+ attr_reader :arguments
963
+
964
+ def initialize(*args)
965
+ @arguments = Hash.new
966
+ super(*args)
967
+ end
968
+
969
+ def proxy(peer, matcher: Roby::Queries::TaskMatcher.new)
970
+ super(peer, matcher: matcher)
971
+ matcher.arguments.merge!(arguments.proxy(peer))
972
+ matcher
973
+ end
974
+ end
975
+
976
+ # Returns an intermediate representation of +self+ suitable to be sent
977
+ # to the +dest+ peer. +klass+ is the actual class of the intermediate
978
+ # representation. It is used for code reuse by subclasses of
979
+ # TaskMatcher.
980
+ def droby_dump(peer, droby: DRoby)
981
+ droby = super(peer, droby: droby)
982
+ droby.arguments.merge!(peer.dump(arguments))
983
+ droby
984
+ end
985
+ end
986
+
987
+ module QueryDumper
988
+ # An intermediate representation of Query objects suitable to be sent
989
+ # to our peers.
990
+ class DRoby < TaskMatcherDumper::DRoby
991
+ attr_accessor :plan_id
992
+ attr_accessor :scope
993
+ attr_reader :plan_predicates, :neg_plan_predicates
994
+ def initialize(*args)
995
+ super
996
+ @plan_predicates, @neg_plan_predicates = Set.new, Set.new
997
+ end
998
+
999
+ def proxy(peer)
1000
+ query = peer.local_plan(plan_id).find_tasks
1001
+ super(peer, matcher: query)
1002
+ query.plan_predicates.merge(plan_predicates)
1003
+ query.neg_plan_predicates.merge(neg_plan_predicates)
1004
+ if scope == :local
1005
+ query.local_scope
1006
+ else query.global_scope
1007
+ end
1008
+ query
1009
+ end
1010
+ end
1011
+
1012
+ # Returns an intermediate representation of +self+ suitable to be sent
1013
+ # to the +dest+ peer.
1014
+ def droby_dump(peer)
1015
+ droby = super(peer, droby: DRoby)
1016
+ droby.plan_id = plan.droby_id
1017
+ droby.scope = scope
1018
+ droby.plan_predicates.merge(plan_predicates)
1019
+ droby.neg_plan_predicates.merge(neg_plan_predicates)
1020
+ droby
1021
+ end
1022
+ end
1023
+ end
1024
+ end
1025
+ end
1026
+ end