LanguageVersionDiscoverer.java
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 = + fileName.lastIndexOf('.');
099   if (extensionIndex > 0) {
100       extension = fileName.substring(extensionIndex);
101   }
102   return extension;
103     }
104 }