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.
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