/**
 * This file is part of muCommander, http://www.mucommander.com
 *
 * muCommander is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * muCommander is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */



package com.mucommander.commons.file;

import com.mucommander.commons.file.util.ResourceLoader;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Hashtable;
import java.util.StringTokenizer;

/**
 * This Hashtable maps file extensions to their mime type.
 *
 * @author Maxence Bernard
 */
public class MimeTypes extends Hashtable<String, String> {

    private final static MimeTypes mimeTypes = new MimeTypes();

    /** Name of the 'mime.types' resource file located in the same package as this class */
    private static final String MIME_TYPES_RESOURCE_NAME = "mime.types";
	
    private MimeTypes() {
        BufferedReader br;

        br = null;
        try {
            br = new BufferedReader(new InputStreamReader(ResourceLoader.getPackageResourceAsStream(MimeTypes.class.getPackage(), MIME_TYPES_RESOURCE_NAME)));

            String line;
            StringTokenizer st;
            String description;

            while((line=br.readLine())!=null) {
                try {
                    st = new StringTokenizer(line);
                    description = st.nextToken();

                    while(st.hasMoreTokens())
                        put(st.nextToken(), description);
                }
                catch(Exception e) {
                    // If a line contains an error, catch the exception and go to the next line
                }
            }
        }
        catch(IOException e) {}
        // Makes sure the stream is closed.
        // This might not be strictly necessary as streams on internal resources are a bit of an unknown,
        // but since the ClassLoader.getResourceAsStream documentation doesn't explicitly say that such
        // streams do not need closing, it's safer to assume they do.
        finally {
            if(br != null) {
                try {br.close();}
                catch(IOException e) {}
            }
        }
    }

	
    /**
     * Returns the MIME type of the given file (determined by the file extension), <code>null</code>
     * if the type is unknown (unknown or no extension) or if the file is a folder.
     */
    public static String getMimeType(AbstractFile file) {
        if(file.isDirectory())
            return null;
        
        String name = file.getName();
        int pos = name.lastIndexOf('.');
        if(pos==-1)
            return null;

        return mimeTypes.get(name.substring(pos+1, name.length()).toLowerCase());
    }
    
}
