Title: [waffle-scm] [109] trunk: ruby scripts are automatically loaded upon application startup.

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:

http://xircles.codehaus.org/manage_email

Reply via email to