bayserver-core 2.2.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.
Files changed (149) hide show
  1. checksums.yaml +7 -0
  2. data/lib/baykit/bayserver/agent/accept_handler.rb +97 -0
  3. data/lib/baykit/bayserver/agent/channel_listener.rb +35 -0
  4. data/lib/baykit/bayserver/agent/command_receiver.rb +75 -0
  5. data/lib/baykit/bayserver/agent/grand_agent.rb +319 -0
  6. data/lib/baykit/bayserver/agent/grand_agent_monitor.rb +217 -0
  7. data/lib/baykit/bayserver/agent/next_socket_action.rb +14 -0
  8. data/lib/baykit/bayserver/agent/non_blocking_handler.rb +433 -0
  9. data/lib/baykit/bayserver/agent/package.rb +3 -0
  10. data/lib/baykit/bayserver/agent/signal/signal_agent.rb +165 -0
  11. data/lib/baykit/bayserver/agent/signal/signal_proxy.rb +18 -0
  12. data/lib/baykit/bayserver/agent/signal/signal_sender.rb +99 -0
  13. data/lib/baykit/bayserver/agent/spin_handler.rb +140 -0
  14. data/lib/baykit/bayserver/agent/transporter/data_listener.rb +38 -0
  15. data/lib/baykit/bayserver/agent/transporter/package.rb +3 -0
  16. data/lib/baykit/bayserver/agent/transporter/plain_transporter.rb +55 -0
  17. data/lib/baykit/bayserver/agent/transporter/secure_transporter.rb +81 -0
  18. data/lib/baykit/bayserver/agent/transporter/spin_read_transporter.rb +111 -0
  19. data/lib/baykit/bayserver/agent/transporter/spin_write_transporter.rb +125 -0
  20. data/lib/baykit/bayserver/agent/transporter/transporter.rb +466 -0
  21. data/lib/baykit/bayserver/agent/upgrade_exception.rb +11 -0
  22. data/lib/baykit/bayserver/bay_dockers.rb +60 -0
  23. data/lib/baykit/bayserver/bay_exception.rb +12 -0
  24. data/lib/baykit/bayserver/bay_log.rb +148 -0
  25. data/lib/baykit/bayserver/bay_message.rb +20 -0
  26. data/lib/baykit/bayserver/bayserver.rb +529 -0
  27. data/lib/baykit/bayserver/bcf/bcf_document.rb +44 -0
  28. data/lib/baykit/bayserver/bcf/bcf_element.rb +30 -0
  29. data/lib/baykit/bayserver/bcf/bcf_key_val.rb +19 -0
  30. data/lib/baykit/bayserver/bcf/bcf_object.rb +15 -0
  31. data/lib/baykit/bayserver/bcf/bcf_parser.rb +180 -0
  32. data/lib/baykit/bayserver/bcf/package.rb +6 -0
  33. data/lib/baykit/bayserver/bcf/parse_exception.rb +15 -0
  34. data/lib/baykit/bayserver/config_exception.rb +25 -0
  35. data/lib/baykit/bayserver/constants.rb +8 -0
  36. data/lib/baykit/bayserver/docker/base/club_base.rb +117 -0
  37. data/lib/baykit/bayserver/docker/base/docker_base.rb +66 -0
  38. data/lib/baykit/bayserver/docker/base/inbound_data_listener.rb +89 -0
  39. data/lib/baykit/bayserver/docker/base/inbound_handler.rb +42 -0
  40. data/lib/baykit/bayserver/docker/base/inbound_ship.rb +341 -0
  41. data/lib/baykit/bayserver/docker/base/inbound_ship_store.rb +65 -0
  42. data/lib/baykit/bayserver/docker/base/port_base.rb +228 -0
  43. data/lib/baykit/bayserver/docker/base/reroute_base.rb +28 -0
  44. data/lib/baykit/bayserver/docker/built_in/built_in_city_docker.rb +303 -0
  45. data/lib/baykit/bayserver/docker/built_in/built_in_harbor_docker.rb +226 -0
  46. data/lib/baykit/bayserver/docker/built_in/built_in_log_docker.rb +302 -0
  47. data/lib/baykit/bayserver/docker/built_in/built_in_permission_docker.rb +242 -0
  48. data/lib/baykit/bayserver/docker/built_in/built_in_secure_docker.rb +157 -0
  49. data/lib/baykit/bayserver/docker/built_in/built_in_town_docker.rb +117 -0
  50. data/lib/baykit/bayserver/docker/built_in/built_in_trouble_docker.rb +57 -0
  51. data/lib/baykit/bayserver/docker/built_in/log_boat.rb +71 -0
  52. data/lib/baykit/bayserver/docker/built_in/log_item.rb +18 -0
  53. data/lib/baykit/bayserver/docker/built_in/log_item_factory.rb +18 -0
  54. data/lib/baykit/bayserver/docker/built_in/log_items.rb +287 -0
  55. data/lib/baykit/bayserver/docker/built_in/write_file_taxi.rb +101 -0
  56. data/lib/baykit/bayserver/docker/city.rb +22 -0
  57. data/lib/baykit/bayserver/docker/club.rb +45 -0
  58. data/lib/baykit/bayserver/docker/docker.rb +8 -0
  59. data/lib/baykit/bayserver/docker/harbor.rb +34 -0
  60. data/lib/baykit/bayserver/docker/log.rb +17 -0
  61. data/lib/baykit/bayserver/docker/package.rb +12 -0
  62. data/lib/baykit/bayserver/docker/permission.rb +18 -0
  63. data/lib/baykit/bayserver/docker/port.rb +39 -0
  64. data/lib/baykit/bayserver/docker/reroute.rb +17 -0
  65. data/lib/baykit/bayserver/docker/secure.rb +22 -0
  66. data/lib/baykit/bayserver/docker/send_file/directory_train.rb +123 -0
  67. data/lib/baykit/bayserver/docker/send_file/file_content_handler.rb +43 -0
  68. data/lib/baykit/bayserver/docker/send_file/send_file_docker.rb +71 -0
  69. data/lib/baykit/bayserver/docker/town.rb +30 -0
  70. data/lib/baykit/bayserver/docker/trouble.rb +17 -0
  71. data/lib/baykit/bayserver/docker/warp/package.rb +4 -0
  72. data/lib/baykit/bayserver/docker/warp/warp_data.rb +84 -0
  73. data/lib/baykit/bayserver/docker/warp/warp_data_listener.rb +112 -0
  74. data/lib/baykit/bayserver/docker/warp/warp_docker.rb +273 -0
  75. data/lib/baykit/bayserver/docker/warp/warp_handler.rb +38 -0
  76. data/lib/baykit/bayserver/docker/warp/warp_ship.rb +166 -0
  77. data/lib/baykit/bayserver/docker/warp/warp_ship_store.rb +111 -0
  78. data/lib/baykit/bayserver/http_exception.rb +33 -0
  79. data/lib/baykit/bayserver/mem_usage.rb +104 -0
  80. data/lib/baykit/bayserver/protocol/command.rb +21 -0
  81. data/lib/baykit/bayserver/protocol/command_handler.rb +9 -0
  82. data/lib/baykit/bayserver/protocol/command_packer.rb +49 -0
  83. data/lib/baykit/bayserver/protocol/command_unpacker.rb +13 -0
  84. data/lib/baykit/bayserver/protocol/package.rb +15 -0
  85. data/lib/baykit/bayserver/protocol/packet.rb +63 -0
  86. data/lib/baykit/bayserver/protocol/packet_factory.rb +13 -0
  87. data/lib/baykit/bayserver/protocol/packet_packer.rb +30 -0
  88. data/lib/baykit/bayserver/protocol/packet_part_accessor.rb +122 -0
  89. data/lib/baykit/bayserver/protocol/packet_store.rb +139 -0
  90. data/lib/baykit/bayserver/protocol/packet_unpacker.rb +17 -0
  91. data/lib/baykit/bayserver/protocol/protocol_exception.rb +17 -0
  92. data/lib/baykit/bayserver/protocol/protocol_handler.rb +64 -0
  93. data/lib/baykit/bayserver/protocol/protocol_handler_factory.rb +14 -0
  94. data/lib/baykit/bayserver/protocol/protocol_handler_store.rb +109 -0
  95. data/lib/baykit/bayserver/sink.rb +22 -0
  96. data/lib/baykit/bayserver/taxi/taxi.rb +38 -0
  97. data/lib/baykit/bayserver/taxi/taxi_runner.rb +31 -0
  98. data/lib/baykit/bayserver/tours/content_consume_listener.rb +20 -0
  99. data/lib/baykit/bayserver/tours/package.rb +4 -0
  100. data/lib/baykit/bayserver/tours/read_file_taxi.rb +102 -0
  101. data/lib/baykit/bayserver/tours/req_content_handler.rb +37 -0
  102. data/lib/baykit/bayserver/tours/send_file_train.rb +65 -0
  103. data/lib/baykit/bayserver/tours/send_file_yacht.rb +93 -0
  104. data/lib/baykit/bayserver/tours/tour.rb +195 -0
  105. data/lib/baykit/bayserver/tours/tour_req.rb +251 -0
  106. data/lib/baykit/bayserver/tours/tour_res.rb +400 -0
  107. data/lib/baykit/bayserver/tours/tour_store.rb +121 -0
  108. data/lib/baykit/bayserver/train/train.rb +54 -0
  109. data/lib/baykit/bayserver/train/train_runner.rb +32 -0
  110. data/lib/baykit/bayserver/util/byte_array.rb +54 -0
  111. data/lib/baykit/bayserver/util/byte_buffer.rb +13 -0
  112. data/lib/baykit/bayserver/util/cgi_util.rb +165 -0
  113. data/lib/baykit/bayserver/util/char_util.rb +22 -0
  114. data/lib/baykit/bayserver/util/cities.rb +45 -0
  115. data/lib/baykit/bayserver/util/class_util.rb +17 -0
  116. data/lib/baykit/bayserver/util/counter.rb +23 -0
  117. data/lib/baykit/bayserver/util/data_consume_listener.rb +13 -0
  118. data/lib/baykit/bayserver/util/executor_service.rb +81 -0
  119. data/lib/baykit/bayserver/util/groups.rb +110 -0
  120. data/lib/baykit/bayserver/util/gzip_compressor.rb +55 -0
  121. data/lib/baykit/bayserver/util/headers.rb +194 -0
  122. data/lib/baykit/bayserver/util/host_matcher.rb +48 -0
  123. data/lib/baykit/bayserver/util/http_status.rb +60 -0
  124. data/lib/baykit/bayserver/util/http_util.rb +157 -0
  125. data/lib/baykit/bayserver/util/io_util.rb +32 -0
  126. data/lib/baykit/bayserver/util/ip_matcher.rb +67 -0
  127. data/lib/baykit/bayserver/util/key_val.rb +15 -0
  128. data/lib/baykit/bayserver/util/key_val_list_parser.rb +53 -0
  129. data/lib/baykit/bayserver/util/locale.rb +30 -0
  130. data/lib/baykit/bayserver/util/md5_password.rb +24 -0
  131. data/lib/baykit/bayserver/util/message.rb +56 -0
  132. data/lib/baykit/bayserver/util/mimes.rb +27 -0
  133. data/lib/baykit/bayserver/util/object_factory.rb +13 -0
  134. data/lib/baykit/bayserver/util/object_store.rb +74 -0
  135. data/lib/baykit/bayserver/util/postman.rb +35 -0
  136. data/lib/baykit/bayserver/util/reusable.rb +13 -0
  137. data/lib/baykit/bayserver/util/selector.rb +141 -0
  138. data/lib/baykit/bayserver/util/simple_buffer.rb +53 -0
  139. data/lib/baykit/bayserver/util/simple_inspect.rb +12 -0
  140. data/lib/baykit/bayserver/util/string_util.rb +73 -0
  141. data/lib/baykit/bayserver/util/sys_util.rb +138 -0
  142. data/lib/baykit/bayserver/util/url_decoder.rb +42 -0
  143. data/lib/baykit/bayserver/util/url_encoder.rb +19 -0
  144. data/lib/baykit/bayserver/util/valve.rb +15 -0
  145. data/lib/baykit/bayserver/version.rb +7 -0
  146. data/lib/baykit/bayserver/watercraft/boat.rb +43 -0
  147. data/lib/baykit/bayserver/watercraft/ship.rb +104 -0
  148. data/lib/baykit/bayserver/watercraft/yacht.rb +42 -0
  149. metadata +189 -0
@@ -0,0 +1,400 @@
1
+ require 'baykit/bayserver/http_exception'
2
+ require 'baykit/bayserver/protocol/protocol_exception'
3
+ require 'baykit/bayserver/agent/transporter/plain_transporter'
4
+ require 'baykit/bayserver/taxi/taxi_runner'
5
+ require 'baykit/bayserver/docker/harbor'
6
+ require 'baykit/bayserver/tours/send_file_yacht'
7
+ require 'baykit/bayserver/tours/read_file_taxi'
8
+ require 'baykit/bayserver/tours/content_consume_listener'
9
+
10
+ require 'baykit/bayserver/util/counter'
11
+ require 'baykit/bayserver/util/headers'
12
+ require 'baykit/bayserver/util/byte_array'
13
+ require 'baykit/bayserver/util/gzip_compressor'
14
+
15
+ module Baykit
16
+ module BayServer
17
+ module Tours
18
+ class TourRes
19
+ include Baykit::BayServer::Util::Reusable # implements
20
+
21
+ include Baykit::BayServer::Util
22
+ include Baykit::BayServer::Docker
23
+ include Baykit::BayServer::Tours
24
+ include Baykit::BayServer::Taxi
25
+ include Baykit::BayServer::Agent::Transporter
26
+
27
+ attr :tour
28
+
29
+ ###########################
30
+ # Response Header info
31
+ ###########################
32
+ attr :headers
33
+ attr_accessor :charset
34
+ attr :available
35
+ attr :consume_listener
36
+
37
+ attr_accessor :header_sent
38
+ attr :yacht
39
+
40
+ ###########################
41
+ # Response Content info
42
+ ###########################
43
+ attr :can_compress
44
+ attr :compressor
45
+
46
+ attr :bytes_posted
47
+ attr :bytes_consumed
48
+ attr :bytes_limit
49
+ attr :buffer_size
50
+
51
+ def initialize(tur)
52
+ @headers = Headers.new()
53
+ @tour = tur
54
+ @buffer_size = BayServer.harbor.tour_buffer_size
55
+ end
56
+
57
+ def init()
58
+ @yacht = SendFileYacht.new()
59
+ end
60
+
61
+ def to_s()
62
+ return @tour.to_s()
63
+ end
64
+
65
+ ######################################################
66
+ # Implements Reusable
67
+ ######################################################
68
+
69
+ def reset()
70
+ @charset = nil
71
+ @header_sent = false
72
+ if @yacht != nil
73
+ @yacht.reset()
74
+ end
75
+
76
+ @available = false
77
+ @consume_listener = nil
78
+
79
+ @can_compress = false
80
+ @compressor = nil
81
+ @headers.clear()
82
+ @bytes_posted = 0
83
+ @bytes_consumed = 0
84
+ @bytes_limit = 0
85
+ end
86
+
87
+ ######################################################
88
+ # other methods
89
+ ######################################################
90
+
91
+ def send_headers(chk_tour_id)
92
+ @tour.check_tour_id(chk_tour_id)
93
+
94
+ if @tour.zombie?
95
+ return
96
+ end
97
+
98
+ if @header_sent
99
+ return
100
+ end
101
+
102
+ @bytes_limit = @headers.content_length()
103
+
104
+ # Compress check
105
+ if BayServer.harbor.gzip_comp &&
106
+ @headers.contains(Headers::CONTENT_TYPE) &&
107
+ @headers.content_type().downcase().start_with?("text/") &&
108
+ !@headers.contains(Headers::CONTENT_ENCODING)
109
+
110
+ enc = @tour.req.headers.get(Headers::ACCEPT_ENCODING)
111
+
112
+ if enc != nil
113
+ enc.split(",").each do |tkn|
114
+ if tkn.strip().casecmp?("gzip")
115
+ @can_compress = true
116
+ @headers.set(Headers::CONTENT_ENCODING, "gzip")
117
+ @headers.remove(Headers::CONTENT_LENGTH)
118
+ break
119
+ end
120
+ end
121
+ end
122
+ end
123
+
124
+ @tour.ship.send_headers(@tour.ship_id, @tour)
125
+ @header_sent = true
126
+ end
127
+
128
+ def send_redirect(chk_tour_id, status, location)
129
+ @tour.check_tour_id(chk_tour_id)
130
+
131
+ if @header_sent
132
+ BayLog.error("Try to redirect after response header is sent (Ignore)")
133
+ else
134
+ set_consume_listener(&ContentConsumeListener::DEV_NULL)
135
+ @tour.ship.send_redirect(@tour.ship_id, @tour, status, location)
136
+ @header_sent = true
137
+ end_content(chk_tour_id)
138
+ end
139
+
140
+ end
141
+
142
+ def set_consume_listener(&listener)
143
+ @consume_listener = listener
144
+ @bytes_consumed = 0
145
+ @bytes_posted = 0
146
+ @available = true
147
+ end
148
+
149
+ def send_content(chk_tour_id, buf, ofs, len)
150
+ @tour.check_tour_id(chk_tour_id)
151
+ BayLog.debug("%s sendContent len=%d", @tour, len)
152
+
153
+ # Done listener
154
+ done_lis = Proc.new() do
155
+ consumed(chk_tour_id, len);
156
+ end
157
+
158
+ if @tour.zombie?
159
+ BayLog.debug("%s zombie return", self)
160
+ done_lis.call()
161
+ return true
162
+ end
163
+
164
+ if !@header_sent
165
+ raise Sink.new("Header not sent")
166
+ end
167
+
168
+
169
+ if @consume_listener == nil
170
+ raise Sink.new("Response consume listener is null")
171
+ end
172
+
173
+ BayLog.debug("%s posted res content len=%d posted=%d limit=%d consumed=%d",
174
+ @tour, len, @bytes_posted, @bytes_limit, @bytes_consumed)
175
+ if @bytes_limit > 0 && @bytes_limit < self.bytes_posted
176
+ raise ProtocolException.new("Post data exceed content-length: " + @bytes_posted + "/" + @bytes_limit)
177
+ end
178
+
179
+ if @can_compress
180
+ get_compressor().compress(buf, ofs, len, &done_lis)
181
+ else
182
+ begin
183
+ @tour.ship.send_res_content(@tour.ship_id, @tour, buf, ofs, len, &done_lis)
184
+ rescue IOError => e
185
+ done_lis.call()
186
+ raise e
187
+ end
188
+ end
189
+
190
+ @bytes_posted += len
191
+
192
+ BayLog.debug("%s post res content: len=%d posted=%d limit=%d consumed=%d",
193
+ @tour, len, @bytes_posted, @bytes_limit, @bytes_consumed)
194
+
195
+ old_available = @available
196
+ if !buffer_available()
197
+ @available = false
198
+ end
199
+ if old_available && !@available
200
+ BayLog.debug("%s response unavailable (_ _): posted=%d consumed=%d (buffer=%d)",
201
+ self, @bytes_posted, @bytes_consumed, @buffer_size)
202
+ end
203
+
204
+ return @available
205
+ end
206
+
207
+ def end_content(chk_tour_id)
208
+ @tour.check_tour_id(chk_tour_id)
209
+
210
+ BayLog.debug("%s end ResContent", self)
211
+
212
+ if !@tour.zombie? && @tour.city != nil
213
+ @tour.city.log(@tour)
214
+ end
215
+
216
+ # send end message
217
+ if @can_compress
218
+ get_compressor().finish()
219
+ end
220
+
221
+
222
+ # Done listener
223
+ done_lis = Proc.new() do
224
+ @tour.ship.return_tour(@tour)
225
+ end
226
+
227
+ begin
228
+ @tour.ship.send_end_tour(@tour.ship_id, chk_tour_id, @tour, &done_lis)
229
+ rescue IOError => e
230
+ done_lis.call()
231
+ raise e
232
+ end
233
+ end
234
+
235
+ def consumed(check_id, length)
236
+ @tour.check_tour_id(check_id)
237
+ if @consume_listener == nil
238
+ raise Sink.new("Response consume listener is null")
239
+ end
240
+
241
+ @bytes_consumed += length
242
+
243
+ BayLog.debug("%s resConsumed: len=%d posted=%d consumed=%d limit=%d",
244
+ @tour, length, @bytes_posted, @bytes_consumed, @bytes_limit)
245
+
246
+ resume = false
247
+ old_available = @available
248
+ if buffer_available()
249
+ @available = true
250
+ end
251
+ if !old_available && @available
252
+ BayLog.debug("%s response available (^o^): posted=%d consumed=%d", self, @bytes_posted, @bytes_consumed)
253
+ resume = true
254
+ end
255
+
256
+ if !@tour.zombie?
257
+ @consume_listener.call(length, resume)
258
+ end
259
+ end
260
+
261
+ def send_http_exception(chk_tour_id, http_ex)
262
+ if http_ex.status == HttpStatus::MOVED_TEMPORARILY || http_ex.status == HttpStatus::MOVED_PERMANENTLY
263
+ send_redirect(chk_tour_id, http_ex.status, http_ex.location)
264
+ else
265
+ send_error(chk_tour_id, http_ex.status, http_ex.message, http_ex)
266
+ end
267
+ end
268
+
269
+ def send_error(chk_tour_id, status=HttpStatus::INTERNAL_SERVER_ERROR, msg="", err=nil)
270
+ @tour.check_tour_id(chk_tour_id)
271
+ #BayLog.debug "#{self} Tur: Send Error status=#{status} msg=#{msg}"
272
+
273
+ if @tour.zombie?
274
+ return
275
+ end
276
+
277
+
278
+ if err.instance_of?(HttpException)
279
+ status = err.status
280
+ msg = err.message
281
+ end
282
+
283
+ if @header_sent
284
+ BayLog.warn("Try to send error after response header is sent (Ignore)")
285
+ BayLog.warn("%s: status=%d, message=%s", self, status, msg)
286
+ if err != nil
287
+ BayLog.error_e(err);
288
+ end
289
+ else
290
+ set_consume_listener(&ContentConsumeListener::DEV_NULL)
291
+ @tour.ship.send_error(@tour.ship_id, @tour, status, msg, err)
292
+ @header_sent = true
293
+ end
294
+
295
+ end_content(chk_tour_id)
296
+ end
297
+
298
+
299
+
300
+ def send_file(chk_tour_id, file, charset, async)
301
+ @tour.check_tour_id(chk_tour_id)
302
+
303
+ if @tour.zombie?
304
+ return
305
+ end
306
+
307
+ if File.directory?(file)
308
+ raise HttpException.new HttpStatus::FORBIDDEN, file
309
+ elsif !File.exists?(file)
310
+ raise HttpException.new HttpStatus::NOT_FOUND, file
311
+ end
312
+
313
+ mime_type = nil
314
+
315
+ rname = File.basename(file)
316
+ pos = rname.rindex('.')
317
+ if pos
318
+ ext = rname[pos + 1 .. -1].downcase
319
+ mime_type = Mimes.type(ext)
320
+ end
321
+
322
+ if !mime_type
323
+ mime_type = "application/octet-stream"
324
+ end
325
+
326
+ if mime_type.start_with?("text/") && charset != nil
327
+ mime_type = mime_type + "; charset=" + charset
328
+ end
329
+
330
+ file_len = ::File.size(file)
331
+ BayLog.debug("%s send_file %s async=%s len=%d", @tour, file, async, file_len)
332
+
333
+ @headers.set_content_type(mime_type)
334
+ @headers.set_content_length(file_len)
335
+
336
+ begin
337
+ send_headers(Tour::TOUR_ID_NOCHECK)
338
+
339
+ if async
340
+ bufsize = @tour.ship.protocol_handler.max_res_packet_data_size()
341
+
342
+ case(BayServer.harbor.file_send_method())
343
+
344
+ when Harbor::FILE_SEND_METHOD_SELECT
345
+ tp = PlainTransporter.new(false, bufsize)
346
+ @yacht.init(@tour, file, tp)
347
+ tp.init(@tour.ship.agent.non_blocking_handler, File.open(file, "rb"), @yacht)
348
+ @tour.ship.resume(@tour.ship_id)
349
+ tp.open_valve()
350
+
351
+ when Harbor::FILE_SEND_METHOD_SPIN
352
+ timeout = 10
353
+ tp = SpinReadTransporter.new(bufsize)
354
+ @yacht.init(@tour, file, tp)
355
+ tp.init(@tour.ship.agent.spin_handler, @yacht, File.open(file, "rb"), File.size(file), timeout, nil)
356
+ @tour.ship.resume(@tour.ship_id)
357
+ tp.open_valve()
358
+
359
+ when Harbor::FILE_SEND_METHOD_TAXI
360
+ txi = ReadFileTaxi.new(bufsize)
361
+ @yacht.init(@tour, file, txi)
362
+ txi.init(File.open(file, "rb"), @yacht)
363
+ if !TaxiRunner.post(txi)
364
+ raise HttpException.new(HttpStatus.SERVICE_UNAVAILABLE, "Taxi is busy!");
365
+ end
366
+
367
+ else
368
+ raise Sink.new();
369
+ end
370
+
371
+ else
372
+ SendFileTrain.new(@tour, file).run()
373
+ end
374
+ rescue HttpException => e
375
+ raise e
376
+ rescue => e
377
+ BayLog.error_e(e)
378
+ raise HttpException.new(HttpStatus::INTERNAL_SERVER_ERROR, file)
379
+ end
380
+
381
+ end
382
+
383
+ def get_compressor()
384
+ if @compressor == nil
385
+ @compressor = GzipCompressor.new(lambda do |new_buf, new_ofs, new_len, &lis|
386
+ @tour.ship.send_res_content(@tour.ship_id, @tour, new_buf, new_ofs, new_len, &lis)
387
+ end)
388
+ end
389
+
390
+ return @compressor
391
+ end
392
+
393
+
394
+ def buffer_available()
395
+ return @bytes_posted - @bytes_consumed < @buffer_size
396
+ end
397
+ end
398
+ end
399
+ end
400
+ end
@@ -0,0 +1,121 @@
1
+ require 'baykit/bayserver/agent/grand_agent'
2
+ require 'baykit/bayserver/tours/tour'
3
+ require 'baykit/bayserver/util/string_util'
4
+
5
+ module Baykit
6
+ module BayServer
7
+ module Tours
8
+ #
9
+ # TourStore
10
+ # You must lock object before call methods because all the methods may be called by different threads. (agent, tours agent)
11
+ #
12
+ class TourStore
13
+ include Baykit::BayServer::Agent
14
+ include Baykit::BayServer::Util
15
+
16
+
17
+ class AgentListener
18
+ include Baykit::BayServer::Agent::GrandAgent::GrandAgentLifecycleListener # implements
19
+
20
+ def add(agt)
21
+ TourStore.stores[agt.agent_id] = TourStore.new();
22
+ end
23
+
24
+ def remove(agt)
25
+ TourStore.stores.delete(agt.agent_id);
26
+ end
27
+ end
28
+
29
+
30
+ MAX_TOURS = 1024
31
+
32
+ attr :free_tours
33
+ attr :active_tour_map
34
+
35
+ # class variables
36
+ class << self
37
+ attr :max_count
38
+
39
+ # Agent ID => TourStore
40
+ attr :stores
41
+ end
42
+ @stores = {}
43
+
44
+
45
+ def initialize()
46
+ @free_tours = []
47
+ @active_tour_map = {}
48
+ @lock = Monitor.new
49
+ end
50
+
51
+ def get(key)
52
+ @lock.synchronize do
53
+ return @active_tour_map[key]
54
+ end
55
+ end
56
+
57
+ def rent(key, ship, force = false)
58
+ @lock.synchronize do
59
+ tur = get(key)
60
+ if tur != nil
61
+ raise Sink.new("#{ship} Tour already exists")
62
+ end
63
+
64
+ if !@free_tours.empty?
65
+ tur = @free_tours.delete_at(@free_tours.length - 1)
66
+ else
67
+ if !force && (@active_tour_map.length >= TourStore.max_count)
68
+ return nil
69
+ else
70
+ tur = Tour.new()
71
+ end
72
+ end
73
+
74
+ @active_tour_map[key] = tur
75
+ return tur
76
+ end
77
+ end
78
+
79
+ def Return(key)
80
+ @lock.synchronize do
81
+ if !@active_tour_map.key?(key)
82
+ raise Sink.new("Tour is not active: key=#{key}")
83
+ end
84
+
85
+ tur = @active_tour_map.delete(key)
86
+ tur.reset()
87
+ @free_tours.append(tur)
88
+ end
89
+ end
90
+
91
+ #
92
+ # print memory usage
93
+ #
94
+ def print_usage(indent)
95
+ BayLog.info("%sTour store usage:", StringUtil.indent(indent))
96
+ BayLog.info("%sfreeList: %d", StringUtil.indent(indent+1), @free_tours.length())
97
+ BayLog.info("%sactiveList: %d", StringUtil.indent(indent+1), @active_tour_map.length())
98
+ if BayLog.debug_mode?
99
+ @active_tour_map.values.each do |obj|
100
+ BayLog.debug("%s%s", StringUtil.indent(indent+1), obj)
101
+ end
102
+ end
103
+ end
104
+
105
+
106
+ ######################################################
107
+ # class methods
108
+ ######################################################
109
+ def self.init(max_tours)
110
+ @max_count = max_tours
111
+ GrandAgent.add_lifecycle_listener(AgentListener.new())
112
+ end
113
+
114
+ def self.get_store(agent_id)
115
+ return stores[agent_id]
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
121
+
@@ -0,0 +1,54 @@
1
+ require 'baykit/bayserver/util/counter'
2
+ module Baykit
3
+ module BayServer
4
+ module Train
5
+ class Train
6
+ include Baykit::BayServer::Util
7
+
8
+ #
9
+ # abstract methods
10
+ #
11
+ # depart()
12
+
13
+ # define class instance accessor
14
+ class << self
15
+ attr :train_id_counter
16
+ end
17
+ @train_id_counter = Counter.new()
18
+
19
+ attr :tour
20
+ attr :tour_id
21
+ attr :train_id
22
+
23
+
24
+ def initialize(tur)
25
+ @tour = tur
26
+ @tour_id = tur.id()
27
+ @train_id = Train.train_id_counter.next()
28
+ end
29
+
30
+ def to_s
31
+ "train##{@train_id}"
32
+ end
33
+
34
+ def run
35
+ BayLog.debug("%s Start train (%s)", self, @tour)
36
+
37
+ begin
38
+ depart()
39
+ rescue HttpException => e
40
+ @tour.res.send_http_exception @tour_id, e
41
+ rescue => e
42
+ BayLog.error_e e
43
+ @tour.res.end_content(@tour_id)
44
+ end
45
+
46
+ BayLog.debug("%s End train", self)
47
+ end
48
+
49
+
50
+ end
51
+ end
52
+ end
53
+ end
54
+
@@ -0,0 +1,32 @@
1
+ require 'baykit/bayserver/util/executor_service'
2
+ require 'baykit/bayserver/util/counter'
3
+
4
+ module Baykit
5
+ module BayServer
6
+ module Train
7
+ class TrainRunner
8
+ include Baykit::BayServer::Util
9
+
10
+ # define class instance accessor
11
+ class << self
12
+ attr :exe
13
+ end
14
+
15
+ def self.init(num_agents)
16
+ @exe = ExecutorService.new("TrainRunner", num_agents)
17
+ end
18
+
19
+ def self.post(train)
20
+ begin
21
+ @exe.submit(train)
22
+ return true
23
+ rescue => e
24
+ BayLog.error_e(e)
25
+ return false
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+
@@ -0,0 +1,54 @@
1
+ require 'baykit/bayserver/util/string_util'
2
+
3
+ module Baykit
4
+ module BayServer
5
+ module Util
6
+ class ByteArray
7
+ INITIAL_BUF_SIZE = 8192 * 4
8
+
9
+ attr :buf
10
+
11
+ def initialize(buf = nil)
12
+ if(buf == nil)
13
+ @buf = StringUtil.alloc(INITIAL_BUF_SIZE)
14
+ else
15
+ @buf = buf
16
+ end
17
+ end
18
+
19
+ def clear()
20
+ @buf.clear()
21
+ end
22
+
23
+ def length()
24
+ @buf.length()
25
+ end
26
+
27
+ def put_bytes(bytes, ofs = 0, len = bytes.length)
28
+ if(bytes == nil)
29
+ raise RuntimeError("nil bytes")
30
+ end
31
+
32
+ #while pos + len > @capacity
33
+ # extend_buf
34
+ #end
35
+
36
+ len.times do |i|
37
+ if(bytes[ofs + i] == nil)
38
+ raise RuntimeError.new("Invalid Data")
39
+ end
40
+ @buf.concat(bytes[ofs + i])
41
+ end
42
+ end
43
+
44
+ private
45
+ def extend_buf()
46
+ @capacity *= 2
47
+ new_buf = StringUtil.realloc(@buf, @capacity)
48
+ @buf = new_buf
49
+ end
50
+
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,13 @@
1
+ module Util
2
+ class ByteBuffer
3
+
4
+ attr :buf
5
+ attr :ofs
6
+ attr :length
7
+ attr :pos
8
+
9
+ def initialize(buf, ofs=0, len=buf.length)
10
+
11
+ end
12
+ end
13
+ end