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.IOException;
22 import java.io.UnsupportedEncodingException;
23 import java.util.Locale;
24
25 import org.apache.maven.plugins.annotations.Component;
26 import org.apache.maven.plugins.annotations.Mojo;
27 import org.apache.maven.plugins.annotations.Parameter;
28 import org.apache.maven.plugins.pmd.exec.CpdExecutor;
29 import org.apache.maven.plugins.pmd.exec.CpdRequest;
30 import org.apache.maven.plugins.pmd.exec.CpdResult;
31 import org.apache.maven.reporting.MavenReportException;
32 import org.apache.maven.toolchain.Toolchain;
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 @Component
101 private I18N i18n;
102
103
104
105
106
107
108 private CpdResult cpdResult;
109
110
111 public String getName(Locale locale) {
112 return getI18nString(locale, "name");
113 }
114
115
116 public String getDescription(Locale locale) {
117 return getI18nString(locale, "description");
118 }
119
120
121
122
123
124
125 protected String getI18nString(Locale locale, String key) {
126 return i18n.getString("cpd-report", locale, "report.cpd." + key);
127 }
128
129
130
131
132 @Override
133 public void executeReport(Locale locale) throws MavenReportException {
134 ClassLoader origLoader = Thread.currentThread().getContextClassLoader();
135 try {
136 Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
137
138 CpdReportRenderer r = new CpdReportRenderer(
139 getSink(), i18n, locale, filesToProcess, cpdResult.getDuplications(), isAggregator());
140 r.render();
141 } finally {
142 Thread.currentThread().setContextClassLoader(origLoader);
143 }
144 }
145
146 @Override
147 public boolean canGenerateReport() {
148 if (skip) {
149 getLog().info("Skipping CPD execution");
150 return false;
151 }
152
153 boolean result = super.canGenerateReport();
154 if (result) {
155 try {
156 executeCpd();
157 if (skipEmptyReport) {
158 result = cpdResult.hasDuplications();
159 if (!result) {
160 getLog().debug("Skipping report since skipEmptyReport is true and there are no CPD issues.");
161 }
162 }
163 } catch (MavenReportException e) {
164 throw new RuntimeException(e);
165 }
166 }
167 return result;
168 }
169
170 private void executeCpd() throws MavenReportException {
171 if (cpdResult != null) {
172
173 getLog().debug("CPD has already been run - skipping redundant execution.");
174 return;
175 }
176
177 try {
178 filesToProcess = getFilesToProcess();
179
180 CpdRequest request = new CpdRequest();
181 request.setMinimumTokens(minimumTokens);
182 request.setLanguage(language);
183 request.setIgnoreAnnotations(ignoreAnnotations);
184 request.setIgnoreIdentifiers(ignoreIdentifiers);
185 request.setIgnoreLiterals(ignoreLiterals);
186 request.setSourceEncoding(getInputEncoding());
187 request.addFiles(filesToProcess.keySet());
188 request.setLogLevel(determineCurrentRootLogLevel());
189 request.setExcludeFromFailureFile(excludeFromFailureFile);
190 request.setTargetDirectory(targetDirectory.getAbsolutePath());
191 request.setOutputEncoding(getOutputEncoding());
192 request.setFormat(format);
193 request.setIncludeXmlInSite(includeXmlInSite);
194 request.setReportOutputDirectory(getReportOutputDirectory().getAbsolutePath());
195
196 Toolchain tc = getToolchain();
197 if (tc != null) {
198 getLog().info("Toolchain in maven-pmd-plugin: " + tc);
199 String javaExecutable = tc.findTool("java");
200 request.setJavaExecutable(javaExecutable);
201 }
202
203 getLog().info("PMD version: " + AbstractPmdReport.getPmdVersion());
204 cpdResult = CpdExecutor.execute(request);
205 } catch (UnsupportedEncodingException e) {
206 throw new MavenReportException("Encoding '" + getInputEncoding() + "' is not supported.", e);
207 } catch (IOException e) {
208 throw new MavenReportException(e.getMessage(), e);
209 }
210 }
211
212
213
214
215 public String getOutputName() {
216 return "cpd";
217 }
218 }