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().getName());
128
129 return mapping.findForward("portlet.message_boards.error");
130 }
131 else {
132 throw e;
133 }
134 }
135
136 return mapping.findForward(getForward(
137 renderRequest, "portlet.message_boards.edit_discussion"));
138 }
139
140 protected void deleteMessage(ActionRequest actionRequest) throws Exception {
141 long groupId = PortalUtil.getScopeGroupId(actionRequest);
142
143 String className = ParamUtil.getString(actionRequest, "className");
144 long classPK = ParamUtil.getLong(actionRequest, "classPK");
145 String permissionClassName = ParamUtil.getString(
146 actionRequest, "permissionClassName");
147 long permissionClassPK = ParamUtil.getLong(
148 actionRequest, "permissionClassPK");
149 long permissionOwnerId = ParamUtil.getLong(
150 actionRequest, "permissionOwnerId");
151
152 long messageId = ParamUtil.getLong(actionRequest, "messageId");
153
154 MBMessageServiceUtil.deleteDiscussionMessage(
155 groupId, className, classPK, permissionClassName, permissionClassPK,
156 permissionOwnerId, messageId);
157 }
158
159 @Override
160 protected boolean isCheckMethodOnProcessAction() {
161 return _CHECK_METHOD_ON_PROCESS_ACTION;
162 }
163
164 protected void subscribeToComments(
165 ActionRequest actionRequest, boolean subscribe)
166 throws Exception {
167
168 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
169 WebKeys.THEME_DISPLAY);
170
171 String className = ParamUtil.getString(actionRequest, "className");
172 long classPK = ParamUtil.getLong(actionRequest, "classPK");
173
174 if (subscribe) {
175 SubscriptionLocalServiceUtil.addSubscription(
176 themeDisplay.getUserId(), themeDisplay.getScopeGroupId(),
177 className, classPK);
178 }
179 else {
180 SubscriptionLocalServiceUtil.deleteSubscription(
181 themeDisplay.getUserId(), className, classPK);
182 }
183 }
184
185 protected MBMessage updateMessage(ActionRequest actionRequest)
186 throws Exception {
187
188 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
189 WebKeys.THEME_DISPLAY);
190
191 String className = ParamUtil.getString(actionRequest, "className");
192 long classPK = ParamUtil.getLong(actionRequest, "classPK");
193 String permissionClassName = ParamUtil.getString(
194 actionRequest, "permissionClassName");
195 long permissionClassPK = ParamUtil.getLong(
196 actionRequest, "permissionClassPK");
197 long permissionOwnerId = ParamUtil.getLong(
198 actionRequest, "permissionOwnerId");
199
200 long messageId = ParamUtil.getLong(actionRequest, "messageId");
201
202 long threadId = ParamUtil.getLong(actionRequest, "threadId");
203 long parentMessageId = ParamUtil.getLong(
204 actionRequest, "parentMessageId");
205 String subject = ParamUtil.getString(actionRequest, "subject");
206 String body = ParamUtil.getString(actionRequest, "body");
207
208 ServiceContext serviceContext = ServiceContextFactory.getInstance(
209 MBMessage.class.getName(), actionRequest);
210
211 MBMessage message = null;
212
213 if (messageId <= 0) {
214
215
216
217 User user = null;
218
219 if (themeDisplay.isSignedIn()) {
220 user = themeDisplay.getUser();
221 }
222 else {
223 String emailAddress = ParamUtil.getString(
224 actionRequest, "emailAddress");
225
226 try {
227 user = UserLocalServiceUtil.getUserByEmailAddress(
228 themeDisplay.getCompanyId(), emailAddress);
229 }
230 catch (NoSuchUserException nsue) {
231 return null;
232 }
233
234 if (user.getStatus() != WorkflowConstants.STATUS_INCOMPLETE) {
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 }