1 /***
2 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3 */
4 package net.sourceforge.pmd.cpd;
5
6 import java.io.File;
7 import java.io.FileReader;
8 import java.io.IOException;
9 import java.util.HashMap;
10 import java.util.Iterator;
11 import java.util.List;
12 import java.util.Map;
13
14 public class CPD {
15
16 private Map source = new HashMap();
17 private CPDListener listener = new CPDNullListener();
18 private Tokens tokens = new Tokens();
19 private int minimumTileSize;
20 private MatchAlgorithm matchAlgorithm;
21 private Language language;
22
23 public CPD(int minimumTileSize, Language language) {
24 this.minimumTileSize = minimumTileSize;
25 this.language = language;
26 }
27
28 public void setCpdListener(CPDListener cpdListener) {
29 this.listener = cpdListener;
30 }
31
32 public void go() {
33 matchAlgorithm = new MatchAlgorithm(source, tokens);
34 matchAlgorithm.setListener(listener);
35 matchAlgorithm.findMatches(minimumTileSize);
36 }
37
38 public Iterator getMatches() {
39 return matchAlgorithm.matches();
40 }
41
42 public void add(File file) throws IOException {
43 add(1, file);
44 }
45
46 public void addAllInDirectory(String dir) throws IOException {
47 addDirectory(dir, false);
48 }
49
50 public void addRecursively(String dir) throws IOException {
51 addDirectory(dir, true);
52 }
53
54 public void add(List files) throws IOException {
55 for (Iterator i = files.iterator(); i.hasNext();) {
56 add(files.size(), (File) i.next());
57 }
58 }
59
60 private void addDirectory(String dir, boolean recurse) throws IOException {
61 FileFinder finder = new FileFinder();
62 add(finder.findFilesFrom(dir, language.getFileFilter(), recurse));
63 }
64
65 private void add(int fileCount, File file) throws IOException {
66 listener.addedFile(fileCount, file);
67 SourceCode sourceCode = new SourceCode(file.getAbsolutePath());
68 FileReader reader = new FileReader(file);
69 language.getTokenizer().tokenize(sourceCode, tokens, reader);
70 reader.close();
71 source.put(sourceCode.getFileName(), sourceCode);
72 }
73
74 public static void main(String[] args) {
75 if (args.length >3 || args.length < 2) {
76 usage();
77 System.exit(1);
78 }
79
80 try {
81 String lang = LanguageFactory.JAVA_KEY;
82 if (args.length == 3) {
83 lang = args[2];
84 }
85 LanguageFactory f = new LanguageFactory();
86 Language language = f.createLanguage(lang);
87 CPD cpd = new CPD(Integer.parseInt(args[0]), language);
88 cpd.addRecursively(args[1]);
89 long start = System.currentTimeMillis();
90 cpd.go();
91 long total = System.currentTimeMillis() - start;
92 System.out.println(new SimpleRenderer().render(cpd.getMatches()));
93 System.out.println("That took " + total + " milliseconds");
94 } catch (Exception e) {
95 e.printStackTrace();
96 }
97 }
98
99 private static void usage() {
100 System.out.println("Usage:");
101 System.out.println(" java net.sourceforge.pmd.cpd.CPD <tile size> <directory> [<language>]");
102 System.out.println("i.e: ");
103 System.out.println(" java net.sourceforge.pmd.cpd.CPD 100 c://jdk14//src//java ");
104 System.out.println("or: ");
105 System.out.println(" java net.sourceforge.pmd.cpd.CPD 100 c://apache//src// cpp");
106 }
107
108 }
This page was automatically generated by Maven