001: /*
002: * @(#)SimpleXslReportStyle.java
003: *
004: * Copyright (C) 2004 Matt Albrecht
005: * groboclown@users.sourceforge.net
006: * http://groboutils.sourceforge.net
007: *
008: * Permission is hereby granted, free of charge, to any person obtaining a
009: * copy of this software and associated documentation files (the "Software"),
010: * to deal in the Software without restriction, including without limitation
011: * the rights to use, copy, modify, merge, publish, distribute, sublicense,
012: * and/or sell copies of the Software, and to permit persons to whom the
013: * Software is furnished to do so, subject to the following conditions:
014: *
015: * The above copyright notice and this permission notice shall be included in
016: * all copies or substantial portions of the Software.
017: *
018: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
019: * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
020: * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
021: * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
022: * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
023: * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
024: * DEALINGS IN THE SOFTWARE.
025: */
026:
027: package net.sourceforge.groboutils.codecoverage.v2.ant;
028:
029: import java.io.File;
030: import java.io.IOException;
031: import java.net.URL;
032: import java.util.Enumeration;
033: import java.util.Vector;
034:
035: import org.apache.tools.ant.BuildException;
036: import org.apache.tools.ant.Project;
037: import org.w3c.dom.Document;
038:
039: /**
040: * Describes a report style, used to generate readable reports from the
041: * XML output.
042: *
043: * @author Matt Albrecht <a href="mailto:groboclown@users.sourceforge.net">groboclown@users.sourceforge.net</a>
044: * @version $Date: 2004/04/15 05:48:25 $
045: * @since March 15, 2004
046: */
047: public class SimpleXslReportStyle implements IReportStyle {
048: private File outdir;
049: private boolean removeEmpties = false;
050: private StyleTransformer styleRemove = null;
051: private StyleTransformer styleHtml = null;
052: private String prefix = "CoverageReport-";
053: private String suffix = ".html";
054: private File styleFile = null;
055: private String styleUrl = null;
056: private Vector params = new Vector();
057:
058: public static final class ParamType {
059: String name;
060: String expr;
061: String ifProp;
062: String elseProp;
063:
064: public void setName(String n) {
065: this .name = n;
066: }
067:
068: public void setExpression(String x) {
069: this .expr = x;
070: }
071:
072: public void setIf(String i) {
073: this .ifProp = i;
074: }
075:
076: public void setElse(String e) {
077: this .elseProp = e;
078: }
079:
080: public void updateParameter(StyleTransformer st, Project p) {
081: if (this .ifProp != null
082: && p.getProperty(this .ifProp) == null) {
083: p.log("Ignoring parameter '" + this .name
084: + "' because property '" + this .ifProp
085: + "' was not set.", Project.MSG_VERBOSE);
086: return;
087: }
088: if (this .elseProp != null
089: && p.getProperty(this .elseProp) != null) {
090: p.log("Ignoring parameter '" + this .name
091: + "' because property '" + this .elseProp
092: + "' was set.", Project.MSG_VERBOSE);
093: return;
094: }
095:
096: st.setParameter(this .name, this .expr);
097: }
098: }
099:
100: public void setPrefix(String p) {
101: if (p == null) {
102: p = "";
103: }
104: this .prefix = p;
105: }
106:
107: public void setSuffix(String s) {
108: if (s == null) {
109: s = "";
110: }
111: this .suffix = s;
112: }
113:
114: public void setDestDir(File dir) {
115: this .outdir = dir;
116: }
117:
118: public void setRemoveEmpty(boolean on) {
119: this .removeEmpties = on;
120: }
121:
122: public void setStyle(File f) {
123: this .styleFile = f;
124: }
125:
126: public void setStyleURL(String url) {
127: this .styleUrl = url;
128: }
129:
130: public void addParam(ParamType pt) {
131: if (pt != null) {
132: this .params.addElement(pt);
133: }
134: }
135:
136: /**
137: * Called when the task is finished generating all the reports. This
138: * may be useful for styles that join all the reports together.
139: */
140: public void reportComplete(Project project, Vector errors)
141: throws BuildException, IOException {
142: // free up memory
143: this .styleHtml = null;
144: this .styleRemove = null;
145: }
146:
147: public void generateReport(Project project, Document doc,
148: String moduleName) throws BuildException, IOException {
149: project.log("Generating XSL report for module " + moduleName,
150: Project.MSG_VERBOSE);
151: if (this .removeEmpties) {
152: project.log("Removing empty methods and classes...",
153: Project.MSG_DEBUG);
154: doc = getRemoveEmptiesStyle(project).transform(doc);
155: }
156: project.log("Transforming...", Project.MSG_DEBUG);
157: this .outdir.mkdirs();
158: File outFile = new File(this .outdir, this .prefix + moduleName
159: + this .suffix);
160: getHtmlStyle(project).transform(doc, outFile);
161: }
162:
163: protected StyleTransformer getRemoveEmptiesStyle(Project project)
164: throws IOException {
165: if (this .styleRemove == null && this .removeEmpties) {
166: this .styleRemove = new StyleTransformer(
167: project,
168: getStylesheetSystemIdForClass("remove-empty-classes.xsl"),
169: this .outdir);
170: }
171: return this .styleRemove;
172: }
173:
174: protected StyleTransformer getHtmlStyle(Project project)
175: throws IOException {
176: if (this .styleHtml == null) {
177: this .styleHtml = new StyleTransformer(project,
178: getStylesheetSystemId(), this .outdir);
179: Enumeration e = this .params.elements();
180: while (e.hasMoreElements()) {
181: ((ParamType) e.nextElement()).updateParameter(
182: this .styleHtml, project);
183: }
184: }
185: return this .styleHtml;
186: }
187:
188: /**
189: * Get the systemid of the appropriate stylesheet based on its
190: * name and styledir. If no styledir is defined it will load
191: * it as a java resource in the xsl child package, otherwise it
192: * will get it from the given directory.
193: *
194: * @throws IOException thrown if the requested stylesheet does
195: * not exist.
196: */
197: protected String getStylesheetSystemId() throws IOException {
198: URL url = null;
199: if (this .styleFile == null) {
200: if (this .styleUrl == null) {
201: throw new BuildException(
202: "No URL or file defined for XSL style sheet.");
203: }
204: url = new URL(this .styleUrl);
205: } else {
206: if (!this .styleFile.exists()) {
207: throw new java.io.FileNotFoundException(
208: "Could not find file '" + this .styleFile + "'");
209: }
210: url = new URL("file", "", styleFile.getAbsolutePath());
211: }
212: return url.toExternalForm();
213: }
214:
215: protected String getStylesheetSystemIdForClass(String xslname)
216: throws IOException {
217: URL url = getClass().getResource("xsl/" + xslname);
218: if (url == null) {
219: throw new java.io.FileNotFoundException(
220: "Could not find jar resource " + xslname);
221: }
222: return url.toExternalForm();
223: }
224: }
|