kirk 0.1.8-java → 0.2.0.beta.1-java
Sign up to get free protection for your applications and to get access to all the features.
- 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
|