Title: [958] trunk: JBEHAVE-136: Added Ant integration layer to run scenarios as task.
Revision
958
Author
mauro
Date
2008-10-01 06:03:46 -0500 (Wed, 01 Oct 2008)

Log Message

JBEHAVE-136: Added Ant integration layer to run scenarios as task.
Moved ScenarioClassLoader to core as integration-layer agnostic.

Modified Paths

Added Paths

Removed Paths

Diff

Property changes: trunk/jbehave-ant

Name: svn:ignore
   + target

Added: trunk/jbehave-ant/pom.xml (0 => 958)

--- trunk/jbehave-ant/pom.xml	                        (rev 0)
+++ trunk/jbehave-ant/pom.xml	2008-10-01 11:03:46 UTC (rev 958)
@@ -0,0 +1,28 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.jbehave</groupId>
+    <artifactId>jbehave</artifactId>
+    <version>2.1-SNAPSHOT</version>
+  </parent>
+  <artifactId>jbehave-ant</artifactId>
+  <name>JBehave Ant</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.jbehave</groupId>
+      <artifactId>jbehave-core</artifactId>
+      <version>${pom.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.ant</groupId>
+      <artifactId>ant</artifactId>
+      <scope>compile</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <sourceDirectory>src/main/java</sourceDirectory>
+    <testSourceDirectory>src/behaviour/java</testSourceDirectory>
+  </build>
+</project>

Added: trunk/jbehave-ant/src/main/java/org/jbehave/ant/AbstractScenarioTask.java (0 => 958)

--- trunk/jbehave-ant/src/main/java/org/jbehave/ant/AbstractScenarioTask.java	                        (rev 0)
+++ trunk/jbehave-ant/src/main/java/org/jbehave/ant/AbstractScenarioTask.java	2008-10-01 11:03:46 UTC (rev 958)
@@ -0,0 +1,159 @@
+package org.jbehave.ant;
+
+import static java.util.Arrays.asList;
+
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.CommandlineJava;
+import org.apache.tools.ant.types.Path;
+import org.jbehave.scenario.RunnableScenario;
+import org.jbehave.scenario.ScenarioClassLoader;
+import org.jbehave.scenario.parser.ScenarioClassNameFinder;
+
+/**
+ * Abstract task that holds all the configuration parameters to specify and load
+ * scenarios.
+ * 
+ * @author Mauro Talevi
+ */
+public abstract class AbstractScenarioTask extends Task {
+
+    private static final String TEST_SCOPE = "test";
+
+    private String sourceDirectory = "src/main/java";
+
+    private String testSourceDirectory = "src/test/java";
+
+    /**
+     * The scope of the source, either "compile" or "test"
+     */
+    private String scope = "compile";
+
+    /**
+     * Scenario class names, if specified take precedence over the names
+     * specificed via the "scenarioIncludes" and "scenarioExcludes" parameters
+     */
+    private List<String> scenarioClassNames = new ArrayList<String>();
+
+    /**
+     * Scenario include filters, relative to the root source directory
+     * determined by the scope
+     */
+    private List<String> scenarioIncludes = new ArrayList<String>();
+
+    /**
+     * Scenario exclude filters, relative to the root source directory
+     * determined by the scope
+     */
+    private List<String> scenarioExcludes = new ArrayList<String>();
+
+    /**
+     * Used to find scenario class names
+     */
+    private ScenarioClassNameFinder finder = new ScenarioClassNameFinder();
+
+    /**
+     * Determines if the scope of the source is "test"
+     * 
+     * @return A boolean <code>true</code> if test scoped
+     */
+    private boolean isTestScope() {
+        return TEST_SCOPE.equals(scope);
+    }
+
+    private String rootSourceDirectory() {
+        if (isTestScope()) {
+            return testSourceDirectory;
+        }
+        return sourceDirectory;
+    }
+
+    private List<String> findScenarioClassNames() {
+        List<String> scenarioClassNames = finder.listScenarioClassNames(rootSourceDirectory(), null, scenarioIncludes,
+                scenarioExcludes);
+        log("Found scenario class names: " + scenarioClassNames);
+        return scenarioClassNames;
+    }
+
+    /**
+     * Creates the Scenario ClassLoader with the classpath element of the
+     * selected scope
+     * 
+     * @return A ScenarioClassLoader
+     * @throws MalformedURLException
+     */
+    private ScenarioClassLoader createScenarioClassLoader() throws MalformedURLException {
+        return new ScenarioClassLoader(classpathElements());
+    }
+
+    private List<String> classpathElements() {
+        CommandlineJava commandLine = new CommandlineJava();
+        Path path = commandLine.createClasspath(getProject()).createPath();
+        List<String> classpathElements = asList(path.list());
+        log("Created classpath with elements "+classpathElements);
+        return classpathElements;
+    }
+
+    /**
+     * Returns the list of scenario instances, whose class names are either
+     * specified via the parameter "scenarioClassNames" (which takes precedence)
+     * or found using the parameters "scenarioIncludes" and "scenarioExcludes".
+     * 
+     * @return A List of Scenarios
+     * @throws BuildException
+     */
+    protected List<RunnableScenario> scenarios() throws BuildException {
+        List<String> names = scenarioClassNames;
+        if (names == null || names.isEmpty()) {
+            names = findScenarioClassNames();
+        }
+        if (names.isEmpty()) {
+            log("No scenarios to run.");
+        }
+        ScenarioClassLoader classLoader = null;
+        try {
+            classLoader = createScenarioClassLoader();
+        } catch (Exception e) {
+            throw new BuildException("Failed to create scenario class loader", e);
+        }
+        List<RunnableScenario> scenarios = new ArrayList<RunnableScenario>();
+        for (String name : names) {
+            try {
+                scenarios.add(classLoader.newScenario(name));
+            } catch (Exception e) {
+                throw new BuildException("Failed to instantiate scenario '" + name + "'", e);
+            }
+        }
+        return scenarios;
+    }
+
+    // Setters used by Task to inject dependencies
+    public void setSourceDirectory(String sourceDirectory) {
+        this.sourceDirectory = sourceDirectory;
+    }
+
+    public void setTestSourceDirectory(String testSourceDirectory) {
+        this.testSourceDirectory = testSourceDirectory;
+    }
+
+    public void setScope(String scope) {
+        this.scope = scope;
+    }
+
+    public void setScenarioClassNames(List<String> scenarioClassNames) {
+        this.scenarioClassNames = scenarioClassNames;
+    }
+
+    public void setScenarioIncludes(List<String> scenarioIncludes) {
+        this.scenarioIncludes = scenarioIncludes;
+    }
+
+    public void setScenarioExcludes(List<String> scenarioExcludes) {
+        this.scenarioExcludes = scenarioExcludes;
+    }
+
+}

Added: trunk/jbehave-ant/src/main/java/org/jbehave/ant/ScenarioRunnerTask.java (0 => 958)

--- trunk/jbehave-ant/src/main/java/org/jbehave/ant/ScenarioRunnerTask.java	                        (rev 0)
+++ trunk/jbehave-ant/src/main/java/org/jbehave/ant/ScenarioRunnerTask.java	2008-10-01 11:03:46 UTC (rev 958)
@@ -0,0 +1,26 @@
+package org.jbehave.ant;
+
+import org.apache.tools.ant.BuildException;
+import org.jbehave.scenario.RunnableScenario;
+
+/**
+ * Ant task that runs scenarios
+ * 
+ * @author Mauro Talevi
+ */
+public class ScenarioRunnerTask extends AbstractScenarioTask {
+
+    public void execute() throws BuildException {
+        for (RunnableScenario scenario : scenarios()) {
+            try {
+                log("Running scenario " + scenario.getClass().getName());
+                scenario.runScenario();
+            } catch (Throwable e) {
+                throw new BuildException("Failed to run scenario " + scenario.getClass().getName(), e);
+            }
+        }
+ 
+    }
+
+        
+}

Copied: trunk/jbehave-core/src/behaviour/org/jbehave/scenario/ScenarioClassLoaderBehaviour.java (from rev 949, trunk/jbehave-maven-plugin/src/behaviour/java/org/jbehave/mojo/ScenarioClassLoaderBehaviour.java) (0 => 958)

--- trunk/jbehave-core/src/behaviour/org/jbehave/scenario/ScenarioClassLoaderBehaviour.java	                        (rev 0)
+++ trunk/jbehave-core/src/behaviour/org/jbehave/scenario/ScenarioClassLoaderBehaviour.java	2008-10-01 11:03:46 UTC (rev 958)
@@ -0,0 +1,53 @@
+package org.jbehave.scenario;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.net.MalformedURLException;
+import java.util.Arrays;
+import java.util.List;
+
+import org.jbehave.container.pico.XMLPicoContainer;
+import org.junit.Test;
+
+public class ScenarioClassLoaderBehaviour {
+
+    @Test
+    public void canInstantiateNewScenario() throws MalformedURLException {
+        List<String> elements = Arrays.asList();
+        ScenarioClassLoader classLoader = new ScenarioClassLoader(elements);
+        String scenarioClassName = MyScenario.class.getName();
+        assertScenarioIsInstantiated(classLoader, scenarioClassName);
+    }
+
+    @Test
+    public void canInstantiateNewContainerScenario() throws MalformedURLException {
+        List<String> elements = Arrays.asList();
+        ClassLoader parent = Thread.currentThread().getContextClassLoader();
+        ScenarioClassLoader classLoader = new ScenarioClassLoader(elements, parent);
+        String scenarioClassName = MyContainerScenario.class.getName();
+        assertScenarioIsInstantiated(classLoader, scenarioClassName);
+    }
+
+    
+    private void assertScenarioIsInstantiated(ScenarioClassLoader classLoader, String scenarioClassName) {
+        RunnableScenario scenario = classLoader.newScenario(scenarioClassName);
+        assertNotNull(scenario);
+        assertEquals(scenarioClassName, scenario.getClass().getName());
+    }
+
+    private static class MyScenario extends JUnitScenario {
+
+        public MyScenario(ClassLoader classLoader){
+            
+        }
+    }
+
+    private static class MyContainerScenario extends JUnitScenario {
+
+        public MyContainerScenario(ClassLoader classLoader){
+            new XMLPicoContainer("org/jbehave/scenario/container.xml");
+        }
+    }
+
+}

Property changes: trunk/jbehave-core/src/behaviour/org/jbehave/scenario/ScenarioClassLoaderBehaviour.java

Name: svn:mergeinfo
   + 

Copied: trunk/jbehave-core/src/behaviour/org/jbehave/scenario/container.xml (from rev 949, trunk/jbehave-maven-plugin/src/behaviour/java/org/jbehave/mojo/container.xml) (0 => 958)

--- trunk/jbehave-core/src/behaviour/org/jbehave/scenario/container.xml	                        (rev 0)
+++ trunk/jbehave-core/src/behaviour/org/jbehave/scenario/container.xml	2008-10-01 11:03:46 UTC (rev 958)
@@ -0,0 +1 @@
+<container/>
\ No newline at end of file

Property changes: trunk/jbehave-core/src/behaviour/org/jbehave/scenario/container.xml

Name: svn:mergeinfo
   + 

Copied: trunk/jbehave-core/src/java/org/jbehave/scenario/ScenarioClassLoader.java (from rev 949, trunk/jbehave-maven-plugin/src/main/java/org/jbehave/mojo/ScenarioClassLoader.java) (0 => 958)

--- trunk/jbehave-core/src/java/org/jbehave/scenario/ScenarioClassLoader.java	                        (rev 0)
+++ trunk/jbehave-core/src/java/org/jbehave/scenario/ScenarioClassLoader.java	2008-10-01 11:03:46 UTC (rev 958)
@@ -0,0 +1,84 @@
+package org.jbehave.scenario;
+
+import java.io.File;
+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.
+ * 
+ * @author Mauro Talevi
+ */
+public class ScenarioClassLoader extends URLClassLoader {
+
+    public ScenarioClassLoader(List<String> classpathElements) throws MalformedURLException {
+        super(classpathURLs(classpathElements), RunnableScenario.class.getClassLoader());
+    }
+
+    public ScenarioClassLoader(List<String> classpathElements, ClassLoader parent) throws MalformedURLException {
+        super(classpathURLs(classpathElements), parent);
+    }
+
+    /**
+     * Loads and instantiates a runnable scenario class
+     * 
+     * @param scenarioClassName the name of the scenario class
+     * @return A RunnableScenario instance
+     */
+    public RunnableScenario newScenario(String scenarioClassName) {
+        try {
+            RunnableScenario scenario = (RunnableScenario) loadClass(scenarioClassName, true).getConstructor(ClassLoader.class)
+                    .newInstance(this);
+            Thread.currentThread().setContextClassLoader(this);
+            return scenario;
+        } catch (ClassCastException e) {
+            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;
+            throw new RuntimeException(message, e);
+        }
+    }
+
+    private List<String> asShortPaths(URL[] urls) {
+        List<String> names = new ArrayList<String>();
+        for (URL url : urls) {
+            String path = url.getPath();
+            if (isJar(path)) {
+                names.add(shortPath(path));
+            } else {
+                names.add(path);
+            }
+        }
+        return names;
+    }
+
+    private static String shortPath(String path) {
+        return path.substring(path.lastIndexOf("/") + 1);
+    }
+
+    private static boolean isJar(String path) {
+        return path.endsWith(".jar");
+    }
+
+    private static URL[] classpathURLs(List<String> elements) throws MalformedURLException {
+        List<URL> urls = new ArrayList<URL>();
+        if (elements != null) {
+            for (String element : elements) {
+                urls.add(new File(element).toURL());
+            }
+        }
+        return urls.toArray(new URL[urls.size()]);
+    }
+
+    @Override
+    public String toString() {
+        return "[" + ScenarioClassLoader.class.getName() + " urls=" + asShortPaths(getURLs()) + "]";
+    }
+}

Property changes: trunk/jbehave-core/src/java/org/jbehave/scenario/ScenarioClassLoader.java

Name: svn:mergeinfo
   + 

Deleted: trunk/jbehave-maven-plugin/src/behaviour/java/org/jbehave/mojo/ScenarioClassLoaderBehaviour.java (957 => 958)

--- trunk/jbehave-maven-plugin/src/behaviour/java/org/jbehave/mojo/ScenarioClassLoaderBehaviour.java	2008-09-29 11:13:19 UTC (rev 957)
+++ trunk/jbehave-maven-plugin/src/behaviour/java/org/jbehave/mojo/ScenarioClassLoaderBehaviour.java	2008-10-01 11:03:46 UTC (rev 958)
@@ -1,55 +0,0 @@
-package org.jbehave.mojo;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-import java.net.MalformedURLException;
-import java.util.Arrays;
-import java.util.List;
-
-import org.jbehave.container.pico.XMLPicoContainer;
-import org.jbehave.scenario.JUnitScenario;
-import org.jbehave.scenario.RunnableScenario;
-import org.junit.Test;
-
-public class ScenarioClassLoaderBehaviour {
-
-    @Test
-    public void canInstantiateNewScenario() throws MalformedURLException {
-        List<String> elements = Arrays.asList();
-        ScenarioClassLoader classLoader = new ScenarioClassLoader(elements);
-        String scenarioClassName = MyScenario.class.getName();
-        assertScenarioIsInstantiated(classLoader, scenarioClassName);
-    }
-
-    //[EMAIL PROTECTED]
-    public void canInstantiateNewContainerScenario() throws MalformedURLException {
-        List<String> elements = Arrays.asList();
-        ClassLoader parent = Thread.currentThread().getContextClassLoader();
-        ScenarioClassLoader classLoader = new ScenarioClassLoader(elements, parent);
-        String scenarioClassName = MyContainerScenario.class.getName();
-        assertScenarioIsInstantiated(classLoader, scenarioClassName);
-    }
-
-    
-    private void assertScenarioIsInstantiated(ScenarioClassLoader classLoader, String scenarioClassName) {
-        RunnableScenario scenario = classLoader.newScenario(scenarioClassName);
-        assertNotNull(scenario);
-        assertEquals(scenarioClassName, scenario.getClass().getName());
-    }
-
-    private static class MyScenario extends JUnitScenario {
-
-        public MyScenario(ClassLoader classLoader){
-            
-        }
-    }
-
-    private static class MyContainerScenario extends JUnitScenario {
-
-        public MyContainerScenario(ClassLoader classLoader){
-            new XMLPicoContainer("org/jbehave/mojo/container.xml");
-        }
-    }
-
-}

Deleted: trunk/jbehave-maven-plugin/src/behaviour/java/org/jbehave/mojo/container.xml (957 => 958)

--- trunk/jbehave-maven-plugin/src/behaviour/java/org/jbehave/mojo/container.xml	2008-09-29 11:13:19 UTC (rev 957)
+++ trunk/jbehave-maven-plugin/src/behaviour/java/org/jbehave/mojo/container.xml	2008-10-01 11:03:46 UTC (rev 958)
@@ -1 +0,0 @@
-<container/>
\ No newline at end of file

Modified: trunk/jbehave-maven-plugin/src/main/java/org/jbehave/mojo/AbstractScenarioMojo.java (957 => 958)

--- trunk/jbehave-maven-plugin/src/main/java/org/jbehave/mojo/AbstractScenarioMojo.java	2008-09-29 11:13:19 UTC (rev 957)
+++ trunk/jbehave-maven-plugin/src/main/java/org/jbehave/mojo/AbstractScenarioMojo.java	2008-10-01 11:03:46 UTC (rev 958)
@@ -7,6 +7,7 @@
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.jbehave.scenario.RunnableScenario;
+import org.jbehave.scenario.ScenarioClassLoader;
 import org.jbehave.scenario.parser.ScenarioClassNameFinder;
 
 /**
@@ -34,24 +35,6 @@
     private String testSourceDirectory;
 
     /**
-     * Compile classpath.
-     * 
-     * @parameter _expression_="${project.compileClasspathElements}"
-     * @required
-     * @readonly
-     */
-    private List<String> compileClasspathElements;
-
-    /**
-     * Test classpath.
-     * 
-     * @parameter _expression_="${project.testClasspathElements}"
-     * @required
-     * @readonly
-     */
-    private List<String> testClasspathElements;
-
-    /**
      * The scope of the mojo classpath, either "compile" or "test"
      * 
      * @parameter default-value="compile"
@@ -83,6 +66,24 @@
     private List<String> scenarioExcludes;
 
     /**
+     * Compile classpath.
+     * 
+     * @parameter _expression_="${project.compileClasspathElements}"
+     * @required
+     * @readonly
+     */
+    private List<String> compileClasspathElements;
+
+    /**
+     * Test classpath.
+     * 
+     * @parameter _expression_="${project.testClasspathElements}"
+     * @required
+     * @readonly
+     */
+    private List<String> testClasspathElements;
+
+    /**
      * Used to find scenario class names
      */
     private ScenarioClassNameFinder finder = new ScenarioClassNameFinder();
@@ -118,11 +119,15 @@
      * @throws MalformedURLException
      */
     private ScenarioClassLoader createScenarioClassLoader() throws MalformedURLException {
+        return new ScenarioClassLoader(classpathElements());
+    }
+
+    private List<String> classpathElements() {
         List<String> classpathElements = compileClasspathElements;
         if (isTestScope()) {
             classpathElements = testClasspathElements;
         }
-        return new ScenarioClassLoader(classpathElements);
+        return classpathElements;
     }
 
     /**

Deleted: trunk/jbehave-maven-plugin/src/main/java/org/jbehave/mojo/ScenarioClassLoader.java (957 => 958)

--- trunk/jbehave-maven-plugin/src/main/java/org/jbehave/mojo/ScenarioClassLoader.java	2008-09-29 11:13:19 UTC (rev 957)
+++ trunk/jbehave-maven-plugin/src/main/java/org/jbehave/mojo/ScenarioClassLoader.java	2008-10-01 11:03:46 UTC (rev 958)
@@ -1,85 +0,0 @@
-package org.jbehave.mojo;
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.jbehave.scenario.RunnableScenario;
-
-/**
- * Extends URLClassLoader to instantiate Scenarios.
- * 
- * @author Mauro Talevi
- */
-public class ScenarioClassLoader extends URLClassLoader {
-
-    public ScenarioClassLoader(List<String> classpathElements) throws MalformedURLException {
-        super(classpathURLs(classpathElements), RunnableScenario.class.getClassLoader());
-    }
-
-    public ScenarioClassLoader(List<String> classpathElements, ClassLoader parent) throws MalformedURLException {
-        super(classpathURLs(classpathElements), parent);
-    }
-
-    /**
-     * Loads and instantiates a Scenario class
-     * 
-     * @param scenarioClassName the name of the Scenario class
-     * @return A Scenario instance
-     */
-    public RunnableScenario newScenario(String scenarioClassName) {
-        try {
-            RunnableScenario scenario = (RunnableScenario) loadClass(scenarioClassName, true).getConstructor(ClassLoader.class)
-                    .newInstance(this);
-            Thread.currentThread().setContextClassLoader(this);
-            return scenario;
-        } catch (ClassCastException e) {
-            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;
-            throw new RuntimeException(message, e);
-        }
-    }
-
-    private List<String> asShortPaths(URL[] urls) {
-        List<String> names = new ArrayList<String>();
-        for (URL url : urls) {
-            String path = url.getPath();
-            if (isJar(path)) {
-                names.add(shortPath(path));
-            } else {
-                names.add(path);
-            }
-        }
-        return names;
-    }
-
-    private static String shortPath(String path) {
-        return path.substring(path.lastIndexOf("/") + 1);
-    }
-
-    private static boolean isJar(String path) {
-        return path.endsWith(".jar");
-    }
-
-    private static URL[] classpathURLs(List<String> elements) throws MalformedURLException {
-        List<URL> urls = new ArrayList<URL>();
-        if (elements != null) {
-            for (String element : elements) {
-                urls.add(new File(element).toURL());
-            }
-        }
-        return urls.toArray(new URL[urls.size()]);
-    }
-
-    @Override
-    public String toString() {
-        return "[" + ScenarioClassLoader.class.getName() + " urls=" + asShortPaths(getURLs()) + "]";
-    }
-}

Modified: trunk/pom.xml (957 => 958)

--- trunk/pom.xml	2008-09-29 11:13:19 UTC (rev 957)
+++ trunk/pom.xml	2008-10-01 11:03:46 UTC (rev 958)
@@ -12,6 +12,7 @@
 
   <modules>
     <module>jbehave-core</module>
+    <module>jbehave-ant</module>
     <module>jbehave-maven-plugin</module>
   </modules>
 


To unsubscribe from this list please visit:

http://xircles.codehaus.org/manage_email

Reply via email to