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