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.portlet.LiferayPortletConfig;
021 import com.liferay.portal.kernel.repository.model.FileEntry;
022 import com.liferay.portal.kernel.servlet.SessionErrors;
023 import com.liferay.portal.kernel.servlet.SessionMessages;
024 import com.liferay.portal.kernel.upload.UploadException;
025 import com.liferay.portal.kernel.upload.UploadPortletRequest;
026 import com.liferay.portal.kernel.util.Constants;
027 import com.liferay.portal.kernel.util.KeyValuePair;
028 import com.liferay.portal.kernel.util.ObjectValuePair;
029 import com.liferay.portal.kernel.util.ParamUtil;
030 import com.liferay.portal.kernel.util.StreamUtil;
031 import com.liferay.portal.kernel.util.StringUtil;
032 import com.liferay.portal.kernel.util.TempFileUtil;
033 import com.liferay.portal.kernel.util.Validator;
034 import com.liferay.portal.portletfilerepository.PortletFileRepositoryUtil;
035 import com.liferay.portal.security.auth.PrincipalException;
036 import com.liferay.portal.struts.ActionConstants;
037 import com.liferay.portal.theme.ThemeDisplay;
038 import com.liferay.portal.util.PortalUtil;
039 import com.liferay.portal.util.WebKeys;
040 import com.liferay.portlet.documentlibrary.FileSizeException;
041 import com.liferay.portlet.documentlibrary.action.EditFileEntryAction;
042 import com.liferay.portlet.documentlibrary.model.DLFileEntry;
043 import com.liferay.portlet.trash.util.TrashUtil;
044 import com.liferay.portlet.wiki.NoSuchNodeException;
045 import com.liferay.portlet.wiki.NoSuchPageException;
046 import com.liferay.portlet.wiki.model.WikiPage;
047 import com.liferay.portlet.wiki.service.WikiPageServiceUtil;
048 import com.liferay.portlet.wiki.util.WikiPageAttachmentsUtil;
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 org.apache.struts.action.ActionForm;
064 import org.apache.struts.action.ActionForward;
065 import org.apache.struts.action.ActionMapping;
066
067
070 public class EditPageAttachmentsAction extends EditFileEntryAction {
071
072 @Override
073 public void processAction(
074 ActionMapping actionMapping, ActionForm actionForm,
075 PortletConfig portletConfig, ActionRequest actionRequest,
076 ActionResponse actionResponse)
077 throws Exception {
078
079 String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
080
081 try {
082 if (Validator.isNull(cmd)) {
083 UploadException uploadException =
084 (UploadException)actionRequest.getAttribute(
085 WebKeys.UPLOAD_EXCEPTION);
086
087 if (uploadException != null) {
088 if (uploadException.isExceededSizeLimit()) {
089 throw new FileSizeException(uploadException.getCause());
090 }
091
092 throw new PortalException(uploadException.getCause());
093 }
094 }
095 else if (cmd.equals(Constants.ADD)) {
096 addAttachment(actionRequest);
097 }
098 else if (cmd.equals(Constants.ADD_MULTIPLE)) {
099 addMultipleFileEntries(
100 portletConfig, 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 restoreAttachmentFromTrash(actionRequest, actionResponse);
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 {
145 handleUploadException(
146 portletConfig, actionRequest, actionResponse, cmd, e);
147 }
148 }
149 }
150
151 @Override
152 public ActionForward render(
153 ActionMapping actionMapping, ActionForm actionForm,
154 PortletConfig portletConfig, RenderRequest renderRequest,
155 RenderResponse renderResponse)
156 throws Exception {
157
158 try {
159 ActionUtil.getNode(renderRequest);
160 ActionUtil.getPage(renderRequest);
161 }
162 catch (Exception e) {
163 if (e instanceof NoSuchNodeException ||
164 e instanceof NoSuchPageException ||
165 e instanceof PrincipalException) {
166
167 SessionErrors.add(renderRequest, e.getClass());
168
169 return actionMapping.findForward("portlet.wiki.error");
170 }
171 else {
172 throw e;
173 }
174 }
175
176 return actionMapping.findForward(
177 getForward(renderRequest, "portlet.wiki.edit_page_attachment"));
178 }
179
180 protected void addAttachment(ActionRequest actionRequest) throws Exception {
181 UploadPortletRequest uploadPortletRequest =
182 PortalUtil.getUploadPortletRequest(actionRequest);
183
184 long nodeId = ParamUtil.getLong(actionRequest, "nodeId");
185 String title = ParamUtil.getString(actionRequest, "title");
186
187 int numOfFiles = ParamUtil.getInteger(actionRequest, "numOfFiles");
188
189 List<ObjectValuePair<String, InputStream>> inputStreamOVPs =
190 new ArrayList<ObjectValuePair<String, InputStream>>();
191
192 try {
193 if (numOfFiles == 0) {
194 String fileName = uploadPortletRequest.getFileName("file");
195 InputStream inputStream = uploadPortletRequest.getFileAsStream(
196 "file");
197
198 if (inputStream != null) {
199 ObjectValuePair<String, InputStream> inputStreamOVP =
200 new ObjectValuePair<String, InputStream>(
201 fileName, inputStream);
202
203 inputStreamOVPs.add(inputStreamOVP);
204 }
205 }
206 else {
207 for (int i = 1; i <= numOfFiles; i++) {
208 String fileName = uploadPortletRequest.getFileName(
209 "file" + i);
210 InputStream inputStream =
211 uploadPortletRequest.getFileAsStream("file" + i);
212
213 if (inputStream == null) {
214 continue;
215 }
216
217 ObjectValuePair<String, InputStream> inputStreamOVP =
218 new ObjectValuePair<String, InputStream>(
219 fileName, inputStream);
220
221 inputStreamOVPs.add(inputStreamOVP);
222 }
223 }
224
225 WikiPageServiceUtil.addPageAttachments(
226 nodeId, title, inputStreamOVPs);
227 }
228 finally {
229 for (ObjectValuePair<String, InputStream> inputStreamOVP :
230 inputStreamOVPs) {
231
232 InputStream inputStream = inputStreamOVP.getValue();
233
234 StreamUtil.cleanUp(inputStream);
235 }
236 }
237 }
238
239 @Override
240 protected void addMultipleFileEntries(
241 PortletConfig portletConfig, ActionRequest actionRequest,
242 ActionResponse actionResponse, String selectedFileName,
243 List<String> validFileNames, List<KeyValuePair> invalidFileNameKVPs)
244 throws Exception {
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 validFileNames.add(selectedFileName);
266 }
267 catch (Exception e) {
268 String errorMessage = getAddMultipleFileEntriesErrorMessage(
269 portletConfig, actionRequest, actionResponse, e);
270
271 KeyValuePair invalidFileNameKVP = new KeyValuePair(
272 selectedFileName, errorMessage);
273
274 invalidFileNameKVPs.add(invalidFileNameKVP);
275 }
276 finally {
277 if (tempFileEntry != null) {
278 TempFileUtil.deleteTempFile(tempFileEntry.getFileEntryId());
279 }
280 }
281 }
282
283 protected void addTempAttachment(ActionRequest actionRequest)
284 throws Exception {
285
286 UploadPortletRequest uploadPortletRequest =
287 PortalUtil.getUploadPortletRequest(actionRequest);
288
289 long nodeId = ParamUtil.getLong(actionRequest, "nodeId");
290 String sourceFileName = uploadPortletRequest.getFileName("file");
291
292 InputStream inputStream = null;
293
294 try {
295 inputStream = uploadPortletRequest.getFileAsStream("file");
296
297 String mimeType = uploadPortletRequest.getContentType("file");
298
299 WikiPageServiceUtil.addTempPageAttachment(
300 nodeId, sourceFileName, _TEMP_FOLDER_NAME, inputStream,
301 mimeType);
302 }
303 finally {
304 StreamUtil.cleanUp(inputStream);
305 }
306 }
307
308 protected void deleteAttachment(
309 LiferayPortletConfig liferayPortletConfig,
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 liferayPortletConfig.getPortletId() +
350 SessionMessages.KEY_SUFFIX_DELETE_SUCCESS_DATA, data);
351
352 hideDefaultSuccessMessage(liferayPortletConfig, 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 }