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.File;
22 import java.io.FileInputStream;
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.StringReader;
29 import java.nio.charset.StandardCharsets;
30
31 import javax.xml.transform.TransformerException;
32 import javax.xml.transform.dom.DOMSource;
33 import javax.xml.transform.stream.StreamResult;
34
35 import org.apache.commons.io.function.IOSupplier;
36 import org.apache.rat.api.RatException;
37 import org.apache.rat.document.DocumentName;
38 import org.apache.rat.license.LicenseSetFactory.LicenseFilter;
39 import org.apache.rat.report.RatReport;
40 import org.apache.rat.report.claim.ClaimStatistic;
41 import org.apache.rat.report.xml.XmlReportFactory;
42 import org.apache.rat.report.xml.writer.XmlWriter;
43 import org.apache.rat.utils.StandardXmlFactory;
44 import org.w3c.dom.Document;
45 import org.xml.sax.InputSource;
46 import org.xml.sax.SAXException;
47
48
49
50
51
52 public class Reporter {
53
54
55
56
57 private static final String LICENSE_FORMAT = "%s:\t%s%n\t\t%s%n";
58
59
60
61
62 private final ReportConfiguration configuration;
63
64
65
66
67 private Output output;
68
69
70
71
72
73
74 public Reporter(final ReportConfiguration configuration) {
75 this.configuration = configuration;
76 }
77
78
79
80
81
82
83
84 public Output execute() throws RatException {
85 try {
86 Output.Builder builder = Output.builder().configuration(configuration);
87 if (configuration.hasSource()) {
88 StringBuilder sb = new StringBuilder();
89 try (XmlWriter writer = new XmlWriter(sb)) {
90 writer.startDocument();
91 ClaimStatistic statistic = new ClaimStatistic();
92 builder.statistic(statistic);
93 RatReport report = XmlReportFactory.createStandardReport(writer, statistic, configuration);
94 report.startReport();
95 configuration.getSources().build().run(report);
96 report.endReport();
97 InputSource inputSource = new InputSource(new StringReader(sb.toString()));
98 builder.document(StandardXmlFactory.documentBuilder().parse(inputSource));
99 }
100 } else {
101 builder.document = StandardXmlFactory.documentBuilder().newDocument();
102 builder.statistic(new ClaimStatistic());
103 }
104 this.output = builder.build();
105 return output;
106 } catch (Exception e) {
107 throw RatException.makeRatException(e);
108 }
109 }
110
111
112
113
114
115
116 public Output getOutput() {
117 return output;
118 }
119
120
121
122
123 public static final class Output {
124
125
126
127 private final Document document;
128
129
130
131
132 private final ClaimStatistic statistic;
133
134
135
136 private final ReportConfiguration configuration;
137
138
139
140
141
142
143 private Output(final Builder builder) {
144 this.document = builder.document;
145 this.statistic = builder.statistic == null ? new ClaimStatistic() : builder.statistic;
146 this.configuration = builder.configuration == null ? new ReportConfiguration() : builder.configuration;
147 }
148
149 public static Builder builder() {
150 return new Builder();
151 }
152
153
154
155
156
157
158 public Document getDocument() {
159 return document;
160 }
161
162
163
164
165
166
167 public ClaimStatistic getStatistic() {
168 return statistic;
169 }
170
171 public ReportConfiguration getConfiguration() {
172 return configuration;
173 }
174
175
176
177
178
179
180
181 public void format(final ReportConfiguration config) throws RatException {
182 format(config.getStyleSheet(), config.getOutput());
183 }
184
185
186
187
188
189
190
191
192
193 public void format(final IOSupplier<InputStream> stylesheet, final IOSupplier<OutputStream> output) throws RatException {
194 try (OutputStream out = output.get();
195 InputStream styleIn = stylesheet.get()) {
196 StandardXmlFactory.createTransformer(styleIn).transform(new DOMSource(document),
197 new StreamResult(new OutputStreamWriter(out, StandardCharsets.UTF_8)));
198 } catch (TransformerException | IOException e) {
199 throw new RatException(e);
200 }
201 }
202
203
204
205
206
207
208
209 public void listLicenses(final PrintWriter printWriter, final LicenseFilter filter) {
210 printWriter.format("Licenses (%s):%n", filter);
211 configuration.getLicenses(filter)
212 .forEach(lic -> printWriter.format(LICENSE_FORMAT, lic.getLicenseFamily().getFamilyCategory(),
213 lic.getLicenseFamily().getFamilyName(), lic.getNote()));
214 printWriter.println();
215 }
216
217
218
219
220
221
222
223 public void listLicenses(final LicenseFilter filter) throws IOException {
224 try (PrintWriter pw = configuration.getWriter().get()) {
225 listLicenses(pw, filter);
226 }
227 }
228
229
230
231
232
233
234
235 public void writeSummary(final Appendable appendable) throws IOException {
236 appendable.append("RAT summary:").append(System.lineSeparator());
237 for (ClaimStatistic.Counter counter : ClaimStatistic.Counter.values()) {
238 appendable.append(" ").append(counter.displayName()).append(": ")
239 .append(Integer.toString(statistic.getCounter(counter)))
240 .append(System.lineSeparator());
241 }
242 }
243
244 public static final class Builder {
245
246
247
248 private Document document;
249
250
251
252
253 private ClaimStatistic statistic;
254
255
256
257 private ReportConfiguration configuration;
258
259 public Builder document(final Document document) {
260 this.document = document;
261 return this;
262 }
263
264 public Builder document(final String fileName, final DocumentName workingDirectory) {
265 File inputFile = workingDirectory.resolve(fileName).asFile();
266 try (InputStream inputStream = new FileInputStream(inputFile)) {
267 this.document = StandardXmlFactory.documentBuilder().parse(inputStream);
268 } catch (SAXException | IOException e) {
269 throw new ConfigurationException("Unable to read file: " + inputFile, e);
270 }
271 return this;
272 }
273
274 public Output build() {
275 return new Output(this);
276 }
277
278 public Builder statistic(final ClaimStatistic statistic) {
279 this.statistic = statistic;
280 return this;
281 }
282
283 public Builder statistic(final String fileName, final DocumentName workingDirectory) {
284 File sourceFile = workingDirectory.resolve(fileName).asFile();
285 try {
286 ClaimStatistic newStatistic = new ClaimStatistic();
287 newStatistic.serDes().deserialize(() -> new FileInputStream(sourceFile));
288 this.statistic = newStatistic;
289 return this;
290 } catch (IOException e) {
291 throw new ConfigurationException("Unable to read file: " + sourceFile, e);
292 }
293 }
294
295 public Builder configuration(final ReportConfiguration configuration) {
296 this.configuration = configuration;
297 return this;
298 }
299
300 public Builder configuration(final String fileName, final DocumentName workingDirectory) {
301 File configurationFile = workingDirectory.resolve(fileName).asFile();
302 try {
303 ReportConfiguration config = new ReportConfiguration();
304 config.serDes().deserialize(() -> new FileInputStream(configurationFile), workingDirectory);
305 this.configuration = config;
306 return this;
307 } catch (IOException e) {
308 throw new ConfigurationException("Unable to read file: " + configurationFile, e);
309 }
310 }
311 }
312 }
313 }