001    /**
002     * Copyright (c) 2000-2012 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.NoSuchUserException;
018    import com.liferay.portal.kernel.json.JSONFactoryUtil;
019    import com.liferay.portal.kernel.json.JSONObject;
020    import com.liferay.portal.kernel.servlet.SessionErrors;
021    import com.liferay.portal.kernel.util.Constants;
022    import com.liferay.portal.kernel.util.ParamUtil;
023    import com.liferay.portal.kernel.workflow.WorkflowConstants;
024    import com.liferay.portal.model.User;
025    import com.liferay.portal.security.auth.PrincipalException;
026    import com.liferay.portal.security.auth.PrincipalThreadLocal;
027    import com.liferay.portal.service.ServiceContext;
028    import com.liferay.portal.service.ServiceContextFactory;
029    import com.liferay.portal.service.SubscriptionLocalServiceUtil;
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.MessageBodyException;
036    import com.liferay.portlet.messageboards.NoSuchMessageException;
037    import com.liferay.portlet.messageboards.RequiredMessageException;
038    import com.liferay.portlet.messageboards.model.MBMessage;
039    import com.liferay.portlet.messageboards.service.MBMessageServiceUtil;
040    
041    import javax.portlet.ActionRequest;
042    import javax.portlet.ActionResponse;
043    import javax.portlet.PortletConfig;
044    import javax.portlet.RenderRequest;
045    import javax.portlet.RenderResponse;
046    
047    import org.apache.struts.action.ActionForm;
048    import org.apache.struts.action.ActionForward;
049    import org.apache.struts.action.ActionMapping;
050    
051    /**
052     * @author Brian Wing Shun Chan
053     * @author Sergio González
054     */
055    public class EditDiscussionAction extends PortletAction {
056    
057            @Override
058            public void processAction(
059                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
060                            ActionRequest actionRequest, ActionResponse actionResponse)
061                    throws Exception {
062    
063                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
064    
065                    try {
066                            String redirect = PortalUtil.escapeRedirect(
067                                    ParamUtil.getString(actionRequest, "redirect"));
068    
069                            if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
070                                    MBMessage message = updateMessage(actionRequest);
071    
072                                    String randomNamespace = ParamUtil.getString(
073                                            actionRequest, "randomNamespace");
074    
075                                    JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
076    
077                                    jsonObject.put("messageId", message.getMessageId());
078                                    jsonObject.put("randomNamespace", randomNamespace);
079    
080                                    writeJSON(actionRequest, actionResponse, jsonObject);
081    
082                                    return;
083                            }
084                            else if (cmd.equals(Constants.DELETE)) {
085                                    deleteMessage(actionRequest);
086                            }
087                            else if (cmd.equals(Constants.SUBSCRIBE_TO_COMMENTS)) {
088                                    subscribeToComments(actionRequest, true);
089                            }
090                            else if (cmd.equals(Constants.UNSUBSCRIBE_FROM_COMMENTS)) {
091                                    subscribeToComments(actionRequest, false);
092                            }
093    
094                            sendRedirect(actionRequest, actionResponse, redirect);
095                    }
096                    catch (Exception e) {
097                            if (e instanceof MessageBodyException ||
098                                    e instanceof NoSuchMessageException ||
099                                    e instanceof PrincipalException ||
100                                    e instanceof RequiredMessageException) {
101    
102                                    JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
103    
104                                    jsonObject.putException(e);
105    
106                                    writeJSON(actionRequest, actionResponse, jsonObject);
107                            }
108                            else {
109                                    throw e;
110                            }
111                    }
112            }
113    
114            @Override
115            public ActionForward render(
116                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
117                            RenderRequest renderRequest, RenderResponse renderResponse)
118                    throws Exception {
119    
120                    try {
121                            ActionUtil.getMessage(renderRequest);
122                    }
123                    catch (Exception e) {
124                            if (e instanceof NoSuchMessageException ||
125                                    e instanceof PrincipalException) {
126    
127                                    SessionErrors.add(renderRequest, e.getClass());
128    
129                                    return mapping.findForward("portlet.message_boards.error");
130                            }
131                            else {
132                                    throw e;
133                            }
134                    }
135    
136                    return mapping.findForward(
137                            getForward(
138                                    renderRequest, "portlet.message_boards.edit_discussion"));
139            }
140    
141            protected void deleteMessage(ActionRequest actionRequest) throws Exception {
142                    long groupId = PortalUtil.getScopeGroupId(actionRequest);
143    
144                    String className = ParamUtil.getString(actionRequest, "className");
145                    long classPK = ParamUtil.getLong(actionRequest, "classPK");
146                    String permissionClassName = ParamUtil.getString(
147                            actionRequest, "permissionClassName");
148                    long permissionClassPK = ParamUtil.getLong(
149                            actionRequest, "permissionClassPK");
150                    long permissionOwnerId = ParamUtil.getLong(
151                            actionRequest, "permissionOwnerId");
152    
153                    long messageId = ParamUtil.getLong(actionRequest, "messageId");
154    
155                    MBMessageServiceUtil.deleteDiscussionMessage(
156                            groupId, className, classPK, permissionClassName, permissionClassPK,
157                            permissionOwnerId, messageId);
158            }
159    
160            @Override
161            protected boolean isCheckMethodOnProcessAction() {
162                    return _CHECK_METHOD_ON_PROCESS_ACTION;
163            }
164    
165            protected void subscribeToComments(
166                            ActionRequest actionRequest, boolean subscribe)
167                    throws Exception {
168    
169                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
170                            WebKeys.THEME_DISPLAY);
171    
172                    String className = ParamUtil.getString(actionRequest, "className");
173                    long classPK = ParamUtil.getLong(actionRequest, "classPK");
174    
175                    if (subscribe) {
176                            SubscriptionLocalServiceUtil.addSubscription(
177                                    themeDisplay.getUserId(), themeDisplay.getScopeGroupId(),
178                                    className, classPK);
179                    }
180                    else {
181                            SubscriptionLocalServiceUtil.deleteSubscription(
182                                    themeDisplay.getUserId(), className, classPK);
183                    }
184            }
185    
186            protected MBMessage updateMessage(ActionRequest actionRequest)
187                    throws Exception {
188    
189                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
190                            WebKeys.THEME_DISPLAY);
191    
192                    String className = ParamUtil.getString(actionRequest, "className");
193                    long classPK = ParamUtil.getLong(actionRequest, "classPK");
194                    String permissionClassName = ParamUtil.getString(
195                            actionRequest, "permissionClassName");
196                    long permissionClassPK = ParamUtil.getLong(
197                            actionRequest, "permissionClassPK");
198                    long permissionOwnerId = ParamUtil.getLong(
199                            actionRequest, "permissionOwnerId");
200    
201                    long messageId = ParamUtil.getLong(actionRequest, "messageId");
202    
203                    long threadId = ParamUtil.getLong(actionRequest, "threadId");
204                    long parentMessageId = ParamUtil.getLong(
205                            actionRequest, "parentMessageId");
206                    String subject = ParamUtil.getString(actionRequest, "subject");
207                    String body = ParamUtil.getString(actionRequest, "body");
208    
209                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
210                            MBMessage.class.getName(), actionRequest);
211    
212                    MBMessage message = null;
213    
214                    if (messageId <= 0) {
215    
216                            // Add message
217    
218                            User user = null;
219    
220                            if (themeDisplay.isSignedIn()) {
221                                    user = themeDisplay.getUser();
222                            }
223                            else {
224                                    String emailAddress = ParamUtil.getString(
225                                            actionRequest, "emailAddress");
226    
227                                    try {
228                                            user = UserLocalServiceUtil.getUserByEmailAddress(
229                                                    themeDisplay.getCompanyId(), emailAddress);
230                                    }
231                                    catch (NoSuchUserException nsue) {
232                                            return null;
233                                    }
234    
235                                    if (user.getStatus() != WorkflowConstants.STATUS_INCOMPLETE) {
236                                            return null;
237                                    }
238                            }
239    
240                            String name = PrincipalThreadLocal.getName();
241    
242                            PrincipalThreadLocal.setName(user.getUserId());
243    
244                            try {
245                                    message = MBMessageServiceUtil.addDiscussionMessage(
246                                            serviceContext.getScopeGroupId(), className, classPK,
247                                            permissionClassName, permissionClassPK, permissionOwnerId,
248                                            threadId, parentMessageId, subject, body, serviceContext);
249                            }
250                            finally {
251                                    PrincipalThreadLocal.setName(name);
252                            }
253                    }
254                    else {
255    
256                            // Update message
257    
258                            message = MBMessageServiceUtil.updateDiscussionMessage(
259                                    className, classPK, permissionClassName, permissionClassPK,
260                                    permissionOwnerId, messageId, subject, body, serviceContext);
261                    }
262    
263                    // Subscription
264    
265                    boolean subscribe = ParamUtil.getBoolean(actionRequest, "subscribe");
266    
267                    if (subscribe) {
268                            SubscriptionLocalServiceUtil.addSubscription(
269                                    themeDisplay.getUserId(), themeDisplay.getScopeGroupId(),
270                                    className, classPK);
271                    }
272    
273                    return message;
274            }
275    
276            private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
277    
278    }