pione 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -1
- data/History.txt +11 -0
- data/LICENSE.txt +1 -1
- data/README.md +1 -1
- data/bin/pione-log +5 -0
- data/example/CountChar/CountChar.pione +1 -1
- data/example/SieveOfEratosthenes/SieveOfEratosthenes.pione +39 -38
- data/lib/pione.rb +14 -35
- data/lib/pione/agent/input-generator.rb +38 -40
- data/lib/pione/agent/logger.rb +52 -19
- data/lib/pione/agent/rule-provider.rb +5 -8
- data/lib/pione/agent/task-worker.rb +25 -32
- data/lib/pione/agent/tuple-space-client.rb +22 -14
- data/lib/pione/command.rb +21 -0
- data/lib/pione/command/basic-command.rb +267 -84
- data/lib/pione/command/child-process.rb +21 -18
- data/lib/pione/command/daemon-process.rb +9 -8
- data/lib/pione/command/front-owner-command.rb +8 -25
- data/lib/pione/command/pione-broker.rb +27 -24
- data/lib/pione/command/pione-clean.rb +6 -6
- data/lib/pione/command/pione-client.rb +143 -128
- data/lib/pione/command/pione-log.rb +61 -0
- data/lib/pione/command/pione-relay-account-db.rb +40 -38
- data/lib/pione/command/pione-relay-client-db.rb +38 -42
- data/lib/pione/command/pione-relay.rb +19 -20
- data/lib/pione/command/pione-syntax-checker.rb +70 -45
- data/lib/pione/command/pione-task-worker.rb +56 -66
- data/lib/pione/command/pione-tuple-space-provider.rb +36 -45
- data/lib/pione/command/pione-tuple-space-receiver.rb +34 -32
- data/lib/pione/command/pione-tuple-space-viewer.rb +63 -47
- data/lib/pione/location.rb +10 -0
- data/lib/pione/location/basic-location.rb +272 -0
- data/lib/pione/location/dropbox-location.rb +139 -0
- data/lib/pione/location/ftp-location.rb +156 -0
- data/lib/pione/location/local-location.rb +116 -0
- data/lib/pione/log.rb +10 -0
- data/lib/pione/log/domain-info.rb +72 -0
- data/lib/pione/log/process-log.rb +176 -0
- data/lib/pione/log/process-record.rb +189 -0
- data/lib/pione/log/xes-log.rb +105 -0
- data/lib/pione/model/assignment.rb +88 -80
- data/lib/pione/model/binary-operator.rb +74 -68
- data/lib/pione/model/block.rb +218 -207
- data/lib/pione/model/boolean.rb +123 -112
- data/lib/pione/model/call-rule.rb +72 -65
- data/lib/pione/model/data-expr.rb +596 -290
- data/lib/pione/model/float.rb +108 -103
- data/lib/pione/model/integer.rb +133 -129
- data/lib/pione/model/message.rb +79 -72
- data/lib/pione/model/package.rb +42 -38
- data/lib/pione/model/parameters.rb +265 -236
- data/lib/pione/model/rule-expr.rb +247 -242
- data/lib/pione/model/rule-io.rb +137 -133
- data/lib/pione/model/rule.rb +307 -292
- data/lib/pione/model/string.rb +110 -99
- data/lib/pione/model/variable-table.rb +300 -271
- data/lib/pione/model/variable.rb +88 -83
- data/lib/pione/option.rb +13 -0
- data/lib/pione/option/child-process-option.rb +19 -0
- data/lib/pione/{command-option → option}/common-option.rb +6 -5
- data/lib/pione/option/option-interface.rb +73 -0
- data/lib/pione/{command-option → option}/presence-notifier-option.rb +4 -3
- data/lib/pione/option/task-worker-owner-option.rb +24 -0
- data/lib/pione/{command-option → option}/tuple-space-provider-option.rb +6 -4
- data/lib/pione/option/tuple-space-provider-owner-option.rb +18 -0
- data/lib/pione/option/tuple-space-receiver-option.rb +8 -0
- data/lib/pione/parser/common-parser.rb +3 -2
- data/lib/pione/parser/expr-parser.rb +6 -1
- data/lib/pione/patch/em-ftpd-patch.rb +21 -0
- data/lib/pione/patch/rinda-patch.rb +31 -23
- data/lib/pione/rule-handler/action-handler.rb +35 -25
- data/lib/pione/rule-handler/basic-handler.rb +92 -18
- data/lib/pione/rule-handler/flow-handler.rb +104 -98
- data/lib/pione/rule-handler/root-handler.rb +11 -0
- data/lib/pione/system/common.rb +10 -0
- data/lib/pione/system/file-cache.rb +103 -84
- data/lib/pione/system/global.rb +67 -12
- data/lib/pione/system/init.rb +20 -0
- data/lib/pione/transformer/expr-transformer.rb +6 -1
- data/lib/pione/tuple-space/data-finder.rb +33 -6
- data/lib/pione/tuple-space/tuple-space-receiver.rb +4 -3
- data/lib/pione/tuple-space/tuple-space-server-interface.rb +58 -13
- data/lib/pione/tuple-space/tuple-space-server.rb +13 -11
- data/lib/pione/tuple-space/update-criteria.rb +8 -7
- data/lib/pione/tuple/base-location-tuple.rb +9 -0
- data/lib/pione/tuple/basic-tuple.rb +7 -7
- data/lib/pione/tuple/data-tuple.rb +5 -2
- data/lib/pione/tuple/lift-tuple.rb +14 -0
- data/lib/pione/tuple/rule-tuple.rb +1 -1
- data/lib/pione/tuple/task-tuple.rb +5 -1
- data/lib/pione/version.rb +1 -1
- data/pione.gemspec +5 -1
- data/test/location/spec_basic-location.rb +35 -0
- data/test/location/spec_ftp-location.rb +100 -0
- data/test/location/spec_local-location.rb +99 -0
- data/test/log/data/sample.log +1003 -0
- data/test/log/spec_xes-log.rb +11 -0
- data/test/model/spec_data-expr.rb +249 -6
- data/test/model/spec_data-expr.yml +45 -0
- data/test/parser/spec_expr-parser.yml +4 -0
- data/test/spec_data-finder.rb +13 -7
- data/test/spec_data-finder.yml +42 -13
- data/test/system/spec_file-cache.rb +39 -0
- data/test/test-util.rb +226 -1
- data/test/transformer/spec_expr-transformer.rb +12 -1
- metadata +107 -24
- data/bin/pione-search-log +0 -30
- data/lib/pione/command-option/basic-option.rb +0 -42
- data/lib/pione/command-option/child-process-option.rb +0 -17
- data/lib/pione/command-option/daemon-option.rb +0 -12
- data/lib/pione/command-option/task-worker-owner-option.rb +0 -17
- data/lib/pione/command-option/tuple-space-provider-owner-option.rb +0 -16
- data/lib/pione/command-option/tuple-space-receiver-option.rb +0 -12
- data/lib/pione/command/tuple-space-provider-owner.rb +0 -6
- data/lib/pione/resource/basic-resource.rb +0 -92
- data/lib/pione/resource/dropbox-resource.rb +0 -106
- data/lib/pione/resource/ftp.rb +0 -84
- data/lib/pione/resource/local.rb +0 -113
- data/lib/pione/tuple/base-uri-tuple.rb +0 -9
- data/lib/pione/tuple/shift-tuple.rb +0 -13
- data/lib/pione/util/log.rb +0 -79
- data/test/spec_resource.rb +0 -73
data/.gitignore
CHANGED
data/History.txt
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
# History
|
2
2
|
|
3
|
+
## 0.1.3(2013/04/XX)
|
4
|
+
|
5
|
+
* Added new data expression literal "null" for accepting data nonexistence
|
6
|
+
* Added new data expression property keyword "neglect" and "care" for the update criterion about data mtime
|
7
|
+
* Changed log location to be in output location
|
8
|
+
* Changed log format to JSON
|
9
|
+
* Added pione-log command that generates agent activity log as XES format
|
10
|
+
* Use locations in tuples
|
11
|
+
* Enabled to test FTP location handling without setting up FTP server
|
12
|
+
* Added the feature to create domain information files(".domain_info")
|
13
|
+
|
3
14
|
## 0.1.2(2013/04/01)
|
4
15
|
|
5
16
|
* Added shorthand notation for setting parameters
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -84,7 +84,7 @@ because these are patches including original codes:
|
|
84
84
|
|
85
85
|
## Links
|
86
86
|
|
87
|
-
* [PIONE project homepage](http://pione.github.
|
87
|
+
* [PIONE project homepage](http://pione.github.io/)
|
88
88
|
* [repository on github](https://github.com/pione/pione)
|
89
89
|
* [Yasunaga Laboratory](http://www.yasunaga-lab.bio.kyutech.ac.jp/)
|
90
90
|
* [EOS](http://www.yasunaga-lab.bio.kyutech.ac.jp/Eos/)([ja](http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/))
|
data/bin/pione-log
ADDED
@@ -1,61 +1,62 @@
|
|
1
|
+
param $MAX := 20
|
2
|
+
|
1
3
|
Rule Main
|
2
|
-
output '*.prime'
|
3
|
-
param $MAX := 20
|
4
|
+
output '*.prime'.all
|
4
5
|
Flow
|
5
|
-
rule
|
6
|
-
rule Sieve.params({MAX: $MAX, NUM: 2})
|
6
|
+
rule Sieve
|
7
7
|
End
|
8
8
|
|
9
9
|
Rule Sieve
|
10
|
-
input '
|
11
|
-
|
12
|
-
|
13
|
-
param $MAX
|
14
|
-
param $NUM
|
10
|
+
input '*-*.not_prime'.all or null
|
11
|
+
output '*.current'.all or '*.prime'.all
|
12
|
+
param $NUM := 2
|
15
13
|
Flow
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
14
|
+
$NEXT_NUM := $NUM + 1
|
15
|
+
$NEXT_RULE := Sieve {NUM: $NEXT_NUM}
|
16
|
+
rule Current {N: $NUM}
|
17
|
+
if not :: $*.as_data_expr.match?($NUM.as_string)
|
18
|
+
rule CreatePrime {N: $NUM}
|
19
|
+
if ($NUM * $NUM) <= $MAX
|
20
|
+
rule CreateNotPrimeAll {P: $NUM} >>> $NEXT_RULE
|
20
21
|
else
|
21
|
-
rule
|
22
|
+
rule $NEXT_RULE
|
23
|
+
end
|
24
|
+
else
|
25
|
+
if $NEXT_NUM <= $MAX
|
26
|
+
rule $NEXT_RULE
|
22
27
|
end
|
23
|
-
rule Sieve.params({MAX: $MAX, NUM: $NUM + 1})
|
24
28
|
end
|
25
29
|
End
|
26
30
|
|
27
|
-
Rule CurrentNumber
|
28
|
-
output '{$NUM}.current'
|
29
|
-
param $NUM
|
30
|
-
Action
|
31
|
-
touch {$NUM}.current
|
32
|
-
End
|
33
|
-
|
34
31
|
Rule CreateNotPrimeAll
|
35
|
-
output '
|
36
|
-
|
37
|
-
param $
|
38
|
-
param $NUM
|
39
|
-
param $i := 2
|
32
|
+
output '*-{$P}.not_prime'.all
|
33
|
+
param $P
|
34
|
+
param $INDEX := 2
|
40
35
|
Flow
|
41
|
-
if $
|
42
|
-
rule CreateNotPrimeAll
|
36
|
+
if ($P * ($INDEX + 1)) <= $MAX
|
37
|
+
rule CreateNotPrimeAll {P: $P, INDEX: $INDEX + 1}
|
43
38
|
end
|
44
|
-
rule CreateNotPrime
|
45
|
-
rule CurrentNumber.params({NUM: $NUM + 1})
|
39
|
+
rule CreateNotPrime {P: $P, N: $P * $INDEX}
|
46
40
|
End
|
47
41
|
|
48
42
|
Rule CreateNotPrime
|
49
|
-
output '{$
|
50
|
-
param $
|
43
|
+
output '{$N}-{$P}.not_prime'
|
44
|
+
param $P
|
45
|
+
param $N
|
51
46
|
Action
|
52
|
-
touch {$
|
53
|
-
|
47
|
+
touch {$N}-{$P}.not_prime
|
48
|
+
End
|
54
49
|
|
55
50
|
Rule CreatePrime
|
56
|
-
output '{$
|
57
|
-
param $
|
51
|
+
output '{$N}.prime'
|
52
|
+
param $N
|
58
53
|
Action
|
59
|
-
touch {$
|
54
|
+
touch {$N}.prime
|
60
55
|
End
|
61
56
|
|
57
|
+
Rule Current
|
58
|
+
output '{$N}.current'
|
59
|
+
param $N
|
60
|
+
Action
|
61
|
+
touch {$N}.current
|
62
|
+
End
|
data/lib/pione.rb
CHANGED
@@ -5,7 +5,7 @@ require 'bundler/setup'
|
|
5
5
|
require 'set'
|
6
6
|
require 'socket'
|
7
7
|
require 'digest'
|
8
|
-
require '
|
8
|
+
require 'forwardablex'
|
9
9
|
require 'socket'
|
10
10
|
require 'drb/drb'
|
11
11
|
require 'drb/ssl'
|
@@ -22,6 +22,7 @@ require 'pathname'
|
|
22
22
|
require 'time'
|
23
23
|
require 'etc'
|
24
24
|
require 'json'
|
25
|
+
require 'rexml/document'
|
25
26
|
|
26
27
|
require 'uuidtools'
|
27
28
|
require 'parslet'
|
@@ -31,6 +32,8 @@ require 'highline'
|
|
31
32
|
require 'dropbox_sdk'
|
32
33
|
require 'hamster'
|
33
34
|
require 'naming'
|
35
|
+
require 'temppath'
|
36
|
+
require 'xes'
|
34
37
|
|
35
38
|
#
|
36
39
|
# load pione
|
@@ -43,10 +46,12 @@ require 'pione/version'
|
|
43
46
|
require 'pione/util/misc'
|
44
47
|
require 'pione/util/terminal'
|
45
48
|
require 'pione/util/console-message'
|
46
|
-
require 'pione/util/log'
|
47
49
|
require 'pione/util/waiter-table'
|
48
50
|
require 'pione/util/error-report'
|
49
51
|
|
52
|
+
# log
|
53
|
+
require 'pione/log'
|
54
|
+
|
50
55
|
# patch
|
51
56
|
require 'pione/patch/array-patch'
|
52
57
|
require 'pione/patch/drb-patch'
|
@@ -73,6 +78,9 @@ require 'pione/uri-scheme/local-scheme'
|
|
73
78
|
require 'pione/uri-scheme/dropbox-scheme'
|
74
79
|
require 'pione/uri-scheme/broadcast-scheme'
|
75
80
|
|
81
|
+
# location
|
82
|
+
require 'pione/location'
|
83
|
+
|
76
84
|
# relay
|
77
85
|
require 'pione/relay/transmitter-socket'
|
78
86
|
require 'pione/relay/trampoline'
|
@@ -111,7 +119,7 @@ require 'pione/tuple/agent-tuple'
|
|
111
119
|
require 'pione/tuple/data-tuple'
|
112
120
|
require 'pione/tuple/finished-tuple'
|
113
121
|
require 'pione/tuple/process-info-tuple'
|
114
|
-
require 'pione/tuple/
|
122
|
+
require 'pione/tuple/lift-tuple'
|
115
123
|
require 'pione/tuple/working-tuple'
|
116
124
|
require 'pione/tuple/attribute-tuple'
|
117
125
|
require 'pione/tuple/bye-tuple'
|
@@ -119,7 +127,7 @@ require 'pione/tuple/dry-run-tuple'
|
|
119
127
|
require 'pione/tuple/foreground-tuple'
|
120
128
|
require 'pione/tuple/request-rule-tuple'
|
121
129
|
require 'pione/tuple/task-tuple'
|
122
|
-
require 'pione/tuple/base-
|
130
|
+
require 'pione/tuple/base-location-tuple'
|
123
131
|
require 'pione/tuple/command-tuple'
|
124
132
|
require 'pione/tuple/exception-tuple'
|
125
133
|
require 'pione/tuple/log-tuple'
|
@@ -150,12 +158,6 @@ require 'pione/parser/document-parser'
|
|
150
158
|
# transformer
|
151
159
|
require 'pione/transformer'
|
152
160
|
|
153
|
-
# resource
|
154
|
-
require 'pione/resource/basic-resource'
|
155
|
-
require 'pione/resource/local'
|
156
|
-
require 'pione/resource/ftp'
|
157
|
-
require 'pione/resource/dropbox-resource'
|
158
|
-
|
159
161
|
# rule-handler
|
160
162
|
require 'pione/rule-handler/basic-handler'
|
161
163
|
require 'pione/rule-handler/flow-handler'
|
@@ -188,33 +190,10 @@ require 'pione/front/tuple-space-receiver-front'
|
|
188
190
|
require 'pione/front/relay-front'
|
189
191
|
|
190
192
|
# command-option
|
191
|
-
require 'pione/
|
192
|
-
require 'pione/command-option/common-option'
|
193
|
-
require 'pione/command-option/daemon-option'
|
194
|
-
require 'pione/command-option/child-process-option'
|
195
|
-
require 'pione/command-option/presence-notifier-option'
|
196
|
-
require 'pione/command-option/tuple-space-provider-option'
|
197
|
-
require 'pione/command-option/tuple-space-provider-owner-option'
|
198
|
-
require 'pione/command-option/tuple-space-receiver-option'
|
199
|
-
require 'pione/command-option/task-worker-owner-option'
|
193
|
+
require 'pione/option'
|
200
194
|
|
201
195
|
# command
|
202
|
-
require 'pione/command
|
203
|
-
require 'pione/command/front-owner-command'
|
204
|
-
require 'pione/command/daemon-process'
|
205
|
-
require 'pione/command/child-process'
|
206
|
-
require 'pione/command/pione-client'
|
207
|
-
require 'pione/command/pione-task-worker'
|
208
|
-
require 'pione/command/pione-broker'
|
209
|
-
require 'pione/command/pione-tuple-space-provider'
|
210
|
-
require 'pione/command/pione-tuple-space-receiver'
|
211
|
-
require 'pione/command/pione-tuple-space-viewer'
|
212
|
-
require 'pione/command/pione-relay'
|
213
|
-
require 'pione/command/pione-relay-client-db'
|
214
|
-
require 'pione/command/pione-relay-account-db'
|
215
|
-
require 'pione/command/pione-clean'
|
216
|
-
require 'pione/command/pione-syntax-checker'
|
217
|
-
|
196
|
+
require 'pione/command'
|
218
197
|
|
219
198
|
#
|
220
199
|
# other settings
|
@@ -16,7 +16,7 @@ module Pione
|
|
16
16
|
@tuple_space_server.now
|
17
17
|
end
|
18
18
|
|
19
|
-
#
|
19
|
+
# Generate an input.
|
20
20
|
def generate
|
21
21
|
raise RuntimeError
|
22
22
|
end
|
@@ -29,22 +29,18 @@ module Pione
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
#
|
32
|
+
# DirGeneratorMethod is a directory based generator.
|
33
33
|
class DirGeneratorMethod < GeneratorMethod
|
34
34
|
# Create a generator.
|
35
|
-
#
|
35
|
+
#
|
36
|
+
# @param tuple_space_server [TupleSpaceServer]
|
36
37
|
# tuple space server
|
37
|
-
# @param [
|
38
|
-
# directory
|
39
|
-
def initialize(
|
40
|
-
raise
|
41
|
-
super(
|
42
|
-
@
|
43
|
-
if dir_path
|
44
|
-
@gen = Resource[@dir_path].entries.to_enum
|
45
|
-
else
|
46
|
-
@gen = [].each
|
47
|
-
end
|
38
|
+
# @param dir [BasicLocation]
|
39
|
+
# input directory location
|
40
|
+
def initialize(tuple_space_server, dir)
|
41
|
+
raise Argument.new(dir) unless dir.kind_of?(Location::BasicLocation) or dir.nil?
|
42
|
+
super(tuple_space_server)
|
43
|
+
@gen = dir ? dir.entries.to_enum : [].each
|
48
44
|
end
|
49
45
|
|
50
46
|
def generate
|
@@ -55,10 +51,10 @@ module Pione
|
|
55
51
|
|
56
52
|
# StreamGeneratorMethod handles stream inputs.
|
57
53
|
class StreamGeneratorMethod < GeneratorMethod
|
58
|
-
def initialize(ts_server,
|
59
|
-
raise TypeError.new(
|
54
|
+
def initialize(ts_server, dir)
|
55
|
+
raise TypeError.new(dir) unless dir.kind_of?(Location) or dir.nil?
|
60
56
|
super(ts_server)
|
61
|
-
@
|
57
|
+
@dir = dir
|
62
58
|
@table = Hash.new
|
63
59
|
init
|
64
60
|
end
|
@@ -78,11 +74,7 @@ module Pione
|
|
78
74
|
#
|
79
75
|
# @return [void]
|
80
76
|
def init
|
81
|
-
|
82
|
-
@gen = Resource[@dir_path].entries.to_enum
|
83
|
-
else
|
84
|
-
@gen = [].each
|
85
|
-
end
|
77
|
+
@gen = dir ? @dir.entries.to_enum : [].each
|
86
78
|
end
|
87
79
|
|
88
80
|
# @api private
|
@@ -102,11 +94,6 @@ module Pione
|
|
102
94
|
end
|
103
95
|
end
|
104
96
|
|
105
|
-
# Create a input generator agent by simple method.
|
106
|
-
def self.start_by_simple(ts_server, *args)
|
107
|
-
start(ts_server, SimpleGeneratorMethod.new(ts_server, ts_server.base_uri, *args))
|
108
|
-
end
|
109
|
-
|
110
97
|
# Create a input generator agent by directory method.
|
111
98
|
def self.start_by_dir(ts_server, *args)
|
112
99
|
start(ts_server, DirGeneratorMethod.new(ts_server, *args))
|
@@ -121,8 +108,7 @@ module Pione
|
|
121
108
|
define_state :sleeping
|
122
109
|
define_state :stop_iteration
|
123
110
|
|
124
|
-
define_state_transition :initialized => :
|
125
|
-
define_state_transition :reading_base_uri => :generating
|
111
|
+
define_state_transition :initialized => :generating
|
126
112
|
define_state_transition :generating => :generating
|
127
113
|
define_state_transition :stop_iteration => lambda{|agent, res|
|
128
114
|
agent.stream? ? :sleeping : :terminated
|
@@ -148,26 +134,38 @@ module Pione
|
|
148
134
|
|
149
135
|
private
|
150
136
|
|
151
|
-
def
|
152
|
-
@
|
137
|
+
def transit_to_initialized
|
138
|
+
@base_location = base_location
|
153
139
|
end
|
154
140
|
|
155
141
|
# State generating generates a data from generator and puts it into tuple
|
156
142
|
# space.
|
157
143
|
def transit_to_generating
|
158
144
|
if input = @generator.generate
|
145
|
+
# put into history
|
159
146
|
@inputs << input
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
147
|
+
|
148
|
+
# build original location
|
149
|
+
orig_location = Location[input.uri]
|
150
|
+
|
151
|
+
# build input location
|
152
|
+
input_location = @base_location + File.join("input", input.name)
|
153
|
+
|
154
|
+
# make process log record
|
155
|
+
record = Log::PutDataProcessRecord.new.tap do |record|
|
156
|
+
record.agent_type = agent_type
|
157
|
+
record.agent_uuid = uuid
|
158
|
+
record.location = input_location
|
159
|
+
record.size = orig_location.size
|
165
160
|
end
|
161
|
+
|
166
162
|
# upload the file
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
163
|
+
with_process_log(record) do
|
164
|
+
orig_location.copy(input_location)
|
165
|
+
end
|
166
|
+
|
167
|
+
# put data tuple into tuple space
|
168
|
+
write(Tuple[:data].new(DOMAIN, input.name, input_location, input.time))
|
171
169
|
end
|
172
170
|
end
|
173
171
|
|
data/lib/pione/agent/logger.rb
CHANGED
@@ -1,17 +1,36 @@
|
|
1
1
|
module Pione
|
2
2
|
module Agent
|
3
|
-
# Logger is an agent for logging in tuple space.
|
3
|
+
# Logger is an agent for logging processings in tuple space.
|
4
4
|
class Logger < TupleSpaceClient
|
5
5
|
set_agent_type :logger
|
6
6
|
|
7
|
-
|
7
|
+
# @return [BasicLocation]
|
8
|
+
attr_reader :location
|
9
|
+
|
10
|
+
# @return [Pathname]
|
11
|
+
attr_reader :out
|
12
|
+
|
13
|
+
# @return [Array<Log::ProcessRecord>]
|
14
|
+
attr_reader :records
|
15
|
+
|
16
|
+
# Create a logger agent.
|
17
|
+
#
|
18
|
+
# @param tuple_space_server [TupleSpaceServer]
|
19
|
+
# tuple space server
|
20
|
+
# @param location [BasicLocation]
|
21
|
+
# the path to store log records
|
22
|
+
def initialize(tuple_space_server, location)
|
8
23
|
super(tuple_space_server)
|
9
|
-
@
|
10
|
-
@
|
24
|
+
@location = location
|
25
|
+
@temporary = Location[Pione.temporary_path(@location.basename)]
|
26
|
+
@out = @temporary.path.open("w+")
|
27
|
+
@records = []
|
11
28
|
end
|
12
29
|
|
30
|
+
define_state :initialized
|
13
31
|
define_state :take
|
14
32
|
define_state :store
|
33
|
+
define_state :terminated
|
15
34
|
|
16
35
|
define_state_transition :initialized => :take
|
17
36
|
define_state_transition :take => :store
|
@@ -20,43 +39,57 @@ module Pione
|
|
20
39
|
define_exception_handler Exception => :terminated
|
21
40
|
|
22
41
|
# Sleeps till the logger clears logs.
|
42
|
+
#
|
23
43
|
# @param [Float]
|
24
44
|
# timespan for clearing logs
|
45
|
+
# @return [void]
|
25
46
|
def wait_to_clear_logs(timespan=0.1)
|
26
|
-
while count_tuple(Tuple[:log].any) > 0 || @
|
47
|
+
while count_tuple(Tuple[:log].any) > 0 || @records.size > 0
|
27
48
|
sleep timespan
|
28
49
|
end
|
29
50
|
end
|
30
51
|
|
52
|
+
def store_records
|
53
|
+
unless @records.empty?
|
54
|
+
@records.sort{|a,b| a.timestamp <=> b.timestamp}.each do |record|
|
55
|
+
@out.puts record.format
|
56
|
+
end
|
57
|
+
@out.flush
|
58
|
+
@out.fsync
|
59
|
+
@records = []
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
31
63
|
private
|
32
64
|
|
33
|
-
# Transits to the state +
|
65
|
+
# Transits to the state +take+.
|
34
66
|
def transit_to_take
|
35
67
|
timeout(2) do
|
36
|
-
|
68
|
+
loop do
|
69
|
+
if @current_tuple = take(Tuple[:log].any)
|
70
|
+
@records << @current_tuple.message
|
71
|
+
@current_tuple = nil
|
72
|
+
end
|
73
|
+
end
|
37
74
|
end
|
38
75
|
rescue TimeoutError
|
39
|
-
|
76
|
+
if @current_tuple
|
77
|
+
@records << @current_tuple.message
|
78
|
+
@current_tuple = nil
|
79
|
+
end
|
40
80
|
end
|
41
81
|
|
42
82
|
# Transits to the state +store+.
|
43
83
|
def transit_to_store
|
44
|
-
|
45
|
-
@logs.sort{|a,b| a.timestamp <=> b.timestamp}.each do |log|
|
46
|
-
@out.puts log.message.format
|
47
|
-
@out.flush
|
48
|
-
@out.sync
|
49
|
-
end
|
50
|
-
@logs = []
|
51
|
-
end
|
84
|
+
store_records
|
52
85
|
end
|
53
86
|
|
54
87
|
# State terminated.
|
55
88
|
def transit_to_terminated
|
89
|
+
store_records
|
90
|
+
Util.ignore_exception {@out.close}
|
91
|
+
@temporary.copy(@location)
|
56
92
|
super
|
57
|
-
unless @out == STDOUT
|
58
|
-
Util.ignore_exception { @out.close }
|
59
|
-
end
|
60
93
|
end
|
61
94
|
end
|
62
95
|
|