View Javadoc

1   package com.github.jlgrock.javascriptframework.closuretestingreport;
2   
3   import java.io.File;
4   import java.util.Locale;
5   import java.util.Set;
6   
7   import org.apache.log4j.Logger;
8   import org.apache.maven.doxia.siterenderer.Renderer;
9   import org.apache.maven.project.MavenProject;
10  import org.apache.maven.reporting.AbstractMavenReport;
11  import org.apache.maven.reporting.MavenReportException;
12  import org.openqa.selenium.WebDriver;
13  import org.openqa.selenium.htmlunit.HtmlUnitDriver;
14  
15  import com.github.jlgrock.javascriptframework.closuretesting.resultparsing.ParseRunner;
16  import com.github.jlgrock.javascriptframework.closuretesting.resultparsing.testingcomponents.TestCase;
17  import com.github.jlgrock.javascriptframework.mavenutils.logging.MojoLogAppender;
18  import com.github.jlgrock.javascriptframework.mavenutils.pathing.FileListBuilder;
19  
20  /**
21   * Will execute the jsclosure suite in a selenium testbed and execute it,
22   * parsing values for problems. If problems arise, this can stop the build.
23   * 
24   * @goal report
25   * @phase site
26   * @execute phase="test"
27   */
28  public class ClosureTestingReportMojo extends AbstractMavenReport {
29  	/**
30  	 * The Logger.
31  	 */
32  	private static final Logger LOGGER = Logger
33  			.getLogger(ClosureTestingReportMojo.class);
34  
35  	/**
36  	 * The framework directory.  This allows us to get the relative pathing to the expected generated source
37  	 * 
38  	 * @parameter expression=
39  	 *            "${project.build.directory}${file.separator}javascriptFramework"
40  	 * @required
41  	 */
42  	private File frameworkTargetDirectory;
43  
44  	/**
45  	 * Directory where reports will go.
46  	 * 
47  	 * @parameter expression="${project.reporting.outputDirectory}"
48  	 * @required
49  	 * @readonly
50  	 */
51  	private String outputDirectory;
52  
53  	/**
54  	 * @parameter default-value="${project}"
55  	 * @required
56  	 * @readonly
57  	 */
58  	private MavenProject project;
59  
60  	/**
61  	 * @component
62  	 * @required
63  	 * @readonly
64  	 */
65  	private Renderer siteRenderer;
66  
67  	/**
68  	 * Add this if you want to create the report without using Doxia, e.g. via
69  	 * XSL transformation from some XML file, then simply add the following
70  	 * method to your Mojo
71  	 * 
72  	 * @return
73  	 */
74  
75  	/**
76  	 * Gets the description for the report.
77  	 * 
78  	 * @param locale
79  	 *            the locale
80  	 * @return the description
81  	 */
82  	public final String getDescription(final Locale locale) {
83  		return "Report on Closure Unit Testing";
84  	}
85  
86  	@Override
87  	public final String getName(final Locale locale) {
88  		return "Closure Unit Testing";
89  	}
90  
91  	@Override
92  	public final String getOutputName() {
93  		return "closure-unit-testing-report";
94  	}
95  
96  	@Override
97  	protected final void executeReport(final Locale locale)
98  			throws MavenReportException {
99  		MojoLogAppender.beginLogging(this);
100 		try {
101 			Set<File> files = FileListBuilder.buildFilteredList(getFrameworkTargetDirectory(),
102 					"html");
103 			Set<TestCase> testCases = parseFiles(files);
104 			ClosureTestingReportGenerator renderer = new ClosureTestingReportGenerator(
105 					getSink(), testCases);
106 			renderer.render();
107 		} catch (Exception e) {
108 			LOGGER.error(e.getMessage(), e);
109 			throw new MavenReportException(e.getMessage());
110 		} finally {
111 			MojoLogAppender.endLogging();
112 		}
113 	}
114 
115 	/**
116 	 * * Parse the files created.
117 	 * 
118 	 * @param files
119 	 *            the files to parse
120 	 * @return the set of parsed test cases
121 	 */
122 	private static Set<TestCase> parseFiles(final Set<File> files) {
123 		WebDriver driver = new HtmlUnitDriver(true);
124 		Set<TestCase> testCases = null;
125 		try {
126 			ParseRunner parseRunner = new ParseRunner(files, driver);
127 			testCases = parseRunner.parseFiles();
128 		} finally {
129 			driver.close();
130 		}
131 		return testCases;
132 	}
133 
134 	@Override
135 	protected final String getOutputDirectory() {
136 		return outputDirectory;
137 	}
138 
139 	@Override
140 	protected final MavenProject getProject() {
141 		return project;
142 	}
143 
144 	@Override
145 	protected final Renderer getSiteRenderer() {
146 		return siteRenderer;
147 	}
148 	
149 	/**
150 	 * @return frameworkTargetDirectory
151 	 */
152 	protected final File getFrameworkTargetDirectory() {
153 		return frameworkTargetDirectory;
154 	}
155 
156 }