/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* 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 Lesser General Public License for more details.
*
* Copyright 2008 - 2009 Pentaho Corporation. All rights reserved.
*
*
* Created May 26, 2009
* @author rmansoor
*/
package org.pentaho.platform.dataaccess.datasource.wizard.service.impl;
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.pentaho.platform.api.engine.IPentahoSession;
import org.pentaho.platform.dataaccess.datasource.wizard.service.impl.utils.PentahoSystemHelper;
import org.pentaho.platform.dataaccess.datasource.wizard.service.messages.Messages;
import org.pentaho.platform.engine.core.system.PentahoSystem;
import org.pentaho.platform.util.UUIDUtil;
import org.pentaho.platform.web.http.PentahoHttpSessionHelper;
import org.pentaho.reporting.libraries.base.util.StringUtils;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
public class UploadFileDebugServlet extends HttpServlet implements Servlet {
private static final long serialVersionUID = 8305367618713715640L;
private static final long MAX_FILE_SIZE = 300000;
private static final long MAX_FOLDER_SIZE = 900000;
public static final String DEFAULT_RELATIVE_UPLOAD_FILE_PATH = File.separatorChar + "system" + File.separatorChar + "metadata" + File.separatorChar + "csvfiles" + File.separatorChar; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
public UploadFileDebugServlet() {
PentahoSystemHelper.init();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
String relativePath = PentahoSystem.getSystemSetting("file-upload-defaults/relative-path", String.valueOf(DEFAULT_RELATIVE_UPLOAD_FILE_PATH)); //$NON-NLS-1$
String maxFileLimit = PentahoSystem.getSystemSetting("file-upload-defaults/max-file-limit", String.valueOf(MAX_FILE_SIZE)); //$NON-NLS-1$
String maxFolderLimit = PentahoSystem.getSystemSetting("file-upload-defaults/max-folder-limit", String.valueOf(MAX_FOLDER_SIZE)); //$NON-NLS-1$
IPentahoSession session = PentahoHttpSessionHelper.getPentahoSession(request);
response.setContentType("text/plain"); //$NON-NLS-1$
FileItem uploadItem = getFileItem(request);
if (uploadItem == null) {
String error = Messages.getErrorString("UploadFileDebugServlet.ERROR_0001_NO_FILE_TO_UPLOAD"); //$NON-NLS-1$
response.getWriter().write(error);
return;
}
if (Long.parseLong(maxFileLimit) < uploadItem.getSize()) {
String error = Messages.getErrorString("UploadFileDebugServlet.ERROR_0003_FILE_TOO_BIG"); //$NON-NLS-1$
response.getWriter().write(error);
return;
}
String path = PentahoSystem.getApplicationContext().getSolutionPath(relativePath);
File pathDir = new File(path);
// create the path if it doesn't exist yet
if (!pathDir.exists()) {
pathDir.mkdirs();
}
if (uploadItem.getSize() + getFolderSize(new File(path)) > Long.parseLong(maxFolderLimit)) {
String error = Messages.getErrorString("UploadFileDebugServlet.ERROR_0004_FOLDER_SIZE_LIMIT_REACHED"); //$NON-NLS-1$
response.getWriter().write(error);
return;
}
String filename = request.getParameter("file_name"); //$NON-NLS-1$
if(StringUtils.isEmpty(filename)) {
filename = UUIDUtil.getUUID().toString();
}
String temporary = request.getParameter("mark_temporary"); //$NON-NLS-1$
boolean isTemporary = false;
if(temporary != null) {
isTemporary = Boolean.valueOf(temporary);
}
File file;
if(isTemporary) {
file = PentahoSystem.getApplicationContext().createTempFile(session, "",".tmp", true); //$NON-NLS-1$
} else {
file = new File(path + File.separatorChar + filename);
}
FileOutputStream outputStream = new FileOutputStream(file);
byte[] fileContents = uploadItem.get();
outputStream.write(fileContents);
outputStream.flush();
outputStream.close();
response.getWriter().write(file.getName());
} catch (Exception e) {
String error = Messages.getErrorString("UploadFileDebugServlet.ERROR_0005_UNKNOWN_ERROR", e.getLocalizedMessage()); //$NON-NLS-1$
response.getWriter().write(error);
}
}
private FileItem getFileItem(HttpServletRequest request) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List items = upload.parseRequest(request);
Iterator it = items.iterator();
while (it.hasNext()) {
FileItem item = (FileItem) it.next();
if (!item.isFormField() && "uploadFormElement".equals(item.getFieldName())) {//$NON-NLS-1$
return item;
}
}
} catch (FileUploadException e) {
return null;
}
return null;
}
private long getFolderSize(File folder) {
long foldersize = 0;
File[] filelist = folder.listFiles();
for (int i = 0; i < filelist.length; i++) {
if (filelist[i].isDirectory()) {
foldersize += getFolderSize(filelist[i]);
} else {
foldersize += filelist[i].length();
}
}
return foldersize;
}
}