jetty-rails 0.5 → 0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +9 -0
- data/Manifest.txt +14 -2
- data/README.txt +76 -4
- data/TODO.txt +13 -0
- data/bin/jetty_merb +12 -58
- data/bin/jetty_rails +12 -58
- data/config/requirements.rb +1 -1
- data/lib/jetty_rails.rb +5 -0
- data/lib/jetty_rails/adapters/abstract_adapter.rb +25 -0
- data/lib/jetty_rails/adapters/merb_adapter.rb +3 -10
- data/lib/jetty_rails/adapters/rails_adapter.rb +5 -11
- data/lib/jetty_rails/config/command_line_reader.rb +68 -0
- data/lib/jetty_rails/config/rdoc_fix.rb +28 -0
- data/lib/jetty_rails/handler/public_directory_handler.rb +24 -0
- data/lib/jetty_rails/handler/web_app_handler.rb +66 -0
- data/lib/jetty_rails/jars.rb +4 -1
- data/lib/jetty_rails/runner.rb +26 -79
- data/lib/jetty_rails/server.rb +75 -0
- data/lib/jetty_rails/version.rb +1 -1
- data/lib/jetty_rails/warbler_reader.rb +13 -0
- data/lib/{jruby-rack-0.9.jar → jruby-rack-0.9.2.jar} +0 -0
- data/script/console +0 -0
- data/script/destroy +0 -0
- data/script/generate +0 -0
- data/script/txt2html +0 -0
- data/spec/config.yml +28 -0
- data/spec/jetty_merb_spec.rb +53 -0
- data/spec/jetty_rails/config_file_spec.rb +68 -0
- data/spec/jetty_rails/runner_spec.rb +62 -52
- data/spec/jetty_rails_sample_1.yml +13 -0
- data/spec/jetty_rails_sample_2.yml +28 -0
- data/spec/jetty_rails_spec.rb +53 -0
- data/spec/spec.opts +2 -1
- data/spec/spec_helper.rb +1 -0
- data/tasks/rspec.rake +0 -6
- metadata +81 -60
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'getoptlong'
|
2
|
+
require 'jetty_rails/config/rdoc_fix'
|
3
|
+
|
4
|
+
|
5
|
+
class CommandLineReader
|
6
|
+
|
7
|
+
def default_config()
|
8
|
+
@@config ||= {
|
9
|
+
:rails => {
|
10
|
+
:base => Dir.pwd,
|
11
|
+
:port => 3000,
|
12
|
+
:config_file => "#{File.join(Dir.pwd, 'config', 'jetty_rails.yml')}",
|
13
|
+
:adapter => :rails
|
14
|
+
},
|
15
|
+
:merb => {
|
16
|
+
:base => Dir.pwd,
|
17
|
+
:port => 4000,
|
18
|
+
:config_file => "#{File.join(Dir.pwd, 'jetty_merb.yml')}",
|
19
|
+
:adapter => :merb
|
20
|
+
}
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
def read(default_adapter = :rails)
|
25
|
+
config = default_config[default_adapter]
|
26
|
+
|
27
|
+
opts = GetoptLong.new(
|
28
|
+
[ '--version', '-v', GetoptLong::NO_ARGUMENT ],
|
29
|
+
[ '--help', '-h', GetoptLong::NO_ARGUMENT ],
|
30
|
+
[ '--context-path', '-u', GetoptLong::REQUIRED_ARGUMENT ],
|
31
|
+
[ '--port', '-p', GetoptLong::REQUIRED_ARGUMENT ],
|
32
|
+
[ '--environment', '-e', GetoptLong::REQUIRED_ARGUMENT ],
|
33
|
+
[ '--lib', '--jars', GetoptLong::REQUIRED_ARGUMENT ],
|
34
|
+
[ '--classes', GetoptLong::REQUIRED_ARGUMENT ],
|
35
|
+
[ '--config', '-c', GetoptLong::OPTIONAL_ARGUMENT ]
|
36
|
+
)
|
37
|
+
|
38
|
+
opts.each do |opt, arg|
|
39
|
+
case opt
|
40
|
+
when '--version'
|
41
|
+
require 'jetty_rails/version'
|
42
|
+
puts "JettyRails version #{JettyRails::VERSION::STRING} - http://jetty-rails.rubyforge.org"
|
43
|
+
exit(0)
|
44
|
+
when '--help'
|
45
|
+
RDoc::usage
|
46
|
+
when '--context-path'
|
47
|
+
config[:context_path] = arg
|
48
|
+
when '--port'
|
49
|
+
config[:port] = arg.to_i
|
50
|
+
when '--environment'
|
51
|
+
config[:environment] = arg
|
52
|
+
when '--classes'
|
53
|
+
config[:classes_dir] = arg
|
54
|
+
when '--lib'
|
55
|
+
config[:lib_dir] = arg
|
56
|
+
when '--config'
|
57
|
+
config[:config_file] = arg if !arg.nil? && arg != ""
|
58
|
+
config.merge!(YAML.load_file(config[:config_file]))
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
config[:base] = ARGV.shift unless ARGV.empty?
|
63
|
+
config
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'rdoc/usage'
|
2
|
+
|
3
|
+
# fix to work with rubygems (use current file instead of main)
|
4
|
+
def RDoc.usage_no_exit(*args)
|
5
|
+
comment = File.open(File.join(File.dirname(__FILE__), %w(.. .. .. bin), File.basename($0))) do |file|
|
6
|
+
find_comment(file)
|
7
|
+
end
|
8
|
+
|
9
|
+
comment = comment.gsub(/^\s*#/, '')
|
10
|
+
|
11
|
+
markup = SM::SimpleMarkup.new
|
12
|
+
flow_convertor = SM::ToFlow.new
|
13
|
+
|
14
|
+
flow = markup.convert(comment, flow_convertor)
|
15
|
+
|
16
|
+
format = "plain"
|
17
|
+
|
18
|
+
unless args.empty?
|
19
|
+
flow = extract_sections(flow, args)
|
20
|
+
end
|
21
|
+
|
22
|
+
options = RI::Options.instance
|
23
|
+
if args = ENV["RI"]
|
24
|
+
options.parse(args.split)
|
25
|
+
end
|
26
|
+
formatter = options.formatter.new(options, "")
|
27
|
+
formatter.display_flow(flow)
|
28
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
module JettyRails
|
3
|
+
module Handler
|
4
|
+
class PublicDirectoryHandler < JettyRails::Handler::DelegateOnErrorsHandler
|
5
|
+
|
6
|
+
def initialize(config)
|
7
|
+
super()
|
8
|
+
@config = config
|
9
|
+
@resources = Jetty::Handler::ResourceHandler.new
|
10
|
+
@resources.resource_base = @config[:base] + '/public'
|
11
|
+
context_capable = add_context_capability_to @resources
|
12
|
+
self.handler = context_capable
|
13
|
+
end
|
14
|
+
|
15
|
+
def add_context_capability_to(handler)
|
16
|
+
return handler if @config[:context_path].root?
|
17
|
+
context_handler = Jetty::Handler::ContextHandler.new(@config[:context_path])
|
18
|
+
context_handler.handler = handler
|
19
|
+
context_handler
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module JettyRails
|
2
|
+
module Handler
|
3
|
+
class WebAppHandler < Jetty::Handler::WebAppContext
|
4
|
+
attr_reader :config, :adapter
|
5
|
+
|
6
|
+
def initialize(config)
|
7
|
+
super("/", config[:context_path])
|
8
|
+
@config = config
|
9
|
+
|
10
|
+
# create an isolated classloader per application context
|
11
|
+
self.class_loader = org.jruby.util.JRubyClassLoader.new(JRuby.runtime.jruby_class_loader)
|
12
|
+
self.resource_base = config[:base]
|
13
|
+
|
14
|
+
add_classes_dir_to_classpath(config)
|
15
|
+
add_lib_dir_jars_to_classpath(config)
|
16
|
+
|
17
|
+
@adapter = adapter_for(config[:adapter])
|
18
|
+
self.init_params = @adapter.init_params
|
19
|
+
|
20
|
+
@adapter.event_listeners.each do |listener|
|
21
|
+
add_event_listener(listener)
|
22
|
+
end
|
23
|
+
|
24
|
+
add_filter(rack_filter, "/*", Jetty::Context::DEFAULT)
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.add_adapter(adapter_key, adapter)
|
28
|
+
adapters[adapter_key] = adapter
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.adapters
|
32
|
+
@adapters ||= {
|
33
|
+
:rails => JettyRails::Adapters::RailsAdapter,
|
34
|
+
:merb => JettyRails::Adapters::MerbAdapter
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
def adapters
|
39
|
+
self.class.adapters
|
40
|
+
end
|
41
|
+
|
42
|
+
protected
|
43
|
+
def rack_filter
|
44
|
+
Jetty::FilterHolder.new(Rack::RackFilter.new)
|
45
|
+
end
|
46
|
+
|
47
|
+
def adapter_for(kind)
|
48
|
+
adapters[kind.to_sym].new(@config)
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
def add_lib_dir_jars_to_classpath(config)
|
53
|
+
lib_dir = "#{config[:base]}/#{config[:lib_dir]}"
|
54
|
+
Dir[lib_dir].each do |jar|
|
55
|
+
url = java.io.File.new(jar).to_url
|
56
|
+
self.class_loader.add_url(url)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
def add_classes_dir_to_classpath(config)
|
60
|
+
classes_dir = "#{config[:base]}/#{config[:classes_dir]}"
|
61
|
+
url = java.io.File.new(classes_dir).to_url
|
62
|
+
self.class_loader.add_url(url)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/jetty_rails/jars.rb
CHANGED
@@ -12,9 +12,12 @@ module JettyRails
|
|
12
12
|
include_package "org.mortbay.jetty.handler"
|
13
13
|
include_package "org.mortbay.jetty.webapp"
|
14
14
|
end
|
15
|
+
module Thread
|
16
|
+
include_package "org.mortbay.thread"
|
17
|
+
end
|
15
18
|
end
|
16
19
|
|
17
|
-
require "jruby-rack-0.9"
|
20
|
+
require "jruby-rack-0.9.2"
|
18
21
|
module Rack
|
19
22
|
include_package "org.jruby.rack"
|
20
23
|
include_package "org.jruby.rack.rails"
|
data/lib/jetty_rails/runner.rb
CHANGED
@@ -3,97 +3,44 @@ require "jruby"
|
|
3
3
|
module JettyRails
|
4
4
|
|
5
5
|
class Runner
|
6
|
-
attr_reader :
|
7
|
-
attr_reader :server
|
8
|
-
attr_reader :app_context
|
9
|
-
|
10
|
-
@@defaults = {
|
11
|
-
:adapter => :rails,
|
12
|
-
:environment => 'development',
|
13
|
-
:context_path => '/',
|
14
|
-
:lib_dir => 'lib/**/*.jar',
|
15
|
-
:port => 8080
|
16
|
-
}
|
17
|
-
|
18
|
-
@@adapters = {
|
19
|
-
:rails => JettyRails::Adapters::RailsAdapter,
|
20
|
-
:merb => JettyRails::Adapters::MerbAdapter
|
21
|
-
}
|
6
|
+
attr_reader :servers
|
22
7
|
|
23
8
|
def initialize(config = {})
|
24
|
-
@
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
add_public_dir_to server
|
36
|
-
install_rack_on server
|
37
|
-
end
|
38
|
-
|
39
|
-
def start
|
40
|
-
@server.start
|
41
|
-
@server.join
|
42
|
-
end
|
43
|
-
|
44
|
-
private
|
45
|
-
def add_stuff_to_classpath
|
46
|
-
lib_dir = "#{config[:base]}/#{config[:lib_dir]}"
|
47
|
-
Dir[lib_dir].each do |jar|
|
48
|
-
require jar
|
9
|
+
@servers = {}
|
10
|
+
config.symbolize_keys!
|
11
|
+
if config[:servers].nil?
|
12
|
+
add_server(config)
|
13
|
+
else
|
14
|
+
config[:servers].each do |server_config|
|
15
|
+
server_config.symbolize_keys!
|
16
|
+
server_config.reverse_merge!(config)
|
17
|
+
server_config.delete(:servers)
|
18
|
+
add_server(server_config)
|
19
|
+
end
|
49
20
|
end
|
50
21
|
end
|
51
22
|
|
52
|
-
def
|
53
|
-
|
54
|
-
@
|
55
|
-
context_capable = add_context_capability_to @resources
|
56
|
-
delegate_on_error = JettyRails::Handler::DelegateOnErrorsHandler.new
|
57
|
-
delegate_on_error.handler = context_capable
|
58
|
-
server.add_handler(delegate_on_error)
|
23
|
+
def add_server(config = {})
|
24
|
+
server = JettyRails::Server.new(config)
|
25
|
+
@servers[server.config[:port]] = server
|
59
26
|
end
|
60
27
|
|
61
|
-
def
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
def install_rack_on(server)
|
69
|
-
@app_context = Jetty::Handler::WebAppContext.new("/", config[:context_path])
|
70
|
-
@app_context.class_loader = JRuby.runtime.jruby_class_loader
|
71
|
-
@app_context.resource_base = config[:base]
|
72
|
-
|
73
|
-
adapter = adapter_for config[:adapter]
|
74
|
-
@app_context.init_params = adapter.init_params
|
75
|
-
adapter.event_listeners.each do |listener|
|
76
|
-
@app_context.add_event_listener(listener)
|
28
|
+
def start
|
29
|
+
server_threads = ThreadGroup.new
|
30
|
+
@servers.each do |base, server|
|
31
|
+
log("starting #{base}")
|
32
|
+
server_threads.add(Thread.new do
|
33
|
+
server.start
|
34
|
+
end)
|
77
35
|
end
|
78
36
|
|
79
|
-
|
80
|
-
server.add_handler(@app_context)
|
81
|
-
end
|
82
|
-
|
83
|
-
def rack_filter
|
84
|
-
Jetty::FilterHolder.new(Rack::RackFilter.new)
|
37
|
+
server_threads.list.each {|thread| thread.join } unless server_threads.list.empty?
|
85
38
|
end
|
86
39
|
|
87
|
-
|
88
|
-
@@adapters[kind.to_sym].new(config)
|
89
|
-
end
|
40
|
+
private
|
90
41
|
|
91
|
-
|
92
|
-
|
93
|
-
module ContextPath
|
94
|
-
def root?
|
95
|
-
self == '/'
|
42
|
+
def log(msg)
|
43
|
+
$stdout.puts(msg)
|
96
44
|
end
|
97
45
|
end
|
98
|
-
|
99
46
|
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module JettyRails
|
2
|
+
class Server
|
3
|
+
attr_reader :config
|
4
|
+
attr_reader :app_contexts
|
5
|
+
attr_reader :server
|
6
|
+
|
7
|
+
@@defaults = {
|
8
|
+
:adapter => :rails,
|
9
|
+
:environment => 'development',
|
10
|
+
:context_path => '/',
|
11
|
+
:lib_dir => 'lib/**/*.jar',
|
12
|
+
:classes_dir => 'classes',
|
13
|
+
:port => 8080,
|
14
|
+
:jruby_min_runtimes => 1,
|
15
|
+
:jruby_max_runtimes => 5,
|
16
|
+
:thread_pool_max => 20,
|
17
|
+
:thread_pool_min => 1,
|
18
|
+
:acceptor_size => 5
|
19
|
+
}
|
20
|
+
|
21
|
+
def initialize(config = {})
|
22
|
+
@config = config.symbolize_keys!.reverse_merge!(@@defaults)
|
23
|
+
|
24
|
+
@server = Jetty::Server.new
|
25
|
+
# setup the thread pool for the server
|
26
|
+
thread_pool = Jetty::Thread::QueuedThreadPool.new
|
27
|
+
thread_pool.set_max_threads(config[:thread_pool_max])
|
28
|
+
thread_pool.set_min_threads(config[:thread_pool_min])
|
29
|
+
@server.set_thread_pool(thread_pool)
|
30
|
+
|
31
|
+
connector = Jetty::SelectChannelConnector.new
|
32
|
+
connector.set_acceptors(config[:acceptor_size])
|
33
|
+
connector.port = config[:port]
|
34
|
+
@server.add_connector(connector)
|
35
|
+
|
36
|
+
if config[:apps].nil?
|
37
|
+
add_app(config)
|
38
|
+
else
|
39
|
+
config[:apps].each do |app_config|
|
40
|
+
app_config.reverse_merge!(config)
|
41
|
+
app_config.delete(:apps)
|
42
|
+
add_app(app_config)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def add_app(config)
|
48
|
+
raise 'Base dir to be run must be provided' unless config[:base]
|
49
|
+
config[:context_path].extend ContextPath
|
50
|
+
|
51
|
+
@server.add_handler(JettyRails::Handler::PublicDirectoryHandler.new(config))
|
52
|
+
web_app_handler = JettyRails::Handler::WebAppHandler.new(config)
|
53
|
+
(@app_contexts ||= []) << web_app_handler
|
54
|
+
@server.add_handler(web_app_handler)
|
55
|
+
end
|
56
|
+
|
57
|
+
def start
|
58
|
+
@server.start
|
59
|
+
@server.join
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
private
|
64
|
+
def read_warble_config
|
65
|
+
require 'warbler'
|
66
|
+
WarblerReader.new(config)
|
67
|
+
end
|
68
|
+
|
69
|
+
module ContextPath
|
70
|
+
def root?
|
71
|
+
self == '/'
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
data/lib/jetty_rails/version.rb
CHANGED
@@ -0,0 +1,13 @@
|
|
1
|
+
class WarblerReader
|
2
|
+
|
3
|
+
def initialize(config)
|
4
|
+
# TODO ignore jruby and jruby-rack
|
5
|
+
warbler_config = load("#{config[:base]}/config/warble.rb")
|
6
|
+
warbler_config.java_libs.each do |jar|
|
7
|
+
require jar
|
8
|
+
end
|
9
|
+
# TODO require custom classes
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
end
|
Binary file
|
data/script/console
CHANGED
File without changes
|
data/script/destroy
CHANGED
File without changes
|
data/script/generate
CHANGED
File without changes
|
data/script/txt2html
CHANGED
File without changes
|
data/spec/config.yml
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
---
|
2
|
+
:servers:
|
3
|
+
- :context_path: /testA
|
4
|
+
:base: /
|
5
|
+
:adapter: :rails
|
6
|
+
:environment: development
|
7
|
+
:port: 3000
|
8
|
+
:lib_dir: lib/**/*.jar
|
9
|
+
:jruby_min_runtimes: 2
|
10
|
+
- :context_path: /testB
|
11
|
+
:base: /testing
|
12
|
+
:adapter: :merb
|
13
|
+
:port: 4000
|
14
|
+
- :port: 8080
|
15
|
+
:apps:
|
16
|
+
- :context_path: /testC
|
17
|
+
:base: /testing
|
18
|
+
:adapter: :merb
|
19
|
+
:environment: test
|
20
|
+
- :context_path: /testD
|
21
|
+
:base: /something
|
22
|
+
:adapter: :rails
|
23
|
+
:environment: production
|
24
|
+
:jruby_min_runtimes: 1
|
25
|
+
:jruby_max_runtimes: 2
|
26
|
+
:thread_pool_max: 40
|
27
|
+
:thread_pool_min: 1
|
28
|
+
:acceptor_size: 20
|