- Revision
- 83
- Author
- mward
- Date
- 2007-05-24 14:25:52 -0500 (Thu, 24 May 2007)
Log Message
Ruby Aware CA loads ruby scripts from the class loader. Waffle::Controller module is mixed in with Ruby controller instantiated by Waffle
Modified Paths
- trunk/core/core.iml
- trunk/core/pom.xml
- trunk/core/src/main/java/org/codehaus/waffle/bind/RubyDataBinder.java
- trunk/core/src/main/java/org/codehaus/waffle/context/pico/RubyAwarePicoContextContainerFactory.java
- trunk/core/src/main/java/org/codehaus/waffle/controller/RubyController.java
- trunk/core/src/main/java/org/codehaus/waffle/controller/RubyControllerDefinitionFactory.java
- trunk/core/src/main/java/org/codehaus/waffle/registrar/pico/RubyScriptComponentAdapter.java
- trunk/core/src/test/java/org/codehaus/waffle/context/pico/RubyAwarePicoContextContainerFactoryTest.java
- trunk/core/src/test/java/org/codehaus/waffle/registrar/pico/RubyScriptComponentAdapterTest.java
- trunk/examples/jruby-example/jruby-example.iml
- trunk/examples/jruby-example/src/main/java/org/codehaus/waffle/example/jruby/JRubyRegistrar.java
- trunk/waffle.ipr
Added Paths
- trunk/core/src/main/ruby/
- trunk/core/src/main/ruby/string.rb
- trunk/core/src/main/ruby/waffle.rb
Diff
Modified: trunk/core/core.iml (82 => 83)
--- trunk/core/core.iml 2007-05-24 15:28:16 UTC (rev 82) +++ trunk/core/core.iml 2007-05-24 19:25:52 UTC (rev 83) @@ -8,6 +8,7 @@ <content url="" <sourceFolder url="" isTestSource="false" /> <sourceFolder url="" isTestSource="false" /> + <sourceFolder url="" isTestSource="false" /> <sourceFolder url="" isTestSource="true" /> <sourceFolder url="" isTestSource="true" /> <excludeFolder url="" /> @@ -137,6 +138,17 @@ <root url="" /> </CLASSES> <JAVADOC /> + <SOURCES> + <root url="" /> + </SOURCES> + </library> + </orderEntry> + <orderEntry type="module-library"> + <library> + <CLASSES> + <root url="" /> + </CLASSES> + <JAVADOC /> <SOURCES /> </library> </orderEntry>
Modified: trunk/core/pom.xml (82 => 83)
--- trunk/core/pom.xml 2007-05-24 15:28:16 UTC (rev 82) +++ trunk/core/pom.xml 2007-05-24 19:25:52 UTC (rev 83) @@ -46,6 +46,14 @@ </dependencies> <build> + <resources> + <resource> + <directory>src/main/ruby</directory> + <includes> + <include>**/*.rb</include> + </includes> + </resource> + </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId>
Modified: trunk/core/src/main/java/org/codehaus/waffle/bind/RubyDataBinder.java (82 => 83)
--- trunk/core/src/main/java/org/codehaus/waffle/bind/RubyDataBinder.java 2007-05-24 15:28:16 UTC (rev 82) +++ trunk/core/src/main/java/org/codehaus/waffle/bind/RubyDataBinder.java 2007-05-24 19:25:52 UTC (rev 83) @@ -1,7 +1,10 @@ package org.codehaus.waffle.bind; import ognl.TypeConverter; +import org.codehaus.waffle.controller.RubyController; import org.codehaus.waffle.validation.ErrorsContext; +import org.jruby.Ruby; +import org.jruby.javasupport.JavaEmbedUtils; import org.jruby.runtime.builtin.IRubyObject; import javax.servlet.http.HttpServletRequest; @@ -13,11 +16,17 @@ super(typeConverter, bindErrorMessageResolver); } - public void bind(HttpServletRequest request, ErrorsContext errorsContext, Object model) { - if(model instanceof IRubyObject) { - // does nothing for the moment + public void bind(HttpServletRequest request, ErrorsContext errorsContext, Object controller) { + if(controller instanceof RubyController) { + IRubyObject rubyObject = ((RubyController)controller).getRubyObject(); + Ruby runtime = rubyObject.getRuntime(); + + // set request on the controller + JavaEmbedUtils.invokeMethod(runtime, rubyObject, "request=", new HttpServletRequest[] {request}, Object.class); + } else { - super.bind(request, errorsContext, model); + // default to standard binding + super.bind(request, errorsContext, controller); } } }
Modified: trunk/core/src/main/java/org/codehaus/waffle/context/pico/RubyAwarePicoContextContainerFactory.java (82 => 83)
--- trunk/core/src/main/java/org/codehaus/waffle/context/pico/RubyAwarePicoContextContainerFactory.java 2007-05-24 15:28:16 UTC (rev 82) +++ trunk/core/src/main/java/org/codehaus/waffle/context/pico/RubyAwarePicoContextContainerFactory.java 2007-05-24 19:25:52 UTC (rev 83) @@ -1,10 +1,16 @@ package org.codehaus.waffle.context.pico; +import org.codehaus.waffle.WaffleException; +import org.codehaus.waffle.context.ContextContainer; import org.codehaus.waffle.i18n.MessageResources; -import org.codehaus.waffle.context.ContextContainer; +import org.jruby.Ruby; import org.picocontainer.MutablePicoContainer; -import org.jruby.Ruby; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + public class RubyAwarePicoContextContainerFactory extends PicoContextContainerFactory { public RubyAwarePicoContextContainerFactory(MessageResources messageResources) { @@ -16,23 +22,43 @@ Ruby runtime = Ruby.getDefaultInstance(); - // TODO Ruby ... this needs to be moved to an actual Ruby file and loaded from clas loader - String script = - "def String.camelize(lower_case_and_underscored_word, first_letter_in_uppercase = true)\n" + - " if first_letter_in_uppercase\n" + - " lower_case_and_underscored_word.to_s.gsub(/\\/(.?)/) { \"::\" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }\n" + - " else\n" + - " lower_case_and_underscored_word.first + camelize(lower_case_and_underscored_word)[1..-1]\n" + - " end\n" + - "end"; + loadRubyScriptFromClassLoader("string.rb", runtime); + loadRubyScriptFromClassLoader("waffle.rb", runtime); - runtime.evalScript(script); // load waffle extensions to Ruby language - // Register RubyRuntime at Application level MutablePicoContainer picoContainer = (MutablePicoContainer) contextContainer.getDelegate(); picoContainer.registerComponentInstance(Ruby.class, runtime); return contextContainer; } - + + 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.evalScript(script.toString()); + } catch (IOException e) { + throw new WaffleException(e); + } finally { + try { + if(inputStream != null) inputStream.close(); + if(bufferedReader != null) bufferedReader.close(); + } catch (IOException ignore) { + // ignore + } + } + + } + }
Modified: trunk/core/src/main/java/org/codehaus/waffle/controller/RubyController.java (82 => 83)
--- trunk/core/src/main/java/org/codehaus/waffle/controller/RubyController.java 2007-05-24 15:28:16 UTC (rev 82) +++ trunk/core/src/main/java/org/codehaus/waffle/controller/RubyController.java 2007-05-24 19:25:52 UTC (rev 83) @@ -1,7 +1,8 @@ package org.codehaus.waffle.controller; +import org.jruby.Ruby; +import org.jruby.javasupport.JavaUtil; import org.jruby.runtime.builtin.IRubyObject; -import org.jruby.javasupport.JavaUtil; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -10,8 +11,8 @@ * This is a wrapper for the underlying ruby script */ public class RubyController { + private String methodName; private final IRubyObject rubyObject; - private String methodName; public RubyController(IRubyObject rubyObject) { this.rubyObject = rubyObject; @@ -21,8 +22,13 @@ this.methodName = methodName; } + public IRubyObject getRubyObject() { + return rubyObject; + } + public Object execute(HttpServletRequest request, HttpServletResponse response) { - IRubyObject result = rubyObject.callMethod(rubyObject.getRuntime().getCurrentContext(), methodName); + Ruby runtime = rubyObject.getRuntime(); + IRubyObject result = rubyObject.callMethod(runtime.getCurrentContext(), methodName); return JavaUtil.convertRubyToJava(result); }
Modified: trunk/core/src/main/java/org/codehaus/waffle/controller/RubyControllerDefinitionFactory.java (82 => 83)
--- trunk/core/src/main/java/org/codehaus/waffle/controller/RubyControllerDefinitionFactory.java 2007-05-24 15:28:16 UTC (rev 82) +++ trunk/core/src/main/java/org/codehaus/waffle/controller/RubyControllerDefinitionFactory.java 2007-05-24 19:25:52 UTC (rev 83) @@ -56,4 +56,5 @@ } return super.findMethodDefinition(controller, request, response); } + }
Modified: trunk/core/src/main/java/org/codehaus/waffle/registrar/pico/RubyScriptComponentAdapter.java (82 => 83)
--- trunk/core/src/main/java/org/codehaus/waffle/registrar/pico/RubyScriptComponentAdapter.java 2007-05-24 15:28:16 UTC (rev 82) +++ trunk/core/src/main/java/org/codehaus/waffle/registrar/pico/RubyScriptComponentAdapter.java 2007-05-24 19:25:52 UTC (rev 83) @@ -1,12 +1,12 @@ package org.codehaus.waffle.registrar.pico; -import org.picocontainer.PicoVisitor; +import org.jruby.Ruby; +import org.jruby.runtime.builtin.IRubyObject; import org.picocontainer.ComponentAdapter; import org.picocontainer.PicoContainer; +import org.picocontainer.PicoInitializationException; import org.picocontainer.PicoIntrospectionException; -import org.picocontainer.PicoInitializationException; -import org.jruby.Ruby; -import org.jruby.runtime.builtin.IRubyObject; +import org.picocontainer.PicoVisitor; public class RubyScriptComponentAdapter implements ComponentAdapter { private Object componentKey; @@ -29,9 +29,10 @@ Ruby runtime = (Ruby) picoContainer.getComponentInstance(Ruby.class); runtime.evalScript(rubyScript); - // TODO RUBY: mixin custom module! - - return runtime.evalScript("eval(\"#{String.camelize('" + componentKey + "')}.new\")"); + String script = + "controller = eval(\"#{String.camelize('" + componentKey + "')}.new\")\n" + // instantiate controller + "controller.extend(Waffle::Controller)"; // mixin Waffle module + return runtime.evalScript(script); } public void verify(PicoContainer picoContainer) throws PicoIntrospectionException {
Added: trunk/core/src/main/ruby/string.rb (0 => 83)
--- trunk/core/src/main/ruby/string.rb (rev 0) +++ trunk/core/src/main/ruby/string.rb 2007-05-24 19:25:52 UTC (rev 83) @@ -0,0 +1,8 @@ +# Following was copied from RoR (Inflector module)... +def String.camelize(lower_case_and_underscored_word, first_letter_in_uppercase = true) + if first_letter_in_uppercase + lower_case_and_underscored_word.to_s.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase } + else + lower_case_and_underscored_word.first + camelize(lower_case_and_underscored_word)[1..-1] + end +end \ No newline at end of file
Added: trunk/core/src/main/ruby/waffle.rb (0 => 83)
--- trunk/core/src/main/ruby/waffle.rb (rev 0) +++ trunk/core/src/main/ruby/waffle.rb 2007-05-24 19:25:52 UTC (rev 83) @@ -0,0 +1,22 @@ +module Waffle + module Controller + + attr_accessor :request, :response, :session + + # Still a work in progress + def __pico_container=(pico) + @@__pico_container = pico + end + + def method_missing(symbol, *args) + if symbol.to_s =~ /^find_/ + # Pico + + + end + end + + + + end +end \ No newline at end of file
Modified: trunk/core/src/test/java/org/codehaus/waffle/context/pico/RubyAwarePicoContextContainerFactoryTest.java (82 => 83)
--- trunk/core/src/test/java/org/codehaus/waffle/context/pico/RubyAwarePicoContextContainerFactoryTest.java 2007-05-24 15:28:16 UTC (rev 82) +++ trunk/core/src/test/java/org/codehaus/waffle/context/pico/RubyAwarePicoContextContainerFactoryTest.java 2007-05-24 19:25:52 UTC (rev 83) @@ -1,10 +1,12 @@ package org.codehaus.waffle.context.pico; +import org.codehaus.waffle.context.ContextContainer; import org.jmock.MockObjectTestCase; -import org.codehaus.waffle.context.ContextContainer; +import org.jruby.Ruby; +import org.jruby.RubyBoolean; +import org.jruby.javasupport.JavaEmbedUtils; import org.picocontainer.MutablePicoContainer; import org.picocontainer.PicoContainer; -import org.jruby.Ruby; public class RubyAwarePicoContextContainerFactoryTest extends MockObjectTestCase { @@ -12,7 +14,12 @@ RubyAwarePicoContextContainerFactory factory = new RubyAwarePicoContextContainerFactory(null); ContextContainer contextContainer = factory.buildApplicationContextContainer(); PicoContainer picoContainer = (MutablePicoContainer)contextContainer.getDelegate(); - assertNotNull(picoContainer.getComponentInstance(Ruby.class)); + Ruby runtime = (Ruby) picoContainer.getComponentInstance(Ruby.class); + assertNotNull(runtime); + + // ensure mixin occurred + RubyBoolean rubyBoolean = (RubyBoolean) runtime.evalScript("String.respond_to? :camelize"); + assertTrue((Boolean)JavaEmbedUtils.rubyToJava(runtime, rubyBoolean, Boolean.class)); } }
Modified: trunk/core/src/test/java/org/codehaus/waffle/registrar/pico/RubyScriptComponentAdapterTest.java (82 => 83)
--- trunk/core/src/test/java/org/codehaus/waffle/registrar/pico/RubyScriptComponentAdapterTest.java 2007-05-24 15:28:16 UTC (rev 82) +++ trunk/core/src/test/java/org/codehaus/waffle/registrar/pico/RubyScriptComponentAdapterTest.java 2007-05-24 19:25:52 UTC (rev 83) @@ -21,6 +21,10 @@ runtime.evalScript("$my_global = 'Waffle'\n"); String script = + "module Waffle\n" + + " module Controller\n" + + " end\n" + + "end\n" + "def String.camelize(param_1)\n" + " return 'FooBar'\n" + // fake out functionality "end\n" +
Modified: trunk/examples/jruby-example/jruby-example.iml (82 => 83)
--- trunk/examples/jruby-example/jruby-example.iml 2007-05-24 15:28:16 UTC (rev 82) +++ trunk/examples/jruby-example/jruby-example.iml 2007-05-24 19:25:52 UTC (rev 83) @@ -10,6 +10,7 @@ <output-test url="" /> <content url="" <sourceFolder url="" isTestSource="false" /> + <sourceFolder url="" isTestSource="false" /> <sourceFolder url="" isTestSource="true" /> </content> <orderEntry type="inheritedJdk" /> @@ -83,16 +84,6 @@ <url>jar://$APPLICATION_HOME_DIR$/lib/j2ee.jar!/</url> </containerElement> <containerElement type="library" level="module"> - <attribute name="method" value="0" /> - <attribute name="URI" value="/WEB-INF/lib/asm-2.2.3.jar" /> - <url>jar://$M2_REPOSITORY$/asm/asm/2.2.3/asm-2.2.3.jar!/</url> - </containerElement> - <containerElement type="library" level="module"> - <attribute name="method" value="0" /> - <attribute name="URI" value="/WEB-INF/lib/backport-util-concurrent-3.0.jar" /> - <url>jar://$M2_REPOSITORY$/backport-util-concurrent/backport-util-concurrent/3.0/backport-util-concurrent-3.0.jar!/</url> - </containerElement> - <containerElement type="library" level="module"> <attribute name="method" value="1" /> <attribute name="URI" value="/WEB-INF/lib/paranamer-1.0-RC-3-SNAPSHOT.jar" /> <url>jar://$M2_REPOSITORY$/com/thoughtworks/paranamer/paranamer/1.0-RC-3-SNAPSHOT/paranamer-1.0-RC-3-SNAPSHOT.jar!/</url> @@ -138,11 +129,6 @@ <url>jar://$M2_REPOSITORY$/org/jruby/jruby-complete/1.0RC2/jruby-complete-1.0RC2.jar!/</url> </containerElement> <containerElement type="library" level="module"> - <attribute name="method" value="0" /> - <attribute name="URI" value="/WEB-INF/lib/jruby-1.0RC2.jar" /> - <url>jar://$M2_REPOSITORY$/org/jruby/jruby/1.0RC2/jruby-1.0RC2.jar!/</url> - </containerElement> - <containerElement type="library" level="module"> <attribute name="method" value="1" /> <attribute name="URI" value="/WEB-INF/lib/picocontainer-1.2.jar" /> <url>jar://$M2_REPOSITORY$/org/picocontainer/picocontainer/1.2/picocontainer-1.2.jar!/</url>
Modified: trunk/examples/jruby-example/src/main/java/org/codehaus/waffle/example/jruby/JRubyRegistrar.java (82 => 83)
--- trunk/examples/jruby-example/src/main/java/org/codehaus/waffle/example/jruby/JRubyRegistrar.java 2007-05-24 15:28:16 UTC (rev 82) +++ trunk/examples/jruby-example/src/main/java/org/codehaus/waffle/example/jruby/JRubyRegistrar.java 2007-05-24 19:25:52 UTC (rev 83) @@ -21,14 +21,15 @@ String script = "class FooBar\n" + + //" attr_accessor :request\n" + " def index\n" + - " 'HELLO WORLD from the index method'\n" + + " \"HELLO WORLD from the index method #{request}\"\n" + " end\n" + " def bar\n" + - " 'HELLO WORLD'\n" + + " \"HELLO WORLD #{request.local_name} #{request.local_port}\"\n" + " end\n" + "end\n"; - + ComponentAdapter componentAdapter = new RubyScriptComponentAdapter("foo_bar", script); picoRegistrar.registerComponentAdapter(componentAdapter); }
Modified: trunk/waffle.ipr (82 => 83)
--- trunk/waffle.ipr 2007-05-24 15:28:16 UTC (rev 82) +++ trunk/waffle.ipr 2007-05-24 19:25:52 UTC (rev 83) @@ -35,6 +35,7 @@ <entry name="?*.jpeg" /> <entry name="?*.tld" /> <entry name="?*.list" /> + <entry name="*.rb" /> </wildcardResourcePatterns> </component> <component name="DataSourceManager" />
To unsubscribe from this list please visit:
