- Revision
- 109
- Author
- mward
- Date
- 2007-05-29 23:48:14 -0500 (Tue, 29 May 2007)
Log Message
ruby scripts are automatically loaded upon application startup. Individual ruby controller must be named and associated with their ruby class name (i.e. 'foo_bar' => 'FooBar')
Modified Paths
- 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/registrar/pico/PicoRegistrar.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/src/main/java/org/codehaus/waffle/example/jruby/JRubyRegistrar.java
- trunk/pom.xml
Added Paths
- trunk/core/src/main/java/org/codehaus/waffle/context/pico/RubyScriptLoader.java
- trunk/core/src/test/java/org/codehaus/waffle/context/pico/RubyScriptLoaderTest.java
- trunk/examples/jruby-example/src/main/ruby/
- trunk/examples/jruby-example/src/main/ruby/ruby/
- trunk/examples/jruby-example/src/main/ruby/ruby/foo_bar.rb
Diff
Modified: trunk/core/src/main/java/org/codehaus/waffle/context/pico/RubyAwarePicoContextContainerFactory.java (108 => 109)
--- trunk/core/src/main/java/org/codehaus/waffle/context/pico/RubyAwarePicoContextContainerFactory.java 2007-05-29 18:35:16 UTC (rev 108) +++ trunk/core/src/main/java/org/codehaus/waffle/context/pico/RubyAwarePicoContextContainerFactory.java 2007-05-30 04:48:14 UTC (rev 109) @@ -28,6 +28,7 @@ // Register RubyRuntime at Application level MutablePicoContainer picoContainer = (MutablePicoContainer) contextContainer.getDelegate(); picoContainer.registerComponentInstance(Ruby.class, runtime); + picoContainer.registerComponentImplementation(RubyScriptLoader.class); return contextContainer; } @@ -58,7 +59,6 @@ // ignore } } - } }
Added: trunk/core/src/main/java/org/codehaus/waffle/context/pico/RubyScriptLoader.java (0 => 109)
--- trunk/core/src/main/java/org/codehaus/waffle/context/pico/RubyScriptLoader.java (rev 0) +++ trunk/core/src/main/java/org/codehaus/waffle/context/pico/RubyScriptLoader.java 2007-05-30 04:48:14 UTC (rev 109) @@ -0,0 +1,67 @@ +package org.codehaus.waffle.context.pico; + +import org.picocontainer.Startable; +import org.jruby.Ruby; +import org.codehaus.waffle.WaffleException; + +import javax.servlet.ServletContext; +import java.util.Set; +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.IOException; + +public class RubyScriptLoader implements Startable { + private final ServletContext servletContext; + private final Ruby runtime; + + public RubyScriptLoader(ServletContext servletContext, Ruby runtime) { + this.servletContext = servletContext; + this.runtime = runtime; + } + + public void start() { + // noinspection unchecked + Set<String> resourcePaths = servletContext.getResourcePaths("/WEB-INF/classes/ruby"); // todo should be able to override ruby location through a key in the web.xml + + for (String path : resourcePaths) { + // todo cache path and file create time + loadRubyScript(path); + } + } + + // todo implement a reload which checks files to ensure they are upto date in the runtime + + public void stop() { + // does nothing + } + + private void loadRubyScript(String path) { + BufferedReader bufferedReader = null; + InputStream inputStream = null; + + try { + inputStream = servletContext.getResourceAsStream(path); + 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 (108 => 109)
--- trunk/core/src/main/java/org/codehaus/waffle/controller/RubyController.java 2007-05-29 18:35:16 UTC (rev 108) +++ trunk/core/src/main/java/org/codehaus/waffle/controller/RubyController.java 2007-05-30 04:48:14 UTC (rev 109) @@ -26,6 +26,7 @@ return rubyObject; } + // todo need to ensure this doesn't allow non-public methods to be called public Object execute(HttpServletRequest request, HttpServletResponse response) { Ruby runtime = rubyObject.getRuntime(); IRubyObject result = rubyObject.callMethod(runtime.getCurrentContext(), methodName);
Modified: trunk/core/src/main/java/org/codehaus/waffle/registrar/pico/PicoRegistrar.java (108 => 109)
--- trunk/core/src/main/java/org/codehaus/waffle/registrar/pico/PicoRegistrar.java 2007-05-29 18:35:16 UTC (rev 108) +++ trunk/core/src/main/java/org/codehaus/waffle/registrar/pico/PicoRegistrar.java 2007-05-30 04:48:14 UTC (rev 109) @@ -67,6 +67,12 @@ picoContainer.registerComponent(componentAdapter); } + // expose to interface? + public void registerRubyScript(String key, String className) { + ComponentAdapter componentAdapter = new RubyScriptComponentAdapter(key, className); + this.registerComponentAdapter(componentAdapter); + } + public void registerComponentAdapter(ComponentAdapter componentAdapter) { picoContainer.registerComponent(componentAdapter); } @@ -76,7 +82,7 @@ for (int i = 0; i < parameters.length; i++) { picoParameters[i] = new ConstantParameter(parameters[i]); } - return null; + return picoParameters; } public void application() {
Modified: trunk/core/src/main/java/org/codehaus/waffle/registrar/pico/RubyScriptComponentAdapter.java (108 => 109)
--- trunk/core/src/main/java/org/codehaus/waffle/registrar/pico/RubyScriptComponentAdapter.java 2007-05-29 18:35:16 UTC (rev 108) +++ trunk/core/src/main/java/org/codehaus/waffle/registrar/pico/RubyScriptComponentAdapter.java 2007-05-30 04:48:14 UTC (rev 109) @@ -10,13 +10,12 @@ import org.picocontainer.PicoVisitor; public class RubyScriptComponentAdapter implements ComponentAdapter { - private Object componentKey; - private final String rubyScript; + private final Object componentKey; + private final String rubyClassName; - // TODO this needs to be changed ... key is the name controller regiester under and the value is the Ruby class name - public RubyScriptComponentAdapter(Object componentKey, String rubyScript) { + public RubyScriptComponentAdapter(Object componentKey, String rubyClassName) { this.componentKey = componentKey; - this.rubyScript = rubyScript; + this.rubyClassName = rubyClassName; } public Object getComponentKey() { @@ -29,10 +28,10 @@ public Object getComponentInstance(PicoContainer picoContainer) throws PicoInitializationException, PicoIntrospectionException { Ruby runtime = (Ruby) picoContainer.getComponentInstance(Ruby.class); - runtime.evalScript(rubyScript); + runtime.evalScript(rubyClassName); String script = - "controller = eval(\"#{String.camelize('" + componentKey + "')}.new\")\n" + // instantiate controller + "controller = " + rubyClassName + ".new\n" + // instantiate controller "controller.extend(Waffle::Controller)"; // mixin Waffle module IRubyObject controller = runtime.evalScript(script);
Modified: trunk/core/src/test/java/org/codehaus/waffle/context/pico/RubyAwarePicoContextContainerFactoryTest.java (108 => 109)
--- trunk/core/src/test/java/org/codehaus/waffle/context/pico/RubyAwarePicoContextContainerFactoryTest.java 2007-05-29 18:35:16 UTC (rev 108) +++ trunk/core/src/test/java/org/codehaus/waffle/context/pico/RubyAwarePicoContextContainerFactoryTest.java 2007-05-30 04:48:14 UTC (rev 109) @@ -17,6 +17,8 @@ Ruby runtime = (Ruby) picoContainer.getComponentInstance(Ruby.class); assertNotNull(runtime); + assertNotNull(picoContainer.getComponentAdapter(RubyScriptLoader.class)); + // ensure mixin occurred RubyBoolean rubyBoolean = (RubyBoolean) runtime.evalScript("String.respond_to? :camelize"); assertTrue((Boolean)JavaEmbedUtils.rubyToJava(runtime, rubyBoolean, Boolean.class));
Added: trunk/core/src/test/java/org/codehaus/waffle/context/pico/RubyScriptLoaderTest.java (0 => 109)
--- trunk/core/src/test/java/org/codehaus/waffle/context/pico/RubyScriptLoaderTest.java (rev 0) +++ trunk/core/src/test/java/org/codehaus/waffle/context/pico/RubyScriptLoaderTest.java 2007-05-30 04:48:14 UTC (rev 109) @@ -0,0 +1,39 @@ +package org.codehaus.waffle.context.pico; + +import org.junit.runner.RunWith; +import org.junit.Test; +import org.jmock.integration.junit4.JMock; +import org.jmock.integration.junit4.JUnit4Mockery; +import org.jmock.Mockery; +import org.jmock.Expectations; +import org.jruby.Ruby; + +import javax.servlet.ServletContext; +import java.util.HashSet; +import java.util.Set; + [EMAIL PROTECTED](JMock.class) +public class RubyScriptLoaderTest { + private final Mockery context = new JUnit4Mockery(); + + @Test + public void startShouldFindAllResourcesAndLoadScriptsIntoRubyRuntime() { + final ServletContext servletContext = context.mock(ServletContext.class); + + context.checking(new Expectations() {{ + one (servletContext).getResourcePaths("/WEB-INF/classes/ruby"); + Set<String> paths = new HashSet<String>(); + paths.add("waffle.rb"); + will(returnValue(paths)); + + one (servletContext).getResourceAsStream("waffle.rb"); + will(returnValue(this.getClass().getClassLoader().getResourceAsStream("waffle.rb"))); // actually get it + }}); + + + Ruby runtime = Ruby.getDefaultInstance(); + + RubyScriptLoader loader = new RubyScriptLoader(servletContext, runtime); + loader.start(); + } +}
Modified: trunk/core/src/test/java/org/codehaus/waffle/registrar/pico/RubyScriptComponentAdapterTest.java (108 => 109)
--- trunk/core/src/test/java/org/codehaus/waffle/registrar/pico/RubyScriptComponentAdapterTest.java 2007-05-29 18:35:16 UTC (rev 108) +++ trunk/core/src/test/java/org/codehaus/waffle/registrar/pico/RubyScriptComponentAdapterTest.java 2007-05-30 04:48:14 UTC (rev 109) @@ -27,16 +27,14 @@ " end\n" + " end\n" + "end\n" + - "def String.camelize(param_1)\n" + - " return 'FooBar'\n" + // fake out functionality - "end\n" + "class FooBar\n" + " def execute\n" + " \"JRuby and #{$my_global}\"\n" + " end\n" + "end"; + runtime.evalScript(script); - ComponentAdapter componentAdapter = new RubyScriptComponentAdapter("foo_bar", script); + ComponentAdapter componentAdapter = new RubyScriptComponentAdapter("foo_bar", "FooBar"); MutablePicoContainer picoContainer = new DefaultPicoContainer(); picoContainer.registerComponentInstance(Ruby.class, runtime);
Modified: trunk/examples/jruby-example/src/main/java/org/codehaus/waffle/example/jruby/JRubyRegistrar.java (108 => 109)
--- trunk/examples/jruby-example/src/main/java/org/codehaus/waffle/example/jruby/JRubyRegistrar.java 2007-05-29 18:35:16 UTC (rev 108) +++ trunk/examples/jruby-example/src/main/java/org/codehaus/waffle/example/jruby/JRubyRegistrar.java 2007-05-30 04:48:14 UTC (rev 109) @@ -3,9 +3,7 @@ import org.codehaus.waffle.registrar.AbstractRegistrar; import org.codehaus.waffle.registrar.Registrar; import org.codehaus.waffle.registrar.pico.PicoRegistrar; -import org.codehaus.waffle.registrar.pico.RubyScriptComponentAdapter; import org.jruby.Ruby; -import org.picocontainer.ComponentAdapter; public class JRubyRegistrar extends AbstractRegistrar { private PicoRegistrar picoRegistrar; @@ -20,25 +18,6 @@ public void application() { registerInstance("chicago", "bears"); - String script = - "class FooBar\n" + - " def index\n" + - " request[:foo] = 'bar'\n" + - " session[:bar] = 'foo'\n" + - " p session\n" + - " begin\n" + - " \"HELLO WORLD from the index method \nlook up from pico: #{find_chicago} \nrequest: #{request} \nsession: #{session} \n#{session['waffle.session.container']} \"\n" + - " rescue Exception => e\n" + - " return e\n" + - " end\n" + - " end\n" + - " def bar\n" + - " \"HELLO WORLD #{request.local_name} #{request.local_port} \"\n" + - " end\n" + - "end\n"; - - // TODO ... update Registrar to have a "registerRubyScript(key, String)" .. and registerRubyScriptLocation(folder) - ComponentAdapter componentAdapter = new RubyScriptComponentAdapter("foo_bar", script); - picoRegistrar.registerComponentAdapter(componentAdapter); + picoRegistrar.registerRubyScript("foobar", "FooBar"); // register the controller! } }
Added: trunk/examples/jruby-example/src/main/ruby/ruby/foo_bar.rb (0 => 109)
--- trunk/examples/jruby-example/src/main/ruby/ruby/foo_bar.rb (rev 0) +++ trunk/examples/jruby-example/src/main/ruby/ruby/foo_bar.rb 2007-05-30 04:48:14 UTC (rev 109) @@ -0,0 +1,21 @@ +class FooBar + def index + request[:foo] = 'bar' + session[:bar] = 'foo' + p session + begin + <<-EOS + HELLO WORLD from the index method + look up from pico: #{find_chicago} + request: #{request} + session: #{session} + #{session['waffle.session.container']} + EOS + rescue Exception => e + return e + end + end + def bar + "HELLO WORLD #{request.local_name} #{request.local_port}" + end +end \ No newline at end of file
Modified: trunk/pom.xml (108 => 109)
--- trunk/pom.xml 2007-05-29 18:35:16 UTC (rev 108) +++ trunk/pom.xml 2007-05-30 04:48:14 UTC (rev 109) @@ -15,7 +15,7 @@ <modules> <module>skin</module> <module>core</module> - <module>extensions/webcontainer</module> + <!--<module>extensions/webcontainer</module>--> <module>extensions/taglib</module> </modules>
To unsubscribe from this list please visit:
