package fr.openwide.core.commons.util.mime; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import org.bindgen.Bindable; import com.google.common.collect.Lists; @Bindable public enum MediaType { // Applications APPLICATION_OCTET_STREAM("application/octet-stream"), APPLICATION_JAVASCRIPT("application/javascript", "js"), APPLICATION_XML("application/xml", "xml"), APPLICATION_JSON("application/json", "json"), APPLICATION_ZIP("application/zip", "zip"), APPLICATION_RAR("application/rar", "rar"), APPLICATION_7Z("application/x-7z-compressed", "7z"), APPLICATION_TAR_GZ("application/x-tgz", "tar.gz"), APPLICATION_KML("application/vnd.google-earth.kml+xml", "kml"), APPLICATION_KMZ("application/vnd.google-earth.kmz", "kmz"), APPLICATION_GPX("application/gpx+xml", "gpx"), APPLICATION_PDF("application/pdf", "pdf"), APPLICATION_SWF("application/x-shockwave-flash", "swf"), // Applications > MS Office APPLICATION_MS_WORD("application/msword", "doc"), APPLICATION_MS_EXCEL("application/vnd.ms-excel", "xls"), APPLICATION_MS_POWERPOINT("application/vnd.ms-powerpoint", "ppt"), APPLICATION_OPENXML_WORD("application/vnd.openxmlformats-officedocument.wordprocessingml.document", "docx"), APPLICATION_OPENXML_EXCEL("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "xlsx"), APPLICATION_OPENXML_POWERPOINT("application/vnd.openxmlformats-officedocument.presentationml.presentation", "pptx"), // Applications > Open Office APPLICATION_ODF_TEXT("application/vnd.oasis.opendocument.text", "odt"), APPLICATION_ODF_SPREADSHEET("application/vnd.oasis.opendocument.spreadsheet", "ods"), APPLICATION_ODF_PRESENTATION("application/vnd.oasis.opendocument.presentation", "odp"), APPLICATION_ODF_CHART("application/vnd.oasis.opendocument.chart", "odc"), // Text TEXT_PLAIN("text/plain", "plain"), TEXT_CSS("text/css", "css"), TEXT_CSV("text/csv", "csv"), TEXT_HTML("text/html", "html", Lists.newArrayList("htm")), TEXT_CALENDAR("text/calendar", "ics"), TEXT_JAVASCRIPT("text/javascript", "js"), TEXT_JSON("text/json", "json"), // Images IMAGE_ANY("image/*"), IMAGE_GIF("image/gif", "gif"), IMAGE_JPEG("image/jpeg", Lists.newArrayList("image/pjpeg"), "jpg", Lists.newArrayList("jpe", "jpeg")), IMAGE_PNG("image/png", Lists.newArrayList("image/x-png"), "png"), IMAGE_TIFF("image/tiff", "tif", Lists.newArrayList("tiff")), IMAGE_X_ICON("image/x-icon", "ico"), IMAGE_SVG("image/svg+xml", "svg"), IMAGE_BMP("image/x-ms-bmp", "bmp"), IMAGE_JPEG2000("image/jp2", "jp2"), IMAGE_PSD("image/x-photoshop", "psd"), // Video VIDEO_ANY("video/*"), // Audio AUDIO_ANY("audio/*") ; private String primaryMimeType; private List<String> additionalMimeTypes = Lists.newArrayListWithExpectedSize(2); private String primaryExtension; private List<String> additionalExtensions = Lists.newArrayListWithExpectedSize(2); private static final Map<String, MediaType> MIME_TYPE_MAPPING = new HashMap<String, MediaType>(); private static final Map<String, MediaType> EXTENSION_MAPPING = new HashMap<String, MediaType>(); static { for (MediaType mimeType : values()) { for (String mimeTypeString : mimeType.supportedMimeTypes()) { MIME_TYPE_MAPPING.put(mimeTypeString, mimeType); } for (String extension : mimeType.supportedExtensions()) { EXTENSION_MAPPING.put(extension, mimeType); } } } private MediaType(String mimeType) { this.primaryMimeType = mimeType; } private MediaType(String mimeType, String primaryExtension) { this.primaryMimeType = mimeType; this.primaryExtension = primaryExtension; } private MediaType(String mimeType, List<String> additionalMimeTypes, String primaryExtension) { this.primaryMimeType = mimeType; this.additionalMimeTypes = additionalMimeTypes; this.primaryExtension = primaryExtension; } private MediaType(String mimeType, String primaryExtension, List<String> additionalExtensions) { this.primaryMimeType = mimeType; this.primaryExtension = primaryExtension; this.additionalExtensions = additionalExtensions; } private MediaType(String mimeType, List<String> additionalMimeTypes, String primaryExtension, List<String> additionalExtensions) { this.primaryMimeType = mimeType; this.additionalMimeTypes = additionalMimeTypes; this.primaryExtension = primaryExtension; this.additionalExtensions = additionalExtensions; } private static String normalize(String string) { if (string == null) { return null; } return string.toLowerCase(Locale.ROOT); } public String mime() { return primaryMimeType; } public String mimeUtf8() { StringBuilder sb = new StringBuilder(primaryMimeType); sb.append(";charset=UTF-8"); return sb.toString(); } public String extension() { return primaryExtension; } public List<String> supportedExtensions() { List<String> supportedExtensions = Lists.newArrayList(additionalExtensions); if (primaryExtension != null) { supportedExtensions.add(0, primaryExtension); } return supportedExtensions; } public List<String> supportedMimeTypes() { List<String> supportedMimeTypes = Lists.newArrayList(additionalMimeTypes); if (primaryMimeType != null) { supportedMimeTypes.add(0, primaryMimeType); } return supportedMimeTypes; } public boolean supports(String extension) { if (extension == null) { return false; } return supportedExtensions().contains(normalize(extension)); } public static MediaType fromMimeType(String mimeType) { if (mimeType == null) { return null; } String mimeTypeWithoutParameters; int parameterStart = mimeType.indexOf(';'); if (parameterStart == -1) { mimeTypeWithoutParameters = normalize(mimeType); } else { mimeTypeWithoutParameters = normalize(mimeType.substring(0, parameterStart)); } return MIME_TYPE_MAPPING.get(mimeTypeWithoutParameters); } public static MediaType fromExtension(String extension) { if (extension == null) { return null; } return EXTENSION_MAPPING.get(normalize(extension)); } }