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 void output() throws RatException {
127 output(configuration.getStyleSheet(), configuration.getOutput());
128 }
129
130
131
132
133
134
135
136
137
138 public void output(final IOSupplier<InputStream> stylesheet, final IOSupplier<OutputStream> output) throws RatException {
139 execute();
140 TransformerFactory tf = TransformerFactory.newInstance();
141 Transformer transformer;
142 try (OutputStream out = output.get();
143 InputStream styleIn = stylesheet.get()) {
144 transformer = tf.newTransformer(new StreamSource(styleIn));
145 transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
146 transformer.setOutputProperty(OutputKeys.METHOD, "xml");
147 transformer.setOutputProperty(OutputKeys.INDENT, "yes");
148 transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
149 transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
150 transformer.transform(new DOMSource(document),
151 new StreamResult(new OutputStreamWriter(out, StandardCharsets.UTF_8)));
152 } catch (TransformerException | IOException e) {
153 throw new RatException(e);
154 }
155 }
156
157
158
159
160
161
162
163 public static void listLicenses(final ReportConfiguration configuration, final LicenseFilter filter) throws IOException {
164 try (PrintWriter pw = configuration.getWriter().get()) {
165 pw.format("Licenses (%s):%n", filter);
166 configuration.getLicenses(filter)
167 .forEach(lic -> pw.format(LICENSE_FORMAT, lic.getLicenseFamily().getFamilyCategory(),
168 lic.getLicenseFamily().getFamilyName(), lic.getNote()));
169 pw.println();
170 }
171 }
172
173
174
175
176
177
178 public void writeSummary(final Appendable appendable) throws IOException {
179 appendable.append("RAT summary:").append(System.lineSeparator());
180 for (ClaimStatistic.Counter counter : ClaimStatistic.Counter.values()) {
181 appendable.append(" ").append(counter.displayName()).append(": ")
182 .append(Integer.toString(getClaimsStatistic().getCounter(counter)))
183 .append(System.lineSeparator());
184 }
185 }
186 }