001
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
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
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
234
235 message = MBMessageServiceUtil.updateDiscussionMessage(
236 className, classPK, permissionClassName, permissionClassPK,
237 permissionOwnerId, messageId, subject, body, serviceContext);
238 }
239
240
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 }