1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.rat;
20
21 import java.io.ByteArrayInputStream;
22 import java.io.ByteArrayOutputStream;
23 import java.io.IOException;
24 import java.io.InputStream;
25 import java.io.OutputStream;
26 import java.io.OutputStreamWriter;
27 import java.io.PrintWriter;
28 import java.io.Writer;
29 import java.nio.charset.StandardCharsets;
30
31 import javax.xml.parsers.DocumentBuilderFactory;
32 import javax.xml.transform.OutputKeys;
33 import javax.xml.transform.Transformer;
34 import javax.xml.transform.TransformerException;
35 import javax.xml.transform.TransformerFactory;
36 import javax.xml.transform.dom.DOMSource;
37 import javax.xml.transform.stream.StreamResult;
38 import javax.xml.transform.stream.StreamSource;
39
40 import org.apache.commons.io.function.IOSupplier;
41 import org.apache.rat.api.RatException;
42 import org.apache.rat.license.LicenseSetFactory.LicenseFilter;
43 import org.apache.rat.report.RatReport;
44 import org.apache.rat.report.claim.ClaimStatistic;
45 import org.apache.rat.report.xml.XmlReportFactory;
46 import org.apache.rat.report.xml.writer.IXmlWriter;
47 import org.apache.rat.report.xml.writer.XmlWriter;
48 import org.w3c.dom.Document;
49
50
51
52
53
54 public class Reporter {
55
56
57 private static final String LICENSE_FORMAT = "%s:\t%s%n\t\t%s%n";
58
59
60 private Document document;
61
62
63 private ClaimStatistic statistic;
64
65
66 private final ReportConfiguration configuration;
67
68
69
70
71
72
73 public Reporter(final ReportConfiguration configuration) {
74 this.configuration = configuration;
75 }
76
77
78
79
80
81
82
83
84
85 public ClaimStatistic execute() throws RatException {
86 if (document == null || statistic == null) {
87 try {
88 if (configuration.hasSource()) {
89 ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
90 Writer outputWriter = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8);
91 try (IXmlWriter writer = new XmlWriter(outputWriter)) {
92 statistic = new ClaimStatistic();
93 RatReport report = XmlReportFactory.createStandardReport(writer, statistic, configuration);
94 report.startReport();
95 configuration.getSources().build().run(report);
96 report.endReport();
97
98 InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
99 document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(inputStream);
100 }
101 } else {
102 document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
103 statistic = new ClaimStatistic();
104 }
105 } catch (Exception e) {
106 throw RatException.makeRatException(e);
107 }
108 }
109 return statistic;
110 }
111
112
113
114
115
116
117 public ClaimStatistic getClaimsStatistic() {
118 return statistic;
119 }
120
121
122
123
124
125
126 public ClaimStatistic output() throws RatException {
127 return output(configuration.getStyleSheet(), configuration.getOutput());
128 }
129
130
131
132
133
134
135
136
137
138
139 public ClaimStatistic output(final IOSupplier<InputStream> stylesheet, final IOSupplier<OutputStream> output) throws RatException {
140 ClaimStatistic result = execute();
141 TransformerFactory tf = TransformerFactory.newInstance();
142 Transformer transformer;
143 try (OutputStream out = output.get();
144 InputStream styleIn = stylesheet.get()) {
145 transformer = tf.newTransformer(new StreamSource(styleIn));
146 transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
147 transformer.setOutputProperty(OutputKeys.METHOD, "xml");
148 transformer.setOutputProperty(OutputKeys.INDENT, "yes");
149 transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
150 transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
151 transformer.transform(new DOMSource(document),
152 new StreamResult(new OutputStreamWriter(out, StandardCharsets.UTF_8)));
153 return result;
154 } catch (TransformerException | IOException e) {
155 throw new RatException(e);
156 }
157 }
158
159
160
161
162
163
164
165 public static void listLicenses(final ReportConfiguration configuration, final LicenseFilter filter) throws IOException {
166 try (PrintWriter pw = configuration.getWriter().get()) {
167 pw.format("Licenses (%s):%n", filter);
168 configuration.getLicenses(filter)
169 .forEach(lic -> pw.format(LICENSE_FORMAT, lic.getLicenseFamily().getFamilyCategory(),
170 lic.getLicenseFamily().getFamilyName(), lic.getNote()));
171 pw.println();
172 }
173 }
174
175
176
177
178
179
180 public void writeSummary(final Appendable appendable) throws IOException {
181 appendable.append("RAT summary:").append(System.lineSeparator());
182 for (ClaimStatistic.Counter counter : ClaimStatistic.Counter.values()) {
183 appendable.append(" ").append(counter.displayName()).append(": ")
184 .append(Integer.toString(getClaimsStatistic().getCounter(counter)))
185 .append(System.lineSeparator());
186 }
187 }
188 }