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 javax.inject.Inject;
22
23 import java.io.IOException;
24 import java.io.UnsupportedEncodingException;
25 import java.util.Locale;
26
27 import org.apache.maven.plugins.annotations.Mojo;
28 import org.apache.maven.plugins.annotations.Parameter;
29 import org.apache.maven.plugins.pmd.exec.CpdRequest;
30 import org.apache.maven.plugins.pmd.exec.CpdResult;
31 import org.apache.maven.plugins.pmd.exec.CpdServiceExecutor;
32 import org.apache.maven.reporting.MavenReportException;
33 import org.codehaus.plexus.i18n.I18N;
34
35
36
37
38
39
40
41
42
43
44
45
46 @Mojo(name = "cpd", threadSafe = true)
47 public class CpdReport extends AbstractPmdReport {
48
49
50
51
52
53
54 @Parameter(defaultValue = "java")
55 private String language;
56
57
58
59
60 @Parameter(property = "minimumTokens", defaultValue = "100")
61 private int minimumTokens;
62
63
64
65
66
67
68 @Parameter(property = "cpd.skip", defaultValue = "false")
69 private boolean skip;
70
71
72
73
74
75
76
77
78 @Parameter(property = "cpd.ignoreLiterals", defaultValue = "false")
79 private boolean ignoreLiterals;
80
81
82
83
84
85
86 @Parameter(property = "cpd.ignoreIdentifiers", defaultValue = "false")
87 private boolean ignoreIdentifiers;
88
89
90
91
92
93
94 @Parameter(property = "cpd.ignoreAnnotations", defaultValue = "false")
95 private boolean ignoreAnnotations;
96
97
98
99
100 private final I18N i18n;
101
102 private final CpdServiceExecutor serviceExecutor;
103
104
105
106
107
108
109 private CpdResult cpdResult;
110
111 @Inject
112 public CpdReport(I18N i18n, CpdServiceExecutor serviceExecutor) {
113 this.i18n = i18n;
114 this.serviceExecutor = serviceExecutor;
115 }
116
117
118 public String getName(Locale locale) {
119 return getI18nString(locale, "name");
120 }
121
122
123 public String getDescription(Locale locale) {
124 return getI18nString(locale, "description");
125 }
126
127
128
129
130
131
132 protected String getI18nString(Locale locale, String key) {
133 return i18n.getString("cpd-report", locale, "report.cpd." + key);
134 }
135
136
137
138
139 @Override
140 public void executeReport(Locale locale) throws MavenReportException {
141 ClassLoader origLoader = Thread.currentThread().getContextClassLoader();
142 try {
143 Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
144
145 CpdReportRenderer renderer = new CpdReportRenderer(
146 getSink(), i18n, locale, filesToProcess, cpdResult.getDuplications(), isAggregator());
147 renderer.render();
148 } finally {
149 Thread.currentThread().setContextClassLoader(origLoader);
150 }
151 }
152
153 @Override
154 public boolean canGenerateReport() throws MavenReportException {
155 if (skip) {
156 return false;
157 }
158
159 boolean result = canGenerateReportInternal();
160 if (result) {
161 executeCpd();
162 if (skipEmptyReport) {
163 result = cpdResult.hasDuplications();
164 }
165 }
166 return result;
167 }
168
169 private void executeCpd() throws MavenReportException {
170 if (cpdResult != null) {
171
172 getLog().debug("CPD has already been run - skipping redundant execution.");
173 return;
174 }
175
176 try {
177 filesToProcess = getFilesToProcess();
178
179 CpdRequest request = new CpdRequest();
180 request.setMinimumTokens(minimumTokens);
181 request.setLanguage(language);
182 request.setIgnoreAnnotations(ignoreAnnotations);
183 request.setIgnoreIdentifiers(ignoreIdentifiers);
184 request.setIgnoreLiterals(ignoreLiterals);
185 request.setSourceEncoding(getInputEncoding());
186 request.addFiles(filesToProcess.keySet());
187 request.setExcludeFromFailureFile(excludeFromFailureFile);
188 request.setTargetDirectory(targetDirectory.getAbsolutePath());
189 request.setOutputEncoding(getOutputEncoding());
190 request.setFormat(format);
191 request.setIncludeXmlInReports(includeXmlInReports);
192 request.setReportOutputDirectory(getReportOutputDirectory().getAbsolutePath());
193 request.setJdkToolchain(getJdkToolchain());
194
195 cpdResult = serviceExecutor.execute(request);
196 } catch (UnsupportedEncodingException e) {
197 throw new MavenReportException("Encoding '" + getInputEncoding() + "' is not supported.", e);
198 } catch (IOException e) {
199 throw new MavenReportException(e.getMessage(), e);
200 }
201 }
202
203
204
205
206 @Override
207 @Deprecated
208 public String getOutputName() {
209 return "cpd";
210 }
211
212 @Override
213 public String getOutputPath() {
214 return "cpd";
215 }
216 }