001 /** 002 * Copyright 2004-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.hr.time.clock.location.service; 017 018 import org.apache.commons.lang.StringUtils; 019 import org.kuali.hr.time.clock.location.ClockLocationRule; 020 import org.kuali.hr.time.clock.location.ClockLocationRuleIpAddress; 021 import org.kuali.hr.time.clock.location.dao.ClockLocationDao; 022 import org.kuali.hr.time.clocklog.ClockLog; 023 import org.kuali.rice.krad.util.GlobalVariables; 024 025 import java.sql.Date; 026 import java.util.List; 027 028 public class ClockLocationRuleServiceImpl implements ClockLocationRuleService { 029 private ClockLocationDao clockLocationDao; 030 031 public ClockLocationDao getClockLocationDao() { 032 return clockLocationDao; 033 } 034 035 public void setClockLocationDao(ClockLocationDao clockLocationDao) { 036 this.clockLocationDao = clockLocationDao; 037 } 038 039 public void processClockLocationRule(ClockLog clockLog, Date asOfDate){ 040 List<ClockLocationRule> lstClockLocationRules = getClockLocationRule(clockLog.getJob().getDept(), 041 clockLog.getWorkArea(), clockLog.getPrincipalId(), clockLog.getJobNumber(), asOfDate); 042 if(lstClockLocationRules.isEmpty()){ 043 return; 044 } 045 for(ClockLocationRule clockLocationRule : lstClockLocationRules){ 046 List<ClockLocationRuleIpAddress> ruleIpAddresses = clockLocationRule.getIpAddresses(); 047 String ipAddressClock = clockLog.getIpAddress(); 048 for(ClockLocationRuleIpAddress ruleIp : ruleIpAddresses) { 049 if(compareIpAddresses(ruleIp.getIpAddress(), ipAddressClock)){ 050 clockLog.setUnapprovedIP(false); 051 return; 052 } 053 } 054 } 055 clockLog.setUnapprovedIP(true); 056 GlobalVariables.getMessageMap().putWarning("property", "ipaddress.invalid.format", clockLog.getIpAddress()); 057 058 } 059 060 private boolean compareIpAddresses(String ipAddressRule, String ipAddress){ 061 String[] rulePieces = StringUtils.split(ipAddressRule, "."); 062 int ruleMax = rulePieces.length-1; 063 064 String[] ipAddPieces = StringUtils.split(ipAddress,"."); 065 boolean match = true; 066 for(int i=0; i<ipAddPieces.length; i++){ 067 if( ((i > ruleMax) && StringUtils.equals("%", rulePieces[ruleMax])) || 068 ((i <= ruleMax) && ( StringUtils.equals(ipAddPieces[i], rulePieces[i]) || StringUtils.equals("%", rulePieces[i]) )) 069 ) 070 { 071 // we don't need to do anything. 072 } else { 073 return false; 074 } 075 } 076 return match; 077 } 078 079 @Override 080 public List<ClockLocationRule> getClockLocationRule(String dept, Long workArea,String principalId, Long jobNumber, Date asOfDate) { 081 082 // 1 : dept, wa, principal, job 083 List<ClockLocationRule> clockLocationRule = clockLocationDao.getClockLocationRule(dept, workArea,principalId,jobNumber,asOfDate); 084 if(!clockLocationRule.isEmpty()){ 085 return clockLocationRule; 086 } 087 088 // 2 : dept, wa, principal, -1 089 clockLocationRule = clockLocationDao.getClockLocationRule(dept, workArea, principalId, -1L, asOfDate); 090 if(!clockLocationRule.isEmpty()){ 091 return clockLocationRule; 092 } 093 094 // 3 : dept, wa, % , job 095 clockLocationRule = clockLocationDao.getClockLocationRule(dept, workArea, "%", jobNumber, asOfDate); 096 if(!clockLocationRule.isEmpty()){ 097 return clockLocationRule; 098 } 099 100 // 4 : dept, -1, principal, job 101 clockLocationRule = clockLocationDao.getClockLocationRule(dept, -1L, principalId, jobNumber, asOfDate); 102 if(!clockLocationRule.isEmpty()){ 103 return clockLocationRule; 104 } 105 106 // 5 : dept, wa, % , -1 107 clockLocationRule = clockLocationDao.getClockLocationRule(dept, workArea, "%", -1L, asOfDate); 108 if(!clockLocationRule.isEmpty()){ 109 return clockLocationRule; 110 } 111 112 // 6 : dept, -1, principal, -1 113 clockLocationRule = clockLocationDao.getClockLocationRule(dept, -1L, principalId, -1L, asOfDate); 114 if(!clockLocationRule.isEmpty()){ 115 return clockLocationRule; 116 } 117 118 // 7 : dept, -1, % , job 119 clockLocationRule = clockLocationDao.getClockLocationRule(dept, -1L, "%", jobNumber, asOfDate); 120 if(!clockLocationRule.isEmpty()){ 121 return clockLocationRule; 122 } 123 124 // 8 : dept, -1, % , job 125 clockLocationRule = clockLocationDao.getClockLocationRule(dept, -1L, "%", -1L, asOfDate); 126 return clockLocationRule; 127 } 128 129 @Override 130 public List<ClockLocationRule> getNewerVersionClockLocationRule( 131 String dept, Long workArea, String principalId, Long jobNumber, 132 Date asOfDate) { 133 134 return clockLocationDao.getNewerVersionClockLocationRule(dept, workArea, principalId, jobNumber, asOfDate); 135 } 136 137 @Override 138 public ClockLocationRule getClockLocationRule(String tkClockLocationRuleId) { 139 return clockLocationDao.getClockLocationRule(tkClockLocationRuleId); 140 } 141 142 public void populateIPAddressesForCLR(ClockLocationRule clr){ 143 clockLocationDao.populateIPAddressesForCLR(clr); 144 } 145 146 public List<ClockLocationRule> getClockLocationRules(Date fromEffdt, Date toEffdt, String principalId, String jobNumber, 147 String dept, String workArea, String active, String showHistory){ 148 return clockLocationDao.getClockLocationRules(fromEffdt, toEffdt, principalId, jobNumber, dept, workArea, active, showHistory); 149 150 } 151 }