001/**
002 * Copyright 2005-2016 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.kuali.rice.kew.actionlist.web;
017
018import org.apache.commons.lang.StringUtils;
019import org.apache.struts.action.ActionForm;
020import org.apache.struts.action.ActionForward;
021import org.apache.struts.action.ActionMapping;
022import org.kuali.rice.core.api.util.ConcreteKeyValue;
023import org.kuali.rice.core.api.util.KeyValue;
024import org.kuali.rice.kew.actionlist.ActionListFilter;
025import org.kuali.rice.kew.actionlist.service.ActionListService;
026import org.kuali.rice.kew.api.KewApiServiceLocator;
027import org.kuali.rice.kew.api.preferences.Preferences;
028import org.kuali.rice.kew.api.preferences.PreferencesService;
029import org.kuali.rice.kew.service.KEWServiceLocator;
030import org.kuali.rice.kew.api.KewApiConstants;
031import org.kuali.rice.kim.api.group.Group;
032import org.kuali.rice.kim.api.services.KimApiServiceLocator;
033import org.kuali.rice.kns.web.struts.action.KualiAction;
034import org.kuali.rice.krad.UserSession;
035import org.kuali.rice.krad.util.GlobalVariables;
036
037import javax.servlet.http.HttpServletRequest;
038import javax.servlet.http.HttpServletResponse;
039import java.util.ArrayList;
040import java.util.Collections;
041import java.util.List;
042
043
044/**
045 * Action for Action List Filter page.
046 *
047 * @author Kuali Rice Team (rice.collab@kuali.org)
048 */
049public class ActionListFilterAction extends KualiAction {
050
051    @Override
052    public ActionForward execute(ActionMapping mapping, ActionForm form,
053                                 HttpServletRequest request, HttpServletResponse response)
054            throws Exception {
055        request.setAttribute("Constants", getServlet().getServletContext().getAttribute("KewApiConstants"));
056        request.setAttribute("preferences", this.getUserSession().retrieveObject(KewApiConstants.PREFERENCES));
057        initForm(request, form);
058        return super.execute(mapping, form, request, response);
059    }
060
061    /**
062     * This overridden method ...
063     *
064     * @see org.kuali.rice.krad.web.struts.action.KualiAction#getReturnLocation(javax.servlet.http.HttpServletRequest, org.apache.struts.action.ActionMapping)
065     */
066    @Override
067    protected String getReturnLocation(HttpServletRequest request,
068                                       ActionMapping mapping)
069    {
070        String mappingPath = mapping.getPath();
071        String basePath = getApplicationBaseUrl();
072        return basePath + KewApiConstants.WEBAPP_DIRECTORY + mappingPath + ".do";
073    }
074
075    public ActionForward start(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
076        ActionListFilterForm filterForm = (ActionListFilterForm) form;
077        final UserSession uSession = getUserSession();
078        final ActionListFilter filter = (ActionListFilter) uSession.retrieveObject(KewApiConstants.ACTION_LIST_FILTER_ATTR_NAME);
079        if (filter != null) {
080            if (filterForm.getDocTypeFullName() != null && ! "".equals(filterForm.getDocTypeFullName())) {
081                filter.setDocumentType(filterForm.getDocTypeFullName());
082                uSession.addObject(KewApiConstants.ACTION_LIST_FILTER_ATTR_NAME, filter);
083                filterForm.setFilter(filter);
084            } else {
085                filterForm.setFilter(filter);
086                filterForm.setDocTypeFullName(filter.getDocumentType());
087            }
088        }
089        return mapping.findForward("viewFilter");
090    }
091
092    public ActionForward filter(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
093        ActionListFilterForm filterForm = (ActionListFilterForm) form;
094        //validate the filter through the actionitem/actionlist service (I'm thinking actionlistservice)
095        final UserSession uSession = getUserSession();
096        ActionListFilter alFilter = filterForm.getLoadedFilter();
097        if (StringUtils.isNotBlank(alFilter.getDelegatorId()) && !KewApiConstants.DELEGATION_DEFAULT.equals(alFilter.getDelegatorId()) &&
098                StringUtils.isNotBlank(alFilter.getPrimaryDelegateId()) && !KewApiConstants.PRIMARY_DELEGATION_DEFAULT.equals(alFilter.getPrimaryDelegateId())){
099            // If the primary and secondary delegation drop-downs are both visible and are both set to non-default values,
100            // then reset the secondary delegation drop-down to its default value.
101            alFilter.setDelegatorId(KewApiConstants.DELEGATION_DEFAULT);
102        }
103        uSession.addObject(KewApiConstants.ACTION_LIST_FILTER_ATTR_NAME, alFilter);
104        if (GlobalVariables.getMessageMap().hasNoErrors()) {
105            request.getSession().setAttribute(KewApiConstants.REQUERY_ACTION_LIST_KEY, "true");
106            return mapping.findForward("viewActionList");
107        }
108        return mapping.findForward("viewFilter");    
109    }
110
111    public ActionForward clear(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
112        ActionListFilterForm filterForm = (ActionListFilterForm) form;
113        filterForm.setFilter(new ActionListFilter());
114        filterForm.setCreateDateFrom("");
115        filterForm.setCreateDateTo("");
116        filterForm.setLastAssignedDateFrom("");
117        filterForm.setLastAssignedDateTo("");
118        filterForm.setDocTypeFullName("");
119        UserSession session = getUserSession();
120        session.removeObject(KewApiConstants.ACTION_LIST_FILTER_ATTR_NAME);
121        return mapping.findForward("viewFilter");
122    }
123
124    public void initForm(HttpServletRequest request, ActionForm form) throws Exception {
125        ActionListFilterForm filterForm = (ActionListFilterForm) form;
126        filterForm.setUserWorkgroups(getUserWorkgroupsDropDownList(getUserSession().getPrincipalId()));
127        PreferencesService prefSrv = KewApiServiceLocator.getPreferencesService();
128        Preferences preferences = prefSrv.getPreferences(getUserSession().getPrincipalId());
129        request.setAttribute("preferences", preferences);
130        ActionListService actionListSrv = KEWServiceLocator.getActionListService();
131        request.setAttribute("delegators", ActionListUtil.getWebFriendlyRecipients(actionListSrv.findUserSecondaryDelegators(getUserSession().getPrincipalId())));
132        request.setAttribute("primaryDelegates", ActionListUtil.getWebFriendlyRecipients(actionListSrv.findUserPrimaryDelegations(getUserSession().getPrincipalId())));
133        if (! filterForm.getMethodToCall().equalsIgnoreCase("clear")) {
134            filterForm.validateDates();
135        }
136    }
137
138    private List<? extends KeyValue> getUserWorkgroupsDropDownList(String principalId) {
139        List<String> userWorkgroups =
140                KimApiServiceLocator.getGroupService().getGroupIdsByPrincipalId(principalId);
141
142        //note that userWorkgroups is unmodifiable so we need to create a new list that we can sort
143        List<String> userGroupsToSort = new ArrayList<String>(userWorkgroups);
144
145        List<KeyValue> sortedUserWorkgroups = new ArrayList<KeyValue>();
146        KeyValue keyValue = null;
147        keyValue = new ConcreteKeyValue(KewApiConstants.NO_FILTERING, KewApiConstants.NO_FILTERING);
148        sortedUserWorkgroups.add(keyValue);
149        if (userGroupsToSort != null && userGroupsToSort.size() > 0) {
150            Collections.sort(userGroupsToSort);
151
152            Group group;
153            for (String groupId : userGroupsToSort)
154            {
155                group = KimApiServiceLocator.getGroupService().getGroup(groupId);
156                keyValue = new ConcreteKeyValue(groupId, group.getName());
157                sortedUserWorkgroups.add(keyValue);
158            }
159        }
160        return sortedUserWorkgroups;
161    }
162
163    private UserSession getUserSession(){
164        return GlobalVariables.getUserSession();
165    }
166
167}
168