- Revision
- 894
- Author
- paul
- Date
- 2009-01-17 15:44:07 -0600 (Sat, 17 Jan 2009)
Log Message
closer to getting the ruby example working
Modified Paths
- sandbox/v2experiment/examples/jruby-example/src/main/java/org/codehaus/waffle/example/jruby/JrubyExampleWebappComposer.java
- sandbox/v2experiment/examples/jruby-example/src/main/webapp/WEB-INF/web.xml
- sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/context/WaffleWebappComposer.java
Added Paths
- sandbox/v2experiment/examples/jruby-example/src/test/java/org/codehaus/waffle/example/jruby/RubyCompatibilityTest.java
- sandbox/v2experiment/waffle-ruby/src/main/java/org/codehaus/waffle/ruby/RubyWaffleWebappComposer.java
Removed Paths
Diff
Modified: sandbox/v2experiment/examples/jruby-example/src/main/java/org/codehaus/waffle/example/jruby/JrubyExampleWebappComposer.java (893 => 894)
--- sandbox/v2experiment/examples/jruby-example/src/main/java/org/codehaus/waffle/example/jruby/JrubyExampleWebappComposer.java 2009-01-16 13:00:45 UTC (rev 893) +++ sandbox/v2experiment/examples/jruby-example/src/main/java/org/codehaus/waffle/example/jruby/JrubyExampleWebappComposer.java 2009-01-17 21:44:07 UTC (rev 894) @@ -1,3 +1,6 @@ +/* + * Copyright (c) terms as published in http://waffle.codehaus.org/license.html + */ package org.codehaus.waffle.example.jruby; import org.codehaus.waffle.example.jruby.dao.SimplePersonDAO; @@ -3,4 +6,9 @@ import org.codehaus.waffle.context.WaffleWebappComposer; import org.codehaus.waffle.ruby.registrar.pico.RubyScriptComponentAdapter; +import org.codehaus.waffle.ruby.RubyWaffleWebappComposer; +import org.codehaus.waffle.monitor.ActionMonitor; +import org.codehaus.waffle.monitor.CommonsLoggingMonitor; +import org.codehaus.waffle.monitor.ContextMonitor; +import org.codehaus.waffle.monitor.BindMonitor; import org.picocontainer.MutablePicoContainer; @@ -9,13 +17,13 @@ import java.util.ArrayList; import java.util.List; -public class JrubyExampleWebappComposer extends WaffleWebappComposer { +public class JrubyExampleWebappComposer extends RubyWaffleWebappComposer { - @SuppressWarnings({"unchecked"}) @Override public void composeApplication(MutablePicoContainer picoContainer, ServletContext servletContext) { super.composeApplication(picoContainer, servletContext); + picoContainer.addComponent("the_dao", SimplePersonDAO.class); picoContainer.addComponent("chicago", "bears"); @@ -28,6 +36,17 @@ picoContainer.addAdapter(new RubyScriptComponentAdapter("person", "PersonController")); // register the controller! } + protected Class<? extends ActionMonitor> actionMonitor() { + return CommonsLoggingMonitor.class; + } + + protected Class<? extends BindMonitor> bindMonitor() { + return CommonsLoggingMonitor.class; + } + + + + @Override public void composeRequest(MutablePicoContainer picoContainer) { super.composeRequest(picoContainer);
Modified: sandbox/v2experiment/examples/jruby-example/src/main/webapp/WEB-INF/web.xml (893 => 894)
--- sandbox/v2experiment/examples/jruby-example/src/main/webapp/WEB-INF/web.xml 2009-01-16 13:00:45 UTC (rev 893) +++ sandbox/v2experiment/examples/jruby-example/src/main/webapp/WEB-INF/web.xml 2009-01-17 21:44:07 UTC (rev 894) @@ -5,99 +5,69 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> - <display-name>Waffle JRuby Example</display-name> + <display-name>Waffle JRuby Example</display-name> - <!-- 1. This is how an application registers its custom Registrar --> - <context-param> - <param-name>org.codehaus.waffle.registrar.Registrar</param-name> - <param-value>org.codehaus.waffle.example.jruby.JrubyExampleWebappComposer</param-value> - </context-param> - <context-param> - <param-name>org.codehaus.waffle.monitor.RegistrarMonitor</param-name> - <param-value>org.codehaus.waffle.monitor.CommonsLoggingMonitor</param-value> - </context-param> - <context-param> - <param-name>org.codehaus.waffle.monitor.ActionMonitor</param-name> - <param-value>org.codehaus.waffle.monitor.CommonsLoggingMonitor</param-value> - </context-param> - <context-param> - <param-name>org.codehaus.waffle.monitor.ContextMonitor</param-name> - <param-value>org.codehaus.waffle.monitor.CommonsLoggingMonitor</param-value> - </context-param> - <context-param> - <param-name>org.codehaus.waffle.monitor.BindMonitor</param-name> - <param-value>org.codehaus.waffle.monitor.CommonsLoggingMonitor</param-value> - </context-param> + <!-- 1. This is how PicoContainer-Web registers composition class --> + <context-param> + <param-name>webapp-composer-class</param-name> + <param-value>org.codehaus.waffle.example.jruby.JrubyExampleWebappComposer</param-value> + </context-param> + <!-- OPTIONAL: define a path to the ruby script directory (for development) + NOTE: this path work with maven plugin filtering; you may need to adapt it your dev environment + Alternatively, you may define an env variable, eg WAFFLE_RUBY_SCRIPT=dir:/absolute/path/to/ruby/script/dir + <context-param> + <param-name>org.codehaus.waffle.ruby.env</param-name> + <param-value>WAFFLE_RUBY_SCRIPT</param-value> + </context-param> + <context-param> + <param-name>org.codehaus.waffle.ruby.path</param-name> + <param-value>dir:src/main/ruby/</param-value> + </context-param>--> - <!-- Ruby Specific components --> - <context-param> - <param-name>org.codehaus.waffle.context.ContextContainerFactory</param-name> - <param-value>org.codehaus.waffle.context.pico.RubyPicoContextContainerFactory</param-value> - </context-param> - <context-param> - <param-name>org.codehaus.waffle.bind.ControllerDataBinder</param-name> - <param-value>org.codehaus.waffle.bind.ognl.RubyControllerDataBinder</param-value> - </context-param> - <context-param> - <param-name>org.codehaus.waffle.controller.ControllerDefinitionFactory</param-name> - <param-value>org.codehaus.waffle.controller.RubyControllerDefinitionFactory</param-value> - </context-param> + <!-- 3. Waffle context listener (ServletContext and HttpSession) --> + <listener> + <listener-class>org.codehaus.waffle.servlet.WaffleListener</listener-class> + </listener> - <!-- OPTIONAL: define a path to the ruby script directory (for development) - NOTE: this path work with maven plugin filtering; you may need to adapt it your dev environment - Alternatively, you may define an env variable, eg WAFFLE_RUBY_SCRIPT=dir:/absolute/path/to/ruby/script/dir - <context-param> - <param-name>org.codehaus.waffle.ruby.env</param-name> - <param-value>WAFFLE_RUBY_SCRIPT</param-value> - </context-param> - <context-param> - <param-name>org.codehaus.waffle.ruby.path</param-name> - <param-value>dir:src/main/ruby/</param-value> - </context-param>--> - - <listener> - <listener-class>org.codehaus.waffle.context.pico.PicoWaffleContextListener</listener-class> - </listener> + <!-- 4. Waffle request filter (responsible for request level context) --> + <filter> + <filter-name>WaffleRequestFilter</filter-name> + <filter-class>org.codehaus.waffle.servlet.WaffleServlet$ServletFilter</filter-class> + </filter> + <filter-mapping> + <filter-name>WaffleRequestFilter</filter-name> + <url-pattern>*.waffle</url-pattern> + </filter-mapping> - <!-- 4. Waffle request filter (responsible for request level context) --> - <filter> - <filter-name>WaffleRequestFilter</filter-name> - <filter-class>org.codehaus.waffle.context.WaffleRequestFilter</filter-class> - </filter> - <filter-mapping> - <filter-name>WaffleRequestFilter</filter-name> - <url-pattern>*.waffle</url-pattern> - </filter-mapping> + <!-- 5. Register Waffle's FrontController servlet --> + <servlet> + <servlet-name>waffle</servlet-name> + <servlet-class>org.codehaus.waffle.servlet.WaffleServlet</servlet-class> + <init-param> + <param-name>view.suffix</param-name> + <param-value>.rhtml</param-value> + </init-param> + <load-on-startup>1</load-on-startup> + </servlet> + <servlet> + <servlet-name>rhtml</servlet-name> + <servlet-class>org.codehaus.waffle.ruby.servlet.RhtmlServlet</servlet-class> + <load-on-startup>1</load-on-startup> + </servlet> - <!-- 5. Register Waffle's FrontController servlet --> - <servlet> - <servlet-name>waffle</servlet-name> - <servlet-class>org.codehaus.waffle.servlet.WaffleServlet</servlet-class> - <init-param> - <param-name>view.suffix</param-name> - <param-value>.rhtml</param-value> - </init-param> - <load-on-startup>1</load-on-startup> - </servlet> - <servlet> - <servlet-name>rhtml</servlet-name> - <servlet-class>org.codehaus.waffle.servlet.RhtmlServlet</servlet-class> - <load-on-startup>1</load-on-startup> - </servlet> + <servlet-mapping> + <servlet-name>waffle</servlet-name> + <url-pattern>*.waffle</url-pattern> + </servlet-mapping> - <servlet-mapping> - <servlet-name>waffle</servlet-name> - <url-pattern>*.waffle</url-pattern> - </servlet-mapping> + <servlet-mapping> + <servlet-name>rhtml</servlet-name> + <url-pattern>*.rhtml</url-pattern> + </servlet-mapping> - <servlet-mapping> - <servlet-name>rhtml</servlet-name> - <url-pattern>*.rhtml</url-pattern> - </servlet-mapping> + <welcome-file-list> + <welcome-file>index.html</welcome-file> + </welcome-file-list> - <welcome-file-list> - <welcome-file>index.html</welcome-file> - </welcome-file-list> - </web-app>
Copied: sandbox/v2experiment/examples/jruby-example/src/test/java/org/codehaus/waffle/example/jruby/RubyCompatibilityTest.java (from rev 863, sandbox/v2experiment/examples/jruby-example/src/test/java/org/codehaus/waffle/example/jruby/RubyRegistrarTest.java) (0 => 894)
--- sandbox/v2experiment/examples/jruby-example/src/test/java/org/codehaus/waffle/example/jruby/RubyCompatibilityTest.java (rev 0) +++ sandbox/v2experiment/examples/jruby-example/src/test/java/org/codehaus/waffle/example/jruby/RubyCompatibilityTest.java 2009-01-17 21:44:07 UTC (rev 894) @@ -0,0 +1,197 @@ +package org.codehaus.waffle.example.jruby; + +import org.jruby.Ruby; +import org.jruby.RubyArray; +import org.jruby.RubyModule; +import org.jruby.javasupport.JavaEmbedUtils; +import org.jruby.javasupport.JavaUtil; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.builtin.InstanceVariables; +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +public class RubyCompatibilityTest { + +// Need to create an interface that sets the PicoContainer instance onto the Ruby Controller +// +// WaffleRubyControllerProxy.__setWaffleContext(...PicoContainer...) +// +// An associated module will be mixed in with the controller +// +// module Waffle +// module Controller +// def __waffle_context=(waffle_context) +// @@__waffle_context = waffle_context +// end +// +// def method_missing +// check the waffle context ... +// end +// +// .. params, request, response +// end +// +// end +// +// class FoobarController +// +// def index +// +// end +// +// end + + + // sandbox test for figuring out JRuby + @Test + public void canEvalRubyScript() { + Ruby runtime = Ruby.newInstance(); + + String script = + "class Foo\n" + + " attr_accessor :salmon\n" + + " def initialize\n" + + " @salmon = 'fish'\n" + + " end\n" + + " def bar\n" + + " return \"HELLO #{salmon}!\"\n" + + " end\n" + + "end\n"; + + runtime.evalScriptlet(script); + + IRubyObject foo = runtime.evalScriptlet("foo = Foo.new()"); + foo.callMethod(runtime.getCurrentContext(), "bar"); + IRubyObject salmon = runtime.evalScriptlet("foo.salmon"); + + RubyArray rubyArray = (RubyArray) runtime.evalScriptlet("foo.instance_variables"); + assertEquals("@salmon", rubyArray.get(0)); + + InstanceVariables instanceVariables = foo.getInstanceVariables(); + assertEquals(JavaUtil.convertJavaToRuby(runtime, "fish"), instanceVariables.getInstanceVariable("@salmon")); + + assertEquals("HELLO fish!", runtime.evalScriptlet("foo.bar").toString()); + foo.callMethod(runtime.getCurrentContext(), "salmon=", JavaUtil.convertJavaToRuby(runtime, "shark")); + assertEquals("HELLO shark!", runtime.evalScriptlet("foo.bar").toString()); + + script = + "class Foo\n" + + " def bar\n" + + " \"GOODBYE\"\n" + + " end\n"+ + "end"; + runtime.evalScriptlet(script); + assertEquals("GOODBYE", runtime.evalScriptlet("foo.bar").toString()); + + String module = + "module Calculator\n" + + "def one\n" + + " \"xxxx #...@salmon}\"\n" + + "end\n" + + "end\n" + + "\n" + + "Calculator # return the created Module"; + + IRubyObject the_module = runtime.evalScriptlet(module); + foo.callMethod(runtime.getCurrentContext(), "extend", the_module); + runtime.evalScriptlet("p foo.one"); + + Object javaX = JavaUtil.convertRubyToJava(rubyArray); + Object javaObj = JavaUtil.convertRubyToJava(salmon); + + System.out.println("x = " + javaX); + System.out.println("javaObj = " + javaObj); + } + + @Test + public void canExposeFieldsAsInstanceVariables() { + Ruby runtime = Ruby.newInstance(); + + String script = + "require 'erb'\n" + + "require 'java'\n" + + "include_class java.util.ArrayList\n" + + "f = ArrayList.new\n" + + "f.instance_variable_get(:@java_object)"; + + IRubyObject rubyObject = runtime.evalScriptlet(script); + + System.out.println("rubyObject = " + rubyObject); + + RubyModule erb = runtime.getClassFromPath("ERB"); + System.out.println("erb = " + erb); + + IRubyObject iRubyObject = (IRubyObject) JavaEmbedUtils.invokeMethod(runtime, erb, "new", + new Object[] {JavaEmbedUtils.javaToRuby(runtime, "<html>foobar <%= @java_object %></html>")}, IRubyObject.class); + + String o = (String)JavaEmbedUtils.invokeMethod(runtime, iRubyObject, "result", new Object[] {runtime.evalScriptlet("f.send :binding")}, String.class); + System.out.println("o = " + o); + } + + @Test + public void testEvalRubyErb() { + String script = + "require \"erb\"\n" + + "\n" + + " # Build template data class.\n" + + " class Product\n" + + " def initialize( code, name, desc, cost)\n" + + " @code = code\n" + + " @name = name\n" + + " @desc = desc\n" + + " @cost = cost\n" + + "\n" + + " @features = [ ]\n" + + " end\n" + + "\n" + + " def add_feature( feature )\n" + + " @features << feature\n" + + " end\n" + + "\n" + + " # ...\n" + + " end\n" + + "template = %{\n" + + " <html>\n" + + " <head><title>Ruby Toys -- <%= @name %></title></head>\n" + + " <body>\n" + + "\n" + + " <h1><%= @name %> (<%= @code %>)</h1>\n" + + " <p><%= @desc %></p>\n" + + "\n" + + " <ul>\n" + + " <% @features.each do |f| %>\n" + + " <li><b><%= f %></b></li>\n" + + " <% end %>\n" + + " </ul>\n" + + "\n" + + " <p>\n" + + " <% if @cost < 10 %>\n" + + " <b>Only <%= @cost %>!!!</b>\n" + + " <% else %>\n" + + " Call for a price, today!\n" + + " <% end %>\n" + + " </p>\n" + + "\n" + + " </body>\n" + + " </html>\n" + + " }.gsub(/^ /, '')\n" + + "\n" + + "rhtml = ERB.new(template)\n" + + "# Set up template data.\n" + + " toy = Product.new( \"TZ-1002\",\n" + + " \"Rubysapien\",\n" + + " \"Geek's Best Friend! Responds to Ruby commands...\",\n" + + " 999.95 )\n" + + " toy.add_feature(\"Listens for verbal commands in the Ruby language!\")\n" + + " toy.add_feature(\"Ignores Perl, Java, and all C variants.\")\n" + + " toy.add_feature(\"Karate-Chop Action!!!\")\n" + + " toy.add_feature(\"Matz signature on left leg.\")\n" + + " toy.add_feature(\"Gem studded eyes... Rubies, of course!\")\n" + + "\n" + + " # Produce result.\n" + + "rhtml.run(toy.send(:binding))"; + + Ruby runtime = Ruby.newInstance(); + runtime.evalScriptlet(script); + } +}
Deleted: sandbox/v2experiment/examples/jruby-example/src/test/java/org/codehaus/waffle/example/jruby/RubyRegistrarTest.java (893 => 894)
--- sandbox/v2experiment/examples/jruby-example/src/test/java/org/codehaus/waffle/example/jruby/RubyRegistrarTest.java 2009-01-16 13:00:45 UTC (rev 893) +++ sandbox/v2experiment/examples/jruby-example/src/test/java/org/codehaus/waffle/example/jruby/RubyRegistrarTest.java 2009-01-17 21:44:07 UTC (rev 894) @@ -1,197 +0,0 @@ -package org.codehaus.waffle.example.jruby; - -import org.jruby.Ruby; -import org.jruby.RubyArray; -import org.jruby.RubyModule; -import org.jruby.javasupport.JavaEmbedUtils; -import org.jruby.javasupport.JavaUtil; -import org.jruby.runtime.builtin.IRubyObject; -import org.jruby.runtime.builtin.InstanceVariables; -import static org.junit.Assert.assertEquals; -import org.junit.Test; - -public class RubyRegistrarTest { - -// Need to create an interface that sets the PicoContainer instance onto the Ruby Controller -// -// WaffleRubyControllerProxy.__setWaffleContext(...PicoContainer...) -// -// An associated module will be mixed in with the controller -// -// module Waffle -// module Controller -// def __waffle_context=(waffle_context) -// @@__waffle_context = waffle_context -// end -// -// def method_missing -// check the waffle context ... -// end -// -// .. params, request, response -// end -// -// end -// -// class FoobarController -// -// def index -// -// end -// -// end - - - // sandbox test for figuring out JRuby - @Test - public void canEvalRubyScript() { - Ruby runtime = Ruby.newInstance(); - - String script = - "class Foo\n" + - " attr_accessor :salmon\n" + - " def initialize\n" + - " @salmon = 'fish'\n" + - " end\n" + - " def bar\n" + - " return \"HELLO #{salmon}!\"\n" + - " end\n" + - "end\n"; - - runtime.evalScriptlet(script); - - IRubyObject foo = runtime.evalScriptlet("foo = Foo.new()"); - foo.callMethod(runtime.getCurrentContext(), "bar"); - IRubyObject salmon = runtime.evalScriptlet("foo.salmon"); - - RubyArray rubyArray = (RubyArray) runtime.evalScriptlet("foo.instance_variables"); - assertEquals("@salmon", rubyArray.get(0)); - - InstanceVariables instanceVariables = foo.getInstanceVariables(); - assertEquals(JavaUtil.convertJavaToRuby(runtime, "fish"), instanceVariables.getInstanceVariable("@salmon")); - - assertEquals("HELLO fish!", runtime.evalScriptlet("foo.bar").toString()); - foo.callMethod(runtime.getCurrentContext(), "salmon=", JavaUtil.convertJavaToRuby(runtime, "shark")); - assertEquals("HELLO shark!", runtime.evalScriptlet("foo.bar").toString()); - - script = - "class Foo\n" + - " def bar\n" + - " \"GOODBYE\"\n" + - " end\n"+ - "end"; - runtime.evalScriptlet(script); - assertEquals("GOODBYE", runtime.evalScriptlet("foo.bar").toString()); - - String module = - "module Calculator\n" + - "def one\n" + - " \"xxxx #...@salmon}\"\n" + - "end\n" + - "end\n" + - "\n" + - "Calculator # return the created Module"; - - IRubyObject the_module = runtime.evalScriptlet(module); - foo.callMethod(runtime.getCurrentContext(), "extend", the_module); - runtime.evalScriptlet("p foo.one"); - - Object javaX = JavaUtil.convertRubyToJava(rubyArray); - Object javaObj = JavaUtil.convertRubyToJava(salmon); - - System.out.println("x = " + javaX); - System.out.println("javaObj = " + javaObj); - } - - @Test - public void canExposeFieldsAsInstanceVariables() { - Ruby runtime = Ruby.newInstance(); - - String script = - "require 'erb'\n" + - "require 'java'\n" + - "include_class java.util.ArrayList\n" + - "f = ArrayList.new\n" + - "f.instance_variable_get(:@java_object)"; - - IRubyObject rubyObject = runtime.evalScriptlet(script); - - System.out.println("rubyObject = " + rubyObject); - - RubyModule erb = runtime.getClassFromPath("ERB"); - System.out.println("erb = " + erb); - - IRubyObject iRubyObject = (IRubyObject) JavaEmbedUtils.invokeMethod(runtime, erb, "new", - new Object[] {JavaEmbedUtils.javaToRuby(runtime, "<html>foobar <%= @java_object %></html>")}, IRubyObject.class); - - String o = (String)JavaEmbedUtils.invokeMethod(runtime, iRubyObject, "result", new Object[] {runtime.evalScriptlet("f.send :binding")}, String.class); - System.out.println("o = " + o); - } - - @Test - public void testEvalRubyErb() { - String script = - "require \"erb\"\n" + - "\n" + - " # Build template data class.\n" + - " class Product\n" + - " def initialize( code, name, desc, cost)\n" + - " @code = code\n" + - " @name = name\n" + - " @desc = desc\n" + - " @cost = cost\n" + - "\n" + - " @features = [ ]\n" + - " end\n" + - "\n" + - " def add_feature( feature )\n" + - " @features << feature\n" + - " end\n" + - "\n" + - " # ...\n" + - " end\n" + - "template = %{\n" + - " <html>\n" + - " <head><title>Ruby Toys -- <%= @name %></title></head>\n" + - " <body>\n" + - "\n" + - " <h1><%= @name %> (<%= @code %>)</h1>\n" + - " <p><%= @desc %></p>\n" + - "\n" + - " <ul>\n" + - " <% @features.each do |f| %>\n" + - " <li><b><%= f %></b></li>\n" + - " <% end %>\n" + - " </ul>\n" + - "\n" + - " <p>\n" + - " <% if @cost < 10 %>\n" + - " <b>Only <%= @cost %>!!!</b>\n" + - " <% else %>\n" + - " Call for a price, today!\n" + - " <% end %>\n" + - " </p>\n" + - "\n" + - " </body>\n" + - " </html>\n" + - " }.gsub(/^ /, '')\n" + - "\n" + - "rhtml = ERB.new(template)\n" + - "# Set up template data.\n" + - " toy = Product.new( \"TZ-1002\",\n" + - " \"Rubysapien\",\n" + - " \"Geek's Best Friend! Responds to Ruby commands...\",\n" + - " 999.95 )\n" + - " toy.add_feature(\"Listens for verbal commands in the Ruby language!\")\n" + - " toy.add_feature(\"Ignores Perl, Java, and all C variants.\")\n" + - " toy.add_feature(\"Karate-Chop Action!!!\")\n" + - " toy.add_feature(\"Matz signature on left leg.\")\n" + - " toy.add_feature(\"Gem studded eyes... Rubies, of course!\")\n" + - "\n" + - " # Produce result.\n" + - "rhtml.run(toy.send(:binding))"; - - Ruby runtime = Ruby.newInstance(); - runtime.evalScriptlet(script); - } -}
Modified: sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/context/WaffleWebappComposer.java (893 => 894)
--- sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/context/WaffleWebappComposer.java 2009-01-16 13:00:45 UTC (rev 893) +++ sandbox/v2experiment/waffle-core/src/main/java/org/codehaus/waffle/context/WaffleWebappComposer.java 2009-01-17 21:44:07 UTC (rev 894) @@ -1,3 +1,6 @@ +/* + * Copyright (c) terms as published in http://waffle.codehaus.org/license.html + */ package org.codehaus.waffle.context; import org.picocontainer.web.WebappComposer; @@ -48,6 +51,10 @@ import javax.servlet.ServletContext; +/** + * @author Michael Ward + * @author Mauro Talevi + */ public abstract class WaffleWebappComposer implements WebappComposer { private ParameterResolver parameterResolver; @@ -80,7 +87,6 @@ picoContainer.addComponent(ViewResolver.class, viewResolver()); picoContainer.addComponent(ParameterResolver.class, parameterResolver()); - parameterResolver = picoContainer.getComponent(ParameterResolver.class); } @@ -186,7 +192,6 @@ return DefaultErrorsContext.class; } - protected Parameter[] picoParameters(Object... parameters) { if (parameters.length == 0) { return null; // pico expects a null when no parameters @@ -199,6 +204,4 @@ return picoParameters; } - - }
Added: sandbox/v2experiment/waffle-ruby/src/main/java/org/codehaus/waffle/ruby/RubyWaffleWebappComposer.java (0 => 894)
--- sandbox/v2experiment/waffle-ruby/src/main/java/org/codehaus/waffle/ruby/RubyWaffleWebappComposer.java (rev 0) +++ sandbox/v2experiment/waffle-ruby/src/main/java/org/codehaus/waffle/ruby/RubyWaffleWebappComposer.java 2009-01-17 21:44:07 UTC (rev 894) @@ -0,0 +1,90 @@ +/* + * Copyright (c) terms as published in http://waffle.codehaus.org/license.html + */ +package org.codehaus.waffle.ruby; + +import org.codehaus.waffle.context.WaffleWebappComposer; +import org.codehaus.waffle.bind.ControllerDataBinder; +import org.codehaus.waffle.ruby.bind.ognl.RubyControllerDataBinder; +import org.codehaus.waffle.ruby.controller.RubyControllerDefinitionFactory; +import org.codehaus.waffle.ruby.context.pico.RubyScriptLoader; +import org.codehaus.waffle.controller.ControllerDefinitionFactory; +import org.codehaus.waffle.WaffleException; +import org.picocontainer.MutablePicoContainer; +import static org.picocontainer.Characteristics.CACHE; +import org.jruby.Ruby; + +import javax.servlet.ServletContext; +import java.util.ArrayList; +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.IOException; + +/** + * @author Michael Ward + * @author Mauro Talevi + */ +public class RubyWaffleWebappComposer extends WaffleWebappComposer { + + protected Class<? extends ControllerDataBinder> controllerDataBinder() { + return RubyControllerDataBinder.class; + } + + protected Class<? extends ControllerDefinitionFactory> controllerDefinitionFactory() { + return RubyControllerDefinitionFactory.class; + } + + public void composeApplication(MutablePicoContainer picoContainer, ServletContext servletContext) { + super.composeApplication(picoContainer, servletContext); + + Ruby runtime = Ruby.newInstance(); + runtime.getLoadService().init(new ArrayList<Object>()); // this must be called, else we won't be able to load + // scripts!! + loadRubyScriptFromClassLoader("org/codehaus/waffle/waffle_erb.rb", runtime); + loadRubyScriptFromClassLoader("org/codehaus/waffle/waffle.rb", runtime); + + // I'd prefer to do the following: + // runtime.evalScript("require 'string'\nrequire 'waffle'"); // load Waffle custom scripts + // + // but JRuby fails when web app is reloaded... + // <script>:1:in `require': JAR entry string.rb not found in ~/jruby-example/exploded/WEB-INF/lib/core.jar + // (IOError) + + picoContainer.addComponent(Ruby.class, runtime); + picoContainer.as(CACHE).addComponent(RubyScriptLoader.class); + + } + + private void loadRubyScriptFromClassLoader(String fileName, Ruby runtime) { + BufferedReader bufferedReader = null; + InputStream inputStream = null; + + try { + inputStream = this.getClass().getClassLoader().getResourceAsStream(fileName); + bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + StringBuilder script = new StringBuilder(); + String line = bufferedReader.readLine(); + + while (line != null) { + script.append(line).append("\n"); + line = bufferedReader.readLine(); + } + + runtime.executeScript(script.toString(), fileName); + } catch (IOException e) { + throw new WaffleException(e); + } finally { + try { + if (inputStream != null) + inputStream.close(); + if (bufferedReader != null) + bufferedReader.close(); + } catch (IOException ignore) { + // ignore + } + } + } + + +}
To unsubscribe from this list please visit:
