001    /**
002     * Copyright (c) 2000-2013 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.wiki.action;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.json.JSONFactoryUtil;
019    import com.liferay.portal.kernel.json.JSONObject;
020    import com.liferay.portal.kernel.portlet.LiferayPortletConfig;
021    import com.liferay.portal.kernel.repository.model.FileEntry;
022    import com.liferay.portal.kernel.servlet.SessionErrors;
023    import com.liferay.portal.kernel.servlet.SessionMessages;
024    import com.liferay.portal.kernel.upload.UploadException;
025    import com.liferay.portal.kernel.upload.UploadPortletRequest;
026    import com.liferay.portal.kernel.util.Constants;
027    import com.liferay.portal.kernel.util.KeyValuePair;
028    import com.liferay.portal.kernel.util.ObjectValuePair;
029    import com.liferay.portal.kernel.util.ParamUtil;
030    import com.liferay.portal.kernel.util.StreamUtil;
031    import com.liferay.portal.kernel.util.StringUtil;
032    import com.liferay.portal.kernel.util.TempFileUtil;
033    import com.liferay.portal.kernel.util.Validator;
034    import com.liferay.portal.portletfilerepository.PortletFileRepositoryUtil;
035    import com.liferay.portal.security.auth.PrincipalException;
036    import com.liferay.portal.struts.ActionConstants;
037    import com.liferay.portal.theme.ThemeDisplay;
038    import com.liferay.portal.util.PortalUtil;
039    import com.liferay.portal.util.WebKeys;
040    import com.liferay.portlet.documentlibrary.FileSizeException;
041    import com.liferay.portlet.documentlibrary.action.EditFileEntryAction;
042    import com.liferay.portlet.documentlibrary.model.DLFileEntry;
043    import com.liferay.portlet.trash.util.TrashUtil;
044    import com.liferay.portlet.wiki.NoSuchNodeException;
045    import com.liferay.portlet.wiki.NoSuchPageException;
046    import com.liferay.portlet.wiki.model.WikiPage;
047    import com.liferay.portlet.wiki.service.WikiPageServiceUtil;
048    import com.liferay.portlet.wiki.util.WikiPageAttachmentsUtil;
049    
050    import java.io.InputStream;
051    
052    import java.util.ArrayList;
053    import java.util.HashMap;
054    import java.util.List;
055    import java.util.Map;
056    
057    import javax.portlet.ActionRequest;
058    import javax.portlet.ActionResponse;
059    import javax.portlet.PortletConfig;
060    import javax.portlet.RenderRequest;
061    import javax.portlet.RenderResponse;
062    
063    import org.apache.struts.action.ActionForm;
064    import org.apache.struts.action.ActionForward;
065    import org.apache.struts.action.ActionMapping;
066    
067    /**
068     * @author Jorge Ferrer
069     */
070    public class EditPageAttachmentsAction extends EditFileEntryAction {
071    
072            @Override
073            public void processAction(
074                            ActionMapping actionMapping, ActionForm actionForm,
075                            PortletConfig portletConfig, ActionRequest actionRequest,
076                            ActionResponse actionResponse)
077                    throws Exception {
078    
079                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
080    
081                    try {
082                            if (Validator.isNull(cmd)) {
083                                    UploadException uploadException =
084                                            (UploadException)actionRequest.getAttribute(
085                                                    WebKeys.UPLOAD_EXCEPTION);
086    
087                                    if (uploadException != null) {
088                                            if (uploadException.isExceededSizeLimit()) {
089                                                    throw new FileSizeException(uploadException.getCause());
090                                            }
091    
092                                            throw new PortalException(uploadException.getCause());
093                                    }
094                            }
095                            else if (cmd.equals(Constants.ADD)) {
096                                    addAttachment(actionRequest);
097                            }
098                            else if (cmd.equals(Constants.ADD_MULTIPLE)) {
099                                    addMultipleFileEntries(
100                                            portletConfig, actionRequest, actionResponse);
101                            }
102                            else if (cmd.equals(Constants.ADD_TEMP)) {
103                                    addTempAttachment(actionRequest);
104                            }
105                            else if (cmd.equals(Constants.DELETE)) {
106                                    deleteAttachment(
107                                            (LiferayPortletConfig)portletConfig, actionRequest, false);
108                            }
109                            else if (cmd.equals(Constants.DELETE_TEMP)) {
110                                    deleteTempAttachment(actionRequest, actionResponse);
111                            }
112                            else if (cmd.equals(Constants.EMPTY_TRASH)) {
113                                    emptyTrash(actionRequest);
114                            }
115                            else if (cmd.equals(Constants.MOVE_FROM_TRASH)) {
116                                    restoreAttachmentFromTrash(actionRequest, actionResponse);
117                            }
118                            else if (cmd.equals(Constants.MOVE_TO_TRASH)) {
119                                    deleteAttachment(
120                                            (LiferayPortletConfig)portletConfig, actionRequest, true);
121                            }
122                            else if (cmd.equals(Constants.RESTORE)) {
123                                    restoreAttachment(actionRequest);
124                            }
125    
126                            if (cmd.equals(Constants.ADD_TEMP) ||
127                                    cmd.equals(Constants.DELETE_TEMP)) {
128    
129                                    setForward(actionRequest, ActionConstants.COMMON_NULL);
130                            }
131                            else {
132                                    sendRedirect(actionRequest, actionResponse);
133                            }
134                    }
135                    catch (Exception e) {
136                            if (e instanceof NoSuchNodeException ||
137                                    e instanceof NoSuchPageException ||
138                                    e instanceof PrincipalException) {
139    
140                                    SessionErrors.add(actionRequest, e.getClass());
141    
142                                    setForward(actionRequest, "portlet.wiki.error");
143                            }
144                            else {
145                                    handleUploadException(
146                                            portletConfig, actionRequest, actionResponse, cmd, e);
147                            }
148                    }
149            }
150    
151            @Override
152            public ActionForward render(
153                            ActionMapping actionMapping, ActionForm actionForm,
154                            PortletConfig portletConfig, RenderRequest renderRequest,
155                            RenderResponse renderResponse)
156                    throws Exception {
157    
158                    try {
159                            ActionUtil.getNode(renderRequest);
160                            ActionUtil.getPage(renderRequest);
161                    }
162                    catch (Exception e) {
163                            if (e instanceof NoSuchNodeException ||
164                                    e instanceof NoSuchPageException ||
165                                    e instanceof PrincipalException) {
166    
167                                    SessionErrors.add(renderRequest, e.getClass());
168    
169                                    return actionMapping.findForward("portlet.wiki.error");
170                            }
171                            else {
172                                    throw e;
173                            }
174                    }
175    
176                    return actionMapping.findForward(
177                            getForward(renderRequest, "portlet.wiki.edit_page_attachment"));
178            }
179    
180            protected void addAttachment(ActionRequest actionRequest) throws Exception {
181                    UploadPortletRequest uploadPortletRequest =
182                            PortalUtil.getUploadPortletRequest(actionRequest);
183    
184                    long nodeId = ParamUtil.getLong(actionRequest, "nodeId");
185                    String title = ParamUtil.getString(actionRequest, "title");
186    
187                    int numOfFiles = ParamUtil.getInteger(actionRequest, "numOfFiles");
188    
189                    List<ObjectValuePair<String, InputStream>> inputStreamOVPs =
190                            new ArrayList<ObjectValuePair<String, InputStream>>();
191    
192                    try {
193                            if (numOfFiles == 0) {
194                                    String fileName = uploadPortletRequest.getFileName("file");
195                                    InputStream inputStream = uploadPortletRequest.getFileAsStream(
196                                            "file");
197    
198                                    if (inputStream != null) {
199                                            ObjectValuePair<String, InputStream> inputStreamOVP =
200                                                    new ObjectValuePair<String, InputStream>(
201                                                            fileName, inputStream);
202    
203                                            inputStreamOVPs.add(inputStreamOVP);
204                                    }
205                            }
206                            else {
207                                    for (int i = 1; i <= numOfFiles; i++) {
208                                            String fileName = uploadPortletRequest.getFileName(
209                                                    "file" + i);
210                                            InputStream inputStream =
211                                                    uploadPortletRequest.getFileAsStream("file" + i);
212    
213                                            if (inputStream == null) {
214                                                    continue;
215                                            }
216    
217                                            ObjectValuePair<String, InputStream> inputStreamOVP =
218                                                    new ObjectValuePair<String, InputStream>(
219                                                            fileName, inputStream);
220    
221                                            inputStreamOVPs.add(inputStreamOVP);
222                                    }
223                            }
224    
225                            WikiPageServiceUtil.addPageAttachments(
226                                    nodeId, title, inputStreamOVPs);
227                    }
228                    finally {
229                            for (ObjectValuePair<String, InputStream> inputStreamOVP :
230                                            inputStreamOVPs) {
231    
232                                    InputStream inputStream = inputStreamOVP.getValue();
233    
234                                    StreamUtil.cleanUp(inputStream);
235                            }
236                    }
237            }
238    
239            @Override
240            protected void addMultipleFileEntries(
241                            PortletConfig portletConfig, ActionRequest actionRequest,
242                            ActionResponse actionResponse, String selectedFileName,
243                            List<String> validFileNames, List<KeyValuePair> invalidFileNameKVPs)
244                    throws Exception {
245    
246                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
247                            WebKeys.THEME_DISPLAY);
248    
249                    long nodeId = ParamUtil.getLong(actionRequest, "nodeId");
250                    String title = ParamUtil.getString(actionRequest, "title");
251    
252                    FileEntry tempFileEntry = null;
253    
254                    try {
255                            tempFileEntry = TempFileUtil.getTempFile(
256                                    themeDisplay.getScopeGroupId(), themeDisplay.getUserId(),
257                                    selectedFileName, _TEMP_FOLDER_NAME);
258    
259                            InputStream inputStream = tempFileEntry.getContentStream();
260                            String mimeType = tempFileEntry.getMimeType();
261    
262                            WikiPageServiceUtil.addPageAttachment(
263                                    nodeId, title, selectedFileName, inputStream, mimeType);
264    
265                            validFileNames.add(selectedFileName);
266                    }
267                    catch (Exception e) {
268                            String errorMessage = getAddMultipleFileEntriesErrorMessage(
269                                    portletConfig, actionRequest, actionResponse, e);
270    
271                            KeyValuePair invalidFileNameKVP = new KeyValuePair(
272                                    selectedFileName, errorMessage);
273    
274                            invalidFileNameKVPs.add(invalidFileNameKVP);
275                    }
276                    finally {
277                            if (tempFileEntry != null) {
278                                    TempFileUtil.deleteTempFile(tempFileEntry.getFileEntryId());
279                            }
280                    }
281            }
282    
283            protected void addTempAttachment(ActionRequest actionRequest)
284                    throws Exception {
285    
286                    UploadPortletRequest uploadPortletRequest =
287                            PortalUtil.getUploadPortletRequest(actionRequest);
288    
289                    long nodeId = ParamUtil.getLong(actionRequest, "nodeId");
290                    String sourceFileName = uploadPortletRequest.getFileName("file");
291    
292                    InputStream inputStream = null;
293    
294                    try {
295                            inputStream = uploadPortletRequest.getFileAsStream("file");
296    
297                            String mimeType = uploadPortletRequest.getContentType("file");
298    
299                            WikiPageServiceUtil.addTempPageAttachment(
300                                    nodeId, sourceFileName, _TEMP_FOLDER_NAME, inputStream,
301                                    mimeType);
302                    }
303                    finally {
304                            StreamUtil.cleanUp(inputStream);
305                    }
306            }
307    
308            protected void deleteAttachment(
309                            LiferayPortletConfig liferayPortletConfig,
310                            ActionRequest actionRequest, boolean moveToTrash)
311                    throws Exception {
312    
313                    long nodeId = ParamUtil.getLong(actionRequest, "nodeId");
314                    String title = ParamUtil.getString(actionRequest, "title");
315                    String attachment = ParamUtil.getString(actionRequest, "fileName");
316    
317                    FileEntry fileEntry = null;
318    
319                    if (moveToTrash) {
320                            fileEntry = WikiPageServiceUtil.movePageAttachmentToTrash(
321                                    nodeId, title, attachment);
322                    }
323                    else {
324                            WikiPageServiceUtil.deletePageAttachment(nodeId, title, attachment);
325                    }
326    
327                    if (moveToTrash && (fileEntry != null)) {
328                            Map<String, String[]> data = new HashMap<String, String[]>();
329    
330                            data.put(Constants.CMD, new String[] {Constants.REMOVE});
331    
332                            data.put(
333                                    "deleteEntryClassName",
334                                    new String[] {DLFileEntry.class.getName()});
335    
336                            if (Validator.isNotNull(fileEntry.getTitle())) {
337                                    data.put(
338                                            "deleteEntryTitle",
339                                            new String[] {
340                                                    TrashUtil.getOriginalTitle(fileEntry.getTitle())});
341                            }
342    
343                            data.put(
344                                    "restoreEntryIds",
345                                    new String[] {String.valueOf(fileEntry.getFileEntryId())});
346    
347                            SessionMessages.add(
348                                    actionRequest,
349                                    liferayPortletConfig.getPortletId() +
350                                            SessionMessages.KEY_SUFFIX_DELETE_SUCCESS_DATA, data);
351    
352                            hideDefaultSuccessMessage(liferayPortletConfig, actionRequest);
353                    }
354            }
355    
356            protected void deleteTempAttachment(
357                            ActionRequest actionRequest, ActionResponse actionResponse)
358                    throws Exception {
359    
360                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
361                            WebKeys.THEME_DISPLAY);
362    
363                    long nodeId = ParamUtil.getLong(actionRequest, "nodeId");
364                    String fileName = ParamUtil.getString(actionRequest, "fileName");
365    
366                    JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
367    
368                    try {
369                            WikiPageServiceUtil.deleteTempPageAttachment(
370                                    nodeId, fileName, _TEMP_FOLDER_NAME);
371    
372                            jsonObject.put("deleted", Boolean.TRUE);
373                    }
374                    catch (Exception e) {
375                            String errorMessage = themeDisplay.translate(
376                                    "an-unexpected-error-occurred-while-deleting-the-file");
377    
378                            jsonObject.put("deleted", Boolean.FALSE);
379                            jsonObject.put("errorMessage", errorMessage);
380                    }
381    
382                    writeJSON(actionRequest, actionResponse, jsonObject);
383            }
384    
385            protected void emptyTrash(ActionRequest actionRequest) throws Exception {
386                    long nodeId = ParamUtil.getLong(actionRequest, "nodeId");
387                    String title = ParamUtil.getString(actionRequest, "title");
388    
389                    WikiPageServiceUtil.deleteTrashPageAttachments(nodeId, title);
390            }
391    
392            protected void restoreAttachment(ActionRequest actionRequest)
393                    throws Exception {
394    
395                    long[] restoreEntryIds = StringUtil.split(
396                            ParamUtil.getString(actionRequest, "restoreEntryIds"), 0L);
397    
398                    for (long restoreEntryId : restoreEntryIds) {
399                            FileEntry fileEntry = PortletFileRepositoryUtil.getPortletFileEntry(
400                                    restoreEntryId);
401    
402                            WikiPage page = WikiPageAttachmentsUtil.getPage(
403                                    fileEntry.getFileEntryId());
404    
405                            WikiPageServiceUtil.restorePageAttachmentFromTrash(
406                                    page.getNodeId(), page.getTitle(), fileEntry.getTitle());
407                    }
408            }
409    
410            protected void restoreAttachmentFromTrash(
411                            ActionRequest actionRequest, ActionResponse actionResponse)
412                    throws Exception {
413    
414                    long nodeId = ParamUtil.getLong(actionRequest, "nodeId");
415                    String title = ParamUtil.getString(actionRequest, "title");
416                    String fileName = ParamUtil.getString(actionRequest, "fileName");
417    
418                    JSONObject jsonObject =
419                            com.liferay.portlet.trash.action.ActionUtil.checkEntry(
420                                    actionRequest);
421    
422                    writeJSON(actionRequest, actionResponse, jsonObject);
423    
424                    WikiPageServiceUtil.restorePageAttachmentFromTrash(
425                            nodeId, title, fileName);
426            }
427    
428            private static final String _TEMP_FOLDER_NAME =
429                    EditPageAttachmentsAction.class.getName();
430    
431    }