Title: [800] trunk/extensions/ant/src/java/org/jbehave/ant: Added StoryCodeGeneratorTask.

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:

http://xircles.codehaus.org/manage_email

Reply via email to