package org.ff4j.web.utils;
/*
* #%L
* ff4j-sample-web
* %%
* Copyright (C) 2013 - 2016 FF4J
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import static org.ff4j.web.bean.WebConstants.NEW_LINE;
import static org.ff4j.web.bean.WebConstants.UTF8_ENCODING;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
import javax.imageio.ImageIO;
import javax.xml.bind.DatatypeConverter;
/**
* Read file for HDD.
*
* @author Cedrick LUNVEN (@clunven)
*/
public class FileUtils {
/** Taille du buffer. **/
private static final int BUFFER_SIZE = 4096;
/**
* Hide default constructor.
*/
private FileUtils() {
}
/**
* Utils method to load a file as String.
*
* @param fileName
* target file Name.
* @return target file content as String
* @throws FileNotFoundException
*/
public static String loadFileAsString(String fileName)
throws FileNotFoundException {
InputStream in = getResourceAsStream(fileName);
if (in == null) return null;
Scanner currentScan = null;
StringBuilder strBuilder = new StringBuilder();
try {
currentScan = new Scanner(in, UTF8_ENCODING);
while (currentScan.hasNextLine()) {
strBuilder.append(currentScan.nextLine());
strBuilder.append(NEW_LINE);
}
} finally {
if (currentScan != null) {
currentScan.close();
}
}
return strBuilder.toString();
}
/**
* Fetch everywhere in the classpath for a resource.
*
* @param fileName
* current file path
* @return
* input stream for this file
* @throws FileNotFoundException
* file is not found anywhere
*/
private static InputStream getResourceAsStream(String fileName)
throws FileNotFoundException {
InputStream is = FileUtils.class.getResourceAsStream(fileName);
if (is == null) {
// Fetch absolute classloader path
is = FileUtils.class.getClassLoader().getResourceAsStream(fileName);
}
if (is == null) {
// Thread
is = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
}
if (is == null) {
throw new FileNotFoundException("Cannot load file " + fileName + " please check");
}
return is;
}
/**
* Load with Buffer.
*
* @param fileName
* target file name
* @return
* file as String
* @throws IOException
*/
public final static String loadFileAsStringWithBuffer(String fileName) throws IOException {
InputStream in = getResourceAsStream(fileName);
StringBuffer out = new StringBuffer();
byte[] b = new byte[BUFFER_SIZE];
int n = 0;
while (n != -1) {
out.append(new String(b, 0, n));
n = in.read(b);
}
return out.toString();
}
/**
* Transform inputStream into base64.
*
* @param fileName
* target file name
* @return encoded string
*/
public static String loadAndResizeImageAsBase64(String fileName) {
return DatatypeConverter.printBase64Binary(loadAndResizeImageAsByteArray(fileName));
}
/**
* Transform inputStream into base64.
*
* @param fileName
* target file name
* @return encoded string
*/
public static byte[] loadAndResizeImageAsByteArray(String fileName) {
ByteArrayOutputStream baos = loadAndResizeImage(fileName);
return (baos != null) ? baos.toByteArray() : null;
}
/**
* Transform inputStream into base64.
*
* @param fileName
* target file name
* @return encoded string
* @throws FileNotFoundException
*/
public static ByteArrayOutputStream loadAndResizeImage(String fileName) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
InputStream is = getResourceAsStream(fileName);
// Reading
BufferedImage image = ImageIO.read(is);
// Resizing
BufferedImage resizedImage = new BufferedImage(130, 180, image.getType());
Graphics2D g = resizedImage.createGraphics();
g.drawImage(image, 0, 0, 130, 180, null);
g.dispose();
// Write into outpustream
ImageIO.write(resizedImage, getFileExtension(fileName), bos);
// Convert to base64
return bos;
} catch (FileNotFoundException e) {
throw new IllegalArgumentException("Invalid image the file cannot be load", e);
} catch (IOException e) {
throw new IllegalArgumentException("Cannot convert image to base64", e);
} finally {
try {
bos.close();
} catch (IOException e) {}
}
}
/**
* Load file fro mrelative path.
*
* @param fileName
* current fileName.
* @return
* Stream of data from file
* @throws FileNotFoundException
* the file does no exist in the classpath
*/
public static ByteArrayOutputStream loadFileAsOutputStream(String fileName)
throws FileNotFoundException {
// Best in application server
InputStream is = getResourceAsStream(fileName);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
byte[] buf = new byte[8192];
int c = 0;
while ((c = is.read(buf, 0, buf.length)) > 0) {
bos.write(buf, 0, c);
bos.flush();
}
} catch (IOException e) {
throw new IllegalArgumentException("Cannot convert image to base64", e);
} finally {
try {
if (bos != null) {
bos.close();
}
if (is != null) {
is.close();
}
} catch (IOException e) {}
}
return bos;
}
/**
* Transform inputStream into base64.
*
* @param fileName
* target file name
* @return encoded string
* @throws FileNotFoundException
*/
public static byte[] loadFileAsByteArray(String fileName)
throws FileNotFoundException {
ByteArrayOutputStream baos = loadFileAsOutputStream(fileName);
return (baos != null) ? baos.toByteArray() : null;
}
/**
* Extract extension of file if exist.
*
* @param filepath
* current file path
* @return
* current extension
*/
public static String getFileExtension(String filepath) {
int lastIndex = filepath.lastIndexOf(".");
return (lastIndex == -1) ? null : filepath.substring(lastIndex + 1 , filepath.length());
}
}