001 /**
002 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
003 */
004 package net.sourceforge.pmd.lang;
005
006 import java.io.File;
007 import java.util.HashMap;
008 import java.util.List;
009 import java.util.Map;
010
011 /**
012 * This class can discover the LanguageVersion of a source file. Further, every
013 * Language has a default LanguageVersion, which can be temporarily overridden
014 * here.
015 */
016 public class LanguageVersionDiscoverer {
017 private Map<Language, LanguageVersion> languageToLanguageVersion = new HashMap<Language, LanguageVersion>();
018
019 /**
020 * Set the given LanguageVersion as the current default for it's Language.
021 * @param languageVersion The new default for the Language.
022 * @return The previous default version for the language.
023 */
024 public LanguageVersion setDefaultLanguageVersion(LanguageVersion languageVersion) {
025 LanguageVersion currentLanguageVersion = languageToLanguageVersion.put(languageVersion.getLanguage(),
026 languageVersion);
027 if (currentLanguageVersion == null) {
028 currentLanguageVersion = languageVersion.getLanguage().getDefaultVersion();
029 }
030 return currentLanguageVersion;
031 }
032
033 /**
034 * Get the current default LanguageVersion for the given Language.
035 * @param language The Language.
036 * @return The current default version for the language.
037 */
038 public LanguageVersion getDefaultLanguageVersion(Language language) {
039 LanguageVersion languageVersion = languageToLanguageVersion.get(language);
040 if (languageVersion == null) {
041 languageVersion = language.getDefaultVersion();
042 }
043 return languageVersion;
044 }
045
046 /**
047 * Get the default LanguageVersion for the first Language of a given source file.
048 *
049 * @param sourceFile The file.
050 * @return The currently configured LanguageVersion for the source file,
051 * or <code>null</code> if there are no supported Languages for the file.
052 */
053 public LanguageVersion getDefaultLanguageVersionForFile(File sourceFile) {
054 return getDefaultLanguageVersionForFile(sourceFile.getName());
055 }
056
057 /**
058 * Get the LanguageVersion for the first Language of a source file
059 * with the given name.
060 *
061 * @param fileName The file name.
062 * @return The currently configured LanguageVersion for the source file
063 * or <code>null</code> if there are no supported Languages for the file.
064 */
065 public LanguageVersion getDefaultLanguageVersionForFile(String fileName) {
066 List<Language> languages = getLanguagesForFile(fileName);
067 LanguageVersion languageVersion = null;
068 if (!languages.isEmpty()) {
069 languageVersion = getDefaultLanguageVersion(languages.get(0));
070 }
071 return languageVersion;
072 }
073
074 /**
075 * Get the Languages of a given source file.
076 *
077 * @param sourceFile The file.
078 * @return The Languages for the source file, may be empty.
079 */
080 public List<Language> getLanguagesForFile(File sourceFile) {
081 return getLanguagesForFile(sourceFile.getName());
082 }
083
084 /**
085 * Get the Languages of a given source file.
086 *
087 * @param fileName The file name.
088 * @return The Languages for the source file, may be empty.
089 */
090 public List<Language> getLanguagesForFile(String fileName) {
091 String extension = getExtension(fileName);
092 return Language.findByExtension(extension);
093 }
094
095 // Get the extensions from a file
096 private String getExtension(String fileName) {
097 String extension = null;
098 int extensionIndex = 1 + fileName.lastIndexOf('.');
099 if (extensionIndex > 0) {
100 extension = fileName.substring(extensionIndex);
101 }
102 return extension;
103 }
104 }
|