View Javadoc
1   /**
2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
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   * Created by christoferdutz on 20.09.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       * A utility method to find the Languages which have Rule support.
94       * 
95       * @return A List of Languages with Rule support.
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 }