Skip to content

Instantly share code, notes, and snippets.

@hakunin
Created September 19, 2009 12:27
Show Gist options
  • Save hakunin/189475 to your computer and use it in GitHub Desktop.
Save hakunin/189475 to your computer and use it in GitHub Desktop.
require 'java'
require 'rubygems'
rb_root = File.dirname(__FILE__)
app_root = File.dirname(__FILE__)+'/../'
$app_root = app_root
$rb_root = rb_root
# get the jars
Dir[app_root+"./Java/jetty/*.jar"].each { |jar| require jar }
Dir[app_root+"./Java/jsdk/*.jar"].each { |jar| require jar }
Dir[app_root+"./Java/atmosphere/*.jar"].each { |jar| require jar }
Dir[app_root+"./*.jar"].each { |jar| require jar }
require 'rack'
require 'jruby/rack'
require 'json'
#include them, so the namespaces doesn't clog the code
include_class 'org.atmosphere.cpr.AtmosphereHandler'
include_class 'org.atmosphere.cpr.AtmosphereServlet'
include_class 'javax.servlet.http.HttpServlet'
include_class 'org.mortbay.jetty.Server'
include_class 'org.mortbay.jetty.servlet.Context'
include_class 'org.mortbay.jetty.servlet.ServletHolder'
include_class 'org.mortbay.jetty.servlet.DefaultServlet'
include_class 'org.mortbay.jetty.handler.ContextHandlerCollection'
include_class 'org.mortbay.jetty.handler.DefaultHandler'
include_class 'org.mortbay.jetty.handler.ResourceHandler'
include_class 'org.mortbay.jetty.handler.HandlerList'
include_class 'org.mortbay.jetty.Handler'
include_class 'org.jruby.rack.RackServletContextListener'
include_class 'org.jruby.rack.servlet.ServletRackContext'
#setup and start the server
require rb_root+"/echo.rb"
require rb_root+"/../pocket_ruby/pocket_ruby/fw/pocket_ruby.rb"
# All the fun begins here
server = Server.new(80)
# serve static files under '/public'
context_static = Context.new(server, '/public', 0)
resource_handler = ResourceHandler.new
context_static.setHandler(resource_handler)
resource_handler.setResourceBase(app_root+"/public");
context_static.setResourceBase('./')
context_static.setContextPath('/public')
# atmosphere handlers under '/atmosphere'
Context.new(server, "/atmosphere", Context::SESSIONS).
addServlet(
ServletHolder.new(
servlet = AtmosphereServlet.new()
),
'/')
servlet.addAtmosphereHandler(
"/echo", $echo_servlet = EchoServlet.new()
)
#this fixes output from rack middleware and such
class JRuby::Rack::ServletLog
def write(msg)
Kernel.puts msg
end
end
# our rack app gets initialized here
class MyFactory < org.jruby.rack.DefaultRackApplicationFactory
def createRackServletWrapper(runtime, rackup)
# lets create our own app in this runtime insted :)
require 'rack/handler/servlet.rb'
Rack::Handler::Servlet.new(Rack::Builder.new {(
use Rack::CommonLogger
use Rack::ShowExceptions
use Rack::Session::Cookie, {
:key => 'rack.session',
:expire_after => 2592000,
:secret => 'antiperspirant pro zeny'
}
use Rack::Static, :urls => ['/public'], :root => $app_root
runner = PocketRuby::Runner.new($rb_root)
runner.on_app_instantiate = lambda { |app|
app.atmosphere = $echo_servlet
}
run runner
)}.to_app)
end
end
# mount rack factory
c = Context.new(server, "/", Context::SESSIONS)
c.add_filter("org.jruby.rack.RackFilter", "/*", Handler::DEFAULT)
c.set_resource_base(File.dirname(__FILE__))
c.add_event_listener(RackServletContextListener.new(MyFactory.new))
c.set_init_params(java.util.HashMap.new(
'public.root' => app_root+'/public',
'org.mortbay.jetty.servlet.Default.relativeResourceBase' => '/public',
'rackup' => 'raise "HAHA! no rackup needed."',
'jruby.max.runtimes' => '1'))
c.add_servlet(ServletHolder.new(DefaultServlet.new), "/*")
server.start()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment