/*******************************************************************************
* Copyright 2012 University of Southern California
*
* 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.
*
* This code was developed by the Information Integration Group as part
* of the Karma project at the Information Sciences Institute of the
* University of Southern California. For more information, publications,
* and related projects, please see: http://www.isi.edu/integration
******************************************************************************/
package edu.isi.karma.util;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import edu.isi.karma.webserver.ServletContextParameterMap;
import edu.isi.karma.webserver.ServletContextParameterMap.ContextParameter;
public class FileUtil {
private static String DESTINATION_DIR_PATH = ServletContextParameterMap.getParameterValue(ContextParameter.USER_DIRECTORY_PATH) +
"UserUploadedFiles/";
private static Logger logger = LoggerFactory.getLogger(FileUtil.class);
static public File downloadFileFromHTTPRequest (HttpServletRequest request) {
// Download the file to the upload file folder
File destinationDir = new File(DESTINATION_DIR_PATH);
logger.debug("File upload destination directory: " + destinationDir.getAbsolutePath());
if(!destinationDir.isDirectory()) {
destinationDir.mkdir();
}
DiskFileItemFactory fileItemFactory = new DiskFileItemFactory ();
// Set the size threshold, above which content will be stored on disk.
fileItemFactory.setSizeThreshold(1*1024*1024); //1 MB
//Set the temporary directory to store the uploaded files of size above threshold.
fileItemFactory.setRepository(destinationDir);
ServletFileUpload uploadHandler = new ServletFileUpload(fileItemFactory);
File uploadedFile = null;
try {
// Parse the request
@SuppressWarnings("rawtypes")
List items = uploadHandler.parseRequest(request);
@SuppressWarnings("rawtypes")
Iterator itr = items.iterator();
while(itr.hasNext()) {
FileItem item = (FileItem) itr.next();
// Ignore Form Fields.
if(item.isFormField()) {
// Do nothing
} else {
//Handle Uploaded files. Write file to the ultimate location.
uploadedFile = new File(destinationDir,item.getName());
item.write(uploadedFile);
}
}
} catch(FileUploadException ex) {
logger.error("Error encountered while parsing the request",ex);
} catch(Exception ex) {
logger.error("Error encountered while uploading file",ex);
}
return uploadedFile;
}
public static void copyFiles(File destination, File source) throws FileNotFoundException, IOException{
if(!destination.exists())
destination.createNewFile();
InputStream in = new FileInputStream(source);
OutputStream out = new FileOutputStream(destination);
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0){
out.write(buf, 0, len);
}
in.close();
out.close();
logger.debug("Done copying contents of " + source.getName() + " to " + destination.getName());
}
public static void writePrettyPrintedJSONObjectToFile(JSONObject json, File jsonFile)
throws JSONException, IOException{
String prettyPrintedJSONString = json.toString(4);
FileWriter writer = new FileWriter(jsonFile);
writer.write(prettyPrintedJSONString);
writer.close();
logger.debug("Done writing JSON Object into a File: " + jsonFile.getAbsolutePath());
}
public static String readFileContentsToString (File file) throws IOException {
FileInputStream stream = new FileInputStream(file);
try {
FileChannel fc = stream.getChannel();
MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
/* Instead of using default, pass in a decoder. */
return Charset.defaultCharset().decode(bb).toString();
}
finally {
stream.close();
}
}
/**
* Saves a string to a file.
* @param str
* @param fileName
* @throws FileNotFoundException
* @throws UnsupportedEncodingException
*/
public static void writeStringToFile(String str, String fileName) throws UnsupportedEncodingException, FileNotFoundException{
OutputStreamWriter fw = new OutputStreamWriter(new FileOutputStream(fileName),"UTF-8");
BufferedWriter bw = new BufferedWriter (fw);
PrintWriter outWriter = new PrintWriter (bw);
outWriter.println(str);
outWriter.close();
}
/* does not write UTF8
public static void writeStringToFile(String string, String fileName) throws IOException {
BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
writer.write(string);
writer.flush();
writer.close();
}
*/
}