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