pione 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +14 -0
- data/Gemfile +5 -0
- data/LICENSE.txt +22 -0
- data/README.md +94 -0
- data/Rakefile +118 -0
- data/bin/pione-broker +5 -0
- data/bin/pione-clean +5 -0
- data/bin/pione-client +5 -0
- data/bin/pione-eval +111 -0
- data/bin/pione-relay +5 -0
- data/bin/pione-relay-account-db +5 -0
- data/bin/pione-relay-client-db +5 -0
- data/bin/pione-search-log +30 -0
- data/bin/pione-syntax-checker +5 -0
- data/bin/pione-task-worker +5 -0
- data/bin/pione-tuple-space-provider +5 -0
- data/bin/pione-tuple-space-receiver +5 -0
- data/bin/pione-tuple-space-viewer +5 -0
- data/demo/demo.rb +311 -0
- data/demo/public/base.css +94 -0
- data/demo/public/demo.js +107 -0
- data/demo/public/index.html +91 -0
- data/demo/public/jquery-1.8.3.min.js +2 -0
- data/example/CountChar/CountChar.pione +64 -0
- data/example/CountChar/misc/CountChar.rb +22 -0
- data/example/CountChar/text/aidokushono_insho.txt +32 -0
- data/example/CountChar/text/aikokuka_shokan.txt +108 -0
- data/example/CountChar/text/carlyle_hakubutsukan.txt +58 -0
- data/example/CountChar/text/dark_minister.txt +2440 -0
- data/example/CountChar/text/kaikano_otto.txt +61 -0
- data/example/CountChar/text/kaikon.txt +30 -0
- data/example/CountChar/text/nagashimano_shi.txt +45 -0
- data/example/CountChar/text/saikachibuchi.txt +80 -0
- data/example/CountChar/text/saikonihonno_josei.txt +91 -0
- data/example/CountChar/text/taishojugonenno_bundan.txt +21 -0
- data/example/FeatureExample/FeatureExample.pione +7 -0
- data/example/Fib/Fib.pione +56 -0
- data/example/Fib/FibBC.pione +56 -0
- data/example/HelloWorld/HelloWorld.pione +5 -0
- data/example/LucasNumber/LucasNumber.pione +64 -0
- data/example/MakePair/MakePair.pione +14 -0
- data/example/MakePair/data/1.i +0 -0
- data/example/MakePair/data/2.i +0 -0
- data/example/MakePair/data/3.i +0 -0
- data/example/MakePair/data/4.i +0 -0
- data/example/MakePair/data/5.i +0 -0
- data/example/SieveOfEratosthenes/SieveOfEratosthenes.pione +61 -0
- data/example/SingleParticlesWithRef/Makefile +289 -0
- data/example/SingleParticlesWithRef/SingleParticlesWithRef.Makefile +153 -0
- data/example/SingleParticlesWithRef/SingleParticlesWithRef.pione +116 -0
- data/example/SingleParticlesWithRef/SingleParticlesWithRefFull.pione +400 -0
- data/example/SingleParticlesWithRef/data/121p-shift-0-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-0-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-0-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-0-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-0-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-0-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-120-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-120-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-120-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-120-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-120-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-120-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-180-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-180-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-180-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-180-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-180-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-180-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-240-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-240-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-240-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-240-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-240-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-240-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-300-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-300-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-300-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-300-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-300-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-300-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-60-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-60-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-60-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-60-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-60-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-60-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-0-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-0-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-0-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-0-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-0-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-0-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-120-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-120-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-120-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-120-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-120-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-120-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-180-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-180-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-180-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-180-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-180-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-180-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-240-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-240-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-240-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-240-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-240-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-240-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-300-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-300-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-300-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-300-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-300-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-300-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-60-0-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-60-120-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-60-180-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-60-240-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-60-300-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift-noise-60-60-0.roi +0 -0
- data/example/SingleParticlesWithRef/data/121p-shift.pdb +3381 -0
- data/example/SingleParticlesWithRef/data/all.ref2d +0 -0
- data/example/SingleParticlesWithRef/data/all.ref3d +0 -0
- data/example/Sum/Sum.pione +52 -0
- data/example/SyntaxError/call_rule_error.pione +6 -0
- data/example/SyntaxError/feature_line_error.pione +7 -0
- data/example/SyntaxError/flow_block_error.pione +5 -0
- data/example/SyntaxError/input_line_error.pione +6 -0
- data/example/SyntaxError/invalid_rule_name.pione +6 -0
- data/example/SyntaxError/param_line_error.pione +7 -0
- data/example/SyntaxError/variable-binding-error.pione +11 -0
- data/lib/pione.rb +241 -0
- data/lib/pione/agent/basic-agent.rb +333 -0
- data/lib/pione/agent/broker.rb +274 -0
- data/lib/pione/agent/command-listener.rb +47 -0
- data/lib/pione/agent/input-generator.rb +194 -0
- data/lib/pione/agent/logger.rb +65 -0
- data/lib/pione/agent/process-manager.rb +38 -0
- data/lib/pione/agent/rule-provider.rb +64 -0
- data/lib/pione/agent/task-worker.rb +274 -0
- data/lib/pione/agent/trivial-routine-worker.rb +28 -0
- data/lib/pione/agent/tuple-space-client.rb +146 -0
- data/lib/pione/agent/tuple-space-server-client-life-checker.rb +29 -0
- data/lib/pione/command-option/basic-option.rb +42 -0
- data/lib/pione/command-option/child-process-option.rb +17 -0
- data/lib/pione/command-option/common-option.rb +29 -0
- data/lib/pione/command-option/daemon-option.rb +12 -0
- data/lib/pione/command-option/presence-notifier-option.rb +15 -0
- data/lib/pione/command-option/task-worker-owner-option.rb +17 -0
- data/lib/pione/command-option/tuple-space-provider-option.rb +26 -0
- data/lib/pione/command-option/tuple-space-provider-owner-option.rb +16 -0
- data/lib/pione/command-option/tuple-space-receiver-option.rb +12 -0
- data/lib/pione/command/basic-command.rb +126 -0
- data/lib/pione/command/child-process.rb +43 -0
- data/lib/pione/command/daemon-process.rb +18 -0
- data/lib/pione/command/front-owner-command.rb +37 -0
- data/lib/pione/command/pione-broker.rb +53 -0
- data/lib/pione/command/pione-clean.rb +16 -0
- data/lib/pione/command/pione-client.rb +273 -0
- data/lib/pione/command/pione-relay-account-db.rb +85 -0
- data/lib/pione/command/pione-relay-client-db.rb +80 -0
- data/lib/pione/command/pione-relay.rb +47 -0
- data/lib/pione/command/pione-syntax-checker.rb +103 -0
- data/lib/pione/command/pione-task-worker.rb +123 -0
- data/lib/pione/command/pione-tuple-space-provider.rb +87 -0
- data/lib/pione/command/pione-tuple-space-receiver.rb +55 -0
- data/lib/pione/command/pione-tuple-space-viewer.rb +151 -0
- data/lib/pione/command/tuple-space-provider-owner.rb +6 -0
- data/lib/pione/front/basic-front.rb +64 -0
- data/lib/pione/front/broker-front.rb +30 -0
- data/lib/pione/front/client-front.rb +28 -0
- data/lib/pione/front/relay-front.rb +19 -0
- data/lib/pione/front/task-worker-front.rb +16 -0
- data/lib/pione/front/task-worker-owner.rb +42 -0
- data/lib/pione/front/tuple-space-provider-front.rb +22 -0
- data/lib/pione/front/tuple-space-provider-owner.rb +11 -0
- data/lib/pione/front/tuple-space-receiver-front.rb +18 -0
- data/lib/pione/model/assignment.rb +89 -0
- data/lib/pione/model/basic-model.rb +395 -0
- data/lib/pione/model/binary-operator.rb +80 -0
- data/lib/pione/model/block.rb +233 -0
- data/lib/pione/model/boolean.rb +138 -0
- data/lib/pione/model/call-rule.rb +69 -0
- data/lib/pione/model/data-expr.rb +360 -0
- data/lib/pione/model/feature-expr.rb +794 -0
- data/lib/pione/model/float.rb +107 -0
- data/lib/pione/model/integer.rb +140 -0
- data/lib/pione/model/list.rb +104 -0
- data/lib/pione/model/message.rb +80 -0
- data/lib/pione/model/package.rb +48 -0
- data/lib/pione/model/parameters.rb +282 -0
- data/lib/pione/model/rule-expr.rb +120 -0
- data/lib/pione/model/rule-io.rb +166 -0
- data/lib/pione/model/rule.rb +294 -0
- data/lib/pione/model/string.rb +111 -0
- data/lib/pione/model/undefined-value.rb +24 -0
- data/lib/pione/model/variable-table.rb +315 -0
- data/lib/pione/model/variable.rb +87 -0
- data/lib/pione/parser/block-parser.rb +83 -0
- data/lib/pione/parser/common-parser.rb +145 -0
- data/lib/pione/parser/document-parser.rb +58 -0
- data/lib/pione/parser/error-message.yml +4 -0
- data/lib/pione/parser/expr-parser.rb +266 -0
- data/lib/pione/parser/feature-expr-parser.rb +105 -0
- data/lib/pione/parser/flow-element-parser.rb +181 -0
- data/lib/pione/parser/literal-parser.rb +182 -0
- data/lib/pione/parser/rule-definition-parser.rb +163 -0
- data/lib/pione/parser/syntax-error.rb +61 -0
- data/lib/pione/patch/array-patch.rb +3 -0
- data/lib/pione/patch/drb-patch.rb +467 -0
- data/lib/pione/patch/monitor-patch.rb +16 -0
- data/lib/pione/patch/rinda-patch.rb +759 -0
- data/lib/pione/patch/uri-patch.rb +66 -0
- data/lib/pione/relay/receiver-socket.rb +69 -0
- data/lib/pione/relay/relay-account-db.rb +55 -0
- data/lib/pione/relay/relay-client-db.rb +53 -0
- data/lib/pione/relay/relay-socket.rb +215 -0
- data/lib/pione/relay/trampoline.rb +22 -0
- data/lib/pione/relay/transmitter-socket.rb +167 -0
- data/lib/pione/resource/basic-resource.rb +92 -0
- data/lib/pione/resource/dropbox-resource.rb +106 -0
- data/lib/pione/resource/ftp.rb +84 -0
- data/lib/pione/resource/local.rb +113 -0
- data/lib/pione/rule-handler/action-handler.rb +184 -0
- data/lib/pione/rule-handler/basic-handler.rb +217 -0
- data/lib/pione/rule-handler/flow-handler.rb +339 -0
- data/lib/pione/rule-handler/root-handler.rb +23 -0
- data/lib/pione/rule-handler/system-handler.rb +13 -0
- data/lib/pione/system/common.rb +22 -0
- data/lib/pione/system/config.rb +20 -0
- data/lib/pione/system/document.rb +81 -0
- data/lib/pione/system/file-cache.rb +150 -0
- data/lib/pione/system/global.rb +346 -0
- data/lib/pione/system/identifier.rb +61 -0
- data/lib/pione/system/init.rb +16 -0
- data/lib/pione/system/object.rb +35 -0
- data/lib/pione/transformer/block-transformer.rb +23 -0
- data/lib/pione/transformer/document-transformer.rb +36 -0
- data/lib/pione/transformer/expr-transformer.rb +89 -0
- data/lib/pione/transformer/feature-expr-transformer.rb +56 -0
- data/lib/pione/transformer/flow-element-transformer.rb +66 -0
- data/lib/pione/transformer/literal-transformer.rb +76 -0
- data/lib/pione/transformer/rule-definition-transformer.rb +62 -0
- data/lib/pione/transformer/transformer-module.rb +37 -0
- data/lib/pione/tuple-space/data-finder.rb +165 -0
- data/lib/pione/tuple-space/presence-notifier.rb +83 -0
- data/lib/pione/tuple-space/relay.rb +9 -0
- data/lib/pione/tuple-space/tuple-space-provider.rb +85 -0
- data/lib/pione/tuple-space/tuple-space-receiver.rb +140 -0
- data/lib/pione/tuple-space/tuple-space-server-interface.rb +60 -0
- data/lib/pione/tuple-space/tuple-space-server.rb +156 -0
- data/lib/pione/tuple-space/update-criteria.rb +96 -0
- data/lib/pione/tuple/agent-tuple.rb +10 -0
- data/lib/pione/tuple/attribute-tuple.rb +7 -0
- data/lib/pione/tuple/base-uri-tuple.rb +9 -0
- data/lib/pione/tuple/basic-tuple.rb +317 -0
- data/lib/pione/tuple/bye-tuple.rb +9 -0
- data/lib/pione/tuple/command-tuple.rb +9 -0
- data/lib/pione/tuple/data-tuple.rb +18 -0
- data/lib/pione/tuple/dry-run-tuple.rb +8 -0
- data/lib/pione/tuple/exception-tuple.rb +11 -0
- data/lib/pione/tuple/finished-tuple.rb +17 -0
- data/lib/pione/tuple/foreground-tuple.rb +7 -0
- data/lib/pione/tuple/log-tuple.rb +14 -0
- data/lib/pione/tuple/process-info-tuple.rb +9 -0
- data/lib/pione/tuple/request-rule-tuple.rb +9 -0
- data/lib/pione/tuple/rule-tuple.rb +10 -0
- data/lib/pione/tuple/shift-tuple.rb +13 -0
- data/lib/pione/tuple/task-tuple.rb +36 -0
- data/lib/pione/tuple/task-worker-resource-tuple.rb +9 -0
- data/lib/pione/tuple/working-tuple.rb +13 -0
- data/lib/pione/uri-scheme/basic-scheme.rb +40 -0
- data/lib/pione/uri-scheme/broadcast-scheme.rb +11 -0
- data/lib/pione/uri-scheme/dropbox-scheme.rb +9 -0
- data/lib/pione/uri-scheme/local-scheme.rb +28 -0
- data/lib/pione/util/error-report.rb +12 -0
- data/lib/pione/util/log.rb +79 -0
- data/lib/pione/util/message.rb +155 -0
- data/lib/pione/util/misc.rb +73 -0
- data/lib/pione/util/terminal.rb +78 -0
- data/lib/pione/util/waiter-table.rb +53 -0
- data/lib/pione/version.rb +3 -0
- data/misc/env.sh +2 -0
- data/misc/test-drb-stop-service.rb +34 -0
- data/misc/test-ensure-and-thread-kill.rb +40 -0
- data/misc/test-many-waiters-client.rb +56 -0
- data/misc/test-many-waiters-server.rb +14 -0
- data/misc/write_and_take_test.png +0 -0
- data/misc/write_and_take_test.rb +36 -0
- data/pione.gemspec +49 -0
- data/test/agent/spec_basic-agent.rb +170 -0
- data/test/agent/spec_broker.rb +36 -0
- data/test/agent/spec_command-listener.rb +30 -0
- data/test/agent/spec_input-generator.rb +123 -0
- data/test/agent/spec_logger.rb +71 -0
- data/test/agent/spec_rule-provider.rb +65 -0
- data/test/agent/spec_task-worker.rb +307 -0
- data/test/agent/spec_tuple-space-client.rb +30 -0
- data/test/model/spec_assignment.rb +51 -0
- data/test/model/spec_binary-operator.rb +39 -0
- data/test/model/spec_block.rb +154 -0
- data/test/model/spec_boolean.rb +115 -0
- data/test/model/spec_call-rule.rb +23 -0
- data/test/model/spec_data-expr.rb +312 -0
- data/test/model/spec_feature-expr.rb +359 -0
- data/test/model/spec_feature-expr.yml +16 -0
- data/test/model/spec_float.rb +141 -0
- data/test/model/spec_integer.rb +141 -0
- data/test/model/spec_list.rb +26 -0
- data/test/model/spec_message.rb +42 -0
- data/test/model/spec_package.rb +15 -0
- data/test/model/spec_parameters.rb +148 -0
- data/test/model/spec_rule-expr.rb +66 -0
- data/test/model/spec_rule-io.rb +32 -0
- data/test/model/spec_rule.rb +158 -0
- data/test/model/spec_string.rb +106 -0
- data/test/model/spec_variable-table.rb +117 -0
- data/test/model/spec_variable.rb +84 -0
- data/test/parser/spec_block-parser.rb +5 -0
- data/test/parser/spec_block-parser.yml +85 -0
- data/test/parser/spec_common-parser.rb +281 -0
- data/test/parser/spec_expr-parser.rb +6 -0
- data/test/parser/spec_expr-parser.yml +82 -0
- data/test/parser/spec_feature-expr-parser.rb +32 -0
- data/test/parser/spec_feature-expr-parser.yml +25 -0
- data/test/parser/spec_flow-element-parser.rb +5 -0
- data/test/parser/spec_flow-element-parser.yml +180 -0
- data/test/parser/spec_literal-parser.rb +5 -0
- data/test/parser/spec_literal-parser.yml +123 -0
- data/test/parser/spec_rule-definition-parser.rb +5 -0
- data/test/parser/spec_rule-definition-parser.yml +93 -0
- data/test/patch/spec_rinda-patch.rb +32 -0
- data/test/patch/spec_uri-patch.rb +23 -0
- data/test/rule-handler/spec_action-handler.rb +135 -0
- data/test/rule-handler/spec_flow-handler.rb +127 -0
- data/test/spec_common.rb +14 -0
- data/test/spec_data-finder.rb +88 -0
- data/test/spec_data-finder.yml +115 -0
- data/test/spec_document.rb +76 -0
- data/test/spec_identifier.rb +29 -0
- data/test/spec_log.rb +52 -0
- data/test/spec_object.rb +20 -0
- data/test/spec_resource.rb +73 -0
- data/test/spec_update-criteria.rb +83 -0
- data/test/test-util.rb +223 -0
- data/test/transformer/spec_block-transformer.rb +26 -0
- data/test/transformer/spec_expr-transformer.rb +106 -0
- data/test/transformer/spec_feature-expr-transformer.rb +21 -0
- data/test/transformer/spec_flow-element-transformer.rb +154 -0
- data/test/transformer/spec_literal-transformer.rb +58 -0
- data/test/transformer/spec_rule-definition-transformer.rb +168 -0
- data/test/tuple-space/spec_tuple-space-provider.rb +36 -0
- data/test/tuple-space/spec_tuple-space-receiver.rb +32 -0
- data/test/tuple-space/spec_tuple-space-server.rb +49 -0
- data/test/tuple/spec_basic-tuple.rb +87 -0
- data/test/tuple/spec_data-tuple.rb +85 -0
- data/test/tuple/spec_finished-tuple.rb +61 -0
- data/test/tuple/spec_task-tuple.rb +127 -0
- data/test/tuple/spec_working-tuple.rb +58 -0
- data/test/uri-scheme/spec_broadcast-scheme.rb +40 -0
- data/test/uri-scheme/spec_dropbox-scheme.rb +31 -0
- data/test/uri-scheme/spec_local-scheme.rb +69 -0
- metadata +660 -0
@@ -0,0 +1,62 @@
|
|
1
|
+
module Pione
|
2
|
+
module Transformer
|
3
|
+
module RuleDefinitionTransformer
|
4
|
+
include TransformerModule
|
5
|
+
|
6
|
+
def check_model_type(obj, pione_model_type)
|
7
|
+
pione_model_type.match(obj.pione_mode_type)
|
8
|
+
end
|
9
|
+
module_function :check_model_type
|
10
|
+
|
11
|
+
# rule_definition
|
12
|
+
rule(:rule_definition => {
|
13
|
+
:rule_header => simple(:rule_expr),
|
14
|
+
:rule_conditions => sequence(:conditions),
|
15
|
+
:block => simple(:block) }) {
|
16
|
+
inputs = conditions.select{|c| c.type == :input}.map{|c| c.obj}
|
17
|
+
outputs = conditions.select{|c| c.type == :output}.map{|c| c.obj}
|
18
|
+
params = Parameters.merge(
|
19
|
+
*conditions.select{|c| c.type == :param}.map{|c| c.obj}
|
20
|
+
)
|
21
|
+
features = Feature::AndExpr.new(
|
22
|
+
*conditions.select{|c| c.type == :feature}.map{|c| c.obj}
|
23
|
+
)
|
24
|
+
condition = RuleCondition.new(inputs, outputs, params, features)
|
25
|
+
case block
|
26
|
+
when ActionBlock
|
27
|
+
ActionRule
|
28
|
+
when FlowBlock
|
29
|
+
FlowRule
|
30
|
+
end.new(rule_expr, condition, block)
|
31
|
+
}
|
32
|
+
|
33
|
+
ConditionLine = Struct.new(:type, :obj)
|
34
|
+
|
35
|
+
# input_line
|
36
|
+
rule(:input_line => simple(:data_expr)) {
|
37
|
+
TypeDataExpr.check(data_expr)
|
38
|
+
ConditionLine.new(:input, data_expr)
|
39
|
+
}
|
40
|
+
|
41
|
+
# output_line
|
42
|
+
rule(:output_line => simple(:data_expr)) {
|
43
|
+
TypeDataExpr.check(data_expr)
|
44
|
+
ConditionLine.new(:output, data_expr)
|
45
|
+
}
|
46
|
+
|
47
|
+
# param_line
|
48
|
+
rule(:param_line => simple(:param)) {
|
49
|
+
unless TypeAssignment.match(param) or TypeParameters.match(param)
|
50
|
+
raise PioneModelTypeError.new(param, TypeAssignment)
|
51
|
+
end
|
52
|
+
ConditionLine.new(:param, param)
|
53
|
+
}
|
54
|
+
|
55
|
+
# feature_line
|
56
|
+
rule(:feature_line => simple(:feature)) {
|
57
|
+
TypeFeature.check(feature)
|
58
|
+
ConditionLine.new(:feature, feature)
|
59
|
+
}
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Pione
|
2
|
+
module Transformer
|
3
|
+
module TransformerModule
|
4
|
+
class << self
|
5
|
+
def included(mod)
|
6
|
+
singleton = class << mod; self; end
|
7
|
+
create_pair_by(Parslet, Parslet::Transform).each do |name, orig|
|
8
|
+
singleton.__send__(:define_method, name) do |*args, &b|
|
9
|
+
orig.__send__(name, *args, &b)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class << mod
|
14
|
+
def included(klass)
|
15
|
+
name = :@__transform_rules
|
16
|
+
klass_rules = klass.instance_variable_get(name)
|
17
|
+
klass_rules = klass_rules ? klass_rules + rules : rules
|
18
|
+
klass.instance_variable_set(name, klass_rules)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def create_pair_by(*mods)
|
26
|
+
mods.inject([]) do |list, mod|
|
27
|
+
list += create_pair(mod)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def create_pair(mod)
|
32
|
+
(mod.methods.sort - Object.methods.sort).map{|m| [m, mod]}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,165 @@
|
|
1
|
+
module Pione
|
2
|
+
# DataFinder finds data tuples from tuple space server.
|
3
|
+
class DataFinder < PioneObject
|
4
|
+
|
5
|
+
# DataFinderResult represents an element of DataFinder#find results. The
|
6
|
+
# attribute +combination+ is a rule inputs combination and +variable_table+
|
7
|
+
# is a variable table including variables for found date set.
|
8
|
+
class DataFinderResult < Struct.new(:combination, :variable_table)
|
9
|
+
# Returns true if the combination is empty.
|
10
|
+
# @return [Boolean]
|
11
|
+
# true if the result is empty
|
12
|
+
def empty?
|
13
|
+
self[:combination].empty?
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
include TupleSpaceServerInterface
|
18
|
+
|
19
|
+
# Creates a new finder.
|
20
|
+
# @param [TupleSpaceServer] ts_server
|
21
|
+
# tuple space server
|
22
|
+
# @param [String] domain
|
23
|
+
# target data domain to find
|
24
|
+
def initialize(ts_server, domain)
|
25
|
+
set_tuple_space_server(ts_server)
|
26
|
+
@domain = domain
|
27
|
+
end
|
28
|
+
|
29
|
+
# Find tuple combinations by data expressions from tuple space server.
|
30
|
+
# @param [Symbol] type
|
31
|
+
# :input if target date is for input or :output
|
32
|
+
# @param [DataExpr] exprs
|
33
|
+
# data-expr list
|
34
|
+
# @param [VariableTable] vtable
|
35
|
+
# variabel table
|
36
|
+
# @return [DataFinderResult]
|
37
|
+
# result data set
|
38
|
+
def find(type, exprs, vtable)
|
39
|
+
raise ArgumentError.new(vtable) unless vtable.kind_of?(VariableTable)
|
40
|
+
|
41
|
+
# variable table
|
42
|
+
new_vtable = VariableTable.new(vtable)
|
43
|
+
case type
|
44
|
+
when :input
|
45
|
+
# alias for I
|
46
|
+
new_vtable.set(Variable.new("INPUT"), Variable.new("I"))
|
47
|
+
when :output
|
48
|
+
# alias for O
|
49
|
+
new_vtable.set(Variable.new("OUTPUT"), Variable.new("O"))
|
50
|
+
end
|
51
|
+
|
52
|
+
find_rec(type, exprs, 1, new_vtable)
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
# Finds all data tuples by the expression from a tuple space server.
|
58
|
+
# @param [DataExpr] expr
|
59
|
+
# query expression of data
|
60
|
+
# @return [DataFinderResult]
|
61
|
+
# query result
|
62
|
+
# @api private
|
63
|
+
def find_by_expr(expr)
|
64
|
+
expr = DataExpr.new(expr) if expr.kind_of?(String)
|
65
|
+
query = Tuple[:data].new(name: expr, domain: @domain)
|
66
|
+
return tuple_space_server.read_all(query)
|
67
|
+
end
|
68
|
+
|
69
|
+
# Find input tuple combinatioins recursively.
|
70
|
+
def find_rec(type, exprs, index, vtable)
|
71
|
+
# return empty when we reach the recuirsion end
|
72
|
+
return [DataFinderResult.new([], vtable)] if exprs.empty?
|
73
|
+
|
74
|
+
# expand variables and compile to regular expression
|
75
|
+
head = exprs.first.eval(vtable)
|
76
|
+
tail = exprs.drop(1)
|
77
|
+
|
78
|
+
# find an input data by name from tuple space server
|
79
|
+
tuples = find_by_expr(head)
|
80
|
+
|
81
|
+
# make combination results
|
82
|
+
prefix = (type == :input ? "I" : "O")
|
83
|
+
if head.all?
|
84
|
+
# case all modifier
|
85
|
+
new_vtable =
|
86
|
+
make_auto_variables_by_all(prefix, head, tuples, vtable)
|
87
|
+
unless tuples.empty?
|
88
|
+
return find_rec_sub(type, tail, index, tuples, new_vtable)
|
89
|
+
end
|
90
|
+
else
|
91
|
+
# case each modifier
|
92
|
+
return tuples.map {|tuple|
|
93
|
+
args = [prefix, head, tuple, vtable, index]
|
94
|
+
new_vtable = make_auto_variables_by_each(*args)
|
95
|
+
find_rec_sub(type, tail, index, tuple, new_vtable)
|
96
|
+
}.flatten
|
97
|
+
end
|
98
|
+
|
99
|
+
# available combinations were not found
|
100
|
+
return []
|
101
|
+
end
|
102
|
+
|
103
|
+
# @api private
|
104
|
+
def find_rec_sub(type, tail, index, data, vtable)
|
105
|
+
find_rec(type, tail, index+1, vtable).map do |res|
|
106
|
+
new_combination = res.combination.unshift(data)
|
107
|
+
new_vtable = res.variable_table
|
108
|
+
DataFinderResult.new(new_combination, new_vtable)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
# Make auto-variables by the name modified 'all'.
|
113
|
+
# @api private
|
114
|
+
def make_auto_variables_by_all(prefix, expr, tuples, vtable)
|
115
|
+
# create new table
|
116
|
+
new_vtable = VariableTable.new(vtable)
|
117
|
+
# variable
|
118
|
+
var = Variable.new(prefix)
|
119
|
+
|
120
|
+
# setup rule-io list
|
121
|
+
list = new_vtable.get(var)
|
122
|
+
list = RuleIOList.new unless list
|
123
|
+
io_list = RuleIOList.new
|
124
|
+
new_vtable.set!(var, list.add(io_list))
|
125
|
+
|
126
|
+
# convert each tuples
|
127
|
+
tuples.each do |tuple, i|
|
128
|
+
elt = RuleIOElement.new(PioneString.new(tuple.name))
|
129
|
+
elt.uri = PioneString.new(tuple.uri)
|
130
|
+
elt.match = PioneList.new(
|
131
|
+
*expr.match(tuple.name).to_a.map{|m| PioneString.new(m)}
|
132
|
+
)
|
133
|
+
io_list.add!(elt)
|
134
|
+
end
|
135
|
+
|
136
|
+
return new_vtable
|
137
|
+
end
|
138
|
+
|
139
|
+
# Make auto-variables by the name modified 'each'.
|
140
|
+
# @api private
|
141
|
+
def make_auto_variables_by_each(prefix, expr, tuple, vtable, index)
|
142
|
+
# create new table
|
143
|
+
new_vtable = VariableTable.new(vtable)
|
144
|
+
# variable
|
145
|
+
var = Variable.new(prefix)
|
146
|
+
# matched data
|
147
|
+
md = expr.match(tuple.name).to_a
|
148
|
+
|
149
|
+
# setup rule-io list
|
150
|
+
list = new_vtable.get(var)
|
151
|
+
list = RuleIOList.new unless list
|
152
|
+
elt = RuleIOElement.new(PioneString.new(tuple.name))
|
153
|
+
elt.uri = PioneString.new(tuple.uri)
|
154
|
+
elt.match = PioneList.new(*md.map{|d| PioneString.new(d)})
|
155
|
+
new_vtable.set!(var, list.add(elt))
|
156
|
+
|
157
|
+
# set special variable if index equals 1
|
158
|
+
if prefix == 'I' && index == 1
|
159
|
+
new_vtable.set(Variable.new("*"), PioneString.new(md[1]))
|
160
|
+
end
|
161
|
+
|
162
|
+
return new_vtable
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module Pione
|
2
|
+
module TupleSpace
|
3
|
+
class PresenceNotifier < PioneObject
|
4
|
+
def self.inherited(subclass)
|
5
|
+
subclass.instance_variable_set(:@monitor, Monitor.new)
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.command_name
|
9
|
+
@command_name
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.set_command_name(name)
|
13
|
+
@command_name = name
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.notifier_uri
|
17
|
+
@notifier_uri.call
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.set_notifier_uri(proc)
|
21
|
+
@notifier_uri = proc
|
22
|
+
end
|
23
|
+
|
24
|
+
# Creates the tuple space provider as new process.
|
25
|
+
# @return [BasicFront]
|
26
|
+
# tuple space provider or receiver front
|
27
|
+
def self.spawn
|
28
|
+
user_message "create process for %s" % command_name
|
29
|
+
# create provider process
|
30
|
+
args = [command_name, '--parent-front', Global.front.uri]
|
31
|
+
args << "--debug" if Pione.debug_mode?
|
32
|
+
args << "--show-communication" if Global.show_communication
|
33
|
+
args << "--show-presence-notifier" if Global.show_presence_notifier
|
34
|
+
if self == TupleSpaceReceiver
|
35
|
+
args << "--presence-port"
|
36
|
+
args << Global.presence_port.to_s
|
37
|
+
end
|
38
|
+
args << "--my-ip-address"
|
39
|
+
args << Global.my_ip_address
|
40
|
+
if self == TupleSpaceProvider
|
41
|
+
Global.presence_notification_addresses.each do |address|
|
42
|
+
args << "--presence-notification-address"
|
43
|
+
args << address.to_s
|
44
|
+
end
|
45
|
+
end
|
46
|
+
pid = Process.spawn(*args)
|
47
|
+
thread = Process.detach(pid)
|
48
|
+
# wait that the provider starts up
|
49
|
+
while thread.alive?
|
50
|
+
begin
|
51
|
+
front = DRbObject.new_with_uri(notifier_uri)
|
52
|
+
break if front.uuid
|
53
|
+
rescue
|
54
|
+
sleep 0.1
|
55
|
+
end
|
56
|
+
end
|
57
|
+
if thread.alive?
|
58
|
+
return front
|
59
|
+
else
|
60
|
+
# failed to run pione-tuple-space-provider
|
61
|
+
Process.abort("You cannot run %s." % command_name)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Returns the provider instance.
|
66
|
+
# @return [PresenceNotifier]
|
67
|
+
# tuple space provider or receiver instance as druby object
|
68
|
+
def self.instance
|
69
|
+
@monitor.synchronize do
|
70
|
+
# get provider reference
|
71
|
+
begin
|
72
|
+
front = DRbObject.new_with_uri(notifier_uri)
|
73
|
+
front.uuid
|
74
|
+
front
|
75
|
+
rescue
|
76
|
+
# create new provider
|
77
|
+
self.spawn
|
78
|
+
end.presence_notifier
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module Pione
|
2
|
+
module TupleSpace
|
3
|
+
# TupleSpaceProvider provides tuple space server's location to tuple space
|
4
|
+
# receivers.
|
5
|
+
class TupleSpaceProvider < PresenceNotifier
|
6
|
+
include DRbUndumped
|
7
|
+
|
8
|
+
set_command_name "pione-tuple-space-provider"
|
9
|
+
set_notifier_uri Proc.new {Global.tuple_space_provider_uri}
|
10
|
+
|
11
|
+
attr_accessor :tuple_space_servers
|
12
|
+
|
13
|
+
# Creatas a new server. This method assumes to be called from
|
14
|
+
# pione-tuple-space-provider command only. So you should not initialize
|
15
|
+
# server directly.
|
16
|
+
def initialize
|
17
|
+
super
|
18
|
+
|
19
|
+
# set variables
|
20
|
+
@tuple_space_servers = []
|
21
|
+
@terminated = false
|
22
|
+
|
23
|
+
# start agents
|
24
|
+
@keeper = Agent::TrivialRoutineWorker.new(
|
25
|
+
Proc.new do
|
26
|
+
send_packet
|
27
|
+
sleep 5
|
28
|
+
end
|
29
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
def start
|
33
|
+
@keeper.start
|
34
|
+
end
|
35
|
+
|
36
|
+
def add_tuple_space_server(tuple_space_server)
|
37
|
+
@tuple_space_servers << tuple_space_server
|
38
|
+
end
|
39
|
+
|
40
|
+
# Sends empty tuple space server list.
|
41
|
+
def terminate
|
42
|
+
return unless @terminated
|
43
|
+
@terminated = true
|
44
|
+
@keeper_agent.terminate
|
45
|
+
end
|
46
|
+
|
47
|
+
def terminated?
|
48
|
+
@terminated
|
49
|
+
end
|
50
|
+
|
51
|
+
alias :finalize :terminate
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
# Sends presence notification to tuple space receivers as UDP packet.
|
56
|
+
# @return [void]
|
57
|
+
def send_packet
|
58
|
+
# setup reference data
|
59
|
+
port = /druby:\/\/(.*):(\d+)/.match(Global.front.uri)[2].to_i
|
60
|
+
@ref ||= Marshal.dump(port)
|
61
|
+
# open a socket
|
62
|
+
socket = UDPSocket.open
|
63
|
+
# address to send broadcast
|
64
|
+
addresses = Global.presence_notification_addresses
|
65
|
+
begin
|
66
|
+
if Global.show_presence_notifier
|
67
|
+
args = [Global.front.uri, addresses.join(", "), Time.now]
|
68
|
+
puts "sent presence notifier from %s to %s at %s" % args
|
69
|
+
end
|
70
|
+
# send packet
|
71
|
+
socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
|
72
|
+
addresses.each {|addr| socket.send(@ref, 0, addr.host, addr.port)}
|
73
|
+
rescue => e
|
74
|
+
if Global.show_presence_notifier
|
75
|
+
puts "tuple-space-provider: something is bad..."
|
76
|
+
Util::ErrorReport.print(e)
|
77
|
+
end
|
78
|
+
ensure
|
79
|
+
# close the socket always
|
80
|
+
socket.close
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,140 @@
|
|
1
|
+
module Pione
|
2
|
+
module TupleSpace
|
3
|
+
class TupleSpaceReceiver < PresenceNotifier
|
4
|
+
class InstanceError < StandardError; end
|
5
|
+
|
6
|
+
set_command_name "pione-tuple-space-receiver"
|
7
|
+
set_notifier_uri Proc.new {Global.tuple_space_receiver_uri}
|
8
|
+
|
9
|
+
def self.start(broker)
|
10
|
+
instance.register(broker)
|
11
|
+
end
|
12
|
+
|
13
|
+
attr_accessor :drb_service
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@brokers = []
|
17
|
+
@tuple_space_servers = {}
|
18
|
+
@socket = open_socket
|
19
|
+
|
20
|
+
# lock
|
21
|
+
@tuple_space_server_lock = Mutex.new
|
22
|
+
@broker_lock = Mutex.new
|
23
|
+
|
24
|
+
# subagents
|
25
|
+
@tuple_space_server_receiver =
|
26
|
+
Agent::TrivialRoutineWorker.new(Proc.new{receive_tuple_space_servers})
|
27
|
+
@updater = Agent::TrivialRoutineWorker.new(Proc.new{update_tuple_space_servers})
|
28
|
+
end
|
29
|
+
|
30
|
+
# Registers the agent.
|
31
|
+
def register(agent)
|
32
|
+
@broker_lock.synchronize { @brokers << agent }
|
33
|
+
end
|
34
|
+
|
35
|
+
# Start to receive tuple space servers.
|
36
|
+
def start
|
37
|
+
@tuple_space_server_receiver.start
|
38
|
+
@updater.start
|
39
|
+
end
|
40
|
+
|
41
|
+
def tuple_space_servers
|
42
|
+
@tuple_space_server_lock.synchronize do
|
43
|
+
@tuple_space_servers.keys
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# Send empty tuple space server list.
|
48
|
+
def finalize
|
49
|
+
puts "finalize"
|
50
|
+
@terminated = true
|
51
|
+
@tuple_space_server_receiver.terminate
|
52
|
+
@socket.close
|
53
|
+
@updater.terminate
|
54
|
+
@tuple_space_servers = []
|
55
|
+
end
|
56
|
+
|
57
|
+
alias :terminate :finalize
|
58
|
+
|
59
|
+
def terminated?
|
60
|
+
@terminated
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
# Opens receiver socket.
|
66
|
+
# @return [UDPSocket]
|
67
|
+
# server socket
|
68
|
+
def open_socket
|
69
|
+
socket = UDPSocket.open
|
70
|
+
socket.bind(Socket::INADDR_ANY, Global.presence_port)
|
71
|
+
socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
|
72
|
+
return socket
|
73
|
+
end
|
74
|
+
|
75
|
+
# Receives tuple space servers and updates the table.
|
76
|
+
# @return [void]
|
77
|
+
def receive_tuple_space_servers
|
78
|
+
data, addr = @socket.recvfrom(1024)
|
79
|
+
port = Marshal.load(data)
|
80
|
+
ip_address = addr[3]
|
81
|
+
provider_front = DRbObject.new_with_uri("druby://%s:%s" % [ip_address, port])
|
82
|
+
# need return of ping in short time
|
83
|
+
Timeout.timeout(1) do
|
84
|
+
provider_front.ping
|
85
|
+
provider_front.tuple_space_servers.each do |tuple_space_server|
|
86
|
+
@tuple_space_server_lock.synchronize do
|
87
|
+
@tuple_space_servers[tuple_space_server] = Time.now
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
if Global.show_presence_notifier
|
92
|
+
puts "presence notifier was received: %s" % provider_front.__drburi
|
93
|
+
end
|
94
|
+
rescue DRb::DRbConnError, DRb::ReplyReaderThreadError, IOError => e
|
95
|
+
@socket.close
|
96
|
+
@socket = open_socket
|
97
|
+
if Global.show_presence_notifier
|
98
|
+
puts "tuple space receiver disconnected"
|
99
|
+
end
|
100
|
+
rescue Exception
|
101
|
+
# ignore
|
102
|
+
end
|
103
|
+
|
104
|
+
def update_tuple_space_servers
|
105
|
+
# update tuple space server list
|
106
|
+
@tuple_space_server_lock.synchronize do
|
107
|
+
@tuple_space_servers.delete_if do |server, time|
|
108
|
+
begin
|
109
|
+
# ping
|
110
|
+
timeout(1) { server.ping }
|
111
|
+
# check timespan
|
112
|
+
(Time.now - time) > Global.tuple_space_receiver_disconnect_time
|
113
|
+
rescue Exception
|
114
|
+
true
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
# update broker
|
120
|
+
@broker_lock.synchronize do
|
121
|
+
@brokers.select! do |broker|
|
122
|
+
begin
|
123
|
+
timeout(1) { broker.ping }
|
124
|
+
broker.update_tuple_space_servers(tuple_space_servers)
|
125
|
+
true
|
126
|
+
rescue Exception => e
|
127
|
+
puts "[[[dead server]]]"
|
128
|
+
ErrorReport.print(e)
|
129
|
+
false
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
sleep 1
|
135
|
+
rescue Exception
|
136
|
+
# ignore
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|