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