1 package com.github.searls.jasmine.runner; 2 3 import com.github.searls.jasmine.config.JasmineConfiguration; 4 import com.github.searls.jasmine.io.scripts.BasicScriptResolver; 5 import com.github.searls.jasmine.io.scripts.ContextPathScriptResolver; 6 import com.github.searls.jasmine.io.scripts.ScriptResolver; 7 import org.apache.commons.io.FileUtils; 8 import org.apache.commons.lang3.StringUtils; 9 import org.apache.maven.plugin.logging.Log; 10 11 import java.io.File; 12 import java.io.IOException; 13 14 public class CreatesRunner { 15 16 private final JasmineConfiguration config; 17 18 private final Log log; 19 private final String runnerFileName; 20 private final ReporterType reporterType; 21 22 public CreatesRunner(JasmineConfiguration config, Log log, String runnerFileName, ReporterType reporterType) { 23 this.config = config; 24 this.runnerFileName = runnerFileName; 25 this.reporterType = reporterType; 26 this.log = log; 27 } 28 29 public String getRunnerFile() { 30 return this.runnerFileName; 31 } 32 33 public void create() throws IOException { 34 File runnerDestination = new File(this.config.getJasmineTargetDir(), this.runnerFileName); 35 ScriptResolver resolver = new BasicScriptResolver( 36 config.getBasedir(), 37 config.getSources(), 38 config.getSpecs(), 39 config.getPreloadSources()); 40 resolver = new ContextPathScriptResolver( 41 resolver, 42 config.getSrcDirectoryName(), 43 config.getSpecDirectoryName()); 44 45 SpecRunnerHtmlGenerator generator = new SpecRunnerHtmlGeneratorFactory().create(this.reporterType, this.config, resolver); 46 47 String newRunnerHtml = generator.generate(); 48 if (this.newRunnerDiffersFromOldRunner(runnerDestination, newRunnerHtml)) { 49 this.saveRunner(runnerDestination, newRunnerHtml); 50 } else { 51 this.log.info("Skipping spec runner generation, because an identical spec runner already exists."); 52 } 53 } 54 55 private String existingRunner(File destination) throws IOException { 56 String existingRunner = null; 57 try { 58 if (destination.exists()) { 59 existingRunner = FileUtils.readFileToString(destination); 60 } 61 } catch (IOException e) { 62 this.log.warn("An error occurred while trying to open an existing manual spec runner. Continuing."); 63 } 64 return existingRunner; 65 } 66 67 private boolean newRunnerDiffersFromOldRunner(File runnerDestination, String newRunner) throws IOException { 68 return !StringUtils.equals(newRunner, this.existingRunner(runnerDestination)); 69 } 70 71 private void saveRunner(File runnerDestination, String newRunner) throws IOException { 72 FileUtils.writeStringToFile(runnerDestination, newRunner, this.config.getSourceEncoding()); 73 } 74 }