- 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
- trunk/jbehave-ant/
- trunk/jbehave-ant/pom.xml
- trunk/jbehave-ant/src/
- trunk/jbehave-ant/src/behaviour/
- trunk/jbehave-ant/src/behaviour/java/
- trunk/jbehave-ant/src/behaviour/java/org/
- trunk/jbehave-ant/src/behaviour/java/org/jbehave/
- trunk/jbehave-ant/src/behaviour/java/org/jbehave/ant/
- trunk/jbehave-ant/src/main/
- trunk/jbehave-ant/src/main/java/
- trunk/jbehave-ant/src/main/java/org/
- trunk/jbehave-ant/src/main/java/org/jbehave/
- trunk/jbehave-ant/src/main/java/org/jbehave/ant/
- trunk/jbehave-ant/src/main/java/org/jbehave/ant/AbstractScenarioTask.java
- trunk/jbehave-ant/src/main/java/org/jbehave/ant/ScenarioRunnerTask.java
- trunk/jbehave-core/src/behaviour/org/jbehave/scenario/ScenarioClassLoaderBehaviour.java
- trunk/jbehave-core/src/behaviour/org/jbehave/scenario/container.xml
- trunk/jbehave-core/src/java/org/jbehave/scenario/ScenarioClassLoader.java
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:
