package com.idega.core.file.util; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import java.util.Properties; import javax.activation.MimetypesFileTypeMap; import org.apache.commons.io.IOUtils; import sun.net.www.MimeTable; import com.idega.idegaweb.IWApplicationContext; import com.idega.idegaweb.IWMainApplication; import com.idega.repository.data.Singleton; import com.idega.util.CoreConstants; import com.idega.util.FileUtil; import com.idega.util.SortedProperties; import com.idega.util.StringUtil; /** * Title: MimeTypeUtil Description: Creates and loads a properties file under * core.bundle/properties/mime-types.props with "mime-type=category" pairs<br> * to make it easy to have mime types categorized into fewer elements.<br> * The categories are:<br> * <li>binary</li> - for misc. binary formats, applications and unknown * mime-types. * <li>audio</li> - for audio files. * <li>compressed</li> - for compressed files * <li>document</li> - for readable or well known document- and text-types * such as txt,pdf,rtf,word,excel... * <li>folder</li> - for folder and collection like types * <li>image</li> - for image files * <li>vector</li> - for vector graphics and other vector based multimedia * files types * <li>video</li> - for video files * * * Copyright: Copyright (c) 2004 Company: Idega Software * * @author <a href="mailto:eiki@idega.is">Eirikur S. Hrafnsson</a> * @version 1.0 * * Last modified: $Date: 2009/01/20 17:04:16 $ by $Author: valdas $ */ public class MimeTypeUtil implements Singleton { public static final String MIME_TYPE_WORD = "application/msword"; public static final String MIME_TYPE_EXCEL = "application/vnd.ms-excel"; public static final String MIME_TYPE_EXCEL_2 = "application/x-msexcel"; public static final String MIME_TYPE_POWERPOINT = "application/vnd.ms-powerpoint"; public static final String MIME_TYPE_PDF_2 = "application/x-pdf"; public static final String MIME_TYPE_PDF_1 = "application/pdf"; public static final String MIME_TYPE_ZIP = "application/zip"; public static final String MIME_TYPE_XML = "text/xml"; public static final String MIME_TYPE_CSS = "text/css"; public static final String MIME_TYPE_HTML = "text/html"; public static final String MIME_TYPE_TEXT_PLAIN = "text/plain"; public static final String MIME_TYPE_APPLICATION = "application/octet-stream"; public static final String MIME_TYPE_CALENDAR = "text/calendar"; public static final String MIME_TYPE_ENCODED_URL = "application/x-www-form-urlencoded"; public static final String MIME_TYPE_JSON = "application/json"; private static Map<String, String> MIME_TYPES_MAPPING = new HashMap<String, String>(); private String pathToConfigFile; private Properties properties; public static final String MIME_TYPE_PROPS_FILE_NAME = "mime-types.props"; public static final String MIME_TYPE_CATEGORY_BINARY = "binary"; public static final String MIME_TYPE_CATEGORY_AUDIO = "audio"; public static final String MIME_TYPE_CATEGORY_COMPRESSED = "compressed"; public static final String MIME_TYPE_CATEGORY_DOCUMENT = "document"; public static final String MIME_TYPE_CATEGORY_IMAGE = "image"; public static final String MIME_TYPE_CATEGORY_VECTOR = "vector"; public static final String MIME_TYPE_CATEGORY_VIDEO = "video"; public static final String MIME_TYPE_CATEGORY_FOLDER = "folder"; // folders private String[] folder = { "application/vnd.iw-folder" }; // executable applications, binaries or unknown types private String[] binary = { MIME_TYPE_APPLICATION, "application/acad", "application/arj", "application/book", "application/cdf", "application/clariscad", "application/commonground", "application/drafting", "application/dxf", "application/envoy", "application/fractals", "application/freeloader", "application/hlp", "application/hta", "application/iges", "application/inf", "application/java", "application/java-byte-code", "application/lha", "application/lzx", "application/mbedlet", "application/mime", "application/pkcs-crl", "application/pkix-cert", "application/pkix-crl", "application/vnd.fdf", "application/vnd.hp-HPGL", "application/vnd.ms-pki.seccat", "application/x-aim", "application/x-authorware-bin", "application/x-authorware-map", "application/x-authorware-seg", "application/x-bcpio", "application/x-bsh", "application/x-bytecode.elisp (Compiled ELisp)", "application/x-cdf", "application/x-chat", "application/x-cocoa", "application/x-cpio", "application/x-cpt", "application/x-csh", "application/x-deepv", "application/x-dvi", "application/x-elc", "application/x-envoy", "application/x-esrehber", "application/x-gsp", "application/x-gss", "application/x-hdf", "application/x-helpfile", "application/x-httpd-imap", "application/x-ima", "application/x-internett-signup", "application/x-inventor", "application/x-ip2", "application/x-java-class", "application/x-java-commerce", "application/x-javascript", "application/x-ksh", "application/x-lha", "application/x-lisp", "application/x-livescreen", "application/x-magic-cap-package-1.0", "application/x-mplayer2", "application/x-navi-animation", "application/x-navimap", "application/x-netcdf", "application/x-nokia-9000-communicator-add-on-software", "application/x-pointplus", "application/x-troff-man", "application/x-winhelp", "application/x-x509-ca-cert", "application/x-x509-user-cert", "drawing/x-dwf (old)", "i-world/i-vrml", "model/iges", "model/vnd.dwf" }; private String[] audio = { "audio/basic", "audio/x-aiff", "audio/x-wav", "audio/x-mpeg", "audio/x-mpeg-2", "audio/mpeg", "audio/aiff", "audio/it", "audio/make", "audio/midi", "audio/nspaudio", "audio/x-au", "audio/x-gsm", "audio/x-jam", "audio/x-liveaudio", "audio/x-mpequrl", "audio/x-nspaudio", "music/x-karaoke", "x-music/x-midi", "x-conference/x-cooltalk" }; private String[] document = { "text/html", "text/plain", MIME_TYPE_XML, "text/richtext", "text/enriched", MimeTypeUtil.MIME_TYPE_CSS, "application/postscript", "application/rtf", MIME_TYPE_PDF_1, MIME_TYPE_PDF_2, MIME_TYPE_WORD, "application/mspowerpoint", MIME_TYPE_POWERPOINT, "application/vnd.ms-project", MIME_TYPE_EXCEL, "application/vnd.ms-works", "application/mac-binhex40", "application/x-stuffit", "text/javascript", "application/x-javascript", "application/x-gtar", "application/x-tar", "image/psd", "application/postscript", "application/x-latex", "text/asp", "text/vnd.abc", "text/vnd.fmi.flexstor", "text/webviewhtml", "text/x-asm", "text/x-audiosoft-intra", "text/x-c", "text/x-component", "text/x-fortran", "text/x-h", "text/x-java-source", "text/x-la-asf", "text/x-m", "text/x-script", "text/x-script.csh", "text/x-script.elisp", "text/x-script.ksh", "text/x-script.lisp", "text/x-setext" }; private String[] image = { "image/gif", "image/x-xbitmap", "image/x-xpix", "image/x-png", "image/png", "image/ief", "image/jpeg", "image/pjpeg", "image/jpg", "image/jpe", "image/tiff", "image/x-pict", "image/pict", "image/x-ms-bmp", "image/bmp", "image/x-bmp", "image/pcx", "image/iff", "image/ras", "image/x-portable-bitmap", "image/x-portable-graymap", "image/x-portable-pixmap", "image/fif", "image/florian", "image/g3fax", "image/jutvision", "image/vnd.dwg", "image/vnd.fpx", "image/vnd.net-fpx", "image/x-dwg", "image/x-icon", "image/x-jg", "image/x-jps", "image/x-windows-bmp" }; private String[] vector = { "application/futuresplash", "application/x-director", "application/x-shockwave-flash" }; private String[] video = { "video/mpeg", "video/mpeg-2", "video/quicktime", "video/x-msvideo", "video/x-sgi-movie", "x-world/x-3dmf", "video/animaflex", "video/avi", "video/avs-video", "video/dl", "video/fli", "video/gl", "video/msvideo", "video/x-atomic3d-feature", "video/x-dl", "video/x-dv", "video/x-fli", "video/x-gl", "video/x-isvideo", "video/x-ms-asf", "video/x-ms-asf-plugin", "video/x-msvideo", "application/x-troff-msvideo" }; private String[] compressed = { "application/binhex", "application/binhex4", "application/mac-binary", "application/mac-binhex", "application/mac-binhex40", "application/mac-compactpro", "application/macbinary", "application/x-binary", "application/x-binhex40", "application/x-bzip", "application/x-bzip2", "application/x-compactpro", "application/x-compressed", "application/x-gtar", "application/x-gzip", "application/x-lzh", "application/x-lzx", "application/x-mac-binhex40", "application/x-macbinary", "application/x-zip-compressed", "application/zip", "multipart/x-gzip" }; private static void initializeMimeTypesMap() { if (!MIME_TYPES_MAPPING.isEmpty()) return; MIME_TYPES_MAPPING.put("doc", MIME_TYPE_WORD); MIME_TYPES_MAPPING.put("docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"); MIME_TYPES_MAPPING.put("xls", MIME_TYPE_EXCEL); MIME_TYPES_MAPPING.put("xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); MIME_TYPES_MAPPING.put("ppt", MIME_TYPE_POWERPOINT); MIME_TYPES_MAPPING.put("pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"); } protected MimeTypeUtil() { initializeMimeTypesMap(); try { this.properties = getMimeTypeSettings(); } catch (IOException e) { e.printStackTrace(); } } public static synchronized MimeTypeUtil getInstance() { IWApplicationContext iwac = IWMainApplication .getDefaultIWApplicationContext(); MimeTypeUtil util = (MimeTypeUtil) iwac .getApplicationAttribute(MIME_TYPE_PROPS_FILE_NAME); if (util == null) { util = new MimeTypeUtil(); iwac.setApplicationAttribute(MIME_TYPE_PROPS_FILE_NAME, util); } return util; } public Properties getMimeTypeSettings() throws IOException { if (this.properties == null) { String pathToFile = getRealPathToConfigFiles() + MIME_TYPE_PROPS_FILE_NAME; InputStream in = null; try { File file = new File(pathToFile); if (file.exists()) { in = new FileInputStream(file); } else { in = IWMainApplication.getDefaultIWMainApplication() .getCoreBundle().getResourceInputStream( "properties/" + MIME_TYPE_PROPS_FILE_NAME); } this.properties = new SortedProperties(); this.properties.load(in); return this.properties; } catch (FileNotFoundException e) { // create the file if it does not exist and fill with the data System.out .println("[MimeTypeUtil] - No mime-type.props file. Creating mime type properties file : " + pathToFile); FileUtil.createFile(pathToFile); this.properties = new SortedProperties(); this.properties.load(new FileInputStream(pathToFile)); fillPropertiesWithMimeTypes(this.properties); storeProperties(this.properties, pathToFile); } finally { IOUtils.closeQuietly(in); } } return this.properties; } /** * Fills the properties with "mime-type=category" pairs * * @param properties */ protected void fillPropertiesWithMimeTypes(Properties properties) { addToProperties(this.audio, MIME_TYPE_CATEGORY_AUDIO, properties); addToProperties(this.binary, MIME_TYPE_CATEGORY_BINARY, properties); addToProperties(this.compressed, MIME_TYPE_CATEGORY_COMPRESSED, properties); addToProperties(this.document, MIME_TYPE_CATEGORY_DOCUMENT, properties); addToProperties(this.folder, MIME_TYPE_CATEGORY_FOLDER, properties); addToProperties(this.image, MIME_TYPE_CATEGORY_IMAGE, properties); addToProperties(this.vector, MIME_TYPE_CATEGORY_VECTOR, properties); addToProperties(this.video, MIME_TYPE_CATEGORY_VIDEO, properties); } /** * Iterates through the array and adds the mimetype and the category to the * properties * * @param mimeTypes * @param categoryName * @param properties */ private void addToProperties(String[] mimeTypes, String categoryName, Properties properties) { for (int i = 0; i < mimeTypes.length; i++) { String mime = mimeTypes[i]; properties.setProperty(mime, categoryName); } } protected String getRealPathToConfigFiles() { if (this.pathToConfigFile == null) { this.pathToConfigFile = IWMainApplication .getDefaultIWMainApplication().getCoreBundle() .getPropertiesRealPath() + File.separator; } return this.pathToConfigFile; } protected synchronized void storeProperties(Properties props, String pathToSettingsFile) throws IOException { FileOutputStream fos = new FileOutputStream(pathToSettingsFile); props.store(fos, null); fos.close(); } public boolean isAudio(String mimeType) { return isMimeTypeInCategory(mimeType, MIME_TYPE_CATEGORY_AUDIO); } public boolean isBinary(String mimeType) { return isMimeTypeInCategory(mimeType, MIME_TYPE_CATEGORY_BINARY); } public boolean isCompressed(String mimeType) { return isMimeTypeInCategory(mimeType, MIME_TYPE_CATEGORY_COMPRESSED); } public boolean isZip(String mimeType) { return MIME_TYPE_ZIP.equals(mimeType); } public boolean isDocument(String mimeType) { return isMimeTypeInCategory(mimeType, MIME_TYPE_CATEGORY_DOCUMENT); } public boolean isFolder(String mimeType) { if ("".equals(mimeType)) { return true; } else { return isMimeTypeInCategory(mimeType, MIME_TYPE_CATEGORY_FOLDER); } } public boolean isImage(String mimeType) { return isMimeTypeInCategory(mimeType, MIME_TYPE_CATEGORY_IMAGE); } public boolean isVector(String mimeType) { return isMimeTypeInCategory(mimeType, MIME_TYPE_CATEGORY_VECTOR); } public boolean isVideo(String mimeType) { return isMimeTypeInCategory(mimeType, MIME_TYPE_CATEGORY_VIDEO); } protected boolean isMimeTypeInCategory(String mimeType, String category) { try { String cat = getMimeTypeSettings().getProperty(mimeType); if (cat != null) { return cat.equals(category); } } catch (IOException e) { e.printStackTrace(); } return false; } public boolean isPDF(String mimeType) { return MIME_TYPE_PDF_1.equals(mimeType) || MIME_TYPE_PDF_2.equals(mimeType); } public boolean isPowerPoint(String mimeType) { return MIME_TYPE_POWERPOINT.equals(mimeType); } public boolean isExcel(String mimeType) { return MIME_TYPE_EXCEL.equals(mimeType); } public boolean isWord(String mimeType) { return MIME_TYPE_WORD.equals(mimeType); } public String[] getMimeTypesInCategory(String category) { if (MIME_TYPE_CATEGORY_AUDIO.equals(category)) { return this.audio; } else if (MIME_TYPE_CATEGORY_BINARY.equals(category)) { return this.binary; } else if (MIME_TYPE_CATEGORY_COMPRESSED.equals(category)) { return this.compressed; } else if (MIME_TYPE_CATEGORY_DOCUMENT.equals(category)) { return this.document; } else if (MIME_TYPE_CATEGORY_FOLDER.equals(category)) { return this.folder; } else if (MIME_TYPE_CATEGORY_IMAGE.equals(category)) { return this.image; } else if (MIME_TYPE_CATEGORY_VECTOR.equals(category)) { return this.vector; } else if (MIME_TYPE_CATEGORY_VIDEO.equals(category)) { return this.video; } return null; } private static String getMimeType(String fileName) { if (StringUtil.isEmpty(fileName)) return null; int lastDot = fileName.lastIndexOf(CoreConstants.DOT); if (lastDot == -1) return null; initializeMimeTypesMap(); String fileType = fileName.substring(lastDot + 1).toLowerCase(); return MIME_TYPES_MAPPING.get(fileType); } public static String resolveMimeTypeFromFileName(String fileName) { String mimeType = getMimeType(fileName); if (!StringUtil.isEmpty(mimeType)) return mimeType; MimeTable mt = MimeTable.getDefaultTable(); mimeType = mt.getContentTypeFor(fileName); return StringUtil.isEmpty(mimeType) ? new MimetypesFileTypeMap().getContentType(fileName) : mimeType; } }