001 /**
002 * Copyright 2004-2012 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 return;
051 }
052 }
053 }
054 GlobalVariables.getMessageMap().putWarning("property", "ipaddress.invalid.format", clockLog.getIpAddress());
055
056 }
057
058 private boolean compareIpAddresses(String ipAddressRule, String ipAddress){
059 String[] rulePieces = StringUtils.split(ipAddressRule, ".");
060 int ruleMax = rulePieces.length-1;
061
062 String[] ipAddPieces = StringUtils.split(ipAddress,".");
063 boolean match = true;
064 for(int i=0; i<ipAddPieces.length; i++){
065 if( ((i > ruleMax) && StringUtils.equals("%", rulePieces[ruleMax])) ||
066 ((i <= ruleMax) && ( StringUtils.equals(ipAddPieces[i], rulePieces[i]) || StringUtils.equals("%", rulePieces[i]) ))
067 )
068 {
069 // we don't need to do anything.
070 } else {
071 return false;
072 }
073 }
074 return match;
075 }
076
077 @Override
078 public List<ClockLocationRule> getClockLocationRule(String dept, Long workArea,String principalId, Long jobNumber, Date asOfDate) {
079
080 // 1 : dept, wa, principal, job
081 List<ClockLocationRule> clockLocationRule = clockLocationDao.getClockLocationRule(dept, workArea,principalId,jobNumber,asOfDate);
082 if(!clockLocationRule.isEmpty()){
083 return clockLocationRule;
084 }
085
086 // 2 : dept, wa, principal, -1
087 clockLocationRule = clockLocationDao.getClockLocationRule(dept, workArea, principalId, -1L, asOfDate);
088 if(!clockLocationRule.isEmpty()){
089 return clockLocationRule;
090 }
091
092 // 3 : dept, wa, % , job
093 clockLocationRule = clockLocationDao.getClockLocationRule(dept, workArea, "%", jobNumber, asOfDate);
094 if(!clockLocationRule.isEmpty()){
095 return clockLocationRule;
096 }
097
098 // 4 : dept, -1, principal, job
099 clockLocationRule = clockLocationDao.getClockLocationRule(dept, -1L, principalId, jobNumber, asOfDate);
100 if(!clockLocationRule.isEmpty()){
101 return clockLocationRule;
102 }
103
104 // 5 : dept, wa, % , -1
105 clockLocationRule = clockLocationDao.getClockLocationRule(dept, workArea, "%", -1L, asOfDate);
106 if(!clockLocationRule.isEmpty()){
107 return clockLocationRule;
108 }
109
110 // 6 : dept, -1, principal, -1
111 clockLocationRule = clockLocationDao.getClockLocationRule(dept, -1L, principalId, -1L, asOfDate);
112 if(!clockLocationRule.isEmpty()){
113 return clockLocationRule;
114 }
115
116 // 7 : dept, -1, % , job
117 clockLocationRule = clockLocationDao.getClockLocationRule(dept, -1L, "%", jobNumber, asOfDate);
118 if(!clockLocationRule.isEmpty()){
119 return clockLocationRule;
120 }
121
122 // 8 : dept, -1, % , job
123 clockLocationRule = clockLocationDao.getClockLocationRule(dept, -1L, "%", -1L, asOfDate);
124 return clockLocationRule;
125 }
126
127 @Override
128 public List<ClockLocationRule> getNewerVersionClockLocationRule(
129 String dept, Long workArea, String principalId, Long jobNumber,
130 Date asOfDate) {
131
132 return clockLocationDao.getNewerVersionClockLocationRule(dept, workArea, principalId, jobNumber, asOfDate);
133 }
134
135 @Override
136 public ClockLocationRule getClockLocationRule(String tkClockLocationRuleId) {
137 return clockLocationDao.getClockLocationRule(tkClockLocationRuleId);
138 }
139
140 public void populateIPAddressesForCLR(ClockLocationRule clr){
141 clockLocationDao.populateIPAddressesForCLR(clr);
142 }
143
144 }