nolman-jetty-rails 0.9.6-jruby

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. data/History.txt +49 -0
  2. data/Licenses.txt +37 -0
  3. data/Manifest.txt +51 -0
  4. data/PostInstall.txt +2 -0
  5. data/README.rdoc +130 -0
  6. data/Rakefile +27 -0
  7. data/TODO.txt +11 -0
  8. data/bin/jetty_merb +41 -0
  9. data/bin/jetty_rails +41 -0
  10. data/jetty-libs/core-3.1.1.jar +0 -0
  11. data/jetty-libs/jetty-6.1.14.jar +0 -0
  12. data/jetty-libs/jetty-plus-6.1.14.jar +0 -0
  13. data/jetty-libs/jetty-util-6.1.14.jar +0 -0
  14. data/jetty-libs/jsp-2.1.jar +0 -0
  15. data/jetty-libs/jsp-api-2.1.jar +0 -0
  16. data/jetty-libs/servlet-api-2.5-6.1.14.jar +0 -0
  17. data/lib/jetty_rails.rb +26 -0
  18. data/lib/jetty_rails/adapters/abstract_adapter.rb +25 -0
  19. data/lib/jetty_rails/adapters/merb_adapter.rb +34 -0
  20. data/lib/jetty_rails/adapters/rails_adapter.rb +22 -0
  21. data/lib/jetty_rails/adapters/rails_jms_adapter.rb +104 -0
  22. data/lib/jetty_rails/config/command_line_reader.rb +75 -0
  23. data/lib/jetty_rails/config/rdoc_fix.rb +28 -0
  24. data/lib/jetty_rails/handler/delegate_on_errors_handler.rb +29 -0
  25. data/lib/jetty_rails/handler/public_directory_handler.rb +24 -0
  26. data/lib/jetty_rails/handler/web_app_handler.rb +85 -0
  27. data/lib/jetty_rails/jars.rb +36 -0
  28. data/lib/jetty_rails/runner.rb +46 -0
  29. data/lib/jetty_rails/server.rb +79 -0
  30. data/lib/jetty_rails/warbler_reader.rb +13 -0
  31. data/lib/jruby-rack-0.9.7-SNAPSHOT.jar +0 -0
  32. data/script/console +10 -0
  33. data/script/destroy +14 -0
  34. data/script/generate +14 -0
  35. data/script/txt2html +71 -0
  36. data/spec/config.yml +28 -0
  37. data/spec/jetty_merb_spec.rb +195 -0
  38. data/spec/jetty_rails/config_file_spec.rb +68 -0
  39. data/spec/jetty_rails/handler/delegate_on_errors_handler_spec.rb +29 -0
  40. data/spec/jetty_rails/runner_spec.rb +162 -0
  41. data/spec/jetty_rails_sample_1.yml +13 -0
  42. data/spec/jetty_rails_sample_2.yml +28 -0
  43. data/spec/jetty_rails_spec.rb +195 -0
  44. data/spec/spec.opts +2 -0
  45. data/spec/spec_helper.rb +12 -0
  46. data/tasks/jruby.rake +7 -0
  47. data/tasks/rspec.rake +49 -0
  48. data/website/index.txt +194 -0
  49. data/website/javascripts/rounded_corners_lite.inc.js +285 -0
  50. data/website/stylesheets/screen.css +159 -0
  51. data/website/template.html.erb +56 -0
  52. metadata +174 -0
@@ -0,0 +1,34 @@
1
+ module JettyRails
2
+ module Adapters
3
+
4
+ class MerbAdapter < AbstractAdapter
5
+
6
+ def init_params
7
+ # please refer to goldspike and jruby-rack documentation
8
+ @merb_params ||= {
9
+ 'merb.root' => '/',
10
+ 'merb.environment' => config[:environment]
11
+ }.merge(base_init_params)
12
+ end
13
+
14
+ def event_listeners
15
+ [ Rack::MerbServletContextListener.new, SignalHandler.new ]
16
+ end
17
+
18
+ class SignalHandler
19
+ include Java::JavaxServlet::ServletContextListener
20
+
21
+ def contextInitialized(cfg)
22
+ trap("INT") do
23
+ puts "\nbye!"
24
+ java.lang.System.exit(0)
25
+ end
26
+ end
27
+
28
+ def contextDestroyed(cfg)
29
+ end
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,22 @@
1
+ module JettyRails
2
+ module Adapters
3
+
4
+ class RailsAdapter < AbstractAdapter
5
+
6
+ def init_params
7
+ # please refer to goldspike and jruby-rack documentation
8
+ # in: PoolingRackApplicationFactory
9
+ @rails_params ||= {
10
+ 'rails.root' => '/',
11
+ 'rails.env' => config[:environment]
12
+ }.merge(base_init_params)
13
+ end
14
+
15
+ def event_listeners
16
+ [ Rack::RailsServletContextListener.new ]
17
+ end
18
+
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,104 @@
1
+ module JettyRails
2
+ module Adapters
3
+
4
+ # This adapter extends the standard Rails adapter with
5
+ # an additional listener for JMS queues
6
+ class RailsJmsAdapter < RailsAdapter
7
+
8
+ # Defaults to expecting OpenMQ jars in lib_dir/jms_dir at startup
9
+ @@defaults = {
10
+ :jms_dir => "jms",
11
+ :queue_name => "rails_queue",
12
+ :mq_host => "localhost",
13
+ :mq_port => 7676
14
+ }
15
+
16
+ def initialize(config)
17
+ super @@defaults.merge(config)
18
+ require_jms_jars()
19
+ end
20
+
21
+ def event_listeners
22
+ super << Rack::JMS::QueueContextListener.new(queue_manager_factory())
23
+ end
24
+
25
+ def queue_manager_factory
26
+ factory = jndiless_default_queue_manager_factory_class()
27
+ factory.queue_name = config[:queue_name]
28
+ factory.mq_host = config[:mq_host]
29
+ factory.mq_port = config[:mq_port]
30
+ factory.new
31
+ end
32
+
33
+ protected
34
+
35
+ def jms_jars_path
36
+ File.join(config[:base], config[:lib_dir], config[:jms_dir])
37
+ end
38
+
39
+ def require_jms_jars
40
+ Dir["#{self.jms_jars_path}/*.jar"].each {|jar| require jar }
41
+ end
42
+
43
+ # JRuby Rack's DefaultQueueManager uses JNDI for discovery
44
+ # JNDI is overkill for embedded servers like Jetty Rails
45
+ #
46
+ # This method returns a custom Rack::JMS::QueueManagerFactory
47
+ # which produces a JNDI-less Rack::JMS::DefaultQueueManager
48
+ def jndiless_default_queue_manager_factory_class
49
+ factory_class = Class.new
50
+ factory_class.send :cattr_accessor, :queue_name, :mq_host, :mq_port
51
+
52
+ # Implement Rack::JMS::QueueManagerFactory Interface
53
+ factory_class.send :include, Rack::JMS::QueueManagerFactory
54
+ factory_class.module_eval(<<-EOS)
55
+
56
+ def newQueueManager
57
+ manager_class = Class.new Rack::JMS::DefaultQueueManager
58
+
59
+ manager_class.send :field_accessor, :context,
60
+ :connectionFactory
61
+
62
+ manager_class.send :attr_accessor, :queue_name, :mq_host, :mq_port
63
+
64
+ # Overrides JNDI parts of DefaultQueueManager
65
+ manager_class.module_eval do
66
+
67
+ # Overrides in order to initialize connection factory w/o JNDI
68
+ def init(context)
69
+ self.context = context
70
+ unless self.connectionFactory
71
+ import "com.sun.messaging.ConnectionFactory"
72
+ factory = com.sun.messaging.ConnectionFactory.new
73
+ config = com.sun.messaging.ConnectionConfiguration
74
+ factory.setProperty(config.imqAddressList, "mq://" + self.mq_host + ":" + self.mq_port.to_s)
75
+ self.connectionFactory = factory
76
+ end
77
+ end
78
+
79
+ # Overrides in order to perform lookup of queue w/o JNDI
80
+ def lookup(name)
81
+ if name == self.queue_name
82
+ @jndiless_queue ||= com.sun.messaging.Queue.new(self.queue_name)
83
+ else
84
+ super(name)
85
+ end
86
+ end
87
+
88
+ end
89
+
90
+ returning manager_class.new do |m|
91
+ m.queue_name = self.class.queue_name
92
+ m.mq_host = self.class.mq_host
93
+ m.mq_port = self.class.mq_port
94
+ end
95
+ end
96
+ EOS
97
+
98
+ factory_class
99
+ end
100
+
101
+ end
102
+
103
+ end
104
+ end
@@ -0,0 +1,75 @@
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
+ :environment => "development"
15
+ },
16
+ :merb => {
17
+ :base => Dir.pwd,
18
+ :port => 4000,
19
+ :config_file => "#{File.join(Dir.pwd, 'config', 'jetty_merb.yml')}",
20
+ :adapter => :merb
21
+ }
22
+ }
23
+ end
24
+
25
+ def read(default_adapter = :rails)
26
+ config = default_config[default_adapter]
27
+
28
+ opts = GetoptLong.new(
29
+ [ '--version', '-v', GetoptLong::NO_ARGUMENT ],
30
+ [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
31
+ [ '--context-path', '-u', GetoptLong::REQUIRED_ARGUMENT ],
32
+ [ '--port', '-p', GetoptLong::REQUIRED_ARGUMENT ],
33
+ [ '--environment', '-e', GetoptLong::REQUIRED_ARGUMENT ],
34
+ [ '--lib', '--jars', GetoptLong::REQUIRED_ARGUMENT ],
35
+ [ '--classes', GetoptLong::REQUIRED_ARGUMENT ],
36
+ [ '--config', '-c', GetoptLong::OPTIONAL_ARGUMENT ]
37
+ )
38
+
39
+ opts.each do |opt, arg|
40
+ case opt
41
+ when '--version'
42
+ require 'jetty_rails/version'
43
+ puts "JettyRails version #{JettyRails::VERSION::STRING} - http://jetty-rails.rubyforge.org"
44
+ exit(0)
45
+ when '--help'
46
+ RDoc::usage
47
+ when '--context-path'
48
+ config[:context_path] = arg
49
+ when '--port'
50
+ config[:port] = arg.to_i
51
+ when '--environment'
52
+ config[:environment] = arg
53
+ when '--classes'
54
+ config[:classes_dir] = arg
55
+ when '--lib'
56
+ config[:lib_dir] = arg
57
+ when '--config'
58
+ config[:config_file] = arg if !arg.nil? && arg != ""
59
+ end
60
+ end
61
+
62
+ config[:base] = ARGV.shift unless ARGV.empty?
63
+
64
+ if File.exists?(config[:config_file])
65
+ config_file = YAML.load_file(config[:config_file])
66
+ config.merge!(config_file[config[:environment]] || config_file) # check for env scope
67
+ puts "Loaded #{config[:config_file]}"
68
+ end
69
+
70
+ config
71
+ end
72
+
73
+ end
74
+
75
+
@@ -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,29 @@
1
+ module JettyRails
2
+ module Handler
3
+
4
+ class DelegateOnErrorsResponse
5
+ include Java::JavaxServletHttp::HttpServletResponse
6
+
7
+ def initialize(original, request)
8
+ @original = original
9
+ @request = request
10
+ end
11
+
12
+ def sendError(status_code)
13
+ @request.handled = false
14
+ end
15
+
16
+ def method_missing(method, *args, &blk)
17
+ @original.send(method, *args, &blk)
18
+ end
19
+ end
20
+
21
+ class DelegateOnErrorsHandler < Jetty::Handler::HandlerWrapper
22
+ def handle(target, request, response, dispatch)
23
+ decorated_response = DelegateOnErrorsResponse.new(response, request)
24
+ self.handler.handle(target, request, decorated_response, dispatch)
25
+ end
26
+ end
27
+
28
+ end
29
+ 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,85 @@
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
+ self.class_loader = each_context_has_its_own_classloader
11
+ self.resource_base = "#{config[:base]}/public"
12
+ self.descriptor = config[:web_xml]
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
+ unless File.exist?(self.descriptor)
21
+ @adapter.event_listeners.each do |listener|
22
+ add_event_listener(listener)
23
+ end
24
+
25
+ add_filter(rack_filter, "/*", Jetty::Context::DEFAULT)
26
+ end
27
+ end
28
+
29
+ def self.add_adapter(adapter_key, adapter)
30
+ adapters[adapter_key] = adapter
31
+ end
32
+
33
+ def self.adapters
34
+ @adapters ||= {
35
+ :rails => JettyRails::Adapters::RailsAdapter,
36
+ :rails_jms => JettyRails::Adapters::RailsJmsAdapter,
37
+ :merb => JettyRails::Adapters::MerbAdapter
38
+ }
39
+ end
40
+
41
+ def adapters
42
+ self.class.adapters
43
+ end
44
+
45
+ alias :get_from_public_otherwise :getResource
46
+
47
+ def getResource(resource)
48
+ return fix_for_base_url if resource == '/'
49
+ get_from_public_otherwise resource
50
+ end
51
+
52
+ protected
53
+ def rack_filter
54
+ Jetty::FilterHolder.new(Rack::RackFilter.new)
55
+ end
56
+
57
+ def adapter_for(kind)
58
+ adapters[kind.to_sym].new(@config)
59
+ end
60
+
61
+ private
62
+ def fix_for_base_url
63
+ Jetty::FileResource.new(java.io.File.new(config[:base]).to_url)
64
+ end
65
+
66
+ def add_lib_dir_jars_to_classpath(config)
67
+ lib_dir = "#{config[:base]}/#{config[:lib_dir]}/**/*.jar"
68
+ Dir[lib_dir].each do |jar|
69
+ url = java.io.File.new(jar).to_url
70
+ self.class_loader.add_url(url)
71
+ end
72
+ end
73
+
74
+ def add_classes_dir_to_classpath(config)
75
+ classes_dir = "#{config[:base]}/#{config[:classes_dir]}"
76
+ url = java.io.File.new(classes_dir).to_url
77
+ self.class_loader.add_url(url)
78
+ end
79
+
80
+ def each_context_has_its_own_classloader()
81
+ org.jruby.util.JRubyClassLoader.new(JRuby.runtime.jruby_class_loader)
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,36 @@
1
+ module JettyRails
2
+
3
+ require "servlet-api-2.5-6.1.14"
4
+ require "jetty-6.1.14"
5
+ require "jetty-util-6.1.14"
6
+ require "jetty-plus-6.1.14"
7
+ require "core-3.1.1"
8
+ require "jsp-api-2.1"
9
+ require "jsp-2.1"
10
+
11
+ module Jetty
12
+ include_package "org.mortbay.jetty"
13
+ include_package "org.mortbay.jetty.servlet"
14
+ include_package "org.mortbay.jetty.nio"
15
+ include_package "org.mortbay.resource"
16
+ module Handler
17
+ include_package "org.mortbay.jetty.handler"
18
+ include_package "org.mortbay.jetty.webapp"
19
+ end
20
+ module Thread
21
+ include_package "org.mortbay.thread"
22
+ end
23
+ end
24
+
25
+ require "jruby-rack-0.9.7-SNAPSHOT"
26
+ module Rack
27
+ include_package "org.jruby.rack"
28
+ include_package "org.jruby.rack.rails"
29
+ include_package "org.jruby.rack.merb"
30
+
31
+ module JMS
32
+ include_package "org.jruby.rack.jms"
33
+ end
34
+ end
35
+
36
+ end