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}