- Revision
- 1378
- Author
- mauro
- Date
- 2009-11-01 08:11:09 -0600 (Sun, 01 Nov 2009)
Log Message
JBEHAVE-199: Refactored ScenarioClassLoader to support instantiation of scenario classes with injectable parameter types, also allowing the instantiation via default constructor.
Modified Paths
- trunk/core/examples/trader/pom.xml
- trunk/core/jbehave-ant/src/main/java/org/jbehave/ant/AbstractScenarioTask.java
- trunk/core/jbehave-core/src/behaviour/org/jbehave/scenario/ScenarioClassLoaderBehaviour.java
- trunk/core/jbehave-core/src/java/org/jbehave/scenario/ScenarioClassLoader.java
- trunk/core/jbehave-maven-plugin/src/main/java/org/jbehave/mojo/AbstractScenarioMojo.java
Diff
Modified: trunk/core/examples/trader/pom.xml (1377 => 1378)
--- trunk/core/examples/trader/pom.xml 2009-10-31 16:24:18 UTC (rev 1377) +++ trunk/core/examples/trader/pom.xml 2009-11-01 14:11:09 UTC (rev 1378) @@ -73,7 +73,7 @@ classname="org.jbehave.ant.ScenarioRunnerTask" classpathref="maven.runtime.classpath" /> <scenarioRunner - scenarioIncludes="org/jbehave/examples/trader/scenarios/*.java" + scenarioIncludes="**/scenarios/*.java" scenarioExcludes="**/*Steps.java" skip="${skip.ant.scenarios}" /> </tasks> </configuration> @@ -88,7 +88,7 @@ <tasks> <taskdef name="stepdoc" classname="org.jbehave.ant.StepdocTask" classpathref="maven.runtime.classpath" /> - <stepdoc scenarioIncludes="org/jbehave/examples/trader/scenarios/*.java" + <stepdoc scenarioIncludes="**/scenarios/*.java" scenarioExcludes="**/*Steps.java" skip="${skip.ant.stepdoc}" /> </tasks> </configuration>
Modified: trunk/core/jbehave-ant/src/main/java/org/jbehave/ant/AbstractScenarioTask.java (1377 => 1378)
--- trunk/core/jbehave-ant/src/main/java/org/jbehave/ant/AbstractScenarioTask.java 2009-10-31 16:24:18 UTC (rev 1377) +++ trunk/core/jbehave-ant/src/main/java/org/jbehave/ant/AbstractScenarioTask.java 2009-11-01 14:11:09 UTC (rev 1378) @@ -1,6 +1,7 @@ package org.jbehave.ant; import static java.util.Arrays.asList; +import static org.apache.tools.ant.Project.MSG_DEBUG; import static org.apache.tools.ant.Project.MSG_INFO; import java.net.MalformedURLException; @@ -72,9 +73,10 @@ } private List<String> findScenarioClassNames() { + log("Searching for scenario class names including "+scenarioIncludes+" and excluding "+scenarioExcludes, MSG_DEBUG); List<String> scenarioClassNames = finder.listScenarioClassNames(rootSourceDirectory(), null, scenarioIncludes, scenarioExcludes); - log("Found scenario class names: " + scenarioClassNames); + log("Found scenario class names: " + scenarioClassNames, MSG_DEBUG); return scenarioClassNames; } @@ -119,7 +121,7 @@ List<RunnableScenario> scenarios = new ArrayList<RunnableScenario>(); for (String name : names) { try { - scenarios.add(classLoader.newScenario(name)); + scenarios.add(classLoader.newScenario(name, ClassLoader.class)); } catch (Exception e) { throw new BuildException("Failed to instantiate scenario '" + name + "'", e); }
Modified: trunk/core/jbehave-core/src/behaviour/org/jbehave/scenario/ScenarioClassLoaderBehaviour.java (1377 => 1378)
--- trunk/core/jbehave-core/src/behaviour/org/jbehave/scenario/ScenarioClassLoaderBehaviour.java 2009-10-31 16:24:18 UTC (rev 1377) +++ trunk/core/jbehave-core/src/behaviour/org/jbehave/scenario/ScenarioClassLoaderBehaviour.java 2009-11-01 14:11:09 UTC (rev 1378) @@ -5,21 +5,26 @@ import java.net.MalformedURLException; import java.util.Arrays; -import java.util.List; import org.junit.Test; public class ScenarioClassLoaderBehaviour { @Test - public void canInstantiateNewScenario() throws MalformedURLException { - List<String> elements = Arrays.asList(); - ScenarioClassLoader classLoader = new ScenarioClassLoader(elements); + public void canInstantiateNewScenarioWithDefaultConstructor() throws MalformedURLException { + ScenarioClassLoader classLoader = new ScenarioClassLoader(Arrays.<String>asList()); String scenarioClassName = MyScenario.class.getName(); assertScenarioIsInstantiated(classLoader, scenarioClassName); } - - private void assertScenarioIsInstantiated(ScenarioClassLoader classLoader, String scenarioClassName) { + + @Test + public void canInstantiateNewScenarioWithClassLoader() throws MalformedURLException { + ScenarioClassLoader classLoader = new ScenarioClassLoader(Arrays.<String>asList()); + String scenarioClassName = MyScenario.class.getName(); + assertScenarioIsInstantiated(classLoader, scenarioClassName, ClassLoader.class); + } + + private void assertScenarioIsInstantiated(ScenarioClassLoader classLoader, String scenarioClassName, Class<?>... parameterTypes) { RunnableScenario scenario = classLoader.newScenario(scenarioClassName); assertNotNull(scenario); assertEquals(scenarioClassName, scenario.getClass().getName()); @@ -27,6 +32,10 @@ private static class MyScenario extends JUnitScenario { + public MyScenario(){ + + } + public MyScenario(ClassLoader classLoader){ }
Modified: trunk/core/jbehave-core/src/java/org/jbehave/scenario/ScenarioClassLoader.java (1377 => 1378)
--- trunk/core/jbehave-core/src/java/org/jbehave/scenario/ScenarioClassLoader.java 2009-10-31 16:24:18 UTC (rev 1377) +++ trunk/core/jbehave-core/src/java/org/jbehave/scenario/ScenarioClassLoader.java 2009-11-01 14:11:09 UTC (rev 1378) @@ -1,13 +1,16 @@ package org.jbehave.scenario; +import static java.util.Arrays.asList; + import java.io.File; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.List; - /** * Extends URLClassLoader to instantiate scenarios. * @@ -27,25 +30,36 @@ * Loads and instantiates a runnable scenario class * * @param scenarioClassName the name of the scenario class + * @param parameterTypes the types of the constructor used to instantiate + * scenario class * @return A RunnableScenario instance */ - public RunnableScenario newScenario(String scenarioClassName) { + public RunnableScenario newScenario(String scenarioClassName, Class<?>... parameterTypes) { try { - RunnableScenario scenario = (RunnableScenario) loadClass(scenarioClassName, true).getConstructor(ClassLoader.class) - .newInstance(this); + Class<?> scenarioClass = loadClass(scenarioClassName, true); + RunnableScenario scenario = newInstance(scenarioClass, parameterTypes); Thread.currentThread().setContextClassLoader(this); return scenario; } catch (ClassCastException e) { - String message = "The scenario '" + scenarioClassName + "' must be of type '" + RunnableScenario.class.getName() - + "'"; + String message = "The scenario '" + scenarioClassName + "' must be of type '" + + RunnableScenario.class.getName() + "'"; throw new RuntimeException(message, e); } catch (Exception e) { - String message = "The scenario '" + scenarioClassName + "' could not be instantiated with class loader: " - + this; + String message = "The scenario '" + scenarioClassName + "' could not be instantiated with parameter types '" + + asList(parameterTypes) + "' and class loader '" + this + "'"; throw new RuntimeException(message, e); } } + private RunnableScenario newInstance(Class<?> scenarioClass, Class<?>... parameterTypes) + throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { + if ( parameterTypes != null && parameterTypes.length > 0 ){ + Constructor<?> constructor = scenarioClass.getConstructor(parameterTypes); + return (RunnableScenario) constructor.newInstance(this); + } + return (RunnableScenario) scenarioClass.newInstance(); + } + private List<String> asShortPaths(URL[] urls) { List<String> names = new ArrayList<String>(); for (URL url : urls) {
Modified: trunk/core/jbehave-maven-plugin/src/main/java/org/jbehave/mojo/AbstractScenarioMojo.java (1377 => 1378)
--- trunk/core/jbehave-maven-plugin/src/main/java/org/jbehave/mojo/AbstractScenarioMojo.java 2009-10-31 16:24:18 UTC (rev 1377) +++ trunk/core/jbehave-maven-plugin/src/main/java/org/jbehave/mojo/AbstractScenarioMojo.java 2009-11-01 14:11:09 UTC (rev 1378) @@ -105,6 +105,7 @@ } private List<String> findScenarioClassNames() { + getLog().debug("Searching for scenario class names including "+scenarioIncludes+" and excluding "+scenarioExcludes); List<String> scenarioClassNames = finder.listScenarioClassNames(rootSourceDirectory(), null, scenarioIncludes, scenarioExcludes); getLog().debug("Found scenario class names: " + scenarioClassNames); @@ -155,7 +156,7 @@ List<RunnableScenario> scenarios = new ArrayList<RunnableScenario>(); for (String name : names) { try { - scenarios.add(classLoader.newScenario(name)); + scenarios.add(classLoader.newScenario(name, ClassLoader.class)); } catch (Exception e) { throw new MojoExecutionException("Failed to instantiate scenario '" + name + "'", e); }
To unsubscribe from this list please visit:
