001
014
015 package com.liferay.portlet.messageboards.action;
016
017 import com.liferay.portal.kernel.comment.CommentManagerUtil;
018 import com.liferay.portal.kernel.comment.DiscussionPermission;
019 import com.liferay.portal.kernel.json.JSONFactoryUtil;
020 import com.liferay.portal.kernel.json.JSONObject;
021 import com.liferay.portal.kernel.util.Constants;
022 import com.liferay.portal.kernel.util.Function;
023 import com.liferay.portal.kernel.util.ParamUtil;
024 import com.liferay.portal.kernel.workflow.WorkflowConstants;
025 import com.liferay.portal.model.User;
026 import com.liferay.portal.security.auth.PrincipalException;
027 import com.liferay.portal.security.auth.PrincipalThreadLocal;
028 import com.liferay.portal.service.ServiceContext;
029 import com.liferay.portal.service.ServiceContextFunction;
030 import com.liferay.portal.service.UserLocalServiceUtil;
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.messageboards.DiscussionMaxCommentsException;
036 import com.liferay.portlet.messageboards.MessageBodyException;
037 import com.liferay.portlet.messageboards.NoSuchMessageException;
038 import com.liferay.portlet.messageboards.RequiredMessageException;
039
040 import java.io.IOException;
041
042 import javax.portlet.ActionRequest;
043 import javax.portlet.ActionResponse;
044 import javax.portlet.PortletConfig;
045 import javax.portlet.PortletContext;
046 import javax.portlet.PortletException;
047 import javax.portlet.PortletRequestDispatcher;
048 import javax.portlet.ResourceRequest;
049 import javax.portlet.ResourceResponse;
050
051 import javax.servlet.http.HttpServletRequest;
052
053 import org.apache.struts.action.ActionForm;
054 import org.apache.struts.action.ActionMapping;
055
056
060 public class EditDiscussionAction extends PortletAction {
061
062 @Override
063 public void processAction(
064 ActionMapping actionMapping, ActionForm actionForm,
065 PortletConfig portletConfig, ActionRequest actionRequest,
066 ActionResponse actionResponse)
067 throws Exception {
068
069 String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
070
071 try {
072 String redirect = PortalUtil.escapeRedirect(
073 ParamUtil.getString(actionRequest, "redirect"));
074
075 if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
076 long commentId = updateComment(actionRequest);
077
078 boolean ajax = ParamUtil.getBoolean(actionRequest, "ajax");
079
080 if (ajax) {
081 String randomNamespace = ParamUtil.getString(
082 actionRequest, "randomNamespace");
083
084 JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
085
086 jsonObject.put("commentId", commentId);
087 jsonObject.put("randomNamespace", randomNamespace);
088
089 writeJSON(actionRequest, actionResponse, jsonObject);
090
091 return;
092 }
093 }
094 else if (cmd.equals(Constants.DELETE)) {
095 deleteComment(actionRequest);
096 }
097 else if (cmd.equals(Constants.SUBSCRIBE_TO_COMMENTS)) {
098 subscribeToComments(actionRequest, true);
099 }
100 else if (cmd.equals(Constants.UNSUBSCRIBE_FROM_COMMENTS)) {
101 subscribeToComments(actionRequest, false);
102 }
103
104 sendRedirect(actionRequest, actionResponse, redirect);
105 }
106 catch (DiscussionMaxCommentsException | MessageBodyException |
107 NoSuchMessageException | PrincipalException |
108 RequiredMessageException e) {
109
110 JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
111
112 jsonObject.putException(e);
113
114 writeJSON(actionRequest, actionResponse, jsonObject);
115 }
116 }
117
118 @Override
119 public void serveResource(
120 ActionMapping actionMapping, ActionForm actionForm,
121 PortletConfig portletConfig, ResourceRequest resourceRequest,
122 ResourceResponse resourceResponse)
123 throws IOException, PortletException {
124
125 String className = ParamUtil.getString(resourceRequest, "className");
126 long classPK = ParamUtil.getLong(resourceRequest, "classPK");
127 boolean hideControls = ParamUtil.getBoolean(
128 resourceRequest, "hideControls");
129 boolean ratingsEnabled = ParamUtil.getBoolean(
130 resourceRequest, "ratingsEnabled");
131 long userId = ParamUtil.getLong(resourceRequest, "userId");
132
133 HttpServletRequest request = PortalUtil.getHttpServletRequest(
134 resourceRequest);
135
136 request.setAttribute("liferay-ui:discussion:className", className);
137 request.setAttribute(
138 "liferay-ui:discussion:classPK", String.valueOf(classPK));
139 request.setAttribute(
140 "liferay-ui:discussion:hideControls", String.valueOf(hideControls));
141 request.setAttribute(
142 "liferay-ui:discussion:ratingsEnabled",
143 String.valueOf(ratingsEnabled));
144 request.setAttribute(
145 "liferay-ui:discussion:userId", String.valueOf(userId));
146
147 int index = ParamUtil.getInteger(resourceRequest, "index");
148
149 request.setAttribute(
150 "liferay-ui:discussion:index", String.valueOf(index));
151
152 String randomNamespace = ParamUtil.getString(
153 resourceRequest, "randomNamespace");
154
155 request.setAttribute(
156 "liferay-ui:discussion:randomNamespace", randomNamespace);
157
158 int rootIndexPage = ParamUtil.getInteger(
159 resourceRequest, "rootIndexPage");
160
161 request.setAttribute(
162 "liferay-ui:discussion:rootIndexPage",
163 String.valueOf(rootIndexPage));
164
165 PortletContext portletContext = portletConfig.getPortletContext();
166
167 PortletRequestDispatcher portletRequestDispatcher =
168 portletContext.getRequestDispatcher(
169 "/html/taglib/ui/discussion/page_resources.jsp");
170
171 portletRequestDispatcher.include(resourceRequest, resourceResponse);
172 }
173
174 protected void deleteComment(ActionRequest actionRequest) throws Exception {
175 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
176 WebKeys.THEME_DISPLAY);
177
178 long commentId = ParamUtil.getLong(actionRequest, "commentId");
179
180 DiscussionPermission discussionPermission =
181 CommentManagerUtil.getDiscussionPermission(
182 themeDisplay.getPermissionChecker());
183
184 discussionPermission.checkDeletePermission(commentId);
185
186 CommentManagerUtil.deleteComment(commentId);
187 }
188
189 @Override
190 protected boolean isCheckMethodOnProcessAction() {
191 return _CHECK_METHOD_ON_PROCESS_ACTION;
192 }
193
194 protected void subscribeToComments(
195 ActionRequest actionRequest, boolean subscribe)
196 throws Exception {
197
198 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
199 WebKeys.THEME_DISPLAY);
200
201 String className = ParamUtil.getString(actionRequest, "className");
202 long classPK = ParamUtil.getLong(actionRequest, "classPK");
203
204 if (subscribe) {
205 CommentManagerUtil.subscribeDiscussion(
206 themeDisplay.getUserId(), themeDisplay.getScopeGroupId(),
207 className, classPK);
208 }
209 else {
210 CommentManagerUtil.unsubscribeDiscussion(
211 themeDisplay.getUserId(), className, classPK);
212 }
213 }
214
215 protected long updateComment(ActionRequest actionRequest) throws Exception {
216 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
217 WebKeys.THEME_DISPLAY);
218
219 long commentId = ParamUtil.getLong(actionRequest, "commentId");
220
221 String className = ParamUtil.getString(actionRequest, "className");
222 long classPK = ParamUtil.getLong(actionRequest, "classPK");
223 long parentCommentId = ParamUtil.getLong(
224 actionRequest, "parentCommentId");
225 String subject = ParamUtil.getString(actionRequest, "subject");
226 String body = ParamUtil.getString(actionRequest, "body");
227
228 Function<String, ServiceContext> serviceContextFunction =
229 new ServiceContextFunction(actionRequest);
230
231 DiscussionPermission discussionPermission =
232 CommentManagerUtil.getDiscussionPermission(
233 themeDisplay.getPermissionChecker());
234
235 if (commentId <= 0) {
236
237
238
239 User user = null;
240
241 if (themeDisplay.isSignedIn()) {
242 user = themeDisplay.getUser();
243 }
244 else {
245 String emailAddress = ParamUtil.getString(
246 actionRequest, "emailAddress");
247
248 user = UserLocalServiceUtil.fetchUserByEmailAddress(
249 themeDisplay.getCompanyId(), emailAddress);
250
251 if ((user == null) ||
252 (user.getStatus() != WorkflowConstants.STATUS_INCOMPLETE)) {
253
254 return 0;
255 }
256 }
257
258 String name = PrincipalThreadLocal.getName();
259
260 PrincipalThreadLocal.setName(user.getUserId());
261
262 try {
263 discussionPermission.checkAddPermission(
264 themeDisplay.getCompanyId(), themeDisplay.getScopeGroupId(),
265 className, classPK);
266
267 commentId = CommentManagerUtil.addComment(
268 user.getUserId(), className, classPK, user.getFullName(),
269 parentCommentId, subject, body, serviceContextFunction);
270 }
271 finally {
272 PrincipalThreadLocal.setName(name);
273 }
274 }
275 else {
276
277
278
279 discussionPermission.checkUpdatePermission(commentId);
280
281 commentId = CommentManagerUtil.updateComment(
282 themeDisplay.getUserId(), className, classPK, commentId,
283 subject, body, serviceContextFunction);
284 }
285
286
287
288 boolean subscribe = ParamUtil.getBoolean(actionRequest, "subscribe");
289
290 if (subscribe) {
291 CommentManagerUtil.subscribeDiscussion(
292 themeDisplay.getUserId(), themeDisplay.getScopeGroupId(),
293 className, classPK);
294 }
295
296 return commentId;
297 }
298
299 private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
300
301 }