1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.plugins.pmd;
20
21 import java.io.FileReader;
22 import java.io.IOException;
23 import java.io.LineNumberReader;
24 import java.util.ArrayList;
25 import java.util.HashSet;
26 import java.util.List;
27 import java.util.Set;
28
29 import net.sourceforge.pmd.cpd.Mark;
30 import net.sourceforge.pmd.cpd.Match;
31 import org.apache.maven.plugin.MojoExecutionException;
32 import org.apache.maven.plugins.pmd.model.CpdFile;
33 import org.apache.maven.plugins.pmd.model.Duplication;
34
35
36
37
38
39
40
41
42 public class ExcludeDuplicationsFromFile implements ExcludeFromFile<Duplication> {
43
44 private final List<Set<String>> exclusionList = new ArrayList<>();
45
46 @Override
47 public boolean isExcludedFromFailure(final Duplication errorDetail) {
48 final Set<String> uniquePaths = new HashSet<>();
49 for (final CpdFile cpdFile : errorDetail.getFiles()) {
50 uniquePaths.add(cpdFile.getPath());
51 }
52 return isExcludedFromFailure(uniquePaths);
53 }
54
55
56
57
58
59
60
61
62 public boolean isExcludedFromFailure(final Match errorDetail) {
63 final Set<String> uniquePaths = new HashSet<>();
64 for (Mark mark : errorDetail.getMarkSet()) {
65 uniquePaths.add(mark.getFilename());
66 }
67 return isExcludedFromFailure(uniquePaths);
68 }
69
70 private boolean isExcludedFromFailure(Set<String> uniquePaths) {
71 for (final Set<String> singleExclusionGroup : exclusionList) {
72 if (uniquePaths.size() == singleExclusionGroup.size()
73 && duplicationExcludedByGroup(uniquePaths, singleExclusionGroup)) {
74 return true;
75 }
76 }
77 return false;
78 }
79
80 private boolean duplicationExcludedByGroup(final Set<String> uniquePaths, final Set<String> singleExclusionGroup) {
81 for (final String path : uniquePaths) {
82 if (!fileExcludedByGroup(path, singleExclusionGroup)) {
83 return false;
84 }
85 }
86 return true;
87 }
88
89 private boolean fileExcludedByGroup(final String path, final Set<String> singleExclusionGroup) {
90 final String formattedPath = path.replace('\\', '.').replace('/', '.');
91 for (final String className : singleExclusionGroup) {
92 if (formattedPath.contains(className)) {
93 return true;
94 }
95 }
96 return false;
97 }
98
99 @Override
100 public void loadExcludeFromFailuresData(final String excludeFromFailureFile) throws MojoExecutionException {
101 if (excludeFromFailureFile == null || excludeFromFailureFile.isEmpty()) {
102 return;
103 }
104
105 try (LineNumberReader reader = new LineNumberReader(new FileReader(excludeFromFailureFile))) {
106 String line;
107 while ((line = reader.readLine()) != null) {
108 if (!line.startsWith("#")) {
109 exclusionList.add(createSetFromExclusionLine(line));
110 }
111 }
112 } catch (final IOException e) {
113 throw new MojoExecutionException("Cannot load file " + excludeFromFailureFile, e);
114 }
115 }
116
117 private Set<String> createSetFromExclusionLine(final String line) {
118 final Set<String> result = new HashSet<>();
119 for (final String className : line.split(",")) {
120 result.add(className.trim());
121 }
122 return result;
123 }
124
125 @Override
126 public int countExclusions() {
127 return exclusionList.size();
128 }
129 }