mizuno 0.6.1 → 0.6.3
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/java/jetty-client-8.1.3.v20120416.jar +0 -0
- data/lib/java/{jetty-continuation-8.1.2.v20120308.jar → jetty-continuation-8.1.3.v20120416.jar} +0 -0
- data/lib/java/{jetty-http-8.1.2.v20120308.jar → jetty-http-8.1.3.v20120416.jar} +0 -0
- data/lib/java/{jetty-io-8.1.2.v20120308.jar → jetty-io-8.1.3.v20120416.jar} +0 -0
- data/lib/java/{jetty-jmx-8.1.2.v20120308.jar → jetty-jmx-8.1.3.v20120416.jar} +0 -0
- data/lib/java/{jetty-security-8.1.2.v20120308.jar → jetty-security-8.1.3.v20120416.jar} +0 -0
- data/lib/java/{jetty-server-8.1.2.v20120308.jar → jetty-server-8.1.3.v20120416.jar} +0 -0
- data/lib/java/{jetty-servlet-8.1.2.v20120308.jar → jetty-servlet-8.1.3.v20120416.jar} +0 -0
- data/lib/java/{jetty-servlets-8.1.2.v20120308.jar → jetty-servlets-8.1.3.v20120416.jar} +0 -0
- data/lib/java/{jetty-util-8.1.2.v20120308.jar → jetty-util-8.1.3.v20120416.jar} +0 -0
- data/lib/mizuno.rb +27 -14
- data/lib/mizuno/choices.rb +1 -1
- data/lib/mizuno/client.rb +62 -0
- data/lib/mizuno/client_exchange.rb +72 -0
- data/lib/mizuno/client_response.rb +34 -0
- data/lib/mizuno/logger.rb +87 -0
- data/lib/mizuno/rack_servlet.rb +14 -9
- data/lib/mizuno/reloader.rb +10 -5
- data/lib/mizuno/runner.rb +9 -3
- data/lib/mizuno/server.rb +138 -0
- data/lib/mizuno/version.rb +1 -1
- data/lib/rack/handler/mizuno.rb +2 -2
- metadata +151 -153
- data/lib/mizuno/http_server.rb +0 -185
- data/lib/mizuno/java_logger.rb +0 -37
Binary file
|
data/lib/java/{jetty-continuation-8.1.2.v20120308.jar → jetty-continuation-8.1.3.v20120416.jar}
RENAMED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/lib/mizuno.rb
CHANGED
@@ -4,23 +4,36 @@
|
|
4
4
|
# Written by Don Werve <don@madwombat.com>
|
5
5
|
#
|
6
6
|
|
7
|
+
require 'java'
|
8
|
+
|
7
9
|
# Save our launch environment for spawning children later.
|
8
10
|
module Mizuno
|
9
11
|
LAUNCH_ENV = $LOAD_PATH.map { |i| "-I#{i}" }.push($0)
|
10
|
-
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
HOME = File.expand_path(File.dirname(__FILE__))
|
14
|
+
|
15
|
+
#
|
16
|
+
# Tell log4j not to complain to the console about a missing
|
17
|
+
# log4j.properties file, as we configure it programmatically in
|
18
|
+
# Mizuno::Server (http://stackoverflow.com/questions/6849887)
|
19
|
+
#
|
20
|
+
def Mizuno.initialize_logger
|
21
|
+
require_jars(%w(log4j slf4j-api slf4j-log4j12))
|
22
|
+
Java.org.apache.log4j.Logger.getRootLogger.setLevel( \
|
23
|
+
Java.org.apache.log4j.Level::INFO)
|
24
|
+
end
|
16
25
|
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
|
21
|
-
|
26
|
+
#
|
27
|
+
# Loads jarfiles independent of versions.
|
28
|
+
#
|
29
|
+
def Mizuno.require_jars(*names)
|
30
|
+
names.flatten.each do |name|
|
31
|
+
file = Dir[File.join(HOME, 'java', "#{name}-*.jar")].first
|
32
|
+
file ||= Dir[File.join(HOME, 'java', "#{name}.jar")].first
|
33
|
+
raise("Unknown or missing jar: #{name}") unless file
|
34
|
+
require file
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
22
38
|
|
23
|
-
|
24
|
-
require 'mizuno/rack/chunked'
|
25
|
-
require 'mizuno/rack_servlet'
|
26
|
-
require 'mizuno/http_server'
|
39
|
+
Mizuno.initialize_logger
|
data/lib/mizuno/choices.rb
CHANGED
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'thread'
|
2
|
+
require 'mizuno'
|
3
|
+
Mizuno.require_jars(%w(jetty-client jetty-http jetty-io jetty-util))
|
4
|
+
require 'mizuno/client_exchange'
|
5
|
+
|
6
|
+
module Mizuno
|
7
|
+
class Client
|
8
|
+
java_import 'org.eclipse.jetty.client.HttpClient'
|
9
|
+
java_import 'org.eclipse.jetty.util.thread.QueuedThreadPool'
|
10
|
+
|
11
|
+
@lock = Mutex.new
|
12
|
+
|
13
|
+
def Client.request(*args, &block)
|
14
|
+
@lock.synchronize { @root ||= new }
|
15
|
+
@root.request(*args, &block)
|
16
|
+
end
|
17
|
+
|
18
|
+
def Client.stop
|
19
|
+
@lock.synchronize do
|
20
|
+
return unless @root
|
21
|
+
@root.stop
|
22
|
+
@root = nil
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def initialize(options = {})
|
27
|
+
defaults = { :timeout => 60 }
|
28
|
+
options = defaults.merge(options)
|
29
|
+
@client = HttpClient.new
|
30
|
+
@client.setConnectorType(HttpClient::CONNECTOR_SELECT_CHANNEL)
|
31
|
+
@client.setMaxConnectionsPerAddress(100)
|
32
|
+
@client.setThreadPool(QueuedThreadPool.new(50))
|
33
|
+
@client.setTimeout(options[:timeout] * 1000)
|
34
|
+
@client.start
|
35
|
+
@lock = Mutex.new
|
36
|
+
@exchanges = []
|
37
|
+
end
|
38
|
+
|
39
|
+
def stop(wait = true)
|
40
|
+
wait and @lock.synchronize do
|
41
|
+
@exchanges.each { |e| e.waitForDone }
|
42
|
+
@exchanges.clear
|
43
|
+
end
|
44
|
+
@client.stop
|
45
|
+
end
|
46
|
+
|
47
|
+
def clear(exchange)
|
48
|
+
return unless @lock.try_lock
|
49
|
+
@exchanges.delete(exchange)
|
50
|
+
@lock.unlock
|
51
|
+
end
|
52
|
+
|
53
|
+
def request(url, options = {}, &block)
|
54
|
+
exchange = ClientExchange.new(self)
|
55
|
+
@lock.synchronize { @exchanges << exchange }
|
56
|
+
exchange.setup(url, options, &block)
|
57
|
+
@client.send(exchange)
|
58
|
+
return(exchange)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'stringio'
|
2
|
+
require 'mizuno/client_response'
|
3
|
+
|
4
|
+
module Mizuno
|
5
|
+
java_import 'org.eclipse.jetty.client.ContentExchange'
|
6
|
+
|
7
|
+
# what do I want to happen on a timeout or error?
|
8
|
+
|
9
|
+
class ClientExchange < ContentExchange
|
10
|
+
def initialize(client)
|
11
|
+
super(false)
|
12
|
+
@client = client
|
13
|
+
end
|
14
|
+
|
15
|
+
def setup(url, options = {}, &block)
|
16
|
+
@callback = block
|
17
|
+
@response = ClientResponse.new(url)
|
18
|
+
setURL(url)
|
19
|
+
@response.ssl = (getScheme == 'https')
|
20
|
+
setMethod((options[:method] or "GET").upcase)
|
21
|
+
headers = options[:headers] and headers.each_pair { |k, v|
|
22
|
+
setRequestHeader(k, v) }
|
23
|
+
return unless options[:body]
|
24
|
+
body = StringIO.new(options[:body].read)
|
25
|
+
setRequestContentSource(body.to_inputstream)
|
26
|
+
end
|
27
|
+
|
28
|
+
def onResponseHeader(name, value)
|
29
|
+
@response[name.to_s] = value.to_s
|
30
|
+
end
|
31
|
+
|
32
|
+
def onResponseComplete
|
33
|
+
@client.clear(self)
|
34
|
+
@response.status = getResponseStatus
|
35
|
+
@response.body = getResponseContent
|
36
|
+
run_callback
|
37
|
+
end
|
38
|
+
|
39
|
+
def onExpire
|
40
|
+
@client.clear(self)
|
41
|
+
@response.timeout = true
|
42
|
+
@response.status = -1
|
43
|
+
@response.body = nil
|
44
|
+
run_callback
|
45
|
+
end
|
46
|
+
|
47
|
+
def onException(error)
|
48
|
+
@exception ||= error
|
49
|
+
end
|
50
|
+
|
51
|
+
def onConnectionFailed(error)
|
52
|
+
@exception ||= error
|
53
|
+
end
|
54
|
+
|
55
|
+
def run_callback
|
56
|
+
begin
|
57
|
+
@callback.call(@response)
|
58
|
+
rescue => error
|
59
|
+
onException(error)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def waitForDone
|
64
|
+
super
|
65
|
+
throw(@exception) if @exception
|
66
|
+
end
|
67
|
+
#
|
68
|
+
# def finished?
|
69
|
+
# #FIXME: Implement.
|
70
|
+
# end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'rack/response'
|
2
|
+
|
3
|
+
module Mizuno
|
4
|
+
class ClientResponse
|
5
|
+
include Rack::Response::Helpers
|
6
|
+
|
7
|
+
attr_accessor :url, :status, :headers, :body, :ssl, :timeout
|
8
|
+
|
9
|
+
def initialize(url)
|
10
|
+
@url = url
|
11
|
+
@headers = Rack::Utils::HeaderHash.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def [](key)
|
15
|
+
@headers[key]
|
16
|
+
end
|
17
|
+
|
18
|
+
def []=(key, value)
|
19
|
+
@headers[key] = value
|
20
|
+
end
|
21
|
+
|
22
|
+
def ssl?
|
23
|
+
@ssl == true
|
24
|
+
end
|
25
|
+
|
26
|
+
def timeout?
|
27
|
+
(@timeout == true) or (@status == 408)
|
28
|
+
end
|
29
|
+
|
30
|
+
def success?
|
31
|
+
successful? or redirect?
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
module Mizuno
|
4
|
+
class Logger < ::Logger
|
5
|
+
java_import 'java.io.ByteArrayInputStream'
|
6
|
+
java_import 'java.util.Properties'
|
7
|
+
java_import 'org.apache.log4j.PropertyConfigurator'
|
8
|
+
|
9
|
+
LEVELS = {
|
10
|
+
::Logger::DEBUG => Java.org.apache.log4j.Level::DEBUG,
|
11
|
+
::Logger::INFO => Java.org.apache.log4j.Level::INFO,
|
12
|
+
::Logger::WARN => Java.org.apache.log4j.Level::WARN,
|
13
|
+
::Logger::ERROR => Java.org.apache.log4j.Level::ERROR,
|
14
|
+
::Logger::FATAL => Java.org.apache.log4j.Level::FATAL }
|
15
|
+
|
16
|
+
#
|
17
|
+
# Configure Log4J.
|
18
|
+
#
|
19
|
+
def Logger.configure(options = {})
|
20
|
+
return if @options
|
21
|
+
@options = options
|
22
|
+
|
23
|
+
# Default logging threshold.
|
24
|
+
limit = options[:warn] ? "WARN" : "ERROR"
|
25
|
+
limit = "DEBUG" if ($DEBUG or options[:debug])
|
26
|
+
|
27
|
+
# Base logging configuration.
|
28
|
+
config = <<-END
|
29
|
+
log4j.rootCategory = #{limit}, default
|
30
|
+
log4j.logger.org.eclipse.jetty.util.log = #{limit}, default
|
31
|
+
log4j.appender.default.Threshold = #{limit}
|
32
|
+
log4j.appender.default.layout = org.apache.log4j.PatternLayout
|
33
|
+
END
|
34
|
+
|
35
|
+
# Should we log to the console?
|
36
|
+
config.concat(<<-END) unless options[:log]
|
37
|
+
log4j.appender.default = org.apache.log4j.ConsoleAppender
|
38
|
+
log4j.appender.default.layout.ConversionPattern = %m\\n
|
39
|
+
END
|
40
|
+
|
41
|
+
# Are we logging to a file?
|
42
|
+
config.concat(<<-END) if options[:log]
|
43
|
+
log4j.appender.default = org.apache.log4j.FileAppender
|
44
|
+
log4j.appender.default.Append = true
|
45
|
+
log4j.appender.default.File = #{options[:log]}
|
46
|
+
log4j.appender.default.layout.ConversionPattern = %d %p %m\\n
|
47
|
+
END
|
48
|
+
|
49
|
+
# Set up Log4J via Properties.
|
50
|
+
properties = Properties.new
|
51
|
+
properties.load(ByteArrayInputStream.new(config.to_java_bytes))
|
52
|
+
PropertyConfigurator.configure(properties)
|
53
|
+
|
54
|
+
# Create the default logger that gets used everywhere.
|
55
|
+
@logger = new
|
56
|
+
end
|
57
|
+
|
58
|
+
def Logger.logger
|
59
|
+
@logger
|
60
|
+
end
|
61
|
+
|
62
|
+
def initialize
|
63
|
+
@log4j = Java.org.apache.log4j.Logger.getLogger('ruby')
|
64
|
+
end
|
65
|
+
|
66
|
+
def add(severity, message = nil, progname = nil)
|
67
|
+
content = (message or (block_given? and yield) or progname)
|
68
|
+
@log4j.log(LEVELS[severity], content)
|
69
|
+
end
|
70
|
+
|
71
|
+
def puts(message)
|
72
|
+
write(message.to_s)
|
73
|
+
end
|
74
|
+
|
75
|
+
def write(message)
|
76
|
+
add(INFO, message)
|
77
|
+
end
|
78
|
+
|
79
|
+
def flush
|
80
|
+
# No-op.
|
81
|
+
end
|
82
|
+
|
83
|
+
def close
|
84
|
+
# No-op.
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
data/lib/mizuno/rack_servlet.rb
CHANGED
@@ -11,16 +11,21 @@ require 'rack/response'
|
|
11
11
|
# /servlet/http/HttpServlet.html
|
12
12
|
#
|
13
13
|
module Mizuno
|
14
|
-
|
14
|
+
java_import 'javax.servlet.http.HttpServlet'
|
15
15
|
|
16
16
|
class RackServlet < HttpServlet
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
java_import 'java.io.FileInputStream'
|
18
|
+
java_import 'org.eclipse.jetty.continuation.ContinuationSupport'
|
19
|
+
java_import 'org.jruby.rack.servlet.RewindableInputStream'
|
20
20
|
|
21
21
|
# Regex for splitting on newlines.
|
22
22
|
NEWLINE = /\n/
|
23
23
|
|
24
|
+
def initialize(server)
|
25
|
+
@server = server
|
26
|
+
super()
|
27
|
+
end
|
28
|
+
|
24
29
|
#
|
25
30
|
# Sets the Rack application that handles requests sent to this
|
26
31
|
# servlet container.
|
@@ -67,7 +72,7 @@ module Mizuno
|
|
67
72
|
|
68
73
|
# Add an callback that can be used to add results to the
|
69
74
|
# response asynchronously.
|
70
|
-
env['async.callback'] =
|
75
|
+
env['async.callback'] = Proc.new do |rack_response|
|
71
76
|
servlet_response = continuation.getServletResponse
|
72
77
|
rack_to_servlet(rack_response, servlet_response) \
|
73
78
|
and continuation.complete
|
@@ -117,7 +122,7 @@ module Mizuno
|
|
117
122
|
env['SCRIPT_NAME'] = ""
|
118
123
|
|
119
124
|
# Rack says URI, but it hands off a URL.
|
120
|
-
env['REQUEST_URI'] = request.getRequestURL.
|
125
|
+
env['REQUEST_URI'] = request.getRequestURL.to_s
|
121
126
|
|
122
127
|
# Java chops off the query string, but a Rack application will
|
123
128
|
# expect it, so we'll add it back if present
|
@@ -151,8 +156,8 @@ module Mizuno
|
|
151
156
|
if env["HTTP_CONTENT_LENGTH"]
|
152
157
|
|
153
158
|
# Route errors through the logger.
|
154
|
-
env['rack.errors'] ||=
|
155
|
-
env['rack.logger'] ||=
|
159
|
+
env['rack.errors'] ||= @server.logger
|
160
|
+
env['rack.logger'] ||= @server.logger
|
156
161
|
|
157
162
|
# All done, hand back the Rack request.
|
158
163
|
return(env)
|
@@ -244,7 +249,7 @@ module Mizuno
|
|
244
249
|
message = "Exception: #{error}"
|
245
250
|
message << "\n#{error.backtrace.join("\n")}" \
|
246
251
|
if (error.respond_to?(:backtrace))
|
247
|
-
|
252
|
+
Server.logger.error(message)
|
248
253
|
return if response.isCommitted
|
249
254
|
response.reset
|
250
255
|
response.setStatus(500)
|
data/lib/mizuno/reloader.rb
CHANGED
@@ -12,6 +12,10 @@ module Mizuno
|
|
12
12
|
# by sending a SIGHUP to the process.
|
13
13
|
#
|
14
14
|
class Reloader
|
15
|
+
@reloaders = []
|
16
|
+
|
17
|
+
@trigger = 'tmp/restart.txt'
|
18
|
+
|
15
19
|
class << self
|
16
20
|
attr_accessor :logger, :trigger, :reloaders
|
17
21
|
end
|
@@ -20,14 +24,15 @@ module Mizuno
|
|
20
24
|
reloaders.each { |r| r.reload!(true) }
|
21
25
|
end
|
22
26
|
|
23
|
-
def
|
27
|
+
def Reloader.add(reloader)
|
24
28
|
Thread.exclusive do
|
25
|
-
|
26
|
-
|
27
|
-
self.class.logger ||= Mizuno::HttpServer.logger
|
28
|
-
self.class.trigger ||= "tmp/restart.txt"
|
29
|
+
@logger ||= Mizuno::Server.logger
|
30
|
+
@reloaders << reloader
|
29
31
|
end
|
32
|
+
end
|
30
33
|
|
34
|
+
def initialize(app, interval = 1)
|
35
|
+
Reloader.add(self)
|
31
36
|
@app = app
|
32
37
|
@interval = interval
|
33
38
|
@trigger = self.class.trigger
|
data/lib/mizuno/runner.rb
CHANGED
@@ -1,11 +1,14 @@
|
|
1
1
|
require 'ffi'
|
2
2
|
require 'net/http'
|
3
3
|
require 'choice'
|
4
|
-
require 'mizuno/choices'
|
5
4
|
require 'childprocess'
|
6
5
|
require 'fileutils'
|
7
6
|
require 'etc'
|
8
7
|
require 'rack'
|
8
|
+
require 'mizuno'
|
9
|
+
require 'mizuno/choices'
|
10
|
+
require 'mizuno/server'
|
11
|
+
require 'rack/handler/mizuno'
|
9
12
|
|
10
13
|
module Mizuno
|
11
14
|
require 'rbconfig'
|
@@ -99,7 +102,7 @@ module Mizuno
|
|
99
102
|
|
100
103
|
# Fire up Mizuno as if it was called from Rackup.
|
101
104
|
Dir.chdir(options[:root])
|
102
|
-
|
105
|
+
Logger.configure(options)
|
103
106
|
ENV['RACK_ENV'] = options[:env]
|
104
107
|
server = Rack::Server.new
|
105
108
|
server.options = options.merge(:server => 'mizuno',
|
@@ -260,7 +263,7 @@ module Mizuno
|
|
260
263
|
#
|
261
264
|
# Exit with a message and a status value.
|
262
265
|
#
|
263
|
-
# FIXME: Dump these in the logfile if called from
|
266
|
+
# FIXME: Dump these in the logfile if called from Server?
|
264
267
|
#
|
265
268
|
def Runner.die(message, success = false)
|
266
269
|
$stderr.puts(message)
|
@@ -268,3 +271,6 @@ module Mizuno
|
|
268
271
|
end
|
269
272
|
end
|
270
273
|
end
|
274
|
+
|
275
|
+
# Ensure that we shutdown the server on exit.
|
276
|
+
at_exit { Mizuno::Server.stop }
|
@@ -0,0 +1,138 @@
|
|
1
|
+
# FIXME: mizuno/http_server needs to still work, but we will throw out a
|
2
|
+
# deprecation notice and remove it in later versions.
|
3
|
+
|
4
|
+
require 'rack'
|
5
|
+
require 'mizuno'
|
6
|
+
Mizuno.require_jars(%w(jetty-continuation jetty-http jetty-io jetty-jmx
|
7
|
+
jetty-security jetty-server jetty-servlet jetty-servlets jetty-util
|
8
|
+
servlet-api rewindable-input-stream))
|
9
|
+
require 'mizuno/version'
|
10
|
+
require 'mizuno/rack/chunked'
|
11
|
+
require 'mizuno/rack_servlet'
|
12
|
+
require 'mizuno/logger'
|
13
|
+
require 'mizuno/reloader'
|
14
|
+
|
15
|
+
module Mizuno
|
16
|
+
class Server
|
17
|
+
java_import 'org.eclipse.jetty.servlet.ServletContextHandler'
|
18
|
+
java_import 'org.eclipse.jetty.servlet.ServletHolder'
|
19
|
+
java_import 'org.eclipse.jetty.server.nio.SelectChannelConnector'
|
20
|
+
java_import 'org.eclipse.jetty.util.thread.QueuedThreadPool'
|
21
|
+
|
22
|
+
attr_accessor :logger
|
23
|
+
|
24
|
+
@lock ||= Mutex.new
|
25
|
+
|
26
|
+
def Server.run(app, options = {})
|
27
|
+
@lock.synchronize do
|
28
|
+
return if @server
|
29
|
+
@server = new
|
30
|
+
@server.run(app, options)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def Server.stop
|
35
|
+
@lock.synchronize do
|
36
|
+
return unless @server
|
37
|
+
@server.stop
|
38
|
+
@server = nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def Server.logger
|
43
|
+
Logger.logger
|
44
|
+
end
|
45
|
+
|
46
|
+
#
|
47
|
+
# Start up an instance of Jetty, running a Rack application.
|
48
|
+
# Options can be any of the follwing, and are not
|
49
|
+
# case-sensitive:
|
50
|
+
#
|
51
|
+
# :host::
|
52
|
+
# String specifying the IP address to bind to; defaults
|
53
|
+
# to 0.0.0.0.
|
54
|
+
#
|
55
|
+
# :port::
|
56
|
+
# String or integer with the port to bind to; defaults
|
57
|
+
# to 9292.
|
58
|
+
#
|
59
|
+
def run(app, options = {})
|
60
|
+
# Symbolize and downcase keys.
|
61
|
+
@options = options = Hash[options.map { |k, v|
|
62
|
+
[ k.to_s.downcase.to_sym, v ] }]
|
63
|
+
options[:quiet] ||= true if options[:embedded]
|
64
|
+
|
65
|
+
# The Jetty server
|
66
|
+
Logger.configure(options)
|
67
|
+
@logger = Logger.logger
|
68
|
+
@server = Java.org.eclipse.jetty.server.Server.new
|
69
|
+
@server.setSendServerVersion(false)
|
70
|
+
|
71
|
+
# Thread pool
|
72
|
+
threads = options[:threads] || 50
|
73
|
+
thread_pool = QueuedThreadPool.new
|
74
|
+
thread_pool.min_threads = [ threads.to_i / 10, 5 ].max
|
75
|
+
thread_pool.max_threads = [ threads.to_i, 10 ].max
|
76
|
+
@server.set_thread_pool(thread_pool)
|
77
|
+
|
78
|
+
# Connector
|
79
|
+
connector = SelectChannelConnector.new
|
80
|
+
connector.setPort(options[:port].to_i)
|
81
|
+
connector.setHost(options[:host])
|
82
|
+
@server.addConnector(connector)
|
83
|
+
|
84
|
+
# Switch to a different user or group if we were asked to.
|
85
|
+
Runner.setgid(options) if options[:group]
|
86
|
+
Runner.setuid(options) if options[:user]
|
87
|
+
|
88
|
+
# Servlet handler.
|
89
|
+
app_handler = ServletContextHandler.new(nil, "/",
|
90
|
+
ServletContextHandler::NO_SESSIONS)
|
91
|
+
|
92
|
+
# Optionally wrap with Mizuno::Reloader.
|
93
|
+
threshold = (ENV['RACK_ENV'] == 'production' ? 10 : 1)
|
94
|
+
app = Mizuno::Reloader.new(app, threshold) \
|
95
|
+
if options[:reloadable]
|
96
|
+
|
97
|
+
# The servlet itself.
|
98
|
+
rack_servlet = RackServlet.new(self)
|
99
|
+
rack_servlet.rackup(app)
|
100
|
+
holder = ServletHolder.new(rack_servlet)
|
101
|
+
app_handler.addServlet(holder, "/")
|
102
|
+
|
103
|
+
# Add the context to the server and start.
|
104
|
+
@server.set_handler(app_handler)
|
105
|
+
@server.start
|
106
|
+
$stderr.printf("%s listening on %s:%s\n", version,
|
107
|
+
connector.host, connector.port) unless options[:quiet]
|
108
|
+
|
109
|
+
# If we're embeded, we're done.
|
110
|
+
return if options[:embedded]
|
111
|
+
|
112
|
+
# Stop the server when we get The Signal.
|
113
|
+
trap("SIGINT") { @server.stop and exit }
|
114
|
+
|
115
|
+
# Join with the server thread, so that currently open file
|
116
|
+
# descriptors don't get closed by accident.
|
117
|
+
# http://www.ruby-forum.com/topic/209252
|
118
|
+
@server.join
|
119
|
+
end
|
120
|
+
|
121
|
+
#
|
122
|
+
# Shuts down an embedded Jetty instance.
|
123
|
+
#
|
124
|
+
def stop
|
125
|
+
return unless @server
|
126
|
+
$stderr.print "Stopping Jetty..." unless @options[:quiet]
|
127
|
+
@server.stop
|
128
|
+
$stderr.puts "done." unless @options[:quiet]
|
129
|
+
end
|
130
|
+
|
131
|
+
#
|
132
|
+
# Returns the full version string.
|
133
|
+
#
|
134
|
+
def version
|
135
|
+
"Mizuno #{Mizuno::VERSION} (Jetty #{Java.org.eclipse.jetty.server.Server.getVersion})"
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
data/lib/mizuno/version.rb
CHANGED
data/lib/rack/handler/mizuno.rb
CHANGED
metadata
CHANGED
@@ -1,171 +1,169 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: mizuno
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
version: 0.6.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.6.3
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
8
|
-
|
9
|
-
autorequire:
|
7
|
+
authors:
|
8
|
+
- Don Werve
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
version_requirements: *id008
|
12
|
+
date: 2012-04-29 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rack
|
16
|
+
version_requirements: &2056 !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ! '>='
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 1.0.0
|
21
|
+
none: false
|
22
|
+
requirement: *2056
|
23
|
+
prerelease: false
|
24
|
+
type: :runtime
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: ffi
|
27
|
+
version_requirements: &2074 !ruby/object:Gem::Requirement
|
28
|
+
requirements:
|
29
|
+
- - ! '>='
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: 1.0.0
|
32
|
+
none: false
|
33
|
+
requirement: *2074
|
34
|
+
prerelease: false
|
35
|
+
type: :runtime
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: choice
|
38
|
+
version_requirements: &2090 !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ! '>='
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 0.1.0
|
43
|
+
none: false
|
44
|
+
requirement: *2090
|
45
|
+
prerelease: false
|
46
|
+
type: :runtime
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: childprocess
|
49
|
+
version_requirements: &2106 !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.2.6
|
54
|
+
none: false
|
55
|
+
requirement: *2106
|
56
|
+
prerelease: false
|
57
|
+
type: :runtime
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: rspec
|
60
|
+
version_requirements: &2122 !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ! '>='
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: 2.7.0
|
65
|
+
none: false
|
66
|
+
requirement: *2122
|
67
|
+
prerelease: false
|
68
|
+
type: :development
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec-core
|
71
|
+
version_requirements: &2140 !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ! '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 2.7.0
|
76
|
+
none: false
|
77
|
+
requirement: *2140
|
78
|
+
prerelease: false
|
79
|
+
type: :development
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: json_pure
|
82
|
+
version_requirements: &2156 !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: 1.6.0
|
87
|
+
none: false
|
88
|
+
requirement: *2156
|
89
|
+
prerelease: false
|
90
|
+
type: :development
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: nokogiri
|
93
|
+
version_requirements: &2172 !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ! '>='
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
none: false
|
99
|
+
requirement: *2172
|
100
|
+
prerelease: false
|
101
|
+
type: :development
|
103
102
|
description: Jetty-powered running shoes for JRuby/Rack.
|
104
103
|
email: don@madwombat.com
|
105
|
-
executables:
|
106
|
-
|
104
|
+
executables:
|
105
|
+
- mizuno
|
107
106
|
extensions: []
|
108
|
-
|
109
107
|
extra_rdoc_files: []
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
108
|
+
files:
|
109
|
+
- .gitignore
|
110
|
+
- README.markdown
|
111
|
+
- LICENSE
|
112
|
+
- Rakefile
|
113
|
+
- Gemfile
|
114
|
+
- mizuno.gemspec
|
115
|
+
- bin/mizuno
|
116
|
+
- lib/mizuno.rb
|
117
|
+
- lib/mizuno/choices.rb
|
118
|
+
- lib/mizuno/client.rb
|
119
|
+
- lib/mizuno/client_exchange.rb
|
120
|
+
- lib/mizuno/client_response.rb
|
121
|
+
- lib/mizuno/logger.rb
|
122
|
+
- lib/mizuno/rack_servlet.rb
|
123
|
+
- lib/mizuno/reloader.rb
|
124
|
+
- lib/mizuno/runner.rb
|
125
|
+
- lib/mizuno/server.rb
|
126
|
+
- lib/mizuno/version.rb
|
127
|
+
- lib/mizuno/rack/chunked.rb
|
128
|
+
- lib/rack/handler/mizuno.rb
|
129
|
+
- lib/java/jetty-client-8.1.3.v20120416.jar
|
130
|
+
- lib/java/jetty-continuation-8.1.3.v20120416.jar
|
131
|
+
- lib/java/jetty-http-8.1.3.v20120416.jar
|
132
|
+
- lib/java/jetty-io-8.1.3.v20120416.jar
|
133
|
+
- lib/java/jetty-jmx-8.1.3.v20120416.jar
|
134
|
+
- lib/java/jetty-security-8.1.3.v20120416.jar
|
135
|
+
- lib/java/jetty-server-8.1.3.v20120416.jar
|
136
|
+
- lib/java/jetty-servlet-8.1.3.v20120416.jar
|
137
|
+
- lib/java/jetty-servlets-8.1.3.v20120416.jar
|
138
|
+
- lib/java/jetty-util-8.1.3.v20120416.jar
|
139
|
+
- lib/java/log4j-1.2.16.jar
|
140
|
+
- lib/java/rewindable-input-stream.jar
|
141
|
+
- lib/java/servlet-api-3.0.jar
|
142
|
+
- lib/java/slf4j-api-1.6.4.jar
|
143
|
+
- lib/java/slf4j-log4j12-1.6.4.jar
|
143
144
|
homepage: http://github.com/matadon/mizuno
|
144
145
|
licenses: []
|
145
|
-
|
146
|
-
post_install_message:
|
146
|
+
post_install_message:
|
147
147
|
rdoc_options: []
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
148
|
+
require_paths:
|
149
|
+
- lib
|
150
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
151
|
+
requirements:
|
152
|
+
- - ! '>='
|
153
|
+
- !ruby/object:Gem::Version
|
154
|
+
version: '0'
|
152
155
|
none: false
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
156
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - ! '>='
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '1.2'
|
158
161
|
none: false
|
159
|
-
requirements:
|
160
|
-
- - ">="
|
161
|
-
- !ruby/object:Gem::Version
|
162
|
-
version: "1.2"
|
163
162
|
requirements: []
|
164
|
-
|
165
|
-
rubyforge_project:
|
163
|
+
rubyforge_project:
|
166
164
|
rubygems_version: 1.8.15
|
167
|
-
signing_key:
|
165
|
+
signing_key:
|
168
166
|
specification_version: 3
|
169
167
|
summary: Rack handler for Jetty 8 on JRuby. Features multithreading, event-driven I/O, and async support.
|
170
168
|
test_files: []
|
171
|
-
|
169
|
+
...
|
data/lib/mizuno/http_server.rb
DELETED
@@ -1,185 +0,0 @@
|
|
1
|
-
require 'mizuno/version'
|
2
|
-
require 'mizuno/java_logger'
|
3
|
-
require 'mizuno/reloader'
|
4
|
-
|
5
|
-
module Mizuno
|
6
|
-
class HttpServer
|
7
|
-
include_class 'java.util.Properties'
|
8
|
-
include_class 'java.io.ByteArrayInputStream'
|
9
|
-
include_class 'org.apache.log4j.PropertyConfigurator'
|
10
|
-
include_class 'org.eclipse.jetty.server.Server'
|
11
|
-
include_class 'org.eclipse.jetty.servlet.ServletContextHandler'
|
12
|
-
include_class 'org.eclipse.jetty.servlet.ServletHolder'
|
13
|
-
include_class 'org.eclipse.jetty.server.nio.SelectChannelConnector'
|
14
|
-
include_class 'org.eclipse.jetty.util.thread.QueuedThreadPool'
|
15
|
-
# include_class 'org.eclipse.jetty.servlet.DefaultServlet'
|
16
|
-
# include_class 'org.eclipse.jetty.server.handler.HandlerCollection'
|
17
|
-
# include_class 'org.eclipse.jetty.server.handler.RequestLogHandler'
|
18
|
-
# include_class 'org.eclipse.jetty.server.NCSARequestLog'
|
19
|
-
|
20
|
-
#
|
21
|
-
# Provide accessors so we can set a custom logger and a location
|
22
|
-
# for static assets.
|
23
|
-
#
|
24
|
-
class << self
|
25
|
-
attr_accessor :logger
|
26
|
-
end
|
27
|
-
|
28
|
-
#
|
29
|
-
# Start up an instance of Jetty, running a Rack application.
|
30
|
-
# Options can be any of the follwing, and are not
|
31
|
-
# case-sensitive:
|
32
|
-
#
|
33
|
-
# :host::
|
34
|
-
# String specifying the IP address to bind to; defaults
|
35
|
-
# to 0.0.0.0.
|
36
|
-
#
|
37
|
-
# :port::
|
38
|
-
# String or integer with the port to bind to; defaults
|
39
|
-
# to 9292.
|
40
|
-
#
|
41
|
-
# http://wiki.eclipse.org/Jetty/Tutorial/RequestLog
|
42
|
-
#
|
43
|
-
# FIXME: Add SSL suport.
|
44
|
-
#
|
45
|
-
def HttpServer.run(app, options = {})
|
46
|
-
# Symbolize and downcase keys.
|
47
|
-
@options = options = Hash[options.map { |k, v|
|
48
|
-
[ k.to_s.downcase.to_sym, v ] }]
|
49
|
-
options[:quiet] ||= true if options[:embedded]
|
50
|
-
|
51
|
-
# The Jetty server
|
52
|
-
configure_logging(options)
|
53
|
-
@server = Server.new
|
54
|
-
@server.setSendServerVersion(false)
|
55
|
-
|
56
|
-
# Thread pool
|
57
|
-
threads = options[:threads] || 50
|
58
|
-
thread_pool = QueuedThreadPool.new
|
59
|
-
thread_pool.min_threads = [ threads.to_i / 10, 5 ].max
|
60
|
-
thread_pool.max_threads = [ threads.to_i, 10 ].max
|
61
|
-
@server.set_thread_pool(thread_pool)
|
62
|
-
|
63
|
-
# Connector
|
64
|
-
connector = SelectChannelConnector.new
|
65
|
-
connector.setPort(options[:port].to_i)
|
66
|
-
connector.setHost(options[:host])
|
67
|
-
@server.addConnector(connector)
|
68
|
-
|
69
|
-
# Switch to a different user or group if we were asked to.
|
70
|
-
Runner.setgid(options) if options[:group]
|
71
|
-
Runner.setuid(options) if options[:user]
|
72
|
-
|
73
|
-
# Servlet handler.
|
74
|
-
app_handler = ServletContextHandler.new(nil, "/",
|
75
|
-
ServletContextHandler::NO_SESSIONS)
|
76
|
-
|
77
|
-
# Optionally wrap with Mizuno::Reloader.
|
78
|
-
threshold = (ENV['RACK_ENV'] == 'production' ? 10 : 1)
|
79
|
-
app = Mizuno::Reloader.new(app, threshold) \
|
80
|
-
if options[:reloadable]
|
81
|
-
|
82
|
-
# The servlet itself.
|
83
|
-
rack_servlet = RackServlet.new
|
84
|
-
rack_servlet.rackup(app)
|
85
|
-
holder = ServletHolder.new(rack_servlet)
|
86
|
-
app_handler.addServlet(holder, "/")
|
87
|
-
|
88
|
-
# # Our request log.
|
89
|
-
# request_log = NCSARequestLog.new
|
90
|
-
# request_log.setLogTimeZone("GMT")
|
91
|
-
# request_log_handler = RequestLogHandler.new
|
92
|
-
# request_log_handler.setRequestLog(request_log)
|
93
|
-
#
|
94
|
-
# # Add handlers in order.
|
95
|
-
# handlers = HandlerCollection.new
|
96
|
-
# handlers.addHandler(request_log_handler)
|
97
|
-
# handlers.addHandler(app_handler)
|
98
|
-
|
99
|
-
# Add the context to the server and start.
|
100
|
-
@server.set_handler(app_handler)
|
101
|
-
@server.start
|
102
|
-
$stderr.printf("%s listening on %s:%s\n", version,
|
103
|
-
connector.host, connector.port) unless options[:quiet]
|
104
|
-
|
105
|
-
# If we're embeded, we're done.
|
106
|
-
return if options[:embedded]
|
107
|
-
|
108
|
-
# Stop the server when we get The Signal.
|
109
|
-
trap("SIGINT") { @server.stop and exit }
|
110
|
-
|
111
|
-
# Join with the server thread, so that currently open file
|
112
|
-
# descriptors don't get closed by accident.
|
113
|
-
# http://www.ruby-forum.com/topic/209252
|
114
|
-
@server.join
|
115
|
-
end
|
116
|
-
|
117
|
-
#
|
118
|
-
# Shuts down an embedded Jetty instance.
|
119
|
-
#
|
120
|
-
def HttpServer.stop
|
121
|
-
return unless @server
|
122
|
-
$stderr.print "Stopping Jetty..." unless @options[:quiet]
|
123
|
-
@server.stop
|
124
|
-
$stderr.puts "done." unless @options[:quiet]
|
125
|
-
end
|
126
|
-
|
127
|
-
#
|
128
|
-
# Returns the full version string.
|
129
|
-
#
|
130
|
-
def HttpServer.version
|
131
|
-
"Mizuno #{Mizuno::VERSION} (Jetty #{Server.getVersion})"
|
132
|
-
end
|
133
|
-
|
134
|
-
#
|
135
|
-
# Configure Log4J.
|
136
|
-
#
|
137
|
-
def HttpServer.configure_logging(options)
|
138
|
-
return if @logger
|
139
|
-
|
140
|
-
# Default logging threshold.
|
141
|
-
limit = options[:warn] ? "WARN" : "ERROR"
|
142
|
-
limit = "DEBUG" if ($DEBUG or options[:debug])
|
143
|
-
|
144
|
-
# Base logging configuration.
|
145
|
-
config = <<-END
|
146
|
-
log4j.rootCategory = #{limit}, default
|
147
|
-
log4j.logger.org.eclipse.jetty.util.log = #{limit}, default
|
148
|
-
log4j.logger.ruby = INFO, ruby
|
149
|
-
log4j.appender.default.Threshold = #{limit}
|
150
|
-
log4j.appender.default.layout = org.apache.log4j.PatternLayout
|
151
|
-
log4j.appender.default.layout.ConversionPattern = %d %p %m
|
152
|
-
log4j.appender.ruby.Threshold = INFO
|
153
|
-
log4j.appender.ruby.layout = org.apache.log4j.PatternLayout
|
154
|
-
log4j.appender.ruby.layout.ConversionPattern = %m
|
155
|
-
END
|
156
|
-
|
157
|
-
# Should we log to the console?
|
158
|
-
config.concat(<<-END) unless options[:log]
|
159
|
-
log4j.appender.default = org.apache.log4j.ConsoleAppender
|
160
|
-
log4j.appender.ruby = org.apache.log4j.ConsoleAppender
|
161
|
-
END
|
162
|
-
|
163
|
-
# Are we logging to a file?
|
164
|
-
config.concat(<<-END) if options[:log]
|
165
|
-
log4j.appender.default = org.apache.log4j.FileAppender
|
166
|
-
log4j.appender.default.File = #{options[:log]}
|
167
|
-
log4j.appender.default.Append = true
|
168
|
-
log4j.appender.ruby = org.apache.log4j.FileAppender
|
169
|
-
log4j.appender.ruby.File = #{options[:log]}
|
170
|
-
log4j.appender.ruby.Append = true
|
171
|
-
END
|
172
|
-
|
173
|
-
# Set up Log4J via Properties.
|
174
|
-
properties = Properties.new
|
175
|
-
properties.load(ByteArrayInputStream.new(config.to_java_bytes))
|
176
|
-
PropertyConfigurator.configure(properties)
|
177
|
-
|
178
|
-
# Use log4j for our logging as well.
|
179
|
-
@logger = JavaLogger.new
|
180
|
-
end
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
# Ensure that we shutdown the server on exit.
|
185
|
-
at_exit { Mizuno::HttpServer.stop }
|
data/lib/mizuno/java_logger.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
require 'logger'
|
2
|
-
|
3
|
-
module Mizuno
|
4
|
-
class JavaLogger < Logger
|
5
|
-
LEVELS = {
|
6
|
-
Logger::DEBUG => Java.org.apache.log4j.Level::DEBUG,
|
7
|
-
Logger::INFO => Java.org.apache.log4j.Level::INFO,
|
8
|
-
Logger::WARN => Java.org.apache.log4j.Level::WARN,
|
9
|
-
Logger::ERROR => Java.org.apache.log4j.Level::ERROR,
|
10
|
-
Logger::FATAL => Java.org.apache.log4j.Level::FATAL }
|
11
|
-
|
12
|
-
def initialize
|
13
|
-
@log4j = Java.org.apache.log4j.Logger.getLogger('ruby')
|
14
|
-
end
|
15
|
-
|
16
|
-
def add(severity, message = nil, progname = nil)
|
17
|
-
content = (message or (block_given? and yield) or progname)
|
18
|
-
@log4j.log(LEVELS[severity], content)
|
19
|
-
end
|
20
|
-
|
21
|
-
def puts(message)
|
22
|
-
write(message.to_s)
|
23
|
-
end
|
24
|
-
|
25
|
-
def write(message)
|
26
|
-
add(INFO, message)
|
27
|
-
end
|
28
|
-
|
29
|
-
def flush
|
30
|
-
# No-op.
|
31
|
-
end
|
32
|
-
|
33
|
-
def close
|
34
|
-
# No-op.
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|