pione 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +1 -0
- data/.simplecov +1 -0
- data/History.txt +9 -0
- data/Rakefile +1 -71
- data/example/Fib/Fib.pione +9 -8
- data/example/HelloWorld/HelloWorld.pione +2 -0
- data/example/HelloWorld/pione-package.json +15 -0
- data/example/HelloWorld/scenario/Scenario.pione +2 -0
- data/example/HelloWorld/scenario/pione-scenario.json +10 -0
- data/example/SerialProcessing/SerialProcessing.pione +2 -0
- data/example/SerialProcessing/pione-package.json +15 -0
- data/example/SerialProcessing/scenario/Scenario.pione +1 -0
- data/example/SerialProcessing/scenario/pione-scenario.json +10 -0
- data/lib/pione.rb +28 -35
- data/lib/pione/agent.rb +4 -4
- data/lib/pione/agent/agent-exception.rb +52 -0
- data/lib/pione/agent/basic-agent.rb +246 -239
- data/lib/pione/agent/broker.rb +232 -216
- data/lib/pione/agent/input-generator.rb +113 -133
- data/lib/pione/agent/job-terminator.rb +38 -0
- data/lib/pione/agent/logger.rb +24 -54
- data/lib/pione/agent/messenger.rb +11 -16
- data/lib/pione/agent/process-manager.rb +50 -19
- data/lib/pione/agent/task-worker.rb +126 -236
- data/lib/pione/agent/tuple-space-client.rb +16 -39
- data/lib/pione/agent/tuple-space-provider.rb +66 -0
- data/lib/pione/agent/tuple-space-receiver.rb +137 -0
- data/lib/pione/command.rb +2 -3
- data/lib/pione/command/basic-command.rb +347 -207
- data/lib/pione/command/command-exception.rb +38 -0
- data/lib/pione/command/option.rb +112 -104
- data/lib/pione/command/pione-broker.rb +85 -43
- data/lib/pione/command/pione-clean.rb +51 -8
- data/lib/pione/command/pione-client.rb +321 -292
- data/lib/pione/command/pione-log.rb +92 -53
- data/lib/pione/command/pione-package.rb +112 -59
- data/lib/pione/command/pione-relay-account-db.rb +107 -78
- data/lib/pione/command/pione-relay-client-db.rb +93 -72
- data/lib/pione/command/pione-relay.rb +37 -32
- data/lib/pione/command/pione-syntax-checker.rb +112 -87
- data/lib/pione/command/pione-task-worker.rb +135 -118
- data/lib/pione/command/pione-tuple-space-provider.rb +83 -50
- data/lib/pione/command/pione-tuple-space-receiver.rb +89 -50
- data/lib/pione/command/pione-tuple-space-viewer.rb +101 -99
- data/lib/pione/command/pione-val.rb +50 -29
- data/lib/pione/command/spawner.rb +74 -0
- data/lib/pione/front.rb +0 -2
- data/lib/pione/front/basic-front.rb +48 -26
- data/lib/pione/front/broker-front.rb +8 -16
- data/lib/pione/front/client-front.rb +10 -18
- data/lib/pione/front/front-exception.rb +12 -0
- data/lib/pione/front/relay-front.rb +6 -6
- data/lib/pione/front/task-worker-front.rb +3 -9
- data/lib/pione/front/tuple-space-provider-front.rb +6 -14
- data/lib/pione/front/tuple-space-receiver-front.rb +4 -11
- data/lib/pione/global.rb +135 -0
- data/lib/pione/global/broker-variable.rb +20 -0
- data/lib/pione/global/client-variable.rb +18 -0
- data/lib/pione/global/input-generator-variable.rb +7 -0
- data/lib/pione/global/log-variable.rb +53 -0
- data/lib/pione/global/network-variable.rb +7 -0
- data/lib/pione/global/package-variable.rb +28 -0
- data/lib/pione/global/path-variable.rb +52 -0
- data/lib/pione/global/relay-variable.rb +86 -0
- data/lib/pione/global/system-variable.rb +39 -0
- data/lib/pione/global/task-worker-variable.rb +17 -0
- data/lib/pione/global/tuple-space-notifier-variable.rb +60 -0
- data/lib/pione/lang.rb +55 -0
- data/lib/pione/lang/basic-model.rb +45 -0
- data/lib/pione/lang/boolean.rb +86 -0
- data/lib/pione/lang/common-parser.rb +202 -0
- data/lib/pione/lang/conditional-branch-parser.rb +57 -0
- data/lib/pione/lang/conditional-branch-transformer.rb +36 -0
- data/lib/pione/lang/conditional-branch.rb +73 -0
- data/lib/pione/lang/context-parser.rb +39 -0
- data/lib/pione/lang/context-transformer.rb +41 -0
- data/lib/pione/lang/context.rb +229 -0
- data/lib/pione/lang/data-expr.rb +265 -0
- data/lib/pione/lang/declaration-parser.rb +174 -0
- data/lib/pione/lang/declaration-transformer.rb +153 -0
- data/lib/pione/lang/declaration.rb +322 -0
- data/lib/pione/lang/definition.rb +88 -0
- data/lib/pione/lang/document-parser.rb +19 -0
- data/lib/pione/lang/document-transformer.rb +12 -0
- data/lib/pione/lang/environment.rb +344 -0
- data/lib/pione/{parser → lang}/error-message.yml +0 -0
- data/lib/pione/lang/expr-parser.rb +228 -0
- data/lib/pione/{transformer → lang}/expr-transformer.rb +32 -44
- data/lib/pione/lang/expr.rb +70 -0
- data/lib/pione/lang/feature-expr.rb +425 -0
- data/lib/pione/lang/float.rb +104 -0
- data/lib/pione/lang/integer.rb +159 -0
- data/lib/pione/lang/interpolator-parser.rb +44 -0
- data/lib/pione/lang/interpolator-transformer.rb +13 -0
- data/lib/pione/lang/keyed-sequence.rb +98 -0
- data/lib/pione/lang/lang-exception.rb +224 -0
- data/lib/pione/lang/literal-parser.rb +134 -0
- data/lib/pione/lang/literal-transformer.rb +171 -0
- data/lib/pione/lang/message.rb +41 -0
- data/lib/pione/lang/ordinal-sequence.rb +203 -0
- data/lib/pione/lang/package-expr.rb +86 -0
- data/lib/pione/lang/parameters.rb +121 -0
- data/lib/pione/lang/piece.rb +42 -0
- data/lib/pione/{model → lang}/pione-method.rb +26 -63
- data/lib/pione/lang/rule-expr.rb +70 -0
- data/lib/pione/lang/sequence.rb +215 -0
- data/lib/pione/lang/string.rb +116 -0
- data/lib/pione/lang/ticket-expr.rb +48 -0
- data/lib/pione/{model → lang}/type.rb +70 -99
- data/lib/pione/lang/variable.rb +35 -0
- data/lib/pione/location.rb +13 -1
- data/lib/pione/{uri-scheme → location}/broadcast-scheme.rb +2 -2
- data/lib/pione/location/data-location.rb +22 -5
- data/lib/pione/location/dropbox-location.rb +10 -8
- data/lib/pione/{uri-scheme → location}/dropbox-scheme.rb +2 -2
- data/lib/pione/location/ftp-location.rb +6 -0
- data/lib/pione/location/git-repository-location.rb +6 -17
- data/lib/pione/{uri-scheme → location}/git-scheme.rb +2 -2
- data/lib/pione/location/http-location.rb +8 -1
- data/lib/pione/location/local-location.rb +57 -4
- data/lib/pione/{uri-scheme → location}/local-scheme.rb +2 -2
- data/lib/pione/location/{exception.rb → location-exception.rb} +13 -1
- data/lib/pione/{uri-scheme/basic-scheme.rb → location/location-scheme.rb} +7 -6
- data/lib/pione/{uri-scheme → location}/myftp-scheme.rb +2 -2
- data/lib/pione/log.rb +7 -6
- data/lib/pione/log/debug.rb +75 -0
- data/lib/pione/log/domain-log.rb +4 -5
- data/lib/pione/log/message-log.rb +2 -2
- data/lib/pione/log/process-log.rb +16 -25
- data/lib/pione/log/process-record.rb +1 -0
- data/lib/pione/log/system-log.rb +165 -55
- data/lib/pione/package.rb +21 -0
- data/lib/pione/package/document.rb +27 -0
- data/lib/pione/package/package-archiver.rb +152 -0
- data/lib/pione/package/package-cache.rb +79 -0
- data/lib/pione/package/package-database.rb +121 -0
- data/lib/pione/package/package-exception.rb +38 -0
- data/lib/pione/{component → package}/package-expander.rb +13 -7
- data/lib/pione/package/package-filename.rb +46 -0
- data/lib/pione/package/package-handler.rb +106 -0
- data/lib/pione/package/package-info.rb +72 -0
- data/lib/pione/package/package-reader.rb +202 -0
- data/lib/pione/package/package-scanner.rb +133 -0
- data/lib/pione/package/scenario-handler.rb +95 -0
- data/lib/pione/package/scenario-info.rb +34 -0
- data/lib/pione/package/scenario-reader.rb +29 -0
- data/lib/pione/package/scenario-scanner.rb +96 -0
- data/lib/pione/patch.rb +0 -1
- data/lib/pione/patch/drb-patch.rb +377 -298
- data/lib/pione/patch/rinda-patch.rb +4 -3
- data/lib/pione/relay/relay-socket.rb +1 -4
- data/lib/pione/rule-engine.rb +27 -0
- data/lib/pione/{rule-handler → rule-engine}/action-handler.rb +41 -40
- data/lib/pione/rule-engine/basic-handler.rb +266 -0
- data/lib/pione/rule-engine/data-finder.rb +97 -0
- data/lib/pione/{rule-handler → rule-engine}/empty-handler.rb +2 -3
- data/lib/pione/rule-engine/engine-exception.rb +33 -0
- data/lib/pione/rule-engine/flow-handler.rb +490 -0
- data/lib/pione/{rule-handler → rule-engine}/root-handler.rb +5 -14
- data/lib/pione/{rule-handler → rule-engine}/system-handler.rb +1 -1
- data/lib/pione/rule-engine/update-criteria.rb +111 -0
- data/lib/pione/system.rb +3 -1
- data/lib/pione/system/config.rb +12 -45
- data/lib/pione/system/domain-info.rb +3 -12
- data/lib/pione/system/init.rb +2 -8
- data/lib/pione/system/system-exception.rb +29 -0
- data/lib/pione/test-helper.rb +43 -0
- data/lib/pione/test-helper/command-helper.rb +65 -0
- data/lib/pione/test-helper/extension.rb +9 -0
- data/lib/pione/test-helper/lang-helper.rb +196 -0
- data/lib/pione/test-helper/location-helper.rb +27 -0
- data/lib/pione/test-helper/package-helper.rb +11 -0
- data/lib/pione/test-helper/parser-helper.rb +45 -0
- data/lib/pione/test-helper/transformer-helper.rb +136 -0
- data/lib/pione/test-helper/tuple-helper.rb +13 -0
- data/lib/pione/test-helper/tuple-space-helper.rb +31 -0
- data/lib/pione/test-helper/webserver.rb +50 -0
- data/lib/pione/tuple-space.rb +4 -6
- data/lib/pione/{tuple → tuple-space}/basic-tuple.rb +63 -50
- data/lib/pione/tuple-space/tuple-definition.yml +165 -0
- data/lib/pione/tuple-space/tuple-space-exception.rb +25 -0
- data/lib/pione/tuple-space/tuple-space-interface.rb +123 -0
- data/lib/pione/tuple-space/tuple-space-server.rb +15 -26
- data/lib/pione/util.rb +16 -11
- data/lib/pione/util/backslash-notation.rb +11 -0
- data/lib/pione/util/digest.rb +71 -0
- data/lib/pione/util/embeded-expr-expander.rb +23 -0
- data/lib/pione/util/evaluatable.rb +9 -6
- data/lib/pione/util/free-thread-generator.rb +46 -0
- data/lib/pione/util/ftp-server.rb +3 -4
- data/lib/pione/util/id.rb +28 -23
- data/lib/pione/util/misc.rb +22 -4
- data/lib/pione/util/package-parameters-list.rb +12 -9
- data/lib/pione/{parser → util}/parslet-extension.rb +75 -64
- data/lib/pione/util/positionable.rb +65 -0
- data/lib/pione/util/zip.rb +12 -11
- data/lib/pione/version.rb +1 -1
- data/{test → misc}/endurance-test/graph.plt +0 -0
- data/{test → misc}/endurance-test/run.sh +0 -0
- data/pione.gemspec +45 -37
- data/test/agent/spec_basic-agent.rb +116 -99
- data/test/agent/spec_broker.rb +41 -25
- data/test/agent/spec_input-generator.rb +66 -57
- data/test/agent/spec_job-terminator.rb +27 -0
- data/test/agent/spec_logger.rb +28 -25
- data/test/agent/spec_messenger.rb +6 -6
- data/test/agent/spec_task-worker.rb +97 -246
- data/test/agent/spec_tuple-space-client.rb +19 -15
- data/test/agent/spec_tuple-space-provider.rb +26 -0
- data/test/agent/spec_tuple-space-receiver.rb +47 -0
- data/test/command/command-behavior.rb +2 -2
- data/test/command/data/PionePackageP1/P1.pione +9 -0
- data/test/command/data/PionePackageP1/pione-package.json +15 -0
- data/test/command/data/PionePackageP2/P2.pione +10 -0
- data/test/command/data/PionePackageP2/pione-package.json +16 -0
- data/test/command/data/PionePackageP3/P3.pione +10 -0
- data/test/command/data/PionePackageP3/pione-package.json +16 -0
- data/test/command/data/PionePackageP4/P4.pione +10 -0
- data/test/command/data/PionePackageP4/pione-package.json +17 -0
- data/test/command/data/pione-process.log +471 -0
- data/test/command/data/pione-val.domain.dump +0 -0
- data/test/command/spec_pione-clean.rb +12 -0
- data/test/command/spec_pione-client.rb +6 -6
- data/test/command/spec_pione-log.rb +28 -0
- data/test/command/spec_pione-package.rb +111 -12
- data/test/command/spec_pione-val.rb +4 -4
- data/test/lang/data/boolean.yml +134 -0
- data/test/lang/data/common-parser.yml +187 -0
- data/test/{parser/spec_flow-element-parser.yml → lang/data/conditional-branch-parser.yml} +12 -50
- data/test/lang/data/context-parser.yml +148 -0
- data/test/lang/data/data-expr.yml +93 -0
- data/test/lang/data/data-expr_match.yml +59 -0
- data/test/lang/data/declaration-parser.yml +279 -0
- data/test/lang/data/document-parser.yml +29 -0
- data/test/{parser/spec_expr-parser.yml → lang/data/expr-parser.yml} +9 -11
- data/test/lang/data/feature-expr.yml +148 -0
- data/test/lang/data/float.yml +30 -0
- data/test/lang/data/integer.yml +80 -0
- data/test/lang/data/interpolator-parser.yml +61 -0
- data/test/lang/data/keyed-sequence.yml +27 -0
- data/test/lang/data/literal-parser.yml +207 -0
- data/test/lang/data/parameter-set.yml +14 -0
- data/test/lang/data/rule-expr.yml +27 -0
- data/test/lang/data/sequence.yml +66 -0
- data/test/lang/data/string.yml +92 -0
- data/test/{model/spec_ticket-expr.yml → lang/data/ticket-expr.yml} +0 -0
- data/test/lang/spec_boolean.rb +5 -0
- data/test/{parser → lang}/spec_common-parser.rb +10 -32
- data/test/lang/spec_conditional-branch-parser.rb +5 -0
- data/test/lang/spec_conditional-branch-transformer.rb +97 -0
- data/test/lang/spec_conditional-branch.rb +176 -0
- data/test/lang/spec_context-parser.rb +5 -0
- data/test/lang/spec_context-transformer.rb +206 -0
- data/test/lang/spec_context.rb +283 -0
- data/test/lang/spec_data-expr.rb +198 -0
- data/test/lang/spec_declaration-parser.rb +5 -0
- data/test/lang/spec_declaration-transformer.rb +272 -0
- data/test/lang/spec_declaration.rb +550 -0
- data/test/lang/spec_document-parser.rb +5 -0
- data/test/lang/spec_document-transformer.rb +10 -0
- data/test/lang/spec_environment.rb +129 -0
- data/test/lang/spec_expr-parser.rb +6 -0
- data/test/lang/spec_expr-transformer.rb +149 -0
- data/test/lang/spec_feature-expr.rb +5 -0
- data/test/lang/spec_float.rb +23 -0
- data/test/lang/spec_integer.rb +29 -0
- data/test/lang/spec_interpolator-parser.rb +5 -0
- data/test/lang/spec_interpolator-transformer.rb +15 -0
- data/test/lang/spec_keyed-sequence.rb +5 -0
- data/test/lang/spec_literal-parser.rb +5 -0
- data/test/lang/spec_literal-transformer.rb +111 -0
- data/test/lang/spec_message.rb +22 -0
- data/test/lang/spec_package-expr.rb +19 -0
- data/test/lang/spec_parameter-set.rb +64 -0
- data/test/lang/spec_pione-method.rb +57 -0
- data/test/lang/spec_rule-expr.rb +18 -0
- data/test/lang/spec_sequence.rb +5 -0
- data/test/lang/spec_string.rb +5 -0
- data/test/lang/spec_ticket-expr.rb +39 -0
- data/test/lang/spec_variable.rb +29 -0
- data/test/{uri-scheme/spec_myftp-scheme.yml → location/data/myftp-scheme.yml} +0 -0
- data/test/location/location-behavior.rb +2 -2
- data/test/location/spec_basic-location.rb +5 -1
- data/test/{uri-scheme → location}/spec_broadcast-scheme.rb +4 -4
- data/test/{uri-scheme → location}/spec_dropbox-scheme.rb +3 -3
- data/test/location/spec_ftp-location.rb +3 -2
- data/test/location/spec_git-repository-location.rb +19 -19
- data/test/{uri-scheme → location}/spec_git-scheme.rb +2 -2
- data/test/location/spec_http-location.rb +4 -12
- data/test/location/spec_https-location.rb +1 -3
- data/test/location/spec_local-location.rb +1 -1
- data/test/{uri-scheme → location}/spec_local-scheme.rb +3 -3
- data/test/{uri-scheme → location}/spec_myftp-scheme.rb +8 -10
- data/test/log/spec_debug.rb +53 -0
- data/test/log/spec_domain-log.rb +4 -5
- data/test/log/spec_message-log.rb +39 -33
- data/test/log/spec_process-log.rb +4 -2
- data/test/log/spec_process-record.rb +12 -10
- data/test/log/spec_system-log.rb +29 -11
- data/test/log/spec_xes-log.rb +6 -4
- data/test/package/data/HelloWorld+v0.1.1.ppg +0 -0
- data/test/package/data/HelloWorld-gitrepos.zip +0 -0
- data/test/{test-data/package → package/data}/HelloWorld/HelloWorld.pione +3 -0
- data/test/package/data/HelloWorld/pione-package.json +16 -0
- data/test/package/data/HelloWorld/scenario/Scenario.pione +2 -0
- data/test/{test-data/package → package/data}/HelloWorld/scenario/output/message.txt +0 -0
- data/test/package/data/HelloWorld/scenario/pione-scenario.json +10 -0
- data/test/{test-data/package → package/data}/HelloWorld/scenario/scenario.yml +0 -0
- data/test/package/data/PackageScannerP1/P1.pione +11 -0
- data/test/package/data/PackageScannerP2/P2.pione +9 -0
- data/test/package/data/PackageScannerP3/P3.pione +17 -0
- data/test/package/data/PackageScannerP4/.Ignore.pione +1 -0
- data/test/package/data/PackageScannerP4/Doc1.pione +8 -0
- data/test/package/data/PackageScannerP4/Doc2.pione +6 -0
- data/test/package/data/PackageScannerP4/Doc3.pione +6 -0
- data/test/package/data/PackageScannerP4/P4.pione +8 -0
- data/test/package/data/PackageScannerP4/sub1/.Ignore.pione +1 -0
- data/test/package/data/PackageScannerP4/sub1/Doc4.pione +6 -0
- data/test/package/data/PackageScannerP4/sub1/sub1-1/.Ignore.pione +1 -0
- data/test/package/data/PackageScannerP4/sub1/sub1-1/Doc5.pione +6 -0
- data/test/package/data/PackageScannerP4/sub2/.Ignore.pione +1 -0
- data/test/package/data/PackageScannerP4/sub2/sub2-1/.Ignore.pione +1 -0
- data/test/package/data/PackageScannerP4/sub2/sub2-1/sub2-1-1/.Ignore.pione +1 -0
- data/test/package/data/PackageScannerP4/sub2/sub2-1/sub2-1-1/Doc6.pione +6 -0
- data/test/package/data/PackageScannerP4/sub2/sub2-1/sub2-1-2/.Ignore.pione +1 -0
- data/test/package/data/PackageScannerP4/sub2/sub2-1/sub2-1-2/Doc7.pione +6 -0
- data/test/package/data/PackageScannerP5/P5.pione +8 -0
- data/test/{model/spec_feature-expr.yml → package/data/PackageScannerP5/scenario1/Scenario.pione} +0 -0
- data/test/package/data/PackageScannerP5/scenario2/Scenario.pione +0 -0
- data/test/package/data/PackageScannerP5/scenario3/Scenario.pione +0 -0
- data/test/package/data/PackageScannerP5/sub1/scenario4/Scenario.pione +0 -0
- data/test/package/data/PackageScannerP5/sub1/sub1-1/scenario5/Scenario.pione +0 -0
- data/test/package/data/PackageScannerP5/sub2/sub2-1/sub2-1-1/scenario6/Scenario.pione +0 -0
- data/test/package/data/PackageScannerP5/sub2/sub2-1/sub2-1-2/scenario7/Scenario.pione +0 -0
- data/test/package/data/ScenarioScannerS1/Scenario.pione +1 -0
- data/test/package/data/ScenarioScannerS1/input/i1 +0 -0
- data/test/package/data/ScenarioScannerS1/input/i2 +0 -0
- data/test/package/data/ScenarioScannerS1/input/i3 +0 -0
- data/test/package/data/ScenarioScannerS1/output/o1 +0 -0
- data/test/package/data/ScenarioScannerS1/output/o2 +0 -0
- data/test/package/data/ScenarioScannerS1/output/o3 +0 -0
- data/test/package/data/ScenarioScannerS2/Scenario.pione +1 -0
- data/test/package/data/ScenarioScannerS2/output/o1 +0 -0
- data/test/package/data/ScenarioScannerS3/Scenario.pione +2 -0
- data/test/package/data/ScenarioScannerS4/Scenario.pione +0 -0
- data/test/package/data/ScenarioScannerS5/Scenario.pione +2 -0
- data/test/package/data/ScenarioScannerS6/Scenario.pione +5 -0
- data/test/package/data/ScenarioScannerS8/Scenario.pione +1 -0
- data/test/{test-data/package → package/data}/TestPackage1+v0.1.0.ppg +0 -0
- data/test/{test-data/package → package/data}/TestPackage1/Test.pione +3 -0
- data/test/{test-data/package → package/data}/TestPackage1/bin/count +0 -0
- data/test/{test-data/package → package/data}/TestPackage1/package.yml +0 -0
- data/test/package/data/TestPackage1/pione-package.json +18 -0
- data/test/package/data/TestPackage1/scenario/case1/Scenario.pione +1 -0
- data/test/{test-data/package → package/data}/TestPackage1/scenario/case1/input/1.txt +0 -0
- data/test/{test-data/package → package/data}/TestPackage1/scenario/case1/output/1.count +0 -0
- data/test/package/data/TestPackage1/scenario/case1/pione-scenario.json +10 -0
- data/test/{test-data/package → package/data}/TestPackage1/scenario/case1/scenario.yml +0 -0
- data/test/package/data/TestPackage1/scenario/case2/Scenario.pione +1 -0
- data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/input/1.txt +0 -0
- data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/input/2.txt +0 -0
- data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/input/3.txt +0 -0
- data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/output/1.count +0 -0
- data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/output/2.count +0 -0
- data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/output/3.count +0 -0
- data/test/package/data/TestPackage1/scenario/case2/pione-scenario.json +14 -0
- data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/scenario.yml +0 -0
- data/test/package/data/TestPackage1/scenario/case3/Scenario.pione +1 -0
- data/test/{test-data/package → package/data}/TestPackage1/scenario/case3/input/a.txt +0 -0
- data/test/{test-data/package → package/data}/TestPackage1/scenario/case3/input/b.txt +0 -0
- data/test/{test-data/package → package/data}/TestPackage1/scenario/case3/output/a.count +0 -0
- data/test/{test-data/package → package/data}/TestPackage1/scenario/case3/output/b.count +0 -0
- data/test/package/data/TestPackage1/scenario/case3/pione-scenario.json +12 -0
- data/test/{test-data/package → package/data}/TestPackage1/scenario/case3/scenario.yml +0 -0
- data/test/{component → package}/spec_document.pione +0 -0
- data/test/package/spec_document.rb +52 -0
- data/test/package/spec_package-archiver.rb +31 -0
- data/test/package/spec_package-database.rb +42 -0
- data/test/package/spec_package-expander.rb +14 -0
- data/test/package/spec_package-filename.rb +56 -0
- data/test/package/spec_package-handler.rb +50 -0
- data/test/package/spec_package-info.rb +22 -0
- data/test/package/spec_package-reader.rb +85 -0
- data/test/package/spec_package-scanner.rb +68 -0
- data/test/package/spec_scenario-handler.rb +46 -0
- data/test/package/spec_scenario-info.rb +16 -0
- data/test/package/spec_scenario-scanner.rb +92 -0
- data/test/patch/spec_rinda-patch.rb +1 -1
- data/test/patch/spec_uri-patch.rb +1 -1
- data/test/{rule-handler → rule-engine}/spec_action-handler.pione +0 -0
- data/test/rule-engine/spec_action-handler.rb +94 -0
- data/test/rule-engine/spec_data-finder.rb +94 -0
- data/test/{tuple-space → rule-engine}/spec_data-finder.yml +39 -28
- data/test/rule-engine/spec_empty-handler.rb +170 -0
- data/test/{rule-handler → rule-engine}/spec_flow-handler.pione +0 -0
- data/test/rule-engine/spec_flow-handler.rb +421 -0
- data/test/{rule-handler → rule-engine}/spec_update-criteria.pione +0 -0
- data/test/{rule-handler → rule-engine}/spec_update-criteria.rb +16 -12
- data/test/{rule-handler → rule-engine}/spec_update-criteria.yml +0 -0
- data/test/system/spec_domain-info.rb +13 -9
- data/test/system/spec_file-cache.rb +9 -9
- data/test/tuple-space/spec_tuple-space-server.rb +42 -40
- data/test/tuple/spec_basic-tuple.rb +77 -75
- data/test/tuple/spec_data-tuple.rb +4 -4
- data/test/tuple/spec_finished-tuple.rb +5 -6
- data/test/tuple/spec_message-tuple.rb +3 -3
- data/test/tuple/spec_task-tuple.rb +11 -9
- data/test/tuple/spec_touch-tuple.rb +3 -3
- data/test/tuple/spec_working-tuple.rb +8 -12
- data/test/tuple/tuple-behavior.rb +1 -1
- data/test/util/data/HelloWorld+v0.1.1.ppg +0 -0
- data/test/util/spec_cpu.rb +1 -1
- data/test/util/spec_digest.rb +15 -0
- data/test/util/spec_evaluatable.rb +3 -3
- data/test/util/spec_free-thread-generator.rb +42 -0
- data/test/util/spec_ftp-server.rb +4 -9
- data/test/util/spec_id.rb +53 -36
- data/test/util/spec_indentation.rb +1 -1
- data/test/util/spec_ip-address.rb +1 -1
- data/test/util/spec_package-parameters-list.rb +10 -9
- data/test/util/spec_process-info.rb +2 -2
- data/test/util/spec_uuid.rb +1 -1
- data/test/util/spec_variable-holdable.rb +1 -1
- data/test/util/spec_zip.rb +1 -1
- metadata +508 -364
- data/example/SerialProcessing/package.yml +0 -5
- data/example/SerialProcessing/scenario/scenario.yml +0 -10
- data/lib/pione/agent/command-listener.rb +0 -47
- data/lib/pione/agent/rule-provider.rb +0 -59
- data/lib/pione/agent/trivial-routine-worker.rb +0 -29
- data/lib/pione/agent/tuple-space-server-client-life-checker.rb +0 -31
- data/lib/pione/command/child-process.rb +0 -56
- data/lib/pione/command/daemon-process.rb +0 -10
- data/lib/pione/command/front-owner-command.rb +0 -25
- data/lib/pione/component.rb +0 -13
- data/lib/pione/component/document.rb +0 -88
- data/lib/pione/component/package-archiver.rb +0 -92
- data/lib/pione/component/package-filename.rb +0 -38
- data/lib/pione/component/package-reader.rb +0 -276
- data/lib/pione/component/package.rb +0 -199
- data/lib/pione/component/rule.rb +0 -206
- data/lib/pione/front/task-worker-owner.rb +0 -43
- data/lib/pione/front/tuple-space-provider-owner.rb +0 -11
- data/lib/pione/model.rb +0 -32
- data/lib/pione/model/assignment.rb +0 -120
- data/lib/pione/model/basic-model.rb +0 -228
- data/lib/pione/model/block.rb +0 -262
- data/lib/pione/model/boolean.rb +0 -168
- data/lib/pione/model/call-rule.rb +0 -86
- data/lib/pione/model/constraints.rb +0 -46
- data/lib/pione/model/data-expr.rb +0 -548
- data/lib/pione/model/feature-expr.rb +0 -875
- data/lib/pione/model/float.rb +0 -105
- data/lib/pione/model/integer.rb +0 -166
- data/lib/pione/model/keyed-sequence.rb +0 -150
- data/lib/pione/model/message.rb +0 -95
- data/lib/pione/model/ordinal-sequence.rb +0 -73
- data/lib/pione/model/package-expr.rb +0 -53
- data/lib/pione/model/parameters.rb +0 -374
- data/lib/pione/model/rule-expr.rb +0 -234
- data/lib/pione/model/sequence.rb +0 -273
- data/lib/pione/model/string.rb +0 -127
- data/lib/pione/model/ticket-expr.rb +0 -71
- data/lib/pione/model/variable-table.rb +0 -344
- data/lib/pione/model/variable.rb +0 -116
- data/lib/pione/parser.rb +0 -14
- data/lib/pione/parser/block-parser.rb +0 -107
- data/lib/pione/parser/common-parser.rb +0 -173
- data/lib/pione/parser/document-parser.rb +0 -141
- data/lib/pione/parser/expr-parser.rb +0 -354
- data/lib/pione/parser/feature-expr-parser.rb +0 -105
- data/lib/pione/parser/flow-element-parser.rb +0 -181
- data/lib/pione/parser/literal-parser.rb +0 -196
- data/lib/pione/parser/rule-definition-parser.rb +0 -158
- data/lib/pione/patch/monitor-patch.rb +0 -16
- data/lib/pione/rule-handler.rb +0 -14
- data/lib/pione/rule-handler/basic-handler.rb +0 -326
- data/lib/pione/rule-handler/flow-handler.rb +0 -414
- data/lib/pione/rule-handler/update-criteria.rb +0 -175
- data/lib/pione/system/global.rb +0 -433
- data/lib/pione/transformer.rb +0 -24
- data/lib/pione/transformer/block-transformer.rb +0 -28
- data/lib/pione/transformer/document-transformer.rb +0 -58
- data/lib/pione/transformer/feature-expr-transformer.rb +0 -60
- data/lib/pione/transformer/flow-element-transformer.rb +0 -66
- data/lib/pione/transformer/literal-transformer.rb +0 -91
- data/lib/pione/transformer/rule-definition-transformer.rb +0 -80
- data/lib/pione/transformer/transformer-module.rb +0 -39
- data/lib/pione/tuple-space/data-finder.rb +0 -155
- data/lib/pione/tuple-space/presence-notifier.rb +0 -84
- data/lib/pione/tuple-space/tuple-space-provider.rb +0 -85
- data/lib/pione/tuple-space/tuple-space-receiver.rb +0 -141
- data/lib/pione/tuple-space/tuple-space-server-interface.rb +0 -123
- data/lib/pione/tuple.rb +0 -30
- data/lib/pione/tuple/agent-tuple.rb +0 -10
- data/lib/pione/tuple/attribute-tuple.rb +0 -7
- data/lib/pione/tuple/base-location-tuple.rb +0 -9
- data/lib/pione/tuple/bye-tuple.rb +0 -9
- data/lib/pione/tuple/command-tuple.rb +0 -9
- data/lib/pione/tuple/data-null-tuple.rb +0 -14
- data/lib/pione/tuple/data-tuple.rb +0 -21
- data/lib/pione/tuple/dry-run-tuple.rb +0 -8
- data/lib/pione/tuple/exception-tuple.rb +0 -11
- data/lib/pione/tuple/finished-tuple.rb +0 -17
- data/lib/pione/tuple/foreground-tuple.rb +0 -7
- data/lib/pione/tuple/lift-tuple.rb +0 -14
- data/lib/pione/tuple/message-tuple.rb +0 -7
- data/lib/pione/tuple/process-info-tuple.rb +0 -9
- data/lib/pione/tuple/process-log-tuple.rb +0 -13
- data/lib/pione/tuple/request-rule-tuple.rb +0 -9
- data/lib/pione/tuple/rule-tuple.rb +0 -10
- data/lib/pione/tuple/task-tuple.rb +0 -40
- data/lib/pione/tuple/task-worker-resource-tuple.rb +0 -9
- data/lib/pione/tuple/ticket-tuple.rb +0 -8
- data/lib/pione/tuple/touch-tuple.rb +0 -14
- data/lib/pione/tuple/working-tuple.rb +0 -13
- data/lib/pione/uri-scheme.rb +0 -11
- data/lib/pione/util/error-report.rb +0 -27
- data/test/agent/spec_command-listener.rb +0 -30
- data/test/agent/spec_rule-provider.rb +0 -78
- data/test/command/spec_pione-val.domain.dump +0 -0
- data/test/component/spec_document.rb +0 -67
- data/test/component/spec_package-archiver.rb +0 -27
- data/test/component/spec_package-expander.rb +0 -11
- data/test/component/spec_package-filename.rb +0 -79
- data/test/component/spec_package-reader.rb +0 -100
- data/test/component/spec_package.rb +0 -109
- data/test/component/spec_rule.rb +0 -140
- data/test/model/spec_assignment.rb +0 -52
- data/test/model/spec_block.rb +0 -108
- data/test/model/spec_boolean.rb +0 -39
- data/test/model/spec_boolean.yml +0 -134
- data/test/model/spec_call-rule.rb +0 -23
- data/test/model/spec_data-expr.rb +0 -361
- data/test/model/spec_data-expr.yml +0 -24
- data/test/model/spec_data-expr_match.yml +0 -45
- data/test/model/spec_feature-expr.rb +0 -333
- data/test/model/spec_feature-expr_decide.yml +0 -28
- data/test/model/spec_float.rb +0 -23
- data/test/model/spec_float.yml +0 -30
- data/test/model/spec_integer.rb +0 -23
- data/test/model/spec_integer.yml +0 -68
- data/test/model/spec_keyed-sequence.rb +0 -5
- data/test/model/spec_keyed-sequence.yml +0 -27
- data/test/model/spec_message.rb +0 -40
- data/test/model/spec_package-expr.rb +0 -19
- data/test/model/spec_parameters.rb +0 -103
- data/test/model/spec_pione-method.rb +0 -57
- data/test/model/spec_rule-expr.rb +0 -28
- data/test/model/spec_rule-expr.yml +0 -11
- data/test/model/spec_sequence.rb +0 -5
- data/test/model/spec_sequence.yml +0 -66
- data/test/model/spec_string.rb +0 -47
- data/test/model/spec_string.yml +0 -91
- data/test/model/spec_ticket-expr.rb +0 -39
- data/test/model/spec_variable-table.rb +0 -116
- data/test/model/spec_variable.rb +0 -82
- data/test/parser/spec_block-parser.rb +0 -5
- data/test/parser/spec_block-parser.yml +0 -94
- data/test/parser/spec_document-parser.rb +0 -5
- data/test/parser/spec_document-parser.yml +0 -77
- data/test/parser/spec_expr-parser.rb +0 -6
- data/test/parser/spec_feature-expr-parser.rb +0 -32
- data/test/parser/spec_feature-expr-parser.yml +0 -25
- data/test/parser/spec_flow-element-parser.rb +0 -5
- data/test/parser/spec_literal-parser.rb +0 -5
- data/test/parser/spec_literal-parser.yml +0 -134
- data/test/parser/spec_rule-definition-parser.rb +0 -5
- data/test/parser/spec_rule-definition-parser.yml +0 -94
- data/test/rule-handler/spec_action-handler.rb +0 -79
- data/test/rule-handler/spec_flow-handler.rb +0 -61
- data/test/spec_common.rb +0 -14
- data/test/spec_object.rb +0 -20
- data/test/test-data/package/HelloWorld+v0.1.0.ppg +0 -0
- data/test/test-data/package/HelloWorld-gitrepos.zip +0 -0
- data/test/test-data/package/HelloWorld/package.yml +0 -6
- data/test/test-util.rb +0 -211
- data/test/test-util/command.rb +0 -53
- data/test/test-util/package.rb +0 -9
- data/test/test-util/parser.rb +0 -45
- data/test/test-util/transformer.rb +0 -50
- data/test/test-util/webserver.rb +0 -43
- data/test/transformer/spec_block-transformer.rb +0 -33
- data/test/transformer/spec_document-transformer.rb +0 -50
- data/test/transformer/spec_expr-transformer.rb +0 -126
- data/test/transformer/spec_feature-expr-transformer.rb +0 -21
- data/test/transformer/spec_flow-element-transformer.rb +0 -154
- data/test/transformer/spec_literal-transformer.rb +0 -64
- data/test/transformer/spec_rule-definition-transformer.rb +0 -172
- data/test/tuple-space/spec_data-finder.rb +0 -94
- data/test/tuple-space/spec_tuple-space-provider.rb +0 -36
- data/test/tuple-space/spec_tuple-space-receiver.rb +0 -32
- data/test/util/spec_error-report.rb +0 -51
data/.simplecov
CHANGED
data/History.txt
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# History
|
|
2
2
|
|
|
3
|
+
## 0.3.0(2013/10/20)
|
|
4
|
+
|
|
5
|
+
* Improved multi-inheritance package system.
|
|
6
|
+
* Added package database.
|
|
7
|
+
* Added package cache system.
|
|
8
|
+
* Improved language parser and interpreter.
|
|
9
|
+
* Refactored many codes.
|
|
10
|
+
* Improved test coverage.
|
|
11
|
+
|
|
3
12
|
## 0.2.2(2013/07/02)
|
|
4
13
|
|
|
5
14
|
* Enabled to load remote package.
|
data/Rakefile
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
require "bundler/gem_tasks"
|
|
2
2
|
require "pione"
|
|
3
3
|
|
|
4
|
-
$stand_alone = "bin/pione-client --stand-aline"
|
|
5
|
-
|
|
6
4
|
desc 'generate HTML API documentation'
|
|
7
5
|
task 'html' do
|
|
8
6
|
sh 'bundle exec yard doc -o html --hide-void-return --no-api --private'
|
|
@@ -13,77 +11,9 @@ task 'html:undoc' do
|
|
|
13
11
|
sh 'bundle exec yard stats --list-undoc --no-api --private --compact'
|
|
14
12
|
end
|
|
15
13
|
|
|
16
|
-
desc 'count characters in input direcotry'
|
|
17
|
-
task 'example:CountChar' do
|
|
18
|
-
sh "ruby -I lib %s -i %s %s" % [
|
|
19
|
-
$stand_alone,
|
|
20
|
-
"example/CountChar/text",
|
|
21
|
-
"example/CountChar/CountChar.pione"
|
|
22
|
-
]
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
desc 'count characters in input direcotry with debug mode'
|
|
26
|
-
task 'example:CountChar:debug_mode' do
|
|
27
|
-
sh "ruby -I lib %s -i %s -d %s" % [
|
|
28
|
-
$stand_alone,
|
|
29
|
-
"example/CountChar/text",
|
|
30
|
-
"example/CountChar/CountChar.pione"
|
|
31
|
-
]
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
desc 'count characters by stream'
|
|
35
|
-
task 'example:CountCharStream' do
|
|
36
|
-
sh "ruby -I lib %s -s %s" % [
|
|
37
|
-
$stand_alone,
|
|
38
|
-
"example/CountChar/CountCharStream.pione"
|
|
39
|
-
]
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
desc 'count characters by stream with debug mode'
|
|
43
|
-
task 'example:CountCharStream:debug_mode' do
|
|
44
|
-
sh "ruby -I lib %s -s -d %s" % [
|
|
45
|
-
$stand_alone,
|
|
46
|
-
"example/CountChar/CountCharStream.pione"
|
|
47
|
-
]
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
desc 'sum numbers in file'
|
|
51
|
-
task 'example:Sum' do
|
|
52
|
-
sh "ruby -I lib %s -i %s %s" % [
|
|
53
|
-
$stand_alone,
|
|
54
|
-
"example/Sum/input",
|
|
55
|
-
"example/Sum/Sum.pione"
|
|
56
|
-
]
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
desc 'sum numbers in file with debug mode'
|
|
60
|
-
task 'example:Sum:debug_mode' do
|
|
61
|
-
sh "ruby -I lib %s -i %s -d %s" % [
|
|
62
|
-
$stand_alone,
|
|
63
|
-
"example/Sum/input",
|
|
64
|
-
"example/Sum/Sum.pione"
|
|
65
|
-
]
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
desc 'fib calc'
|
|
69
|
-
task 'example:Fib' do
|
|
70
|
-
sh "ruby -I lib %s %s" % [
|
|
71
|
-
$stand_alone,
|
|
72
|
-
"example/Fib/Fib.pione",
|
|
73
|
-
]
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
desc 'fib calc with debug mode'
|
|
77
|
-
task 'example:Fib:debug' do
|
|
78
|
-
sh "ruby -I lib %s -d %s" % [
|
|
79
|
-
$stand_alone,
|
|
80
|
-
"example/Fib/Fib.pione"
|
|
81
|
-
]
|
|
82
|
-
end
|
|
83
|
-
|
|
84
14
|
desc 'execute basic tests'
|
|
85
15
|
task 'test' do
|
|
86
|
-
sh "bundle exec bacon -
|
|
16
|
+
sh "bundle exec bacon -rsimplecov -a"
|
|
87
17
|
end
|
|
88
18
|
|
|
89
19
|
desc 'parser test'
|
data/example/Fib/Fib.pione
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
.@ PackageName :: "Fib"
|
|
2
|
+
.@ Editor :: "keita.yamaguchi@gmail.com"
|
|
3
|
+
.@ "Fib.pione calculates the value of Fibonacci number."
|
|
3
4
|
|
|
4
|
-
param
|
|
5
|
+
param $NUM := 3
|
|
5
6
|
|
|
6
7
|
Rule Main
|
|
7
8
|
output 'result.txt'
|
|
@@ -11,21 +12,21 @@ Flow
|
|
|
11
12
|
End
|
|
12
13
|
|
|
13
14
|
Rule Fib0
|
|
14
|
-
|
|
15
|
+
.@ "the value of fib(0) is 0"
|
|
15
16
|
output 'fib0.txt'
|
|
16
17
|
Action
|
|
17
18
|
echo -n '0' > fib0.txt
|
|
18
19
|
End
|
|
19
20
|
|
|
20
21
|
Rule Fib1
|
|
21
|
-
|
|
22
|
+
.@ "the value of fib(1) is 1"
|
|
22
23
|
output 'fib1.txt'
|
|
23
24
|
Action
|
|
24
25
|
echo -n '1' > fib1.txt
|
|
25
26
|
End
|
|
26
27
|
|
|
27
28
|
Rule Fib
|
|
28
|
-
|
|
29
|
+
.@ "fib(n) is fib(0), fib(1), or fib(n-1) + fib(n-2)"
|
|
29
30
|
output 'fib{$N}.txt'
|
|
30
31
|
param $N
|
|
31
32
|
Flow
|
|
@@ -44,7 +45,7 @@ Flow
|
|
|
44
45
|
End
|
|
45
46
|
|
|
46
47
|
Rule Calc
|
|
47
|
-
|
|
48
|
+
.@ "calculate the value of fib(n-1) + fib(n-2)"
|
|
48
49
|
input 'fib{$P1}.txt'
|
|
49
50
|
input 'fib{$P2}.txt'
|
|
50
51
|
output 'fib{$N}.txt'
|
|
@@ -56,7 +57,7 @@ Action
|
|
|
56
57
|
End
|
|
57
58
|
|
|
58
59
|
Rule Result
|
|
59
|
-
|
|
60
|
+
.@ "make the result"
|
|
60
61
|
input 'fib*.txt'
|
|
61
62
|
output 'result.txt'
|
|
62
63
|
Action
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.@ ScenarioName :: "SerialProcessing Test"
|
data/lib/pione.rb
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
Thread.abort_on_exception = true
|
|
2
|
+
|
|
1
3
|
#
|
|
2
4
|
# load libraries
|
|
3
5
|
#
|
|
4
6
|
|
|
5
7
|
# bundler
|
|
6
|
-
require 'bundler/setup'
|
|
8
|
+
require 'bundler/setup' rescue nil
|
|
7
9
|
|
|
8
10
|
# standard
|
|
9
11
|
require 'set'
|
|
@@ -31,6 +33,7 @@ require 'logger'
|
|
|
31
33
|
require 'ostruct'
|
|
32
34
|
require 'net/ftp'
|
|
33
35
|
require 'net/http'
|
|
36
|
+
require 'fiber'
|
|
34
37
|
|
|
35
38
|
# gems
|
|
36
39
|
require 'uuidtools'
|
|
@@ -49,59 +52,49 @@ require 'pione/patch/em-ftpd-patch' # patch
|
|
|
49
52
|
require 'sys/cpu'
|
|
50
53
|
require 'structx'
|
|
51
54
|
require 'syslog-logger'
|
|
52
|
-
require '
|
|
55
|
+
require 'zip'
|
|
56
|
+
require 'zip/filesystem'
|
|
53
57
|
require 'retriable'
|
|
54
58
|
require 'childprocess'
|
|
59
|
+
require 'lettercase/core_ext'
|
|
55
60
|
|
|
61
|
+
# configuration for childprcess
|
|
56
62
|
ChildProcess.posix_spawn = true
|
|
57
63
|
|
|
58
64
|
#
|
|
59
65
|
# load pione
|
|
60
66
|
#
|
|
61
67
|
|
|
62
|
-
require 'pione/version'
|
|
63
|
-
require 'pione/util'
|
|
64
|
-
require 'pione/patch'
|
|
65
|
-
require 'pione/
|
|
66
|
-
require 'pione/
|
|
67
|
-
require 'pione/
|
|
68
|
-
require 'pione/system'
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
require 'pione/
|
|
74
|
-
require 'pione/
|
|
75
|
-
require 'pione/
|
|
76
|
-
require 'pione/
|
|
77
|
-
require 'pione/component'
|
|
78
|
-
require 'pione/tuple'
|
|
79
|
-
require 'pione/parser'
|
|
80
|
-
require 'pione/transformer'
|
|
81
|
-
require 'pione/agent'
|
|
82
|
-
require 'pione/front'
|
|
83
|
-
require 'pione/command'
|
|
68
|
+
require 'pione/version' # PIONE version information
|
|
69
|
+
require 'pione/util' # various helper functions
|
|
70
|
+
require 'pione/patch' # patches for libraries
|
|
71
|
+
require 'pione/location' # location system for data and package
|
|
72
|
+
require 'pione/log' # log and format
|
|
73
|
+
require 'pione/global' # global variable manager
|
|
74
|
+
require 'pione/system' # PIONE system functions
|
|
75
|
+
require 'pione/relay' # relay connection
|
|
76
|
+
require 'pione/package' # package system
|
|
77
|
+
require 'pione/lang' # PIONE languge
|
|
78
|
+
require 'pione/tuple-space' # tuple space functions
|
|
79
|
+
require 'pione/rule-engine' # rule processing behaviors
|
|
80
|
+
require 'pione/agent' # agent system
|
|
81
|
+
require 'pione/front' # command front interface
|
|
82
|
+
require 'pione/command' # command definitions
|
|
84
83
|
|
|
85
84
|
#
|
|
86
85
|
# other settings
|
|
87
86
|
#
|
|
87
|
+
|
|
88
88
|
module Pione
|
|
89
|
-
|
|
89
|
+
# expand name spaces
|
|
90
90
|
include Relay
|
|
91
|
-
include Util
|
|
92
91
|
include Log::MessageLog
|
|
93
|
-
include Model
|
|
94
92
|
include TupleSpace
|
|
95
|
-
include Parser
|
|
96
|
-
include Transformer
|
|
97
93
|
|
|
98
94
|
extend Util::Evaluatable
|
|
99
|
-
|
|
100
|
-
module_function :debug_mode
|
|
101
|
-
module_function :debug_mode=
|
|
102
|
-
module_function :debug_mode?
|
|
103
95
|
end
|
|
104
96
|
|
|
105
|
-
|
|
106
|
-
Thread.abort_on_exception = true
|
|
97
|
+
# initialize PIONE system
|
|
107
98
|
Pione::System::Init.new.init
|
|
99
|
+
|
|
100
|
+
# now, we are enable to start processing!
|
data/lib/pione/agent.rb
CHANGED
|
@@ -3,15 +3,15 @@ module Pione
|
|
|
3
3
|
module Agent; end
|
|
4
4
|
end
|
|
5
5
|
|
|
6
|
+
require 'pione/agent/agent-exception'
|
|
6
7
|
require 'pione/agent/basic-agent'
|
|
7
8
|
require 'pione/agent/tuple-space-client'
|
|
8
|
-
require 'pione/agent/
|
|
9
|
+
require 'pione/agent/job-terminator'
|
|
9
10
|
require 'pione/agent/task-worker'
|
|
10
11
|
require 'pione/agent/input-generator'
|
|
11
|
-
require 'pione/agent/rule-provider'
|
|
12
12
|
require 'pione/agent/logger'
|
|
13
13
|
require 'pione/agent/broker'
|
|
14
14
|
require 'pione/agent/process-manager'
|
|
15
|
-
require 'pione/agent/trivial-routine-worker'
|
|
16
|
-
require 'pione/agent/tuple-space-server-client-life-checker'
|
|
17
15
|
require 'pione/agent/messenger'
|
|
16
|
+
require 'pione/agent/tuple-space-provider'
|
|
17
|
+
require 'pione/agent/tuple-space-receiver'
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
module Pione
|
|
2
|
+
module Agent
|
|
3
|
+
# TerminationError is raised when the agent reaches trasition termination.
|
|
4
|
+
class TerminationError < StandardError
|
|
5
|
+
def initialize(agent, states)
|
|
6
|
+
@agent = agent
|
|
7
|
+
@states = states
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def message
|
|
11
|
+
"agent %s has reached termination([%s])" % [@agent, @states.map{|s| s.to_s}.join(", ")]
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# TimeoutError is raised when the agent is timeouted.
|
|
16
|
+
class TimeoutError < StandardError
|
|
17
|
+
attr_reader :agent # agent timeouted
|
|
18
|
+
attr_reader :agent_states # agent states
|
|
19
|
+
attr_reader :sec # timeout second
|
|
20
|
+
|
|
21
|
+
def initialize(agent, states, sec)
|
|
22
|
+
@agent = agent
|
|
23
|
+
@states = states
|
|
24
|
+
@sec = sec
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def message
|
|
28
|
+
sec = @sec ? "(%s sec)" % @sec : ""
|
|
29
|
+
"%s timeouted %s at state [%s]" % [@agent, sec, @states.map{|s| s.to_s}.join(", ")]
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# ConnectionError is raised when agent is disconnected from other process unexpectedly.
|
|
34
|
+
class ConnectionError < StandardError; end
|
|
35
|
+
|
|
36
|
+
# TupleSpaceError is raised when tuple space is something bad.
|
|
37
|
+
class TupleSpaceError < StandardError; end
|
|
38
|
+
|
|
39
|
+
# Restart is raised when the agent should restart activity.
|
|
40
|
+
class Restart < StandardError; end
|
|
41
|
+
|
|
42
|
+
class UnknownInputGeneratorMethod
|
|
43
|
+
def initialize(name)
|
|
44
|
+
@name = name
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def message
|
|
48
|
+
"input generator method \"%s\" is unknown" % @name
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -1,330 +1,337 @@
|
|
|
1
1
|
module Pione
|
|
2
2
|
module Agent
|
|
3
|
-
# @api private
|
|
4
3
|
@table = Hash.new
|
|
5
4
|
|
|
6
5
|
class << self
|
|
7
6
|
# Returns a class corresponding to the agent type.
|
|
8
|
-
# @param [Symbol] type
|
|
9
|
-
# agent type
|
|
10
|
-
# @return [Pione::Agent::BasicAgent]
|
|
11
|
-
# agent class
|
|
12
7
|
def [](type)
|
|
13
8
|
@table[type]
|
|
14
9
|
end
|
|
15
10
|
|
|
16
11
|
# Sets an agent of the system.
|
|
17
|
-
# @param [Pione::Agent::BasicAgent] klass
|
|
18
|
-
# agent class
|
|
19
|
-
# @return [void]
|
|
20
12
|
def set_agent(klass)
|
|
21
13
|
@table[klass.agent_type] = klass
|
|
22
14
|
end
|
|
23
15
|
end
|
|
24
16
|
|
|
25
|
-
# Aborting is an exception for aborting agents.
|
|
26
|
-
class Aborting < Exception; end
|
|
27
|
-
|
|
28
|
-
# TransitionError happens when
|
|
29
|
-
class TransitionError < StandardError; end
|
|
30
|
-
|
|
31
|
-
# TimeoutStateWaiting happens when not reached expected in time.
|
|
32
|
-
class TimeoutStateWaiting < StandardError
|
|
33
|
-
# expected status
|
|
34
|
-
attr_reader :expected
|
|
35
|
-
|
|
36
|
-
# current status
|
|
37
|
-
attr_reader :current
|
|
38
|
-
|
|
39
|
-
# Creates an exception.
|
|
40
|
-
#
|
|
41
|
-
# @param [Symbol] expected
|
|
42
|
-
# expected state
|
|
43
|
-
# @param [Symbol] current
|
|
44
|
-
# current state
|
|
45
|
-
def initialize(expected, current)
|
|
46
|
-
@expected_state = expected
|
|
47
|
-
@current_state = current
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
# @private
|
|
51
|
-
def message
|
|
52
|
-
msg = "expected state is '%s' but current state is '%s'"
|
|
53
|
-
msg % [@expected_state, @current_state]
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
17
|
# StateTransitionSingleMethod provides state transition singleton methods.
|
|
58
18
|
module StateTransitionSingletonMethod
|
|
59
|
-
#
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
mod.define_state :error
|
|
65
|
-
|
|
66
|
-
mod.define_state_transition :error => :terminated
|
|
67
|
-
end
|
|
19
|
+
# Defines a new transition.
|
|
20
|
+
def define_transition(name)
|
|
21
|
+
@transitions ||= []
|
|
22
|
+
unless @transitions.include?(name)
|
|
23
|
+
@transitions << name
|
|
68
24
|
|
|
69
|
-
|
|
70
|
-
# @param [Symbol] name
|
|
71
|
-
# state name
|
|
72
|
-
# @return [void]
|
|
73
|
-
def define_state(name)
|
|
74
|
-
@states ||= []
|
|
75
|
-
unless @states.include?(name)
|
|
76
|
-
@states << name
|
|
77
|
-
|
|
78
|
-
# define an instance method for checking current state
|
|
79
|
-
define_method("#{name}?") do
|
|
80
|
-
@__current_state__ == name
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
# define an instance method for transition
|
|
25
|
+
# define empty transition method
|
|
84
26
|
unless method_defined?("transit_to_#{name}")
|
|
85
|
-
define_method("transit_to_#{name}"){}
|
|
27
|
+
define_method("transit_to_#{name}") {}
|
|
86
28
|
end
|
|
87
29
|
end
|
|
88
30
|
end
|
|
89
31
|
|
|
90
|
-
# Returns
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
def states
|
|
94
|
-
@states
|
|
32
|
+
# Returns transition chain table.
|
|
33
|
+
def transition_chain
|
|
34
|
+
@transition_chain ||= {nil => :init}
|
|
95
35
|
end
|
|
96
36
|
|
|
97
|
-
#
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
def define_state_transition(data)
|
|
109
|
-
table = state_transition_table
|
|
110
|
-
table.merge!(data)
|
|
37
|
+
# Define a transition chain.
|
|
38
|
+
def chain(data)
|
|
39
|
+
data.each do |k, v|
|
|
40
|
+
raise ArgumentError.new(k) if not(@transitions.include?(k))
|
|
41
|
+
if not(v.is_a?(Proc))
|
|
42
|
+
(v.is_a?(Array) ? v : [v]).each do |_v|
|
|
43
|
+
raise ArgumentError.new(_v) if not(@transitions.include?(_v))
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
transition_chain.merge!(data)
|
|
111
48
|
end
|
|
112
49
|
|
|
113
|
-
#
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
def exception_handler_table
|
|
117
|
-
@__exception_handler_table__ ||= {}
|
|
50
|
+
# Return exception handler table.
|
|
51
|
+
def exception_handler
|
|
52
|
+
@exception_handler ||= {}
|
|
118
53
|
end
|
|
119
54
|
|
|
120
|
-
#
|
|
121
|
-
# @param [Hash{Exception => Symbol}] data
|
|
122
|
-
# exception handler definition
|
|
123
|
-
# @return [void]
|
|
124
|
-
# @example
|
|
125
|
-
# define_exception_handler(StopIetration => :end_process)
|
|
55
|
+
# Define a transition for handling exceptions.
|
|
126
56
|
def define_exception_handler(data)
|
|
127
|
-
|
|
128
|
-
table.merge!(data)
|
|
57
|
+
exception_handler.merge!(data)
|
|
129
58
|
end
|
|
130
59
|
|
|
131
60
|
# Creates an agent and starts it.
|
|
132
|
-
# @param [Array<Object>] args
|
|
133
|
-
# arguments of state change
|
|
134
61
|
def start(*args, &b)
|
|
135
|
-
agent = new(*args)
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
62
|
+
agent = new(*args, &b)
|
|
63
|
+
return agent.start
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# BasicAgent is a super class for all PIONE agents.
|
|
68
|
+
class BasicAgent < PioneObject
|
|
69
|
+
include DRbUndumped
|
|
70
|
+
extend StateTransitionSingletonMethod
|
|
71
|
+
|
|
72
|
+
#
|
|
73
|
+
# variables
|
|
74
|
+
#
|
|
75
|
+
|
|
76
|
+
@transitions = Array.new
|
|
77
|
+
@transition_chain = Hash.new
|
|
78
|
+
@exception_handler = Hash.new
|
|
79
|
+
|
|
80
|
+
#
|
|
81
|
+
# default transitions
|
|
82
|
+
#
|
|
83
|
+
|
|
84
|
+
define_transition :init
|
|
85
|
+
define_transition :terminate
|
|
86
|
+
|
|
87
|
+
#
|
|
88
|
+
# class methods
|
|
89
|
+
#
|
|
90
|
+
|
|
91
|
+
def self.inherited(subclass)
|
|
92
|
+
subclass.instance_variable_set(:@transitions, @transitions.clone)
|
|
93
|
+
subclass.instance_variable_set(:@transition_chain, @transition_chain.clone)
|
|
94
|
+
subclass.instance_variable_set(:@exception_handler, @exception_handler.clone)
|
|
139
95
|
end
|
|
140
96
|
|
|
141
|
-
#
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
exception_handler_table.keys
|
|
97
|
+
# Set the agent type.
|
|
98
|
+
def self.set_agent_type(agent_type, klass=nil)
|
|
99
|
+
@agent_type = agent_type
|
|
100
|
+
Agent.set_agent(klass) if klass
|
|
146
101
|
end
|
|
147
|
-
end
|
|
148
102
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
103
|
+
# Return the agent type.
|
|
104
|
+
def self.agent_type
|
|
105
|
+
@agent_type
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
#
|
|
109
|
+
# instance methods
|
|
110
|
+
#
|
|
153
111
|
|
|
154
|
-
|
|
112
|
+
forward :class, :agent_type
|
|
113
|
+
attr_reader :chain_threads # transition chain thread group
|
|
114
|
+
|
|
115
|
+
def initialize
|
|
116
|
+
@chain_threads = ThreadGroup.new
|
|
117
|
+
|
|
118
|
+
# for wait_until_before method
|
|
119
|
+
@__wait_until_before_mutex__ = Mutex.new
|
|
120
|
+
@__wait_until_before_cv__ = Hash.new {|h, k| h[k] = ConditionVariable.new}
|
|
121
|
+
|
|
122
|
+
# for wait_until_after method
|
|
123
|
+
@__wait_until_after_mutex__ = Mutex.new
|
|
124
|
+
@__wait_until_after_cv__ = Hash.new {|h, k| h[k] = ConditionVariable.new}
|
|
125
|
+
end
|
|
155
126
|
|
|
156
127
|
# Start agent activity.
|
|
157
|
-
# @return the agent
|
|
158
128
|
def start
|
|
159
|
-
|
|
129
|
+
unless @chain_threads.list.empty?
|
|
130
|
+
raise TerminationError.new(self, states)
|
|
131
|
+
end
|
|
160
132
|
|
|
133
|
+
# save current thread
|
|
161
134
|
@__owner_thread__ = Thread.current
|
|
162
|
-
|
|
163
|
-
|
|
135
|
+
|
|
136
|
+
# start a new chain thread
|
|
137
|
+
@chain_threads.add(start_running(:init, [], AgentState.new, true))
|
|
138
|
+
@chain_threads.enclose
|
|
139
|
+
|
|
164
140
|
return self
|
|
165
141
|
end
|
|
166
142
|
|
|
167
|
-
#
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
143
|
+
# Fire the transtion with inputs.
|
|
144
|
+
def transit(transition, transition_inputs)
|
|
145
|
+
# wake up threads that wait by wait_until_before method
|
|
146
|
+
if @__wait_until_before_cv__.has_key?(transition)
|
|
147
|
+
@__wait_until_before_mutex__.synchronize do
|
|
148
|
+
@__wait_until_before_cv__[transition].broadcast
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# mark current transition
|
|
153
|
+
Thread.current[:agent_state] =
|
|
154
|
+
AgentState.new(previous: Thread.current[:agent_state].previous, current: transition)
|
|
155
|
+
|
|
156
|
+
# call transition
|
|
157
|
+
result = call_transition_method(transition, transition_inputs)
|
|
158
|
+
result = result.nil? ? [] : result
|
|
159
|
+
result = result.is_a?(Array) ? result : [result]
|
|
160
|
+
|
|
161
|
+
# unmark current transition and mark previous transition
|
|
162
|
+
Thread.current[:agent_state] = AgentState.new(previous: transition, current: nil)
|
|
173
163
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
raise TransitionError.new(current_state)
|
|
164
|
+
# wake up threads that wait by wait_until_after method
|
|
165
|
+
if @__wait_until_after_cv__.has_key?(transition)
|
|
166
|
+
@__wait_until_after_mutex__.synchronize do
|
|
167
|
+
@__wait_until_after_cv__[transition].broadcast
|
|
168
|
+
end
|
|
180
169
|
end
|
|
181
170
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
if error_state = exception_handler(e)
|
|
192
|
-
# known exception : go error state
|
|
193
|
-
set_next_state(error_state)
|
|
194
|
-
@__result__ = [e]
|
|
171
|
+
return transition, result
|
|
172
|
+
rescue StandardError => e
|
|
173
|
+
# error handling
|
|
174
|
+
if error_transition = get_exception_handler(e)
|
|
175
|
+
raise unless error_transition.is_a?(Symbol)
|
|
176
|
+
return transit(error_transition, [e])
|
|
177
|
+
else
|
|
178
|
+
if @__owner_thread and @__owner_thread__.alive?
|
|
179
|
+
@__owner_thread__.raise e
|
|
195
180
|
else
|
|
196
|
-
|
|
197
|
-
if @__owner_thread__.alive?
|
|
198
|
-
@__owner_thread__.raise e
|
|
199
|
-
else
|
|
200
|
-
raise e
|
|
201
|
-
end
|
|
181
|
+
raise e
|
|
202
182
|
end
|
|
203
183
|
end
|
|
204
184
|
end
|
|
205
185
|
|
|
206
|
-
#
|
|
207
|
-
def
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
186
|
+
# Return agent states.
|
|
187
|
+
def states
|
|
188
|
+
@chain_threads.list.map {|th| th[:agent_state]}
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# Sleep until before the agent fires the transition.
|
|
192
|
+
def wait_until_before(transition, sec=10)
|
|
193
|
+
timeout(sec) do
|
|
194
|
+
@__wait_until_before_mutex__.synchronize do
|
|
195
|
+
@__wait_until_before_cv__[transition].wait(@__wait_until_before_mutex__)
|
|
211
196
|
end
|
|
212
|
-
rescue Timeout::Error
|
|
213
|
-
raise TimeoutStateWaiting.new(state, current_state)
|
|
214
197
|
end
|
|
198
|
+
rescue Timeout::Error
|
|
199
|
+
raise TimeoutError.new(self, @chain_threads.list.map{|th| th[:agent_state]}, sec)
|
|
215
200
|
end
|
|
216
201
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
res = call_transition_method(:terminated)
|
|
221
|
-
rescue DRb::DRbConnError, DRb::ReplyReaderThreadError => e
|
|
222
|
-
Util::ErrorReport.warn("raised a connection error when we terminated", self, e, __FILE__, __LINE__)
|
|
202
|
+
def wait_until(transition, sec=10)
|
|
203
|
+
unless @chain_threads.list.any? {|th| th[:agent_state] and th[:agent_state].current == transition}
|
|
204
|
+
wait_until_before(transition, sec)
|
|
223
205
|
end
|
|
224
|
-
# set agent state
|
|
225
|
-
set_current_state(:terminated)
|
|
226
|
-
return res
|
|
227
206
|
end
|
|
228
207
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
208
|
+
# Sleep until after the agent fires the transition.
|
|
209
|
+
def wait_until_after(transition, sec=10)
|
|
210
|
+
timeout(sec) do
|
|
211
|
+
@__wait_until_after_mutex__.synchronize do
|
|
212
|
+
@__wait_until_after_cv__[transition].wait(@__wait_until_after_mutex__)
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
rescue Timeout::Error => e
|
|
216
|
+
raise TimeoutError.new(self, @chain_threads.list.map{|th| th[:agent_state]}, sec)
|
|
234
217
|
end
|
|
235
218
|
|
|
236
|
-
#
|
|
237
|
-
def
|
|
238
|
-
|
|
219
|
+
# Sleep caller thread until the agent is terminated.
|
|
220
|
+
def wait_until_terminated(sec=10)
|
|
221
|
+
unless terminated?
|
|
222
|
+
wait_until_after(:terminate, sec)
|
|
223
|
+
@chain_threads.list.each {|thread| thread.join}
|
|
224
|
+
end
|
|
239
225
|
end
|
|
240
226
|
|
|
241
|
-
#
|
|
242
|
-
def
|
|
243
|
-
|
|
244
|
-
arity = method.arity
|
|
245
|
-
_args = args[0...arity]
|
|
246
|
-
method.call(*_args)
|
|
247
|
-
end
|
|
227
|
+
# Terminate the agent activity.
|
|
228
|
+
def terminate
|
|
229
|
+
state = nil
|
|
248
230
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
231
|
+
Thread.new {
|
|
232
|
+
|
|
233
|
+
# kill all chain threads
|
|
234
|
+
@chain_threads.list.each do |thread|
|
|
235
|
+
state = thread[:agent_state] # save last state
|
|
236
|
+
unless thread == Thread.current
|
|
237
|
+
thread.kill
|
|
238
|
+
thread.join
|
|
239
|
+
end
|
|
257
240
|
end
|
|
258
|
-
end
|
|
259
|
-
return handler
|
|
260
|
-
end
|
|
261
241
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
242
|
+
# fire "terminate" transtion
|
|
243
|
+
begin
|
|
244
|
+
Thread.current[:agent_state] = state || AgentState.new
|
|
245
|
+
transit(:terminate, [])
|
|
246
|
+
rescue DRb::DRbConnError, DRbPatch::ReplyReaderError => e
|
|
247
|
+
Log::Debug.warn("raised a connection error when we terminated", self, e)
|
|
268
248
|
end
|
|
269
|
-
|
|
270
|
-
# do nothing, agent will be dead...
|
|
271
|
-
end
|
|
249
|
+
}.join
|
|
272
250
|
end
|
|
273
251
|
|
|
274
|
-
|
|
275
|
-
|
|
252
|
+
# Return true if the agent has been terminated.
|
|
253
|
+
def terminated?
|
|
254
|
+
return (@chain_threads.list.empty? and @chain_threads.enclosed?)
|
|
276
255
|
end
|
|
277
256
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
257
|
+
private
|
|
258
|
+
|
|
259
|
+
# Start transition chain.
|
|
260
|
+
def start_running(transition, result, state, free)
|
|
261
|
+
thread = free ? Util::FreeThreadGenerator.method(:generate) : Thread.method(:new)
|
|
262
|
+
thread.call do
|
|
263
|
+
begin
|
|
264
|
+
Thread.current[:agent_state] = state
|
|
265
|
+
while true
|
|
266
|
+
# fire the transition
|
|
267
|
+
# NOTE: transition name is maybe changed by the result of firing
|
|
268
|
+
_transition, result, count = transit(transition, result)
|
|
269
|
+
state = Thread.current[:agent_state]
|
|
270
|
+
|
|
271
|
+
begin
|
|
272
|
+
# go next transition
|
|
273
|
+
next_transitions = get_next_transitions(_transition, result)
|
|
274
|
+
transition, *branches = next_transitions
|
|
275
|
+
# handle transition branches
|
|
276
|
+
branches.each {|t| start_running(t, result, state, false)}
|
|
277
|
+
rescue TerminationError
|
|
278
|
+
break # end loop after terminate transition
|
|
279
|
+
end
|
|
280
|
+
end
|
|
281
|
+
rescue Exception => e
|
|
282
|
+
# throw the exception to command's runnning thread
|
|
283
|
+
if Global.command and Global.command.running_thread and Global.command.running_thread.alive?
|
|
284
|
+
Global.command.running_thread.raise e
|
|
285
|
+
else
|
|
286
|
+
raise e
|
|
287
|
+
end
|
|
288
288
|
end
|
|
289
|
-
return next_state
|
|
290
289
|
end
|
|
291
290
|
end
|
|
292
291
|
|
|
293
|
-
#
|
|
294
|
-
def
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
@running_thread.raise Aborting
|
|
298
|
-
# wait to stop the thread
|
|
299
|
-
@running_thread.join
|
|
300
|
-
end if @running_thread
|
|
292
|
+
# Call the transition method.
|
|
293
|
+
def call_transition_method(transition, args)
|
|
294
|
+
method = method("transit_to_#{transition}")
|
|
295
|
+
method.call(*args[0,method.arity])
|
|
301
296
|
end
|
|
302
|
-
end
|
|
303
297
|
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
298
|
+
# Get transtion for the exception.
|
|
299
|
+
def get_exception_handler(e)
|
|
300
|
+
table = self.class.exception_handler
|
|
301
|
+
e.class.ancestors.each do |mod|
|
|
302
|
+
return table[mod] if table.has_key?(mod)
|
|
303
|
+
end
|
|
304
|
+
end
|
|
309
305
|
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
306
|
+
# Get next transitions based on transition chain table with previous transition result.
|
|
307
|
+
def get_next_transitions(transition, result)
|
|
308
|
+
next_transitions = self.class.transition_chain[transition]
|
|
309
|
+
if next_transitions.is_a?(Proc)
|
|
310
|
+
next_transitions = next_transitions.call(self, *result)
|
|
311
|
+
end
|
|
312
|
+
if next_transitions.nil? or (next_transitions == [])
|
|
313
|
+
raise TerminationError.new(self, states)
|
|
314
|
+
end
|
|
315
|
+
return next_transitions
|
|
313
316
|
end
|
|
317
|
+
end
|
|
314
318
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
319
|
+
# AgentState represents a state of agent. The state is a pair of previous
|
|
320
|
+
# transiton and current transition.
|
|
321
|
+
class AgentState < StructX
|
|
322
|
+
member :previous
|
|
323
|
+
member :current
|
|
324
|
+
|
|
325
|
+
def previous?(state)
|
|
326
|
+
previous == state
|
|
318
327
|
end
|
|
319
328
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
@agent_type
|
|
329
|
+
def current?(state)
|
|
330
|
+
current == state
|
|
323
331
|
end
|
|
324
332
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
self.class.agent_type
|
|
333
|
+
def to_s
|
|
334
|
+
"<%s=>%s>" % [previous, current]
|
|
328
335
|
end
|
|
329
336
|
end
|
|
330
337
|
end
|