com.ext.portlet.plans.PlanLocalServiceHelper.java Source code

Java tutorial

Introduction

Here is the source code for com.ext.portlet.plans.PlanLocalServiceHelper.java

Source

/*
 * Copyright (c) 2010. M.I.T. All Rights Reserved
 * Licensed under the MIT license. Please see http://www.opensource.org/licenses/mit-license.php
 * or the license.txt file included in this distribution for the full text of the license.
 */

package com.ext.portlet.plans;

import java.util.ArrayList;
import java.util.List;

import javax.portlet.PortletPreferences;
import javax.portlet.PortletRequest;

import com.ext.portlet.NoSuchPlanException;
import com.ext.portlet.NoSuchPlanTypeException;
import com.ext.portlet.NoSuchPlanVoteException;
import com.ext.portlet.NoSuchPlansUserSettingsException;
import com.ext.portlet.model.PlanColumnSettings;
import com.ext.portlet.model.PlanType;
import com.ext.portlet.model.PlanTypeColumn;
import com.ext.portlet.model.PlanVote;
import com.ext.portlet.model.PlansFilter;
import com.ext.portlet.model.PlansFilterPosition;
import com.ext.portlet.model.PlansUserSettings;
import com.ext.portlet.plans.PlanConstants.Columns;
import com.ext.portlet.service.PlanColumnSettingsLocalServiceUtil;
import com.ext.portlet.service.PlanTypeLocalServiceUtil;
import com.ext.portlet.service.PlanVoteLocalServiceUtil;
import com.ext.portlet.service.PlansFilterLocalServiceUtil;
import com.ext.portlet.service.PlansFilterPositionLocalServiceUtil;
import com.ext.portlet.service.PlansUserSettingsLocalServiceUtil;
import com.ext.portlet.service.persistence.PlanVotePK;
import com.ext.portlet.service.persistence.PlansFilterPositionPK;
import com.liferay.portal.kernel.dao.orm.Criterion;
import com.liferay.portal.kernel.dao.orm.DynamicQuery;
import com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil;
import com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.model.User;
import com.liferay.portal.security.permission.ActionKeys;
import com.liferay.portal.service.UserLocalServiceUtil;
import com.liferay.portal.theme.ThemeDisplay;

/**
 * Helper class responsible for performing custom queries on PlanLocalService.
 * <p/>
 * In version 1.0 it supports following queries:
 * <ul>
 * <li>get list of plans that have "published" flag set to given value</li>
 * <li>count how many plans have "published" flag set to given value</li>
 * </ul>
 * <p/>
 * This class can't be instantiated. It is thread safe as it has no state.
 * <p/>
 * version 1.1: added methods for plan positions retrieval
 * version 1.2: modified methods responsible for Plans retrieval to support
 * filtering, added methods for retrieval of user vote position column
 * configuration, plan filters
 * version 1.3: refactored to bring "add-plan" into this class
 *
 * @author janusz.p, janusz.p, josh i
 * @version 1.3
 * @since 1.0
 */
public class PlanLocalServiceHelper {

    /**
     * Default community permissions for community forum category.
     */
    public static final String[] DEFAULT_CATEGORY_COMMUNITY_PERMISSIONS = { ActionKeys.VIEW, ActionKeys.SUBSCRIBE,
            ActionKeys.REPLY_TO_MESSAGE, ActionKeys.ADD_MESSAGE };

    /**
     * Default guest permissions for community forum category.
     */
    public static final String[] DEFAULT_CATEGORY_GUEST_PERMISSIONS = { ActionKeys.VIEW, ActionKeys.SUBSCRIBE };

    /**
     * Default description of group working on a plan.
     */
    public static final String DEFAULT_GROUP_DESCRIPTION = "Group working on plan %s";

    /**
     * Default forum category name.
     */
    public static final String DEFAULT_FORUM_CATEGORY_NAME = "General discussion";

    /**
     * Default forum category description.
     */
    public static final String DEFAULT_FORUM_CATEGORY_DESCRIPTION = "General discussion about plan %s";

    /**
     * Plan position state - position already exists.
     */
    public static final int EXISTS = 0;

    /**
     * Plan position state - new position.
     */
    public static final int NEW = 1;

    /**
     * Plan position state - position should be deleted.
     */
    public static final int DELETE = 2;

    /**
     * Name of column that represents value of PlanPosition planId field.
     */
    public static final String POSITION_PLAN_ID = "primaryKey.planId";

    /**
     * Name of column that represents value of PlanPosition planId field.
     */
    public static final String POSITION_POSITION_ID = "primaryKey.positionId";

    /**
     * Name of column that represents value of Plan's "published" field.
     */
    public static final String PLAN_PUBLISHED = "published";

    /**
     * Name of column that represents value of PlansFilterPositions userId field.
     */
    public static final String PLANS_FILTER_USER_ID = "primaryKey.userId";

    private static final String PLANS_FILTER_PLAN_TYPE_ID = "primaryKey.planTypeId";

    /**
     * Private constructor to prevent users from instantiating this class.
     */
    private PlanLocalServiceHelper() {
    }
    /*
        public static Plan addPlan(ActionRequest actionRequest) throws PortalException, SystemException {
        
    String name = ParamUtil.getString(actionRequest, PlanConstants.PLAN_NAME_FIELD);
    Long planTypeId = ParamUtil.getLong(actionRequest, PlanConstants.PLAN_TYPE_ID);
        
    Date now = new Date();
    long climatePlanId = CounterLocalServiceUtil.increment(Plan.class.getName());
    Plan plan = PlanLocalServiceUtil.createPlan(climatePlanId);
    plan.setName(name);
    plan.setPlanTypeId(planTypeId);
        
    return initializePlan(plan, actionRequest);
        }
        */

    /**
     * Retrieves list of plans. First this method tries to get filters defined
     * by user, after that uses appropriate method from PlanLocalServiceUtil
     * to get either filtered or not filtered plans.
     *
     * @param request       portlet request
     * @param start         position of first plan to be retrieved
     * @param end           position of last plan to be retrieved
     * @param sortColumn    column over which sorting should be performed
     * @param sortDirection direction of sorting
     * @return list of retrieved plans
     * @throws Exception
     */
    /*
    public static List<Plan> getPlans(PortletRequest request, long planTypeId, int start, int end,
                                  String sortColumn, String sortDirection) throws Exception {
    // get filter and retrieve plans
    PlansUserSettings planUserSettings = getPlanUserSettings(request, planTypeId);
    List<Plan> plans = null;
    if (planUserSettings == null || !planUserSettings.getFilterEnabled()) {
        plans = PlanLocalServiceUtil.getPlans(planTypeId, start, end, sortColumn, sortDirection);
    } else {
        plans = PlanLocalServiceUtil.getFilteredPlans(planUserSettings, start, end, sortColumn, sortDirection);
    }
        
    // get plans positions and assign them to appropriate plans
    Map<Long, MBMessage> positionsMap = null;//getPositionsMap(request, Long.parseLong(getDefaultTopicId(request)));
    Map<Long, List<MBMessage>> plansPositions = new HashMap<Long, List<MBMessage>>();
        
    List<PlanPosition> planPositionIds = PlanLocalServiceUtil.getPlansPositions(plans);
        
    for (PlanPosition planPositionId : planPositionIds) {
        if (!plansPositions.containsKey(planPositionId.getPlanId())) {
            plansPositions.put(planPositionId.getPlanId(), new ArrayList<MBMessage>());
        }
        if (positionsMap.containsKey(planPositionId.getPositionId())) {
            plansPositions.get(planPositionId.getPlanId()).add(positionsMap.get(planPositionId.getPositionId()));
        }
    }
        
    for (Plan plan : plans) {
        if (plansPositions.containsKey(plan.getPlanId())) {
            plan.setPositions(plansPositions.get(plan.getPlanId()));
        }
    }
        
    return plans;
        
    }
    */

    /**
     * Returns count of plans in current data set (if user has enabled
     * filtering, before counting filters are applied).
     *
     * @param request render request
     * @return returns plans count in current data set
     * @throws Exception
     */
    /*
    public static int getPlansCount(PortletRequest request, long planTypeId) throws Exception {
    PlansUserSettings planUserSettings = getPlanUserSettings(request, planTypeId);
    if (planUserSettings == null || !planUserSettings.getFilterEnabled()) {
        return PlanLocalServiceUtil.countPlans(planTypeId);
    } else {
        return PlanLocalServiceUtil.countFilteredPlans(planUserSettings);
    }
    }
    */

    /**
     * Method responsible for retrieval of position of a plan user has voted for.
     *
     * @param request       render request
     * @param sortColumn    column over which sorting should be performed
     * @param sortDirection direction of sorting
     * @return position of a plan user has voted on
     * @throws Exception
     */
    /*
    public static int getUserVotePosition(PortletRequest request, long planTypeId, String sortColumn,
                                      String sortDirection) throws Exception {
    PlansUserSettings planUserSettings = getPlanUserSettings(request, planTypeId);
    ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);
    long userId = themeDisplay.getUserId();
        
    if (planUserSettings == null || !planUserSettings.getFilterEnabled()) {
        return PlanLocalServiceUtil.getUserVotePosition(userId, sortColumn, sortDirection);
    } else {
        return PlanLocalServiceUtil.getFilteredUserVotePosition(planUserSettings, userId, sortColumn, sortDirection);
    }
    }
    */

    /**
     * Returns list of positions referenced by a plan.
     *
     * @param planId ID of a plan for which positions should be retrieved
     * @return list of MBMessage objects representing referenced positions
     * @throws PortalException passed up in case of framework error
     * @throws SystemException passed up in case of framework error
     */
    /*
    public static List<MBMessage> getPlanPositions(long planId) throws PortalException, SystemException {
    // load all plan positions
    List<MBMessage> positions = new ArrayList<MBMessage>();
        
    // create custom query and execute it
    DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(PlanPosition.class);
    Criterion criterionPublished = RestrictionsFactoryUtil.eq(POSITION_PLAN_ID, planId);
    dynamicQuery.add(criterionPublished);
        
    List<Object> ret = PlanLocalServiceUtil.dynamicQuery(dynamicQuery);
        
    for (Object positionObj : ret) {
        PlanPosition position = (PlanPosition) positionObj;
        try {
            MBMessage positionMessage = MBMessageLocalServiceUtil.getMessage(position.getPositionId());
            positions.add(positionMessage);
        } catch (NoSuchMessageException e) {
            // ignore
        }
    }
        
    return positions;
    }
    */

    /*
    public static List<PlanPosition> queryPlanPositions(long planId) throws PortalException, SystemException {
    // load all plan positions
        
    // create custom query and execute it
    DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(PlanPosition.class);
    Criterion criterionPublished = RestrictionsFactoryUtil.eq(POSITION_PLAN_ID, planId);
    dynamicQuery.add(criterionPublished);
    List<PlanPosition> result  = new ArrayList<PlanPosition>();
    for (Object p:PlanLocalServiceUtil.dynamicQuery(dynamicQuery)) {
       result.add((PlanPosition)p);
    }
    return result;
    }*/

    /**
     * Returns list of positions referenced by a plan.
     *
     * @param planId ID of a plan for which positions should be retrieved
     * @return list of MBMessage objects representing referenced positions
     * @throws PortalException passed up in case of framework error
     * @throws SystemException passed up in case of framework error
     */
    /*public static List<DebateItem>  getPlanPositionsDebateRevision(long planId) throws PortalException, SystemException {
    // load all plan positions
    List<DebateItem> positions = new ArrayList<DebateItem>();
        
    // create custom query and execute it
    DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(PlanPosition.class);
    Criterion criterionPublished = RestrictionsFactoryUtil.eq(POSITION_PLAN_ID, planId);
    dynamicQuery.add(criterionPublished);
        
    List<Object> ret = PlanLocalServiceUtil.dynamicQuery(dynamicQuery);
        
    for (Object positionObj : ret) {
        PlanPosition position = (PlanPosition) positionObj;
        DebateItem item = DebateItemLocalServiceUtil.getLastItem(position.getPositionId());
        if (item == null) continue;
        if (DebateItemStatus.valueOf(item.getStatus()) == DebateItemStatus.ACTIVE) {
            positions.add(item);
            System.err.println("Debate is "+item.getDebate());
        }
        
    }
        
    return positions;
    }*/

    /**
     * Returns list of PlanPositions for given position ID.
     *
     * @param positionId ID of a plan position
     * @return list of PlanPosition objects
     * @throws PortalException passed up in case of framework error
     * @throws SystemException passed up in case of framework error
     */
    /*
    public static List<PlanPosition> getPlanPositionsByPositionId(long positionId)
        throws PortalException, SystemException {
    // load all plan positions
    List<PlanPosition> planPositions = new ArrayList<PlanPosition>();
        
    // create custom query and execute it
    DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(PlanPosition.class);
    Criterion criterionPublished = RestrictionsFactoryUtil.eq(POSITION_POSITION_ID, positionId);
    dynamicQuery.add(criterionPublished);
        
    List<Object> ret = PlanLocalServiceUtil.dynamicQuery(dynamicQuery);
        
    for (Object positionObj : ret) {
        PlanPosition position = (PlanPosition) positionObj;
        planPositions.add(position);
    }
        
    return planPositions;
    }
    */

    /**
     * Returns id of default topic that should be referenced by newly created plans.
     *
     * @param request portlet request
     * @return id of default topic
     * @throws SystemException passed up in case of framework error
     */
    public static String getDefaultTopicId(PortletRequest request) throws SystemException {
        //return 401 + "";
        return getPortletPreference(request, PlanConstants.DEFAULT_TOPIC_ID);
    }

    /**
     * Returns id of default model that should be referenced by newly created plans.
     *
     * @param request portlet request
     * @return id of default model
     * @throws SystemException passed up in case of framework error
     */
    public static String getDefaultModelId(PortletRequest request) throws SystemException {
        return getPortletPreference(request, PlanConstants.DEFAULT_MODEL_ID);
    }

    /**
     * Returns portlet preference.
     *
     * @param request        portlet request
     * @param preferenceName name of preference to retrieve
     * @return preference value
     * @throws SystemException passed up in case of framework error
     */
    private static String getPortletPreference(PortletRequest request, String preferenceName)
            throws SystemException {
        PortletPreferences preferences = request.getPreferences();
        return preferences.getValue(preferenceName, "-1");
    }

    /**
     * Returns user settings for plans portlet (columns configuration).
     * Method first checks if there is object with user settings in current
     * session, if it is, this object is returned. If it isn't, new object
     * is created with default data.
     *
     * @param request render request
     * @return returns columns configuration
     * @throws PortalException passed up in case of framework error
     * @throws SystemException passed up in case of framework error
     */
    public static PlansUserSettings getPlanUserSettings(PortletRequest request, long planTypeId)
            throws PortalException, SystemException {
        String settingsParamName = getUserSettingsParamName(planTypeId);
        PlansUserSettings userSettings = (PlansUserSettings) request.getPortletSession()
                .getAttribute(settingsParamName);
        if (userSettings == null) {
            ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);
            long userId = themeDisplay.getUserId();
            User user = UserLocalServiceUtil.getUser(userId);

            if (!user.isDefaultUser()) {
                // try {
                List tmp = PlansUserSettingsLocalServiceUtil.getPlansUserSettingses(0, 9999);
                //userSettings = PlansUserSettingsLocalServiceUtil.getByUserIdPlanTypeId(userId, planTypeId);
                userSettings = null;
                if (userSettings != null) {
                    setPlansFilterPositionsIds(userSettings);
                }
            }

            if (userSettings == null || user.isDefaultUser()) {
                userSettings = PlansUserSettingsLocalServiceUtil.createPlansUserSettings(0L);
                userSettings.setPlanTypeId(planTypeId);
                userSettings.setUserId(userId);
                userSettings.setFilterEnabled(false);
                userSettings.setFilterPositionsAll(false);

                PlanType planType = PlanTypeLocalServiceUtil.getPlanType(planTypeId);
                for (PlanTypeColumn planTypeColumn : PlanTypeLocalServiceUtil.getColumns(planType)) {
                    PlanColumnSettings settings = PlanColumnSettingsLocalServiceUtil.createPlanColumnSettings(0L);
                    settings.setColumnName(planTypeColumn.getColumnName());
                    settings.setPlanUserSettingsId(userSettings.getPlanUserSettingsId());
                    settings.setVisible(planTypeColumn.getVisibleByDefault());

                    //userSettings.addColumnSettings(settings);
                }
                /*
                for (Columns c:Columns.defaults()) {
                   c.setUserSetting(userSettings, true);
                }*/
                //                userSettings.setShowName(true);
                //                userSettings.setShowDate(true);
                //                userSettings.setShowTemperatureChange(true);
                //                userSettings.setShowCO2(true);
                //                userSettings.setShowMitigationCost(true);
                //                userSettings.setShowDamageCost(true);
                //              //  userSettings.setShowPositions(true);
                //                userSettings.setShowVotes(true);
                //                userSettings.
            }
            request.getPortletSession().setAttribute(settingsParamName, userSettings);
        }

        return userSettings;
    }

    /**
     * Returns name of session parameter with columns configuration for
     * table with published/unpublished plans.
     * retrieved
     *
     * @return name of session parameter with column configuration
     */
    private static String getUserSettingsParamName(long planTypeId) {
        return PlanConstants.USER_SETTINGS + String.valueOf(planTypeId);
    }

    /**
     * Method adds positions and questions related to topic to the request.
     *
     * @param request render request
     * @param topicId ID of topic from which questions and positions should be taken
     * @throws SystemException passed up in case of any error in framework
     * @throws PortalException passed up in case of any error in framework
     */
    /*
    public static void addQuestionsAndPositions(PortletRequest request, long topicId)
        throws SystemException, PortalException {
    int issuesCount = DebatesUtil.getIssuesCount(request, topicId);
        
    Map<MBMessage, List<MBMessage>> questionPositions = new HashMap<MBMessage, List<MBMessage>>();
    List<MBMessage> questions = new ArrayList<MBMessage>();
        
    List<MBCategory> questionCategories = DebatesUtil.getIssues(request, topicId, 0, issuesCount);
    for (MBCategory questionCategory : questionCategories) {
        MBCategory debateCategory = DebatesUtil.getSubcategory(questionCategory.getCategoryId(),
                DebatesConstants.ISSUE_DEBATE_CATEGORY_NAME);
        MBMessage question = DebatesUtil.getDebateMessage(debateCategory.getCategoryId());
        List<MBMessage> positions = DebatesUtil.getChildMessages(question);
        
        questions.add(question);
        questionPositions.put(question, positions);
    }
        
    request.setAttribute(PlanConstants.QUESTIONS, questions);
    request.setAttribute(PlanConstants.QUESTION_POSITIONS, questionPositions);
    }
    */

    /*
    public static void addQuestionsAndPositionsRevision(PortletRequest request, long topicId)
        throws SystemException, PortalException {
    List<Debate> debates = DebateCategoryLocalServiceUtil.getDebates(topicId);
    List<DebateItem> questions = new ArrayList<DebateItem>();
    Map<DebateItem, List<DebateItem>> questionPositions = new HashMap<DebateItem, List<DebateItem>>();
        
    for (Debate d : debates) {
        questions.add(d.getCurrentRoot());
        questionPositions.put(d.getCurrentRoot(), d.getCurrentRoot().getChildren());
    }
        
    request.setAttribute(PlanConstants.QUESTIONS, questions);
    request.setAttribute(PlanConstants.QUESTION_POSITIONS, questionPositions);
    }
    */

    /**
     * Retrieves map of all positions from given topic keyed by their id's.
     *
     * @param request render request
     * @param topicId id of topic for which positions should be retrieved
     * @return map of positions
     * @throws SystemException passed up in case of framework error
     * @throws PortalException passed up in case of framework error
     */
    /*
    public static Map<Long, MBMessage> getPositionsMap(PortletRequest request, long topicId)
        throws SystemException, PortalException {
    int issuesCount = DebatesUtil.getIssuesCount(request, topicId);
        
    Map<Long, MBMessage> positions = new HashMap<Long, MBMessage>();
        
    List<MBCategory> questionCategories = DebatesUtil.getIssues(request, topicId, 0, issuesCount);
    for (MBCategory questionCategory : questionCategories) {
        MBCategory debateCategory = DebatesUtil.getSubcategory(questionCategory.getCategoryId(),
                DebatesConstants.ISSUE_DEBATE_CATEGORY_NAME);
        MBMessage question = DebatesUtil.getDebateMessage(debateCategory.getCategoryId());
        List<MBMessage> questionPositions = DebatesUtil.getChildMessages(question);
        
        for (MBMessage position : questionPositions) {
            positions.put(position.getMessageId(), position);
        }
    }
    return positions;
    }
     */
    /**
     * Returns filter settings for plans table with published/unpublished plans.
     * Method first checks if there is object with filters in current
     * session, if it is, this object is returned. If it isn't, new object
     * is created with default data.
     *
     * @param request render request
     * @param published publish status for table which filters configuration is
     *      retrieved
     * @return returns filters configuration
     * @throws PortalException passed up in case of framework error
     * @throws SystemException passed up in case of framework error
     */
    /*
    public static PlansFilter getFilter(PortletRequest request, long planTypeId)
    throws PortalException, SystemException {
    String filterParamName = getFilterParamName(planTypeId);
    PlansFilter plansFilter = (PlansFilter) request.getPortletSession().getAttribute(filterParamName);
    if (plansFilter == null) {
        ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);
        long userId = themeDisplay.getUserId();
        User user = UserLocalServiceUtil.getUser(userId);
        PlansFilterPK plansFilterPK = new PlansFilterPK();
        plansFilterPK.setPlanTypeId(planTypeId);
        plansFilterPK.setUserId(userId);
        
        if (!user.isDefaultUser()) {
            try {
                plansFilter = PlansFilterLocalServiceUtil.getPlansFilter(plansFilterPK);
                setPlansFilterPositionsIds(plansFilter);
                request.getPortletSession().setAttribute(filterParamName, plansFilter);
            } catch (NoSuchFilterException e) {
                // ignore
            }
        }
    }
        
    return plansFilter;
    }
    */

    /**
     * Method responsible for storing filters configuration. Configuration is
     * stored in session also, if user is authorized then configuration is
     * persisted.
     *
     * @param request     render request
     * @param plansFilter filters configuration that should be stored
     * @throws PortalException passed up in case of framework error
     * @throws SystemException passed up in case of framework error
     */
    public static void saveFilter(PortletRequest request, PlansFilter plansFilter)
            throws SystemException, PortalException {
        ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);
        long userId = themeDisplay.getUserId();
        User user = UserLocalServiceUtil.getUser(userId);
        if (!user.isDefaultUser()) {
            storePlansFilterPositionsIds(plansFilter);
            PlansFilterLocalServiceUtil.updatePlansFilter(plansFilter);

        }
        String filterParamName = getFilterParamName(plansFilter.getPlanTypeId());
        request.getPortletSession().setAttribute(filterParamName, plansFilter);
    }

    public static void saveFilter(PortletRequest request, PlansUserSettings plansFilter)
            throws SystemException, PortalException {
        ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);
        long userId = themeDisplay.getUserId();
        User user = UserLocalServiceUtil.getUser(userId);
        if (!user.isDefaultUser()) {
            storePlansFilterPositionsIds(plansFilter);
            PlansUserSettingsLocalServiceUtil.updatePlansUserSettings(plansFilter);

        }
        String filterParamName = getFilterParamName(plansFilter.getPlanTypeId());
        request.getPortletSession().setAttribute(filterParamName, plansFilter);
    }

    /**
     * Returns name of session parameter with filters configuration for
     * table with published/unpublished plans.
     *
     * @return name of session parameter with filters configuration
     */
    private static String getFilterParamName(long planTypeId) {
        return PlanConstants.FILTER_NAME + String.valueOf(planTypeId);
    }

    /**
     * Retrieves PlanFilter positions id's from database and associates them
     * with passed filter.
     *
     * @throws SystemException passed up in case of framework error
     */
    private static void setPlansFilterPositionsIds(PlansUserSettings planUserSettings) throws SystemException {
        DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(PlansFilterPosition.class);
        Criterion criterionPlanType = RestrictionsFactoryUtil.eq(PLANS_FILTER_PLAN_TYPE_ID,
                planUserSettings.getPlanTypeId());
        Criterion criterionUserId = RestrictionsFactoryUtil.eq(PLANS_FILTER_USER_ID, planUserSettings.getUserId());
        dynamicQuery.add(criterionPlanType);
        dynamicQuery.add(criterionUserId);

        List<Object> positionsObjects = PlansFilterPositionLocalServiceUtil.dynamicQuery(dynamicQuery);
        List<Long> positionsIds = new ArrayList<Long>();
        for (Object positionObj : positionsObjects) {
            PlansFilterPosition plansFilterPosition = (PlansFilterPosition) positionObj;
            positionsIds.add(plansFilterPosition.getPositionId());
        }
        // planUserSettings.setPositionsIds(positionsIds);
    }

    /**
     * Persist associations between filter and positions.
     *
     * @param plansFilter plan filter
     * @throws SystemException passed up in case of framework error
     */
    private static void storePlansFilterPositionsIds(PlansFilter plansFilter) throws SystemException {
        DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(PlansFilterPosition.class);
        Criterion criterionPlanType = RestrictionsFactoryUtil.eq(PLANS_FILTER_PLAN_TYPE_ID,
                plansFilter.getPlanTypeId());
        Criterion criterionUserId = RestrictionsFactoryUtil.eq(PLANS_FILTER_USER_ID, plansFilter.getUserId());
        dynamicQuery.add(criterionPlanType);
        dynamicQuery.add(criterionUserId);

        // delete current associations
        List<Object> positionsObjects = PlansFilterPositionLocalServiceUtil.dynamicQuery(dynamicQuery);
        for (Object positionObj : positionsObjects) {
            PlansFilterPosition plansFilterPosition = (PlansFilterPosition) positionObj;
            PlansFilterPositionLocalServiceUtil.deletePlansFilterPosition(plansFilterPosition);
        }

        // add new associations
        /*
        for (Long positionId : plansFilter.getPositionsIds()) {
        PlansFilterPositionPK plansFilterPositionPK = new PlansFilterPositionPK();
        plansFilterPositionPK.setPlanTypeId(plansFilter.getPlanTypeId());
        plansFilterPositionPK.setUserId(plansFilter.getUserId());
        plansFilterPositionPK.setPositionId(positionId);
            
        PlansFilterPosition plansFilterPosition = PlansFilterPositionLocalServiceUtil.createPlansFilterPosition(plansFilterPositionPK);
        PlansFilterPositionLocalServiceUtil.updatePlansFilterPosition(plansFilterPosition);
        }
        */
    }

    private static void storePlansFilterPositionsIds(PlansUserSettings plansFilter) throws SystemException {
        DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(PlansFilterPosition.class);
        Criterion criterionPlanType = RestrictionsFactoryUtil.eq(PLANS_FILTER_PLAN_TYPE_ID,
                plansFilter.getPlanTypeId());
        Criterion criterionUserId = RestrictionsFactoryUtil.eq(PLANS_FILTER_USER_ID, plansFilter.getUserId());
        dynamicQuery.add(criterionPlanType);
        dynamicQuery.add(criterionUserId);

        // delete current associations
        List<Object> positionsObjects = PlansFilterPositionLocalServiceUtil.dynamicQuery(dynamicQuery);
        for (Object positionObj : positionsObjects) {
            PlansFilterPosition plansFilterPosition = (PlansFilterPosition) positionObj;
            PlansFilterPositionLocalServiceUtil.deletePlansFilterPosition(plansFilterPosition);
        }

        // add new associations
        /*
        for (Long positionId : plansFilter.getPositionsIds()) {
        PlansFilterPositionPK plansFilterPositionPK = new PlansFilterPositionPK();
        plansFilterPositionPK.setPlanTypeId(plansFilter.getPlanTypeId());
        plansFilterPositionPK.setUserId(plansFilter.getUserId());
        plansFilterPositionPK.setPositionId(positionId);
            
        PlansFilterPosition plansFilterPosition = PlansFilterPositionLocalServiceUtil.createPlansFilterPosition(plansFilterPositionPK);
        PlansFilterPositionLocalServiceUtil.updatePlansFilterPosition(plansFilterPosition);
        }*/
    }

    /**
     * Method adds plan vote to request object.
     *
     * @param request request that should be populated with users plan vote
     * @throws PortalException passed up in case of framework exception
     * @throws SystemException passed up in case of framework exception
     */
    public static void addPlanVote(PortletRequest request) throws PortalException, SystemException {
        ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);
        long userId = themeDisplay.getUserId();
        try {
            PlanVote planVote = PlanVoteLocalServiceUtil.getPlanVote(new PlanVotePK(userId, 1L));
            request.setAttribute(PlanConstants.VOTE, planVote);
        } catch (NoSuchPlanVoteException e) {
            // ignore
        }
    }

    /**
     * Returns plan that is associated with given group.
     *
     * @param groupId ID of group that is associated with searched plan
     * @return a Plan
     * @throws NoSuchPlanException if there is no plan associated with given id
     * @throws SystemException     passed up in case of framework error
     * @throws NoSuchPlanException
     */
    /*
    public static Plan getPlanByGroupId(long groupId) throws SystemException, NoSuchPlanException {
        
    // create custom query and execute it
    DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(Plan.class);
    Criterion criterionMessageId = RestrictionsFactoryUtil.eq("childGroupId", groupId);
    dynamicQuery.add(criterionMessageId);
        
    List<Object> plan = PlanLocalServiceUtil.dynamicQuery(dynamicQuery);
    if (plan.size() != 1) {
        throw new NoSuchPlanException("Can't find plan associated with group " + groupId);
    }
        
    return (Plan) plan.get(0);
    }
    */

    public static PlanType getDefaultPlanType() throws NoSuchPlanTypeException, SystemException {
        return PlanTypeLocalServiceUtil.getDefaultPlanType();
    }

    public static PlanColumnSettings createColumnSettings(PlansUserSettings settings, Columns column)
            throws PortalException, SystemException {
        PlanColumnSettings columnSettings = PlanColumnSettingsLocalServiceUtil.createPlanColumnSettings(0L);
        columnSettings.setColumnName(String.valueOf(column));
        columnSettings.setPlanUserSettingsId(settings.getPlanUserSettingsId());

        PlanType planType = PlanTypeLocalServiceUtil.getPlanType(settings.getPlanTypeId());
        List<PlanTypeColumn> xyz = PlanTypeLocalServiceUtil.getColumns(planType);

        for (PlanTypeColumn typeColumn : PlanTypeLocalServiceUtil.getColumns(planType)) {
            if (columnSettings.getColumnName().equals(typeColumn.getColumnName())) {
                columnSettings.setVisible(typeColumn.getVisibleByDefault());
                //settings.addColumnSettings(columnSettings);
                return columnSettings;
            }
        }

        // if we have reached this place then there is no definition of requested column
        throw new PortalException("Can't find definition of column " + column.toString() + " in plan type with id "
                + planType.getPlanTypeId());
    }
}