1 |
| |
2 |
| |
3 |
| |
4 |
| package net.sourceforge.pmd.cpd; |
5 |
| |
6 |
| import java.io.File; |
7 |
| import java.io.FileNotFoundException; |
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 |
0
| public CPD(int minimumTileSize, Language language) {
|
24 |
0
| this.minimumTileSize = minimumTileSize;
|
25 |
0
| this.language = language;
|
26 |
| } |
27 |
| |
28 |
0
| public void setCpdListener(CPDListener cpdListener) {
|
29 |
0
| this.listener = cpdListener;
|
30 |
| } |
31 |
| |
32 |
0
| public void go() {
|
33 |
0
| TokenEntry.clearImages();
|
34 |
0
| matchAlgorithm = new MatchAlgorithm(source, tokens, minimumTileSize, listener);
|
35 |
0
| matchAlgorithm.findMatches();
|
36 |
| } |
37 |
| |
38 |
0
| public Iterator getMatches() {
|
39 |
0
| return matchAlgorithm.matches();
|
40 |
| } |
41 |
| |
42 |
0
| public void add(File file) throws IOException {
|
43 |
0
| add(1, file);
|
44 |
| } |
45 |
| |
46 |
0
| public void addAllInDirectory(String dir) throws IOException {
|
47 |
0
| addDirectory(dir, false);
|
48 |
| } |
49 |
| |
50 |
0
| public void addRecursively(String dir) throws IOException {
|
51 |
0
| addDirectory(dir, true);
|
52 |
| } |
53 |
| |
54 |
0
| public void add(List files) throws IOException {
|
55 |
0
| for (Iterator i = files.iterator(); i.hasNext();) {
|
56 |
0
| add(files.size(), (File) i.next());
|
57 |
| } |
58 |
| } |
59 |
| |
60 |
0
| private void addDirectory(String dir, boolean recurse) throws IOException {
|
61 |
0
| if (!(new File(dir)).exists()) {
|
62 |
0
| throw new FileNotFoundException("Couldn't find directory " + dir);
|
63 |
| } |
64 |
0
| FileFinder finder = new FileFinder();
|
65 |
0
| add(finder.findFilesFrom(dir, language.getFileFilter(), recurse));
|
66 |
| } |
67 |
| |
68 |
0
| private void add(int fileCount, File file) throws IOException {
|
69 |
0
| listener.addedFile(fileCount, file);
|
70 |
0
| SourceCode sourceCode = new SourceCode(new SourceCode.FileCodeLoader(file));
|
71 |
0
| language.getTokenizer().tokenize(sourceCode, tokens);
|
72 |
0
| source.put(sourceCode.getFileName(), sourceCode);
|
73 |
| } |
74 |
| |
75 |
0
| public static Renderer getRendererFromString(String name) {
|
76 |
0
| Renderer renderer = new SimpleRenderer();
|
77 |
0
| try {
|
78 |
0
| renderer = (Renderer) Class.forName(name).newInstance();
|
79 |
| } catch (Exception e) { |
80 |
0
| System.out.println("Can't find class '" + name + "' so defaulting to SimpleRenderer.");
|
81 |
| } |
82 |
0
| return renderer;
|
83 |
| } |
84 |
| |
85 |
0
| public static void main(String[] args) {
|
86 |
0
| if (args.length > 4 || args.length < 2) {
|
87 |
0
| usage();
|
88 |
0
| System.exit(1);
|
89 |
| } |
90 |
| |
91 |
0
| try {
|
92 |
0
| String lang = LanguageFactory.JAVA_KEY;
|
93 |
0
| Renderer renderer = new SimpleRenderer();
|
94 |
0
| if (args.length > 2) {
|
95 |
0
| lang = args[2];
|
96 |
| } |
97 |
0
| if (args.length > 3) {
|
98 |
0
| renderer = CPD.getRendererFromString(args[3]);
|
99 |
| } |
100 |
0
| LanguageFactory f = new LanguageFactory();
|
101 |
0
| Language language = f.createLanguage(lang);
|
102 |
0
| CPD cpd = new CPD(Integer.parseInt(args[0]), language);
|
103 |
0
| cpd.addRecursively(args[1]);
|
104 |
0
| cpd.go();
|
105 |
0
| System.out.println(renderer.render(cpd.getMatches()));
|
106 |
| } catch (Exception e) { |
107 |
0
| e.printStackTrace();
|
108 |
| } |
109 |
| } |
110 |
| |
111 |
0
| private static void usage() {
|
112 |
0
| System.out.println("Usage:");
|
113 |
0
| System.out.println(" java net.sourceforge.pmd.cpd.CPD <tile size> <directory> [<language>] [<format>]");
|
114 |
0
| System.out.println("i.e: ");
|
115 |
0
| System.out.println(" java net.sourceforge.pmd.cpd.CPD 100 c:\\jdk14\\src\\java ");
|
116 |
0
| System.out.println("or: ");
|
117 |
0
| System.out.println(" java net.sourceforge.pmd.cpd.CPD 100 c:\\apache\\src\\ cpp");
|
118 |
0
| System.out.println("Formats:");
|
119 |
0
| System.out.println("Simple");
|
120 |
0
| System.out.println("net.sourceforge.pmd.cpd.CSVRenderer");
|
121 |
0
| System.out.println("net.sourceforge.pmd.cpd.XMLRenderer");
|
122 |
| } |
123 |
| |
124 |
| } |