UploadFileAction.java

package sk.iway.iwcm.editor;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.fileupload.FileItem;
import org.apache.struts.util.ResponseUtils;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import sk.iway.iwcm.Adminlog;
import sk.iway.iwcm.Constants;
import sk.iway.iwcm.FileTools;
import sk.iway.iwcm.Identity;
import sk.iway.iwcm.Logger;
import sk.iway.iwcm.PkeyGenerator;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.common.UploadFileTools;
import sk.iway.iwcm.gallery.GalleryDB;
import sk.iway.iwcm.gallery.ImageInfo;
import sk.iway.iwcm.io.IwcmFile;
import sk.iway.iwcm.io.IwcmFsDB;
import sk.iway.iwcm.system.context.ContextFilter;
import sk.iway.iwcm.users.UsersDB;
import sk.iway.upload.UploadedFile;

/**
 *  Description of the Class
 *
 *@Title        magma-web
 *@Company      Interway s.r.o. (www.interway.sk)
 *@Copyright    Interway s.r.o. (c) 2001-2002
 *@author       $Author: jeeff $
 *@version      $Revision: 1.12 $
 *@created      Piatok, 2002, m�j 17
 *@modified     $Date: 2004/03/12 10:16:36 $
 */
public class UploadFileAction {

	private static final String FILE_NOT_ALLOWED = "/admin/FCKeditor/editor/dialog/editor_upload_iframe.jsp";

	private UploadFileAction() {
		//utility class
	}

	/**
	 * Save image that was drag&drop inside opened web page editor (uploadType=ckeditor).
	 * @param request
	 * @param response
	 * @param multipartFile
	 * @return
	 * @throws IOException
	 * @throws ServletException
	 */
	public static String execute(HttpServletRequest request, HttpServletResponse response, CommonsMultipartFile multipartFile) throws IOException {

		HttpSession session = request.getSession();
		if (session == null) return "logon_admin";

		Identity user = (Identity) session.getAttribute(Constants.USER_KEY);
		//povolenie pre blog alebo wiki
		if (UsersDB.checkUserPerms(user, Constants.getString("webpagesFunctionsPerms")) == false) return "logon_admin";

		int groupId = Tools.getIntValue(request.getParameter("groupId"), -1);
		int docId = Tools.getIntValue(request.getParameter("docId"), -1);
		String title = request.getParameter("title");
		FileItem file = multipartFile.getFileItem();
		String fileURL = "";
		String realPath = null;
		String fileName = null;
		//Size must be taken from CommonsMultipartFile !! - CommonsMultipartFile.getFileItem().getSize() isn't firht value
		long fileSize = multipartFile.getSize();

		//Check file size for upload, upload type id fix ckeditor, we dont use this method for other upload type's
		if (!isFileAllowed("ckeditor", file, user, request, fileSize)) return FILE_NOT_ALLOWED;

		if (file != null) {
			//Retrieve the file name
			fileName = file.getName().trim();

			//Check file name
			if (!Tools.isEmpty(fileName)) {

				String extension = FileTools.getFileExtension(fileName);
				ImageInfo ii = new ImageInfo(file.getInputStream());
				Logger.debug(UploadFileAction.class, "ckeditor upload, extension=" + extension + " ii=" + ii.getFormatName());

				String extensionII = ii.getFormatName();
				if (extensionII != null && extensionII.length() > 2) {
					//musime spravit podla ImageInfo lebo Word klame ze posiela png ale realne je obrazok jpg
					extensionII = extensionII.toLowerCase();
					extensionII = Tools.replace(extensionII, "jpeg", "jpg");
					extension = extensionII;
				}

				if (fileName.equals("image.png") || fileName.equals("image.jpg")) {
					//jedna sa o pasted grafiku z nejakeho programu
					fileName = "image-" + PkeyGenerator.getNextValue("ckeditor_upload_counter") + "." + extension;
				}

				//adresar odvodime podla posledne editovanej stranky
				Logger.debug(UploadFileAction.class, "UPLOAD docId="+docId+" groupId="+groupId);

				String subDir = UploadFileTools.getPageUploadSubDir(docId, groupId, title, null);
				if (ContextFilter.isRunning(request) && subDir.startsWith(request.getContextPath()))
					subDir = ContextFilter.removeContextPath(request.getContextPath(), subDir);

				IwcmFile f = IwcmFile.fromVirtualPath(Constants.getString("imagesRootDir") + subDir, fileName);
				if(f.exists())
					fileName = PkeyGenerator.getNextValue("ckeditor_upload_counter")+"_"+fileName;

				realPath = Tools.getRealPath(Constants.getString("imagesRootDir") + subDir) + File.separatorChar + fileName;
				fileURL = Constants.getString("imagesRootDir") + subDir + "/" + fileName;

				if (realPath != null && fileSize > 0) {
					IwcmFile f2 = new IwcmFile(realPath);

					//Save main file
					IwcmFsDB.writeFiletoDest(file.getInputStream(), new File(f2.getPath()), (int)fileSize);

					Adminlog.add(Adminlog.TYPE_FILE_UPLOAD, "file upload: " + realPath, -1, -1);
				}

				if (GalleryDB.isGalleryFolder(Constants.getString("imagesRootDir") + subDir)) {
					//v realpath mas cestu k obrazku kde jeOriginal
					//ten nechas ako je
					//ale vytvoris jeho novu kopiu
					GalleryDB.resizePicture(realPath, Constants.getString("imagesRootDir") + subDir);
				} else if (Constants.getBoolean("imageAlwaysCreateGalleryBean")) {
					GalleryDB.setImage(Constants.getString("imagesRootDir") + subDir, fileName);
				}

				UploadFileAction.reflectionLoader(request, user, fileURL);
			}

			if (fileURL != null && fileName != null) {
				response.setStatus(HttpServletResponse.SC_OK);
				PrintWriter out = response.getWriter();

				fileURL = request.getContextPath() + fileURL;
				fileURL = Tools.replace(fileURL, "//", "/");

				out.print("{\"fileName\":\""+ResponseUtils.filter(fileName)+"\",\"uploaded\":1,\"url\":\""+ Tools.replace(fileURL, "/", "\\/") +"\",\"error\":{\"number\"" +
						":201,\"message\":\"A file with the same name is already available. The uploaded file was renamed to \\\"847" +
						"(2).jpg\\\".\"}}");
			}
		}

		return null;
	}

	/**
	 * Check is the file is allowed
	 * @param uploadType
	 * @param file
	 * @param user
	 * @param request
	 * @param fileSize
	 * @return
	 */
	public static boolean isFileAllowed(String uploadType, FileItem file, Identity user, HttpServletRequest request, Long fileSize) {

		if (file == null) return false;

		//Prep file name
		String fileName = file.getName().trim();
		fileName = fileName.toLowerCase();

		//
		return UploadFileTools.isFileAllowed(uploadType, fileName, fileSize, user, request);
	}

	public static boolean isFileAllowed(UploadedFile formFile, Identity user, String uploadType, HttpServletRequest request)
	{
		String fileName = formFile.getFileName().trim();
		return UploadFileTools.isFileAllowed(uploadType, fileName, formFile.getFileSize(), user, request);
	}

	public static boolean isFileAllowed(String uploadType, String fileName, long fileSize, Identity user, HttpServletRequest request)
	{
		return UploadFileTools.isFileAllowed(uploadType,fileName,fileSize,user,request);
	}

	public static void reflectionLoader(HttpServletRequest request, Identity user, String fileUrl) {
		String uploadFileActionReflectionLoader = Constants.getString("uploadFileActionReflectionLoader");

		if (Tools.isNotEmpty(uploadFileActionReflectionLoader)) {
			String[] reflectionLoaderClasses = Tools.getTokens(uploadFileActionReflectionLoader, "|");

			for (String reflectionLoaderClass : reflectionLoaderClasses) {
				String className = reflectionLoaderClass.substring(0, reflectionLoaderClass.lastIndexOf("."));
				String methodName = reflectionLoaderClass.substring(reflectionLoaderClass.lastIndexOf(".") + 1);

				try {
					Class<?> clazz = Class.forName(className);
				    Method method = clazz.getMethod(methodName, HttpServletRequest.class, user.getClass(), String.class);
				    method.invoke(null, request, user, fileUrl);
				} catch (ClassNotFoundException | IllegalAccessException | NoSuchMethodException | SecurityException | IllegalArgumentException | InvocationTargetException e) {
					Logger.debug(UploadFileAction.class, "ReflectionLoader - " + className + "." + methodName + " exception");
					sk.iway.iwcm.Logger.error(e);
				}
			}
		}
	}

	/**
	 * @deprecated use UploadFileTools.getPageUploadSubDir
	 */
	@Deprecated
	public static String getPageUploadSubDir(int docId, int groupId, String prefix){
		return UploadFileTools.getPageUploadSubDir(docId,groupId,null,prefix);
	}

	/**
	 * @deprecated - use UploadFileTools.getUploadMaxSize
	 */
	@Deprecated
	public static int getUploadMaxSize(Identity user, String type){
		return UploadFileTools.getUploadMaxSize(user,type);
	}

	/**
	 * @deprecated - use UploadFileTools.getUploadFileTypes
	 */
	@Deprecated
	public static String getUploadFileTypes(Identity user, String type){
		return UploadFileTools.getUploadFileTypes(user,type);
	}

	/**
	 * @deprecated - use UploadFileTools.getPageUploadSubDir
	 */
	@Deprecated
	public static String getPageUploadSubDir(int docId, int groupId){
		return UploadFileTools.getPageUploadSubDir(docId,groupId);
	}

}