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 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 actionMapping, ActionForm actionForm,
117 PortletConfig portletConfig, RenderRequest renderRequest,
118 RenderResponse renderResponse)
119 throws Exception {
120
121 try {
122 ActionUtil.getMessage(renderRequest);
123 }
124 catch (Exception e) {
125 if (e instanceof NoSuchMessageException ||
126 e instanceof PrincipalException) {
127
128 SessionErrors.add(renderRequest, e.getClass());
129
130 return actionMapping.findForward(
131 "portlet.message_boards.error");
132 }
133 else {
134 throw e;
135 }
136 }
137
138 return actionMapping.findForward(
139 getForward(
140 renderRequest, "portlet.message_boards.edit_discussion"));
141 }
142
143 protected void deleteMessage(ActionRequest actionRequest) throws Exception {
144 long groupId = PortalUtil.getScopeGroupId(actionRequest);
145
146 String className = ParamUtil.getString(actionRequest, "className");
147 long classPK = ParamUtil.getLong(actionRequest, "classPK");
148 String permissionClassName = ParamUtil.getString(
149 actionRequest, "permissionClassName");
150 long permissionClassPK = ParamUtil.getLong(
151 actionRequest, "permissionClassPK");
152 long permissionOwnerId = ParamUtil.getLong(
153 actionRequest, "permissionOwnerId");
154
155 long messageId = ParamUtil.getLong(actionRequest, "messageId");
156
157 MBMessageServiceUtil.deleteDiscussionMessage(
158 groupId, className, classPK, permissionClassName, permissionClassPK,
159 permissionOwnerId, messageId);
160 }
161
162 @Override
163 protected boolean isCheckMethodOnProcessAction() {
164 return _CHECK_METHOD_ON_PROCESS_ACTION;
165 }
166
167 protected void subscribeToComments(
168 ActionRequest actionRequest, boolean subscribe)
169 throws Exception {
170
171 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
172 WebKeys.THEME_DISPLAY);
173
174 String className = ParamUtil.getString(actionRequest, "className");
175 long classPK = ParamUtil.getLong(actionRequest, "classPK");
176
177 if (subscribe) {
178 SubscriptionLocalServiceUtil.addSubscription(
179 themeDisplay.getUserId(), themeDisplay.getScopeGroupId(),
180 className, classPK);
181 }
182 else {
183 SubscriptionLocalServiceUtil.deleteSubscription(
184 themeDisplay.getUserId(), className, classPK);
185 }
186 }
187
188 protected MBMessage updateMessage(ActionRequest actionRequest)
189 throws Exception {
190
191 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
192 WebKeys.THEME_DISPLAY);
193
194 String className = ParamUtil.getString(actionRequest, "className");
195 long classPK = ParamUtil.getLong(actionRequest, "classPK");
196 String permissionClassName = ParamUtil.getString(
197 actionRequest, "permissionClassName");
198 long permissionClassPK = ParamUtil.getLong(
199 actionRequest, "permissionClassPK");
200 long permissionOwnerId = ParamUtil.getLong(
201 actionRequest, "permissionOwnerId");
202
203 long messageId = ParamUtil.getLong(actionRequest, "messageId");
204
205 long threadId = ParamUtil.getLong(actionRequest, "threadId");
206 long parentMessageId = ParamUtil.getLong(
207 actionRequest, "parentMessageId");
208 String subject = ParamUtil.getString(actionRequest, "subject");
209 String body = ParamUtil.getString(actionRequest, "body");
210
211 ServiceContext serviceContext = ServiceContextFactory.getInstance(
212 MBMessage.class.getName(), actionRequest);
213
214 MBMessage message = null;
215
216 if (messageId <= 0) {
217
218
219
220 User user = null;
221
222 if (themeDisplay.isSignedIn()) {
223 user = themeDisplay.getUser();
224 }
225 else {
226 String emailAddress = ParamUtil.getString(
227 actionRequest, "emailAddress");
228
229 user = UserLocalServiceUtil.fetchUserByEmailAddress(
230 themeDisplay.getCompanyId(), emailAddress);
231
232 if ((user == null) ||
233 (user.getStatus() != WorkflowConstants.STATUS_INCOMPLETE)) {
234
235 return null;
236 }
237 }
238
239 String name = PrincipalThreadLocal.getName();
240
241 PrincipalThreadLocal.setName(user.getUserId());
242
243 try {
244 message = MBMessageServiceUtil.addDiscussionMessage(
245 serviceContext.getScopeGroupId(), className, classPK,
246 permissionClassName, permissionClassPK, permissionOwnerId,
247 threadId, parentMessageId, subject, body, serviceContext);
248 }
249 finally {
250 PrincipalThreadLocal.setName(name);
251 }
252 }
253 else {
254
255
256
257 message = MBMessageServiceUtil.updateDiscussionMessage(
258 className, classPK, permissionClassName, permissionClassPK,
259 permissionOwnerId, messageId, subject, body, serviceContext);
260 }
261
262
263
264 boolean subscribe = ParamUtil.getBoolean(actionRequest, "subscribe");
265
266 if (subscribe) {
267 SubscriptionLocalServiceUtil.addSubscription(
268 themeDisplay.getUserId(), themeDisplay.getScopeGroupId(),
269 className, classPK);
270 }
271
272 return message;
273 }
274
275 private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
276
277 }