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