001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.documentselector.action;
016    
017    import com.liferay.portal.NoSuchRepositoryEntryException;
018    import com.liferay.portal.kernel.exception.PortalException;
019    import com.liferay.portal.kernel.repository.model.FileEntry;
020    import com.liferay.portal.kernel.repository.model.Folder;
021    import com.liferay.portal.kernel.servlet.SessionErrors;
022    import com.liferay.portal.kernel.upload.LiferayFileItemException;
023    import com.liferay.portal.kernel.upload.UploadException;
024    import com.liferay.portal.kernel.upload.UploadPortletRequest;
025    import com.liferay.portal.kernel.util.ArrayUtil;
026    import com.liferay.portal.kernel.util.MimeTypesUtil;
027    import com.liferay.portal.kernel.util.ParamUtil;
028    import com.liferay.portal.kernel.util.StreamUtil;
029    import com.liferay.portal.kernel.util.Validator;
030    import com.liferay.portal.security.auth.PrincipalException;
031    import com.liferay.portal.service.ServiceContext;
032    import com.liferay.portal.service.ServiceContextFactory;
033    import com.liferay.portal.struts.PortletAction;
034    import com.liferay.portal.theme.ThemeDisplay;
035    import com.liferay.portal.util.PortalUtil;
036    import com.liferay.portal.util.WebKeys;
037    import com.liferay.portlet.asset.AssetCategoryException;
038    import com.liferay.portlet.asset.AssetTagException;
039    import com.liferay.portlet.assetpublisher.util.AssetPublisherUtil;
040    import com.liferay.portlet.documentlibrary.DuplicateFileException;
041    import com.liferay.portlet.documentlibrary.DuplicateFolderNameException;
042    import com.liferay.portlet.documentlibrary.FileExtensionException;
043    import com.liferay.portlet.documentlibrary.FileMimeTypeException;
044    import com.liferay.portlet.documentlibrary.FileNameException;
045    import com.liferay.portlet.documentlibrary.FileSizeException;
046    import com.liferay.portlet.documentlibrary.InvalidFileVersionException;
047    import com.liferay.portlet.documentlibrary.NoSuchFileEntryException;
048    import com.liferay.portlet.documentlibrary.NoSuchFileVersionException;
049    import com.liferay.portlet.documentlibrary.NoSuchFolderException;
050    import com.liferay.portlet.documentlibrary.SourceFileNameException;
051    import com.liferay.portlet.documentlibrary.action.ActionUtil;
052    import com.liferay.portlet.documentlibrary.antivirus.AntivirusScannerException;
053    import com.liferay.portlet.documentlibrary.model.DLFileEntry;
054    import com.liferay.portlet.documentlibrary.service.DLAppServiceUtil;
055    import com.liferay.portlet.documentselector.util.DocumentSelectorUtil;
056    import com.liferay.portlet.dynamicdatamapping.StorageFieldRequiredException;
057    
058    import java.io.InputStream;
059    
060    import javax.portlet.ActionRequest;
061    import javax.portlet.ActionResponse;
062    import javax.portlet.PortletConfig;
063    import javax.portlet.RenderRequest;
064    import javax.portlet.RenderResponse;
065    
066    import javax.servlet.http.HttpServletRequest;
067    
068    import org.apache.struts.action.ActionForm;
069    import org.apache.struts.action.ActionForward;
070    import org.apache.struts.action.ActionMapping;
071    
072    /**
073     * @author Eudaldo Alonso
074     */
075    public class EditFileEntryAction extends PortletAction {
076    
077            @Override
078            public void processAction(
079                            ActionMapping actionMapping, ActionForm actionForm,
080                            PortletConfig portletConfig, ActionRequest actionRequest,
081                            ActionResponse actionResponse)
082                    throws Exception {
083    
084                    try {
085                            UploadException uploadException =
086                                    (UploadException)actionRequest.getAttribute(
087                                            WebKeys.UPLOAD_EXCEPTION);
088    
089                            if (uploadException != null) {
090                                    if (uploadException.isExceededLiferayFileItemSizeLimit()) {
091                                            throw new LiferayFileItemException();
092                                    }
093                                    else if (uploadException.isExceededSizeLimit()) {
094                                            throw new FileSizeException(uploadException.getCause());
095                                    }
096    
097                                    throw new PortalException(uploadException.getCause());
098                            }
099                            else {
100                                    addFileEntry(actionRequest);
101                            }
102    
103                            String redirect = PortalUtil.escapeRedirect(
104                                    ParamUtil.getString(actionRequest, "redirect"));
105    
106                            if (Validator.isNotNull(redirect)) {
107                                    actionResponse.sendRedirect(redirect);
108                            }
109                    }
110                    catch (Exception e) {
111                            handleUploadException(actionRequest, actionResponse, e);
112                    }
113            }
114    
115            @Override
116            public ActionForward render(
117                            ActionMapping actionMapping, ActionForm actionForm,
118                            PortletConfig portletConfig, RenderRequest renderRequest,
119                            RenderResponse renderResponse)
120                    throws Exception {
121    
122                    try {
123                            ActionUtil.getFileEntry(renderRequest);
124                    }
125                    catch (Exception e) {
126                            if (e instanceof NoSuchFileEntryException ||
127                                    e instanceof NoSuchFileVersionException ||
128                                    e instanceof NoSuchRepositoryEntryException ||
129                                    e instanceof PrincipalException) {
130    
131                                    SessionErrors.add(renderRequest, e.getClass());
132    
133                                    return actionMapping.findForward(
134                                            "portlet.document_selector.error");
135                            }
136                            else {
137                                    throw e;
138                            }
139                    }
140    
141                    String forward = "portlet.document_selector.add_file_entry";
142    
143                    return actionMapping.findForward(getForward(renderRequest, forward));
144            }
145    
146            protected FileEntry addFileEntry(ActionRequest actionRequest)
147                    throws Exception {
148    
149                    UploadPortletRequest uploadPortletRequest =
150                            PortalUtil.getUploadPortletRequest(actionRequest);
151    
152                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
153                            WebKeys.THEME_DISPLAY);
154    
155                    long folderId = ParamUtil.getLong(uploadPortletRequest, "folderId");
156                    String sourceFileName = uploadPortletRequest.getFileName("file");
157                    String title = ParamUtil.getString(uploadPortletRequest, "title");
158                    String description = ParamUtil.getString(
159                            uploadPortletRequest, "description");
160                    String changeLog = ParamUtil.getString(
161                            uploadPortletRequest, "changeLog");
162    
163                    if (folderId > 0) {
164                            Folder folder = DLAppServiceUtil.getFolder(folderId);
165    
166                            if (folder.getGroupId() != themeDisplay.getScopeGroupId()) {
167                                    throw new NoSuchFolderException("{folderId=" + folderId + "}");
168                            }
169                    }
170    
171                    InputStream inputStream = null;
172    
173                    try {
174                            String contentType = uploadPortletRequest.getContentType("file");
175    
176                            long size = uploadPortletRequest.getSize("file");
177    
178                            if (size == 0) {
179                                    contentType = MimeTypesUtil.getContentType(title);
180                            }
181    
182                            if (size > 0) {
183                                    HttpServletRequest request = PortalUtil.getHttpServletRequest(
184                                            actionRequest);
185    
186                                    String[] mimeTypes = DocumentSelectorUtil.getMimeTypes(request);
187    
188                                    if (ArrayUtil.isNotEmpty(mimeTypes) &&
189                                            !ArrayUtil.contains(mimeTypes, contentType)) {
190    
191                                            throw new FileMimeTypeException(contentType);
192                                    }
193                            }
194    
195                            inputStream = uploadPortletRequest.getFileAsStream("file");
196    
197                            ServiceContext serviceContext = ServiceContextFactory.getInstance(
198                                    DLFileEntry.class.getName(), uploadPortletRequest);
199    
200                            FileEntry fileEntry = DLAppServiceUtil.addFileEntry(
201                                    themeDisplay.getScopeGroupId(), folderId, sourceFileName,
202                                    contentType, title, description, changeLog, inputStream, size,
203                                    serviceContext);
204    
205                            AssetPublisherUtil.addRecentFolderId(
206                                    actionRequest, DLFileEntry.class.getName(), folderId);
207    
208                            return fileEntry;
209                    }
210                    catch (Exception e) {
211                            UploadException uploadException =
212                                    (UploadException)actionRequest.getAttribute(
213                                            WebKeys.UPLOAD_EXCEPTION);
214    
215                            if (uploadException != null) {
216                                    if (uploadException.isExceededLiferayFileItemSizeLimit()) {
217                                            throw new LiferayFileItemException();
218                                    }
219                                    else if (uploadException.isExceededSizeLimit()) {
220                                            throw new FileSizeException(uploadException.getCause());
221                                    }
222                            }
223    
224                            throw e;
225                    }
226                    finally {
227                            StreamUtil.cleanUp(inputStream);
228                    }
229            }
230    
231            protected void handleUploadException(
232                            ActionRequest actionRequest, ActionResponse actionResponse,
233                            Exception e)
234                    throws Exception {
235    
236                    if (e instanceof AssetCategoryException ||
237                            e instanceof AssetTagException) {
238    
239                            SessionErrors.add(actionRequest, e.getClass(), e);
240                    }
241                    else if (e instanceof AntivirusScannerException ||
242                                     e instanceof DuplicateFileException ||
243                                     e instanceof DuplicateFolderNameException ||
244                                     e instanceof FileExtensionException ||
245                                     e instanceof FileMimeTypeException ||
246                                     e instanceof FileNameException ||
247                                     e instanceof FileSizeException ||
248                                     e instanceof LiferayFileItemException ||
249                                     e instanceof NoSuchFolderException ||
250                                     e instanceof SourceFileNameException ||
251                                     e instanceof StorageFieldRequiredException) {
252    
253                            UploadException uploadException =
254                                    (UploadException)actionRequest.getAttribute(
255                                            WebKeys.UPLOAD_EXCEPTION);
256    
257                            if (uploadException != null) {
258                                    String uploadExceptionRedirect = ParamUtil.getString(
259                                            actionRequest, "uploadExceptionRedirect");
260    
261                                    actionResponse.sendRedirect(uploadExceptionRedirect);
262    
263                                    SessionErrors.add(actionRequest, e.getClass());
264    
265                                    return;
266                            }
267    
268                            if (e instanceof AntivirusScannerException) {
269                                    SessionErrors.add(actionRequest, e.getClass(), e);
270                            }
271                            else {
272                                    SessionErrors.add(actionRequest, e.getClass());
273                            }
274                    }
275                    else if (e instanceof InvalidFileVersionException ||
276                                     e instanceof NoSuchFileEntryException ||
277                                     e instanceof PrincipalException) {
278    
279                            SessionErrors.add(actionRequest, e.getClass());
280    
281                            setForward(actionRequest, "portlet.document_library.error");
282                    }
283                    else {
284                            throw e;
285                    }
286            }
287    
288    }