/*
* LinShare is an open source filesharing software, part of the LinPKI software
* suite, developed by Linagora.
*
* Copyright (C) 2015 LINAGORA
*
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU Affero General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any
* later version, provided you comply with the Additional Terms applicable for
* LinShare software by Linagora pursuant to Section 7 of the GNU Affero General
* Public License, subsections (b), (c), and (e), pursuant to which you must
* notably (i) retain the display of the “LinShare™” trademark/logo at the top
* of the interface window, the display of the “You are using the Open Source
* and free version of LinShare™, powered by Linagora © 2009–2015. Contribute to
* Linshare R&D by subscribing to an Enterprise offer!” infobox and in the
* e-mails sent with the Program, (ii) retain all hypertext links between
* LinShare and linshare.org, between linagora.com and Linagora, and (iii)
* refrain from infringing Linagora intellectual property rights over its
* trademarks and commercial brands. Other Additional Terms apply, see
* <http://www.linagora.com/licenses/> for more details.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
* details.
*
* You should have received a copy of the GNU Affero General Public License and
* its applicable Additional Terms for LinShare along with this program. If not,
* see <http://www.gnu.org/licenses/> for the GNU Affero General Public License
* version 3 and <http://www.linagora.com/licenses/> for the Additional Terms
* applicable to LinShare software.
*/
package org.linagora.linshare.core.dao.tika;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Set;
import java.util.SortedSet;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.mime.MediaType;
import org.apache.tika.mime.MimeTypeException;
import org.apache.tika.mime.MimeTypes;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.Parser;
import org.apache.tika.sax.BodyContentHandler;
import org.linagora.linshare.core.dao.MimeTypeMagicNumberDao;
import org.linagora.linshare.core.domain.entities.MimeType;
import org.linagora.linshare.core.exception.BusinessErrorCode;
import org.linagora.linshare.core.exception.BusinessException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.ContentHandler;
import com.google.common.collect.Sets;
/**
* This class is designed to detect mime type an extension from a file.
*
* @author fma
*
*/
public class MimeTypeMagicNumberTikaImpl implements MimeTypeMagicNumberDao {
private static final Logger logger = LoggerFactory.getLogger(MimeTypeMagicNumberTikaImpl.class);
@Override
public String getMimeType(InputStream theFileInputStream) throws BusinessException {
try {
Metadata metadata = new Metadata();
ContentHandler contenthandler = new BodyContentHandler();
Parser parser = new AutoDetectParser();
try {
parser.parse(theFileInputStream, contenthandler, metadata, null);
} catch (Exception e) {
logger.debug("some exceptions could be raised in this case : " + e.getMessage());
if (e.getCause() != null) logger.debug(e.getCause().toString());
} catch (java.lang.NoSuchMethodError e) {
logger.debug("some exceptions could be raised in this case : " + e.getMessage());
if (e.getCause() != null) logger.debug(e.getCause().toString());
}
String stringMimeType = metadata.get(Metadata.CONTENT_TYPE);
logger.debug("Mime type : " + stringMimeType);
// MimeType mimeType = MimeTypes.getDefaultMimeTypes().forName(stringMimeType);
// String extension = mimeType.getExtension();
// logger.debug("extension : " + extension);
return stringMimeType;
} catch (Exception e) {
logger.error(e.getMessage());
logger.debug(e.getCause().toString());
}
return "data";
}
@Override
public String getMimeType(File file) throws BusinessException {
BufferedInputStream bufStream = null;
FileInputStream f = null;
String mimeType = null;
try {
f = new FileInputStream(file);
bufStream = new BufferedInputStream(f);
mimeType = this.getMimeType(bufStream);
} catch (FileNotFoundException e) {
logger.error("Could not read the uploaded file !", e);
throw new BusinessException(BusinessErrorCode.MIME_NOT_FOUND, "Could not read the uploaded file.");
} finally {
if (f != null) {
try {
f.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bufStream != null) {
try {
bufStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
if(mimeType == null) {
mimeType = "data";
}
logger.debug("Mime type found : " + mimeType);
return mimeType;
}
@Override
public Set<MimeType> getAllMimeType() {
Set<MimeType> mimeTypes = Sets.newHashSet();
MimeTypes defaultMimeTypes = MimeTypes.getDefaultMimeTypes();
SortedSet<MediaType> types = defaultMimeTypes.getMediaTypeRegistry().getTypes();
for (MediaType mediaType : types) {
String strMimeType = mediaType.toString();
try {
String extension = defaultMimeTypes.forName(strMimeType).getExtension();
mimeTypes.add(new MimeType(strMimeType, extension, true, false));
} catch (MimeTypeException e) {
logger.error("Can not find extension(s) for mime type : " + strMimeType);
logger.debug(e.getMessage());
}
}
return mimeTypes;
}
}