bayserver-core 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
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