com.liferay.portlet.messageboards.action.EditDiscussionAction.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.portlet.messageboards.action.EditDiscussionAction.java

Source

/**
 * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package com.liferay.portlet.messageboards.action;

import com.liferay.portal.kernel.json.JSONFactoryUtil;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.servlet.SessionErrors;
import com.liferay.portal.kernel.util.Constants;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.workflow.WorkflowConstants;
import com.liferay.portal.model.User;
import com.liferay.portal.security.auth.PrincipalException;
import com.liferay.portal.security.auth.PrincipalThreadLocal;
import com.liferay.portal.service.ServiceContext;
import com.liferay.portal.service.ServiceContextFactory;
import com.liferay.portal.service.SubscriptionLocalServiceUtil;
import com.liferay.portal.service.UserLocalServiceUtil;
import com.liferay.portal.struts.PortletAction;
import com.liferay.portal.theme.ThemeDisplay;
import com.liferay.portal.util.PortalUtil;
import com.liferay.portal.util.WebKeys;
import com.liferay.portlet.messageboards.MessageBodyException;
import com.liferay.portlet.messageboards.NoSuchMessageException;
import com.liferay.portlet.messageboards.RequiredMessageException;
import com.liferay.portlet.messageboards.model.MBMessage;
import com.liferay.portlet.messageboards.service.MBMessageServiceUtil;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletConfig;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

/**
 * @author Brian Wing Shun Chan
 * @author Sergio Gonzlez
 */
public class EditDiscussionAction extends PortletAction {

    @Override
    public void processAction(ActionMapping actionMapping, ActionForm actionForm, PortletConfig portletConfig,
            ActionRequest actionRequest, ActionResponse actionResponse) throws Exception {

        String cmd = ParamUtil.getString(actionRequest, Constants.CMD);

        try {
            String redirect = PortalUtil.escapeRedirect(ParamUtil.getString(actionRequest, "redirect"));

            if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
                MBMessage message = updateMessage(actionRequest);

                boolean ajax = ParamUtil.getBoolean(actionRequest, "ajax");

                if (ajax) {
                    String randomNamespace = ParamUtil.getString(actionRequest, "randomNamespace");

                    JSONObject jsonObject = JSONFactoryUtil.createJSONObject();

                    jsonObject.put("messageId", message.getMessageId());
                    jsonObject.put("randomNamespace", randomNamespace);

                    writeJSON(actionRequest, actionResponse, jsonObject);

                    return;
                }
            } else if (cmd.equals(Constants.DELETE)) {
                deleteMessage(actionRequest);
            } else if (cmd.equals(Constants.SUBSCRIBE_TO_COMMENTS)) {
                subscribeToComments(actionRequest, true);
            } else if (cmd.equals(Constants.UNSUBSCRIBE_FROM_COMMENTS)) {
                subscribeToComments(actionRequest, false);
            }

            sendRedirect(actionRequest, actionResponse, redirect);
        } catch (Exception e) {
            if (e instanceof MessageBodyException || e instanceof NoSuchMessageException
                    || e instanceof PrincipalException || e instanceof RequiredMessageException) {

                JSONObject jsonObject = JSONFactoryUtil.createJSONObject();

                jsonObject.putException(e);

                writeJSON(actionRequest, actionResponse, jsonObject);
            } else {
                throw e;
            }
        }
    }

    @Override
    public ActionForward render(ActionMapping actionMapping, ActionForm actionForm, PortletConfig portletConfig,
            RenderRequest renderRequest, RenderResponse renderResponse) throws Exception {

        try {
            ActionUtil.getMessage(renderRequest);
        } catch (Exception e) {
            if (e instanceof NoSuchMessageException || e instanceof PrincipalException) {

                SessionErrors.add(renderRequest, e.getClass());

                return actionMapping.findForward("portlet.message_boards.error");
            } else {
                throw e;
            }
        }

        return actionMapping.findForward(getForward(renderRequest, "portlet.message_boards.edit_discussion"));
    }

    protected void deleteMessage(ActionRequest actionRequest) throws Exception {
        long groupId = PortalUtil.getScopeGroupId(actionRequest);

        String className = ParamUtil.getString(actionRequest, "className");
        long classPK = ParamUtil.getLong(actionRequest, "classPK");
        String permissionClassName = ParamUtil.getString(actionRequest, "permissionClassName");
        long permissionClassPK = ParamUtil.getLong(actionRequest, "permissionClassPK");
        long permissionOwnerId = ParamUtil.getLong(actionRequest, "permissionOwnerId");

        long messageId = ParamUtil.getLong(actionRequest, "messageId");

        MBMessageServiceUtil.deleteDiscussionMessage(groupId, className, classPK, permissionClassName,
                permissionClassPK, permissionOwnerId, messageId);
    }

    @Override
    protected boolean isCheckMethodOnProcessAction() {
        return _CHECK_METHOD_ON_PROCESS_ACTION;
    }

    protected void subscribeToComments(ActionRequest actionRequest, boolean subscribe) throws Exception {

        ThemeDisplay themeDisplay = (ThemeDisplay) actionRequest.getAttribute(WebKeys.THEME_DISPLAY);

        String className = ParamUtil.getString(actionRequest, "className");
        long classPK = ParamUtil.getLong(actionRequest, "classPK");

        if (subscribe) {
            SubscriptionLocalServiceUtil.addSubscription(themeDisplay.getUserId(), themeDisplay.getScopeGroupId(),
                    className, classPK);
        } else {
            SubscriptionLocalServiceUtil.deleteSubscription(themeDisplay.getUserId(), className, classPK);
        }
    }

    protected MBMessage updateMessage(ActionRequest actionRequest) throws Exception {

        ThemeDisplay themeDisplay = (ThemeDisplay) actionRequest.getAttribute(WebKeys.THEME_DISPLAY);

        String className = ParamUtil.getString(actionRequest, "className");
        long classPK = ParamUtil.getLong(actionRequest, "classPK");
        String permissionClassName = ParamUtil.getString(actionRequest, "permissionClassName");
        long permissionClassPK = ParamUtil.getLong(actionRequest, "permissionClassPK");
        long permissionOwnerId = ParamUtil.getLong(actionRequest, "permissionOwnerId");

        long messageId = ParamUtil.getLong(actionRequest, "messageId");

        long threadId = ParamUtil.getLong(actionRequest, "threadId");
        long parentMessageId = ParamUtil.getLong(actionRequest, "parentMessageId");
        String subject = ParamUtil.getString(actionRequest, "subject");
        String body = ParamUtil.getString(actionRequest, "body");

        ServiceContext serviceContext = ServiceContextFactory.getInstance(MBMessage.class.getName(), actionRequest);

        MBMessage message = null;

        if (messageId <= 0) {

            // Add message

            User user = null;

            if (themeDisplay.isSignedIn()) {
                user = themeDisplay.getUser();
            } else {
                String emailAddress = ParamUtil.getString(actionRequest, "emailAddress");

                user = UserLocalServiceUtil.fetchUserByEmailAddress(themeDisplay.getCompanyId(), emailAddress);

                if ((user == null) || (user.getStatus() != WorkflowConstants.STATUS_INCOMPLETE)) {

                    return null;
                }
            }

            String name = PrincipalThreadLocal.getName();

            PrincipalThreadLocal.setName(user.getUserId());

            try {
                message = MBMessageServiceUtil.addDiscussionMessage(serviceContext.getScopeGroupId(), className,
                        classPK, permissionClassName, permissionClassPK, permissionOwnerId, threadId,
                        parentMessageId, subject, body, serviceContext);
            } finally {
                PrincipalThreadLocal.setName(name);
            }
        } else {

            // Update message

            message = MBMessageServiceUtil.updateDiscussionMessage(className, classPK, permissionClassName,
                    permissionClassPK, permissionOwnerId, messageId, subject, body, serviceContext);
        }

        // Subscription

        boolean subscribe = ParamUtil.getBoolean(actionRequest, "subscribe");

        if (subscribe) {
            SubscriptionLocalServiceUtil.addSubscription(themeDisplay.getUserId(), themeDisplay.getScopeGroupId(),
                    className, classPK);
        }

        return message;
    }

    private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;

}