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.LiferayPortletConfig;
020 import com.liferay.portal.kernel.portlet.LiferayWindowState;
021 import com.liferay.portal.kernel.servlet.SessionErrors;
022 import com.liferay.portal.kernel.servlet.SessionMessages;
023 import com.liferay.portal.kernel.util.ArrayUtil;
024 import com.liferay.portal.kernel.util.Constants;
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(
083 (LiferayPortletConfig)portletConfig, actionRequest, false);
084 }
085 else if (cmd.equals(Constants.EXPIRE)) {
086 expireEntries(actionRequest);
087 }
088 else if (cmd.equals(Constants.MOVE)) {
089 moveEntries(actionRequest);
090 }
091 else if (cmd.equals(Constants.MOVE_TO_TRASH)) {
092 deleteEntries(
093 (LiferayPortletConfig)portletConfig, actionRequest, true);
094 }
095 else if (cmd.equals(Constants.RESTORE)) {
096 restoreEntryFromTrash(actionRequest);
097 }
098
099 String redirect = PortalUtil.escapeRedirect(
100 ParamUtil.getString(actionRequest, "redirect"));
101
102 if (cmd.equals(Constants.DELETE_VERSIONS) &&
103 !ActionUtil.hasArticle(actionRequest)) {
104
105 String referringPortletResource = ParamUtil.getString(
106 actionRequest, "referringPortletResource");
107
108 if (Validator.isNotNull(referringPortletResource)) {
109 setForward(
110 actionRequest,
111 "portlet.journal.asset.add_asset_redirect");
112
113 return;
114 }
115 else {
116 ThemeDisplay themeDisplay =
117 (ThemeDisplay)actionRequest.getAttribute(
118 WebKeys.THEME_DISPLAY);
119
120 PortletURL portletURL = PortletURLFactoryUtil.create(
121 actionRequest, portletConfig.getPortletName(),
122 themeDisplay.getPlid(), PortletRequest.RENDER_PHASE);
123
124 redirect = portletURL.toString();
125 }
126 }
127
128 WindowState windowState = actionRequest.getWindowState();
129
130 if (!windowState.equals(LiferayWindowState.POP_UP)) {
131 sendRedirect(actionRequest, actionResponse);
132 }
133 else if (Validator.isNotNull(redirect)) {
134 actionResponse.sendRedirect(redirect);
135 }
136 }
137 catch (Exception e) {
138 if (e instanceof NoSuchArticleException ||
139 e instanceof NoSuchFolderException ||
140 e instanceof PrincipalException) {
141
142 SessionErrors.add(actionRequest, e.getClass());
143
144 setForward(actionRequest, "portlet.journal.error");
145 }
146 else if (e instanceof DuplicateArticleIdException ||
147 e instanceof DuplicateFolderNameException ||
148 e instanceof NoSuchFolderException) {
149
150 SessionErrors.add(actionRequest, e.getClass());
151 }
152 else if (e instanceof AssetCategoryException ||
153 e instanceof AssetTagException) {
154
155 SessionErrors.add(actionRequest, e.getClass(), e);
156 }
157 else {
158 throw e;
159 }
160 }
161 }
162
163 @Override
164 public ActionForward render(
165 ActionMapping actionMapping, ActionForm actionForm,
166 PortletConfig portletConfig, RenderRequest renderRequest,
167 RenderResponse renderResponse)
168 throws Exception {
169
170 try {
171 ActionUtil.getArticles(renderRequest);
172 ActionUtil.getFolders(renderRequest);
173 }
174 catch (Exception e) {
175 if (e instanceof NoSuchArticleException ||
176 e instanceof PrincipalException) {
177
178 SessionErrors.add(renderRequest, e.getClass());
179
180 return actionMapping.findForward("portlet.journal.error");
181 }
182 else {
183 throw e;
184 }
185 }
186
187 String forward = "portlet.journal.edit_entry";
188
189 return actionMapping.findForward(getForward(renderRequest, forward));
190 }
191
192 protected void deleteEntries(
193 LiferayPortletConfig liferayPortletConfig,
194 ActionRequest actionRequest, boolean moveToTrash)
195 throws Exception {
196
197 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
198 WebKeys.THEME_DISPLAY);
199
200 String deleteEntryClassName = null;
201 String deleteEntryTitle = null;
202
203 long[] deleteFolderIds = StringUtil.split(
204 ParamUtil.getString(actionRequest, "folderIds"), 0L);
205
206 for (int i = 0; i < deleteFolderIds.length; i++) {
207 long deleteFolderId = deleteFolderIds[i];
208
209 if (moveToTrash) {
210 JournalFolder folder =
211 JournalFolderServiceUtil.moveFolderToTrash(deleteFolderId);
212
213 if (i == 0) {
214 deleteEntryClassName = JournalFolder.class.getName();
215
216 deleteEntryTitle = TrashUtil.getOriginalTitle(
217 folder.getName());
218 }
219 }
220 else {
221 JournalFolderServiceUtil.deleteFolder(deleteFolderId);
222 }
223 }
224
225 String[] deleteArticleIds = StringUtil.split(
226 ParamUtil.getString(actionRequest, "articleIds"));
227
228 long[] restoreArticleIds = new long[deleteArticleIds.length];
229
230 for (int i = 0; i < deleteArticleIds.length; i++) {
231 String deleteArticleId = deleteArticleIds[i];
232
233 if (moveToTrash) {
234 JournalArticle article =
235 JournalArticleServiceUtil.moveArticleToTrash(
236 themeDisplay.getScopeGroupId(), deleteArticleId);
237
238 if (i == 0) {
239 deleteEntryClassName = JournalArticle.class.getName();
240
241 deleteEntryTitle = article.getTitle(
242 themeDisplay.getLocale());
243 }
244
245 restoreArticleIds[i] = article.getResourcePrimKey();
246 }
247 else {
248 ActionUtil.deleteArticle(actionRequest, deleteArticleId);
249 }
250 }
251
252 if (moveToTrash &&
253 ((deleteArticleIds.length > 0) || (deleteFolderIds.length > 0))) {
254
255 Map<String, String[]> data = new HashMap<String, String[]>();
256
257 if (Validator.isNotNull(deleteEntryClassName)) {
258 data.put(
259 "deleteEntryClassName",
260 new String[] {deleteEntryClassName});
261 }
262
263 if (Validator.isNotNull(deleteEntryTitle)) {
264 data.put("deleteEntryTitle", new String[] {deleteEntryTitle});
265 }
266
267 data.put(
268 "restoreArticleIds",
269 ArrayUtil.toStringArray(restoreArticleIds));
270 data.put(
271 "restoreFolderIds", ArrayUtil.toStringArray(deleteFolderIds));
272
273 SessionMessages.add(
274 actionRequest,
275 liferayPortletConfig.getPortletId() +
276 SessionMessages.KEY_SUFFIX_DELETE_SUCCESS_DATA, data);
277
278 hideDefaultSuccessMessage(liferayPortletConfig, actionRequest);
279 }
280 }
281
282 protected void expireEntries(ActionRequest actionRequest) throws Exception {
283 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
284 WebKeys.THEME_DISPLAY);
285
286 long[] expireFolderIds = StringUtil.split(
287 ParamUtil.getString(actionRequest, "folderIds"), 0L);
288
289 ServiceContext serviceContext = ServiceContextFactory.getInstance(
290 JournalArticle.class.getName(), actionRequest);
291
292 for (long expireFolderId : expireFolderIds) {
293 ActionUtil.expireFolder(
294 themeDisplay.getScopeGroupId(), expireFolderId, serviceContext);
295 }
296
297 String[] expireArticleIds = StringUtil.split(
298 ParamUtil.getString(actionRequest, "articleIds"));
299
300 for (String expireArticleId : expireArticleIds) {
301 ActionUtil.expireArticle(actionRequest, 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(), articleId, newFolderId);
328 }
329 }
330
331 protected void restoreEntryFromTrash(ActionRequest actionRequest)
332 throws PortalException, SystemException {
333
334 long[] restoreFolderIds = StringUtil.split(
335 ParamUtil.getString(actionRequest, "restoreFolderIds"), 0L);
336
337 for (long restoreFolderId : restoreFolderIds) {
338 JournalFolderServiceUtil.restoreFolderFromTrash(restoreFolderId);
339 }
340
341 long[] restoreArticleIds = StringUtil.split(
342 ParamUtil.getString(actionRequest, "restoreArticleIds"), 0L);
343
344 for (long restoreEntryId : restoreArticleIds) {
345 JournalArticleServiceUtil.restoreArticleFromTrash(restoreEntryId);
346 }
347 }
348
349 }