Coverage Report - org.jbehave.ant.AbstractEmbedderTask
 
Classes in this File Line Coverage Branch Coverage Complexity
AbstractEmbedderTask
100%
67/67
100%
4/4
1.083
AbstractEmbedderTask$AntEmbedderMonitor
100%
26/26
N/A
1.083
 
 1  
 package org.jbehave.ant;
 2  
 
 3  
 import static java.util.Arrays.asList;
 4  
 import static org.apache.tools.ant.Project.MSG_DEBUG;
 5  
 import static org.apache.tools.ant.Project.MSG_INFO;
 6  
 import static org.apache.tools.ant.Project.MSG_WARN;
 7  
 
 8  
 import java.io.File;
 9  
 import java.util.ArrayList;
 10  
 import java.util.List;
 11  
 import java.util.Properties;
 12  
 
 13  
 import org.apache.tools.ant.Task;
 14  
 import org.jbehave.core.InjectableEmbedder;
 15  
 import org.jbehave.core.embedder.Embedder;
 16  
 import org.jbehave.core.embedder.EmbedderClassLoader;
 17  
 import org.jbehave.core.embedder.EmbedderControls;
 18  
 import org.jbehave.core.embedder.EmbedderMonitor;
 19  
 import org.jbehave.core.embedder.UnmodifiableEmbedderControls;
 20  
 import org.jbehave.core.failures.BatchFailures;
 21  
 import org.jbehave.core.io.StoryFinder;
 22  
 import org.jbehave.core.junit.AnnotatedEmbedderRunner;
 23  
 
 24  
 /**
 25  
  * Abstract task that holds all the configuration parameters to specify and load
 26  
  * stories.
 27  
  * 
 28  
  * @author Mauro Talevi
 29  
  */
 30  12
 public abstract class AbstractEmbedderTask extends Task {
 31  
 
 32  
     private static final String TEST_SCOPE = "test";
 33  
 
 34  12
     private String sourceDirectory = "src/main/java";
 35  
 
 36  12
     private String testSourceDirectory = "src/test/java";
 37  
 
 38  
     /**
 39  
      * The scope of the source, either "compile" or "test"
 40  
      */
 41  12
     private String scope = "compile";
 42  
 
 43  
     /**
 44  
      * Include filters, relative to the root source directory determined
 45  
      * by the scope
 46  
      */
 47  12
     private List<String> includes = new ArrayList<String>();
 48  
 
 49  
     /**
 50  
      * Exclude filters, relative to the root source directory determined
 51  
      * by the scope
 52  
      */
 53  12
     private List<String> excludes = new ArrayList<String>();
 54  
 
 55  
     /**
 56  
      * The boolean flag to skip running stories
 57  
      */
 58  12
     private boolean skip = false;
 59  
 
 60  
     /**
 61  
      * The boolean flag to ignore failure in stories
 62  
      */
 63  12
     private boolean ignoreFailureInStories = false;
 64  
 
 65  
     /**
 66  
      * The boolean flag to ignore failure in view
 67  
      */
 68  12
     private boolean ignoreFailureInView = false;
 69  
 
 70  
     /**
 71  
      * The boolean flag to generate view after stories
 72  
      */
 73  12
     private boolean generateViewAfterStories = true;
 74  
 
 75  
     /**
 76  
      * The boolean flag to run in batch mode
 77  
      */
 78  12
     private boolean batch = false;
 79  
 
 80  
     /**
 81  
      * The embedder to run the stories
 82  
      */
 83  12
     private String embedderClass = Embedder.class.getName();
 84  
 
 85  
     /**
 86  
      * The class that is injected to provide embedder to run the stories.
 87  
      */
 88  
     private String injectableEmbedderClass;
 89  
 
 90  
     /**
 91  
      * The annotated embedder runner class to run the stories
 92  
      */
 93  12
     protected String annotatedEmbedderRunnerClass = AnnotatedEmbedderRunner.class.getName();
 94  
 
 95  
     /**
 96  
      * Used to find story paths and class names
 97  
      */
 98  12
     private String storyFinderClass = StoryFinder.class.getName();
 99  
 
 100  
     /**
 101  
      * Determines if the scope of the source directory is "test"
 102  
      * 
 103  
      * @return A boolean <code>true</code> if test scoped
 104  
      */
 105  
     private boolean isSourceTestScope() {
 106  4
         return TEST_SCOPE.equals(scope);
 107  
     }
 108  
 
 109  
     String searchDirectory() {
 110  4
         if (isSourceTestScope()) {
 111  1
             return testSourceDirectory;
 112  
         }
 113  3
         return sourceDirectory;
 114  
     }
 115  
 
 116  
     /**
 117  
      * Creates the EmbedderClassLoader with the classpath element of the selected
 118  
      * scope
 119  
      * 
 120  
      * @return A EmbedderClassLoader
 121  
      */
 122  
     protected EmbedderClassLoader createClassLoader() {
 123  6
         return new EmbedderClassLoader(this.getClass().getClassLoader());
 124  
     }
 125  
 
 126  
     protected EmbedderMonitor embedderMonitor() {
 127  5
         return new AntEmbedderMonitor();
 128  
     }
 129  
 
 130  
     protected EmbedderControls embedderControls() {
 131  5
         return new UnmodifiableEmbedderControls(new EmbedderControls().doBatch(batch).doSkip(skip)
 132  
                 .doGenerateViewAfterStories(generateViewAfterStories).doIgnoreFailureInStories(ignoreFailureInStories)
 133  
                 .doIgnoreFailureInView(ignoreFailureInView));
 134  
     }
 135  
 
 136  
     /**
 137  
      * Finds story paths, using the {@link #newStoryFinder()}, in the {@link #searchDirectory()} given
 138  
      * specified {@link #includes} and {@link #excludes}.
 139  
      * 
 140  
      * @return A List of story paths found
 141  
      */
 142  
     protected List<String> storyPaths() {
 143  1
         log("Searching for story paths including " + includes + " and excluding " + excludes, MSG_DEBUG);
 144  1
         List<String> storyPaths = newStoryFinder().findPaths(searchDirectory(), includes, excludes);
 145  1
         log("Found story paths: " + storyPaths, MSG_INFO);
 146  1
         return storyPaths;
 147  
     }
 148  
 
 149  
     /**
 150  
      * Finds class names, using the {@link #newStoryFinder()}, in the {@link #searchDirectory()} given
 151  
      * specified {@link #includes} and {@link #excludes}.
 152  
      * 
 153  
      * @return A List of class names found
 154  
      */
 155  
     protected List<String> classNames() {
 156  2
         log("Searching for class names including " + includes + " and excluding " + excludes, MSG_DEBUG);
 157  2
         List<String> classNames = newStoryFinder().findClassNames(searchDirectory(), includes, excludes);
 158  2
         log("Found class names : " + classNames, MSG_INFO);
 159  2
         return classNames;
 160  
     }
 161  
 
 162  
     /**
 163  
      * Creates an instance of StoryFinder, using the {@link #storyFinderClass}
 164  
      * 
 165  
      * @return A StoryFinder
 166  
      */
 167  
     protected StoryFinder newStoryFinder() {
 168  4
         return createClassLoader().newInstance(StoryFinder.class, storyFinderClass);
 169  
     }
 170  
 
 171  
     /**
 172  
      * Creates an instance of Embedder, either using {@link #injectableEmbedderClass} (if set)
 173  
      * or defaulting to {@link #embedderClass}.
 174  
      * 
 175  
      * @return An Embedder
 176  
      */
 177  
     protected Embedder newEmbedder() {
 178  5
         Embedder embedder = null;
 179  5
         EmbedderClassLoader classLoader = createClassLoader();
 180  5
         if ( injectableEmbedderClass != null ){
 181  1
             embedder = classLoader.newInstance(InjectableEmbedder.class, injectableEmbedderClass).injectedEmbedder();
 182  
         } else {
 183  4
             embedder = classLoader.newInstance(Embedder.class, embedderClass);
 184  
         }
 185  5
         embedder.useEmbedderMonitor(embedderMonitor());
 186  5
         embedder.useEmbedderControls(embedderControls());
 187  5
         return embedder;
 188  
     }
 189  
 
 190  5
     protected class AntEmbedderMonitor implements EmbedderMonitor {
 191  
         public void batchFailed(BatchFailures failures) {
 192  1
             log("Failed to run batch " + failures, MSG_WARN);
 193  1
         }
 194  
 
 195  
         public void embeddableFailed(String name, Throwable cause) {
 196  1
             log("Failed to run embeddable " + name, cause, MSG_WARN);            
 197  1
         }
 198  
 
 199  
         public void embeddablesSkipped(List<String> classNames) {
 200  1
             log("Skipped embeddables " + classNames, MSG_INFO);                        
 201  1
         }
 202  
 
 203  
         public void runningEmbeddable(String name) {
 204  1
             log("Running embeddable " + name, MSG_INFO);
 205  1
         }
 206  
 
 207  
         public void storiesSkipped(List<String> storyPaths) {
 208  1
             log("Skipped stories " + storyPaths, MSG_INFO);                                    
 209  1
         }
 210  
 
 211  
         public void storyFailed(String path, Throwable cause) {
 212  1
             log("Failed to run story " + path, cause, MSG_WARN);
 213  1
         }
 214  
 
 215  
         public void runningStory(String path) {
 216  1
             log("Running story " + path, MSG_INFO);
 217  1
         }
 218  
 
 219  
         public void annotatedInstanceNotOfType(Object annotatedInstance, Class<?> type) {
 220  1
             log("Annotated instance "+annotatedInstance+" not of type "+type, MSG_WARN);            
 221  1
         }
 222  
         
 223  
         public void generatingStoriesView(File outputDirectory, List<String> formats, Properties viewProperties) {
 224  1
             log("Generating stories view in '" + outputDirectory + "' using formats '" + formats + "'"
 225  
                     + " and view properties '" + viewProperties + "'", MSG_INFO);
 226  1
         }
 227  
 
 228  
         public void storiesViewGenerationFailed(File outputDirectory, List<String> formats, Properties viewProperties,
 229  
                 Throwable cause) {
 230  1
             log("Failed to generate stories view in outputDirectory " + outputDirectory + " using formats " + formats
 231  
                     + " and view properties '" + viewProperties + "'", cause, MSG_WARN);
 232  1
         }
 233  
 
 234  
         public void storiesViewGenerated(int stories, int scenarios, int failedScenarios) {
 235  1
             log("Stories view generated with " + stories +" stories containing "+ scenarios + " scenarios (of which  " + failedScenarios + " failed)",
 236  
                     MSG_INFO);
 237  1
         }
 238  
 
 239  
         public void storiesViewNotGenerated() {
 240  1
             log("Stories view not generated", MSG_INFO);
 241  1
         }
 242  
 
 243  
         @Override
 244  
         public String toString() {
 245  1
             return this.getClass().getSimpleName();
 246  
         }
 247  
 
 248  
     }
 249  
 
 250  
     // Setters used by Task to inject dependencies
 251  
 
 252  
     public void setSourceDirectory(String sourceDirectory) {
 253  3
         this.sourceDirectory = sourceDirectory;
 254  3
     }
 255  
 
 256  
     public void setTestSourceDirectory(String testSourceDirectory) {
 257  1
         this.testSourceDirectory = testSourceDirectory;
 258  1
     }
 259  
 
 260  
     public void setScope(String scope) {
 261  1
         this.scope = scope;
 262  1
     }
 263  
 
 264  
     public void setIncludes(String includesCSV) {
 265  3
         this.includes = asList(includesCSV.split(","));
 266  3
     }
 267  
 
 268  
     public void setExcludes(String excludesCSV) {
 269  3
         this.excludes = asList(excludesCSV.split(","));
 270  3
     }
 271  
 
 272  
     public void setBatch(boolean batch) {
 273  1
         this.batch = batch;
 274  1
     }
 275  
 
 276  
     public void setSkip(boolean skip) {
 277  1
         this.skip = skip;
 278  1
     }
 279  
 
 280  
     public void setIgnoreFailureInStories(boolean ignoreFailureInStories) {
 281  1
         this.ignoreFailureInStories = ignoreFailureInStories;
 282  1
     }
 283  
 
 284  
     public void setIgnoreFailureInView(boolean ignoreFailureInView) {
 285  1
         this.ignoreFailureInView = ignoreFailureInView;
 286  1
     }
 287  
 
 288  
     public void setGenerateViewAfterStories(boolean generateViewAfterStories) {
 289  1
         this.generateViewAfterStories = generateViewAfterStories;
 290  1
     }
 291  
 
 292  
     public void setEmbedderClass(String embedderClass) {
 293  1
         this.embedderClass = embedderClass;
 294  1
     }
 295  
 
 296  
     public void setInjectableEmbedderClass(String injectableEmbedderClass) {
 297  1
         this.injectableEmbedderClass = injectableEmbedderClass;
 298  1
     }
 299  
 
 300  
     public void setAnnotatedEmbedderRunnerClass(String annotatedEmbedderRunnerClass) {
 301  1
         this.annotatedEmbedderRunnerClass = annotatedEmbedderRunnerClass;
 302  1
     }
 303  
     
 304  
     public void setStoryFinderClass(String storyFinderClass){
 305  1
         this.storyFinderClass = storyFinderClass;
 306  1
     }
 307  
 }