001/**
002 * Copyright 2005-2014 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.util;
017
018import org.apache.log4j.Logger;
019import org.kuali.rice.kew.api.KewApiConstants;
020import org.kuali.rice.kew.engine.node.BranchState;
021import org.kuali.rice.kew.routeheader.DocumentRouteHeaderValue;
022import org.kuali.rice.kew.service.KEWServiceLocator;
023import org.kuali.rice.kim.api.group.Group;
024import org.kuali.rice.kim.api.group.GroupService;
025import org.kuali.rice.kim.api.services.KimApiServiceLocator;
026
027import java.util.Date;
028import java.util.List;
029
030
031/**
032 * Manages document state in relation to users seeing future requests for a particular document.
033 * Construct the object with a document and a user and ask it questions in relation to future requests.
034 *
035 * @author Kuali Rice Team (rice.collab@kuali.org)
036 *
037 */
038public class FutureRequestDocumentStateManager {
039
040    private static final Logger LOG = Logger.getLogger(FutureRequestDocumentStateManager.class);
041
042    private boolean receiveFutureRequests;
043    private boolean doNotReceiveFutureRequests;
044    private boolean clearFutureRequestState;
045
046
047    public static final String FUTURE_REQUESTS_VAR_KEY = BranchState.VARIABLE_PREFIX + KewApiConstants.RECEIVE_FUTURE_REQUESTS_BRANCH_STATE_KEY;
048    public static final String DEACTIVATED_REQUESTS_VARY_KEY = BranchState.VARIABLE_PREFIX + KewApiConstants.DEACTIVATED_FUTURE_REQUESTS_BRANCH_STATE_KEY;
049
050    public FutureRequestDocumentStateManager (DocumentRouteHeaderValue document, String principalId)
051    {
052        if (document.getRootBranch() != null) {
053                for (BranchState state : document.getRootBranchState()) {
054                    if (isStateForUser(state, principalId)) {
055                        if (isReceiveFutureRequests(state)) {
056                            this.receiveFutureRequests = true;
057                        } else if (isDoNotReceiveFutureRequests(state)) {
058                            this.doNotReceiveFutureRequests = true;
059                        } else if (isClearFutureRequests(state)) {
060                            this.clearFutureRequestState = true;
061                            this.receiveFutureRequests = false;
062                            this.doNotReceiveFutureRequests = false;
063                            break;
064                        }
065                    }
066                }
067        }
068        if (this.isClearFutureRequestState()) {
069            this.clearStateFromDocument(document);
070        }
071    }
072
073    public FutureRequestDocumentStateManager (DocumentRouteHeaderValue document, Group kimGroup)
074    {
075        GroupService ims = KimApiServiceLocator.getGroupService();
076        List<String> principalIds =
077            ims.getMemberPrincipalIds(kimGroup.getId());
078
079        for (String id : principalIds)
080                {
081                    FutureRequestDocumentStateManager requestStateMngr =
082                        new FutureRequestDocumentStateManager(document, id);
083                    if (requestStateMngr.isReceiveFutureRequests()) {
084                        this.receiveFutureRequests = true;
085                    } else if (requestStateMngr.isDoNotReceiveFutureRequests()) {
086                        this.doNotReceiveFutureRequests = true;
087                    }
088                }
089    }
090
091    protected void clearStateFromDocument(DocumentRouteHeaderValue document) {
092        if (document.getRootBranchState() != null) {
093                for (BranchState state : document.getRootBranchState()) {
094                    if (state.getKey().contains(FUTURE_REQUESTS_VAR_KEY)) {
095                        String values[] = state.getKey().split(",");
096                        state.setKey(DEACTIVATED_REQUESTS_VARY_KEY + "," + values[1] + "," + new Date().toString());
097                    }
098                }
099                KEWServiceLocator.getRouteNodeService().save(document.getRootBranch());
100        }
101    }
102
103    protected boolean isStateForUser(BranchState state, String principalId)
104    {
105        String[] values = state.getKey().split(",");
106        if (values.length != 4 || ! values[0].contains(FUTURE_REQUESTS_VAR_KEY)) {
107            return false;
108        }
109        String statePrincipalId = values[1];
110        return principalId.equals(statePrincipalId);
111    }
112
113    protected boolean isReceiveFutureRequests(BranchState state) {
114        return state.getValue().equals(KewApiConstants.RECEIVE_FUTURE_REQUESTS_BRANCH_STATE_VALUE);
115    }
116
117
118    protected boolean isDoNotReceiveFutureRequests(BranchState state) {
119        return state.getValue().equals(KewApiConstants.DONT_RECEIVE_FUTURE_REQUESTS_BRANCH_STATE_VALUE);
120    }
121
122    protected boolean isClearFutureRequests(BranchState state) {
123        return state.getValue().equals(KewApiConstants.CLEAR_FUTURE_REQUESTS_BRANCH_STATE_VALUE);
124    }
125
126    public boolean isClearFutureRequestState() {
127        return this.clearFutureRequestState;
128    }
129
130    public boolean isDoNotReceiveFutureRequests() {
131        return this.doNotReceiveFutureRequests;
132    }
133
134    public boolean isReceiveFutureRequests() {
135        return this.receiveFutureRequests;
136    }
137
138}