diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CPDConfiguration.java b/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CPDConfiguration.java index 8af6ac38b2..9b25d16402 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CPDConfiguration.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CPDConfiguration.java @@ -3,10 +3,12 @@ */ package net.sourceforge.pmd.cpd; +import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.io.File; import java.io.FilenameFilter; import java.io.Reader; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Arrays; import java.util.HashMap; @@ -173,12 +175,7 @@ public class CPDConfiguration extends AbstractConfiguration { } try { Renderer renderer = clazz.getDeclaredConstructor().newInstance(); - - PropertyDescriptor encodingProperty = new PropertyDescriptor("encoding", clazz); - Method method = encodingProperty.getWriteMethod(); - if (method != null) { - method.invoke(renderer, encoding); - } + setRendererEncoding(renderer, encoding); return renderer; } catch (Exception e) { System.err.println("Couldn't instantiate renderer, defaulting to SimpleRenderer: " + e); @@ -186,6 +183,19 @@ public class CPDConfiguration extends AbstractConfiguration { } } + private static void setRendererEncoding(Renderer renderer, String encoding) + throws IllegalAccessException, InvocationTargetException { + try { + PropertyDescriptor encodingProperty = new PropertyDescriptor("encoding", renderer.getClass()); + Method method = encodingProperty.getWriteMethod(); + if (method != null) { + method.invoke(renderer, encoding); + } + } catch (IntrospectionException e) { + // ignored - maybe this renderer doesn't have a encoding property + } + } + public static String[] getRenderers() { String[] result = RENDERERS.keySet().toArray(new String[RENDERERS.size()]); Arrays.sort(result); diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/cpd/CPDConfigurationTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/cpd/CPDConfigurationTest.java new file mode 100644 index 0000000000..98fb23b789 --- /dev/null +++ b/pmd-core/src/test/java/net/sourceforge/pmd/cpd/CPDConfigurationTest.java @@ -0,0 +1,29 @@ +/** + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ +package net.sourceforge.pmd.cpd; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +public class CPDConfigurationTest { + + @Test + public void testRenderers() { + Map> renderersToTest = new HashMap>(); + renderersToTest.put("csv", CSVRenderer.class); + renderersToTest.put("xml", XMLRenderer.class); + renderersToTest.put("csv_with_linecount_per_file", CSVWithLinecountPerFileRenderer.class); + renderersToTest.put("vs", VSRenderer.class); + renderersToTest.put("text", SimpleRenderer.class); + + for (Map.Entry> entry : renderersToTest.entrySet()) { + Renderer r = CPDConfiguration.getRendererFromString(entry.getKey(), "UTF-8"); + Assert.assertNotNull(r); + Assert.assertSame(entry.getValue(), r.getClass()); + } + } +} diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/cpd/CPDCommandLineInterfaceTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/cpd/CPDCommandLineInterfaceTest.java index 0dff26e0d6..b0025deb2b 100644 --- a/pmd-java/src/test/java/net/sourceforge/pmd/cpd/CPDCommandLineInterfaceTest.java +++ b/pmd-java/src/test/java/net/sourceforge/pmd/cpd/CPDCommandLineInterfaceTest.java @@ -114,6 +114,16 @@ public class CPDCommandLineInterfaceTest { Assert.assertTrue(out.contains("")); } + @Test + public void testCSVFormat() throws Exception { + runCPD("--minimum-tokens", "100", + "--files", "src/test/resources/net/sourceforge/pmd/cpd/badandgood/", + "--language", "c", + "--format", "csv"); + String out = bufferStdout.toString("UTF-8"); + Assert.assertFalse(out.contains("Couldn't instantiate renderer")); + } + private void runCPD(String... args) { System.setProperty(CPDCommandLineInterface.NO_EXIT_AFTER_RUN, "true"); CPD.main(args); diff --git a/src/site/markdown/overview/changelog.md b/src/site/markdown/overview/changelog.md index 7132a84fc4..711a18ac54 100644 --- a/src/site/markdown/overview/changelog.md +++ b/src/site/markdown/overview/changelog.md @@ -22,5 +22,6 @@ * [#1375](https://sourceforge.net/p/pmd/bugs/1375/): CloseResource not detected properly * [#1376](https://sourceforge.net/p/pmd/bugs/1376/): CompareObjectsWithEquals fails for type annotated method parameter * [#1379](https://sourceforge.net/p/pmd/bugs/1379/): PMD CLI: Cannot specify multiple properties +* [#1381](https://sourceforge.net/p/pmd/bugs/1381/): CPD Cannot use CSV/VS Renderers because they don't support encoding property **API Changes:**