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