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