1
2
3
4 package net.sourceforge.pmd.lang;
5
6 import java.util.ArrayList;
7 import java.util.Collection;
8 import java.util.HashMap;
9 import java.util.List;
10 import java.util.Map;
11 import java.util.ServiceLoader;
12
13
14
15
16 public final class LanguageRegistry {
17
18 private static LanguageRegistry instance = new LanguageRegistry();
19
20 private Map<String, Language> languages;
21
22 private LanguageRegistry() {
23 languages = new HashMap<String, Language>();
24 ServiceLoader<Language> languageLoader = ServiceLoader.load(Language.class);
25 for (Language language : languageLoader) {
26 languages.put(language.getName(), language);
27 }
28 }
29
30 public static LanguageRegistry getInstance() {
31 return instance;
32 }
33
34 public static Collection<Language> getLanguages() {
35 return getInstance().languages.values();
36 }
37
38 public static Language getLanguage(String languageName) {
39 return getInstance().languages.get(languageName);
40 }
41
42 public static Language getDefaultLanguage() {
43 return getLanguage("Java");
44 }
45
46 public static Language findLanguageByTerseName(String terseName) {
47 for (Language language : getInstance().languages.values()) {
48 if (language.getTerseName().equals(terseName)) {
49 return language;
50 }
51 }
52 return null;
53 }
54
55 public static LanguageVersion findLanguageVersionByTerseName(String terseName) {
56 String version = null;
57 if (terseName.contains(" ")) {
58 version = terseName.substring(terseName.lastIndexOf(' ') + 1);
59 terseName = terseName.substring(0, terseName.lastIndexOf(' '));
60 }
61 Language language = findLanguageByTerseName(terseName);
62 if (language != null) {
63 if (version == null) {
64 return language.getDefaultVersion();
65 } else {
66 return language.getVersion(version);
67 }
68 }
69 return null;
70 }
71
72 public static List<Language> findByExtension(String extension) {
73 List<Language> languages = new ArrayList<Language>();
74 for (Language language : getInstance().languages.values()) {
75 if (language.hasExtension(extension)) {
76 languages.add(language);
77 }
78 }
79 return languages;
80 }
81
82 public static List<LanguageVersion> findAllVersions() {
83 List<LanguageVersion> versions = new ArrayList<LanguageVersion>();
84 for (Language language : getLanguages()) {
85 for (LanguageVersion languageVersion : language.getVersions()) {
86 versions.add(languageVersion);
87 }
88 }
89 return versions;
90 }
91
92
93
94
95
96
97 public static List<Language> findWithRuleSupport() {
98 List<Language> languages = new ArrayList<Language>();
99 for (Language language : getInstance().languages.values()) {
100 if (language.getRuleChainVisitorClass() != null) {
101 languages.add(language);
102 }
103 }
104 return languages;
105 }
106
107 public static String commaSeparatedTerseNamesForLanguage(List<Language> languages) {
108 StringBuilder builder = new StringBuilder();
109 for (Language language : languages) {
110 if (builder.length() > 0) {
111 builder.append(", ");
112 }
113 builder.append(language.getTerseName());
114 }
115 return builder.toString();
116 }
117
118 public static String commaSeparatedTerseNamesForLanguageVersion(List<LanguageVersion> languageVersions) {
119 if (languageVersions == null || languageVersions.isEmpty()) {
120 return "";
121 }
122
123 StringBuilder builder = new StringBuilder();
124 builder.append(languageVersions.get(0).getTerseName());
125 for (int i = 1; i < languageVersions.size(); i++) {
126 builder.append(", ").append(languageVersions.get(i).getTerseName());
127 }
128 return builder.toString();
129 }
130
131 }