001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
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    /**
057     * @author Brian Wing Shun Chan
058     * @author Sergio Gonz??lez
059     */
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                            // Add message
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                            // Update message
278    
279                            discussionPermission.checkUpdatePermission(commentId);
280    
281                            commentId = CommentManagerUtil.updateComment(
282                                    themeDisplay.getUserId(), className, classPK, commentId,
283                                    subject, body, serviceContextFunction);
284                    }
285    
286                    // Subscription
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    }