pione 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (593) hide show
  1. data/.gitignore +1 -0
  2. data/.simplecov +1 -0
  3. data/History.txt +9 -0
  4. data/Rakefile +1 -71
  5. data/example/Fib/Fib.pione +9 -8
  6. data/example/HelloWorld/HelloWorld.pione +2 -0
  7. data/example/HelloWorld/pione-package.json +15 -0
  8. data/example/HelloWorld/scenario/Scenario.pione +2 -0
  9. data/example/HelloWorld/scenario/pione-scenario.json +10 -0
  10. data/example/SerialProcessing/SerialProcessing.pione +2 -0
  11. data/example/SerialProcessing/pione-package.json +15 -0
  12. data/example/SerialProcessing/scenario/Scenario.pione +1 -0
  13. data/example/SerialProcessing/scenario/pione-scenario.json +10 -0
  14. data/lib/pione.rb +28 -35
  15. data/lib/pione/agent.rb +4 -4
  16. data/lib/pione/agent/agent-exception.rb +52 -0
  17. data/lib/pione/agent/basic-agent.rb +246 -239
  18. data/lib/pione/agent/broker.rb +232 -216
  19. data/lib/pione/agent/input-generator.rb +113 -133
  20. data/lib/pione/agent/job-terminator.rb +38 -0
  21. data/lib/pione/agent/logger.rb +24 -54
  22. data/lib/pione/agent/messenger.rb +11 -16
  23. data/lib/pione/agent/process-manager.rb +50 -19
  24. data/lib/pione/agent/task-worker.rb +126 -236
  25. data/lib/pione/agent/tuple-space-client.rb +16 -39
  26. data/lib/pione/agent/tuple-space-provider.rb +66 -0
  27. data/lib/pione/agent/tuple-space-receiver.rb +137 -0
  28. data/lib/pione/command.rb +2 -3
  29. data/lib/pione/command/basic-command.rb +347 -207
  30. data/lib/pione/command/command-exception.rb +38 -0
  31. data/lib/pione/command/option.rb +112 -104
  32. data/lib/pione/command/pione-broker.rb +85 -43
  33. data/lib/pione/command/pione-clean.rb +51 -8
  34. data/lib/pione/command/pione-client.rb +321 -292
  35. data/lib/pione/command/pione-log.rb +92 -53
  36. data/lib/pione/command/pione-package.rb +112 -59
  37. data/lib/pione/command/pione-relay-account-db.rb +107 -78
  38. data/lib/pione/command/pione-relay-client-db.rb +93 -72
  39. data/lib/pione/command/pione-relay.rb +37 -32
  40. data/lib/pione/command/pione-syntax-checker.rb +112 -87
  41. data/lib/pione/command/pione-task-worker.rb +135 -118
  42. data/lib/pione/command/pione-tuple-space-provider.rb +83 -50
  43. data/lib/pione/command/pione-tuple-space-receiver.rb +89 -50
  44. data/lib/pione/command/pione-tuple-space-viewer.rb +101 -99
  45. data/lib/pione/command/pione-val.rb +50 -29
  46. data/lib/pione/command/spawner.rb +74 -0
  47. data/lib/pione/front.rb +0 -2
  48. data/lib/pione/front/basic-front.rb +48 -26
  49. data/lib/pione/front/broker-front.rb +8 -16
  50. data/lib/pione/front/client-front.rb +10 -18
  51. data/lib/pione/front/front-exception.rb +12 -0
  52. data/lib/pione/front/relay-front.rb +6 -6
  53. data/lib/pione/front/task-worker-front.rb +3 -9
  54. data/lib/pione/front/tuple-space-provider-front.rb +6 -14
  55. data/lib/pione/front/tuple-space-receiver-front.rb +4 -11
  56. data/lib/pione/global.rb +135 -0
  57. data/lib/pione/global/broker-variable.rb +20 -0
  58. data/lib/pione/global/client-variable.rb +18 -0
  59. data/lib/pione/global/input-generator-variable.rb +7 -0
  60. data/lib/pione/global/log-variable.rb +53 -0
  61. data/lib/pione/global/network-variable.rb +7 -0
  62. data/lib/pione/global/package-variable.rb +28 -0
  63. data/lib/pione/global/path-variable.rb +52 -0
  64. data/lib/pione/global/relay-variable.rb +86 -0
  65. data/lib/pione/global/system-variable.rb +39 -0
  66. data/lib/pione/global/task-worker-variable.rb +17 -0
  67. data/lib/pione/global/tuple-space-notifier-variable.rb +60 -0
  68. data/lib/pione/lang.rb +55 -0
  69. data/lib/pione/lang/basic-model.rb +45 -0
  70. data/lib/pione/lang/boolean.rb +86 -0
  71. data/lib/pione/lang/common-parser.rb +202 -0
  72. data/lib/pione/lang/conditional-branch-parser.rb +57 -0
  73. data/lib/pione/lang/conditional-branch-transformer.rb +36 -0
  74. data/lib/pione/lang/conditional-branch.rb +73 -0
  75. data/lib/pione/lang/context-parser.rb +39 -0
  76. data/lib/pione/lang/context-transformer.rb +41 -0
  77. data/lib/pione/lang/context.rb +229 -0
  78. data/lib/pione/lang/data-expr.rb +265 -0
  79. data/lib/pione/lang/declaration-parser.rb +174 -0
  80. data/lib/pione/lang/declaration-transformer.rb +153 -0
  81. data/lib/pione/lang/declaration.rb +322 -0
  82. data/lib/pione/lang/definition.rb +88 -0
  83. data/lib/pione/lang/document-parser.rb +19 -0
  84. data/lib/pione/lang/document-transformer.rb +12 -0
  85. data/lib/pione/lang/environment.rb +344 -0
  86. data/lib/pione/{parser → lang}/error-message.yml +0 -0
  87. data/lib/pione/lang/expr-parser.rb +228 -0
  88. data/lib/pione/{transformer → lang}/expr-transformer.rb +32 -44
  89. data/lib/pione/lang/expr.rb +70 -0
  90. data/lib/pione/lang/feature-expr.rb +425 -0
  91. data/lib/pione/lang/float.rb +104 -0
  92. data/lib/pione/lang/integer.rb +159 -0
  93. data/lib/pione/lang/interpolator-parser.rb +44 -0
  94. data/lib/pione/lang/interpolator-transformer.rb +13 -0
  95. data/lib/pione/lang/keyed-sequence.rb +98 -0
  96. data/lib/pione/lang/lang-exception.rb +224 -0
  97. data/lib/pione/lang/literal-parser.rb +134 -0
  98. data/lib/pione/lang/literal-transformer.rb +171 -0
  99. data/lib/pione/lang/message.rb +41 -0
  100. data/lib/pione/lang/ordinal-sequence.rb +203 -0
  101. data/lib/pione/lang/package-expr.rb +86 -0
  102. data/lib/pione/lang/parameters.rb +121 -0
  103. data/lib/pione/lang/piece.rb +42 -0
  104. data/lib/pione/{model → lang}/pione-method.rb +26 -63
  105. data/lib/pione/lang/rule-expr.rb +70 -0
  106. data/lib/pione/lang/sequence.rb +215 -0
  107. data/lib/pione/lang/string.rb +116 -0
  108. data/lib/pione/lang/ticket-expr.rb +48 -0
  109. data/lib/pione/{model → lang}/type.rb +70 -99
  110. data/lib/pione/lang/variable.rb +35 -0
  111. data/lib/pione/location.rb +13 -1
  112. data/lib/pione/{uri-scheme → location}/broadcast-scheme.rb +2 -2
  113. data/lib/pione/location/data-location.rb +22 -5
  114. data/lib/pione/location/dropbox-location.rb +10 -8
  115. data/lib/pione/{uri-scheme → location}/dropbox-scheme.rb +2 -2
  116. data/lib/pione/location/ftp-location.rb +6 -0
  117. data/lib/pione/location/git-repository-location.rb +6 -17
  118. data/lib/pione/{uri-scheme → location}/git-scheme.rb +2 -2
  119. data/lib/pione/location/http-location.rb +8 -1
  120. data/lib/pione/location/local-location.rb +57 -4
  121. data/lib/pione/{uri-scheme → location}/local-scheme.rb +2 -2
  122. data/lib/pione/location/{exception.rb → location-exception.rb} +13 -1
  123. data/lib/pione/{uri-scheme/basic-scheme.rb → location/location-scheme.rb} +7 -6
  124. data/lib/pione/{uri-scheme → location}/myftp-scheme.rb +2 -2
  125. data/lib/pione/log.rb +7 -6
  126. data/lib/pione/log/debug.rb +75 -0
  127. data/lib/pione/log/domain-log.rb +4 -5
  128. data/lib/pione/log/message-log.rb +2 -2
  129. data/lib/pione/log/process-log.rb +16 -25
  130. data/lib/pione/log/process-record.rb +1 -0
  131. data/lib/pione/log/system-log.rb +165 -55
  132. data/lib/pione/package.rb +21 -0
  133. data/lib/pione/package/document.rb +27 -0
  134. data/lib/pione/package/package-archiver.rb +152 -0
  135. data/lib/pione/package/package-cache.rb +79 -0
  136. data/lib/pione/package/package-database.rb +121 -0
  137. data/lib/pione/package/package-exception.rb +38 -0
  138. data/lib/pione/{component → package}/package-expander.rb +13 -7
  139. data/lib/pione/package/package-filename.rb +46 -0
  140. data/lib/pione/package/package-handler.rb +106 -0
  141. data/lib/pione/package/package-info.rb +72 -0
  142. data/lib/pione/package/package-reader.rb +202 -0
  143. data/lib/pione/package/package-scanner.rb +133 -0
  144. data/lib/pione/package/scenario-handler.rb +95 -0
  145. data/lib/pione/package/scenario-info.rb +34 -0
  146. data/lib/pione/package/scenario-reader.rb +29 -0
  147. data/lib/pione/package/scenario-scanner.rb +96 -0
  148. data/lib/pione/patch.rb +0 -1
  149. data/lib/pione/patch/drb-patch.rb +377 -298
  150. data/lib/pione/patch/rinda-patch.rb +4 -3
  151. data/lib/pione/relay/relay-socket.rb +1 -4
  152. data/lib/pione/rule-engine.rb +27 -0
  153. data/lib/pione/{rule-handler → rule-engine}/action-handler.rb +41 -40
  154. data/lib/pione/rule-engine/basic-handler.rb +266 -0
  155. data/lib/pione/rule-engine/data-finder.rb +97 -0
  156. data/lib/pione/{rule-handler → rule-engine}/empty-handler.rb +2 -3
  157. data/lib/pione/rule-engine/engine-exception.rb +33 -0
  158. data/lib/pione/rule-engine/flow-handler.rb +490 -0
  159. data/lib/pione/{rule-handler → rule-engine}/root-handler.rb +5 -14
  160. data/lib/pione/{rule-handler → rule-engine}/system-handler.rb +1 -1
  161. data/lib/pione/rule-engine/update-criteria.rb +111 -0
  162. data/lib/pione/system.rb +3 -1
  163. data/lib/pione/system/config.rb +12 -45
  164. data/lib/pione/system/domain-info.rb +3 -12
  165. data/lib/pione/system/init.rb +2 -8
  166. data/lib/pione/system/system-exception.rb +29 -0
  167. data/lib/pione/test-helper.rb +43 -0
  168. data/lib/pione/test-helper/command-helper.rb +65 -0
  169. data/lib/pione/test-helper/extension.rb +9 -0
  170. data/lib/pione/test-helper/lang-helper.rb +196 -0
  171. data/lib/pione/test-helper/location-helper.rb +27 -0
  172. data/lib/pione/test-helper/package-helper.rb +11 -0
  173. data/lib/pione/test-helper/parser-helper.rb +45 -0
  174. data/lib/pione/test-helper/transformer-helper.rb +136 -0
  175. data/lib/pione/test-helper/tuple-helper.rb +13 -0
  176. data/lib/pione/test-helper/tuple-space-helper.rb +31 -0
  177. data/lib/pione/test-helper/webserver.rb +50 -0
  178. data/lib/pione/tuple-space.rb +4 -6
  179. data/lib/pione/{tuple → tuple-space}/basic-tuple.rb +63 -50
  180. data/lib/pione/tuple-space/tuple-definition.yml +165 -0
  181. data/lib/pione/tuple-space/tuple-space-exception.rb +25 -0
  182. data/lib/pione/tuple-space/tuple-space-interface.rb +123 -0
  183. data/lib/pione/tuple-space/tuple-space-server.rb +15 -26
  184. data/lib/pione/util.rb +16 -11
  185. data/lib/pione/util/backslash-notation.rb +11 -0
  186. data/lib/pione/util/digest.rb +71 -0
  187. data/lib/pione/util/embeded-expr-expander.rb +23 -0
  188. data/lib/pione/util/evaluatable.rb +9 -6
  189. data/lib/pione/util/free-thread-generator.rb +46 -0
  190. data/lib/pione/util/ftp-server.rb +3 -4
  191. data/lib/pione/util/id.rb +28 -23
  192. data/lib/pione/util/misc.rb +22 -4
  193. data/lib/pione/util/package-parameters-list.rb +12 -9
  194. data/lib/pione/{parser → util}/parslet-extension.rb +75 -64
  195. data/lib/pione/util/positionable.rb +65 -0
  196. data/lib/pione/util/zip.rb +12 -11
  197. data/lib/pione/version.rb +1 -1
  198. data/{test → misc}/endurance-test/graph.plt +0 -0
  199. data/{test → misc}/endurance-test/run.sh +0 -0
  200. data/pione.gemspec +45 -37
  201. data/test/agent/spec_basic-agent.rb +116 -99
  202. data/test/agent/spec_broker.rb +41 -25
  203. data/test/agent/spec_input-generator.rb +66 -57
  204. data/test/agent/spec_job-terminator.rb +27 -0
  205. data/test/agent/spec_logger.rb +28 -25
  206. data/test/agent/spec_messenger.rb +6 -6
  207. data/test/agent/spec_task-worker.rb +97 -246
  208. data/test/agent/spec_tuple-space-client.rb +19 -15
  209. data/test/agent/spec_tuple-space-provider.rb +26 -0
  210. data/test/agent/spec_tuple-space-receiver.rb +47 -0
  211. data/test/command/command-behavior.rb +2 -2
  212. data/test/command/data/PionePackageP1/P1.pione +9 -0
  213. data/test/command/data/PionePackageP1/pione-package.json +15 -0
  214. data/test/command/data/PionePackageP2/P2.pione +10 -0
  215. data/test/command/data/PionePackageP2/pione-package.json +16 -0
  216. data/test/command/data/PionePackageP3/P3.pione +10 -0
  217. data/test/command/data/PionePackageP3/pione-package.json +16 -0
  218. data/test/command/data/PionePackageP4/P4.pione +10 -0
  219. data/test/command/data/PionePackageP4/pione-package.json +17 -0
  220. data/test/command/data/pione-process.log +471 -0
  221. data/test/command/data/pione-val.domain.dump +0 -0
  222. data/test/command/spec_pione-clean.rb +12 -0
  223. data/test/command/spec_pione-client.rb +6 -6
  224. data/test/command/spec_pione-log.rb +28 -0
  225. data/test/command/spec_pione-package.rb +111 -12
  226. data/test/command/spec_pione-val.rb +4 -4
  227. data/test/lang/data/boolean.yml +134 -0
  228. data/test/lang/data/common-parser.yml +187 -0
  229. data/test/{parser/spec_flow-element-parser.yml → lang/data/conditional-branch-parser.yml} +12 -50
  230. data/test/lang/data/context-parser.yml +148 -0
  231. data/test/lang/data/data-expr.yml +93 -0
  232. data/test/lang/data/data-expr_match.yml +59 -0
  233. data/test/lang/data/declaration-parser.yml +279 -0
  234. data/test/lang/data/document-parser.yml +29 -0
  235. data/test/{parser/spec_expr-parser.yml → lang/data/expr-parser.yml} +9 -11
  236. data/test/lang/data/feature-expr.yml +148 -0
  237. data/test/lang/data/float.yml +30 -0
  238. data/test/lang/data/integer.yml +80 -0
  239. data/test/lang/data/interpolator-parser.yml +61 -0
  240. data/test/lang/data/keyed-sequence.yml +27 -0
  241. data/test/lang/data/literal-parser.yml +207 -0
  242. data/test/lang/data/parameter-set.yml +14 -0
  243. data/test/lang/data/rule-expr.yml +27 -0
  244. data/test/lang/data/sequence.yml +66 -0
  245. data/test/lang/data/string.yml +92 -0
  246. data/test/{model/spec_ticket-expr.yml → lang/data/ticket-expr.yml} +0 -0
  247. data/test/lang/spec_boolean.rb +5 -0
  248. data/test/{parser → lang}/spec_common-parser.rb +10 -32
  249. data/test/lang/spec_conditional-branch-parser.rb +5 -0
  250. data/test/lang/spec_conditional-branch-transformer.rb +97 -0
  251. data/test/lang/spec_conditional-branch.rb +176 -0
  252. data/test/lang/spec_context-parser.rb +5 -0
  253. data/test/lang/spec_context-transformer.rb +206 -0
  254. data/test/lang/spec_context.rb +283 -0
  255. data/test/lang/spec_data-expr.rb +198 -0
  256. data/test/lang/spec_declaration-parser.rb +5 -0
  257. data/test/lang/spec_declaration-transformer.rb +272 -0
  258. data/test/lang/spec_declaration.rb +550 -0
  259. data/test/lang/spec_document-parser.rb +5 -0
  260. data/test/lang/spec_document-transformer.rb +10 -0
  261. data/test/lang/spec_environment.rb +129 -0
  262. data/test/lang/spec_expr-parser.rb +6 -0
  263. data/test/lang/spec_expr-transformer.rb +149 -0
  264. data/test/lang/spec_feature-expr.rb +5 -0
  265. data/test/lang/spec_float.rb +23 -0
  266. data/test/lang/spec_integer.rb +29 -0
  267. data/test/lang/spec_interpolator-parser.rb +5 -0
  268. data/test/lang/spec_interpolator-transformer.rb +15 -0
  269. data/test/lang/spec_keyed-sequence.rb +5 -0
  270. data/test/lang/spec_literal-parser.rb +5 -0
  271. data/test/lang/spec_literal-transformer.rb +111 -0
  272. data/test/lang/spec_message.rb +22 -0
  273. data/test/lang/spec_package-expr.rb +19 -0
  274. data/test/lang/spec_parameter-set.rb +64 -0
  275. data/test/lang/spec_pione-method.rb +57 -0
  276. data/test/lang/spec_rule-expr.rb +18 -0
  277. data/test/lang/spec_sequence.rb +5 -0
  278. data/test/lang/spec_string.rb +5 -0
  279. data/test/lang/spec_ticket-expr.rb +39 -0
  280. data/test/lang/spec_variable.rb +29 -0
  281. data/test/{uri-scheme/spec_myftp-scheme.yml → location/data/myftp-scheme.yml} +0 -0
  282. data/test/location/location-behavior.rb +2 -2
  283. data/test/location/spec_basic-location.rb +5 -1
  284. data/test/{uri-scheme → location}/spec_broadcast-scheme.rb +4 -4
  285. data/test/{uri-scheme → location}/spec_dropbox-scheme.rb +3 -3
  286. data/test/location/spec_ftp-location.rb +3 -2
  287. data/test/location/spec_git-repository-location.rb +19 -19
  288. data/test/{uri-scheme → location}/spec_git-scheme.rb +2 -2
  289. data/test/location/spec_http-location.rb +4 -12
  290. data/test/location/spec_https-location.rb +1 -3
  291. data/test/location/spec_local-location.rb +1 -1
  292. data/test/{uri-scheme → location}/spec_local-scheme.rb +3 -3
  293. data/test/{uri-scheme → location}/spec_myftp-scheme.rb +8 -10
  294. data/test/log/spec_debug.rb +53 -0
  295. data/test/log/spec_domain-log.rb +4 -5
  296. data/test/log/spec_message-log.rb +39 -33
  297. data/test/log/spec_process-log.rb +4 -2
  298. data/test/log/spec_process-record.rb +12 -10
  299. data/test/log/spec_system-log.rb +29 -11
  300. data/test/log/spec_xes-log.rb +6 -4
  301. data/test/package/data/HelloWorld+v0.1.1.ppg +0 -0
  302. data/test/package/data/HelloWorld-gitrepos.zip +0 -0
  303. data/test/{test-data/package → package/data}/HelloWorld/HelloWorld.pione +3 -0
  304. data/test/package/data/HelloWorld/pione-package.json +16 -0
  305. data/test/package/data/HelloWorld/scenario/Scenario.pione +2 -0
  306. data/test/{test-data/package → package/data}/HelloWorld/scenario/output/message.txt +0 -0
  307. data/test/package/data/HelloWorld/scenario/pione-scenario.json +10 -0
  308. data/test/{test-data/package → package/data}/HelloWorld/scenario/scenario.yml +0 -0
  309. data/test/package/data/PackageScannerP1/P1.pione +11 -0
  310. data/test/package/data/PackageScannerP2/P2.pione +9 -0
  311. data/test/package/data/PackageScannerP3/P3.pione +17 -0
  312. data/test/package/data/PackageScannerP4/.Ignore.pione +1 -0
  313. data/test/package/data/PackageScannerP4/Doc1.pione +8 -0
  314. data/test/package/data/PackageScannerP4/Doc2.pione +6 -0
  315. data/test/package/data/PackageScannerP4/Doc3.pione +6 -0
  316. data/test/package/data/PackageScannerP4/P4.pione +8 -0
  317. data/test/package/data/PackageScannerP4/sub1/.Ignore.pione +1 -0
  318. data/test/package/data/PackageScannerP4/sub1/Doc4.pione +6 -0
  319. data/test/package/data/PackageScannerP4/sub1/sub1-1/.Ignore.pione +1 -0
  320. data/test/package/data/PackageScannerP4/sub1/sub1-1/Doc5.pione +6 -0
  321. data/test/package/data/PackageScannerP4/sub2/.Ignore.pione +1 -0
  322. data/test/package/data/PackageScannerP4/sub2/sub2-1/.Ignore.pione +1 -0
  323. data/test/package/data/PackageScannerP4/sub2/sub2-1/sub2-1-1/.Ignore.pione +1 -0
  324. data/test/package/data/PackageScannerP4/sub2/sub2-1/sub2-1-1/Doc6.pione +6 -0
  325. data/test/package/data/PackageScannerP4/sub2/sub2-1/sub2-1-2/.Ignore.pione +1 -0
  326. data/test/package/data/PackageScannerP4/sub2/sub2-1/sub2-1-2/Doc7.pione +6 -0
  327. data/test/package/data/PackageScannerP5/P5.pione +8 -0
  328. data/test/{model/spec_feature-expr.yml → package/data/PackageScannerP5/scenario1/Scenario.pione} +0 -0
  329. data/test/package/data/PackageScannerP5/scenario2/Scenario.pione +0 -0
  330. data/test/package/data/PackageScannerP5/scenario3/Scenario.pione +0 -0
  331. data/test/package/data/PackageScannerP5/sub1/scenario4/Scenario.pione +0 -0
  332. data/test/package/data/PackageScannerP5/sub1/sub1-1/scenario5/Scenario.pione +0 -0
  333. data/test/package/data/PackageScannerP5/sub2/sub2-1/sub2-1-1/scenario6/Scenario.pione +0 -0
  334. data/test/package/data/PackageScannerP5/sub2/sub2-1/sub2-1-2/scenario7/Scenario.pione +0 -0
  335. data/test/package/data/ScenarioScannerS1/Scenario.pione +1 -0
  336. data/test/package/data/ScenarioScannerS1/input/i1 +0 -0
  337. data/test/package/data/ScenarioScannerS1/input/i2 +0 -0
  338. data/test/package/data/ScenarioScannerS1/input/i3 +0 -0
  339. data/test/package/data/ScenarioScannerS1/output/o1 +0 -0
  340. data/test/package/data/ScenarioScannerS1/output/o2 +0 -0
  341. data/test/package/data/ScenarioScannerS1/output/o3 +0 -0
  342. data/test/package/data/ScenarioScannerS2/Scenario.pione +1 -0
  343. data/test/package/data/ScenarioScannerS2/output/o1 +0 -0
  344. data/test/package/data/ScenarioScannerS3/Scenario.pione +2 -0
  345. data/test/package/data/ScenarioScannerS4/Scenario.pione +0 -0
  346. data/test/package/data/ScenarioScannerS5/Scenario.pione +2 -0
  347. data/test/package/data/ScenarioScannerS6/Scenario.pione +5 -0
  348. data/test/package/data/ScenarioScannerS8/Scenario.pione +1 -0
  349. data/test/{test-data/package → package/data}/TestPackage1+v0.1.0.ppg +0 -0
  350. data/test/{test-data/package → package/data}/TestPackage1/Test.pione +3 -0
  351. data/test/{test-data/package → package/data}/TestPackage1/bin/count +0 -0
  352. data/test/{test-data/package → package/data}/TestPackage1/package.yml +0 -0
  353. data/test/package/data/TestPackage1/pione-package.json +18 -0
  354. data/test/package/data/TestPackage1/scenario/case1/Scenario.pione +1 -0
  355. data/test/{test-data/package → package/data}/TestPackage1/scenario/case1/input/1.txt +0 -0
  356. data/test/{test-data/package → package/data}/TestPackage1/scenario/case1/output/1.count +0 -0
  357. data/test/package/data/TestPackage1/scenario/case1/pione-scenario.json +10 -0
  358. data/test/{test-data/package → package/data}/TestPackage1/scenario/case1/scenario.yml +0 -0
  359. data/test/package/data/TestPackage1/scenario/case2/Scenario.pione +1 -0
  360. data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/input/1.txt +0 -0
  361. data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/input/2.txt +0 -0
  362. data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/input/3.txt +0 -0
  363. data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/output/1.count +0 -0
  364. data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/output/2.count +0 -0
  365. data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/output/3.count +0 -0
  366. data/test/package/data/TestPackage1/scenario/case2/pione-scenario.json +14 -0
  367. data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/scenario.yml +0 -0
  368. data/test/package/data/TestPackage1/scenario/case3/Scenario.pione +1 -0
  369. data/test/{test-data/package → package/data}/TestPackage1/scenario/case3/input/a.txt +0 -0
  370. data/test/{test-data/package → package/data}/TestPackage1/scenario/case3/input/b.txt +0 -0
  371. data/test/{test-data/package → package/data}/TestPackage1/scenario/case3/output/a.count +0 -0
  372. data/test/{test-data/package → package/data}/TestPackage1/scenario/case3/output/b.count +0 -0
  373. data/test/package/data/TestPackage1/scenario/case3/pione-scenario.json +12 -0
  374. data/test/{test-data/package → package/data}/TestPackage1/scenario/case3/scenario.yml +0 -0
  375. data/test/{component → package}/spec_document.pione +0 -0
  376. data/test/package/spec_document.rb +52 -0
  377. data/test/package/spec_package-archiver.rb +31 -0
  378. data/test/package/spec_package-database.rb +42 -0
  379. data/test/package/spec_package-expander.rb +14 -0
  380. data/test/package/spec_package-filename.rb +56 -0
  381. data/test/package/spec_package-handler.rb +50 -0
  382. data/test/package/spec_package-info.rb +22 -0
  383. data/test/package/spec_package-reader.rb +85 -0
  384. data/test/package/spec_package-scanner.rb +68 -0
  385. data/test/package/spec_scenario-handler.rb +46 -0
  386. data/test/package/spec_scenario-info.rb +16 -0
  387. data/test/package/spec_scenario-scanner.rb +92 -0
  388. data/test/patch/spec_rinda-patch.rb +1 -1
  389. data/test/patch/spec_uri-patch.rb +1 -1
  390. data/test/{rule-handler → rule-engine}/spec_action-handler.pione +0 -0
  391. data/test/rule-engine/spec_action-handler.rb +94 -0
  392. data/test/rule-engine/spec_data-finder.rb +94 -0
  393. data/test/{tuple-space → rule-engine}/spec_data-finder.yml +39 -28
  394. data/test/rule-engine/spec_empty-handler.rb +170 -0
  395. data/test/{rule-handler → rule-engine}/spec_flow-handler.pione +0 -0
  396. data/test/rule-engine/spec_flow-handler.rb +421 -0
  397. data/test/{rule-handler → rule-engine}/spec_update-criteria.pione +0 -0
  398. data/test/{rule-handler → rule-engine}/spec_update-criteria.rb +16 -12
  399. data/test/{rule-handler → rule-engine}/spec_update-criteria.yml +0 -0
  400. data/test/system/spec_domain-info.rb +13 -9
  401. data/test/system/spec_file-cache.rb +9 -9
  402. data/test/tuple-space/spec_tuple-space-server.rb +42 -40
  403. data/test/tuple/spec_basic-tuple.rb +77 -75
  404. data/test/tuple/spec_data-tuple.rb +4 -4
  405. data/test/tuple/spec_finished-tuple.rb +5 -6
  406. data/test/tuple/spec_message-tuple.rb +3 -3
  407. data/test/tuple/spec_task-tuple.rb +11 -9
  408. data/test/tuple/spec_touch-tuple.rb +3 -3
  409. data/test/tuple/spec_working-tuple.rb +8 -12
  410. data/test/tuple/tuple-behavior.rb +1 -1
  411. data/test/util/data/HelloWorld+v0.1.1.ppg +0 -0
  412. data/test/util/spec_cpu.rb +1 -1
  413. data/test/util/spec_digest.rb +15 -0
  414. data/test/util/spec_evaluatable.rb +3 -3
  415. data/test/util/spec_free-thread-generator.rb +42 -0
  416. data/test/util/spec_ftp-server.rb +4 -9
  417. data/test/util/spec_id.rb +53 -36
  418. data/test/util/spec_indentation.rb +1 -1
  419. data/test/util/spec_ip-address.rb +1 -1
  420. data/test/util/spec_package-parameters-list.rb +10 -9
  421. data/test/util/spec_process-info.rb +2 -2
  422. data/test/util/spec_uuid.rb +1 -1
  423. data/test/util/spec_variable-holdable.rb +1 -1
  424. data/test/util/spec_zip.rb +1 -1
  425. metadata +508 -364
  426. data/example/SerialProcessing/package.yml +0 -5
  427. data/example/SerialProcessing/scenario/scenario.yml +0 -10
  428. data/lib/pione/agent/command-listener.rb +0 -47
  429. data/lib/pione/agent/rule-provider.rb +0 -59
  430. data/lib/pione/agent/trivial-routine-worker.rb +0 -29
  431. data/lib/pione/agent/tuple-space-server-client-life-checker.rb +0 -31
  432. data/lib/pione/command/child-process.rb +0 -56
  433. data/lib/pione/command/daemon-process.rb +0 -10
  434. data/lib/pione/command/front-owner-command.rb +0 -25
  435. data/lib/pione/component.rb +0 -13
  436. data/lib/pione/component/document.rb +0 -88
  437. data/lib/pione/component/package-archiver.rb +0 -92
  438. data/lib/pione/component/package-filename.rb +0 -38
  439. data/lib/pione/component/package-reader.rb +0 -276
  440. data/lib/pione/component/package.rb +0 -199
  441. data/lib/pione/component/rule.rb +0 -206
  442. data/lib/pione/front/task-worker-owner.rb +0 -43
  443. data/lib/pione/front/tuple-space-provider-owner.rb +0 -11
  444. data/lib/pione/model.rb +0 -32
  445. data/lib/pione/model/assignment.rb +0 -120
  446. data/lib/pione/model/basic-model.rb +0 -228
  447. data/lib/pione/model/block.rb +0 -262
  448. data/lib/pione/model/boolean.rb +0 -168
  449. data/lib/pione/model/call-rule.rb +0 -86
  450. data/lib/pione/model/constraints.rb +0 -46
  451. data/lib/pione/model/data-expr.rb +0 -548
  452. data/lib/pione/model/feature-expr.rb +0 -875
  453. data/lib/pione/model/float.rb +0 -105
  454. data/lib/pione/model/integer.rb +0 -166
  455. data/lib/pione/model/keyed-sequence.rb +0 -150
  456. data/lib/pione/model/message.rb +0 -95
  457. data/lib/pione/model/ordinal-sequence.rb +0 -73
  458. data/lib/pione/model/package-expr.rb +0 -53
  459. data/lib/pione/model/parameters.rb +0 -374
  460. data/lib/pione/model/rule-expr.rb +0 -234
  461. data/lib/pione/model/sequence.rb +0 -273
  462. data/lib/pione/model/string.rb +0 -127
  463. data/lib/pione/model/ticket-expr.rb +0 -71
  464. data/lib/pione/model/variable-table.rb +0 -344
  465. data/lib/pione/model/variable.rb +0 -116
  466. data/lib/pione/parser.rb +0 -14
  467. data/lib/pione/parser/block-parser.rb +0 -107
  468. data/lib/pione/parser/common-parser.rb +0 -173
  469. data/lib/pione/parser/document-parser.rb +0 -141
  470. data/lib/pione/parser/expr-parser.rb +0 -354
  471. data/lib/pione/parser/feature-expr-parser.rb +0 -105
  472. data/lib/pione/parser/flow-element-parser.rb +0 -181
  473. data/lib/pione/parser/literal-parser.rb +0 -196
  474. data/lib/pione/parser/rule-definition-parser.rb +0 -158
  475. data/lib/pione/patch/monitor-patch.rb +0 -16
  476. data/lib/pione/rule-handler.rb +0 -14
  477. data/lib/pione/rule-handler/basic-handler.rb +0 -326
  478. data/lib/pione/rule-handler/flow-handler.rb +0 -414
  479. data/lib/pione/rule-handler/update-criteria.rb +0 -175
  480. data/lib/pione/system/global.rb +0 -433
  481. data/lib/pione/transformer.rb +0 -24
  482. data/lib/pione/transformer/block-transformer.rb +0 -28
  483. data/lib/pione/transformer/document-transformer.rb +0 -58
  484. data/lib/pione/transformer/feature-expr-transformer.rb +0 -60
  485. data/lib/pione/transformer/flow-element-transformer.rb +0 -66
  486. data/lib/pione/transformer/literal-transformer.rb +0 -91
  487. data/lib/pione/transformer/rule-definition-transformer.rb +0 -80
  488. data/lib/pione/transformer/transformer-module.rb +0 -39
  489. data/lib/pione/tuple-space/data-finder.rb +0 -155
  490. data/lib/pione/tuple-space/presence-notifier.rb +0 -84
  491. data/lib/pione/tuple-space/tuple-space-provider.rb +0 -85
  492. data/lib/pione/tuple-space/tuple-space-receiver.rb +0 -141
  493. data/lib/pione/tuple-space/tuple-space-server-interface.rb +0 -123
  494. data/lib/pione/tuple.rb +0 -30
  495. data/lib/pione/tuple/agent-tuple.rb +0 -10
  496. data/lib/pione/tuple/attribute-tuple.rb +0 -7
  497. data/lib/pione/tuple/base-location-tuple.rb +0 -9
  498. data/lib/pione/tuple/bye-tuple.rb +0 -9
  499. data/lib/pione/tuple/command-tuple.rb +0 -9
  500. data/lib/pione/tuple/data-null-tuple.rb +0 -14
  501. data/lib/pione/tuple/data-tuple.rb +0 -21
  502. data/lib/pione/tuple/dry-run-tuple.rb +0 -8
  503. data/lib/pione/tuple/exception-tuple.rb +0 -11
  504. data/lib/pione/tuple/finished-tuple.rb +0 -17
  505. data/lib/pione/tuple/foreground-tuple.rb +0 -7
  506. data/lib/pione/tuple/lift-tuple.rb +0 -14
  507. data/lib/pione/tuple/message-tuple.rb +0 -7
  508. data/lib/pione/tuple/process-info-tuple.rb +0 -9
  509. data/lib/pione/tuple/process-log-tuple.rb +0 -13
  510. data/lib/pione/tuple/request-rule-tuple.rb +0 -9
  511. data/lib/pione/tuple/rule-tuple.rb +0 -10
  512. data/lib/pione/tuple/task-tuple.rb +0 -40
  513. data/lib/pione/tuple/task-worker-resource-tuple.rb +0 -9
  514. data/lib/pione/tuple/ticket-tuple.rb +0 -8
  515. data/lib/pione/tuple/touch-tuple.rb +0 -14
  516. data/lib/pione/tuple/working-tuple.rb +0 -13
  517. data/lib/pione/uri-scheme.rb +0 -11
  518. data/lib/pione/util/error-report.rb +0 -27
  519. data/test/agent/spec_command-listener.rb +0 -30
  520. data/test/agent/spec_rule-provider.rb +0 -78
  521. data/test/command/spec_pione-val.domain.dump +0 -0
  522. data/test/component/spec_document.rb +0 -67
  523. data/test/component/spec_package-archiver.rb +0 -27
  524. data/test/component/spec_package-expander.rb +0 -11
  525. data/test/component/spec_package-filename.rb +0 -79
  526. data/test/component/spec_package-reader.rb +0 -100
  527. data/test/component/spec_package.rb +0 -109
  528. data/test/component/spec_rule.rb +0 -140
  529. data/test/model/spec_assignment.rb +0 -52
  530. data/test/model/spec_block.rb +0 -108
  531. data/test/model/spec_boolean.rb +0 -39
  532. data/test/model/spec_boolean.yml +0 -134
  533. data/test/model/spec_call-rule.rb +0 -23
  534. data/test/model/spec_data-expr.rb +0 -361
  535. data/test/model/spec_data-expr.yml +0 -24
  536. data/test/model/spec_data-expr_match.yml +0 -45
  537. data/test/model/spec_feature-expr.rb +0 -333
  538. data/test/model/spec_feature-expr_decide.yml +0 -28
  539. data/test/model/spec_float.rb +0 -23
  540. data/test/model/spec_float.yml +0 -30
  541. data/test/model/spec_integer.rb +0 -23
  542. data/test/model/spec_integer.yml +0 -68
  543. data/test/model/spec_keyed-sequence.rb +0 -5
  544. data/test/model/spec_keyed-sequence.yml +0 -27
  545. data/test/model/spec_message.rb +0 -40
  546. data/test/model/spec_package-expr.rb +0 -19
  547. data/test/model/spec_parameters.rb +0 -103
  548. data/test/model/spec_pione-method.rb +0 -57
  549. data/test/model/spec_rule-expr.rb +0 -28
  550. data/test/model/spec_rule-expr.yml +0 -11
  551. data/test/model/spec_sequence.rb +0 -5
  552. data/test/model/spec_sequence.yml +0 -66
  553. data/test/model/spec_string.rb +0 -47
  554. data/test/model/spec_string.yml +0 -91
  555. data/test/model/spec_ticket-expr.rb +0 -39
  556. data/test/model/spec_variable-table.rb +0 -116
  557. data/test/model/spec_variable.rb +0 -82
  558. data/test/parser/spec_block-parser.rb +0 -5
  559. data/test/parser/spec_block-parser.yml +0 -94
  560. data/test/parser/spec_document-parser.rb +0 -5
  561. data/test/parser/spec_document-parser.yml +0 -77
  562. data/test/parser/spec_expr-parser.rb +0 -6
  563. data/test/parser/spec_feature-expr-parser.rb +0 -32
  564. data/test/parser/spec_feature-expr-parser.yml +0 -25
  565. data/test/parser/spec_flow-element-parser.rb +0 -5
  566. data/test/parser/spec_literal-parser.rb +0 -5
  567. data/test/parser/spec_literal-parser.yml +0 -134
  568. data/test/parser/spec_rule-definition-parser.rb +0 -5
  569. data/test/parser/spec_rule-definition-parser.yml +0 -94
  570. data/test/rule-handler/spec_action-handler.rb +0 -79
  571. data/test/rule-handler/spec_flow-handler.rb +0 -61
  572. data/test/spec_common.rb +0 -14
  573. data/test/spec_object.rb +0 -20
  574. data/test/test-data/package/HelloWorld+v0.1.0.ppg +0 -0
  575. data/test/test-data/package/HelloWorld-gitrepos.zip +0 -0
  576. data/test/test-data/package/HelloWorld/package.yml +0 -6
  577. data/test/test-util.rb +0 -211
  578. data/test/test-util/command.rb +0 -53
  579. data/test/test-util/package.rb +0 -9
  580. data/test/test-util/parser.rb +0 -45
  581. data/test/test-util/transformer.rb +0 -50
  582. data/test/test-util/webserver.rb +0 -43
  583. data/test/transformer/spec_block-transformer.rb +0 -33
  584. data/test/transformer/spec_document-transformer.rb +0 -50
  585. data/test/transformer/spec_expr-transformer.rb +0 -126
  586. data/test/transformer/spec_feature-expr-transformer.rb +0 -21
  587. data/test/transformer/spec_flow-element-transformer.rb +0 -154
  588. data/test/transformer/spec_literal-transformer.rb +0 -64
  589. data/test/transformer/spec_rule-definition-transformer.rb +0 -172
  590. data/test/tuple-space/spec_data-finder.rb +0 -94
  591. data/test/tuple-space/spec_tuple-space-provider.rb +0 -36
  592. data/test/tuple-space/spec_tuple-space-receiver.rb +0 -32
  593. data/test/util/spec_error-report.rb +0 -51
@@ -0,0 +1,95 @@
1
+ module Pione
2
+ module Package
3
+ # ScenarioHandler handles scenario related operations.
4
+ class ScenarioHandler
5
+ include SimpleIdentity
6
+
7
+ attr_reader :location
8
+ attr_reader :info
9
+
10
+ # @param location [BasicLocation]
11
+ # scenario location
12
+ # @param info [Hash]
13
+ # scenario information table
14
+ def initialize(location, info)
15
+ @location = location
16
+ @info = info
17
+ end
18
+
19
+ # Write an information file for the scenario.
20
+ def write_info_file
21
+ (@location + "pione-scenario.json").write(JSON.pretty_generate(@info))
22
+ Log::SystemLog.info("write %s" % (@location + "pione-scenario.json").address)
23
+ end
24
+
25
+ # Return input location of the scenario. If the scenario doesn't have
26
+ # input location, return nil.
27
+ #
28
+ # @return [BasicLocation]
29
+ # the input location
30
+ def input
31
+ input_location = @location + "input"
32
+ return input_location.exist? ? input_location : nil
33
+ end
34
+
35
+ # Return list of input data location.
36
+ #
37
+ # @return [BasicLocation]
38
+ # input file locations
39
+ def inputs
40
+ info.inputs.map {|path| @location + path}
41
+ end
42
+
43
+ # Return the output location.
44
+ #
45
+ # @return [BasicLocation]
46
+ # the output location
47
+ def output
48
+ @location + "output"
49
+ end
50
+
51
+ # Return output file locations.
52
+ #
53
+ # @return [BasicLocation]
54
+ # output file locations
55
+ def outputs
56
+ @info.outputs.map {|path| @location + path}
57
+ end
58
+
59
+ # Validate reheasal results.
60
+ def validate(result_location)
61
+ return [] unless output.exist?
62
+
63
+ errors = []
64
+ output.entries.each do |entry|
65
+ name = entry.basename
66
+ result = result_location + name
67
+ if result.exist?
68
+ if entry.read != result.read
69
+ errors << RehearsalResult.new(:different, name)
70
+ end
71
+ else
72
+ errors << RehearsalResult.new(:not_exist, name)
73
+ end
74
+ end
75
+ return errors
76
+ end
77
+ end
78
+
79
+ # RehearsalResult represents error result of rehearsal test.
80
+ class RehearsalResult < StructX
81
+ member :key
82
+ member :name
83
+
84
+ # Create an error message.
85
+ def to_s
86
+ case key
87
+ when :different
88
+ "%s is different from expected result." % name
89
+ when :not_exist
90
+ "%s doesn't exist." % name
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,34 @@
1
+ module Pione
2
+ module Package
3
+ class ScenarioInfo < StructX
4
+ member :name
5
+ member :param_set
6
+ member :inputs, default: lambda {Array.new}
7
+ member :outputs, default: lambda {Array.new}
8
+
9
+ # Read the scenario information JSON source. The source is a string or
10
+ # location of the file.
11
+ def self.read(src)
12
+ data = JSON.load(src.is_a?(Location::DataLocation) ? src.read : src)
13
+ new(name: data["ScenarioName"], param_set: data["ParamSet"], inputs: data["Inputs"], outputs: data["Outputs"])
14
+ end
15
+
16
+ # Return file paths of the scenario.
17
+ def filepaths
18
+ list = []
19
+ list += inputs
20
+ list += outputs
21
+ return list
22
+ end
23
+
24
+ def to_json(*args)
25
+ data = Hash.new
26
+ data["ScenarioName"] = name
27
+ data["ParamSet"] = param_set
28
+ data["Inputs"] = inputs
29
+ data["Outputs"] = outputs
30
+ data.to_json(*args)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,29 @@
1
+ module Pione
2
+ module Package
3
+ # ScenarioReader is a reader for scenario location.
4
+ class ScenarioReader
5
+ class << self
6
+ def read(location)
7
+ new(location).read
8
+ end
9
+ end
10
+
11
+ def initialize(location)
12
+ @location = location
13
+ @document_location = @location + "Scenario.pione"
14
+ @info_location = @location + "pione-scenario.json"
15
+ end
16
+
17
+ def read
18
+ if @document_location.mtime > @info_location.mtime
19
+ # update the information file and make handler by it
20
+ new_info = ScenarioScanner.scan(@location)
21
+ return ScenarioHandler.new(@locaiton, new_info).tap {|handler| handler.write_info_file}
22
+ else
23
+ # make handler by informaiton file
24
+ ScenarioHandler.new(@location, ScenarioInfo.read(@info_location))
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,96 @@
1
+ module Pione
2
+ module Package
3
+ # ScenarioScanner scans scenario location.
4
+ class ScenarioScanner
5
+ class << self
6
+ def scenario?(location)
7
+ not(/^\./.match(location.basename)) and (location + "Scenario.pione").exist?
8
+ end
9
+
10
+ def scan(location)
11
+ new(location).scan
12
+ end
13
+ end
14
+
15
+ # Create a scanner with the location. The location should be local scheme.
16
+ def initialize(location)
17
+ unless location.local?
18
+ raise Location::NotLocal.new(location)
19
+ end
20
+ @location = location
21
+ end
22
+
23
+ # Scan the scenario directory and return scenario informations. If the
24
+ # location is not scenario directory, return false.
25
+ def scan
26
+ unless self.class.scenario?(@location)
27
+ return false
28
+ else
29
+ name, param_set = scan_annotations
30
+ inputs = scan_data_dir("input")
31
+ outputs = scan_data_dir("output")
32
+ ScenarioInfo.new(name: name, param_set: param_set, inputs: inputs, outputs: outputs)
33
+ end
34
+ rescue Parslet::ParseFailed => e
35
+ raise InvalidScenario.new("invalid scenario document because of parser failed: %s" % e.message)
36
+ end
37
+
38
+ # Scan annotations from scenario file and return scenario name and
39
+ # parameter set.
40
+ def scan_annotations
41
+ # setup fake language environment
42
+ env = Lang::Environment.new.setup_new_package("ScenarioScanner")
43
+
44
+ # parse the scenario document
45
+ Document.load(env, @location + "Scenario.pione", nil, nil, nil, @location + "Scenario.pione")
46
+
47
+ # get name and parameter set from fake package's annotations
48
+ annotations = env.package_get(Lang::PackageExpr.new(package_id: env.current_package_id)).annotations
49
+ name = find_name(annotations)
50
+ param_set = find_param_set(annotations)
51
+
52
+ return name, param_set
53
+ end
54
+
55
+ # Scan data files.
56
+ def scan_data_dir(name)
57
+ if (@location + name).exist?
58
+ (@location + name).file_entries.each_with_object([]) do |entry, target|
59
+ unless /^\./.match(entry.basename)
60
+ target << File.join(name, entry.basename)
61
+ end
62
+ end
63
+ else
64
+ return []
65
+ end
66
+ end
67
+
68
+ # Find "ScenarioName" annotaion.
69
+ def find_name(annotations)
70
+ names = annotations.select {|annotation| annotation.annotation_type == "ScenarioName"}
71
+ case names.size
72
+ when 0
73
+ raise InvalidScenario.new("No scenario name in %s" % (@location + "Scenario.pione"))
74
+ when 1
75
+ names.first.value
76
+ else
77
+ name_list = names.map {|name| name.value}.join(", ")
78
+ raise InvalidScenario.new("Multiple scenario names found: %s" % name_list)
79
+ end
80
+ end
81
+
82
+ # Find "ParamSet" annotaion.
83
+ def find_param_set(annotations)
84
+ param_sets = annotations.select {|annotation| annotation.annotation_type == "ParamSet"}
85
+ case param_sets.size
86
+ when 0
87
+ return nil
88
+ when 1
89
+ param_sets.first.value
90
+ else
91
+ raise InvalidScenario.new("Multiple parameter set found in %s" % @location.address)
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
data/lib/pione/patch.rb CHANGED
@@ -7,4 +7,3 @@ require 'pione/patch/array-patch'
7
7
  require 'pione/patch/drb-patch'
8
8
  require 'pione/patch/rinda-patch'
9
9
  require 'pione/patch/uri-patch'
10
- require 'pione/patch/monitor-patch'
@@ -1,241 +1,300 @@
1
- # @api private
2
- module DRb
3
- def waiter_table
4
- @waiter_table ||= Pione::Util::WaiterTable.new
5
- end
6
- module_function :waiter_table
7
-
8
- class DRbConnError
9
- attr_reader :args
10
-
11
- def initialize(*args)
12
- super
13
- @args = args
1
+ module Pione
2
+ module DRbPatch
3
+ #
4
+ # special protocol
5
+ #
6
+
7
+ # Return waiter table for the aim that clients enable to wait to receive the
8
+ # reply.
9
+ def self.waiter_table
10
+ @waiter_table ||= Pione::Util::WaiterTable.new
14
11
  end
15
- end
16
12
 
17
- class DRbObject
18
- # Creates fake connection for relay.
19
- def __connect
20
- DRbConn.open(@uri) {}
13
+ # ReplyReaderError is raised when reply reader happens something error. See
14
+ # +ReplyReader+ class.
15
+ class ReplyReaderError < RuntimeError
16
+ attr_reader :inner_exception
17
+
18
+ def initialize(exception)
19
+ @inner_exception = exception
20
+ end
21
21
  end
22
- end
23
22
 
24
- class DRbMessage
25
- alias :orig_initialize :initialize
23
+ class ReplyReader
24
+ def initialize
25
+ @watcher_lock = Mutex.new
26
+ @watchers = Set.new
27
+ end
26
28
 
27
- def initialize(*args)
28
- @send_request_lock = Mutex.new
29
- @recv_request_lock = Mutex.new
30
- @send_reply_lock = Mutex.new
31
- @recv_reply_lock = Mutex.new
32
- orig_initialize(*args)
33
- end
29
+ def start(protocol)
30
+ @thread ||= Thread.new do
31
+ begin
32
+ # loop for receiving reply and waiting the result
33
+ while true
34
+ # receive a replay
35
+ req_id, succ, result = protocol.recv_reply
36
+ # register it to waiter table
37
+ DRbPatch.waiter_table.push(req_id, [succ, result])
38
+ end
39
+ rescue => e
40
+ @watcher_lock.synchronize do
41
+ # pass the exception to watchers
42
+ @watchers.each do |watcher|
43
+ Log::Debug.communication("connection error happened in receiving reply.")
44
+ Log::Debug.communication(e)
45
+ watcher.raise(ReplyReaderError.new(e)) if watcher.alive?
46
+ end
34
47
 
35
- def send_request(stream, ref, msg_id, arg, b)
36
- req_id = Util::UUID.generate_int
37
- if Global.show_communication
38
- puts "send_request[%s] %s#%s(%s) on PID %s" % [req_id, ref.__drburi, msg_id, arg, Process.pid]
39
- end
40
- data = [
41
- dump(req_id),
42
- dump(ref.__drbref),
43
- dump(msg_id.id2name),
44
- dump(arg.length),
45
- arg.map{|e|dump(e)}.join(''),
46
- dump(b)
47
- ].join('')
48
- @send_request_lock.synchronize {stream.write(data)}
49
- return req_id
50
- rescue => e
51
- if Global.show_communication
52
- ErrorReport.print(e)
53
- end
54
- raise(DRbConnError, $!.message, $!.backtrace)
55
- end
48
+ # remove dead watchers
49
+ @watchers.delete_if {|watcher| not(watcher.alive?)}
50
+ end
51
+ end
52
+ end
53
+ end
56
54
 
57
- def recv_request(stream)
58
- if Global.show_communication
59
- puts "start recv_request on PID %s" % Process.pid
60
- end
61
- @recv_request_lock.synchronize do
62
- req_id = load(stream)
63
- ref = load(stream)
64
- msg_id = load(stream)
65
- argc = load(stream)
66
- # puts "req_id %s, ref %s, msg_id %s, argc %s" % [req_id, ref, msg_id, argc]
67
- ro = DRb.to_obj(ref)
68
- raise(DRbConnError, "too many arguments") if @argc_limit < argc
69
- argv = Array.new(argc, nil)
70
- argc.times do |n|
71
- argv[n] = load(stream)
55
+ # Makes reader thread for receiving unordered replies.
56
+ def add_watcher(watcher)
57
+ @watcher_lock.synchronize do
58
+ @watchers << watcher
72
59
  end
73
- block = load(stream)
74
- if Global.show_communication
75
- # puts "end recv_request[%s] %s#%s(%s) on %s" % [req_id, ref ? ref.__drburi : "", msg_id, argv, Process.pid]
60
+ end
61
+
62
+ # Remove the request reader thread watcher.
63
+ def remove_watcher(watcher)
64
+ @watcher_lock.synchronize do
65
+ @watchers.delete_if {|th| th == watcher}
76
66
  end
77
- return req_id, ro, msg_id, argv, block
78
67
  end
79
68
  end
80
69
 
81
- def send_reply(req_id, stream, succ, result)
82
- if Global.show_communication
83
- puts "start send_reply[%s] %s on PID %s" % [req_id, result, Process.pid]
84
- unless succ
85
- p result
86
- result.backtrace.each do |line|
87
- puts line
88
- end
89
- p result.args
90
- end
70
+ # +PioneTCPSocket+ is a reply reader thread extension for standard
71
+ # +DRbTCPSocket+.
72
+ class PioneTCPSocket < DRb::DRbTCPSocket
73
+ def initialize(uri, soc, config={})
74
+ super
75
+ @reply_reader = ReplyReader.new
91
76
  end
92
- @send_reply_lock.synchronize do
93
- stream.write(dump(req_id) + dump(succ) + dump(result, !succ))
77
+
78
+ # Send the request from client to server.
79
+ def send_request(ref, msg_id, arg, b)
80
+ # set watcher
81
+ @reply_reader.add_watcher(Thread.current)
82
+
83
+ # send the request
84
+ req_id = @msg.send_request(stream, ref, msg_id, arg, b)
85
+
86
+ # start reply reader
87
+ @reply_reader.start(self)
88
+
89
+ # wait the reply by using watier table
90
+ succ, result = Pione::DRbPatch.waiter_table.take(req_id, msg_id, arg)
91
+
92
+ # remove watcher
93
+ @reply_reader.remove_watcher(Thread.current)
94
+
95
+ return succ, result
94
96
  end
95
- if Global.show_communication
96
- puts "end send_reply[%s] %s on PID %s" % [req_id, result, Process.pid]
97
+
98
+ # Send the reply with request id. Note: this overrides original +send_rely+.
99
+ def send_reply(req_id, succ, result)
100
+ @msg.send_reply(req_id, stream, succ, result)
97
101
  end
98
- rescue
99
- raise(DRbConnError, $!.message, $!.backtrace)
100
- end
101
102
 
102
- def recv_reply(stream)
103
- if Global.show_communication
104
- puts "start recv_reply on PID %s" % Process.pid
103
+ # Return true if connection socket exists.
104
+ def alive?
105
+ return (@socket and not(@socket.closed?))
105
106
  end
106
- @recv_reply_lock.synchronize do
107
- req_id = load(stream)
108
- succ = load(stream)
109
- result = load(stream)
110
- if Global.show_communication
111
- puts "end recv_reply[%s] on PID %s" % [req_id, Process.pid]
107
+ end
108
+
109
+ # +PioneDRbMessage+ is a special protocol for +PioneTCPSocket+.
110
+ class PioneDRbMessage < DRb::DRbMessage
111
+ def initialize(*args)
112
+ @send_request_lock = Mutex.new
113
+ @recv_request_lock = Mutex.new
114
+ @send_reply_lock = Mutex.new
115
+ @recv_reply_lock = Mutex.new
116
+ super
117
+ end
118
+
119
+ # Send a request to the stream. This is different from original at the
120
+ # point that patched version has request id.
121
+ def send_request(stream, ref, msg_id, arg, b)
122
+ # generate a new request id
123
+ req_id = Util::UUID.generate_int
124
+
125
+ # show debug message
126
+ Log::Debug.communication do
127
+ "client sends a request %s#%s (fd: %s, req_id: %s)" % [ref.__drburi, msg_id, stream.to_i, req_id]
112
128
  end
113
- return req_id, succ, result
129
+
130
+ # make a dumped request sequece(request id, ref, msg_id, argc, argv, b)
131
+ data = [
132
+ req_id, ref.__drbref, msg_id.id2name, arg.length, *arg, b
133
+ ].map{|elt| dump(elt)}.join('')
134
+
135
+ @send_request_lock.synchronize {stream.write(data)}
136
+
137
+ return req_id
138
+ rescue => e
139
+ Log::Debug.communication "following error happened while we send request"
140
+ Log::Debug.communication e
141
+ raise DRb::DRbConnError.new, $!.message, $!.backtrace
114
142
  end
115
- end
116
- end
117
143
 
118
- class ReplyReaderThreadError < RuntimeError
119
- attr_reader :inner_exception
144
+ # Receive request from the stream. See +ClientReuqest+.
145
+ def recv_request(stream)
146
+ Log::Debug.communication "server tries to receive a request... (fd: %s)" % stream.to_i
120
147
 
121
- def initialize(exception)
122
- @inner_exception = exception
123
- end
124
- end
148
+ @recv_request_lock.synchronize do
149
+ # read requst id, object id, method name, and arguments size
150
+ req_id = load(stream)
151
+ ref = load(stream)
152
+ msg_id = load(stream)
153
+ argc = load(stream)
125
154
 
126
- class DRbTCPSocket
127
- # Makes reader thread for receiving unordered replies.
128
- def reader_thread(watcher)
129
- @watcher_mutex ||= Mutex.new
130
- @watchers ||= Set.new
131
- @watchers << watcher
132
- @thread ||= Thread.new do
133
- begin
134
- # loop for receiving reply and waiting the result
135
- while true
136
- req_id, succ, result = recv_reply
137
- DRb.waiter_table.push(req_id, [succ, result])
155
+ Log::Debug.communication do
156
+ "server received a request (fd: %s, req_id: %s, ref: %s, msg_id: %s)" % [stream.to_i, req_id, ref.to_s, msg_id]
138
157
  end
139
- rescue => e
140
- @watcher_mutex.synchronize do
141
- @watchers.each do |watcher|
142
- if watcher.alive?
143
- watcher.raise(ReplyReaderThreadError.new(e))
144
- end
145
- end
146
- @watchers.delete_if {|watcher| not(watcher.alive?)}
158
+
159
+ # check arguement size
160
+ raise DRb::DRbConnError.new("too many arguments") if @argc_limit < argc
161
+
162
+ ro = nil
163
+ available = true
164
+
165
+ # refer to object
166
+ begin
167
+ ro = DRb.to_obj(ref)
168
+ rescue RangeError => e
169
+ Log::Debug.system("bad object id \"%s\" is referred (msg_id: %s)" % [ref, msg_id])
170
+ available = false
147
171
  end
172
+
173
+ # build arguments
174
+ argv = Array.new(argc, nil)
175
+ argc.times {|n| argv[n] = load(stream)}
176
+
177
+ # read block
178
+ block = load(stream)
179
+
180
+ return req_id, ro, msg_id, argv, block, available
148
181
  end
149
182
  end
150
- end
151
183
 
152
- def remove_reader_thread_watcher(watcher)
153
- @watcher_mutex ||= Mutex.new
154
- @watcher_mutex.synchronize do
155
- @watchers.delete_if {|th| th == watcher}
156
- end
157
- end
184
+ # Send the reply.
185
+ def send_reply(req_id, stream, succ, result)
186
+ Log::Debug.communication {
187
+ "server sends a reply (fd: %s, req_id: %s, result: %s)" % [stream.to_i, req_id, result]
188
+ }
158
189
 
159
- # req_id
160
- def send_reply(req_id, succ, result)
161
- @msg.send_reply(req_id, stream, succ, result)
162
- end
190
+ # build a reply data
191
+ data = dump(req_id) + dump(succ) + dump(result, !succ)
163
192
 
164
- def alive?
165
- return @socket ? true : false
166
- end
167
- end
193
+ @send_reply_lock.synchronize {stream.write(data)}
194
+ rescue
195
+ raise DRb::DRbConnError, $!.message, $!.backtrace
196
+ end
168
197
 
169
- class DRbConn
170
- @table = {}
171
- @retry = {}
198
+ # Receive a reply(request id, succ, and result) from the stream.
199
+ def recv_reply(stream)
200
+ Log::Debug.communication do
201
+ "client tries to receive a reply... (fd: %s)" % stream.to_i
202
+ end
172
203
 
173
- def self.table
174
- @table
175
- end
204
+ @recv_reply_lock.synchronize do
205
+ req_id = load(stream)
206
+ succ = load(stream)
207
+ result = load(stream)
208
+
209
+ Log::Debug.communication(
210
+ "client received a reply (fd: %s, req_id: %s)" % [stream.to_i, req_id]
211
+ )
176
212
 
177
- def self.clear_table
178
- @table.values do |val|
179
- val.close rescue nil
213
+ return req_id, succ, result
214
+ end
180
215
  end
181
- @table.clear
182
216
  end
183
217
 
184
- # @api private
185
- def self.open(remote_uri)
186
- conn = nil
218
+ # +PioneDRbConn+ provides connections to +DRb::DRbObject+. This class is
219
+ # different from original +DRbConn+ at the point of connection reuse.
220
+ class PioneDRbConn < DRb::DRbConn
221
+ @cache = {} # connection table
222
+ @retry = {} # retrial counter
223
+ @mutex = Mutex.new # same as original's
187
224
 
188
- @mutex.synchronize do
189
- cache = @table[remote_uri]
190
- if not(cache.nil?) and cache.alive?
191
- conn = cache
192
- else
193
- if Global.show_communication
194
- puts "new connection to %s on %s" % [remote_uri, Process.pid] if remote_uri
225
+ class << self
226
+ attr_reader :cache
227
+
228
+ # Clear connection cache table.
229
+ def clear_cache
230
+ @cache.values {|connection| connection.close rescue nil}
231
+ @cache.clear
232
+ end
233
+
234
+ # Open a remote URI. This method reuse connection if the URI is cached.
235
+ def open(remote_uri)
236
+ conn = nil
237
+
238
+ @mutex.synchronize do
239
+ cache = @cache[remote_uri]
240
+
241
+ # get connection
242
+ if not(cache.nil?) and cache.alive?
243
+ conn = cache # use cached connection
244
+ else
245
+ conn = self.new(remote_uri) # create a new connection
246
+ Log::Debug.communication "client created a new connection to %s" % remote_uri.inspect
247
+ end
248
+ @cache[remote_uri] = conn
249
+ end
250
+
251
+ succ, result = yield(conn)
252
+ @retry[remote_uri] = 0
253
+ return succ, result
254
+ rescue DRb::DRbConnError, ReplyReaderError, Errno::ECONNREFUSED => e
255
+ Log::Debug.communication "client failed to open a connection to %s." % remote_uri
256
+ @mutex.synchronize do
257
+ if @cache[remote_uri]
258
+ @cache[remote_uri].close
259
+ @cache.delete(remote_uri)
260
+ end
261
+ @retry[remote_uri] ||= 0
262
+ @retry[remote_uri] += 1
263
+ end
264
+ if @retry[remote_uri] < 6
265
+ sleep 0.1
266
+ retry
267
+ else
268
+ raise
195
269
  end
196
- conn = self.new(remote_uri) unless conn
197
270
  end
198
- @table[remote_uri] = conn
199
271
  end
200
272
 
201
- succ, result = yield(conn)
202
- @retry[remote_uri] = 0
203
- return succ, result
204
- rescue DRb::DRbConnError, DRb::ReplyReaderThreadError
205
- @table.delete(remote_uri)
206
- @retry[remote_uri] ||= 0
207
- @retry[remote_uri] += 1
208
- if @retry[remote_uri] < 5
209
- retry
210
- else
211
- raise
273
+ # Close the client-to-server socket.
274
+ def close
275
+ Log::Debug.communication("client closed the socket")
276
+ unless @closed
277
+ @closed = true
278
+ self.class.cache.delete(@uri)
279
+ super
280
+ end
212
281
  end
213
- end
214
282
 
215
- alias :orig_close :close
216
-
217
- def close
218
- if Global.show_communication
219
- puts "socket closed on %s" % Process.pid
220
- end
221
- unless @closed
222
- @closed = true
223
- self.class.table.delete(remote_uri)
224
- orig_close
283
+ # Send the message from client to server.
284
+ def send_message(ref, msg_id, arg, block)
285
+ @protocol.send_request(ref, msg_id, arg, block)
225
286
  end
226
287
  end
227
288
 
228
- # Sends a request and takes the result from waiter table.
229
- def send_message(ref, msg_id, arg, block)
230
- req_id = @protocol.send_request(ref, msg_id, arg, block)
231
- @protocol.reader_thread(Thread.current)
232
- succ, result = DRb.waiter_table.take(req_id, msg_id, arg)
233
- @protocol.remove_reader_thread_watcher(Thread.current)
234
- return succ, result
289
+ #
290
+ # special server
291
+ #
292
+
293
+ # BadRequestError is raised when the object id requested by client is
294
+ # unknonw in server.
295
+ class BadRequestError < StandardError
235
296
  end
236
- end
237
297
 
238
- class DRbServer
239
298
  # ClientRequest represents client's requests.
240
299
  class ClientRequest
241
300
  def self.receive(client)
@@ -247,17 +306,23 @@ module DRb
247
306
  attr_reader :msg_id
248
307
  attr_reader :argv
249
308
  attr_reader :block
309
+ attr_reader :available
250
310
 
251
- def initialize(req_id, obj, msg_id, argv, block)
311
+ def initialize(req_id, obj, msg_id, argv, block, available)
252
312
  @req_id = req_id
253
313
  @obj = obj
254
314
  @msg_id = msg_id.intern
255
315
  @argv = argv
256
316
  @block = block
317
+ @available = available
257
318
  end
258
319
 
259
320
  def eval
260
- @block ? eval_with_block : eval_without_block
321
+ if @available
322
+ @block ? eval_with_block : eval_without_block
323
+ else
324
+ raise BadRequestError
325
+ end
261
326
  end
262
327
 
263
328
  private
@@ -307,28 +372,31 @@ module DRb
307
372
  end
308
373
  end
309
374
 
310
- class Invoker
311
- extend Forwardable
312
-
313
- attr_accessor :thread
314
- def_delegators :@request, :req_id, :obj, :msg_id, :argv, :block
315
-
316
- def initialize(drb_server, client, request)
317
- @drb_server = drb_server
375
+ class RequestInvoker
376
+ def initialize(server, client, request)
377
+ @server = server
318
378
  @client = client
319
379
  @request = request
320
380
  check_insecure_method
321
381
  end
322
382
 
323
- # @api private
324
- def inspect
325
- "#<Invoker %s#%s(%s)>" % [@request.obj, @request.msg_id, @request.argv]
383
+ def invoke
384
+ # evaluate request
385
+ succ, result = execute_request
386
+
387
+ # send_reply with req_id
388
+ begin
389
+ @client.send_reply(@request.req_id, succ, result)
390
+ rescue => e
391
+ Log::Debug.system("it happened communication failure in sending reply(req_id: %s): %s" % [@request.req_id, e.message])
392
+ end
326
393
  end
327
- alias :to_s :inspect
394
+
395
+ private
328
396
 
329
397
  # perform without setup_message
330
- def invoke
331
- result = safe_invoke
398
+ def execute_request
399
+ result = eval_request
332
400
  if @request.msg_id == :to_ary && result.class == Array
333
401
  result = DRbArray.new(result)
334
402
  end
@@ -337,131 +405,142 @@ module DRb
337
405
  return false, e
338
406
  end
339
407
 
340
- private
341
-
342
408
  def check_insecure_method
343
- @drb_server.check_insecure_method(@request.obj, @request.msg_id)
409
+ @server.check_insecure_method(@request.obj, @request.msg_id)
344
410
  end
345
411
 
346
- def safe_invoke
347
- if $SAFE < @drb_server.safe_level
348
- info = Thread.current['DRb']
349
- Thread.new do
350
- Thread.current['DRb'] = info
351
- $SAFE = @drb_server.safe_level
352
- @request.eval
353
- end.value
354
- else
355
- @request.eval
356
- end
412
+ def eval_request
413
+ $SAFE < @server.safe_level ? safe_eval_request : unsafe_eval_request
357
414
  end
358
- end
359
415
 
360
- class RequestLooper
361
- def self.start(server, client)
362
- self.new(server).start(client)
416
+ # Execute the request within sandbox.
417
+ def safe_eval_request
418
+ info = Thread.current['DRb']
419
+ Thread.new do
420
+ # import DRb info to the sandbox
421
+ Thread.current['DRb'] = info
422
+
423
+ # make sandbox
424
+ $SAFE = @drb_server.safe_level
425
+
426
+ # invoke request
427
+ unsafe_request_invoke
428
+ end.value
363
429
  end
364
430
 
431
+ # Execute the request.
432
+ def unsafe_eval_request
433
+ @request.eval
434
+ end
435
+ end
436
+
437
+ # RequestLooper is a receiver of client request. This is different from
438
+ # standard DRb's +main_loop+ at the point that this method doesn't need to
439
+ # wait finishing evaluation of request and reply.
440
+ class RequestLooper
365
441
  def initialize(server)
366
442
  @server = server
367
443
  end
368
444
 
369
445
  def start(client)
370
- Thread.current['DRb'] = {'client' => client, 'server' => @server}
371
- @server.add_exported_uri(client.uri)
372
-
373
- loop {handle_request(client)}
446
+ loop {handle_client_request(client)}
374
447
  end
375
448
 
376
449
  private
377
450
 
378
- def handle_request(client)
451
+ def handle_client_request(client)
452
+ # take request from client
379
453
  request = ClientRequest.receive(client)
380
- invoker = Invoker.new(@server, client, request)
381
- Thread.start(invoker) do |iv|
382
- Thread.current['DRb'] = {'client' => client, 'server' => @server}
383
- call_invoker(client, iv)
384
- end
385
- rescue DRbConnError => e
454
+
455
+ # run invoker
456
+ invoker = RequestInvoker.new(@server, client, request)
457
+ @server.invoker_threads.add(Thread.new{invoker.invoke})
458
+ rescue DRb::DRbConnError => e
459
+ Log::Debug.communication("server was disconnected from client because of connection error")
386
460
  client.close
387
- if Global.show_communication
388
- puts "closed socket on server side"
389
- ErrorReport.print(e)
390
- end
391
461
  raise StopIteration
392
462
  end
463
+ end
393
464
 
394
- def call_invoker(client, invoker)
395
- # perform invoker with retaining the information
396
- invoker.thread = Thread.current
397
- @server.invokers_mutex.synchronize {@server.invokers << invoker}
398
- succ, result = invoker.invoke
399
- @server.invokers_mutex.synchronize {@server.invokers.delete(invoker)}
400
- invoker.thread = nil
465
+ class PioneDRbServer < DRb::DRbServer
466
+ attr_reader :invoker_threads
401
467
 
402
- # error report
403
- if !succ && Global.show_communication
404
- result.backtrace.each {|x| puts x}
405
- end
468
+ def initialize(uri=nil, front=nil, config_or_acl=nil)
469
+ # current performing invokers
470
+ @invoker_threads = ThreadGroup.new
406
471
 
407
- # send_reply with req_id
408
- client.send_reply(invoker.req_id, succ, result) rescue nil
472
+ super
409
473
  end
410
- end
411
474
 
412
- def main_loop
413
- if @protocol.uri =~ /^receiver:/
414
- RequestLooper.start(self, @protocol)
415
- # stop transceiver
416
- @thread.kill.join
417
- else
418
- Thread.start(@protocol.accept) do |client|
419
- # relay socket doesn't need request receiver loop because its aim is
420
- # to get connection only
421
- unless @protocol.kind_of?(RelaySocket)
422
- RequestLooper.start(self, client)
475
+ def main_loop
476
+ if @protocol.uri =~ /^receiver:/
477
+ RequestLooper.start(self, @protocol)
478
+ @thread.kill.join # stop transceiver
479
+ else
480
+ Thread.start(@protocol.accept) do |client|
481
+ # relay socket doesn't need request receiver loop because its aim is
482
+ # to get connection only
483
+ unless @protocol.kind_of?(Pione::Relay::RelaySocket)
484
+ # set DRb info to current thread
485
+ Thread.current['DRb'] = {'client' => client, 'server' => self}
486
+
487
+ # add exported uri
488
+ DRb.mutex.synchronize do
489
+ client_uri = client.uri
490
+ @exported_uri << client_uri unless @exported_uri.include?(client_uri)
491
+ end
492
+
493
+ # start request loop
494
+ RequestLooper.new(self).start(client)
495
+ end
423
496
  end
424
497
  end
425
- end
426
- end
427
498
 
428
- attr_reader :invokers
429
- attr_reader :invokers_mutex
499
+ def stop_service
500
+ # stop invokers
501
+ @invoker_threads.list.each {|thread| thread.kill.join}
430
502
 
431
- def initialize(uri=nil, front=nil, config_or_acl=nil)
432
- if Hash === config_or_acl
433
- config = config_or_acl.dup
434
- else
435
- acl = config_or_acl || @@acl
436
- config = {
437
- :tcp_acl => acl
438
- }
503
+ # stop main loop etc.
504
+ super
505
+ end
439
506
  end
507
+ end
508
+ end
509
+ end
440
510
 
441
- @config = self.class.make_config(config)
442
-
443
- @protocol = DRbProtocol.open_server(uri, @config)
444
- @uri = @protocol.uri
445
- @exported_uri = [@uri]
446
-
447
- @front = front
448
- @idconv = @config[:idconv]
449
- @safe_level = @config[:safe_level]
450
-
451
- @grp = ThreadGroup.new
452
- @thread = run
453
-
454
- # current performing invokers
455
- @invokers = []
456
- @invokers_mutex = Mutex.new
511
+ # @api private
512
+ module DRb
513
+ class DRbConnError
514
+ attr_reader :args
457
515
 
458
- DRb.regist_server(self)
516
+ def initialize(*args)
517
+ super
518
+ @args = args
459
519
  end
520
+ end
460
521
 
461
- def add_exported_uri(uri)
462
- DRb.mutex.synchronize do
463
- @exported_uri << uri unless @exported_uri.include?(uri)
464
- end
522
+ class DRbObject
523
+ # Creates fake connection for relay.
524
+ def __connect
525
+ DRbConn.open(@uri) {}
465
526
  end
466
527
  end
528
+
529
+ # change default protocol
530
+ module DRbProtocol
531
+ @protocol.delete(DRbTCPSocket)
532
+ add_protocol(Pione::DRbPatch::PioneTCPSocket)
533
+ end
534
+
535
+ # replace some classes
536
+ __verbose__ = $VERBOSE
537
+ $VERBOSE = nil
538
+ # patch DRbConn for special protocol
539
+ const_set :DRbConn, Pione::DRbPatch::PioneDRbConn
540
+ # patch DRbMessage for special protocol
541
+ const_set :DRbMessage, Pione::DRbPatch::PioneDRbMessage
542
+ # patch for threaded request invocations
543
+ const_set :DRbServer, Pione::DRbPatch::PioneDRbServer
544
+ $VERBOSE = __verbose__
467
545
  end
546
+