/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.cpd; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; public class CPD { private Map source = new HashMap(); private CPDListener listener = new CPDNullListener(); private Tokens tokens = new Tokens(); private int minimumTileSize; private MatchAlgorithm matchAlgorithm; private Language language; public CPD(int minimumTileSize, Language language) { this.minimumTileSize = minimumTileSize; this.language = language; } public void setCpdListener(CPDListener cpdListener) { this.listener = cpdListener; } public void go() { TokenEntry.clearImages(); matchAlgorithm = new MatchAlgorithm(source, tokens, minimumTileSize, listener); matchAlgorithm.findMatches(); } public Iterator getMatches() { return matchAlgorithm.matches(); } public void add(File file) throws IOException { add(1, file); } public void addAllInDirectory(String dir) throws IOException { addDirectory(dir, false); } public void addRecursively(String dir) throws IOException { addDirectory(dir, true); } public void add(List files) throws IOException { for (Iterator i = files.iterator(); i.hasNext();) { add(files.size(), (File) i.next()); } } private void addDirectory(String dir, boolean recurse) throws IOException { FileFinder finder = new FileFinder(); add(finder.findFilesFrom(dir, language.getFileFilter(), recurse)); } private void add(int fileCount, File file) throws IOException { listener.addedFile(fileCount, file); SourceCode sourceCode = new SourceCode(file.getAbsolutePath()); language.getTokenizer().tokenize(sourceCode, tokens); source.put(sourceCode.getFileName(), sourceCode); } public static void main(String[] args) { if (args.length >3 || args.length < 2) { usage(); System.exit(1); } try { String lang = LanguageFactory.JAVA_KEY; if (args.length == 3) { lang = args[2]; } LanguageFactory f = new LanguageFactory(); Language language = f.createLanguage(lang); CPD cpd = new CPD(Integer.parseInt(args[0]), language); cpd.addRecursively(args[1]); long start = System.currentTimeMillis(); cpd.go(); long total = System.currentTimeMillis() - start; System.out.println(new SimpleRenderer().render(cpd.getMatches())); System.out.println("That took " + total + " milliseconds"); } catch (Exception e) { e.printStackTrace(); } } private static void usage() { System.out.println("Usage:"); System.out.println(" java net.sourceforge.pmd.cpd.CPD <tile size> <directory> [<language>]"); System.out.println("i.e: "); System.out.println(" java net.sourceforge.pmd.cpd.CPD 100 c:\\jdk14\\src\\java "); System.out.println("or: "); System.out.println(" java net.sourceforge.pmd.cpd.CPD 100 c:\\apache\\src\\ cpp"); } }