Title: [waffle-scm] [808] trunk/waffle-ruby/src/test/java/org/codehaus/waffle/context/pico: Allow ruby script dir to be specified via env variable.
Revision
808
Author
mauro
Date
2008-09-03 09:44:45 -0500 (Wed, 03 Sep 2008)

Log Message

Allow ruby script dir to be specified via env variable.

Modified Paths


Diff

Modified: trunk/waffle-ruby/src/main/java/org/codehaus/waffle/context/pico/RubyScriptLoader.java (807 => 808)

--- trunk/waffle-ruby/src/main/java/org/codehaus/waffle/context/pico/RubyScriptLoader.java	2008-09-03 13:26:21 UTC (rev 807)
+++ trunk/waffle-ruby/src/main/java/org/codehaus/waffle/context/pico/RubyScriptLoader.java	2008-09-03 14:44:45 UTC (rev 808)
@@ -3,6 +3,8 @@
  */
 package org.codehaus.waffle.context.pico;
 
+import static java.text.MessageFormat.format;
+
 import javax.servlet.ServletContext;
 
 import org.codehaus.waffle.Startable;
@@ -10,9 +12,19 @@
 import org.jruby.javasupport.JavaEmbedUtils;
 import org.jruby.runtime.builtin.IRubyObject;
 
+/**
+ * Loads ruby scripts at startup. The script path can be defined either explicitly, via the
+ * [EMAIL PROTECTED] #RUBY_SCRIPT_PATH_KEY} context param key, or via an env variable using the [EMAIL PROTECTED] #RUBY_SCRIPT_ENV_KEY}
+ * context param key.  The [EMAIL PROTECTED] #RUBY_SCRIPT_PATH_KEY} takes precendence over the [EMAIL PROTECTED] #RUBY_SCRIPT_ENV_KEY}.
+ * 
+ * @author Micheal Ward
+ * @author Mauro Talevi
+ */
 public class RubyScriptLoader implements Startable {
+    public static final String DEFAULT_RUBY_SCRIPT_PATH = "/WEB-INF/classes/ruby/";
     public static final String RUBY_SCRIPT_PATH_KEY = "org.codehaus.waffle.ruby.path";
-    public static final String DEFAULT_RUBY_SCRIPT_PATH = "/WEB-INF/classes/ruby/";
+    public static final String RUBY_SCRIPT_ENV_KEY = "org.codehaus.waffle.ruby.env";
+    public static final String RUBY_SCRIPT_ENV_PATH_FORMAT = "dir:{0}";
 
     private final ServletContext servletContext;
     private final Ruby runtime;
@@ -24,14 +36,28 @@
         this.rubyScriptPath = getScriptPath(servletContext);
     }
 
-    private String getScriptPath(ServletContext servletContext) {
+    String getScriptPath(ServletContext servletContext) {
         String path = servletContext.getInitParameter(RUBY_SCRIPT_PATH_KEY);
         if (path == null) {
-            return DEFAULT_RUBY_SCRIPT_PATH;
+            // path not defined, look for env
+            String env = getScriptEnv(servletContext);
+            if (env == null) {
+                // env not defined, return default
+                return DEFAULT_RUBY_SCRIPT_PATH;
+            }
+            path = format(RUBY_SCRIPT_ENV_PATH_FORMAT, env);
         }
         return path;
     }
 
+    private String getScriptEnv(ServletContext servletContext) {
+        String name = servletContext.getInitParameter(RUBY_SCRIPT_ENV_KEY);
+        if ( name == null ){
+            return null;
+        }
+        return System.getenv(name);
+    }
+
     public void start() {
         runtime.getClassFromPath("Waffle::ScriptLoader").callMethod(
                 runtime.getCurrentContext(),

Modified: trunk/waffle-ruby/src/test/java/org/codehaus/waffle/context/pico/RubyScriptLoaderTest.java (807 => 808)

--- trunk/waffle-ruby/src/test/java/org/codehaus/waffle/context/pico/RubyScriptLoaderTest.java	2008-09-03 13:26:21 UTC (rev 807)
+++ trunk/waffle-ruby/src/test/java/org/codehaus/waffle/context/pico/RubyScriptLoaderTest.java	2008-09-03 14:44:45 UTC (rev 808)
@@ -1,28 +1,46 @@
 package org.codehaus.waffle.context.pico;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import javax.servlet.ServletContext;
+
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.jmock.integration.junit4.JMock;
 import org.jruby.Ruby;
 import org.jruby.javasupport.JavaUtil;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import javax.servlet.ServletContext;
-
 @RunWith(JMock.class)
 public class RubyScriptLoaderTest {
-    private final Mockery context = new Mockery();
+    private final Mockery mockery = new Mockery();
 
     @Test
-    public void startShouldFindAllResourcesAndLoadScriptsIntoRubyRuntime() {
-        final ServletContext servletContext = context.mock(ServletContext.class);
+    public void canLoadScriptsFromDefaultPathIntoRubyRuntime() {
+        assertScriptPath(null, null, RubyScriptLoader.DEFAULT_RUBY_SCRIPT_PATH);
+    }
 
-        context.checking(new Expectations() {{
-            one (servletContext).getInitParameter(RubyScriptLoader.RUBY_SCRIPT_PATH_KEY);
-            will(returnValue(null));
+    @Test
+    public void canLoadScriptsFromScriptPathIntoRubyRuntime() {
+        assertScriptPath("dir:/some/script/path", null, "dir:/some/script/path");
+    }
+
+    @Test
+    public void canLoadScriptsFromScriptEnvIntoRubyRuntime() {
+        String home = System.getenv("HOME");
+        assertScriptPath(null, "HOME", "dir:"+home);
+    }
+
+    private void assertScriptPath(final String rubyScriptPath, final String rubyScriptEnv, String expectedPath) {
+
+        final ServletContext servletContext = mockery.mock(ServletContext.class);
+        mockery.checking(new Expectations() {{
+            allowing (servletContext).getInitParameter(RubyScriptLoader.RUBY_SCRIPT_PATH_KEY);
+            will(returnValue(rubyScriptPath));
+            allowing (servletContext).getInitParameter(RubyScriptLoader.RUBY_SCRIPT_ENV_KEY);
+            will(returnValue(rubyScriptEnv));
         }});
 
         String script =
@@ -42,7 +60,8 @@
         loader.start();
 
         // Ensure Waffle::ScriptLoader.load_all was called
-        assertEquals("/WEB-INF/classes/ruby/", JavaUtil.convertRubyToJava(runtime.evalScriptlet("$arg1")));
+        assertEquals(expectedPath, JavaUtil.convertRubyToJava(runtime.evalScriptlet("$arg1")));
         assertNotNull(runtime.evalScriptlet("$arg2"));
     }
+
 }


To unsubscribe from this list please visit:

http://xircles.codehaus.org/manage_email

Reply via email to