- 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
- trunk/waffle-ruby/src/main/java/org/codehaus/waffle/context/pico/RubyScriptLoader.java
- trunk/waffle-ruby/src/test/java/org/codehaus/waffle/context/pico/RubyScriptLoaderTest.java
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:
