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