com.liferay.portal.kernel.upload.BaseUploadHandler.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.portal.kernel.upload.BaseUploadHandler.java

Source

/**
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library 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.
 */

package com.liferay.portal.kernel.upload;

import com.liferay.document.library.kernel.antivirus.AntivirusScannerException;
import com.liferay.document.library.kernel.exception.FileNameException;
import com.liferay.document.library.kernel.exception.FileSizeException;
import com.liferay.petra.string.StringPool;
import com.liferay.portal.kernel.editor.EditorConstants;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.json.JSONFactoryUtil;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.json.JSONUtil;
import com.liferay.portal.kernel.portlet.JSONPortletResponseUtil;
import com.liferay.portal.kernel.portletfilerepository.PortletFileRepositoryUtil;
import com.liferay.portal.kernel.repository.model.FileEntry;
import com.liferay.portal.kernel.security.permission.PermissionChecker;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.servlet.ServletResponseConstants;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.FileUtil;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.WebKeys;

import java.io.IOException;
import java.io.InputStream;

import javax.portlet.PortletRequest;
import javax.portlet.PortletResponse;

/**
 * @author Sergio Gonzlez
 * @author Adolfo Prez
 * @author Roberto Daz
 */
public abstract class BaseUploadHandler implements UploadHandler {

    @Override
    public void upload(PortletRequest portletRequest, PortletResponse portletResponse) throws PortalException {

        UploadPortletRequest uploadPortletRequest = PortalUtil.getUploadPortletRequest(portletRequest);

        ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY);

        checkPermission(themeDisplay.getScopeGroupId(), getFolderId(uploadPortletRequest),
                themeDisplay.getPermissionChecker());

        JSONObject jsonObject = JSONFactoryUtil.createJSONObject();

        try {
            UploadException uploadException = (UploadException) portletRequest
                    .getAttribute(WebKeys.UPLOAD_EXCEPTION);

            if (uploadException != null) {
                Throwable cause = uploadException.getCause();

                if (uploadException.isExceededFileSizeLimit()) {
                    throw new FileSizeException(cause);
                }

                if (uploadException.isExceededLiferayFileItemSizeLimit()) {
                    throw new LiferayFileItemException(cause);
                }

                if (uploadException.isExceededUploadRequestSizeLimit()) {
                    throw new UploadRequestSizeException(cause);
                }

                throw new PortalException(cause);
            }

            JSONObject imageJSONObject = getImageJSONObject(portletRequest);

            String randomId = ParamUtil.getString(uploadPortletRequest, "randomId");

            imageJSONObject.put("randomId", randomId);

            jsonObject.put("file", imageJSONObject).put("success", Boolean.TRUE);

            JSONPortletResponseUtil.writeJSON(portletRequest, portletResponse, jsonObject);
        } catch (IOException ioe) {
            throw new SystemException(ioe);
        } catch (PortalException pe) {
            handleUploadException(portletRequest, portletResponse, pe, jsonObject);
        }
    }

    protected abstract FileEntry addFileEntry(long userId, long groupId, long folderId, String fileName,
            String contentType, InputStream inputStream, long size, ServiceContext serviceContext)
            throws PortalException;

    protected abstract void checkPermission(long groupId, long folderId, PermissionChecker permissionChecker)
            throws PortalException;

    protected void doHandleUploadException(PortletRequest portletRequest, PortletResponse portletResponse,
            PortalException pe, JSONObject jsonObject) throws PortalException {

        throw pe;
    }

    protected abstract FileEntry fetchFileEntry(long userId, long groupId, long folderId, String fileName)
            throws PortalException;

    protected long getFolderId(UploadPortletRequest uploadPortletRequest) {
        return 0;
    }

    protected JSONObject getImageJSONObject(PortletRequest portletRequest) throws PortalException {

        UploadPortletRequest uploadPortletRequest = PortalUtil.getUploadPortletRequest(portletRequest);

        ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY);

        JSONObject imageJSONObject = JSONFactoryUtil.createJSONObject();

        try {
            imageJSONObject.put("attributeDataImageId", EditorConstants.ATTRIBUTE_DATA_IMAGE_ID);

            String parameterName = getParameterName();

            String fileName = uploadPortletRequest.getFileName(parameterName);
            String contentType = uploadPortletRequest.getContentType(parameterName);
            long size = uploadPortletRequest.getSize(parameterName);

            validateFile(fileName, contentType, size);

            long folderId = getFolderId(uploadPortletRequest);

            String uniqueFileName = getUniqueFileName(themeDisplay, fileName, folderId);

            try (InputStream inputStream = uploadPortletRequest.getFileAsStream(parameterName)) {

                FileEntry fileEntry = addFileEntry(themeDisplay.getUserId(), themeDisplay.getScopeGroupId(),
                        folderId, uniqueFileName, contentType, inputStream, size,
                        getServiceContext(uploadPortletRequest));

                imageJSONObject.put("fileEntryId", fileEntry.getFileEntryId())
                        .put("groupId", fileEntry.getGroupId()).put("title", fileEntry.getTitle())
                        .put("type", "document").put("url", getURL(fileEntry, themeDisplay))
                        .put("uuid", fileEntry.getUuid());

                return imageJSONObject;
            }
        } catch (IOException ioe) {
            throw new SystemException(ioe);
        }
    }

    protected abstract String getParameterName();

    /**
     * @throws PortalException
     */
    protected ServiceContext getServiceContext(UploadPortletRequest uploadPortletRequest) throws PortalException {

        return null;
    }

    protected String getUniqueFileName(ThemeDisplay themeDisplay, String fileName, long folderId)
            throws PortalException {

        FileEntry fileEntry = fetchFileEntry(themeDisplay.getUserId(), themeDisplay.getScopeGroupId(), folderId,
                fileName);

        if (fileEntry == null) {
            return fileName;
        }

        int suffix = 1;

        for (int i = 0; i < _UNIQUE_FILE_NAME_TRIES; i++) {
            String curFileName = FileUtil.appendParentheticalSuffix(fileName, String.valueOf(suffix));

            fileEntry = fetchFileEntry(themeDisplay.getUserId(), themeDisplay.getScopeGroupId(), folderId,
                    curFileName);

            if (fileEntry == null) {
                return curFileName;
            }

            suffix++;
        }

        throw new PortalException("Unable to get a unique file name for " + fileName);
    }

    protected String getURL(FileEntry fileEntry, ThemeDisplay themeDisplay) {
        return PortletFileRepositoryUtil.getPortletFileEntryURL(themeDisplay, fileEntry, StringPool.BLANK);
    }

    protected void handleUploadException(PortletRequest portletRequest, PortletResponse portletResponse,
            PortalException pe, JSONObject jsonObject) throws PortalException {

        jsonObject.put("success", Boolean.FALSE);

        if (pe instanceof AntivirusScannerException || pe instanceof FileNameException
                || pe instanceof FileSizeException || pe instanceof UploadRequestSizeException) {

            String errorMessage = StringPool.BLANK;
            int errorType = 0;

            if (pe instanceof AntivirusScannerException) {
                errorType = ServletResponseConstants.SC_FILE_ANTIVIRUS_EXCEPTION;
                AntivirusScannerException ase = (AntivirusScannerException) pe;

                ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY);

                errorMessage = themeDisplay.translate(ase.getMessageKey());
            } else if (pe instanceof FileNameException) {
                errorType = ServletResponseConstants.SC_FILE_NAME_EXCEPTION;
            } else if (pe instanceof FileSizeException) {
                errorType = ServletResponseConstants.SC_FILE_SIZE_EXCEPTION;
            } else if (pe instanceof UploadRequestSizeException) {
                errorType = ServletResponseConstants.SC_UPLOAD_REQUEST_SIZE_EXCEPTION;
            }

            JSONObject errorJSONObject = JSONUtil.put("errorType", errorType).put("message", errorMessage);

            jsonObject.put("error", errorJSONObject);
        } else {
            doHandleUploadException(portletRequest, portletResponse, pe, jsonObject);
        }

        try {
            JSONPortletResponseUtil.writeJSON(portletRequest, portletResponse, jsonObject);
        } catch (IOException ioe) {
            throw new SystemException(ioe);
        }
    }

    protected abstract void validateFile(String fileName, String contentType, long size) throws PortalException;

    protected static final String TEMP_FOLDER_NAME = BaseUploadHandler.class.getName();

    private static final int _UNIQUE_FILE_NAME_TRIES = 50;

}