001    /**
002     * Copyright (c) 2000-2012 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.language.LanguageUtil;
021    import com.liferay.portal.kernel.portlet.LiferayPortletConfig;
022    import com.liferay.portal.kernel.servlet.ServletResponseConstants;
023    import com.liferay.portal.kernel.servlet.SessionErrors;
024    import com.liferay.portal.kernel.servlet.SessionMessages;
025    import com.liferay.portal.kernel.upload.UploadException;
026    import com.liferay.portal.kernel.upload.UploadPortletRequest;
027    import com.liferay.portal.kernel.util.Constants;
028    import com.liferay.portal.kernel.util.GetterUtil;
029    import com.liferay.portal.kernel.util.KeyValuePair;
030    import com.liferay.portal.kernel.util.ObjectValuePair;
031    import com.liferay.portal.kernel.util.ParamUtil;
032    import com.liferay.portal.kernel.util.StreamUtil;
033    import com.liferay.portal.kernel.util.StringPool;
034    import com.liferay.portal.kernel.util.StringUtil;
035    import com.liferay.portal.kernel.util.TempFileUtil;
036    import com.liferay.portal.kernel.util.Validator;
037    import com.liferay.portal.security.auth.PrincipalException;
038    import com.liferay.portal.struts.ActionConstants;
039    import com.liferay.portal.theme.ThemeDisplay;
040    import com.liferay.portal.util.PortalUtil;
041    import com.liferay.portal.util.WebKeys;
042    import com.liferay.portlet.documentlibrary.DuplicateFileException;
043    import com.liferay.portlet.documentlibrary.FileNameException;
044    import com.liferay.portlet.documentlibrary.FileSizeException;
045    import com.liferay.portlet.documentlibrary.action.EditFileEntryAction;
046    import com.liferay.portlet.wiki.NoSuchNodeException;
047    import com.liferay.portlet.wiki.NoSuchPageException;
048    import com.liferay.portlet.wiki.service.WikiPageServiceUtil;
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 javax.servlet.http.HttpServletResponse;
064    
065    import org.apache.struts.action.ActionForm;
066    import org.apache.struts.action.ActionForward;
067    import org.apache.struts.action.ActionMapping;
068    
069    /**
070     * @author Jorge Ferrer
071     */
072    public class EditPageAttachmentsAction extends EditFileEntryAction {
073    
074            @Override
075            public void processAction(
076                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
077                            ActionRequest actionRequest, ActionResponse actionResponse)
078                    throws Exception {
079    
080                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
081    
082                    try {
083                            if (Validator.isNull(cmd)) {
084                                    UploadException uploadException =
085                                            (UploadException)actionRequest.getAttribute(
086                                                    WebKeys.UPLOAD_EXCEPTION);
087    
088                                    if (uploadException != null) {
089                                            if (uploadException.isExceededSizeLimit()) {
090                                                    throw new FileSizeException(uploadException.getCause());
091                                            }
092    
093                                            throw new PortalException(uploadException.getCause());
094                                    }
095                            }
096                            else if (cmd.equals(Constants.ADD)) {
097                                    addAttachment(actionRequest);
098                            }
099                            else if (cmd.equals(Constants.ADD_MULTIPLE)) {
100                                    addMultipleFileEntries(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                                    moveAttachmentFromTrash(actionRequest);
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 if (e instanceof DuplicateFileException ||
145                                             e instanceof FileNameException) {
146    
147                                    SessionErrors.add(actionRequest, e.getClass());
148    
149                                    HttpServletResponse response =
150                                            PortalUtil.getHttpServletResponse(actionResponse);
151    
152                                    if (e instanceof DuplicateFileException) {
153                                            response.setStatus(
154                                                    ServletResponseConstants.SC_DUPLICATE_FILE_EXCEPTION);
155                                    }
156                                    else {
157                                            response.setStatus(
158                                                    ServletResponseConstants.SC_FILE_NAME_EXCEPTION);
159                                    }
160                            }
161                            else if (e instanceof FileSizeException) {
162                                    SessionErrors.add(actionRequest, e.getClass());
163                            }
164                            else {
165                                    throw e;
166                            }
167                    }
168            }
169    
170            @Override
171            public ActionForward render(
172                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
173                            RenderRequest renderRequest, RenderResponse renderResponse)
174                    throws Exception {
175    
176                    try {
177                            ActionUtil.getNode(renderRequest);
178                            ActionUtil.getPage(renderRequest);
179                    }
180                    catch (Exception e) {
181                            if (e instanceof NoSuchNodeException ||
182                                    e instanceof NoSuchPageException ||
183                                    e instanceof PrincipalException) {
184    
185                                    SessionErrors.add(renderRequest, e.getClass());
186    
187                                    return mapping.findForward("portlet.wiki.error");
188                            }
189                            else {
190                                    throw e;
191                            }
192                    }
193    
194                    return mapping.findForward(
195                            getForward(renderRequest, "portlet.wiki.edit_page_attachment"));
196            }
197    
198            protected void addAttachment(ActionRequest actionRequest) throws Exception {
199                    UploadPortletRequest uploadPortletRequest =
200                            PortalUtil.getUploadPortletRequest(actionRequest);
201    
202                    long nodeId = ParamUtil.getLong(actionRequest, "nodeId");
203                    String title = ParamUtil.getString(actionRequest, "title");
204    
205                    int numOfFiles = ParamUtil.getInteger(actionRequest, "numOfFiles");
206    
207                    List<ObjectValuePair<String, InputStream>> inputStreamOVPs =
208                            new ArrayList<ObjectValuePair<String, InputStream>>();
209    
210                    try {
211                            if (numOfFiles == 0) {
212                                    String fileName = uploadPortletRequest.getFileName("file");
213                                    InputStream inputStream = uploadPortletRequest.getFileAsStream(
214                                            "file");
215    
216                                    if (inputStream != null) {
217                                            ObjectValuePair<String, InputStream> inputStreamOVP =
218                                                    new ObjectValuePair<String, InputStream>(
219                                                            fileName, inputStream);
220    
221                                            inputStreamOVPs.add(inputStreamOVP);
222                                    }
223                            }
224                            else {
225                                    for (int i = 1; i <= numOfFiles; i++) {
226                                            String fileName = uploadPortletRequest.getFileName(
227                                                    "file" + i);
228                                            InputStream inputStream =
229                                                    uploadPortletRequest.getFileAsStream("file" + i);
230    
231                                            if (inputStream == null) {
232                                                    continue;
233                                            }
234    
235                                            ObjectValuePair<String, InputStream> inputStreamOVP =
236                                                    new ObjectValuePair<String, InputStream>(
237                                                            fileName, inputStream);
238    
239                                            inputStreamOVPs.add(inputStreamOVP);
240                                    }
241                            }
242    
243                            WikiPageServiceUtil.addPageAttachments(
244                                    nodeId, title, inputStreamOVPs);
245                    }
246                    finally {
247                            for (ObjectValuePair<String, InputStream> inputStreamOVP :
248                                            inputStreamOVPs) {
249    
250                                    InputStream inputStream = inputStreamOVP.getValue();
251    
252                                    StreamUtil.cleanUp(inputStream);
253                            }
254                    }
255            }
256    
257            @Override
258            protected void addMultipleFileEntries(
259                            ActionRequest actionRequest, ActionResponse actionResponse,
260                            String selectedFileName, List<String> validFileNames,
261                            List<KeyValuePair> invalidFileNameKVPs)
262                    throws Exception {
263    
264                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
265                            WebKeys.THEME_DISPLAY);
266    
267                    long nodeId = ParamUtil.getLong(actionRequest, "nodeId");
268                    String title = ParamUtil.getString(actionRequest, "title");
269    
270                    String tempFileName = TempFileUtil.getTempFileName(
271                            themeDisplay.getUserId(), selectedFileName, _TEMP_FOLDER_NAME);
272    
273                    try {
274                            InputStream inputStream = TempFileUtil.getTempFileAsStream(
275                                    tempFileName);
276    
277                            WikiPageServiceUtil.addPageAttachment(
278                                    nodeId, title, selectedFileName, inputStream);
279    
280                            validFileNames.add(selectedFileName);
281                    }
282                    catch (Exception e) {
283                            String errorMessage = getAddMultipleFileEntriesErrorMessage(
284                                    themeDisplay, e);
285    
286                            KeyValuePair invalidFileNameKVP = new KeyValuePair(
287                                    selectedFileName, errorMessage);
288    
289                            invalidFileNameKVPs.add(invalidFileNameKVP);
290                    }
291                    finally {
292                            TempFileUtil.deleteTempFile(tempFileName);
293                    }
294            }
295    
296            protected void addTempAttachment(ActionRequest actionRequest)
297                    throws Exception {
298    
299                    UploadPortletRequest uploadPortletRequest =
300                            PortalUtil.getUploadPortletRequest(actionRequest);
301    
302                    long nodeId = ParamUtil.getLong(actionRequest, "nodeId");
303                    String sourceFileName = uploadPortletRequest.getFileName("file");
304    
305                    InputStream inputStream = null;
306    
307                    try {
308                            inputStream = uploadPortletRequest.getFileAsStream("file");
309    
310                            WikiPageServiceUtil.addTempPageAttachment(
311                                    nodeId, sourceFileName, _TEMP_FOLDER_NAME, inputStream);
312                    }
313                    finally {
314                            StreamUtil.cleanUp(inputStream);
315                    }
316            }
317    
318            protected void deleteAttachment(
319                            LiferayPortletConfig liferayPortletConfig,
320                            ActionRequest actionRequest, boolean moveToTrash)
321                    throws Exception {
322    
323                    long nodeId = ParamUtil.getLong(actionRequest, "nodeId");
324                    String title = ParamUtil.getString(actionRequest, "title");
325                    String attachment = ParamUtil.getString(actionRequest, "fileName");
326    
327                    String deletedFileName = StringPool.BLANK;
328    
329                    if (moveToTrash) {
330                            deletedFileName = WikiPageServiceUtil.movePageAttachmentToTrash(
331                                    nodeId, title, attachment);
332                    }
333                    else {
334                            WikiPageServiceUtil.deletePageAttachment(nodeId, title, attachment);
335                    }
336    
337                    if (moveToTrash && Validator.isNotNull(deletedFileName)) {
338                            Map<String, String[]> data = new HashMap<String, String[]>();
339    
340                            data.put(
341                                    "restoreAttachmentId",
342                                    new String[] {nodeId + "," + title + "," + deletedFileName});
343    
344                            SessionMessages.add(
345                                    actionRequest,
346                                    liferayPortletConfig.getPortletId() +
347                                            SessionMessages.KEY_SUFFIX_DELETE_SUCCESS_DATA, data);
348    
349                            SessionMessages.add(
350                                    actionRequest,
351                                    liferayPortletConfig.getPortletId() +
352                                            SessionMessages.KEY_SUFFIX_HIDE_DEFAULT_SUCCESS_MESSAGE);
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 = LanguageUtil.get(
376                                    themeDisplay.getLocale(),
377                                    "an-unexpected-error-occurred-while-deleting-the-file");
378    
379                            jsonObject.put("deleted", Boolean.FALSE);
380                            jsonObject.put("errorMessage", errorMessage);
381                    }
382    
383                    writeJSON(actionRequest, actionResponse, jsonObject);
384            }
385    
386            protected void emptyTrash(ActionRequest actionRequest) throws Exception {
387                    long nodeId = ParamUtil.getLong(actionRequest, "nodeId");
388                    String title = ParamUtil.getString(actionRequest, "title");
389    
390                    WikiPageServiceUtil.deletePageAttachments(nodeId, title);
391            }
392    
393            protected void moveAttachmentFromTrash(ActionRequest actionRequest)
394                    throws Exception {
395    
396                    long nodeId = ParamUtil.getLong(actionRequest, "nodeId");
397                    String title = ParamUtil.getString(actionRequest, "title");
398                    String attachment = ParamUtil.getString(actionRequest, "fileName");
399    
400                    WikiPageServiceUtil.movePageAttachmentFromTrash(
401                            nodeId, title, attachment);
402            }
403    
404            protected void restoreAttachment(ActionRequest actionRequest)
405                    throws Exception {
406    
407                    String[] restoreAttachmentId = StringUtil.split(
408                            ParamUtil.getString(actionRequest, "restoreAttachmentId"));
409    
410                    long nodeId = GetterUtil.getLong(restoreAttachmentId[0], 0L);
411                    String title = GetterUtil.getString(
412                            restoreAttachmentId[1], StringPool.BLANK);
413                    String attachment = GetterUtil.getString(
414                            restoreAttachmentId[2], StringPool.BLANK);
415    
416                    WikiPageServiceUtil.movePageAttachmentFromTrash(
417                            nodeId, title, attachment);
418            }
419    
420            private static final String _TEMP_FOLDER_NAME =
421                    EditPageAttachmentsAction.class.getName();
422    
423    }