- Revision
- 140
- Author
- mward
- Date
- 2007-06-03 23:29:48 -0500 (Sun, 03 Jun 2007)
Log Message
ruby controllers now have access tp req params, and servlet context. items can automatically be resolved from params -> req_att -> session_attr -> servlet_context from a ruby controller
Modified Paths
- trunk/core/src/main/java/org/codehaus/waffle/bind/RubyDataBinder.java
- trunk/core/src/main/java/org/codehaus/waffle/view/DefaultViewDispatcher.java
- trunk/core/src/main/ruby/waffle.rb
- trunk/examples/jruby-example/resources/foobar.jspx
- trunk/examples/jruby-example/resources/index.html
- trunk/examples/jruby-example/src/main/ruby/ruby/foo_bar.rb
Diff
Modified: trunk/core/src/main/java/org/codehaus/waffle/bind/RubyDataBinder.java (139 => 140)
--- trunk/core/src/main/java/org/codehaus/waffle/bind/RubyDataBinder.java 2007-06-04 02:52:16 UTC (rev 139) +++ trunk/core/src/main/java/org/codehaus/waffle/bind/RubyDataBinder.java 2007-06-04 04:29:48 UTC (rev 140) @@ -3,30 +3,42 @@ import ognl.TypeConverter; import org.codehaus.waffle.controller.RubyController; import org.codehaus.waffle.validation.ErrorsContext; +import org.codehaus.waffle.action.ArgumentResolver; import org.jruby.Ruby; import org.jruby.javasupport.JavaEmbedUtils; import org.jruby.runtime.builtin.IRubyObject; import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; import javax.servlet.http.HttpServletResponse; public class RubyDataBinder extends OgnlDataBinder { + private final ArgumentResolver argumentResolver; - public RubyDataBinder(TypeConverter typeConverter, BindErrorMessageResolver bindErrorMessageResolver) { + public RubyDataBinder(TypeConverter typeConverter, + BindErrorMessageResolver bindErrorMessageResolver, + ArgumentResolver argumentResolver) { super(typeConverter, bindErrorMessageResolver); + this.argumentResolver = argumentResolver; } public void bind(HttpServletRequest request, HttpServletResponse response, ErrorsContext errorsContext, Object controller) { - if(controller instanceof RubyController) { - IRubyObject rubyObject = ((RubyController)controller).getRubyObject(); + if (controller instanceof RubyController) { + IRubyObject rubyObject = ((RubyController) controller).getRubyObject(); Ruby runtime = rubyObject.getRuntime(); - // inject following onto the controller - JavaEmbedUtils.invokeMethod(runtime, rubyObject, "response=", new HttpServletResponse[] {response}, Object.class); - JavaEmbedUtils.invokeMethod(runtime, rubyObject, "__set_request", new IRubyObject[] {JavaEmbedUtils.javaToRuby(runtime, request)}, Object.class); - JavaEmbedUtils.invokeMethod(runtime, rubyObject, "__set_session", new HttpSession[] {request.getSession(false)}, Object.class); + JavaEmbedUtils.invokeMethod(runtime, rubyObject, "__argument_resolver=", + new Object[]{JavaEmbedUtils.javaToRuby(runtime, argumentResolver)}, + Object.class); + JavaEmbedUtils.invokeMethod( + runtime, + rubyObject, + "__set_all_contexts", + new Object[]{ + JavaEmbedUtils.javaToRuby(runtime, request), + JavaEmbedUtils.javaToRuby(runtime, response) + }, + Object.class); } else { // default to standard binding super.bind(request, response, errorsContext, controller);
Modified: trunk/core/src/main/java/org/codehaus/waffle/view/DefaultViewDispatcher.java (139 => 140)
--- trunk/core/src/main/java/org/codehaus/waffle/view/DefaultViewDispatcher.java 2007-06-04 02:52:16 UTC (rev 139) +++ trunk/core/src/main/java/org/codehaus/waffle/view/DefaultViewDispatcher.java 2007-06-04 04:29:48 UTC (rev 140) @@ -38,11 +38,11 @@ String url = "" if (view instanceof RedirectView) { - Map model = ((RedirectView)view).getModel(); + Map model = ((RedirectView) view).getModel(); dispatchAssistant.redirect(request, response, model, url); } else if (view instanceof ResponderView) { - ((ResponderView)view).respond(request, response); - }else { + ((ResponderView) view).respond(request, response); + } else { dispatchAssistant.forward(request, response, url); } }
Modified: trunk/core/src/main/ruby/waffle.rb (139 => 140)
--- trunk/core/src/main/ruby/waffle.rb 2007-06-04 02:52:16 UTC (rev 139) +++ trunk/core/src/main/ruby/waffle.rb 2007-06-04 04:29:48 UTC (rev 140) @@ -1,5 +1,8 @@ -# This is still a work in progress +require 'java' +include_class 'org.codehaus.waffle.view.View' +include_class 'org.codehaus.waffle.view.RedirectView' + module Waffle # load/require files @@ -12,7 +15,7 @@ ScriptLoader.load_from_file_system else servlet_context.getResourcePaths(prefix).each do |path| # this would be for production!! - require path.gsub(Regexp.new("^#{prefix}"), 'ruby/') + require(path.gsub(Regexp.new("^#{prefix}"), 'ruby/')) end end end @@ -61,24 +64,31 @@ def method_missing(symbol, *args) @__context.send(symbol, *args) end + + def java_delegate + return @__context + end end module Controller - attr_accessor :response # todo the setters for this should be hidden? - attr_reader :request, :session + attr_reader :parameters, :request, :response, :session, :servlet_context - def __set_request(request) + def __set_all_contexts(request, response) @request = WebContext.new(request) + @parameters = @request.getParameterMap + @session = WebContext.new(@request.getSession(false)) + @servlet_context = WebContext.new(@session.getServletContext()); + @response = response end - def __set_session(session) - @session = WebContext.new(session) - end - def __pico_container=(pico) @@__pico_container = pico end + def __argument_resolver=(argument_resolver) + @@__argument_resolver = argument_resolver + end + def method_missing(symbol, *args) if symbol.to_s =~ /^find_/ # todo: I don't like "find_" for this ... sounds to model-ish key = symbol.to_s @@ -86,10 +96,22 @@ component = @@__pico_container.getComponentInstance(key) return component unless component.nil? + else + value = @@__argument_resolver.resolve(@request.java_delegate, "{#{symbol.to_s}}") + + return value unless value.nil? end super(symbol, *args) end + def render(name) + return View.new(name, self) + end + + def redirect_to(name, map = {}) + return RedirectView.new(name, self, map) + end + end end \ No newline at end of file
Modified: trunk/examples/jruby-example/resources/foobar.jspx (139 => 140)
--- trunk/examples/jruby-example/resources/foobar.jspx 2007-06-04 02:52:16 UTC (rev 139) +++ trunk/examples/jruby-example/resources/foobar.jspx 2007-06-04 04:29:48 UTC (rev 140) @@ -11,13 +11,11 @@ <jsp:directive.page contentType="text/html;charset=UTF-8"/> <head> - <title>From Ruby Script</title> + <title>From Ruby Script</title> </head> <body> <h2>Waffle and JRuby ${var1}</h2> - - </body> </html> \ No newline at end of file
Modified: trunk/examples/jruby-example/resources/index.html (139 => 140)
--- trunk/examples/jruby-example/resources/index.html 2007-06-04 02:52:16 UTC (rev 139) +++ trunk/examples/jruby-example/resources/index.html 2007-06-04 04:29:48 UTC (rev 140) @@ -5,10 +5,11 @@ <title></title> </head> <body> - <h1>Waffle JRuby example</h1> +<h1>Waffle JRuby example</h1> + <p> - <a href="" default method (index) on the Ruby Controller</a><br/> - <a href="" the 'bar' method on the Ruby Controller</a><br/> + <a href="" default method (index) on the Ruby Controller</a><br/> + <a href="" the 'bar' method on the Ruby Controller</a><br/> </p> </body> </html> \ No newline at end of file
Modified: trunk/examples/jruby-example/src/main/ruby/ruby/foo_bar.rb (139 => 140)
--- trunk/examples/jruby-example/src/main/ruby/ruby/foo_bar.rb 2007-06-04 02:52:16 UTC (rev 139) +++ trunk/examples/jruby-example/src/main/ruby/ruby/foo_bar.rb 2007-06-04 04:29:48 UTC (rev 140) @@ -1,4 +1,3 @@ -include_class 'org.codehaus.waffle.view.View' class FooBar @@ -10,11 +9,15 @@ %{ HELLO WORLD from the index method look up from pico: #{find_chicago} + parameters: #{parameters} request: #{request} session: #{session} + servlet_context: #{servlet_context} #{session['waffle.session.container']} #{session.getServletContext().getRealPath('/WEB-INF/')} + + auto resolve #{foo} } rescue Exception => e "ERROR #{e}" @@ -25,9 +28,17 @@ "HELLO WORLD #{request.local_name} #{request.local_port}" end - def jspx + def view_jspx + p "CALLED!" @var1 = "this is my variables value from jruby" - return View.new("foobar.jspx", self) + view = render("foobar.jspx") + p "DONE" + return view end + def redirect_to_jspx + @var1 = "this is my variables value from jruby xxx" + return redirect_to("index.html") + end + end \ No newline at end of file
To unsubscribe from this list please visit:
