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 = 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
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
257
258 message = MBMessageServiceUtil.updateDiscussionMessage(
259 className, classPK, permissionClassName, permissionClassPK,
260 permissionOwnerId, messageId, subject, body, serviceContext);
261 }
262
263
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 }