1 package org.apache.rat.analysis;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 import java.io.BufferedReader;
22 import java.io.IOException;
23 import java.io.Reader;
24 import java.util.Collection;
25 import java.util.Locale;
26 import java.util.Objects;
27
28 import org.apache.rat.ConfigurationException;
29 import org.apache.rat.analysis.matchers.FullTextMatcher;
30 import org.apache.rat.api.Document;
31 import org.apache.rat.license.ILicense;
32
33
34
35
36
37
38
39 public class HeaderCheckWorker {
40
41
42
43
44
45
46
47
48
49
50
51 public static final int DEFAULT_NUMBER_OF_RETAINED_HEADER_LINES = 50;
52
53 private final int numberOfRetainedHeaderLines;
54
55 private final BufferedReader reader;
56
57 private final Collection<ILicense> licenses;
58
59 private final Document document;
60
61 private final IHeaderMatcher generatedMatcher;
62
63
64
65
66
67
68
69
70
71
72
73
74 public static IHeaders readHeader(final BufferedReader reader, final int numberOfLines) throws IOException {
75 final StringBuilder headers = new StringBuilder();
76 int headerLinesRead = 0;
77 String line;
78
79 while (headerLinesRead < numberOfLines && (line = reader.readLine()) != null) {
80 headers.append(line).append(System.lineSeparator());
81 }
82 final String raw = headers.toString();
83 final String pruned = FullTextMatcher.prune(raw).toLowerCase(Locale.ENGLISH);
84 return new IHeaders() {
85 @Override
86 public String raw() {
87 return raw;
88 }
89
90 @Override
91 public String pruned() {
92 return pruned;
93 }
94
95 @Override
96 public String toString() {
97 return this.getClass().getSimpleName();
98 }
99 };
100 }
101
102
103
104
105
106
107
108
109
110
111 public HeaderCheckWorker(final IHeaderMatcher generatedMatcher, final Reader reader, final Collection<ILicense> licenses, final Document name) {
112 this(generatedMatcher, reader, DEFAULT_NUMBER_OF_RETAINED_HEADER_LINES, licenses, name);
113 }
114
115
116
117
118
119
120
121
122
123
124
125 public HeaderCheckWorker(final IHeaderMatcher generatedMatcher, final Reader reader,
126 final int numberOfRetainedHeaderLine, final Collection<ILicense> licenses,
127 final Document document) {
128 Objects.requireNonNull(reader, "Reader may not be null");
129 Objects.requireNonNull(licenses, "Licenses may not be null");
130 if (numberOfRetainedHeaderLine < 0) {
131 throw new ConfigurationException("numberOfRetainedHeaderLine may not be less than zero");
132 }
133 this.reader = reader instanceof BufferedReader ? (BufferedReader) reader : new BufferedReader(reader);
134 this.numberOfRetainedHeaderLines = numberOfRetainedHeaderLine;
135 this.licenses = licenses;
136 this.document = document;
137 this.generatedMatcher = generatedMatcher;
138 }
139
140
141
142
143
144
145 public void read() throws RatHeaderAnalysisException {
146 try {
147 final IHeaders headers = readHeader(reader, numberOfRetainedHeaderLines);
148 if (generatedMatcher.matches(headers)) {
149 document.getMetaData().setDocumentType(Document.Type.IGNORED);
150 } else {
151 licenses.stream().filter(lic -> lic.matches(headers)).forEach(document.getMetaData()::reportOnLicense);
152 if (!document.getMetaData().detectedLicense()) {
153 document.getMetaData().reportOnLicense(UnknownLicense.INSTANCE);
154 }
155 }
156 } catch (IOException e) {
157 throw new RatHeaderAnalysisException("Cannot read header for " + document, e);
158 } finally {
159 licenses.forEach(ILicense::reset);
160 }
161 }
162 }