1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.rat.analysis.matchers;
20
21 import java.util.regex.Matcher;
22 import java.util.regex.Pattern;
23
24 import org.apache.commons.lang3.StringUtils;
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 public class CopyrightMatcher extends AbstractSimpleMatcher {
51
52 private static final String COPYRIGHT_SYMBOL_DEFN = "\\([Cc]\\)|©";
53 private static final String COPYRIGHT_PATTERN_DEFN = "(\\b)?" + COPYRIGHT_SYMBOL_DEFN + "|Copyright\\b";
54 private static final Pattern COPYRIGHT_PATTERN = Pattern.compile(COPYRIGHT_PATTERN_DEFN);
55 private static final String ONE_PART = "\\s+((" + COPYRIGHT_SYMBOL_DEFN + ")\\s+)?%s";
56 private static final String TWO_PART = "\\s+((" + COPYRIGHT_SYMBOL_DEFN + ")\\s+)?%s,?\\s+%s";
57
58 private final Pattern dateOwnerPattern;
59 private final Pattern ownerDatePattern;
60
61
62
63
64
65
66
67 public CopyrightMatcher(String start, String stop, String owner) {
68 this(null, start, stop, owner);
69 }
70
71
72
73
74
75
76
77
78 public CopyrightMatcher(String id, String start, String stop, String owner) {
79 super(id);
80 String dateDefn = "";
81 if (StringUtils.isNotEmpty(start)) {
82 if (StringUtils.isNotEmpty(stop)) {
83 dateDefn = String.format("%s\\s*-\\s*%s", start.trim(), stop.trim());
84 } else {
85 dateDefn = start.trim();
86 }
87 }
88 if (StringUtils.isEmpty(owner)) {
89
90 if (StringUtils.isEmpty(dateDefn)) {
91 dateDefn = "[0-9]{4}";
92 }
93 dateOwnerPattern = Pattern.compile(String.format(ONE_PART, dateDefn));
94 ownerDatePattern = null;
95 } else {
96 if (StringUtils.isEmpty(dateDefn)) {
97
98 dateOwnerPattern = Pattern.compile(String.format(ONE_PART, owner));
99 ownerDatePattern = null;
100 } else {
101 dateOwnerPattern = Pattern.compile(String.format(TWO_PART, dateDefn, owner));
102 ownerDatePattern = Pattern.compile(String.format(TWO_PART, owner, dateDefn));
103 }
104 }
105 }
106
107 @Override
108 protected boolean doMatch(String line) {
109 String lowerLine = line.toLowerCase();
110 if (lowerLine.contains("copyright") || lowerLine.contains("(c)") || line.contains("©")) {
111 Matcher matcher = COPYRIGHT_PATTERN.matcher(line);
112 if (matcher.find()) {
113 String buffer = line.substring(matcher.end());
114 matcher = dateOwnerPattern.matcher(buffer);
115 if (matcher.find() && matcher.start() == 0) {
116 return true;
117 }
118 if (ownerDatePattern != null) {
119 matcher = ownerDatePattern.matcher(buffer);
120 return matcher.find() && matcher.start() == 0;
121 }
122 }
123 }
124 return false;
125 }
126 }