workspace-tree-widget/src/main/java/org/gcube/portlets/user/workspace/server/UploadServlet.java

321 lines
12 KiB
Java

/**
*
*/
package org.gcube.portlets.user.workspace.server;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
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.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;
import org.gcube.common.core.utils.logging.GCUBELog;
import org.gcube.portlets.user.homelibrary.home.exceptions.InternalErrorException;
import org.gcube.portlets.user.homelibrary.home.workspace.Workspace;
import org.gcube.portlets.user.homelibrary.home.workspace.WorkspaceFolder;
import org.gcube.portlets.user.homelibrary.home.workspace.WorkspaceItem;
import org.gcube.portlets.user.homelibrary.home.workspace.WorkspaceItemType;
import org.gcube.portlets.user.homelibrary.home.workspace.exceptions.InsufficientPrivilegesException;
import org.gcube.portlets.user.homelibrary.home.workspace.exceptions.ItemAlreadyExistException;
import org.gcube.portlets.user.homelibrary.home.workspace.exceptions.ItemNotFoundException;
import org.gcube.portlets.user.homelibrary.home.workspace.exceptions.WorkspaceFolderNotFoundException;
import org.gcube.portlets.user.homelibrary.home.workspace.exceptions.WrongDestinationException;
import org.gcube.portlets.user.homelibrary.home.workspace.folder.FolderItem;
import org.gcube.portlets.user.homelibrary.home.workspace.folder.items.Report;
import org.gcube.portlets.user.homelibrary.home.workspace.folder.items.ReportTemplate;
import org.gcube.portlets.user.homelibrary.util.Extensions;
import org.gcube.portlets.user.homelibrary.util.MimeTypeUtil;
import org.gcube.portlets.user.homelibrary.util.WorkspaceUtil;
import org.gcube.portlets.user.homelibrary.util.zip.UnzipUtil;
import org.gcube.portlets.user.workspace.client.view.windows.UploadResultMessage;
import org.gcube.portlets.user.workspace.server.util.Util;
/**
* @author Federico De Faveri defaveri@isti.cnr.it
*
*/
public class UploadServlet extends HttpServlet {
public static final String UPLOAD_TYPE = "uploadType";
public static final String ID_FOLDER = "idFolder";
public static final String UPLOAD_FORM_ELEMENT = "uploadFormElement";
public static final String FILE = "File";
protected GCUBELog logger = new GCUBELog(UploadServlet.class);
public static final String D4ST = Extensions.REPORT_TEMPLATE.getValue(); //extension of Report Template type
public static final String D4SR = Extensions.REPORT.getValue(); //extension of Report type
/**
*
*/
private static final long serialVersionUID = -4197748678713054285L;
/**
* {@inheritDoc}
*/
@Override
public void init() throws ServletException {
super.init();
System.out.println("Workspace UploadServlet ready.");
}
/**
* {@inheritDoc}
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("GET on UploadServlet");
}
/**
* {@inheritDoc}
*/
@SuppressWarnings("rawtypes")
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("POST on UploadServlet");
logger.trace("POST on UploadServlet");
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
FileItem uploadItem = null;
String destinationId = null;
String uploadType = null;
try {
logger.trace("parsing request");
List items = upload.parseRequest(request);
Iterator it = items.iterator();
while (it.hasNext()) {
FileItem item = (FileItem) it.next();
if (!item.isFormField() && UPLOAD_FORM_ELEMENT.equals(item.getFieldName())) {
uploadItem = item;
}
if (item.isFormField() && ID_FOLDER.equals(item.getFieldName())){
destinationId = item.getString();
}
if (item.isFormField() && UPLOAD_TYPE.equals(item.getFieldName())){
uploadType = item.getString();
}
}
} catch (FileUploadException e) {
logger.error("Error processing request in upload servlet", e);
sendError(response, "Internal error: Error during request processing");
return;
}
if (uploadItem == null) {
logger.error("Error processing request in upload servlet: No file to upload");
sendError(response, "Internal error: No file to upload");
return;
}
if (destinationId == null) {
logger.error("Error processing request in upload servlet: No destination folder id found");
sendError(response, "Internal error: No destination folder id found");
return;
}
logger.trace("destination folder id: "+destinationId);
logger.trace("uploadType: "+uploadType);
Workspace wa = null;
try {
wa = Util.getWorkspace(request.getSession());
} catch (Exception e) {
logger.error("Error during workspace retrieving", e);
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error processing request in upload servlet");
return;
}
if (wa == null) {
logger.error("Now workspace found in session");
sendError(response, "Internal error: No workspace in session");
return;
}
WorkspaceItem item;
try {
item = wa.getItem(destinationId);
} catch (ItemNotFoundException e) {
logger.error("Error, no destination folder found", e);
sendError(response, "Internal error: No destination folder found");
return;
}
if (item.getType() != WorkspaceItemType.FOLDER) {
logger.error("Error processing request in upload servlet: Wrong destination item");
sendError(response, "Internal error: Wrong destination item");
return;
}
WorkspaceFolder destinationFolder = (WorkspaceFolder) item;
try {
//we calculate an unique name for the current destination
String itemName = WorkspaceUtil.getUniqueName(uploadItem.getName(), destinationFolder);
String contentType = MimeTypeUtil.getMimeType(new BufferedInputStream(uploadItem.getInputStream()));
logger.trace("Content type: "+contentType + " unique name: "+itemName);
// System.out.println("Content type: "+contentType + " unique name: "+itemName);
String extension = FilenameUtils.getExtension(itemName);
logger.trace("extension: "+extension);
// System.out.println("extension: "+extension);
if(uploadType.compareTo(FILE)==0) {//IS FILE UPLOAD
//DEBUG
// System.out.println("MimeTypeUtil.isZipContentType(contentType) "+MimeTypeUtil.isZipContentType(contentType));
// System.out.println("extension.compareToIgnoreCase(D4ST) "+extension.compareToIgnoreCase(D4ST));
// System.out.println("extension.compareToIgnoreCase(D4SR) "+extension.compareToIgnoreCase(D4SR));
boolean isZipFile = MimeTypeUtil.isZipContentType(contentType);
if(isZipFile && (extension.compareToIgnoreCase(D4ST)==0)){ //Create REPORT TEMPLATE
String itemwithoutext = itemName.substring(0,itemName.lastIndexOf(D4ST)-1); //remove extension
// System.out.println("itemwithoutext " +itemwithoutext);
logger.trace("createTemplate: "+itemwithoutext);
createTemplate(wa, itemwithoutext, uploadItem.getInputStream(), destinationFolder, response);
}else if(isZipFile && (extension.compareToIgnoreCase(D4SR)==0)){ //Create REPORT
String itemwithoutext = itemName.substring(0,itemName.lastIndexOf(D4SR)-1); //remove extension
// System.out.println("itemwithoutext " +itemwithoutext);
logger.trace("createReport: "+itemwithoutext);
createReport(wa, itemwithoutext, uploadItem.getInputStream(), destinationFolder, response);
}else{ //CREATE AN EXTERNAL FILE
createExternalFile(itemName, uploadItem, destinationFolder, contentType, response);
}
}else {//IS ARCHIVE UPLOAD
if (MimeTypeUtil.isZipContentType(contentType)){
logger.trace("Unziping content");
UnzipUtil.unzip(destinationFolder, uploadItem.getInputStream(), itemName);
sendMessage(response, "Archive "+uploadItem.getName()+" imported correctly in "+destinationFolder.getPath());
} else
createExternalFile(itemName, uploadItem, destinationFolder, contentType, response);
}
uploadItem.delete();
} catch (InsufficientPrivilegesException e) {
logger.error("Error creating elements", e);
sendError(response, "Internal error: Insufficient privileges");
return;
} catch (InternalErrorException e) {
logger.error("Error creating elements", e);
sendError(response, "Internal error: "+e.getMessage());
return;
} catch (ItemAlreadyExistException e) {
logger.error("Error creating elements", e);
sendError(response, "Internal error: An item with that name already exists");
return;
}
}
private void createExternalFile(String itemName, FileItem uploadItem, WorkspaceFolder destinationFolder, String contentType, HttpServletResponse response) throws InternalErrorException, InsufficientPrivilegesException, ItemAlreadyExistException, IOException {
//we need to recalculate the item name
itemName = WorkspaceUtil.getUniqueName(uploadItem.getName(), destinationFolder);
FolderItem createdItem = WorkspaceUtil.createExternalFile(destinationFolder, itemName, "", contentType, uploadItem.getInputStream());
sendMessage(response, "File "+createdItem.getName()+" imported correctly in "+destinationFolder.getPath());
}
private void createReport(Workspace wa, String itemName, InputStream stream, WorkspaceFolder destinationFolder, HttpServletResponse response) throws InsufficientPrivilegesException, ItemAlreadyExistException, InternalErrorException, IOException{
try {
itemName = WorkspaceUtil.getUniqueName(itemName, destinationFolder);
Report report = wa.createReport(itemName, "", Calendar.getInstance(), Calendar.getInstance(), "", "", "", 0, "", stream, destinationFolder.getId());
sendMessage(response, "File "+report.getName()+" imported correctly in "+destinationFolder.getPath());
} catch (WrongDestinationException e) {
logger.error("Error creating elements", e);
sendError(response, "Internal error: Wrong Destination");
} catch (WorkspaceFolderNotFoundException e) {
logger.error("Error creating elements", e);
sendError(response, "Internal error: Workspace Folder Not Found");
}
}
private void createTemplate(Workspace wa, String itemName, InputStream stream, WorkspaceFolder destinationFolder, HttpServletResponse response) throws InsufficientPrivilegesException, ItemAlreadyExistException, InternalErrorException, IOException{
try {
itemName = WorkspaceUtil.getUniqueName(itemName, destinationFolder);
ReportTemplate template = wa.createReportTemplate(itemName, "", Calendar.getInstance(), Calendar.getInstance(), "", "", 0, "", stream, destinationFolder.getId());
sendMessage(response, "File "+template.getName()+" imported correctly in "+destinationFolder.getPath());
} catch (WrongDestinationException e) {
logger.error("Error creating elements", e);
sendError(response, "Internal error: Wrong Destination");
} catch (WorkspaceFolderNotFoundException e) {
logger.error("Error creating elements", e);
sendError(response, "Internal error: Workspace Folder Not Found");
}
}
protected void sendError(HttpServletResponse response, String message) throws IOException
{
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
UploadResultMessage resultMessage = UploadResultMessage.errorResult(message);
response.getWriter().write(resultMessage.toString());
response.flushBuffer();
}
protected void sendMessage(HttpServletResponse response, String message) throws IOException
{
response.setStatus(HttpServletResponse.SC_ACCEPTED);
UploadResultMessage resultMessage = UploadResultMessage.okResult(message);
response.getWriter().write(resultMessage.toString());
response.flushBuffer();
}
protected void sendWarnMessage(HttpServletResponse response, String message) throws IOException
{
response.setStatus(HttpServletResponse.SC_ACCEPTED);
UploadResultMessage resultMessage = UploadResultMessage.warnResult(message);
response.getWriter().write(resultMessage.toString());
response.flushBuffer();
}
}