- Revision
- 800
- Author
- mauro
- Date
- 2007-10-14 08:47:53 -0500 (Sun, 14 Oct 2007)
Log Message
Added StoryCodeGeneratorTask. Renamed AbstractRunnerTask to AbstractStoryTask.
Modified Paths
- trunk/core/src/java/org/jbehave/core/story/codegen/velocity/VelocityCodeGenerator.java
- trunk/extensions/ant/src/behaviour/org/jbehave/ant/AllBehaviours.java
- trunk/extensions/ant/src/behaviour/org/jbehave/ant/BehaviourRunnerTaskBehaviour.java
- trunk/extensions/ant/src/behaviour/org/jbehave/ant/StoryRunnerTaskBehaviour.java
- trunk/extensions/ant/src/java/org/jbehave/ant/BehaviourRunnerTask.java
- trunk/extensions/ant/src/java/org/jbehave/ant/FilesetParser.java
- trunk/extensions/ant/src/java/org/jbehave/ant/StoryPrinterTask.java
- trunk/extensions/ant/src/java/org/jbehave/ant/StoryRunnerTask.java
- trunk/extensions/ant/src/java/org/jbehave/ant/TrimFilesetParser.java
Added Paths
- trunk/extensions/ant/src/behaviour/org/jbehave/ant/StoryCodeGeneratorTaskBehaviour.java
- trunk/extensions/ant/src/java/org/jbehave/ant/AbstractStoryTask.java
- trunk/extensions/ant/src/java/org/jbehave/ant/StoryCodeGeneratorTask.java
Removed Paths
Diff
Modified: trunk/core/src/java/org/jbehave/core/story/codegen/velocity/VelocityCodeGenerator.java (799 => 800)
--- trunk/core/src/java/org/jbehave/core/story/codegen/velocity/VelocityCodeGenerator.java 2007-09-10 12:26:11 UTC (rev 799) +++ trunk/core/src/java/org/jbehave/core/story/codegen/velocity/VelocityCodeGenerator.java 2007-10-14 13:47:53 UTC (rev 800) @@ -16,9 +16,11 @@ import org.apache.velocity.VelocityContext; import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader; +import org.jbehave.core.story.StoryLoader; import org.jbehave.core.story.codegen.CodeGenerator; import org.jbehave.core.story.codegen.domain.ScenarioDetails; import org.jbehave.core.story.codegen.domain.StoryDetails; +import org.jbehave.core.story.codegen.parser.TextStoryParser; import org.jbehave.core.story.domain.Narrative; import org.jbehave.core.util.CamelCaseConverter; @@ -180,4 +182,15 @@ super(message, cause); } } + + public static void main(String[] args) { + if ( args.length < 2 ) { + throw new IllegalArgumentException("VelocityCodeGenerator usage: <generatedSourceDirectory> <storyPaths>"); + } + VelocityCodeGenerator generator = new VelocityCodeGenerator(args[0]); + StoryLoader loader = new StoryLoader(new TextStoryParser(), VelocityCodeGenerator.class.getClassLoader()); + for (int i = 1; i < args.length; i++) { + generator.generateStory(loader.loadStoryDetails(args[i])); + } + } }
Modified: trunk/extensions/ant/src/behaviour/org/jbehave/ant/AllBehaviours.java (799 => 800)
--- trunk/extensions/ant/src/behaviour/org/jbehave/ant/AllBehaviours.java 2007-09-10 12:26:11 UTC (rev 799) +++ trunk/extensions/ant/src/behaviour/org/jbehave/ant/AllBehaviours.java 2007-10-14 13:47:53 UTC (rev 800) @@ -17,7 +17,8 @@ public Class[] getBehaviours() { return new Class[] { BehaviourRunnerTaskBehaviour.class, - StoryRunnerTaskBehaviour.class + StoryRunnerTaskBehaviour.class, + StoryCodeGeneratorTaskBehaviour.class }; } }
Modified: trunk/extensions/ant/src/behaviour/org/jbehave/ant/BehaviourRunnerTaskBehaviour.java (799 => 800)
--- trunk/extensions/ant/src/behaviour/org/jbehave/ant/BehaviourRunnerTaskBehaviour.java 2007-09-10 12:26:11 UTC (rev 799) +++ trunk/extensions/ant/src/behaviour/org/jbehave/ant/BehaviourRunnerTaskBehaviour.java 2007-10-14 13:47:53 UTC (rev 800) @@ -117,5 +117,9 @@ BehaviourClassTwo.class.getName() }; } + + public String[] getRelativePaths(FileSet fileset, Project project) { + return new String[] {}; + } } }
Added: trunk/extensions/ant/src/behaviour/org/jbehave/ant/StoryCodeGeneratorTaskBehaviour.java (0 => 800)
--- trunk/extensions/ant/src/behaviour/org/jbehave/ant/StoryCodeGeneratorTaskBehaviour.java (rev 0) +++ trunk/extensions/ant/src/behaviour/org/jbehave/ant/StoryCodeGeneratorTaskBehaviour.java 2007-10-14 13:47:53 UTC (rev 800) @@ -0,0 +1,92 @@ +package org.jbehave.ant; + + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.types.FileSet; +import org.jbehave.core.Block; +import org.jbehave.core.mock.Matcher; +import org.jbehave.core.mock.UsingMatchers; + +public class StoryCodeGeneratorTaskBehaviour extends UsingMatchers { + + private StubCommandRunner runner = new StubCommandRunner(); + private StoryCodeGeneratorTask task = new StoryCodeGeneratorTask(); + private StubFilesetParser filesetParser = new StubFilesetParser(); + + public void setUp() { + task = new StoryCodeGeneratorTask(runner, filesetParser); + Project project = new Project(); + project.setCoreLoader(getClass().getClassLoader()); + task.setProject(project); + } + + + private Matcher collectionContains(final Object item) { + return new Matcher() { + public boolean matches(Object arg) { + return ((Collection)arg).contains(item); + } + + public String toString() { + return "Collection that contains <" + item + ">"; + } + }; + } + + public void shouldGenerateCodeForStoriesFoundInFileSet() { + + FileSet fileSet = new FileSet(); + + task.setGeneratedSourceDirectory("stories"); + task.addStories(fileSet); + task.execute(); + ensureThat(runner.taskLog, sameInstanceAs(task)); + + List list = Arrays.asList(runner.commandLineLog); + ensureThat(list, collectionContains("stories")); + ensureThat(list, collectionContains("one.story")); + ensureThat(list, collectionContains("two.story")); + } + + public void shouldFailTheBuildWhenVerificationFails() throws Exception { + final String generatedSourceDirectory = "stories"; + task.setGeneratedSourceDirectory(generatedSourceDirectory); + runner.valueToReturn = 1; + + Exception exception = runAndCatch(BuildException.class, new Block() { + public void run() throws Exception { + task.execute(); + } + }); + ensureThat(exception, isNotNull()); + } + + private static class StubCommandRunner implements CommandRunner { + private int valueToReturn; + private Task taskLog; + private String[] commandLineLog; + + public int fork(Task task, String[] commandline) { + taskLog = task; + commandLineLog = commandline; + return valueToReturn; + } + } + + private static class StubFilesetParser implements FilesetParser { + + public String[] getClassNames(FileSet fileset, Project project) { + return new String[] {}; + } + + public String[] getRelativePaths(FileSet fileset, Project project) { + return new String[] {"one.story", "two.story"}; + } + } +}
Modified: trunk/extensions/ant/src/behaviour/org/jbehave/ant/StoryRunnerTaskBehaviour.java (799 => 800)
--- trunk/extensions/ant/src/behaviour/org/jbehave/ant/StoryRunnerTaskBehaviour.java 2007-09-10 12:26:11 UTC (rev 799) +++ trunk/extensions/ant/src/behaviour/org/jbehave/ant/StoryRunnerTaskBehaviour.java 2007-10-14 13:47:53 UTC (rev 800) @@ -110,5 +110,9 @@ StoryClassTwo.class.getName() }; } + + public String[] getRelativePaths(FileSet fileset, Project project) { + return new String[] {}; + } } }
Deleted: trunk/extensions/ant/src/java/org/jbehave/ant/AbstractRunnerTask.java (799 => 800)
--- trunk/extensions/ant/src/java/org/jbehave/ant/AbstractRunnerTask.java 2007-09-10 12:26:11 UTC (rev 799) +++ trunk/extensions/ant/src/java/org/jbehave/ant/AbstractRunnerTask.java 2007-10-14 13:47:53 UTC (rev 800) @@ -1,126 +0,0 @@ -package org.jbehave.ant; - -import java.io.File; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.StringTokenizer; - -import org.apache.tools.ant.BuildException; -import org.apache.tools.ant.types.FileSet; -import org.apache.tools.ant.types.Path; - -public class AbstractRunnerTask extends AbstractJavaTask { - - private final Class runnerClass; - private final FilesetParser filesetParser; - private List targetArgumentList = new LinkedList(); - private List filesets = new ArrayList(); - - public AbstractRunnerTask(Class runnerClass, CommandRunner runner, FilesetParser filesetParser) { - super(runner); - this.runnerClass = runnerClass; - this.filesetParser = filesetParser; - } - - public void addTarget(String targetClass) { - targetArgumentList.add(targetClass); - } - - - - public void addTarget(int index, String dir) { - targetArgumentList.add(index, dir); - } - - public void execute() { - appendAntTaskJar(); - invoke(); - } - - public void setCloneVm(boolean cloneVm) { - commandLine.setCloneVm(cloneVm); - } - - private void appendAntTaskJar() { - createClasspath().append(new Path(getProject(), locate())); - } - - private void invoke() { - - for (Iterator iter = filesets.iterator(); iter.hasNext();) { - FileSet fileset = (FileSet) iter.next(); - - String[] classNames = filesetParser.getClassNames(fileset, getProject()); - - for (int i = 0; i < classNames.length; i++) { - addTarget(classNames[i]); - } - } - - commandLine.setClassname(runnerClass.getName()); - - for (Iterator iterator = targetArgumentList.iterator(); iterator.hasNext();) { - String className = iterator.next().toString(); - commandLine.createArgument().setLine(className); - } - - if (run() != 0) { - throw new BuildException("behaviour verification FAILED"); - } - log("Behaviours verification passed"); - } - - public void addFilesetTarget(FileSet fileset) { - filesets.add(fileset); - } - - private String locate() { - URL url = "" - if ("jar".equalsIgnoreCase(url.getProtocol())) { - return getJarFileOnClassPath(url); - } else { - return goToClassPathRootDirectory(url); - } - } - - private String goToClassPathRootDirectory(URL url) { - File classFile = getFileOnClassPath(url); - int level = new StringTokenizer(getClass().getName(), ".").countTokens(); - File directory = classFile.getParentFile(); - for (int i = 0; i < level - 1; i++) { - directory = directory.getParentFile(); - } - return directory.getAbsolutePath(); - } - - private String getJarFileOnClassPath(URL url) { - String file = url.getFile(); - int index = file.indexOf("!"); - if (index == -1) { - throw new IllegalArgumentException(url.toExternalForm() + " does not have '!' for a Jar URL"); - } - File fileObject = fromUri(file.substring(0, index)); - return fileObject.getAbsolutePath(); - } - - private File getFileOnClassPath(URL url) { - return fromUri(url.getFile()); - } - - private File fromUri(String fileUri) { - try { - return new File(new URI(fileUri)); - } catch (URISyntaxException e) { - throw new RuntimeException("Couldn't locate file:" + fileUri, e); - } - } - - private String resourcePathToClassFile() { - return "/" + getClass().getName().replace('.', '/') + ".class"; - } -}
Copied: trunk/extensions/ant/src/java/org/jbehave/ant/AbstractStoryTask.java (from rev 799, trunk/extensions/ant/src/java/org/jbehave/ant/AbstractRunnerTask.java) (0 => 800)
--- trunk/extensions/ant/src/java/org/jbehave/ant/AbstractStoryTask.java (rev 0) +++ trunk/extensions/ant/src/java/org/jbehave/ant/AbstractStoryTask.java 2007-10-14 13:47:53 UTC (rev 800) @@ -0,0 +1,128 @@ +package org.jbehave.ant; + +import java.io.File; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.StringTokenizer; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.types.FileSet; +import org.apache.tools.ant.types.Path; + +public class AbstractStoryTask extends AbstractJavaTask { + + private final Class commandLineClass; + private final FilesetParser filesetParser; + private List targetArgumentList = new LinkedList(); + private List filesets = new ArrayList(); + + public AbstractStoryTask(Class commandLineClass, CommandRunner runner, FilesetParser filesetParser) { + super(runner); + this.commandLineClass = commandLineClass; + this.filesetParser = filesetParser; + } + + public void addTarget(String targetArgument) { + targetArgumentList.add(targetArgument); + } + + public void addTarget(int index, String dir) { + targetArgumentList.add(index, dir); + } + + public void execute() { + appendAntTaskJar(); + addArgumentsAndRun(); + } + + public void setCloneVm(boolean cloneVm) { + commandLine.setCloneVm(cloneVm); + } + + private void appendAntTaskJar() { + createClasspath().append(new Path(getProject(), locate())); + } + + private void addArgumentsAndRun() { + + for (Iterator iter = filesets.iterator(); iter.hasNext();) { + FileSet fileset = (FileSet) iter.next(); + + String[] arguments = getArguments(fileset, filesetParser); + + for (int i = 0; i < arguments.length; i++) { + addTarget(arguments[i]); + } + } + + commandLine.setClassname(commandLineClass.getName()); + + for (Iterator iterator = targetArgumentList.iterator(); iterator.hasNext();) { + String className = iterator.next().toString(); + commandLine.createArgument().setLine(className); + } + + if (run() != 0) { + throw new BuildException("Command execution FAILED"); + } + log("Command execution passed"); + } + + protected String[] getArguments(FileSet fileset, FilesetParser parser) { + return parser.getClassNames(fileset, getProject()); + } + + public void addFilesetTarget(FileSet fileset) { + filesets.add(fileset); + } + + private String locate() { + URL url = "" + if ("jar".equalsIgnoreCase(url.getProtocol())) { + return getJarFileOnClassPath(url); + } else { + return goToClassPathRootDirectory(url); + } + } + + private String goToClassPathRootDirectory(URL url) { + File classFile = getFileOnClassPath(url); + int level = new StringTokenizer(getClass().getName(), ".").countTokens(); + File directory = classFile.getParentFile(); + for (int i = 0; i < level - 1; i++) { + directory = directory.getParentFile(); + } + return directory.getAbsolutePath(); + } + + private String getJarFileOnClassPath(URL url) { + String file = url.getFile(); + int index = file.indexOf("!"); + if (index == -1) { + throw new IllegalArgumentException(url.toExternalForm() + " does not have '!' for a Jar URL"); + } + File fileObject = fromUri(file.substring(0, index)); + return fileObject.getAbsolutePath(); + } + + private File getFileOnClassPath(URL url) { + return fromUri(url.getFile()); + } + + private File fromUri(String fileUri) { + try { + return new File(new URI(fileUri)); + } catch (URISyntaxException e) { + throw new RuntimeException("Couldn't locate file:" + fileUri, e); + } + } + + private String resourcePathToClassFile() { + return "/" + getClass().getName().replace('.', '/') + ".class"; + } +}
Modified: trunk/extensions/ant/src/java/org/jbehave/ant/BehaviourRunnerTask.java (799 => 800)
--- trunk/extensions/ant/src/java/org/jbehave/ant/BehaviourRunnerTask.java 2007-09-10 12:26:11 UTC (rev 799) +++ trunk/extensions/ant/src/java/org/jbehave/ant/BehaviourRunnerTask.java 2007-10-14 13:47:53 UTC (rev 800) @@ -10,7 +10,7 @@ import org.apache.tools.ant.types.FileSet; import org.jbehave.core.BehaviourRunner; -public class BehaviourRunnerTask extends AbstractRunnerTask { +public class BehaviourRunnerTask extends AbstractStoryTask { public BehaviourRunnerTask() { this(new CommandRunnerImpl(), new TrimFilesetParser());
Modified: trunk/extensions/ant/src/java/org/jbehave/ant/FilesetParser.java (799 => 800)
--- trunk/extensions/ant/src/java/org/jbehave/ant/FilesetParser.java 2007-09-10 12:26:11 UTC (rev 799) +++ trunk/extensions/ant/src/java/org/jbehave/ant/FilesetParser.java 2007-10-14 13:47:53 UTC (rev 800) @@ -7,4 +7,6 @@ String[] getClassNames(FileSet fileset, Project project); + String[] getRelativePaths(FileSet fileset, Project project); + }
Added: trunk/extensions/ant/src/java/org/jbehave/ant/StoryCodeGeneratorTask.java (0 => 800)
--- trunk/extensions/ant/src/java/org/jbehave/ant/StoryCodeGeneratorTask.java (rev 0) +++ trunk/extensions/ant/src/java/org/jbehave/ant/StoryCodeGeneratorTask.java 2007-10-14 13:47:53 UTC (rev 800) @@ -0,0 +1,36 @@ +package org.jbehave.ant; + +import org.apache.tools.ant.types.FileSet; +import org.jbehave.core.story.codegen.velocity.VelocityCodeGenerator; + +public class StoryCodeGeneratorTask extends AbstractStoryTask { + + public StoryCodeGeneratorTask() { + this(new CommandRunnerImpl(), new TrimFilesetParser()); + } + + public StoryCodeGeneratorTask(CommandRunner runner, FilesetParser parser) { + super(VelocityCodeGenerator.class, runner, parser); + } + + public void setGeneratedSourceDirectory(String generatedSourceDirectory) { + super.addTarget(generatedSourceDirectory); + } + + public void setStoryClassName(String storyClassName) { + super.addTarget(storyClassName); + } + + public void addStories(FileSet fileset) { + super.addFilesetTarget(fileset); + } + + public void setCloneVm(boolean cloneVm) { + super.setCloneVm(cloneVm); + } + + protected String[] getArguments(FileSet fileset, FilesetParser parser) { + return parser.getRelativePaths(fileset, getProject()); + } + +}
Modified: trunk/extensions/ant/src/java/org/jbehave/ant/StoryPrinterTask.java (799 => 800)
--- trunk/extensions/ant/src/java/org/jbehave/ant/StoryPrinterTask.java 2007-09-10 12:26:11 UTC (rev 799) +++ trunk/extensions/ant/src/java/org/jbehave/ant/StoryPrinterTask.java 2007-10-14 13:47:53 UTC (rev 800) @@ -3,8 +3,8 @@ import org.apache.tools.ant.types.FileSet; import org.jbehave.core.story.StoryToDirectoryPrinter; -public class StoryPrinterTask extends AbstractRunnerTask { - +public class StoryPrinterTask extends AbstractStoryTask { + public StoryPrinterTask() { super(StoryToDirectoryPrinter.class, new CommandRunnerImpl(), new TrimFilesetParser()); } @@ -16,8 +16,7 @@ public void setStoryClassName(String storyClassName) { super.addTarget(storyClassName); } - - + public void addStories(FileSet fileset) { super.addFilesetTarget(fileset); }
Modified: trunk/extensions/ant/src/java/org/jbehave/ant/StoryRunnerTask.java (799 => 800)
--- trunk/extensions/ant/src/java/org/jbehave/ant/StoryRunnerTask.java 2007-09-10 12:26:11 UTC (rev 799) +++ trunk/extensions/ant/src/java/org/jbehave/ant/StoryRunnerTask.java 2007-10-14 13:47:53 UTC (rev 800) @@ -3,7 +3,7 @@ import org.apache.tools.ant.types.FileSet; import org.jbehave.core.story.StoryRunner; -public class StoryRunnerTask extends AbstractRunnerTask { +public class StoryRunnerTask extends AbstractStoryTask { public StoryRunnerTask() { this(new CommandRunnerImpl(), new TrimFilesetParser()); @@ -16,8 +16,7 @@ public void setStoryClassName(String storyClassName) { super.addTarget(storyClassName); } - - + public void addStories(FileSet fileset) { super.addFilesetTarget(fileset); }
Modified: trunk/extensions/ant/src/java/org/jbehave/ant/TrimFilesetParser.java (799 => 800)
--- trunk/extensions/ant/src/java/org/jbehave/ant/TrimFilesetParser.java 2007-09-10 12:26:11 UTC (rev 799) +++ trunk/extensions/ant/src/java/org/jbehave/ant/TrimFilesetParser.java 2007-10-14 13:47:53 UTC (rev 800) @@ -38,5 +38,24 @@ } return classname; } + + public String[] getRelativePaths(FileSet fileset, Project project) { + DirectoryScanner ds = fileset.getDirectoryScanner(project); + String[] includedFiles = ds.getIncludedFiles(); + List paths = new ArrayList(); + for (int i = 0; i < includedFiles.length; i++) { + String filename = includedFiles[i].replace('\\', '/'); + File base = ds.getBasedir(); + File found = new File(base, filename); + + String relativePath = found.getAbsolutePath().substring( + base.getAbsolutePath().length() + 1).replace('\\', '/'); + + paths.add(relativePath); + } + return (String[]) paths.toArray(new String[paths.size()]); + } + + }
To unsubscribe from this list please visit:
