001    /**
002     * Copyright 2005-2013 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     */
016    package org.kuali.rice.kew.actions;
017    
018    import org.kuali.rice.kew.actionitem.ActionItem;
019    import org.kuali.rice.kew.actionlist.service.ActionListService;
020    import org.kuali.rice.kew.actionrequest.ActionRequestValue;
021    import org.kuali.rice.kew.actiontaken.ActionTakenValue;
022    import org.kuali.rice.kew.api.exception.InvalidActionTakenException;
023    import org.kuali.rice.kew.routeheader.DocumentRouteHeaderValue;
024    import org.kuali.rice.kew.service.KEWServiceLocator;
025    import org.kuali.rice.kew.api.KewApiConstants;
026    import org.kuali.rice.kim.api.identity.principal.PrincipalContract;
027    import org.kuali.rice.kim.api.services.KimApiServiceLocator;
028    
029    import java.util.ArrayList;
030    import java.util.Collection;
031    import java.util.List;
032    
033    
034    
035    /**
036     * Removes all workgroup action items for a document from everyone's action list except the person
037     * who took the workgroup authority
038     *
039     * @author Kuali Rice Team (rice.collab@kuali.org)
040     *
041     */
042    public class TakeWorkgroupAuthority extends ActionTakenEvent {
043        
044        private String groupId;
045        
046        /**
047         * @param routeHeader
048         * @param principal
049         */
050        public TakeWorkgroupAuthority(DocumentRouteHeaderValue routeHeader, PrincipalContract principal) {
051            super(KewApiConstants.ACTION_TAKEN_TAKE_WORKGROUP_AUTHORITY_CD, routeHeader, principal);
052        }
053    
054        /**
055         * @param routeHeader
056         * @param principal
057         * @param annotation
058         * @param groupId
059         */
060        public TakeWorkgroupAuthority(DocumentRouteHeaderValue routeHeader, PrincipalContract principal, String annotation, String groupId) {
061            super(KewApiConstants.ACTION_TAKEN_TAKE_WORKGROUP_AUTHORITY_CD, routeHeader, principal, annotation);
062            this.groupId = groupId;
063        }
064    
065        /* (non-Javadoc)
066         * @see org.kuali.rice.kew.actions.ActionTakenEvent#validateActionRules()
067         */
068        @Override
069        public String validateActionRules() {
070            if  ( (groupId != null) && (!KimApiServiceLocator.getGroupService().isMemberOfGroup(getPrincipal().getPrincipalId(), groupId))) {
071                return (getPrincipal().getPrincipalName() + " not a member of workgroup " + groupId);
072            }
073            return "";
074        }
075    
076        @Override
077        public String validateActionRules(List<ActionRequestValue> actionRequests) {
078            return validateActionRules();
079        }
080        
081        public void recordAction() throws InvalidActionTakenException {
082    
083            String errorMessage = validateActionRules();
084            if (!org.apache.commons.lang.StringUtils.isEmpty(errorMessage)) {
085                throw new InvalidActionTakenException(errorMessage);
086            }
087    //        if (! workgroup.hasMember(getUser())) {
088    //            throw new InvalidActionTakenException(getUser().getPrincipalName() + " not a member of workgroup " + workgroup.getDisplayName());
089    //        }
090    
091            List<ActionRequestValue> documentRequests = getActionRequestService().findPendingByDoc(getDocumentId());
092            List<ActionRequestValue> workgroupRequests = new ArrayList<ActionRequestValue>();
093            for (ActionRequestValue actionRequest : documentRequests)
094            {
095                if (actionRequest.isGroupRequest() && actionRequest.getGroup().getId().equals(groupId))
096                {
097                    workgroupRequests.add(actionRequest);
098                }
099            }
100    
101            ActionTakenValue actionTaken = saveActionTaken(findDelegatorForActionRequests(workgroupRequests));
102            notifyActionTaken(actionTaken);
103    
104            ActionListService actionListService = KEWServiceLocator.getActionListService();
105            Collection<ActionItem> actionItems = actionListService.findByDocumentId(getDocumentId());
106            for (ActionItem actionItem : actionItems)
107            {
108                //delete all requests for this workgroup on this document not to this user
109                if (actionItem.isWorkgroupItem() && actionItem.getGroupId().equals(groupId) &&
110                        !actionItem.getPrincipalId().equals(getPrincipal().getPrincipalId()))
111                {
112                    actionListService.deleteActionItem(actionItem);
113                }
114            }
115        }
116    }