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