1
2
3
4 package net.sourceforge.pmd.lang;
5
6 import java.util.ArrayList;
7 import java.util.Arrays;
8 import java.util.Collections;
9 import java.util.List;
10
11 import net.sourceforge.pmd.lang.ecmascript.rule.EcmascriptRuleChainVisitor;
12 import net.sourceforge.pmd.lang.java.rule.JavaRuleChainVisitor;
13 import net.sourceforge.pmd.lang.jsp.rule.JspRuleChainVisitor;
14 import net.sourceforge.pmd.lang.plsql.rule.PLSQLRuleChainVisitor;
15 import net.sourceforge.pmd.lang.rule.RuleChainVisitor;
16 import net.sourceforge.pmd.lang.vm.rule.VmRuleChainVisitor;
17 import net.sourceforge.pmd.lang.xml.rule.XmlRuleChainVisitor;
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 public enum Language {
40
41
42
43 CPP("C++", null, "cpp", null, "h", "c", "cpp", "cxx", "cc", "C"),
44 FORTRAN("Fortran", null, "fortran", null, "for", "f", "f66", "f77", "f90"),
45 ECMASCRIPT("Ecmascript", null, "ecmascript", EcmascriptRuleChainVisitor.class, "js"),
46 JAVA("Java", null, "java", JavaRuleChainVisitor.class, "java"),
47 JSP("Java Server Pages", "JSP", "jsp", JspRuleChainVisitor.class, "jsp"),
48 PHP("PHP: Hypertext Preprocessor", "PHP", "php", null, "php", "class"),
49 PLSQL("PLSQL", null, "plsql", PLSQLRuleChainVisitor.class
50 ,"sql", "trg", "prc","fnc"
51 ,"pld"
52 ,"pls" ,"plh" ,"plb"
53 ,"pck" ,"pks" ,"pkh" ,"pkb"
54 ,"typ" ,"tyb"
55 ,"tps" ,"tpb"
56 ),
57 RUBY("Ruby", null, "ruby", null, "rb", "cgi", "class"),
58 XSL("XSL", null, "xsl", XmlRuleChainVisitor.class, "xsl", "xslt"),
59 XML("XML", null, "xml", XmlRuleChainVisitor.class, "xml"),
60 VM("VM", null, "vm", VmRuleChainVisitor.class, "vm");
61
62 private final String name;
63 private final String shortName;
64 private final String terseName;
65 private final List<String> extensions;
66 private final Class<?> ruleChainVisitorClass;
67 private final List<LanguageVersion> versions;
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82 private Language(String name, String shortName, String terseName, Class<?> ruleChainVisitorClass,
83 String... extensions) {
84 if (name == null) {
85 throw new IllegalArgumentException("Name must not be null.");
86 }
87 if (terseName == null) {
88 throw new IllegalArgumentException("Terse name must not be null.");
89 }
90 this.name = name;
91 this.shortName = shortName != null ? shortName : name;
92 this.terseName = terseName;
93 this.ruleChainVisitorClass = ruleChainVisitorClass;
94 this.extensions = Collections.unmodifiableList(Arrays.asList(extensions));
95 this.versions = new ArrayList<LanguageVersion>();
96
97
98 if (ruleChainVisitorClass != null) {
99 try {
100 Object obj = ruleChainVisitorClass.newInstance();
101 if (!(obj instanceof RuleChainVisitor)) {
102 throw new IllegalStateException("RuleChainVisitor class <" + ruleChainVisitorClass.getName()
103 + "> does not implement the RuleChainVisitor interface!");
104 }
105 } catch (InstantiationException e) {
106 throw new IllegalStateException("Unable to invoke no-arg constructor for RuleChainVisitor class <"
107 + ruleChainVisitorClass.getName() + ">!");
108 } catch (IllegalAccessException e) {
109 throw new IllegalStateException("Unable to invoke no-arg constructor for RuleChainVisitor class <"
110 + ruleChainVisitorClass.getName() + ">!");
111 }
112 }
113 }
114
115
116
117
118
119
120 public String getName() {
121 return name;
122 }
123
124
125
126
127
128
129 public String getShortName() {
130 return shortName;
131 }
132
133
134
135
136
137 public String getTerseName() {
138 return terseName;
139 }
140
141
142
143
144
145 public List<String> getExtensions() {
146 return extensions;
147 }
148
149
150
151
152
153
154
155 public boolean hasExtension(String extension) {
156 if (extension != null) {
157 for (String ext : extensions) {
158 if (ext.equalsIgnoreCase(extension)) {
159 return true;
160 }
161 }
162 }
163 return false;
164 }
165
166
167
168
169
170
171
172 public Class<?> getRuleChainVisitorClass() {
173 return ruleChainVisitorClass;
174 }
175
176
177
178
179
180 public List<LanguageVersion> getVersions() {
181 return versions;
182 }
183
184
185
186
187
188
189
190 public LanguageVersion getDefaultVersion() {
191 init();
192 for (LanguageVersion version : getVersions()) {
193 if (version.isDefaultVersion()) {
194 return version;
195 }
196 }
197 throw new IllegalStateException("No default LanguageVersion configured for " + this);
198 }
199
200
201
202
203
204
205
206 public LanguageVersion getVersion(String version) {
207 init();
208 for (LanguageVersion languageVersion : getVersions()) {
209 if (languageVersion.getVersion().equals(version)) {
210 return languageVersion;
211 }
212 }
213 return null;
214 }
215
216
217
218
219 @Override
220 public String toString() {
221 return "Language [" + name + "]";
222 }
223
224
225
226
227
228 public static List<Language> findWithRuleSupport() {
229 List<Language> languages = new ArrayList<Language>();
230 for (Language language : Language.values()) {
231 if (language.getRuleChainVisitorClass() != null) {
232 languages.add(language);
233 }
234 }
235 return languages;
236 }
237
238
239
240
241
242
243
244 public static List<Language> findByExtension(String extension) {
245 List<Language> languages = new ArrayList<Language>();
246 for (Language language : Language.values()) {
247 if (language.hasExtension(extension)) {
248 languages.add(language);
249 }
250 }
251 return languages;
252 }
253
254
255
256
257
258
259
260
261 public static Language findByTerseName(String terseName) {
262 for (Language language : Language.values()) {
263 if (language.getTerseName().equalsIgnoreCase(terseName)) {
264 return language;
265 }
266 }
267 return null;
268 }
269
270
271
272
273
274
275 public static String commaSeparatedTerseNames(List<Language> languages) {
276 StringBuilder builder = new StringBuilder();
277 for (Language language : languages) {
278 if (builder.length() > 0) {
279 builder.append(", ");
280 }
281 builder.append(language.getTerseName());
282 }
283 return builder.toString();
284 }
285
286 private static void init() {
287
288
289 LanguageVersion.values();
290 }
291
292
293
294
295
296 public static Language getDefaultLanguage() {
297 return Language.JAVA;
298 }
299 }