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