1 package net.sourceforge.pmd.cpd;
2
3 import java.io.File;
4 import java.io.FilenameFilter;
5
6 import net.sourceforge.pmd.AbstractConfiguration;
7
8
9
10
11
12 public class CPDConfiguration extends AbstractConfiguration {
13
14 private Language language;
15 private int minimumTileSize;
16 private boolean skipDuplicates;
17 private Renderer renderer;
18
19 private static final int MISSING_REQUIRED_ARGUMENT = 3;
20
21 public CPDConfiguration(String[] args) {
22
23 String languageString = findOptionalStringValue(args, "--language", "java");
24 language = new LanguageFactory().createLanguage(languageString);
25
26 String formatString = findOptionalStringValue(args, "--format", "text");
27 renderer = getRendererFromString(formatString);
28
29 final String systemDefaultEncoding = System.getProperty("file.encoding");
30 setEncoding( findOptionalStringValue(args, "--encoding", systemDefaultEncoding) );
31
32 minimumTileSize = Integer.parseInt(findRequiredStringValue(args, "--minimum-tokens"));
33
34 skipDuplicates = findBooleanSwitch(args, "--skip-duplicate-files");
35 }
36
37 public CPDConfiguration(int theMinTileSize, Language theLanguage, String theEncoding) {
38 minimumTileSize = theMinTileSize;
39 language = theLanguage;
40 setEncoding(theEncoding);
41 }
42
43 public void setEncoding(String theEncoding) {
44 super.setSourceEncoding(theEncoding);
45
46 if ( ! theEncoding.equals( System.getProperty("file.encoding") ) )
47 System.setProperty("file.encoding", theEncoding);
48 }
49
50 public SourceCode sourceCodeFor(File file) {
51 return new SourceCode(
52 new SourceCode.FileCodeLoader(file, getSourceEncoding())
53 );
54 }
55
56 public Language language() { return language; }
57
58 public int minimumTileSize() { return minimumTileSize; }
59
60 public boolean skipDuplicates() { return skipDuplicates; }
61
62 public void skipDuplicates(boolean flag) { skipDuplicates = flag; }
63
64 public FilenameFilter filenameFilter() { return language.getFileFilter(); }
65
66 public Tokenizer tokenizer() { return language.getTokenizer(); }
67
68 public Renderer renderer() { return renderer; }
69
70 public static Renderer getRendererFromString(String name
71 if (name.equalsIgnoreCase("text") || name.equals("")) {
72 return new SimpleRenderer();
73 } else if ("xml".equals(name)) {
74 return new XMLRenderer();
75 } else if ("csv".equals(name)) {
76 return new CSVRenderer();
77 } else if ("vs".equals(name)) {
78 return new VSRenderer();
79 }
80 try {
81 return (Renderer) Class.forName(name).newInstance();
82 } catch (Exception e) {
83 System.out.println("Can't find class '" + name + "', defaulting to SimpleRenderer.");
84 }
85 return new SimpleRenderer();
86 }
87
88 public static boolean findBooleanSwitch(String[] args, String name) {
89 for (int i = 0; i < args.length; i++) {
90 if (args[i].equals(name)) {
91 return true;
92 }
93 }
94 return false;
95 }
96
97 public static String findOptionalStringValue(String[] args, String name, String defaultValue) {
98 for (int i = 0; i < args.length; i++) {
99 if (args[i].equals(name)) {
100 return args[i + 1];
101 }
102 }
103 return defaultValue;
104 }
105
106 private static String findRequiredStringValue(String[] args, String name) {
107 for (int i = 0; i < args.length; i++) {
108 if (args[i].equals(name)) {
109 return args[i + 1];
110 }
111 }
112 System.out.println("No " + name + " value passed in");
113 CPD.showUsage();
114 System.exit(MISSING_REQUIRED_ARGUMENT);
115 return "";
116 }
117 }