001 /** 002 * Copyright 2004-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 */ 016 package org.kuali.kpme.tklm.time.clocklog.validation; 017 018 import java.util.regex.Matcher; 019 import java.util.regex.Pattern; 020 021 import org.apache.log4j.Logger; 022 import org.kuali.kpme.core.service.HrServiceLocator; 023 import org.kuali.kpme.tklm.time.clocklog.ClockLog; 024 import org.kuali.kpme.tklm.time.rules.clocklocation.validation.ClockLocationRuleRule; 025 import org.kuali.rice.kns.document.MaintenanceDocument; 026 import org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase; 027 import org.kuali.rice.krad.bo.PersistableBusinessObject; 028 import org.kuali.rice.krad.util.GlobalVariables; 029 030 public class ClockLogRule extends MaintenanceDocumentRuleBase { 031 032 private static final String WILDCARD_CHARACTER = "%"; 033 private static final String REGEX_IP_ADDRESS_STRING = "(?:(?:" 034 + WILDCARD_CHARACTER 035 + "|25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:" 036 + WILDCARD_CHARACTER + "|25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"; 037 private static final Pattern REGEX_IP_ADDRESS_PATTERN = Pattern 038 .compile(REGEX_IP_ADDRESS_STRING); 039 040 private static Logger LOG = Logger.getLogger(ClockLocationRuleRule.class); 041 042 protected boolean validateIpAddress(String ip) { 043 boolean valid = false; 044 045 LOG.debug("Validating IP address: " + ip); 046 Matcher matcher = REGEX_IP_ADDRESS_PATTERN.matcher(ip); 047 valid = matcher.matches(); 048 if (!valid) { 049 this.putFieldError("ipAddress", "ipaddress.invalid.format", ip); 050 } 051 052 return valid; 053 } 054 055 //TODO fix this class 056 protected boolean validateWorkArea(ClockLog clockLog ) { 057 boolean valid = false; 058 LOG.debug("Validating workarea: " + clockLog.getWorkArea()); 059 int count = HrServiceLocator.getWorkAreaService().getWorkAreaCount(null, clockLog.getWorkArea()); 060 if (count >0 ) { 061 valid = true; 062 LOG.debug("found workarea."); 063 } else { 064 this.putFieldError("workArea", "error.existence", "Workarea '" 065 + clockLog.getWorkArea()+ "'"); 066 } 067 return valid; 068 } 069 070 protected boolean validateTask(ClockLog clockLog ) { 071 boolean valid = false; 072 LOG.debug("Validating task: " + clockLog.getTask()); 073 int count = HrServiceLocator.getTaskService().getTaskCount(clockLog.getTask()); 074 if (count >0 ) { 075 valid = true; 076 LOG.debug("found task."); 077 } else { 078 this.putFieldError("task", "error.existence", "Task '" 079 + clockLog.getTask()+ "'"); 080 } 081 return valid; 082 } 083 084 085 /** 086 * It looks like the method that calls this class doesn't actually care 087 * about the return type. 088 */ 089 @Override 090 protected boolean processCustomRouteDocumentBusinessRules( 091 MaintenanceDocument document) { 092 boolean valid = false; 093 094 LOG.debug("entering custom validation for ClockLog"); 095 PersistableBusinessObject pbo = (PersistableBusinessObject) this.getNewBo(); 096 if (pbo instanceof ClockLog) { 097 ClockLog clockLog = (ClockLog) pbo; 098 clockLog.setUserPrincipalId(GlobalVariables.getUserSession().getPrincipalId()); 099 if (clockLog != null) { 100 valid = true; 101 valid &= this.validateIpAddress(clockLog.getIpAddress()); 102 valid &= this.validateWorkArea(clockLog); 103 valid &= this.validateTask(clockLog); 104 } 105 } 106 107 return valid; 108 } 109 110 }