You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
jitsi/src/net/java/sip/communicator/impl/phonenumbers/PhoneNumberI18nServiceImpl....

242 lines
8.5 KiB

/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package net.java.sip.communicator.impl.phonenumbers;
import com.google.i18n.phonenumbers.*;
import net.java.sip.communicator.service.protocol.*;
import org.jitsi.service.configuration.*;
import java.util.regex.*;
/**
* Implements <tt>PhoneNumberI18nService</tt> which aids the parsing, formatting
* and validating of international phone numbers.
*
* @author Lyubomir Marinov
* @author Vincent Lucas
* @author Damian Minkov
*/
public class PhoneNumberI18nServiceImpl
implements PhoneNumberI18nService
{
/**
* The configuration service.
*/
private static ConfigurationService configService
= ProtocolProviderActivator.getConfigurationService();
/**
* Characters which have to be removed from a phone number in order to
* normalized it.
*/
private static final Pattern removedCharactersToNormalizedPhoneNumber
= Pattern.compile("[-\\(\\)\\.\\\\\\/ ]");
/**
* Characters which have to be removed from a number (which is not a phone
* number, such as a sip id, a jabber id, etc.) in order to normalized it.
*/
private static final Pattern removedCharactersToNormalizedIdentifier
= Pattern.compile("[\\(\\) ]");
/**
* The list of characters corresponding to the number 2 in a phone dial pad.
*/
private static final Pattern charactersFordialPadNumber2
= Pattern.compile("[abc]", Pattern.CASE_INSENSITIVE);
/**
* The list of characters corresponding to the number 3 in a phone dial pad.
*/
private static final Pattern charactersFordialPadNumber3
= Pattern.compile("[def]", Pattern.CASE_INSENSITIVE);
/**
* The list of characters corresponding to the number 4 in a phone dial pad.
*/
private static final Pattern charactersFordialPadNumber4
= Pattern.compile("[ghi]", Pattern.CASE_INSENSITIVE);
/**
* The list of characters corresponding to the number 5 in a phone dial pad.
*/
private static final Pattern charactersFordialPadNumber5
= Pattern.compile("[jkl]", Pattern.CASE_INSENSITIVE);
/**
* The list of characters corresponding to the number 6 in a phone dial pad.
*/
private static final Pattern charactersFordialPadNumber6
= Pattern.compile("[mno]", Pattern.CASE_INSENSITIVE);
/**
* The list of characters corresponding to the number 7 in a phone dial pad.
*/
private static final Pattern charactersFordialPadNumber7
= Pattern.compile("[pqrs]", Pattern.CASE_INSENSITIVE);
/**
* The list of characters corresponding to the number 8 in a phone dial pad.
*/
private static final Pattern charactersFordialPadNumber8
= Pattern.compile("[tuv]", Pattern.CASE_INSENSITIVE);
/**
* The list of characters corresponding to the number 9 in a phone dial pad.
*/
private static final Pattern charactersFordialPadNumber9
= Pattern.compile("[wxyz]", Pattern.CASE_INSENSITIVE);
/**
* Normalizes a <tt>String</tt> which may be a phone number or a identifier
* by removing useless characters and, if necessary, replacing the alpahe
* characters in corresponding dial pad numbers.
*
* @param possibleNumber a <tt>String</tt> which may represents a phone
* number or an identifier to normalize.
*
* @return a <tt>String</tt> which is a normalized form of the specified
* <tt>possibleNumber</tt>.
*/
public String normalize(String possibleNumber)
{
String normalizedNumber;
if(isPhoneNumber(possibleNumber))
{
normalizedNumber = normalizePhoneNumber(possibleNumber);
}
else
{
normalizedNumber = normalizeIdentifier(possibleNumber);
}
return normalizedNumber;
}
/**
* Normalizes a <tt>String</tt> phone number by converting alpha characters
* to their respective digits on a keypad and then stripping non-digit
* characters.
*
* @param phoneNumber a <tt>String</tt> which represents a phone number to
* normalize
*
* @return a <tt>String</tt> which is a normalized form of the specified
* <tt>phoneNumber</tt>
*
* @see net.java.sip.communicator.impl.phonenumbers.PhoneNumberI18nServiceImpl#normalize(String)
*/
private static String normalizePhoneNumber(String phoneNumber)
{
phoneNumber = convertAlphaCharactersInNumber(phoneNumber);
return removedCharactersToNormalizedPhoneNumber
.matcher(phoneNumber).replaceAll("");
}
/**
* Removes useless characters from a identifier (which is not a phone
* number) in order to normalized it.
*
* @param id The identifier string with some useless characters like: " ",
* "(", ")".
*
* @return The normalized identifier.
*/
private static String normalizeIdentifier(String id)
{
return removedCharactersToNormalizedIdentifier
.matcher(id).replaceAll("");
}
/**
* Determines whether two <tt>String</tt> phone numbers match.
*
* @param aPhoneNumber a <tt>String</tt> which represents a phone number to
* match to <tt>bPhoneNumber</tt>
* @param bPhoneNumber a <tt>String</tt> which represents a phone number to
* match to <tt>aPhoneNumber</tt>
* @return <tt>true</tt> if the specified <tt>String</tt>s match as phone
* numbers; otherwise, <tt>false</tt>
*/
public boolean phoneNumbersMatch(String aPhoneNumber, String bPhoneNumber)
{
PhoneNumberUtil.MatchType match = PhoneNumberUtil.getInstance()
.isNumberMatch(aPhoneNumber, bPhoneNumber);
return match != PhoneNumberUtil.MatchType.NOT_A_NUMBER
&& match != PhoneNumberUtil.MatchType.NO_MATCH;
}
/**
* Indicates if the given string is possibly a phone number.
*
* @param possibleNumber the string to be verified
* @return <tt>true</tt> if the possibleNumber is a phone number,
* <tt>false</tt> - otherwise
*/
public boolean isPhoneNumber(String possibleNumber)
{
// If the string does not contains an "@", this may be a phone number.
if(possibleNumber.indexOf('@') == -1)
{
// If the string does not contain any alphabetical characters, then
// this is a phone number.
if(!possibleNumber.matches(".*[a-zA-Z].*"))
{
return true;
}
else
{
// Removes the " ", "(" and ")" in order to search the "+"
// character at the beginning at the string.
String tmpPossibleNumber
= possibleNumber.replaceAll(" \\(\\)", "");
// If the property is enabled and the string starts with a "+",
// then we consider that this is a phone number.
if(configService.getBoolean(
"impl.gui.ACCEPT_PHONE_NUMBER_WITH_ALPHA_CHARS",
true)
&& tmpPossibleNumber.startsWith("+"))
{
return true;
}
}
}
// Else the string is not a phone number.
return false;
}
/**
* Changes all alphabetical characters into numbers, following phone dial
* pad disposition.
*
* @param phoneNumber The phone number string with some alphabetical
* characters.
*
* @return The phone number with all alphabetical caracters replaced with
* the corresponding dial pad number.
*/
private static String convertAlphaCharactersInNumber(String phoneNumber)
{
phoneNumber
= charactersFordialPadNumber2.matcher(phoneNumber).replaceAll("2");
phoneNumber
= charactersFordialPadNumber3.matcher(phoneNumber).replaceAll("3");
phoneNumber
= charactersFordialPadNumber4.matcher(phoneNumber).replaceAll("4");
phoneNumber
= charactersFordialPadNumber5.matcher(phoneNumber).replaceAll("5");
phoneNumber
= charactersFordialPadNumber6.matcher(phoneNumber).replaceAll("6");
phoneNumber
= charactersFordialPadNumber7.matcher(phoneNumber).replaceAll("7");
phoneNumber
= charactersFordialPadNumber8.matcher(phoneNumber).replaceAll("8");
return charactersFordialPadNumber9.matcher(phoneNumber).replaceAll("9");
}
}