001 /* 002 * Copyright 2011 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.kfs.vnd.service.impl; 017 018 import java.util.List; 019 020 import org.kuali.kfs.vnd.VendorParameterConstants; 021 import org.kuali.kfs.vnd.businessobject.VendorDetail; 022 import org.kuali.kfs.vnd.service.PhoneNumberService; 023 import org.kuali.rice.kns.service.ParameterService; 024 import org.kuali.rice.kns.util.ObjectUtils; 025 026 public class PhoneNumberServiceImpl implements PhoneNumberService { 027 028 public ParameterService parameterService; 029 public List<String> phoneNumberFormats; 030 031 public void setParameterService(ParameterService parameterService) { 032 this.parameterService = parameterService; 033 } 034 035 036 // This 1-based index is used to pick the format among those in phoneNumberFormats 037 // which is the default. 038 public final int PHONE_FORMAT_RULE_DEFAULT_INDEX = 1; 039 040 /** 041 * Converts a valid phone number to the default format. Must be changed if the generic format changes. The string passed in is 042 * stripped of non-number chars. If it is then the right length it is formatted. If not the right length the original string is 043 * returned. 044 * 045 * @param phone The phone number String to be converted 046 * @return A String in the default valid format 047 * @see org.kuali.rice.kns.web.format.PhoneNumberFormatter 048 */ 049 public String formatNumberIfPossible(String unformattedNumber) { 050 if (ObjectUtils.isNull(unformattedNumber)) { 051 return unformattedNumber; 052 } 053 String formattedNumber = unformattedNumber.replaceAll("\\D", ""); 054 Integer defaultPhoneNumberDigits = new Integer(parameterService.getParameterValue(VendorDetail.class, VendorParameterConstants.DEFAULT_PHONE_NUMBER_DIGITS)); 055 // Before moving to the parameter table: 056 // if ( formattedNumber.length() != VendorConstants.GENERIC_DEFAULT_PHONE_NUM_DIGITS ) { 057 if (formattedNumber.length() != defaultPhoneNumberDigits) { 058 return unformattedNumber; 059 } 060 else { 061 return formattedNumber.substring(0, 3) + "-" + formattedNumber.substring(3, 6) + "-" + formattedNumber.substring(6, 10); 062 } 063 } 064 065 /** 066 * A predicate to determine the validity of phone numbers, using only the formats which are common in North America (which we 067 * are calling Generic formats) as examples. 068 * 069 * @param phone A phone number String 070 * @return True if the phone number is known to be in a valid format 071 */ 072 public boolean isValidPhoneNumber(String phone) { 073 String[] formats = parseFormats(); 074 for (int i = 0; i < formats.length; i++) { 075 if (phone.matches(formats[i])) { 076 return true; 077 } 078 } 079 return false; 080 } 081 082 /** 083 * Splits the set of phone number formats which are returned from the rule service as a semicolon-delimeted String into a String 084 * array. 085 * 086 * @return A String array of the phone number format regular expressions. 087 */ 088 protected String[] parseFormats() { 089 if (ObjectUtils.isNull(phoneNumberFormats)) { 090 phoneNumberFormats = parameterService.getParameterValues(VendorDetail.class, VendorParameterConstants.PHONE_NUMBER_FORMATS); 091 } 092 return phoneNumberFormats.toArray(new String[] {}); 093 } 094 095 /** 096 * A predicate to determine whether the given phone number is in the default format. 097 * 098 * @param phone A phone number String 099 * @return True if the phone number is in the default format. 100 */ 101 public boolean isDefaultFormatPhoneNumber(String phone) { 102 String[] formats = parseFormats(); 103 String defaultPhoneFormat = formats[PHONE_FORMAT_RULE_DEFAULT_INDEX - 1]; 104 if (phone.matches(defaultPhoneFormat)) { 105 return true; 106 } 107 return false; 108 } 109 110 }