/* @ITMillApache2LicenseForJavaFiles@ */ package com.itmill.toolkit.service; import java.io.File; import java.util.Collections; import java.util.Hashtable; import java.util.Map; import java.util.StringTokenizer; import com.itmill.toolkit.terminal.Resource; import com.itmill.toolkit.terminal.ThemeResource; /** * Utility class that can figure out mime-types and icons related to files. *
* Note : The icons are associated purely to mime-types, so a file may not have * a custom icon accessible with this class. *
* * @author IT Mill Ltd. * @version * @VERSION@ * @since 3.0 */ public class FileTypeResolver { /** * Default icon given if no icon is specified for a mime-type. */ static public Resource DEFAULT_ICON = new ThemeResource( "icon/files/file.gif"); /** * Default mime-type. */ static public String DEFAULT_MIME_TYPE = "application/octet-stream"; /** * Initial file extension to mime-type mapping. */ static private String initialExtToMIMEMap = "application/cu-seeme csm cu," + "application/dsptype tsp," + "application/futuresplash spl," + "application/mac-binhex40 hqx," + "application/msaccess mdb," + "application/msword doc dot," + "application/octet-stream bin," + "application/oda oda," + "application/pdf pdf," + "application/pgp-signature pgp," + "application/postscript ps ai eps," + "application/rtf rtf," + "application/vnd.ms-excel xls xlb," + "application/vnd.ms-powerpoint ppt pps pot," + "application/vnd.wap.wmlc wmlc," + "application/vnd.wap.wmlscriptc wmlsc," + "application/wordperfect5.1 wp5," + "application/zip zip," + "application/x-123 wk," + "application/x-bcpio bcpio," + "application/x-chess-pgn pgn," + "application/x-cpio cpio," + "application/x-debian-package deb," + "application/x-director dcr dir dxr," + "application/x-dms dms," + "application/x-dvi dvi," + "application/x-xfig fig," + "application/x-font pfa pfb gsf pcf pcf.Z," + "application/x-gnumeric gnumeric," + "application/x-gtar gtar tgz taz," + "application/x-hdf hdf," + "application/x-httpd-php phtml pht php," + "application/x-httpd-php3 php3," + "application/x-httpd-php3-source phps," + "application/x-httpd-php3-preprocessed php3p," + "application/x-httpd-php4 php4," + "application/x-ica ica," + "application/x-java-archive jar," + "application/x-java-serialized-object ser," + "application/x-java-vm class," + "application/x-javascript js," + "application/x-kchart chrt," + "application/x-killustrator kil," + "application/x-kpresenter kpr kpt," + "application/x-kspread ksp," + "application/x-kword kwd kwt," + "application/x-latex latex," + "application/x-lha lha," + "application/x-lzh lzh," + "application/x-lzx lzx," + "application/x-maker frm maker frame fm fb book fbdoc," + "application/x-mif mif," + "application/x-msdos-program com exe bat dll," + "application/x-msi msi," + "application/x-netcdf nc cdf," + "application/x-ns-proxy-autoconfig pac," + "application/x-object o," + "application/x-ogg ogg," + "application/x-oz-application oza," + "application/x-perl pl pm," + "application/x-pkcs7-crl crl," + "application/x-redhat-package-manager rpm," + "application/x-shar shar," + "application/x-shockwave-flash swf swfl," + "application/x-star-office sdd sda," + "application/x-stuffit sit," + "application/x-sv4cpio sv4cpio," + "application/x-sv4crc sv4crc," + "application/x-tar tar," + "application/x-tex-gf gf," + "application/x-tex-pk pk PK," + "application/x-texinfo texinfo texi," + "application/x-trash ~ % bak old sik," + "application/x-troff t tr roff," + "application/x-troff-man man," + "application/x-troff-me me," + "application/x-troff-ms ms," + "application/x-ustar ustar," + "application/x-wais-source src," + "application/x-wingz wz," + "application/x-x509-ca-cert crt," + "audio/basic au snd," + "audio/midi mid midi," + "audio/mpeg mpga mpega mp2 mp3," + "audio/mpegurl m3u," + "audio/prs.sid sid," + "audio/x-aiff aif aiff aifc," + "audio/x-gsm gsm," + "audio/x-pn-realaudio ra rm ram," + "audio/x-scpls pls," + "audio/x-wav wav," + "image/bitmap bmp," + "image/gif gif," + "image/ief ief," + "image/jpeg jpeg jpg jpe," + "image/pcx pcx," + "image/png png," + "image/tiff tiff tif," + "image/vnd.wap.wbmp wbmp," + "image/x-cmu-raster ras," + "image/x-coreldraw cdr," + "image/x-coreldrawpattern pat," + "image/x-coreldrawtemplate cdt," + "image/x-corelphotopaint cpt," + "image/x-jng jng," + "image/x-portable-anymap pnm," + "image/x-portable-bitmap pbm," + "image/x-portable-graymap pgm," + "image/x-portable-pixmap ppm," + "image/x-rgb rgb," + "image/x-xbitmap xbm," + "image/x-xpixmap xpm," + "image/x-xwindowdump xwd," + "text/comma-separated-values csv," + "text/css css," + "text/html htm html xhtml," + "text/mathml mml," + "text/plain txt text diff," + "text/richtext rtx," + "text/tab-separated-values tsv," + "text/vnd.wap.wml wml," + "text/vnd.wap.wmlscript wmls," + "text/xml xml," + "text/x-c++hdr h++ hpp hxx hh," + "text/x-c++src c++ cpp cxx cc," + "text/x-chdr h," + "text/x-csh csh," + "text/x-csrc c," + "text/x-java java," + "text/x-moc moc," + "text/x-pascal p pas," + "text/x-setext etx," + "text/x-sh sh," + "text/x-tcl tcl tk," + "text/x-tex tex ltx sty cls," + "text/x-vcalendar vcs," + "text/x-vcard vcf," + "video/dl dl," + "video/fli fli," + "video/gl gl," + "video/mpeg mpeg mpg mpe," + "video/quicktime qt mov," + "video/x-mng mng," + "video/x-ms-asf asf asx," + "video/x-msvideo avi," + "video/x-sgi-movie movie," + "x-world/x-vrml vrm vrml wrl"; /** * File extension to MIME type mapping. */ static private Hashtable extToMIMEMap = new Hashtable(); /** * MIME type to Icon mapping. */ static private Hashtable MIMEToIconMap = new Hashtable(); static { // Initialize extension to MIME map final StringTokenizer lines = new StringTokenizer(initialExtToMIMEMap, ","); while (lines.hasMoreTokens()) { final String line = lines.nextToken(); final StringTokenizer exts = new StringTokenizer(line); final String type = exts.nextToken(); while (exts.hasMoreTokens()) { final String ext = exts.nextToken(); addExtension(ext, type); } } // Initialize Icons addIcon("inode/drive", new ThemeResource("icon/files/drive.gif")); addIcon("inode/directory", new ThemeResource("icon/files/folder.gif")); } /** * Gets the mime-type of a file. Currently the mime-type is resolved based * only on the file name extension. * * @param fileName * the name of the file whose mime-type is requested. * @return mime-typeString
for the given filename
*/
public static String getMIMEType(String fileName) {
// Checks for nulls
if (fileName == null) {
throw new NullPointerException("Filename can not be null");
}
// Calculates the extension of the file
int dotIndex = fileName.indexOf(".");
while (dotIndex >= 0 && fileName.indexOf(".", dotIndex + 1) >= 0) {
dotIndex = fileName.indexOf(".", dotIndex + 1);
}
dotIndex++;
if (fileName.length() > dotIndex) {
final String ext = fileName.substring(dotIndex);
// Return type from extension map, if found
final String type = (String) extToMIMEMap.get(ext);
if (type != null) {
return type;
}
}
return DEFAULT_MIME_TYPE;
}
/**
* Gets the descriptive icon representing file, based on the filename. First
* the mime-type for the given filename is resolved, and then the
* corresponding icon is fetched from the internal icon storage. If it is
* not found the default icon is returned.
*
* @param fileName
* the name of the file whose icon is requested.
* @return the icon corresponding to the given file
*/
public static Resource getIcon(String fileName) {
final String mimeType = getMIMEType(fileName);
final Resource icon = (Resource) MIMEToIconMap.get(mimeType);
if (icon != null) {
return icon;
}
// If nothing is known about the file-type, general file
// icon is used
return DEFAULT_ICON;
}
/**
* Gets the descriptive icon representing a file. First the mime-type for
* the given file name is resolved, and then the corresponding icon is
* fetched from the internal icon storage. If it is not found the default
* icon is returned.
*
* @param file
* the file whose icon is requested.
* @return the icon corresponding to the given file
*/
public static Resource getIcon(File file) {
final String mimeType = getMIMEType(file);
final Resource icon = (Resource) MIMEToIconMap.get(mimeType);
if (icon != null) {
return icon;
}
// If nothing is known about the file-type, general file
// icon is used
return DEFAULT_ICON;
}
/**
* Gets the mime-type for a file. Currently the returned file type is
* resolved by the filename extension only.
*
* @param file
* the file whose mime-type is requested.
* @return the files mime-type String
*/
public static String getMIMEType(File file) {
// Checks for nulls
if (file == null) {
throw new NullPointerException("File can not be null");
}
// Drives
if (file.getParentFile() == null) {
return "inode/drive";
}
// Directories
if (file.isDirectory()) {
return "inode/directory";
}
// Return type from extension
return getMIMEType(file.getName());
}
/**
* Adds a mime-type mapping for the given filename extension. If the
* extension is already in the internal mapping it is overwritten.
*
* @param extension
* the filename extension to be associated with
* MIMEType
.
* @param MIMEType
* the new mime-type for extension
.
*/
public static void addExtension(String extension, String MIMEType) {
extToMIMEMap.put(extension, MIMEType);
}
/**
* Adds a icon for the given mime-type. If the mime-type also has a
* corresponding icon, it is replaced with the new icon.
*
* @param MIMEType
* the mime-type whose icon is to be changed.
* @param icon
* the new icon to be associated with MIMEType
.
*/
public static void addIcon(String MIMEType, Resource icon) {
MIMEToIconMap.put(MIMEType, icon);
}
/**
* Gets the internal file extension to mime-type mapping.
*
* @return unmodifiable map containing the current file extension to
* mime-type mapping
*/
public static Map getExtensionToMIMETypeMapping() {
return Collections.unmodifiableMap(extToMIMEMap);
}
/**
* Gets the internal mime-type to icon mapping.
*
* @return unmodifiable map containing the current mime-type to icon mapping
*/
public static Map getMIMETypeToIconMapping() {
return Collections.unmodifiableMap(MIMEToIconMap);
}
}