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