kirk 0.1.8-java → 0.2.0.beta.1-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/kirk.rb +24 -26
- data/lib/kirk/cli.rb +1 -1
- data/lib/kirk/client.rb +57 -18
- data/lib/kirk/client/exchange.rb +146 -26
- data/lib/kirk/client/group.rb +94 -0
- data/lib/kirk/client/request.rb +42 -6
- data/lib/kirk/client/response.rb +20 -4
- data/lib/kirk/jetty.rb +22 -14
- data/lib/kirk/jetty/{jetty-client-7.2.2.v20101205.jar → jetty-client-7.3.0.v20110203.jar} +0 -0
- data/lib/kirk/jetty/jetty-continuation-7.3.0.v20110203.jar +0 -0
- data/lib/kirk/jetty/jetty-http-7.3.0.v20110203.jar +0 -0
- data/lib/kirk/jetty/jetty-io-7.3.0.v20110203.jar +0 -0
- data/lib/kirk/jetty/jetty-server-7.3.0.v20110203.jar +0 -0
- data/lib/kirk/jetty/jetty-util-7.3.0.v20110203.jar +0 -0
- data/lib/kirk/native.jar +0 -0
- data/lib/kirk/native.rb +12 -0
- data/lib/kirk/server.rb +11 -1
- data/lib/kirk/server/application_config.rb +56 -0
- data/lib/kirk/server/bootstrap.rb +59 -0
- data/lib/kirk/server/builder.rb +145 -0
- data/lib/kirk/{applications → server}/deploy_watcher.rb +1 -1
- data/lib/kirk/server/handler.rb +140 -0
- data/lib/kirk/server/hot_deployable.rb +63 -0
- data/lib/kirk/server/input_stream.rb +114 -0
- data/lib/kirk/{applications → server}/redeploy_client.rb +1 -1
- data/lib/kirk/version.rb +1 -1
- metadata +19 -16
- data/lib/kirk/applications/config.rb +0 -50
- data/lib/kirk/applications/hot_deployable.rb +0 -65
- data/lib/kirk/applications/rack.rb +0 -21
- data/lib/kirk/bootstrap.rb +0 -59
- data/lib/kirk/builder.rb +0 -143
- data/lib/kirk/client/connection.rb +0 -18
- data/lib/kirk/client/session.rb +0 -40
- data/lib/kirk/handler.rb +0 -129
- data/lib/kirk/input_stream.rb +0 -264
- data/lib/kirk/jetty/jetty-server-7.2.2.v20101205.jar +0 -0
data/lib/kirk.rb
CHANGED
@@ -8,42 +8,40 @@ module Kirk
|
|
8
8
|
end
|
9
9
|
|
10
10
|
require 'java'
|
11
|
-
require 'kirk/native'
|
12
|
-
require 'kirk/jetty'
|
13
11
|
require 'kirk/version'
|
14
12
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
import "java.util.logging.ConsoleHandler"
|
13
|
+
autoload :Client, 'kirk/client'
|
14
|
+
autoload :Jetty, 'kirk/jetty'
|
15
|
+
autoload :Native, 'kirk/native'
|
16
|
+
autoload :Server, 'kirk/server'
|
20
17
|
|
21
|
-
|
22
|
-
|
23
|
-
import "com.strobecorp.kirk.HotDeployableApplication"
|
24
|
-
import "com.strobecorp.kirk.LogFormatter"
|
25
|
-
end
|
18
|
+
java_import "java.net.InetSocketAddress"
|
19
|
+
java_import "java.nio.ByteBuffer"
|
26
20
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
21
|
+
java_import "java.util.concurrent.AbstractExecutorService"
|
22
|
+
java_import "java.util.concurrent.ExecutorCompletionService"
|
23
|
+
java_import "java.util.concurrent.LinkedBlockingQueue"
|
24
|
+
java_import "java.util.concurrent.TimeUnit"
|
25
|
+
java_import "java.util.concurrent.ThreadPoolExecutor"
|
26
|
+
|
27
|
+
java_import "java.util.logging.Logger"
|
28
|
+
java_import "java.util.logging.Level"
|
29
|
+
java_import "java.util.logging.ConsoleHandler"
|
34
30
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
require 'kirk/input_stream'
|
39
|
-
require 'kirk/server'
|
31
|
+
def self.sub_process?
|
32
|
+
!!defined?(Kirk::PARENT_VERSION)
|
33
|
+
end
|
40
34
|
|
41
35
|
# Configure the logger
|
42
36
|
def self.logger
|
43
37
|
@logger ||= begin
|
44
38
|
logger = Logger.get_logger("org.eclipse.jetty.util.log")
|
45
|
-
|
46
|
-
|
39
|
+
|
40
|
+
unless sub_process?
|
41
|
+
logger.set_use_parent_handlers(false)
|
42
|
+
logger.add_handler logger_handler
|
43
|
+
end
|
44
|
+
|
47
45
|
logger
|
48
46
|
end
|
49
47
|
end
|
data/lib/kirk/cli.rb
CHANGED
@@ -42,7 +42,7 @@ module Kirk
|
|
42
42
|
|
43
43
|
def handle_redeploy
|
44
44
|
rackup = File.expand_path(@options[:rackup] || "#{Dir.pwd}/config.ru")
|
45
|
-
client =
|
45
|
+
client = Server::RedeployClient.new('/tmp/kirk.sock')
|
46
46
|
|
47
47
|
unless File.exist?(rackup)
|
48
48
|
raise MissingRackupFile, "rackup file `#{rackup}` does not exist"
|
data/lib/kirk/client.rb
CHANGED
@@ -1,25 +1,64 @@
|
|
1
|
+
require 'kirk'
|
2
|
+
|
1
3
|
module Kirk
|
2
4
|
class Client
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
5
|
+
require 'kirk/client/group'
|
6
|
+
require 'kirk/client/response'
|
7
|
+
require 'kirk/client/request'
|
8
|
+
require 'kirk/client/exchange'
|
9
|
+
|
10
|
+
def self.client
|
11
|
+
@client ||= new
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.stop
|
15
|
+
@client.stop if @client
|
16
|
+
@client = nil
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.group(opts = {}, &blk)
|
20
|
+
client.group(opts, &blk)
|
21
|
+
end
|
22
|
+
|
23
|
+
%w(request head get post put delete).each do |method|
|
24
|
+
class_eval <<-RUBY
|
25
|
+
def self.#{method}(*args, &blk)
|
26
|
+
g = group { |g| g.#{method}(*args, &blk) }
|
27
|
+
g.responses.first
|
28
|
+
end
|
29
|
+
RUBY
|
30
|
+
end
|
31
|
+
|
32
|
+
def group(opts = {}, &blk)
|
33
|
+
Group.new(self, opts).tap do |group|
|
34
|
+
group.start(&blk)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def initialize(opts = {})
|
39
|
+
@options = opts
|
40
|
+
end
|
41
|
+
|
42
|
+
def client
|
43
|
+
@client ||= Jetty::HttpClient.new.tap do |client|
|
44
|
+
client.set_connector_type(Jetty::HttpClient::CONNECTOR_SELECT_CHANNEL)
|
45
|
+
client.set_thread_pool(thread_pool) if thread_pool
|
46
|
+
client.start
|
47
|
+
end
|
48
|
+
end
|
12
49
|
|
13
|
-
def
|
14
|
-
|
50
|
+
def process(request)
|
51
|
+
client.send Exchange.build(request)
|
15
52
|
end
|
16
53
|
|
17
|
-
|
54
|
+
def stop
|
55
|
+
client.stop
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def thread_pool
|
61
|
+
@options[:thread_pool]
|
62
|
+
end
|
18
63
|
end
|
19
64
|
end
|
20
|
-
|
21
|
-
require 'kirk/client/session'
|
22
|
-
require 'kirk/client/response'
|
23
|
-
require 'kirk/client/request'
|
24
|
-
require 'kirk/client/connection'
|
25
|
-
require 'kirk/client/exchange'
|
data/lib/kirk/client/exchange.rb
CHANGED
@@ -1,33 +1,153 @@
|
|
1
|
-
|
2
|
-
class
|
3
|
-
|
4
|
-
|
5
|
-
def initialize(session, handler)
|
6
|
-
@handler = handler
|
7
|
-
@session = session
|
8
|
-
super()
|
9
|
-
end
|
1
|
+
module Kirk
|
2
|
+
class Client
|
3
|
+
class Exchange < Jetty::HttpExchange
|
10
4
|
|
11
|
-
|
12
|
-
|
13
|
-
|
5
|
+
def self.build(request)
|
6
|
+
inst = new
|
7
|
+
inst.prepare! request
|
8
|
+
inst
|
9
|
+
end
|
14
10
|
|
15
|
-
|
16
|
-
@session.queue.offer(response)
|
17
|
-
@handler.on_response_complete(response) if @handler
|
18
|
-
end
|
11
|
+
attr_accessor :request, :response
|
19
12
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
13
|
+
def group
|
14
|
+
request.group
|
15
|
+
end
|
16
|
+
|
17
|
+
def handler
|
18
|
+
request.handler
|
19
|
+
end
|
20
|
+
|
21
|
+
def prepare!(request)
|
22
|
+
self.request = request
|
23
|
+
self.response = Response.new(!handler.respond_to?(:on_response_body))
|
24
|
+
self.method = request.method
|
25
|
+
self.url = request.url
|
26
|
+
|
27
|
+
if request.headers
|
28
|
+
request.headers.each do |name, val|
|
29
|
+
self.set_request_header(name.to_s, val.to_s)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
if request.body
|
34
|
+
#
|
35
|
+
# If the body is already an InputStream (thus in the correct
|
36
|
+
# format), just run with it.
|
37
|
+
if Java::JavaIo::InputStream === request.body
|
38
|
+
self.request_content_source = request.body
|
39
|
+
#
|
40
|
+
# If the body responds to the JRuby method that converts
|
41
|
+
# an object to an InputStream, then use that
|
42
|
+
elsif request.body.respond_to?(:to_inputstream)
|
43
|
+
self.request_content_source = request.body.to_inputstream
|
44
|
+
#
|
45
|
+
# If it responds to :read but not to :to_inputstream, then
|
46
|
+
# it is a ruby object that is trying to look like an IO but
|
47
|
+
# hasn't implemented the magic JRuby conversion method, so
|
48
|
+
# we have to make it work.
|
49
|
+
#
|
50
|
+
# XXX Implement an InputStream subclass that can wrap ruby
|
51
|
+
# IO like objects
|
52
|
+
elsif request.body.respond_to?(:read)
|
53
|
+
self.request_content = bufferize(request.body.read)
|
54
|
+
#
|
55
|
+
# The fallback plan is to just call #to_s on the object
|
56
|
+
else
|
57
|
+
self.request_content = bufferize(request.body.to_s)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
@buffer_body = handler.respond_to?(:on_response_content)
|
62
|
+
end
|
63
|
+
|
64
|
+
# Java callbacks
|
65
|
+
#
|
66
|
+
# def onConnectionFailed(ex)
|
67
|
+
# if handler.respond_to?(:on_connection_failed)
|
68
|
+
# handler.on_connection_failed(ex)
|
69
|
+
# end
|
70
|
+
# end
|
71
|
+
|
72
|
+
def onException(ex)
|
73
|
+
if handler.respond_to?(:on_exception)
|
74
|
+
handler.on_exception(ex)
|
75
|
+
end
|
76
|
+
|
77
|
+
response.exception = true
|
78
|
+
group.respond(response)
|
79
|
+
end
|
80
|
+
|
81
|
+
# def onExpire
|
82
|
+
# # p [ :onExpire ]
|
83
|
+
# if handler.respond_to?(:on_timeout)
|
84
|
+
# handler.on_timeout
|
85
|
+
# end
|
86
|
+
# end
|
87
|
+
|
88
|
+
def onRequestComplete
|
89
|
+
if handler.respond_to?(:on_request_complete)
|
90
|
+
handler.on_request_complete
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def onResponseComplete
|
95
|
+
if handler.respond_to?(:on_response_complete)
|
96
|
+
handler.on_response_complete(response)
|
97
|
+
end
|
98
|
+
|
99
|
+
# Need to return the response after the handler
|
100
|
+
# is done with it
|
101
|
+
group.respond(response)
|
102
|
+
end
|
103
|
+
|
104
|
+
def onResponseContent(buf)
|
105
|
+
chunk = stringify(buf)
|
106
|
+
|
107
|
+
if handler.respond_to?(:on_response_body)
|
108
|
+
handler.on_response_body(response, chunk)
|
109
|
+
else
|
110
|
+
response.body << chunk
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def onResponseHeader(name, value)
|
115
|
+
response.headers[name.to_s] = value.to_s
|
116
|
+
end
|
117
|
+
|
118
|
+
def onResponseHeaderComplete
|
119
|
+
if handler.respond_to?(:on_response_head)
|
120
|
+
handler.on_response_head(response)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def onResponseStatus(version, status, reason)
|
125
|
+
response.status = status
|
126
|
+
end
|
127
|
+
|
128
|
+
def onRetry
|
129
|
+
if handler.respond_to?(:on_retry)
|
130
|
+
handler.on_retry
|
131
|
+
end
|
132
|
+
|
133
|
+
super
|
134
|
+
end
|
135
|
+
|
136
|
+
def onSwitchProtocol(end_point)
|
137
|
+
# What is this exactly?
|
138
|
+
end
|
139
|
+
|
140
|
+
private
|
141
|
+
|
142
|
+
def bufferize(obj)
|
143
|
+
Jetty::ByteArrayBuffer.new(obj.to_s)
|
144
|
+
end
|
25
145
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
146
|
+
def stringify(buf)
|
147
|
+
bytes = Java::byte[buf.length].new
|
148
|
+
buf.get(bytes, 0, buf.length)
|
149
|
+
String.from_java_bytes(bytes)
|
150
|
+
end
|
31
151
|
end
|
32
152
|
end
|
33
153
|
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'uri'
|
2
|
+
|
3
|
+
module Kirk
|
4
|
+
class Client
|
5
|
+
class Group
|
6
|
+
attr_reader :client, :host, :options, :responses
|
7
|
+
|
8
|
+
def initialize(client = Client.new, options = {})
|
9
|
+
@options = options
|
10
|
+
@client = client
|
11
|
+
@queue = LinkedBlockingQueue.new
|
12
|
+
|
13
|
+
@requests_count = 0
|
14
|
+
@responses = []
|
15
|
+
|
16
|
+
if @options[:host]
|
17
|
+
@host = @options.delete(:host).chomp('/')
|
18
|
+
@host = "http://#{@host}" unless @host =~ /^https?:\/\//
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def block?
|
23
|
+
options.key?(:block) ? options[:block] : true
|
24
|
+
end
|
25
|
+
|
26
|
+
def start
|
27
|
+
ret = yield self
|
28
|
+
join if block?
|
29
|
+
ret
|
30
|
+
end
|
31
|
+
|
32
|
+
def join
|
33
|
+
get_responses
|
34
|
+
end
|
35
|
+
|
36
|
+
def complete(&blk)
|
37
|
+
@complete = blk if blk
|
38
|
+
@complete
|
39
|
+
end
|
40
|
+
|
41
|
+
def request(method = nil, url = nil, handler = nil, body = nil, headers = {})
|
42
|
+
request = Request.new(self, method, url, handler, body, headers)
|
43
|
+
|
44
|
+
yield request if block_given?
|
45
|
+
|
46
|
+
request.url URI.join(host, request.url).to_s if host
|
47
|
+
request.validate!
|
48
|
+
|
49
|
+
process(request)
|
50
|
+
request
|
51
|
+
end
|
52
|
+
|
53
|
+
def respond(response)
|
54
|
+
@queue.put(response)
|
55
|
+
end
|
56
|
+
|
57
|
+
%w/get post put delete head/.each do |method|
|
58
|
+
class_eval <<-RUBY
|
59
|
+
def #{method}(url, headers = nil, handler = nil)
|
60
|
+
request(:#{method.upcase}, url, headers, handler)
|
61
|
+
end
|
62
|
+
RUBY
|
63
|
+
end
|
64
|
+
|
65
|
+
def process(request)
|
66
|
+
@client.process(request)
|
67
|
+
@requests_count += 1
|
68
|
+
end
|
69
|
+
|
70
|
+
def get_responses
|
71
|
+
while @requests_count > 0
|
72
|
+
if resp = @queue.poll(timeout, TimeUnit::SECONDS)
|
73
|
+
@responses << resp
|
74
|
+
@requests_count -= 1
|
75
|
+
else
|
76
|
+
raise "timed out"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
completed
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
def completed
|
86
|
+
complete.call if complete
|
87
|
+
end
|
88
|
+
|
89
|
+
def timeout
|
90
|
+
@options[:timeout] || 30
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
data/lib/kirk/client/request.rb
CHANGED
@@ -1,12 +1,48 @@
|
|
1
1
|
class Kirk::Client
|
2
|
+
class InvalidRequestError < ArgumentError ; end
|
3
|
+
|
2
4
|
class Request
|
3
|
-
attr_reader :
|
5
|
+
attr_reader :group
|
6
|
+
|
7
|
+
def initialize(group, method = nil, url = nil, handler = nil, body = nil, headers = {})
|
8
|
+
@group = group
|
9
|
+
@url = url
|
10
|
+
@handler = handler
|
11
|
+
@body = body
|
12
|
+
@headers = headers
|
13
|
+
@method = normalize_method(method)
|
14
|
+
|
15
|
+
yield self if block_given?
|
16
|
+
end
|
17
|
+
|
18
|
+
%w/url headers handler body/.each do |method|
|
19
|
+
class_eval <<-RUBY
|
20
|
+
def #{method}(*args)
|
21
|
+
@#{method} = args.first unless args.empty?
|
22
|
+
@#{method}
|
23
|
+
end
|
24
|
+
RUBY
|
25
|
+
end
|
26
|
+
|
27
|
+
def method(*args)
|
28
|
+
@method = normalize_method(args.first) unless args.empty?
|
29
|
+
@method
|
30
|
+
end
|
31
|
+
|
32
|
+
def validate!
|
33
|
+
unless method
|
34
|
+
raise InvalidRequestError, "Must specify an HTTP method for the request"
|
35
|
+
end
|
36
|
+
|
37
|
+
unless url
|
38
|
+
raise InvalidRequestError, "Must specify a URL for the request"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
4
43
|
|
5
|
-
def
|
6
|
-
|
7
|
-
@method = method.to_s.upcase
|
8
|
-
@url = url
|
9
|
-
@handler = handler
|
44
|
+
def normalize_method(method)
|
45
|
+
method.to_s.upcase if method
|
10
46
|
end
|
11
47
|
end
|
12
48
|
end
|