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.edl.framework.util; 017 018 import org.apache.commons.lang.StringUtils; 019 import org.kuali.rice.core.api.exception.RiceRuntimeException; 020 import org.kuali.rice.kew.api.KewApiServiceLocator; 021 import org.kuali.rice.kew.api.WorkflowRuntimeException; 022 import org.kuali.rice.kew.api.document.node.RouteNodeInstance; 023 import org.kuali.rice.kew.api.exception.WorkflowException; 024 import org.kuali.rice.kim.api.group.Group; 025 import org.kuali.rice.kim.api.identity.Person; 026 import org.kuali.rice.krad.UserSession; 027 import org.kuali.rice.kim.api.services.KimApiServiceLocator; 028 import org.kuali.rice.krad.document.authorization.PessimisticLock; 029 import org.kuali.rice.krad.service.KRADServiceLocatorWeb; 030 import org.kuali.rice.krad.service.PessimisticLockService; 031 import org.kuali.rice.krad.util.GlobalVariables; 032 033 import java.util.List; 034 035 /** 036 * A collection of handy workflow queries to be used from style sheets. 037 * 038 * @author Kuali Rice Team (rice.collab@kuali.org) 039 * 040 */ 041 public class EDLFunctions { 042 043 044 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(EDLFunctions.class); 045 046 public static boolean isUserInitiator(String id) throws WorkflowException { 047 boolean initiator = false; 048 UserSession userSession = GlobalVariables.getUserSession(); 049 if (userSession != null) { 050 try { 051 String documentId = id.trim(); 052 if (userSession.getPrincipalId().equals(KewApiServiceLocator.getWorkflowDocumentService().getDocument(documentId).getInitiatorPrincipalId())) { 053 initiator = true; 054 } 055 } catch (Exception e) { 056 LOG.debug("Exception encountered trying to determine if user is the document initiator:" + e ); 057 } 058 } 059 return initiator; 060 } 061 062 public static boolean isUserRouteLogAuthenticated(String documentId) { 063 boolean authenticated=false; 064 UserSession userSession=GlobalVariables.getUserSession(); 065 if(userSession!=null){ 066 String principalId = userSession.getPrincipalId(); 067 try { 068 authenticated = KewApiServiceLocator.getWorkflowDocumentActionsService().isUserInRouteLog(documentId, 069 principalId, true); 070 } catch (NumberFormatException e) { 071 LOG.debug("Invalid format documentId (should be LONG): " + documentId); 072 } catch (RiceRuntimeException e) { 073 LOG.error("Runtime Exception checking if user is route log authenticated: userId: " + principalId + ";documentId: " + documentId); 074 075 } 076 } 077 078 return authenticated; 079 } 080 081 public static boolean isPrincipalIdAuthenticated(String principalId) { 082 return GlobalVariables.getUserSession().getPrincipalId().equals(principalId); 083 } 084 085 public static boolean isPrincipalNameAuthenticated(String principalName) { 086 return GlobalVariables.getUserSession().getPrincipalName().equals(principalName); 087 } 088 089 public static boolean isEmployeeIdAuthenticated(String employeeId) { 090 return GlobalVariables.getUserSession().getPerson().getEmployeeId().equals(employeeId); 091 } 092 093 public static Person getAuthenticatedPerson(){ 094 UserSession userSession=GlobalVariables.getUserSession(); 095 Person user = userSession.getPerson(); 096 return user; 097 } 098 099 public static String getUserId() { 100 return getAuthenticatedPerson().getPrincipalId(); 101 } 102 103 public static String getLastName() { 104 return getAuthenticatedPerson().getLastName(); 105 } 106 107 public static String getGivenName() { 108 return getAuthenticatedPerson().getFirstName(); 109 } 110 111 public static String getEmailAddress() { 112 return getAuthenticatedPerson().getEmailAddress(); 113 } 114 115 public static String getCampus() { 116 return getAuthenticatedPerson().getCampusCode(); 117 } 118 119 public static String getPrimaryDeptCd() { 120 return getAuthenticatedPerson().getPrimaryDepartmentCode(); 121 } 122 123 public static String getEmpTypCd() { 124 return getAuthenticatedPerson().getEmployeeTypeCode(); 125 } 126 127 public static String getEmpPhoneNumber() { 128 return getAuthenticatedPerson().getPhoneNumber(); 129 } 130 131 public static String getCurrentNodeName(String documentId){ 132 List<RouteNodeInstance> routeNodeInstances = null; 133 134 routeNodeInstances = KewApiServiceLocator.getWorkflowDocumentService().getCurrentRouteNodeInstances(documentId); 135 for (RouteNodeInstance currentNode : routeNodeInstances) { 136 return currentNode.getName(); 137 } 138 return null; 139 } 140 141 public static boolean isNodeInPreviousNodeList(String nodeName, String id) { 142 LOG.debug("nodeName came in as: " + nodeName); 143 LOG.debug("id came in as: " + id); 144 //get list of previous node names 145 List<String> previousNodeNames; 146 try { 147 previousNodeNames = KewApiServiceLocator.getWorkflowDocumentService().getPreviousRouteNodeNames(id); 148 } catch (Exception e) { 149 throw new WorkflowRuntimeException("Problem generating list of previous node names for documentID = " + id, e); 150 } 151 //see if node name is in the list of previous node names 152 for (String previousNodeName : previousNodeNames) { 153 if (previousNodeName.equals(nodeName)) { 154 return true; 155 } 156 } 157 return false; 158 } 159 160 public static String escapeJavascript(String value) { 161 return value.replace("\\", "\\\\").replace("\"", "\\\""); 162 } 163 164 public static boolean isNodeBetween(String firstNodeName, String lastNodeName, String id) { 165 if (isNodeInPreviousNodeList(firstNodeName, id)) { 166 if (isNodeInPreviousNodeList(lastNodeName, id)) { 167 return false; 168 }else { 169 return true; 170 } 171 } else { 172 return false; 173 } 174 } 175 176 public static boolean isAtNode(String documentId, String nodeName) throws Exception { 177 List<RouteNodeInstance> activeNodeInstances = KewApiServiceLocator.getWorkflowDocumentService().getActiveRouteNodeInstances(documentId); 178 for (RouteNodeInstance nodeInstance : activeNodeInstances) { 179 if (nodeInstance.getName().equals(nodeName)) { 180 return true; 181 } 182 } 183 return false; 184 } 185 186 public static boolean hasActiveNode(String documentId) throws Exception { 187 List<RouteNodeInstance> activeNodeInstances = KewApiServiceLocator.getWorkflowDocumentService().getActiveRouteNodeInstances(documentId); 188 if (!activeNodeInstances.isEmpty()) { 189 return true; 190 } 191 return false; 192 } 193 194 public static String getAuthenticationId() { 195 UserSession userSession=GlobalVariables.getUserSession(); 196 return userSession.getPrincipalName(); 197 198 } 199 200 public static boolean isUserInGroup(String namespace, String groupName){ 201 boolean isUserInGroup=false; 202 if(!StringUtils.isEmpty(groupName)){ 203 String principalId = getUserId(); 204 try{ 205 isUserInGroup = isMemberOfGroupWithName(namespace, groupName, principalId); 206 }catch(Exception e){ 207 LOG.error("Exception encountered trying to determine if user is member of a group: userId: " + principalId + ";groupNamespace/Name: " 208 + namespace + "/" + groupName + " resulted in error:" + e); 209 } 210 } 211 return isUserInGroup; 212 } 213 214 private static boolean isMemberOfGroupWithName(String namespace, String groupName, String principalId) { 215 for (Group group : KimApiServiceLocator.getGroupService().getGroupsByPrincipalId(principalId)) { 216 if (StringUtils.equals(namespace, group.getNamespaceCode()) && StringUtils.equals(groupName, group.getName())) { 217 return true; 218 } 219 } 220 return false; 221 } 222 223 public static String createDocumentLock(String documentId) { 224 PessimisticLockService lockService = KRADServiceLocatorWeb.getPessimisticLockService(); 225 PessimisticLock lock = lockService.generateNewLock(documentId); 226 Long lockLong = lock.getId(); 227 228 return lockLong.toString(); 229 } 230 231 public static void removeDocumentLocksByUser(String documentId) { 232 try { 233 PessimisticLockService lockService = KRADServiceLocatorWeb.getPessimisticLockService(); 234 List<PessimisticLock> pessimisticLocks = lockService.getPessimisticLocksForDocument(documentId); 235 lockService.releaseAllLocksForUser(pessimisticLocks, getAuthenticatedPerson()); 236 } catch (Exception e) { 237 LOG.error("Exception encountered trying to delete document locks:" + e ); 238 } 239 } 240 241 public static Boolean isDocumentLocked(String documentId) { 242 List<PessimisticLock> pessimisticLocks = KRADServiceLocatorWeb.getPessimisticLockService().getPessimisticLocksForDocument(documentId); 243 if (pessimisticLocks.isEmpty()) { 244 return false; 245 } else { 246 return true; 247 } 248 } 249 250 public static String getDocumentLockOwner(String documentId) { 251 List<PessimisticLock> pessimisticLocks = KRADServiceLocatorWeb.getPessimisticLockService().getPessimisticLocksForDocument(documentId); 252 if (pessimisticLocks.isEmpty()) { 253 return "NoLockOnDoc"; 254 } else { 255 if (pessimisticLocks.size() == (1)) { 256 PessimisticLock lock = pessimisticLocks.get(0); 257 return lock.getOwnedByUser().getPrincipalName(); 258 } else { 259 return "MoreThanOneLockOnDoc"; 260 } 261 } 262 } 263 }