package com.idega.core.file.util;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import com.idega.idegaweb.IWApplicationContext;
import com.idega.idegaweb.IWMainApplication;
import com.idega.repository.data.Singleton;
import com.idega.util.FileUtil;
import com.idega.util.SortedProperties;
/**
* 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
*/
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_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";
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 = {
"application/octet-stream",
"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/octet-stream",
"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",
"text/xml",
"text/richtext",
"text/enriched",
"text/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"
};
protected MimeTypeUtil() {
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;
try {
this.properties = new SortedProperties();
this.properties.load(new FileInputStream(pathToFile));
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);
}
}
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()
+ FileUtil.getFileSeparator();
}
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 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;
}
}