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.superuser.web;
017    
018    import org.apache.commons.lang.ArrayUtils;
019    import org.apache.struts.action.ActionMapping;
020    import org.kuali.rice.core.api.util.ConcreteKeyValue;
021    import org.kuali.rice.core.api.util.KeyValue;
022    import org.kuali.rice.kew.actionrequest.ActionRequestValue;
023    import org.kuali.rice.kew.api.KewApiServiceLocator;
024    import org.kuali.rice.kew.doctype.bo.DocumentType;
025    import org.kuali.rice.kew.routeheader.DocumentRouteHeaderValue;
026    import org.kuali.rice.kew.service.KEWServiceLocator;
027    import org.kuali.rice.kew.web.KewRoutingKualiForm;
028    
029    import javax.servlet.http.HttpServletRequest;
030    import java.util.ArrayList;
031    import java.util.Arrays;
032    import java.util.HashSet;
033    import java.util.List;
034    import java.util.Set;
035    
036    
037    /**
038     * A Struts ActionForm for the {@link SuperUserAction}.
039     *
040     * @author Kuali Rice Team (rice.collab@kuali.org)
041     */
042    public class SuperUserForm extends KewRoutingKualiForm {
043    
044        private static final long serialVersionUID = 982228198266403397L;
045        private String documentId;
046        private String docHandlerUrl;
047        private Integer routeLevel;
048        private List<String> futureNodeNames = new ArrayList<String>();
049        private String destNodeName;
050        private String returnDestNodeName;
051        private String action;
052        private List<ActionRequestValue> actionRequests = new ArrayList<ActionRequestValue>();
053        private String actionTakenActionRequestId;
054        private String actionTakenNetworkId;
055        private String actionTakenWorkGroupId;
056        private String actionTakenRecipientCode;
057        private boolean authorized;
058        private boolean blanketApprove;
059        private String methodToCall = "";
060        private boolean runPostProcessorLogic = true;
061        private String[] actionRequestRunPostProcessorCheck;
062    
063        private String lookupableImplServiceName;
064        private String lookupType;
065    
066        private DocumentRouteHeaderValue routeHeader;
067    
068        // KULRICE-3035: Added the ability to store the doc search's "returnLocation" property so that the superuser form can create a proper "cancel" button.
069        private String returnLocation;
070        
071        @Override
072            public String getMethodToCall() {
073            return methodToCall;
074        }
075        @Override
076            public void setMethodToCall(String methodToCall) {
077            this.methodToCall = methodToCall;
078        }
079    
080        public boolean isBlanketApprove() {
081            return blanketApprove;
082        }
083    
084        public void setBlanketApprove(boolean blanketApprove) {
085            this.blanketApprove = blanketApprove;
086        }
087    
088        public DocumentRouteHeaderValue getRouteHeader() {
089            return routeHeader;
090        }
091    
092        public void setRouteHeader(DocumentRouteHeaderValue routeHeader) {
093            this.routeHeader = routeHeader;
094        }
095    
096        public String getDocumentId() {
097            return documentId;
098        }
099    
100        public void setDocumentId(String documentId) {
101            this.documentId = documentId;
102        }
103    
104        public String getDocHandlerUrl() {
105            return docHandlerUrl;
106        }
107    
108        public void setDocHandlerUrl(String docHandlerUrl) {
109            this.docHandlerUrl = docHandlerUrl;
110        }
111    
112        public Integer getRouteLevel() {
113            return routeLevel;
114        }
115    
116        public void setRouteLevel(Integer routeLevel) {
117            this.routeLevel = routeLevel;
118        }
119    
120        public String getAction() {
121            return action;
122        }
123    
124        public void setAction(String action) {
125            this.action = action;
126        }
127    
128        public List<ActionRequestValue> getActionRequests() {
129            return actionRequests;
130        }
131    
132        public void setActionRequests(List<ActionRequestValue> actionRequests) {
133            this.actionRequests = actionRequests;
134        }
135    
136        public String getActionTakenActionRequestId() {
137            return actionTakenActionRequestId;
138        }
139    
140        public void setActionTakenActionRequestId(String actionTakenActionRequestId) {
141            this.actionTakenActionRequestId = actionTakenActionRequestId;
142        }
143    
144        public String getActionTakenNetworkId() {
145            return actionTakenNetworkId;
146        }
147    
148        public void setActionTakenNetworkId(String actionTakenNetworkId) {
149            this.actionTakenNetworkId = actionTakenNetworkId;
150        }
151    
152        public String getActionTakenWorkGroupId() {
153            return actionTakenWorkGroupId;
154        }
155    
156        public void setActionTakenWorkGroupId(String actionTakenWorkGroupId) {
157            this.actionTakenWorkGroupId = actionTakenWorkGroupId;
158        }
159    
160        /*public List getRouteLevels() {
161            return routeLevels;
162        }
163    
164        public void setRouteLevels(List routeLevels) {
165            this.routeLevels = routeLevels;
166        }*/
167    
168        public boolean isAuthorized() {
169            return authorized;
170        }
171    
172        public void setAuthorized(boolean authorized) {
173            this.authorized = authorized;
174        }
175    
176        @Override
177            public void reset(ActionMapping mapping, HttpServletRequest request){
178            this.futureNodeNames = new ArrayList<String>();
179        }
180    
181        public String getActionTakenRecipientCode() {
182            return actionTakenRecipientCode;
183        }
184    
185        public void setActionTakenRecipientCode(String actionTakenRecipientCode) {
186            this.actionTakenRecipientCode = actionTakenRecipientCode;
187        }
188    
189        public boolean isSUDocument() {
190            if (routeHeader.isStateInitiated() || routeHeader.isStateSaved()) {
191                return false;
192            }
193            return true;
194        }
195    
196        public boolean isStateAllowsAction() {
197            if ( routeHeader.isProcessed() || routeHeader.isDisaproved() ) {
198                return false;
199            }
200            return true;
201        }
202    
203        public boolean isSuperUserFinalApproveAllowed() {
204            return getDocumentType().getAllowSuperUserFinalApprovalPolicy().getPolicyValue().booleanValue();
205        }
206    
207        public boolean isSuperUserFinalApproveAllowedForActionRequest() {
208            if (!isSuperUserFinalApproveAllowed() &&
209                KEWServiceLocator.getRouteNodeService().findFutureNodeNames(getRouteHeader().getDocumentId()).isEmpty()) {
210                return false;
211            } else {
212                return true;
213            }
214        }
215    
216        public DocumentType getDocumentType() {
217            return getRouteHeader().getDocumentType();
218        }
219    
220        public Set<KeyValue> getPreviousNodes() throws Exception {
221            List<String> nodeNames = KewApiServiceLocator.getWorkflowDocumentService().getPreviousRouteNodeNames(routeHeader.getDocumentId());
222            Set<KeyValue> previousNodes = new HashSet<KeyValue>();
223            for (String nodeName : nodeNames) {
224                            previousNodes.add(new ConcreteKeyValue(nodeName, nodeName));
225                    }
226            return previousNodes;
227        }
228    
229        public String getDestNodeName() {
230            return destNodeName;
231        }
232        public void setDestNodeName(String previousNodeName) {
233            this.destNodeName = previousNodeName;
234        }
235        public List<String> getFutureNodeNames() {
236            return futureNodeNames;
237        }
238        public void setFutureNodeNames(List<String> futureNodeNames) {
239            this.futureNodeNames = futureNodeNames;
240        }
241        public String getReturnDestNodeName() {
242            return returnDestNodeName;
243        }
244        public void setReturnDestNodeName(String returnDestNodeName) {
245            this.returnDestNodeName = returnDestNodeName;
246        }
247        public String getLookupableImplServiceName() {
248            return lookupableImplServiceName;
249        }
250        public void setLookupableImplServiceName(String lookupableImplServiceName) {
251            this.lookupableImplServiceName = lookupableImplServiceName;
252        }
253        public String getLookupType() {
254            return lookupType;
255        }
256        public void setLookupType(String lookupType) {
257            this.lookupType = lookupType;
258        }
259        public boolean isRunPostProcessorLogic() {
260            return this.runPostProcessorLogic;
261        }
262        public void setRunPostProcessorLogic(boolean runPostProcessorLogic) {
263            this.runPostProcessorLogic = runPostProcessorLogic;
264        }
265        public String[] getActionRequestRunPostProcessorCheck() {
266            return this.actionRequestRunPostProcessorCheck;
267        }
268        public void setActionRequestRunPostProcessorCheck(String[] actionRequestRunPostProcessorCheck) {
269            this.actionRequestRunPostProcessorCheck = actionRequestRunPostProcessorCheck;
270        }
271        public Boolean getActionRequestPostProcessorCheck(String actionRequestId) {
272            return ArrayUtils.contains(getActionRequestRunPostProcessorCheck(), actionRequestId);
273        }
274        public List<String> getActionRequestPostProcessorCheck() {
275            if (getActionRequestRunPostProcessorCheck() == null) {
276                return null;
277            }
278            return Arrays.asList(getActionRequestRunPostProcessorCheck());
279        }
280    
281        public String getReturnLocation() {
282            return returnLocation;
283        }
284        public void setReturnLocation(String returnLocation) {
285            this.returnLocation = returnLocation;
286        }
287        public boolean getActionRequestPostProcessorDisplayCheck(){
288            return getDocumentType().getSuPostprocessorOverridePolicy().getPolicyValue().booleanValue();
289        }
290    }