/*
*
* Copyright (C) 2007-2015 Licensed to the Comunes Association (CA) under
* one or more contributor license agreements (see COPYRIGHT for details).
* The CA licenses this file to you under the GNU Affero General Public
* License version 3, (the "License"); you may not use this file except in
* compliance with the License. This file is part of kune.
*
* 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.
*
* 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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
\*/
package cc.kune.core.server.manager.file;
import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import cc.kune.core.server.properties.KuneProperties;
import cc.kune.core.shared.FileConstants;
import cc.kune.core.shared.domain.utils.StateToken;
import com.google.inject.Inject;
// TODO: Auto-generated Javadoc
/**
* The Class FileUploadManagerAbstract.
*
* @author vjrj@ourproject.org (Vicente J. Ruiz Jurado)
*/
public abstract class FileUploadManagerAbstract extends HttpServlet {
/** The Constant LOG. */
public static final Log LOG = LogFactory.getLog(FileUploadManager.class);
/** The Constant serialVersionUID. */
private static final long serialVersionUID = -4227762495128652369L;
/** The Constant UTF8. */
protected static final String UTF8 = "UTF-8";
/** The kune properties. */
@Inject
KuneProperties kuneProperties;
/**
* Before post start.
*/
protected abstract void beforePostStart();
/**
* Before respond.
*
* @param response
* the response
* @param w
* the w
* @throws IOException
* Signals that an I/O exception has occurred.
*/
protected abstract void beforeRespond(final HttpServletResponse response, final Writer w)
throws IOException;
/**
* Creates the uploaded file.
*
* @param userHash
* the user hash
* @param stateToken
* the state token
* @param fileName
* the file name
* @param file
* the file
* @param typeId
* the type id
* @throws Exception
* the exception
*/
abstract void createUploadedFile(final String userHash, final StateToken stateToken,
final String fileName, final FileItem file, final String typeId) throws Exception;
/*
* (non-Javadoc)
*
* @see
* javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest
* , javax.servlet.http.HttpServletResponse)
*/
@Override
@SuppressWarnings({ "rawtypes" })
protected void doPost(final HttpServletRequest req, final HttpServletResponse response)
throws ServletException, IOException {
beforePostStart();
final DiskFileItemFactory factory = new DiskFileItemFactory();
// maximum size that will be stored in memory
factory.setSizeThreshold(4096);
// the location for saving data that is larger than getSizeThreshold()
factory.setRepository(new File("/tmp"));
if (!ServletFileUpload.isMultipartContent(req)) {
LOG.warn("Not a multipart upload");
}
final ServletFileUpload upload = new ServletFileUpload(factory);
// maximum size before a FileUploadException will be thrown
upload.setSizeMax(kuneProperties.getLong(KuneProperties.UPLOAD_MAX_FILE_SIZE) * 1024 * 1024);
try {
final List fileItems = upload.parseRequest(req);
String userHash = null;
StateToken stateToken = null;
String typeId = null;
String fileName = null;
FileItem file = null;
for (final Iterator iterator = fileItems.iterator(); iterator.hasNext();) {
final FileItem item = (FileItem) iterator.next();
if (item.isFormField()) {
final String name = item.getFieldName();
final String value = item.getString();
LOG.info("name: " + name + " value: " + value);
if (name.equals(FileConstants.HASH)) {
userHash = value;
}
if (name.equals(FileConstants.TOKEN)) {
stateToken = new StateToken(value);
}
if (name.equals(FileConstants.TYPE_ID)) {
typeId = value;
}
} else {
fileName = item.getName();
LOG.info("file: " + fileName + " fieldName: " + item.getFieldName() + " size: "
+ item.getSize() + " typeId: " + typeId);
file = item;
}
}
createUploadedFile(userHash, stateToken, fileName, file, typeId);
onSuccess(response);
} catch (final FileUploadException e) {
onFileUploadException(response);
} catch (final Exception e) {
onOtherException(response, e);
}
}
/**
* Do response.
*
* @param response
* the response
* @param additionalResponse
* the additional response
* @throws IOException
* Signals that an I/O exception has occurred.
*/
protected void doResponse(final HttpServletResponse response, final String additionalResponse)
throws IOException {
doResponse(response, additionalResponse, HttpServletResponse.SC_OK);
}
/**
* Do response.
*
* @param response
* the response
* @param additionalResponse
* the additional response
* @param responseCode
* the response code
* @throws IOException
* Signals that an I/O exception has occurred.
*/
protected void doResponse(final HttpServletResponse response, final String additionalResponse,
final int responseCode) throws IOException {
final Writer w = new OutputStreamWriter(response.getOutputStream());
if (additionalResponse != null) {
w.write(additionalResponse);
}
w.close();
response.setStatus(responseCode);
}
/**
* Log file del.
*
* @param delResult
* the del result
*/
protected void logFileDel(final boolean delResult) {
if (!delResult) {
LOG.error("Cannot delete file");
}
}
/**
* On file upload exception.
*
* @param response
* the response
* @throws IOException
* Signals that an I/O exception has occurred.
*/
protected void onFileUploadException(final HttpServletResponse response) throws IOException {
doResponse(response, null);
}
/**
* On other exception.
*
* @param response
* the response
* @param e
* the e
* @throws IOException
* Signals that an I/O exception has occurred.
*/
protected void onOtherException(final HttpServletResponse response, final Exception e)
throws IOException {
LOG.info("Exception: " + e.getCause());
e.printStackTrace();
doResponse(response, null);
}
/**
* On success.
*
* @param response
* the response
* @throws IOException
* Signals that an I/O exception has occurred.
*/
protected void onSuccess(final HttpServletResponse response) throws IOException {
doResponse(response, null);
}
}