/*
* 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.utils;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.linagora.linshare.core.domain.constants.Language;
import org.linagora.linshare.core.exception.TechnicalErrorCode;
import org.linagora.linshare.core.exception.TechnicalException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DocumentUtils {
private static final Logger logger = LoggerFactory
.getLogger(DocumentUtils.class);
public File getTempFile(InputStream stream, String fileName) {
// Copy the input stream to a temporary file for safe use
File tempFile = null;
BufferedOutputStream bof = null;
//extract extension
int splitIdx = fileName.lastIndexOf('.');
String extension = "";
if (splitIdx > -1) {
extension = fileName.substring(splitIdx, fileName.length());
}
logger.debug("Found extension :" + extension);
try {
//we need to keep the extension for the thumbnail generator
tempFile = File.createTempFile("linshare", extension);
tempFile.deleteOnExit();
if (logger.isDebugEnabled()) {
logger.debug("createTempFile:" + tempFile);
}
bof = new BufferedOutputStream(new FileOutputStream(tempFile));
// Transfer bytes from in to out
byte[] buf = new byte[64 * 4096]; // 256Kio
int len;
long total_len = 0;
while ((len = stream.read(buf)) > 0) {
bof.write(buf, 0, len);
total_len += len;
logger.debug("data read : " + total_len);
}
bof.flush();
} catch (IOException e) {
logger.error(e.getMessage());
logger.error("exception : ", e);
if (tempFile != null && tempFile.exists())
tempFile.delete();
throw new TechnicalException(TechnicalErrorCode.GENERIC,
"couldn't create a temporary file or read input stream");
} finally {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bof != null) {
try {
bof.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return tempFile;
}
/**
*
* @param bytes Long size of file to format
* @param si International unit system (if true 1Kb 1000b, if not 1Kb = 1024b)
* @param locale The locale in which the size will be displayed
* @return String in human readable format
*/
public static String humanReadableByteCount(long bytes, boolean si, Language locale) {
int unit = si ? 1000 : 1024;
if (bytes < unit) {
if (locale == Language.FRENCH) {
return bytes + " octets";
}
return bytes + " B";
}
int exp = (int) (Math.log(bytes) / Math.log(unit));
String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1)
+ (si ? "" : "i");
if (locale == Language.FRENCH) {
return String.format("%.2f %so", bytes / Math.pow(unit, exp),
("KMGTPE").charAt(exp - 1));
}
return String.format("%.2f %sB", bytes / Math.pow(unit, exp), pre);
}
}