Title: [waffle-scm] [140] trunk/core/src/main/ruby: ruby controllers now have access tp req params, and servlet context.
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

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:

http://xircles.codehaus.org/manage_email

Reply via email to