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