Title: [1378] trunk/core/examples/trader: JBEHAVE-199: Refactored ScenarioClassLoader to support instantiation of scenario classes with injectable parameter types, also allowing the instantiation via default constructor.
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

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:

http://xircles.codehaus.org/manage_email

Reply via email to