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.
Files changed (37) hide show
  1. data/lib/kirk.rb +24 -26
  2. data/lib/kirk/cli.rb +1 -1
  3. data/lib/kirk/client.rb +57 -18
  4. data/lib/kirk/client/exchange.rb +146 -26
  5. data/lib/kirk/client/group.rb +94 -0
  6. data/lib/kirk/client/request.rb +42 -6
  7. data/lib/kirk/client/response.rb +20 -4
  8. data/lib/kirk/jetty.rb +22 -14
  9. data/lib/kirk/jetty/{jetty-client-7.2.2.v20101205.jar → jetty-client-7.3.0.v20110203.jar} +0 -0
  10. data/lib/kirk/jetty/jetty-continuation-7.3.0.v20110203.jar +0 -0
  11. data/lib/kirk/jetty/jetty-http-7.3.0.v20110203.jar +0 -0
  12. data/lib/kirk/jetty/jetty-io-7.3.0.v20110203.jar +0 -0
  13. data/lib/kirk/jetty/jetty-server-7.3.0.v20110203.jar +0 -0
  14. data/lib/kirk/jetty/jetty-util-7.3.0.v20110203.jar +0 -0
  15. data/lib/kirk/native.jar +0 -0
  16. data/lib/kirk/native.rb +12 -0
  17. data/lib/kirk/server.rb +11 -1
  18. data/lib/kirk/server/application_config.rb +56 -0
  19. data/lib/kirk/server/bootstrap.rb +59 -0
  20. data/lib/kirk/server/builder.rb +145 -0
  21. data/lib/kirk/{applications → server}/deploy_watcher.rb +1 -1
  22. data/lib/kirk/server/handler.rb +140 -0
  23. data/lib/kirk/server/hot_deployable.rb +63 -0
  24. data/lib/kirk/server/input_stream.rb +114 -0
  25. data/lib/kirk/{applications → server}/redeploy_client.rb +1 -1
  26. data/lib/kirk/version.rb +1 -1
  27. metadata +19 -16
  28. data/lib/kirk/applications/config.rb +0 -50
  29. data/lib/kirk/applications/hot_deployable.rb +0 -65
  30. data/lib/kirk/applications/rack.rb +0 -21
  31. data/lib/kirk/bootstrap.rb +0 -59
  32. data/lib/kirk/builder.rb +0 -143
  33. data/lib/kirk/client/connection.rb +0 -18
  34. data/lib/kirk/client/session.rb +0 -40
  35. data/lib/kirk/handler.rb +0 -129
  36. data/lib/kirk/input_stream.rb +0 -264
  37. 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
- import "java.util.concurrent.LinkedBlockingQueue"
16
- import "java.util.concurrent.TimeUnit"
17
- import "java.util.logging.Logger"
18
- import "java.util.logging.Level"
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
- module Native
22
- import "com.strobecorp.kirk.ApplicationConfig"
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
- module Applications
28
- autoload :Config, 'kirk/applications/config'
29
- autoload :DeployWatcher, 'kirk/applications/deploy_watcher'
30
- autoload :HotDeployable, 'kirk/applications/hot_deployable'
31
- autoload :Rack, 'kirk/applications/rack'
32
- autoload :RedeployClient, 'kirk/applications/redeploy_client'
33
- end
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
- require 'kirk/builder'
36
- require 'kirk/client'
37
- require 'kirk/handler'
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
- logger.set_use_parent_handlers(false)
46
- logger.add_handler logger_handler
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 = Applications::RedeployClient.new('/tmp/kirk.sock')
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
- import org.eclipse.jetty.client.HttpClient
4
- import org.eclipse.jetty.client.HttpExchange
5
- import java.net.InetSocketAddress
6
- import java.util.concurrent.LinkedBlockingQueue
7
- import org.eclipse.jetty.client.ContentExchange
8
- import java.util.concurrent.AbstractExecutorService
9
- import java.util.concurrent.TimeUnit
10
- import java.util.concurrent.ThreadPoolExecutor
11
- import java.util.concurrent.ExecutorCompletionService
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 self.session
14
- Session.new(&Proc.new)
50
+ def process(request)
51
+ client.send Exchange.build(request)
15
52
  end
16
53
 
17
- private
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'
@@ -1,33 +1,153 @@
1
- class Kirk::Client
2
- class Exchange < ContentExchange
3
- include java.util.concurrent.Callable
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
- def onException(ex)
12
- puts ex.inspect
13
- end
5
+ def self.build(request)
6
+ inst = new
7
+ inst.prepare! request
8
+ inst
9
+ end
14
10
 
15
- def onResponseComplete
16
- @session.queue.offer(response)
17
- @handler.on_response_complete(response) if @handler
18
- end
11
+ attr_accessor :request, :response
19
12
 
20
- def response
21
- @response = begin
22
- Response.new(get_response_content, get_response_status)
23
- end
24
- end
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
- def self.from_request(request)
27
- exchange = new(request.session, request.handler)
28
- exchange.set_method(request.method)
29
- exchange.set_url(request.url)
30
- exchange
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
@@ -1,12 +1,48 @@
1
1
  class Kirk::Client
2
+ class InvalidRequestError < ArgumentError ; end
3
+
2
4
  class Request
3
- attr_reader :method, :url, :handler, :session
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 initialize(session, method, url, handler, headers)
6
- @session = session
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