/** * */ package org.gcube.portlets.user.workspace.server.util; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.apache.commons.io.FilenameUtils; import org.apache.log4j.Logger; import org.apache.tika.config.TikaConfig; import org.apache.tika.detect.Detector; import org.apache.tika.io.TikaInputStream; import org.apache.tika.metadata.Metadata; import org.apache.tika.mime.MediaType; /** * The Class MimeTypeUtil. * * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) * * Copied from org.gcube.common.homelibrary.util.MimeTypeUtil * @author Federico De Faveri defaveri@isti.cnr.it * * Jul 5, 2019 */ public class MimeTypeUtility { protected static Logger logger = Logger.getLogger(MimeTypeUtility.class); /** * */ public static final String BINARY_MIMETYPE = "application/octet-stream"; public static final String[] ZIP_MIMETYPES = new String[] { "application/octet-stream", "application/x-compress", "application/x-compressed", "application/x-zip-compressed", "application/x-gzip", "application/x-winzip", "application/x-zip", "application/zip", "multipart/x-zip" }; protected static final Map> mimetype_extension_map = new LinkedHashMap>(); protected static final Map extension_mimetype_map = new LinkedHashMap(); static { InputStream extensionToMimetype = MimeTypeUtility.class.getResourceAsStream("/ExtensionToMimeTypeMap.properties"); InputStream mimetypeToExtension = MimeTypeUtility.class.getResourceAsStream("/MimeTypeToExtensionMap.properties"); try { loadExtensions(extensionToMimetype); loadMimeTypes(mimetypeToExtension); } catch (IOException e) { e.printStackTrace(); } } /** * Load extensions. * * @param is the is * @throws IOException Signals that an I/O exception has occurred. */ protected static void loadExtensions(InputStream is) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line = br.readLine(); while (line != null) { String[] split = line.split("="); if (split.length == 2) { String mimeType = split[0]; String extension = split[1]; extension_mimetype_map.put(extension, mimeType); } line = br.readLine(); } br.close(); } /** * Load mime types. * * @param is the is * @throws IOException Signals that an I/O exception has occurred. */ protected static void loadMimeTypes(InputStream is) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line = br.readLine(); while (line != null) { String[] split = line.split("="); if (split.length == 2) { String mimeType = split[0]; String extension = split[1]; List toExtensions = mimetype_extension_map.get(mimeType); if(toExtensions==null) { toExtensions = new ArrayList(); } toExtensions.add(extension); mimetype_extension_map.put(mimeType, toExtensions); //mimetype_extension_map.put(mimeType, extension); } line = br.readLine(); } br.close(); } /** * Gets the extension. * * @param mimeType the mime type. * @return the related list of Extensions. */ public static List getExtension(String mimeType) { return mimetype_extension_map.get(mimeType); } /** * Gets the name with extension. * * @param name the file name. * @param mimeType the mime type. * @return the right name. * @throws IOException Signals that an I/O exception has occurred. */ public static String getNameWithExtension(String name, String mimeType) throws IOException { logger.trace("getNameWithExtension name: " + name + " mimeType: " + mimeType); String declaredExtension = FilenameUtils.getExtension(name); if(declaredExtension.isEmpty()) { if (mimeType == null) return name; List extensions = MimeTypeUtility.getExtension(mimeType); logger.trace("Available into map extensions is/are: " + extensions); String extension; if(extensions==null) { extension = ""; }else { extension = extensions.get(extensions.size()-1); //I'm reading the last extension in the map (myme type - list of extensions) logger.debug("Using the last extension read into list of available extensions: " + extension); extension = "." + extension; } logger.trace("returning " + name + extension); return name + extension; }else { logger.trace("extension already declared in the name "+name+", returning name like is it"); return name; } } /** * Check if the content type is a zip type. * * @param contentType the content type to check. * @return true if is a zip file, false otherwise. */ public static boolean isZipContentType(String contentType) { for (String zip_mimetype : ZIP_MIMETYPES) if (zip_mimetype.equals(contentType)) return true; return false; } /** * Get mime type by file. * * @param filenameWithExtension the filename with extension * @param tmpFile the tmp file * @return the mime type of the given file */ public static String getMimeType(String filenameWithExtension, File tmpFile) { MediaType mediaType = null; try { TikaConfig config = TikaConfig.getDefaultConfig(); Detector detector = config.getDetector(); TikaInputStream stream = TikaInputStream.get(tmpFile); Metadata metadata = new Metadata(); metadata.add(Metadata.RESOURCE_NAME_KEY, filenameWithExtension); mediaType = detector.detect(stream, metadata); } catch (IOException e) { logger.error("Error detecting mime type for file " + filenameWithExtension); } return mediaType.getBaseType().toString(); } /** * Get mime type by inpustream. * * @param filenameWithExtension the filename with extension * @param input the input * @return the mime type of the given file * @throws IOException Signals that an I/O exception has occurred. */ public static String getMimeType(String filenameWithExtension, InputStream input) throws IOException { MediaType mediaType = null; try { TikaConfig config = TikaConfig.getDefaultConfig(); Detector detector = config.getDetector(); TikaInputStream stream = TikaInputStream.get(input); Metadata metadata = new Metadata(); metadata.add(Metadata.RESOURCE_NAME_KEY, filenameWithExtension); mediaType = detector.detect(stream, metadata); } catch (IOException e) { logger.error("Error detecting mime type for file " + filenameWithExtension); } finally { // if (file!=null) // file.close(); } return mediaType.getBaseType().toString(); } /** * Gets the mime type to extension map. * * @return the mime type to extension map */ public static Map> getMimeTypeToExtensionMap() { return mimetype_extension_map; } /** * Gets the extension to mime type map. * * @return the extension to mime type map */ public static Map getExtensionToMimeTypeMap() { return extension_mimetype_map; } }