package edu.ucsf.mousedatabase.servlets;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
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 edu.ucsf.mousedatabase.HTMLGeneration;
import edu.ucsf.mousedatabase.HTMLUtilities;
import edu.ucsf.mousedatabase.Log;
import edu.ucsf.mousedatabase.dataimport.ImportHandler;
public class ImportServlet extends HttpServlet {
public static final String fileFieldName = "datafile";
public static final String importDefinitionIdFieldName = "importType";
public static final String importDescriptionFieldName = "importDescription";
private static final long serialVersionUID = 1L;
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
@SuppressWarnings("rawtypes")
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletFileUpload uploadHandler = new ServletFileUpload(new DiskFileItemFactory ());
try {
/*
* Parse the request
*/
List items = uploadHandler.parseRequest(request);
Iterator itr = items.iterator();
final HashMap<String,String> parameters = new HashMap<String, String>();
FileItem dataFile = null;
int importDefinitionId = -1;
while(itr.hasNext())
{
FileItem item = (FileItem) itr.next();
if(item.isFormField())
{
parameters.put(item.getFieldName(), item.getString());
//Log.Info("Input field Name = "+item.getFieldName()+", Value = "+item.getString());
if (item.getFieldName().equals(importDefinitionIdFieldName))
{
importDefinitionId = Integer.parseInt(item.getString());
}
}
else
{
if (item.getFieldName().equals(fileFieldName))
{
dataFile = item;
}
}
}
String[] charsetsToTry = new String[]{"UTF-16","UTF-8","ASCII"};
//Charset encoding = detectEncoding(dataFile);
ArrayList<HashMap<String,String>> csvData = null;
for (String charsetName : charsetsToTry)
{
csvData = HTMLUtilities.readCSVFileFromStream(dataFile,Charset.forName(charsetName));
if (csvData.size() > 0)
{
Log.Info("ImportServlet: Detected charset for " + dataFile.getName() + ": " + charsetName);
break;
}
}
final ArrayList<HashMap<String,String>> finalData = csvData;
final int finalDefinitionId = importDefinitionId;
Thread t = new Thread(new Runnable(){
@Override
public void run() {
try
{
ImportHandler.handleImport(finalData, finalDefinitionId,parameters);
}
catch (Exception e)
{
Log.Error("Unhandled exception handling import.",e);
}
}});
t.start();
//redirect to results jsp results page for reportID
response.sendRedirect(HTMLGeneration.adminRoot + "ImportStatus.jsp");
}
catch(FileUploadException ex)
{
log("Error encountered while parsing the request",ex);
response.sendRedirect(HTMLGeneration.siteRoot + "error.jsp");
}
catch(Exception ex)
{
log("Error encountered while uploading file",ex);
throw new ServletException(ex);
}
}
// private Charset detectEncoding(FileItem dataFile)
// {
// // TODO try several, looking at first few characters for dictionary words
// return Charset.forName("UTF-16");
// }
}