diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CPD.java b/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CPD.java index a467037055..d2e9bd18c3 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CPD.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CPD.java @@ -53,11 +53,11 @@ public class CPD { return matchAlgorithm.matches(); } - public void addAllInDirectory(String dir) throws IOException { + public void addAllInDirectory(File dir) throws IOException { addDirectory(dir, false); } - public void addRecursively(String dir) throws IOException { + public void addRecursively(File dir) throws IOException { addDirectory(dir, true); } @@ -67,8 +67,8 @@ public class CPD { } } - private void addDirectory(String dir, boolean recurse) throws IOException { - if (!(new File(dir)).exists()) { + private void addDirectory(File dir, boolean recurse) throws IOException { + if (!dir.exists()) { throw new FileNotFoundException("Couldn't find directory " + dir); } FileFinder finder = new FileFinder(); diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CPDCommandLineInterface.java b/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CPDCommandLineInterface.java index b3a140b6b2..0294f5c3a9 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CPDCommandLineInterface.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CPDCommandLineInterface.java @@ -3,6 +3,9 @@ */ package net.sourceforge.pmd.cpd; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FilenameFilter; import java.io.IOException; import java.net.URISyntaxException; import java.util.Arrays; @@ -73,7 +76,7 @@ public class CPDCommandLineInterface { //Add files if ( null != arguments.getFiles() && ! arguments.getFiles().isEmpty() ) { - addSourcesFilesToCPD(arguments.getFiles(),cpd, !arguments.isNonRecursive()); + addSourcesFilesToCPD(arguments.getFiles(), arguments.filenameFilter(), cpd, !arguments.isNonRecursive()); } //Add Database URIS @@ -89,14 +92,27 @@ public class CPDCommandLineInterface { } } - private static void addSourcesFilesToCPD(List files, CPD cpd, boolean recursive) { + private static void addSourcesFilesToCPD(List files, FilenameFilter filter, CPD cpd, boolean recursive) { try { - for (String file : files) - if (recursive) { - cpd.addRecursively(file); + for (File file : files) { + if (!file.exists()) { + throw new FileNotFoundException("Couldn't find directory/file '" + file + "'"); + } else if (file.isDirectory()) { + if (recursive) { + cpd.addRecursively(file); + } else { + cpd.addAllInDirectory(file); + } } else { - cpd.addAllInDirectory(file); + //Add a single file if it is accepted by the file filter + File directory = file.getAbsoluteFile().getParentFile(); + String filename = file.getName(); + + if (filter.accept(directory, filename)) { + cpd.add(file); + } } + } } catch (IOException e) { throw new IllegalStateException(e); } 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 64e86c6088..f71da96842 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 @@ -16,6 +16,7 @@ import net.sourceforge.pmd.util.FileFinder; import com.beust.jcommander.IStringConverter; import com.beust.jcommander.Parameter; +import com.beust.jcommander.converters.FileConverter; /** * @@ -69,11 +70,11 @@ public class CPDConfiguration extends AbstractConfiguration { + "Default is \"" + Tokenizer.DEFAULT_SKIP_BLOCKS_PATTERN + "\".", required = false) private String skipBlocksPattern = Tokenizer.DEFAULT_SKIP_BLOCKS_PATTERN; - @Parameter(names = "--files", variableArity = true, description = "List of files and directories to process", required = false) - private List files; + @Parameter(names = "--files", variableArity = true, description = "List of files and directories to process", required = false, converter = FileConverter.class) + private List files; - @Parameter(names = "--exclude", variableArity = true, description = "Files to be excluded from CPD check", required = false) - private List excludes; + @Parameter(names = "--exclude", variableArity = true, description = "Files to be excluded from CPD check", required = false, converter = FileConverter.class) + private List excludes; @Parameter(names = "--non-recursive", description = "Don't scan subdirectiories", required = false) private boolean nonRecursive; @@ -245,15 +246,14 @@ public class CPDConfiguration extends AbstractConfiguration { if (excludes != null) { FileFinder finder = new FileFinder(); - for (String excludedFile : excludes) { - File exFile = new File(excludedFile); - if (exFile.isDirectory()) { + for (File excludedFile : excludes) { + if (excludedFile.isDirectory()) { List files = finder.findFilesFrom(excludedFile, languageFilter, true); for (File f : files) { exclusions.add(f.getAbsolutePath()); } } else { - exclusions.add(exFile.getAbsolutePath()); + exclusions.add(excludedFile.getAbsolutePath()); } } } @@ -307,11 +307,11 @@ public class CPDConfiguration extends AbstractConfiguration { this.skipLexicalErrors = skipLexicalErrors; } - public List getFiles() { + public List getFiles() { return files; } - public void setFiles(List files) { + public void setFiles(List files) { this.files = files; } @@ -323,11 +323,11 @@ public class CPDConfiguration extends AbstractConfiguration { this.uri = uri; } - public List getExcludes() { + public List getExcludes() { return excludes; } - public void setExcludes(List excludes) { + public void setExcludes(List excludes) { this.excludes = excludes; } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/cpd/GUI.java b/pmd-core/src/main/java/net/sourceforge/pmd/cpd/GUI.java index eaef527a97..520a3e1cd0 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/cpd/GUI.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/cpd/GUI.java @@ -572,9 +572,9 @@ public class GUI implements CPDListener { } private void go() { - String dirPath = rootDirectoryField.getText(); try { - if (!(new File(dirPath)).exists()) { + File dirPath = new File(rootDirectoryField.getText()); + if (!dirPath.exists()) { JOptionPane.showMessageDialog(frame, "Can't read from that root source directory", "Error", JOptionPane.ERROR_MESSAGE); @@ -602,8 +602,8 @@ public class GUI implements CPDListener { cpd.setCpdListener(this); tokenizingFilesBar.setMinimum(0); phaseLabel.setText(""); - if (isLegalPath(dirPath, conf)) { // should use the language file filter instead? - cpd.add(new File(dirPath)); + if (isLegalPath(dirPath.getPath(), conf)) { // should use the language file filter instead? + cpd.add(dirPath); } else { if (recurseCheckbox.isSelected()) { cpd.addRecursively(dirPath); diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/dcd/DCD.java b/pmd-core/src/main/java/net/sourceforge/pmd/dcd/DCD.java index 788c498a22..af1963d76a 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/dcd/DCD.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/dcd/DCD.java @@ -116,7 +116,7 @@ public class DCD { for (int i = 0; i < directories.size(); i++) { File directory = directories.get(i); FilenameFilter filter = filters.get(i); - List files = new FileFinder().findFilesFrom(directory.getPath(), filter, true); + List files = new FileFinder().findFilesFrom(directory, filter, true); for (File file : files) { String name = file.getPath(); diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/util/FileFinder.java b/pmd-core/src/main/java/net/sourceforge/pmd/util/FileFinder.java index c04e48c5b9..aea99caa53 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/util/FileFinder.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/util/FileFinder.java @@ -16,10 +16,10 @@ public class FileFinder { private FilenameFilter filter; private static final String FILE_SEP = System.getProperty("file.separator"); - public List findFilesFrom(String dir, FilenameFilter filter, boolean recurse) { + public List findFilesFrom(File dir, FilenameFilter filter, boolean recurse) { this.filter = filter; List files = new ArrayList(); - scanDirectory(new File(dir), files, recurse); + scanDirectory(dir, files, recurse); return files; } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/util/FileUtil.java b/pmd-core/src/main/java/net/sourceforge/pmd/util/FileUtil.java index c9cbc7844b..0c8093f925 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/util/FileUtil.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/util/FileUtil.java @@ -97,7 +97,7 @@ public final class FileUtil { .getDirectoryFilter(), Filters.toNormalizedFileFilter(Filters.buildRegexFilterExcludeOverInclude( null, Collections.singletonList("SCCS"))))); FileFinder finder = new FileFinder(); - List files = finder.findFilesFrom(file.getAbsolutePath(), Filters.toFilenameFilter(filter), true); + List files = finder.findFilesFrom(file, Filters.toFilenameFilter(filter), true); for (File f : files) { dataSources.add(new FileDataSource(f)); }