Skip to content

Commit 33bfd00

Browse files
committed
[core] Refactor how CPD Renderers are determined
1 parent ee8622e commit 33bfd00

File tree

2 files changed

+45
-84
lines changed

2 files changed

+45
-84
lines changed

pmd-core/src/main/java/net/sourceforge/pmd/cpd/CPDConfiguration.java

Lines changed: 39 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public class CPDConfiguration extends AbstractConfiguration {
4242
public static final String DEFAULT_LANGUAGE = "java";
4343
public static final String DEFAULT_RENDERER = "text";
4444

45-
private static final Map<String, Class<? extends CPDRenderer>> RENDERERS = new HashMap<>();
45+
private static final Map<String, Class<?>> RENDERERS = new HashMap<>();
4646

4747
static {
4848
RENDERERS.put(DEFAULT_RENDERER, SimpleRenderer.class);
@@ -175,86 +175,65 @@ public void postContruct() {
175175
setRendererName(DEFAULT_RENDERER);
176176
}
177177
if (getRenderer() == null && getCPDRenderer() == null) {
178-
try {
179-
try {
180-
setRenderer(getCPDReportRendererFromString(getRendererName(), getEncoding()));
181-
} catch (ClassCastException e) {
182-
// The renderer class configured is not using the new CPDReportRenderer interface...
183-
setCPDRenderer(getCPDRendererFromString(getRendererName(), getEncoding()));
184-
}
185-
} catch (ClassCastException e) {
186-
// The renderer class configured is not using the new CPDRenderer interface...
187-
setRenderer(getRendererFromString(getRendererName(), getEncoding()));
178+
Object renderer = createRendererByName(getRendererName(), getEncoding());
179+
String className = getRendererName();
180+
181+
if (renderer instanceof CPDReportRenderer) {
182+
setRenderer((CPDReportRenderer) renderer);
183+
} else if (renderer instanceof CPDRenderer) {
184+
setCPDRenderer((CPDRenderer) renderer);
185+
} else if (renderer instanceof Renderer) {
186+
setRenderer((Renderer) renderer);
187+
} else {
188+
System.err.println("Class '" + className + "' is not a supported renderer, defaulting to SimpleRenderer.");
189+
setRenderer(new SimpleRenderer());
188190
}
189191
}
190192
}
191193

192-
/**
193-
* @deprecated Internal API
194-
*/
195-
@Deprecated
196-
@InternalApi
197-
public static Renderer getRendererFromString(String name, String encoding) {
198-
String clazzname = name;
199-
if (clazzname == null || "".equals(clazzname)) {
200-
clazzname = DEFAULT_RENDERER;
194+
private static Object createRendererByName(String name, String encoding) {
195+
if (name == null || "".equals(name)) {
196+
name = DEFAULT_RENDERER;
201197
}
202-
@SuppressWarnings("unchecked") // Safe, all standard implementations implement both interfaces
203-
Class<? extends Renderer> clazz = (Class<? extends Renderer>) RENDERERS.get(clazzname.toLowerCase(Locale.ROOT));
204-
if (clazz == null) {
198+
Class<?> rendererClass = RENDERERS.get(name.toLowerCase(Locale.ROOT));
199+
if (rendererClass == null) {
205200
try {
206-
clazz = Class.forName(clazzname).asSubclass(Renderer.class);
201+
rendererClass = Class.forName(name);
207202
} catch (ClassNotFoundException e) {
208203
System.err.println("Can't find class '" + name + "', defaulting to SimpleRenderer.");
209-
clazz = SimpleRenderer.class;
204+
rendererClass = SimpleRenderer.class;
210205
}
211206
}
207+
208+
Object renderer = null;
212209
try {
213-
Renderer renderer = clazz.getDeclaredConstructor().newInstance();
210+
renderer = rendererClass.getDeclaredConstructor().newInstance();
214211
setRendererEncoding(renderer, encoding);
215-
return renderer;
216212
} catch (Exception e) {
217213
System.err.println("Couldn't instantiate renderer, defaulting to SimpleRenderer: " + e);
218-
return new SimpleRenderer();
214+
renderer = new SimpleRenderer();
219215
}
216+
return renderer;
220217
}
221218

222219
/**
223220
* @deprecated Internal API
224221
*/
225222
@Deprecated
226223
@InternalApi
227-
public static CPDRenderer getCPDRendererFromString(String name, String encoding) {
228-
String clazzname = name;
229-
if (clazzname == null || "".equals(clazzname)) {
230-
clazzname = DEFAULT_RENDERER;
231-
}
232-
Class<? extends CPDRenderer> clazz = RENDERERS.get(clazzname.toLowerCase(Locale.ROOT));
233-
if (clazz == null) {
234-
try {
235-
clazz = Class.forName(clazzname).asSubclass(CPDRenderer.class);
236-
} catch (ClassNotFoundException e) {
237-
System.err.println("Can't find class '" + name + "', defaulting to SimpleRenderer.");
238-
clazz = SimpleRenderer.class;
239-
}
240-
}
241-
try {
242-
CPDRenderer renderer = clazz.getDeclaredConstructor().newInstance();
243-
setRendererEncoding(renderer, encoding);
244-
return renderer;
245-
} catch (Exception e) {
246-
System.err.println("Couldn't instantiate renderer, defaulting to SimpleRenderer: " + e);
247-
return new SimpleRenderer();
248-
}
224+
public static Renderer getRendererFromString(String name, String encoding) {
225+
// will throw a ClassCastException if the renderer is of wrong type
226+
return (Renderer) createRendererByName(name, encoding);
249227
}
250228

251-
static CPDReportRenderer getCPDReportRendererFromString(String name, String encoding) {
252-
final CPDRenderer renderer = getCPDRendererFromString(name, encoding);
253-
if (renderer instanceof CPDReportRenderer) {
254-
return (CPDReportRenderer) renderer;
255-
} else {
256-
return new CPDRendererAdapter(renderer);
257-
}
229+
/**
230+
* @deprecated Internal API
231+
*/
232+
@Deprecated
233+
@InternalApi
234+
public static CPDRenderer getCPDRendererFromString(String name, String encoding) {
235+
// will throw a ClassCastException if the renderer is of wrong type
236+
return (CPDRenderer) createRendererByName(name, encoding);
258237
}
259238

260239
private static void setRendererEncoding(Object renderer, String encoding)
@@ -417,6 +396,7 @@ public boolean accept(File dir, String name) {
417396
public void setRenderer(Renderer renderer) {
418397
this.renderer = renderer;
419398
this.cpdRenderer = null;
399+
this.cpdReportRenderer = null;
420400
}
421401

422402
/**
@@ -426,8 +406,9 @@ public void setRenderer(Renderer renderer) {
426406
@Deprecated
427407
@InternalApi
428408
public void setCPDRenderer(CPDRenderer renderer) {
429-
this.cpdRenderer = renderer;
430409
this.renderer = null;
410+
this.cpdRenderer = renderer;
411+
this.cpdReportRenderer = new CPDRendererAdapter(renderer);
431412
}
432413

433414
void setRenderer(CPDReportRenderer renderer) {

pmd-core/src/main/java/net/sourceforge/pmd/cpd/GUI.java

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import java.io.File;
2121
import java.io.IOException;
2222
import java.io.PrintWriter;
23-
import java.io.Writer;
2423
import java.nio.file.Files;
2524
import java.util.ArrayList;
2625
import java.util.Collections;
@@ -66,35 +65,16 @@
6665
import javax.swing.table.TableModel;
6766

6867
import net.sourceforge.pmd.PMDVersion;
68+
import net.sourceforge.pmd.cpd.renderer.CPDRendererAdapter;
6969
import net.sourceforge.pmd.cpd.renderer.CPDReportRenderer;
7070

7171
public class GUI implements CPDListener {
7272

73-
// private interface Renderer {
74-
// String render(Iterator<Match> items);
75-
// }
76-
77-
private static final Object[][] RENDERER_SETS = new Object[][] { { "Text", new CPDReportRenderer() {
78-
@Override
79-
public void render(CPDReport report, Writer writer) throws IOException {
80-
new SimpleRenderer().render(report.getMatches(), writer);
81-
}
82-
}, }, { "XML", new CPDReportRenderer() {
83-
@Override
84-
public void render(CPDReport report, Writer writer) throws IOException {
85-
new XMLRenderer().render(report, writer);
86-
}
87-
}, }, { "CSV (comma)", new CPDReportRenderer() {
88-
@Override
89-
public void render(CPDReport report, Writer writer) throws IOException {
90-
new CSVRenderer(',').render(report.getMatches(), writer);
91-
}
92-
}, }, { "CSV (tab)", new CPDReportRenderer() {
93-
@Override
94-
public void render(CPDReport report, Writer writer) throws IOException {
95-
new CSVRenderer('\t').render(report.getMatches(), writer);
96-
}
97-
}, }, };
73+
private static final Object[][] RENDERER_SETS = new Object[][] {
74+
{ "Text", new CPDRendererAdapter(new SimpleRenderer()), },
75+
{ "XML", new XMLRenderer(), },
76+
{ "CSV (comma)", new CPDRendererAdapter(new CSVRenderer(',')), },
77+
{ "CSV (tab)", new CPDRendererAdapter(new CSVRenderer('\t')), }, };
9878

9979
private abstract static class LanguageConfig {
10080
public abstract Language languageFor(Properties p);

0 commit comments

Comments
 (0)