001
014
015 package com.liferay.portlet.journal.action;
016
017 import com.liferay.portal.kernel.exception.PortalException;
018 import com.liferay.portal.kernel.exception.SystemException;
019 import com.liferay.portal.kernel.portlet.LiferayWindowState;
020 import com.liferay.portal.kernel.servlet.SessionErrors;
021 import com.liferay.portal.kernel.servlet.SessionMessages;
022 import com.liferay.portal.kernel.util.ArrayUtil;
023 import com.liferay.portal.kernel.util.Constants;
024 import com.liferay.portal.kernel.util.ParamUtil;
025 import com.liferay.portal.kernel.util.StringUtil;
026 import com.liferay.portal.kernel.util.Validator;
027 import com.liferay.portal.security.auth.PrincipalException;
028 import com.liferay.portal.service.ServiceContext;
029 import com.liferay.portal.service.ServiceContextFactory;
030 import com.liferay.portal.struts.PortletAction;
031 import com.liferay.portal.theme.ThemeDisplay;
032 import com.liferay.portal.util.PortalUtil;
033 import com.liferay.portal.util.WebKeys;
034 import com.liferay.portlet.PortletURLFactoryUtil;
035 import com.liferay.portlet.asset.AssetCategoryException;
036 import com.liferay.portlet.asset.AssetTagException;
037 import com.liferay.portlet.journal.DuplicateArticleIdException;
038 import com.liferay.portlet.journal.DuplicateFolderNameException;
039 import com.liferay.portlet.journal.NoSuchArticleException;
040 import com.liferay.portlet.journal.NoSuchFolderException;
041 import com.liferay.portlet.journal.model.JournalArticle;
042 import com.liferay.portlet.journal.model.JournalFolder;
043 import com.liferay.portlet.journal.service.JournalArticleServiceUtil;
044 import com.liferay.portlet.journal.service.JournalFolderServiceUtil;
045 import com.liferay.portlet.trash.util.TrashUtil;
046
047 import java.util.HashMap;
048 import java.util.Map;
049
050 import javax.portlet.ActionRequest;
051 import javax.portlet.ActionResponse;
052 import javax.portlet.PortletConfig;
053 import javax.portlet.PortletRequest;
054 import javax.portlet.PortletURL;
055 import javax.portlet.RenderRequest;
056 import javax.portlet.RenderResponse;
057 import javax.portlet.WindowState;
058
059 import org.apache.struts.action.ActionForm;
060 import org.apache.struts.action.ActionForward;
061 import org.apache.struts.action.ActionMapping;
062
063
066 public class EditEntryAction extends PortletAction {
067
068 @Override
069 public void processAction(
070 ActionMapping actionMapping, ActionForm actionForm,
071 PortletConfig portletConfig, ActionRequest actionRequest,
072 ActionResponse actionResponse)
073 throws Exception {
074
075 String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
076
077 try {
078 if (cmd.equals(Constants.DELETE) ||
079 cmd.equals(Constants.DELETE_VERSIONS)) {
080
081 deleteEntries(actionRequest, false);
082 }
083 else if (cmd.equals(Constants.EXPIRE)) {
084 expireEntries(actionRequest);
085 }
086 else if (cmd.equals(Constants.MOVE)) {
087 moveEntries(actionRequest);
088 }
089 else if (cmd.equals(Constants.MOVE_TO_TRASH)) {
090 deleteEntries(actionRequest, true);
091 }
092 else if (cmd.equals(Constants.RESTORE)) {
093 restoreEntryFromTrash(actionRequest);
094 }
095
096 String redirect = PortalUtil.escapeRedirect(
097 ParamUtil.getString(actionRequest, "redirect"));
098
099 if (cmd.equals(Constants.DELETE_VERSIONS) &&
100 !ActionUtil.hasArticle(actionRequest)) {
101
102 String referringPortletResource = ParamUtil.getString(
103 actionRequest, "referringPortletResource");
104
105 if (Validator.isNotNull(referringPortletResource)) {
106 setForward(
107 actionRequest,
108 "portlet.journal.asset.add_asset_redirect");
109
110 return;
111 }
112 else {
113 ThemeDisplay themeDisplay =
114 (ThemeDisplay)actionRequest.getAttribute(
115 WebKeys.THEME_DISPLAY);
116
117 PortletURL portletURL = PortletURLFactoryUtil.create(
118 actionRequest, portletConfig.getPortletName(),
119 themeDisplay.getPlid(), PortletRequest.RENDER_PHASE);
120
121 redirect = portletURL.toString();
122 }
123 }
124
125 WindowState windowState = actionRequest.getWindowState();
126
127 if (!windowState.equals(LiferayWindowState.POP_UP)) {
128 sendRedirect(actionRequest, actionResponse);
129 }
130 else if (Validator.isNotNull(redirect)) {
131 actionResponse.sendRedirect(redirect);
132 }
133 }
134 catch (Exception e) {
135 if (e instanceof NoSuchArticleException ||
136 e instanceof NoSuchFolderException ||
137 e instanceof PrincipalException) {
138
139 SessionErrors.add(actionRequest, e.getClass());
140
141 setForward(actionRequest, "portlet.journal.error");
142 }
143 else if (e instanceof DuplicateArticleIdException ||
144 e instanceof DuplicateFolderNameException ||
145 e instanceof NoSuchFolderException) {
146
147 SessionErrors.add(actionRequest, e.getClass());
148 }
149 else if (e instanceof AssetCategoryException ||
150 e instanceof AssetTagException) {
151
152 SessionErrors.add(actionRequest, e.getClass(), e);
153 }
154 else {
155 throw e;
156 }
157 }
158 }
159
160 @Override
161 public ActionForward render(
162 ActionMapping actionMapping, ActionForm actionForm,
163 PortletConfig portletConfig, RenderRequest renderRequest,
164 RenderResponse renderResponse)
165 throws Exception {
166
167 try {
168 ActionUtil.getArticles(renderRequest);
169 ActionUtil.getFolders(renderRequest);
170 }
171 catch (Exception e) {
172 if (e instanceof NoSuchArticleException ||
173 e instanceof PrincipalException) {
174
175 SessionErrors.add(renderRequest, e.getClass());
176
177 return actionMapping.findForward("portlet.journal.error");
178 }
179 else {
180 throw e;
181 }
182 }
183
184 String forward = "portlet.journal.edit_entry";
185
186 return actionMapping.findForward(getForward(renderRequest, forward));
187 }
188
189 protected void deleteEntries(
190 ActionRequest actionRequest, boolean moveToTrash)
191 throws Exception {
192
193 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
194 WebKeys.THEME_DISPLAY);
195
196 String deleteEntryClassName = null;
197 String deleteEntryTitle = null;
198
199 long[] deleteFolderIds = StringUtil.split(
200 ParamUtil.getString(actionRequest, "folderIds"), 0L);
201
202 for (int i = 0; i < deleteFolderIds.length; i++) {
203 long deleteFolderId = deleteFolderIds[i];
204
205 if (moveToTrash) {
206 JournalFolder folder =
207 JournalFolderServiceUtil.moveFolderToTrash(deleteFolderId);
208
209 if (i == 0) {
210 deleteEntryClassName = JournalFolder.class.getName();
211
212 deleteEntryTitle = TrashUtil.getOriginalTitle(
213 folder.getName());
214 }
215 }
216 else {
217 JournalFolderServiceUtil.deleteFolder(deleteFolderId);
218 }
219 }
220
221 String[] deleteArticleIds = StringUtil.split(
222 ParamUtil.getString(actionRequest, "articleIds"));
223
224 long[] restoreArticleIds = new long[deleteArticleIds.length];
225
226 for (int i = 0; i < deleteArticleIds.length; i++) {
227 String deleteArticleId = deleteArticleIds[i];
228
229 if (moveToTrash) {
230 JournalArticle article =
231 JournalArticleServiceUtil.moveArticleToTrash(
232 themeDisplay.getScopeGroupId(), deleteArticleId);
233
234 if (i == 0) {
235 deleteEntryClassName = JournalArticle.class.getName();
236
237 deleteEntryTitle = article.getTitle(
238 themeDisplay.getLocale());
239 }
240
241 restoreArticleIds[i] = article.getResourcePrimKey();
242 }
243 else {
244 ActionUtil.deleteArticle(actionRequest, deleteArticleId);
245 }
246 }
247
248 if (moveToTrash &&
249 ((deleteArticleIds.length > 0) || (deleteFolderIds.length > 0))) {
250
251 Map<String, String[]> data = new HashMap<String, String[]>();
252
253 if (Validator.isNotNull(deleteEntryClassName)) {
254 data.put(
255 "deleteEntryClassName",
256 new String[] {deleteEntryClassName});
257 }
258
259 if (Validator.isNotNull(deleteEntryTitle)) {
260 data.put("deleteEntryTitle", new String[] {deleteEntryTitle});
261 }
262
263 data.put(
264 "restoreArticleIds",
265 ArrayUtil.toStringArray(restoreArticleIds));
266 data.put(
267 "restoreFolderIds", ArrayUtil.toStringArray(deleteFolderIds));
268
269 SessionMessages.add(
270 actionRequest,
271 PortalUtil.getPortletId(actionRequest) +
272 SessionMessages.KEY_SUFFIX_DELETE_SUCCESS_DATA, data);
273
274 hideDefaultSuccessMessage(actionRequest);
275 }
276 }
277
278 protected void expireEntries(ActionRequest actionRequest) throws Exception {
279 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
280 WebKeys.THEME_DISPLAY);
281
282 long[] expireFolderIds = StringUtil.split(
283 ParamUtil.getString(actionRequest, "folderIds"), 0L);
284
285 ServiceContext serviceContext = ServiceContextFactory.getInstance(
286 JournalArticle.class.getName(), actionRequest);
287
288 for (long expireFolderId : expireFolderIds) {
289 ActionUtil.expireFolder(
290 themeDisplay.getScopeGroupId(), expireFolderId, serviceContext);
291 }
292
293 String[] expireArticleIds = StringUtil.split(
294 ParamUtil.getString(actionRequest, "articleIds"));
295
296 for (String expireArticleId : expireArticleIds) {
297 ActionUtil.expireArticle(actionRequest, expireArticleId);
298 }
299 }
300
301 protected void moveEntries(ActionRequest actionRequest) throws Exception {
302 long newFolderId = ParamUtil.getLong(actionRequest, "newFolderId");
303
304 long[] folderIds = StringUtil.split(
305 ParamUtil.getString(actionRequest, "folderIds"), 0L);
306
307 ServiceContext serviceContext = ServiceContextFactory.getInstance(
308 JournalArticle.class.getName(), actionRequest);
309
310 for (long folderId : folderIds) {
311 JournalFolderServiceUtil.moveFolder(
312 folderId, newFolderId, serviceContext);
313 }
314
315 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
316 WebKeys.THEME_DISPLAY);
317
318 String[] articleIds = StringUtil.split(
319 ParamUtil.getString(actionRequest, "articleIds"));
320
321 for (String articleId : articleIds) {
322 JournalArticleServiceUtil.moveArticle(
323 themeDisplay.getScopeGroupId(), articleId, newFolderId);
324 }
325 }
326
327 protected void restoreEntryFromTrash(ActionRequest actionRequest)
328 throws PortalException, SystemException {
329
330 long[] restoreFolderIds = StringUtil.split(
331 ParamUtil.getString(actionRequest, "restoreFolderIds"), 0L);
332
333 for (long restoreFolderId : restoreFolderIds) {
334 JournalFolderServiceUtil.restoreFolderFromTrash(restoreFolderId);
335 }
336
337 long[] restoreArticleIds = StringUtil.split(
338 ParamUtil.getString(actionRequest, "restoreArticleIds"), 0L);
339
340 for (long restoreEntryId : restoreArticleIds) {
341 JournalArticleServiceUtil.restoreArticleFromTrash(restoreEntryId);
342 }
343 }
344
345 }