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.io.File;
7   import java.util.HashMap;
8   import java.util.List;
9   import java.util.Map;
10  
11  /**
12   * This class can discover the LanguageVersion of a source file.  Further, every
13   * Language has a default LanguageVersion, which can be temporarily overridden
14   * here.
15   */
16  public class LanguageVersionDiscoverer {
17      private Map<Language, LanguageVersion> languageToLanguageVersion = new HashMap<>();
18  
19      /**
20       * Set the given LanguageVersion as the current default for it's Language.
21       * @param languageVersion The new default for the Language.
22       * @return The previous default version for the language.
23       */
24      public LanguageVersion setDefaultLanguageVersion(LanguageVersion languageVersion) {
25  	LanguageVersion currentLanguageVersion = languageToLanguageVersion.put(languageVersion.getLanguage(),
26  		languageVersion);
27  	if (currentLanguageVersion == null) {
28  	    currentLanguageVersion = languageVersion.getLanguage().getDefaultVersion();
29  	}
30  	return currentLanguageVersion;
31      }
32  
33      /**
34       * Get the current default LanguageVersion for the given Language. 
35       * @param language The Language.
36       * @return The current default version for the language.
37       */
38      public LanguageVersion getDefaultLanguageVersion(Language language) {
39  	LanguageVersion languageVersion = languageToLanguageVersion.get(language);
40  	if (languageVersion == null) {
41  	    languageVersion = language.getDefaultVersion();
42  	}
43  	return languageVersion;
44      }
45  
46      /**
47       * Get the default LanguageVersion for the first Language of a given source file.
48       *
49       * @param sourceFile The file.
50       * @return The currently configured LanguageVersion for the source file,
51       * or <code>null</code> if there are no supported Languages for the file.
52       */
53      public LanguageVersion getDefaultLanguageVersionForFile(File sourceFile) {
54  	return getDefaultLanguageVersionForFile(sourceFile.getName());
55      }
56  
57      /**
58       * Get the LanguageVersion for the first Language of a source file
59       * with the given name.
60       *
61       * @param fileName The file name.
62       * @return The currently configured LanguageVersion for the source file
63       * or <code>null</code> if there are no supported Languages for the file.
64       */
65      public LanguageVersion getDefaultLanguageVersionForFile(String fileName) {
66  	List<Language> languages = getLanguagesForFile(fileName);
67  	LanguageVersion languageVersion = null;
68  	if (!languages.isEmpty()) {
69  	    languageVersion = getDefaultLanguageVersion(languages.get(0));
70  	}
71  	return languageVersion;
72      }
73  
74      /**
75       * Get the Languages of a given source file.
76       *
77       * @param sourceFile The file.
78       * @return The Languages for the source file, may be empty.
79       */
80      public List<Language> getLanguagesForFile(File sourceFile) {
81  	return getLanguagesForFile(sourceFile.getName());
82      }
83  
84      /**
85       * Get the Languages of a given source file.
86       *
87       * @param fileName The file name.
88       * @return The Languages for the source file, may be empty.
89       */
90      public List<Language> getLanguagesForFile(String fileName) {
91  	String extension = getExtension(fileName);
92  	return LanguageRegistry.findByExtension(extension);
93      }
94  
95      // Get the extensions from a file
96      private String getExtension(String fileName) {
97  	String extension = null;
98  	int extensionIndex = 1 + fileName.lastIndexOf('.');
99  	if (extensionIndex > 0) {
100 	    extension = fileName.substring(extensionIndex);
101 	}
102 	return extension;
103     }
104 }