/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.lang; import java.io.File; import java.util.HashMap; import java.util.List; import java.util.Map; /** * This class can discover the LanguageVersion of a source file. Further, every * Language has a default LanguageVersion, which can be temporarily overridden * here. */ public class LanguageVersionDiscoverer { private Map<Language, LanguageVersion> languageToLanguageVersion = new HashMap<>(); /** * Set the given LanguageVersion as the current default for it's Language. * * @param languageVersion * The new default for the Language. * @return The previous default version for the language. */ public LanguageVersion setDefaultLanguageVersion(LanguageVersion languageVersion) { LanguageVersion currentLanguageVersion = languageToLanguageVersion.put(languageVersion.getLanguage(), languageVersion); if (currentLanguageVersion == null) { currentLanguageVersion = languageVersion.getLanguage().getDefaultVersion(); } return currentLanguageVersion; } /** * Get the current default LanguageVersion for the given Language. * * @param language * The Language. * @return The current default version for the language. */ public LanguageVersion getDefaultLanguageVersion(Language language) { LanguageVersion languageVersion = languageToLanguageVersion.get(language); if (languageVersion == null) { languageVersion = language.getDefaultVersion(); } return languageVersion; } /** * Get the default LanguageVersion for the first Language of a given source * file. * * @param sourceFile * The file. * @return The currently configured LanguageVersion for the source file, or * <code>null</code> if there are no supported Languages for the * file. */ public LanguageVersion getDefaultLanguageVersionForFile(File sourceFile) { return getDefaultLanguageVersionForFile(sourceFile.getName()); } /** * Get the LanguageVersion for the first Language of a source file with the * given name. * * @param fileName * The file name. * @return The currently configured LanguageVersion for the source file or * <code>null</code> if there are no supported Languages for the * file. */ public LanguageVersion getDefaultLanguageVersionForFile(String fileName) { List<Language> languages = getLanguagesForFile(fileName); LanguageVersion languageVersion = null; if (!languages.isEmpty()) { languageVersion = getDefaultLanguageVersion(languages.get(0)); } return languageVersion; } /** * Get the Languages of a given source file. * * @param sourceFile * The file. * @return The Languages for the source file, may be empty. */ public List<Language> getLanguagesForFile(File sourceFile) { return getLanguagesForFile(sourceFile.getName()); } /** * Get the Languages of a given source file. * * @param fileName * The file name. * @return The Languages for the source file, may be empty. */ public List<Language> getLanguagesForFile(String fileName) { String extension = getExtension(fileName); return LanguageRegistry.findByExtension(extension); } // Get the extensions from a file private String getExtension(String fileName) { String extension = null; int extensionIndex = 1 + fileName.lastIndexOf('.'); if (extensionIndex > 0) { extension = fileName.substring(extensionIndex); } return extension; } }