/*******************************************************************************
* Copyright (c) 2012-2015 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.api.core.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Properties;
/**
* Helps getting content type of file.
*
* @author andrew00x
*/
public class ContentTypeGuesser {
private static final Logger LOG = LoggerFactory.getLogger(ContentTypeGuesser.class);
private static String defaultContentType = "application/octet-stream";
public synchronized static void setDefaultContentType(String myDefaultContentType) {
defaultContentType = myDefaultContentType;
}
public synchronized static String getDefaultContentType() {
return defaultContentType;
}
private static Properties properties = new Properties();
static {
final String filePath = System.getProperty("org.eclipse.che.content-types");
URL resource = null;
if (filePath != null) {
resource = Thread.currentThread().getContextClassLoader().getResource(filePath);
}
if (resource == null) {
resource = Thread.currentThread().getContextClassLoader().getResource("content-types.properties");
}
if (resource != null) {
try (InputStream stream = resource.openStream()) {
properties.load(stream);
LOG.info("Successfully load content types from {}", resource);
} catch (IOException e) {
LOG.error(e.getMessage(), e);
}
}
}
public static String guessContentType(java.io.File file) {
String contentType = null;
final String name = file.getName();
final int dot = name.lastIndexOf('.');
if (dot > 0) {
final String ext = name.substring(dot + 1);
if (!ext.isEmpty()) {
// by file extensions
contentType = properties.getProperty(ext);
}
}
if (contentType == null) {
// by full file name.
contentType = properties.getProperty(name);
}
/* Commented due to on Amazon infra with power instances. JVM crashes with multi-thread access (no problem with single thread).
*** glibc detected *** /usr/local/jdk/bin/java: double free or corruption (out): 0x00007f22f0007820 ***
======= Backtrace: =========
/lib64/libc.so.6[0x3da68760e6]
/lib64/libc.so.6[0x3da6878c13]
/lib64/libglib-2.0.so.0(g_array_free+0x7a)[0x3da7c13dda]
/lib64/libgio-2.0.so.0[0x3da9c352f4]
/lib64/libgobject-2.0.so.0(g_object_unref+0x15f)[0x3da8c0dacf]
/usr/local/jdk1.7.0_17/jre/lib/amd64/libnio.so(Java_sun_nio_fs_GnomeFileTypeDetector_probeUsingGio+0xa2)[0x7f24aa7c7232]
[0x7f24d3186db1]
if (contentType == null) {
try {
// if content type is null use JDK.
contentType = java.nio.file.Files.probeContentType(file.toPath());
} catch (IOException e) {
LOG.warn(e.getMessage(), e);
}
}*/
return contentType == null ? getDefaultContentType() : contentType;
}
public static String guessContentType(String name) {
String contentType = null;
final int dot = name.lastIndexOf('.');
if (dot > 0) {
final String ext = name.substring(dot + 1);
if (!ext.isEmpty()) {
// by file extensions
contentType = properties.getProperty(ext);
}
}
if (contentType == null) {
// by full file name.
contentType = properties.getProperty(name);
}
return contentType == null ? getDefaultContentType() : contentType;
}
private ContentTypeGuesser() {
}
}