001
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
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 }