jetty-rails 0.5 → 0.6
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/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
|