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.actiontaken.service.impl;
017
018import org.apache.commons.lang.StringUtils;
019import org.kuali.rice.kew.actionrequest.ActionRequestValue;
020import org.kuali.rice.kew.actiontaken.ActionTakenValue;
021import org.kuali.rice.kew.actiontaken.dao.ActionTakenDAO;
022import org.kuali.rice.kew.actiontaken.service.ActionTakenService;
023import org.kuali.rice.kew.api.action.ActionType;
024import org.kuali.rice.kew.exception.WorkflowServiceErrorException;
025import org.kuali.rice.kew.exception.WorkflowServiceErrorImpl;
026import org.kuali.rice.kew.routeheader.service.RouteHeaderService;
027import org.kuali.rice.kew.service.KEWServiceLocator;
028import org.kuali.rice.kew.api.KewApiConstants;
029import org.kuali.rice.kim.api.group.GroupService;
030import org.kuali.rice.kim.api.identity.principal.Principal;
031import org.kuali.rice.kim.api.services.KimApiServiceLocator;
032
033import java.sql.Timestamp;
034import java.util.ArrayList;
035import java.util.Collection;
036import java.util.List;
037
038
039
040/**
041 * Default implementation of the {@link ActionTakenService}.
042 *
043 * @author Kuali Rice Team (rice.collab@kuali.org)
044 */
045public class ActionTakenServiceImpl implements ActionTakenService {
046    private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(ActionTakenServiceImpl.class);
047    private ActionTakenDAO actionTakenDAO;
048
049    public ActionTakenValue load(String id) {
050        return getActionTakenDAO().load(id);
051    }
052
053    public ActionTakenValue findByActionTakenId(String actionTakenId) {
054        return getActionTakenDAO().findByActionTakenId(actionTakenId);
055    }
056
057    public ActionTakenValue getPreviousAction(ActionRequestValue actionRequest) {
058        return getPreviousAction(actionRequest, null);
059    }
060
061    public ActionTakenValue getPreviousAction(ActionRequestValue actionRequest, List<ActionTakenValue> simulatedActionsTaken)
062    {
063        GroupService ims = KimApiServiceLocator.getGroupService();
064        ActionTakenValue foundActionTaken = null;
065        List<String> principalIds = new ArrayList<String>();
066        if (actionRequest.isGroupRequest()) {
067            principalIds.addAll( ims.getMemberPrincipalIds(actionRequest.getGroup().getId()));
068        } else if (actionRequest.isUserRequest()) {
069            principalIds.add(actionRequest.getPrincipalId());
070        }
071
072        for (String id : principalIds)
073        {
074            List<ActionTakenValue> actionsTakenByUser =
075                getActionTakenDAO().findByDocumentIdWorkflowId(actionRequest.getDocumentId(), id );
076            if (simulatedActionsTaken != null) {
077                for (ActionTakenValue simulatedAction : simulatedActionsTaken)
078                {
079                    if (id.equals(simulatedAction.getPrincipalId()))
080                    {
081                        actionsTakenByUser.add(simulatedAction);
082                    }
083                }
084            }
085
086            for (ActionTakenValue actionTaken : actionsTakenByUser)
087            {
088                if (ActionRequestValue.compareActionCode(actionTaken.getActionTaken(),
089                        actionRequest.getActionRequested(), true) >= 0)
090                {
091                  foundActionTaken = actionTaken;
092                }
093            }
094        }
095
096        return foundActionTaken;
097    }
098
099    public Collection findByDocIdAndAction(String docId, String action) {
100        return getActionTakenDAO().findByDocIdAndAction(docId, action);
101    }
102
103    public Collection<ActionTakenValue> findByDocumentId(String documentId) {
104        return getActionTakenDAO().findByDocumentId(documentId);
105    }
106
107    public List<ActionTakenValue> findByDocumentIdWorkflowId(String documentId, String workflowId) {
108        return getActionTakenDAO().findByDocumentIdWorkflowId(documentId, workflowId);
109    }
110
111    public Collection getActionsTaken(String documentId) {
112        return getActionTakenDAO().findByDocumentId(documentId);
113    }
114
115    public List findByDocumentIdIgnoreCurrentInd(String documentId) {
116        return getActionTakenDAO().findByDocumentIdIgnoreCurrentInd(documentId);
117    }
118
119    public void saveActionTaken(ActionTakenValue actionTaken) {
120        this.getActionTakenDAO().saveActionTaken(actionTaken);
121    }
122
123    public void delete(ActionTakenValue actionTaken) {
124        getActionTakenDAO().deleteActionTaken(actionTaken);
125    }
126
127    public ActionTakenDAO getActionTakenDAO() {
128        return actionTakenDAO;
129    }
130
131    public void setActionTakenDAO(ActionTakenDAO actionTakenDAO) {
132        this.actionTakenDAO = actionTakenDAO;
133    }
134
135    public void deleteByDocumentId(String documentId){
136        actionTakenDAO.deleteByDocumentId(documentId);
137    }
138
139    public void validateActionTaken(ActionTakenValue actionTaken){
140        LOG.debug("Enter validateActionTaken(..)");
141        List<WorkflowServiceErrorImpl> errors = new ArrayList<WorkflowServiceErrorImpl>();
142
143        String documentId = actionTaken.getDocumentId();
144        if(documentId == null){
145            errors.add(new WorkflowServiceErrorImpl("ActionTaken documentid null.", "actiontaken.documentid.empty", actionTaken.getActionTakenId().toString()));
146        } else if(getRouteHeaderService().getRouteHeader(documentId) == null){
147            errors.add(new WorkflowServiceErrorImpl("ActionTaken documentid invalid.", "actiontaken.documentid.invalid", actionTaken.getActionTakenId().toString()));
148        }
149
150        String principalId = actionTaken.getPrincipalId();
151        if(StringUtils.isBlank(principalId)){
152            errors.add(new WorkflowServiceErrorImpl("ActionTaken personid null.", "actiontaken.personid.empty", actionTaken.getActionTakenId().toString()));
153        } else {
154                Principal principal = KimApiServiceLocator.getIdentityService().getPrincipal(principalId);
155                if (principal == null) {
156                errors.add(new WorkflowServiceErrorImpl("ActionTaken personid invalid.", "actiontaken.personid.invalid", actionTaken.getActionTakenId().toString()));
157            }
158        }
159        String actionTakenCd = actionTaken.getActionTaken();
160        if(actionTakenCd == null || actionTakenCd.trim().equals("")){
161            errors.add(new WorkflowServiceErrorImpl("ActionTaken cd null.", "actiontaken.actiontaken.empty", actionTaken.getActionTakenId().toString()));
162        } else if(!KewApiConstants.ACTION_TAKEN_CD.containsKey(actionTakenCd)){
163            errors.add(new WorkflowServiceErrorImpl("ActionTaken invalid.", "actiontaken.actiontaken.invalid", actionTaken.getActionTakenId().toString()));
164        }
165        if(actionTaken.getActionDate() == null){
166            errors.add(new WorkflowServiceErrorImpl("ActionTaken actiondate null.", "actiontaken.actiondate.empty", actionTaken.getActionTakenId().toString()));
167        }
168
169        if(actionTaken.getDocVersion() == null){
170            errors.add(new WorkflowServiceErrorImpl("ActionTaken docversion null.", "actiontaken.docverion.empty", actionTaken.getActionTakenId().toString()));
171        }
172        LOG.debug("Exit validateActionRequest(..) ");
173        if (!errors.isEmpty()) {
174            throw new WorkflowServiceErrorException("ActionRequest Validation Error", errors);
175        }
176    }
177
178    public boolean hasUserTakenAction(String principalId, String documentId) {
179        return getActionTakenDAO().hasUserTakenAction(principalId, documentId);
180    }
181
182    private RouteHeaderService getRouteHeaderService() {
183        return (RouteHeaderService) KEWServiceLocator.getService(KEWServiceLocator.DOC_ROUTE_HEADER_SRV);
184    }
185
186    public Timestamp getLastApprovedDate(String documentId)
187    {
188        return getActionTakenDAO().getLastActionTakenDate(documentId, ActionType.APPROVE);
189    }
190
191}