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.servlet.SessionErrors;
022    import com.liferay.portal.kernel.upload.UploadException;
023    import com.liferay.portal.kernel.upload.UploadPortletRequest;
024    import com.liferay.portal.kernel.util.Constants;
025    import com.liferay.portal.kernel.util.FileUtil;
026    import com.liferay.portal.kernel.util.KeyValuePair;
027    import com.liferay.portal.kernel.util.ObjectValuePair;
028    import com.liferay.portal.kernel.util.ParamUtil;
029    import com.liferay.portal.kernel.util.StreamUtil;
030    import com.liferay.portal.kernel.util.TempFileUtil;
031    import com.liferay.portal.kernel.util.Validator;
032    import com.liferay.portal.security.auth.PrincipalException;
033    import com.liferay.portal.struts.ActionConstants;
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.documentlibrary.DuplicateFileException;
038    import com.liferay.portlet.documentlibrary.FileSizeException;
039    import com.liferay.portlet.documentlibrary.action.EditFileEntryAction;
040    import com.liferay.portlet.wiki.NoSuchNodeException;
041    import com.liferay.portlet.wiki.NoSuchPageException;
042    import com.liferay.portlet.wiki.service.WikiPageServiceUtil;
043    
044    import java.io.File;
045    import java.io.InputStream;
046    
047    import java.util.ArrayList;
048    import java.util.List;
049    
050    import javax.portlet.ActionRequest;
051    import javax.portlet.ActionResponse;
052    import javax.portlet.PortletConfig;
053    import javax.portlet.RenderRequest;
054    import javax.portlet.RenderResponse;
055    
056    import org.apache.struts.action.ActionForm;
057    import org.apache.struts.action.ActionForward;
058    import org.apache.struts.action.ActionMapping;
059    
060    /**
061     * @author Jorge Ferrer
062     */
063    public class EditPageAttachmentAction extends EditFileEntryAction {
064    
065            @Override
066            public void processAction(
067                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
068                            ActionRequest actionRequest, ActionResponse actionResponse)
069                    throws Exception {
070    
071                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
072    
073                    try {
074                            if (Validator.isNull(cmd)) {
075                                    UploadException uploadException =
076                                            (UploadException)actionRequest.getAttribute(
077                                                    WebKeys.UPLOAD_EXCEPTION);
078    
079                                    if (uploadException != null) {
080                                            if (uploadException.isExceededSizeLimit()) {
081                                                    throw new FileSizeException(uploadException.getCause());
082                                            }
083    
084                                            throw new PortalException(uploadException.getCause());
085                                    }
086                            }
087                            else if (cmd.equals(Constants.ADD)) {
088                                    addAttachment(actionRequest);
089                            }
090                            else if (cmd.equals(Constants.ADD_MULTIPLE)) {
091                                    addMultipleFileEntries(actionRequest, actionResponse);
092                            }
093                            else if (cmd.equals(Constants.ADD_TEMP)) {
094                                    addTempAttachment(actionRequest);
095                            }
096                            else if (cmd.equals(Constants.DELETE)) {
097                                    deleteAttachment(actionRequest);
098                            }
099                            else if (cmd.equals(Constants.DELETE_TEMP)) {
100                                    deleteTempAttachment(actionRequest, actionResponse);
101                            }
102    
103                            if (cmd.equals(Constants.ADD_TEMP) ||
104                                    cmd.equals(Constants.DELETE_TEMP)) {
105    
106                                    setForward(actionRequest, ActionConstants.COMMON_NULL);
107                            }
108                            else {
109                                    sendRedirect(actionRequest, actionResponse);
110                            }
111                    }
112                    catch (Exception e) {
113                            if (e instanceof DuplicateFileException ||
114                                    e instanceof NoSuchNodeException ||
115                                    e instanceof NoSuchPageException ||
116                                    e instanceof PrincipalException) {
117    
118                                    SessionErrors.add(actionRequest, e.getClass().getName());
119    
120                                    setForward(actionRequest, "portlet.wiki.error");
121                            }
122                            else if (e instanceof FileSizeException) {
123                                    SessionErrors.add(actionRequest, e.getClass().getName());
124                            }
125                            else {
126                                    throw e;
127                            }
128                    }
129            }
130    
131            @Override
132            public ActionForward render(
133                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
134                            RenderRequest renderRequest, RenderResponse renderResponse)
135                    throws Exception {
136    
137                    try {
138                            ActionUtil.getNode(renderRequest);
139                            ActionUtil.getPage(renderRequest);
140                    }
141                    catch (Exception e) {
142                            if (e instanceof NoSuchNodeException ||
143                                    e instanceof NoSuchPageException ||
144                                    e instanceof PrincipalException) {
145    
146                                    SessionErrors.add(renderRequest, e.getClass().getName());
147    
148                                    return mapping.findForward("portlet.wiki.error");
149                            }
150                            else {
151                                    throw e;
152                            }
153                    }
154    
155                    return mapping.findForward(
156                            getForward(renderRequest, "portlet.wiki.edit_page_attachment"));
157            }
158    
159            protected void addAttachment(ActionRequest actionRequest) throws Exception {
160                    UploadPortletRequest uploadPortletRequest =
161                            PortalUtil.getUploadPortletRequest(actionRequest);
162    
163                    long nodeId = ParamUtil.getLong(actionRequest, "nodeId");
164                    String title = ParamUtil.getString(actionRequest, "title");
165    
166                    int numOfFiles = ParamUtil.getInteger(actionRequest, "numOfFiles");
167    
168                    List<ObjectValuePair<String, InputStream>> inputStreamOVPs =
169                            new ArrayList<ObjectValuePair<String, InputStream>>();
170    
171                    try {
172                            if (numOfFiles == 0) {
173                                    String fileName = uploadPortletRequest.getFileName("file");
174                                    InputStream inputStream = uploadPortletRequest.getFileAsStream(
175                                            "file");
176    
177                                    if (inputStream != null) {
178                                            ObjectValuePair<String, InputStream> inputStreamOVP =
179                                                    new ObjectValuePair<String, InputStream>(
180                                                            fileName, inputStream);
181    
182                                            inputStreamOVPs.add(inputStreamOVP);
183                                    }
184                            }
185                            else {
186                                    for (int i = 1; i <= numOfFiles; i++) {
187                                            String fileName = uploadPortletRequest.getFileName(
188                                                    "file" + i);
189                                            InputStream inputStream =
190                                                    uploadPortletRequest.getFileAsStream("file" + i);
191    
192                                            if (inputStream == null) {
193                                                    continue;
194                                            }
195    
196                                            ObjectValuePair<String, InputStream> inputStreamOVP =
197                                                    new ObjectValuePair<String, InputStream>(
198                                                            fileName, inputStream);
199    
200                                            inputStreamOVPs.add(inputStreamOVP);
201                                    }
202                            }
203    
204                            WikiPageServiceUtil.addPageAttachments(
205                                    nodeId, title, inputStreamOVPs);
206                    }
207                    finally {
208                            for (ObjectValuePair<String, InputStream> inputStreamOVP :
209                                            inputStreamOVPs) {
210    
211                                    InputStream inputStream = inputStreamOVP.getValue();
212    
213                                    StreamUtil.cleanUp(inputStream);
214                            }
215                    }
216            }
217    
218            @Override
219            protected void addMultipleFileEntries(
220                            ActionRequest actionRequest, ActionResponse actionResponse,
221                            String selectedFileName, List<String> validFileNames,
222                            List<KeyValuePair> invalidFileNameKVPs)
223                    throws Exception {
224    
225                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
226                            WebKeys.THEME_DISPLAY);
227    
228                    long nodeId = ParamUtil.getLong(actionRequest, "nodeId");
229                    String title = ParamUtil.getString(actionRequest, "title");
230    
231                    File file = null;
232    
233                    try {
234                            file = TempFileUtil.getTempFile(
235                                    themeDisplay.getUserId(), selectedFileName, _TEMP_FOLDER_NAME);
236    
237                            if ((file != null) && file.exists()) {
238                                    WikiPageServiceUtil.addPageAttachment(
239                                            nodeId, title, selectedFileName, file);
240    
241                                    validFileNames.add(selectedFileName);
242                            }
243                    }
244                    catch (Exception e) {
245                            String errorMessage = getAddMultipleFileEntriesErrorMessage(
246                                    themeDisplay, e);
247    
248                            KeyValuePair invalidFileNameKVP = new KeyValuePair(
249                                    selectedFileName, errorMessage);
250    
251                            invalidFileNameKVPs.add(invalidFileNameKVP);
252                    }
253                    finally {
254                            FileUtil.delete(file);
255                    }
256            }
257    
258            protected void addTempAttachment(ActionRequest actionRequest)
259                    throws Exception {
260    
261                    UploadPortletRequest uploadPortletRequest =
262                            PortalUtil.getUploadPortletRequest(actionRequest);
263    
264                    long nodeId = ParamUtil.getLong(actionRequest, "nodeId");
265                    String sourceFileName = uploadPortletRequest.getFileName("file");
266    
267                    InputStream inputStream = null;
268    
269                    try {
270                            inputStream = uploadPortletRequest.getFileAsStream("file");
271    
272                            WikiPageServiceUtil.addTempPageAttachment(
273                                    nodeId, sourceFileName, _TEMP_FOLDER_NAME, inputStream);
274                    }
275                    finally {
276                            StreamUtil.cleanUp(inputStream);
277                    }
278            }
279    
280            protected void deleteAttachment(ActionRequest actionRequest)
281                    throws Exception {
282    
283                    long nodeId = ParamUtil.getLong(actionRequest, "nodeId");
284                    String title = ParamUtil.getString(actionRequest, "title");
285                    String attachment = ParamUtil.getString(actionRequest, "fileName");
286    
287                    WikiPageServiceUtil.deletePageAttachment(nodeId, title, attachment);
288            }
289    
290            protected void deleteTempAttachment(
291                            ActionRequest actionRequest, ActionResponse actionResponse)
292                    throws Exception {
293    
294                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
295                            WebKeys.THEME_DISPLAY);
296    
297                    long nodeId = ParamUtil.getLong(actionRequest, "nodeId");
298                    String fileName = ParamUtil.getString(actionRequest, "fileName");
299    
300                    JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
301    
302                    try {
303                            WikiPageServiceUtil.deleteTempPageAttachment(
304                                    nodeId, fileName, _TEMP_FOLDER_NAME);
305    
306                            jsonObject.put("deleted", Boolean.TRUE);
307                    }
308                    catch (Exception e) {
309                            String errorMessage = LanguageUtil.get(
310                                    themeDisplay.getLocale(),
311                                    "an-unexpected-error-occurred-while-deleting-the-file");
312    
313                            jsonObject.put("deleted", Boolean.FALSE);
314                            jsonObject.put("errorMessage", errorMessage);
315                    }
316    
317                    writeJSON(actionRequest, actionResponse, jsonObject);
318            }
319    
320            private static final String _TEMP_FOLDER_NAME =
321                    EditPageAttachmentAction.class.getName();
322    
323    }