Browse Source

replace Phonemetadata API for fields other than repeated fields, in preparation for switch to nanoproto

pull/880/head
David Yonge-Mallo 10 years ago
parent
commit
792cf3cccb
16 changed files with 579 additions and 932 deletions
  1. +21
    -18
      java/libphonenumber/src/com/google/i18n/phonenumbers/AsYouTypeFormatter.java
  2. +1
    -1
      java/libphonenumber/src/com/google/i18n/phonenumbers/MetadataManager.java
  3. +3
    -3
      java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberMatcher.java
  4. +72
    -72
      java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java
  5. +183
    -539
      java/libphonenumber/src/com/google/i18n/phonenumbers/Phonemetadata.java
  6. +25
    -26
      java/libphonenumber/src/com/google/i18n/phonenumbers/ShortNumberInfo.java
  7. +2
    -2
      java/libphonenumber/src/com/google/i18n/phonenumbers/SingleFileMetadataSourceImpl.java
  8. +2
    -2
      java/libphonenumber/src/com/google/i18n/phonenumbers/internal/RegexBasedMatcher.java
  9. +9
    -9
      java/libphonenumber/test/com/google/i18n/phonenumbers/ExampleNumbersTest.java
  10. +1
    -1
      java/libphonenumber/test/com/google/i18n/phonenumbers/MetadataManagerTest.java
  11. +59
    -58
      java/libphonenumber/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java
  12. +5
    -0
      java/pom.xml
  13. +79
    -82
      tools/java/common/src/com/google/i18n/phonenumbers/BuildMetadataFromXml.java
  14. +66
    -68
      tools/java/common/test/com/google/i18n/phonenumbers/BuildMetadataFromXmlTest.java
  15. +49
    -49
      tools/java/java-build/src/com/google/i18n/phonenumbers/BuildMetadataJsonFromXml.java
  16. +2
    -2
      tools/java/java-build/src/com/google/i18n/phonenumbers/BuildMetadataProtoFromXml.java

+ 21
- 18
java/libphonenumber/src/com/google/i18n/phonenumbers/AsYouTypeFormatter.java View File

@ -61,8 +61,11 @@ public class AsYouTypeFormatter {
// Character used when appropriate to separate a prefix, such as a long NDD or a country calling // Character used when appropriate to separate a prefix, such as a long NDD or a country calling
// code, from the national number. // code, from the national number.
private static final char SEPARATOR_BEFORE_NATIONAL_NUMBER = ' '; private static final char SEPARATOR_BEFORE_NATIONAL_NUMBER = ' ';
private static final PhoneMetadata EMPTY_METADATA =
new PhoneMetadata().setInternationalPrefix("NA");
private static final PhoneMetadata EMPTY_METADATA;
static {
EMPTY_METADATA = new PhoneMetadata();
EMPTY_METADATA.internationalPrefix = "NA";
}
private PhoneMetadata defaultMetadata; private PhoneMetadata defaultMetadata;
private PhoneMetadata currentMetadata; private PhoneMetadata currentMetadata;
@ -115,7 +118,7 @@ public class AsYouTypeFormatter {
private StringBuilder nationalNumber = new StringBuilder(); private StringBuilder nationalNumber = new StringBuilder();
private List<NumberFormat> possibleFormats = new ArrayList<NumberFormat>(); private List<NumberFormat> possibleFormats = new ArrayList<NumberFormat>();
// A cache for frequently used country-specific regular expressions.
// A cache for frequently used country-specific regular expressions.
private RegexCache regexCache = new RegexCache(64); private RegexCache regexCache = new RegexCache(64);
/** /**
@ -151,7 +154,7 @@ public class AsYouTypeFormatter {
Iterator<NumberFormat> it = possibleFormats.iterator(); Iterator<NumberFormat> it = possibleFormats.iterator();
while (it.hasNext()) { while (it.hasNext()) {
NumberFormat numberFormat = it.next(); NumberFormat numberFormat = it.next();
String pattern = numberFormat.getPattern();
String pattern = numberFormat.pattern;
if (currentFormattingPattern.equals(pattern)) { if (currentFormattingPattern.equals(pattern)) {
return false; return false;
} }
@ -159,7 +162,7 @@ public class AsYouTypeFormatter {
currentFormattingPattern = pattern; currentFormattingPattern = pattern;
shouldAddSpaceAfterNationalPrefix = shouldAddSpaceAfterNationalPrefix =
NATIONAL_PREFIX_SEPARATORS_PATTERN.matcher( NATIONAL_PREFIX_SEPARATORS_PATTERN.matcher(
numberFormat.getNationalPrefixFormattingRule()).find();
numberFormat.nationalPrefixFormattingRule).find();
// With a new formatting template, the matched position using the old template needs to be // With a new formatting template, the matched position using the old template needs to be
// reset. // reset.
lastMatchPosition = 0; lastMatchPosition = 0;
@ -177,13 +180,13 @@ public class AsYouTypeFormatter {
(isCompleteNumber && currentMetadata.intlNumberFormatSize() > 0) (isCompleteNumber && currentMetadata.intlNumberFormatSize() > 0)
? currentMetadata.intlNumberFormats() ? currentMetadata.intlNumberFormats()
: currentMetadata.numberFormats(); : currentMetadata.numberFormats();
boolean nationalPrefixIsUsedByCountry = currentMetadata.hasNationalPrefix();
boolean nationalPrefixIsUsedByCountry = !currentMetadata.nationalPrefix.isEmpty();
for (NumberFormat format : formatList) { for (NumberFormat format : formatList) {
if (!nationalPrefixIsUsedByCountry || isCompleteNumber || if (!nationalPrefixIsUsedByCountry || isCompleteNumber ||
format.isNationalPrefixOptionalWhenFormatting() ||
format.nationalPrefixOptionalWhenFormatting ||
PhoneNumberUtil.formattingRuleHasFirstGroupOnly( PhoneNumberUtil.formattingRuleHasFirstGroupOnly(
format.getNationalPrefixFormattingRule())) {
if (isFormatEligible(format.getFormat())) {
format.nationalPrefixFormattingRule)) {
if (isFormatEligible(format.format)) {
possibleFormats.add(format); possibleFormats.add(format);
} }
} }
@ -216,7 +219,7 @@ public class AsYouTypeFormatter {
} }
private boolean createFormattingTemplate(NumberFormat format) { private boolean createFormattingTemplate(NumberFormat format) {
String numberPattern = format.getPattern();
String numberPattern = format.pattern;
// The formatter doesn't format numbers when numberPattern contains "|", e.g. // The formatter doesn't format numbers when numberPattern contains "|", e.g.
// (20|3)\d{4}. In those cases we quickly return. // (20|3)\d{4}. In those cases we quickly return.
@ -230,7 +233,7 @@ public class AsYouTypeFormatter {
// Replace any standalone digit (not the one in d{}) with \d // Replace any standalone digit (not the one in d{}) with \d
numberPattern = STANDALONE_DIGIT_PATTERN.matcher(numberPattern).replaceAll("\\\\d"); numberPattern = STANDALONE_DIGIT_PATTERN.matcher(numberPattern).replaceAll("\\\\d");
formattingTemplate.setLength(0); formattingTemplate.setLength(0);
String tempTemplate = getFormattingTemplate(numberPattern, format.getFormat());
String tempTemplate = getFormattingTemplate(numberPattern, format.format);
if (tempTemplate.length() > 0) { if (tempTemplate.length() > 0) {
formattingTemplate.append(tempTemplate); formattingTemplate.append(tempTemplate);
return true; return true;
@ -428,12 +431,12 @@ public class AsYouTypeFormatter {
*/ */
String attemptToFormatAccruedDigits() { String attemptToFormatAccruedDigits() {
for (NumberFormat numberFormat : possibleFormats) { for (NumberFormat numberFormat : possibleFormats) {
Matcher m = regexCache.getPatternForRegex(numberFormat.getPattern()).matcher(nationalNumber);
Matcher m = regexCache.getPatternForRegex(numberFormat.pattern).matcher(nationalNumber);
if (m.matches()) { if (m.matches()) {
shouldAddSpaceAfterNationalPrefix = shouldAddSpaceAfterNationalPrefix =
NATIONAL_PREFIX_SEPARATORS_PATTERN.matcher( NATIONAL_PREFIX_SEPARATORS_PATTERN.matcher(
numberFormat.getNationalPrefixFormattingRule()).find();
String formattedNumber = m.replaceAll(numberFormat.getFormat());
numberFormat.nationalPrefixFormattingRule).find();
String formattedNumber = m.replaceAll(numberFormat.format);
return appendNationalNumber(formattedNumber); return appendNationalNumber(formattedNumber);
} }
} }
@ -526,7 +529,7 @@ public class AsYouTypeFormatter {
// that national significant numbers in NANPA always start with [2-9] after the national prefix. // that national significant numbers in NANPA always start with [2-9] after the national prefix.
// Numbers beginning with 1[01] can only be short/emergency numbers, which don't need the // Numbers beginning with 1[01] can only be short/emergency numbers, which don't need the
// national prefix. // national prefix.
return (currentMetadata.getCountryCode() == 1) && (nationalNumber.charAt(0) == '1') &&
return (currentMetadata.countryCode == 1) && (nationalNumber.charAt(0) == '1') &&
(nationalNumber.charAt(1) != '0') && (nationalNumber.charAt(1) != '1'); (nationalNumber.charAt(1) != '0') && (nationalNumber.charAt(1) != '1');
} }
@ -537,9 +540,9 @@ public class AsYouTypeFormatter {
startOfNationalNumber = 1; startOfNationalNumber = 1;
prefixBeforeNationalNumber.append('1').append(SEPARATOR_BEFORE_NATIONAL_NUMBER); prefixBeforeNationalNumber.append('1').append(SEPARATOR_BEFORE_NATIONAL_NUMBER);
isCompleteNumber = true; isCompleteNumber = true;
} else if (currentMetadata.hasNationalPrefixForParsing()) {
} else if (currentMetadata.nationalPrefixForParsing.length() != 0) {
Pattern nationalPrefixForParsing = Pattern nationalPrefixForParsing =
regexCache.getPatternForRegex(currentMetadata.getNationalPrefixForParsing());
regexCache.getPatternForRegex(currentMetadata.nationalPrefixForParsing);
Matcher m = nationalPrefixForParsing.matcher(nationalNumber); Matcher m = nationalPrefixForParsing.matcher(nationalNumber);
// Since some national prefix patterns are entirely optional, check that a national prefix // Since some national prefix patterns are entirely optional, check that a national prefix
// could actually be extracted. // could actually be extracted.
@ -567,7 +570,7 @@ public class AsYouTypeFormatter {
private boolean attemptToExtractIdd() { private boolean attemptToExtractIdd() {
Pattern internationalPrefix = Pattern internationalPrefix =
regexCache.getPatternForRegex("\\" + PhoneNumberUtil.PLUS_SIGN + "|" + regexCache.getPatternForRegex("\\" + PhoneNumberUtil.PLUS_SIGN + "|" +
currentMetadata.getInternationalPrefix());
currentMetadata.internationalPrefix);
Matcher iddMatcher = internationalPrefix.matcher(accruedInputWithoutFormatting); Matcher iddMatcher = internationalPrefix.matcher(accruedInputWithoutFormatting);
if (iddMatcher.lookingAt()) { if (iddMatcher.lookingAt()) {
isCompleteNumber = true; isCompleteNumber = true;


+ 1
- 1
java/libphonenumber/src/com/google/i18n/phonenumbers/MetadataManager.java View File

@ -80,7 +80,7 @@ class MetadataManager {
PhoneMetadataCollection alternateFormats = new PhoneMetadataCollection(); PhoneMetadataCollection alternateFormats = new PhoneMetadataCollection();
alternateFormats.readExternal(in); alternateFormats.readExternal(in);
for (PhoneMetadata metadata : alternateFormats.getMetadataList()) { for (PhoneMetadata metadata : alternateFormats.getMetadataList()) {
callingCodeToAlternateFormatsMap.put(metadata.getCountryCode(), metadata);
callingCodeToAlternateFormatsMap.put(metadata.countryCode, metadata);
} }
} catch (IOException e) { } catch (IOException e) {
LOGGER.log(Level.WARNING, e.toString()); LOGGER.log(Level.WARNING, e.toString());


+ 3
- 3
java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberMatcher.java View File

@ -668,14 +668,14 @@ final class PhoneNumberMatcher implements Iterator<PhoneNumberMatch> {
util.chooseFormattingPatternForNumber(metadata.numberFormats(), nationalNumber); util.chooseFormattingPatternForNumber(metadata.numberFormats(), nationalNumber);
// To do this, we check that a national prefix formatting rule was present and that it wasn't // To do this, we check that a national prefix formatting rule was present and that it wasn't
// just the first-group symbol ($1) with punctuation. // just the first-group symbol ($1) with punctuation.
if ((formatRule != null) && formatRule.getNationalPrefixFormattingRule().length() > 0) {
if (formatRule.isNationalPrefixOptionalWhenFormatting()) {
if ((formatRule != null) && formatRule.nationalPrefixFormattingRule.length() > 0) {
if (formatRule.nationalPrefixOptionalWhenFormatting) {
// The national-prefix is optional in these cases, so we don't need to check if it was // The national-prefix is optional in these cases, so we don't need to check if it was
// present. // present.
return true; return true;
} }
if (PhoneNumberUtil.formattingRuleHasFirstGroupOnly( if (PhoneNumberUtil.formattingRuleHasFirstGroupOnly(
formatRule.getNationalPrefixFormattingRule())) {
formatRule.nationalPrefixFormattingRule)) {
// National Prefix not needed for this number. // National Prefix not needed for this number.
return true; return true;
} }


+ 72
- 72
java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java View File

@ -769,7 +769,7 @@ public class PhoneNumberUtil {
} }
// If a country doesn't use a national prefix, and this number doesn't have an Italian leading // If a country doesn't use a national prefix, and this number doesn't have an Italian leading
// zero, we assume it is a closed dialling plan with no area codes. // zero, we assume it is a closed dialling plan with no area codes.
if (!metadata.hasNationalPrefix() && !number.isItalianLeadingZero()) {
if (metadata.nationalPrefix.equals("") && !number.isItalianLeadingZero()) {
return 0; return 0;
} }
@ -1123,19 +1123,19 @@ public class PhoneNumberUtil {
// need to copy the rule so that subsequent replacements for different numbers have the // need to copy the rule so that subsequent replacements for different numbers have the
// appropriate national prefix. // appropriate national prefix.
numFormatCopy.mergeFrom(formattingPattern); numFormatCopy.mergeFrom(formattingPattern);
String nationalPrefixFormattingRule = formattingPattern.getNationalPrefixFormattingRule();
String nationalPrefixFormattingRule = formattingPattern.nationalPrefixFormattingRule;
if (nationalPrefixFormattingRule.length() > 0) { if (nationalPrefixFormattingRule.length() > 0) {
String nationalPrefix = metadata.getNationalPrefix();
String nationalPrefix = metadata.nationalPrefix;
if (nationalPrefix.length() > 0) { if (nationalPrefix.length() > 0) {
// Replace $NP with national prefix and $FG with the first group ($1). // Replace $NP with national prefix and $FG with the first group ($1).
nationalPrefixFormattingRule = nationalPrefixFormattingRule =
NP_PATTERN.matcher(nationalPrefixFormattingRule).replaceFirst(nationalPrefix); NP_PATTERN.matcher(nationalPrefixFormattingRule).replaceFirst(nationalPrefix);
nationalPrefixFormattingRule = nationalPrefixFormattingRule =
FG_PATTERN.matcher(nationalPrefixFormattingRule).replaceFirst("\\$1"); FG_PATTERN.matcher(nationalPrefixFormattingRule).replaceFirst("\\$1");
numFormatCopy.setNationalPrefixFormattingRule(nationalPrefixFormattingRule);
numFormatCopy.nationalPrefixFormattingRule = nationalPrefixFormattingRule;
} else { } else {
// We don't want to have a rule for how to format the national prefix if there isn't one. // We don't want to have a rule for how to format the national prefix if there isn't one.
numFormatCopy.clearNationalPrefixFormattingRule();
numFormatCopy.nationalPrefixFormattingRule = "";
} }
} }
formattedNumber.append( formattedNumber.append(
@ -1351,16 +1351,16 @@ public class PhoneNumberUtil {
} }
// Metadata cannot be null because we checked 'isValidRegionCode()' above. // Metadata cannot be null because we checked 'isValidRegionCode()' above.
PhoneMetadata metadataForRegionCallingFrom = getMetadataForRegion(regionCallingFrom); PhoneMetadata metadataForRegionCallingFrom = getMetadataForRegion(regionCallingFrom);
String internationalPrefix = metadataForRegionCallingFrom.getInternationalPrefix();
String internationalPrefix = metadataForRegionCallingFrom.internationalPrefix;
// For regions that have multiple international prefixes, the international format of the // For regions that have multiple international prefixes, the international format of the
// number is returned, unless there is a preferred international prefix. // number is returned, unless there is a preferred international prefix.
String internationalPrefixForFormatting = ""; String internationalPrefixForFormatting = "";
if (UNIQUE_INTERNATIONAL_PREFIX.matcher(internationalPrefix).matches()) { if (UNIQUE_INTERNATIONAL_PREFIX.matcher(internationalPrefix).matches()) {
internationalPrefixForFormatting = internationalPrefix; internationalPrefixForFormatting = internationalPrefix;
} else if (metadataForRegionCallingFrom.hasPreferredInternationalPrefix()) {
} else if (!metadataForRegionCallingFrom.preferredInternationalPrefix.equals("")) {
internationalPrefixForFormatting = internationalPrefixForFormatting =
metadataForRegionCallingFrom.getPreferredInternationalPrefix();
metadataForRegionCallingFrom.preferredInternationalPrefix;
} }
String regionCode = getRegionCodeForCountryCode(countryCallingCode); String regionCode = getRegionCodeForCountryCode(countryCallingCode);
@ -1458,7 +1458,7 @@ public class PhoneNumberUtil {
// return the national format. // return the national format.
// TODO: Refactor the code below with the code in // TODO: Refactor the code below with the code in
// isNationalPrefixPresentIfRequired. // isNationalPrefixPresentIfRequired.
String candidateNationalPrefixRule = formatRule.getNationalPrefixFormattingRule();
String candidateNationalPrefixRule = formatRule.nationalPrefixFormattingRule;
// We assume that the first-group symbol will never be _before_ the national prefix. // We assume that the first-group symbol will never be _before_ the national prefix.
int indexOfFirstGroup = candidateNationalPrefixRule.indexOf("$1"); int indexOfFirstGroup = candidateNationalPrefixRule.indexOf("$1");
if (indexOfFirstGroup <= 0) { if (indexOfFirstGroup <= 0) {
@ -1476,7 +1476,7 @@ public class PhoneNumberUtil {
// Otherwise, we need to remove the national prefix from our output. // Otherwise, we need to remove the national prefix from our output.
NumberFormat numFormatCopy = new NumberFormat(); NumberFormat numFormatCopy = new NumberFormat();
numFormatCopy.mergeFrom(formatRule); numFormatCopy.mergeFrom(formatRule);
numFormatCopy.clearNationalPrefixFormattingRule();
numFormatCopy.nationalPrefixFormattingRule = "";
List<NumberFormat> numberFormats = new ArrayList<NumberFormat>(1); List<NumberFormat> numberFormats = new ArrayList<NumberFormat>(1);
numberFormats.add(numFormatCopy); numberFormats.add(numFormatCopy);
formattedNumber = formatByPattern(number, PhoneNumberFormat.NATIONAL, numberFormats); formattedNumber = formatByPattern(number, PhoneNumberFormat.NATIONAL, numberFormats);
@ -1606,9 +1606,9 @@ public class PhoneNumberUtil {
NumberFormat newFormat = new NumberFormat(); NumberFormat newFormat = new NumberFormat();
newFormat.mergeFrom(formattingPattern); newFormat.mergeFrom(formattingPattern);
// The first group is the first group of digits that the user wrote together. // The first group is the first group of digits that the user wrote together.
newFormat.setPattern("(\\d+)(.*)");
newFormat.pattern = "(\\d+)(.*)";
// Here we just concatenate them back together after the national prefix has been fixed. // Here we just concatenate them back together after the national prefix has been fixed.
newFormat.setFormat("$1$2");
newFormat.format = "$1$2";
// Now we format using this pattern instead of the default pattern, but with the national // Now we format using this pattern instead of the default pattern, but with the national
// prefix prefixed if necessary. // prefix prefixed if necessary.
// This will not work in the cases where the pattern (and not the leading digits) decide // This will not work in the cases where the pattern (and not the leading digits) decide
@ -1621,11 +1621,11 @@ public class PhoneNumberUtil {
// prefixes, the international format of the number is returned, unless there is a preferred // prefixes, the international format of the number is returned, unless there is a preferred
// international prefix. // international prefix.
if (metadataForRegionCallingFrom != null) { if (metadataForRegionCallingFrom != null) {
String internationalPrefix = metadataForRegionCallingFrom.getInternationalPrefix();
String internationalPrefix = metadataForRegionCallingFrom.internationalPrefix;
internationalPrefixForFormatting = internationalPrefixForFormatting =
UNIQUE_INTERNATIONAL_PREFIX.matcher(internationalPrefix).matches() UNIQUE_INTERNATIONAL_PREFIX.matcher(internationalPrefix).matches()
? internationalPrefix ? internationalPrefix
: metadataForRegionCallingFrom.getPreferredInternationalPrefix();
: metadataForRegionCallingFrom.preferredInternationalPrefix;
} }
StringBuilder formattedNumber = new StringBuilder(rawInput); StringBuilder formattedNumber = new StringBuilder(rawInput);
String regionCode = getRegionCodeForCountryCode(countryCode); String regionCode = getRegionCodeForCountryCode(countryCode);
@ -1727,7 +1727,7 @@ public class PhoneNumberUtil {
if (size == 0 || regexCache.getPatternForRegex( if (size == 0 || regexCache.getPatternForRegex(
// We always use the last leading_digits_pattern, as it is the most detailed. // We always use the last leading_digits_pattern, as it is the most detailed.
numFormat.getLeadingDigitsPattern(size - 1)).matcher(nationalNumber).lookingAt()) { numFormat.getLeadingDigitsPattern(size - 1)).matcher(nationalNumber).lookingAt()) {
Matcher m = regexCache.getPatternForRegex(numFormat.getPattern()).matcher(nationalNumber);
Matcher m = regexCache.getPatternForRegex(numFormat.pattern).matcher(nationalNumber);
if (m.matches()) { if (m.matches()) {
return numFormat; return numFormat;
} }
@ -1749,15 +1749,15 @@ public class PhoneNumberUtil {
NumberFormat formattingPattern, NumberFormat formattingPattern,
PhoneNumberFormat numberFormat, PhoneNumberFormat numberFormat,
String carrierCode) { String carrierCode) {
String numberFormatRule = formattingPattern.getFormat();
String numberFormatRule = formattingPattern.format;
Matcher m = Matcher m =
regexCache.getPatternForRegex(formattingPattern.getPattern()).matcher(nationalNumber);
regexCache.getPatternForRegex(formattingPattern.pattern).matcher(nationalNumber);
String formattedNationalNumber = ""; String formattedNationalNumber = "";
if (numberFormat == PhoneNumberFormat.NATIONAL && if (numberFormat == PhoneNumberFormat.NATIONAL &&
carrierCode != null && carrierCode.length() > 0 && carrierCode != null && carrierCode.length() > 0 &&
formattingPattern.getDomesticCarrierCodeFormattingRule().length() > 0) {
formattingPattern.domesticCarrierCodeFormattingRule.length() > 0) {
// Replace the $CC in the formatting rule with the desired carrier code. // Replace the $CC in the formatting rule with the desired carrier code.
String carrierCodeFormattingRule = formattingPattern.getDomesticCarrierCodeFormattingRule();
String carrierCodeFormattingRule = formattingPattern.domesticCarrierCodeFormattingRule;
carrierCodeFormattingRule = carrierCodeFormattingRule =
CC_PATTERN.matcher(carrierCodeFormattingRule).replaceFirst(carrierCode); CC_PATTERN.matcher(carrierCodeFormattingRule).replaceFirst(carrierCode);
// Now replace the $FG in the formatting rule with the first group and the carrier code // Now replace the $FG in the formatting rule with the first group and the carrier code
@ -1767,7 +1767,7 @@ public class PhoneNumberUtil {
formattedNationalNumber = m.replaceAll(numberFormatRule); formattedNationalNumber = m.replaceAll(numberFormatRule);
} else { } else {
// Use the national prefix formatting rule instead. // Use the national prefix formatting rule instead.
String nationalPrefixFormattingRule = formattingPattern.getNationalPrefixFormattingRule();
String nationalPrefixFormattingRule = formattingPattern.nationalPrefixFormattingRule;
if (numberFormat == PhoneNumberFormat.NATIONAL && if (numberFormat == PhoneNumberFormat.NATIONAL &&
nationalPrefixFormattingRule != null && nationalPrefixFormattingRule != null &&
nationalPrefixFormattingRule.length() > 0) { nationalPrefixFormattingRule.length() > 0) {
@ -1820,8 +1820,8 @@ public class PhoneNumberUtil {
} }
PhoneNumberDesc desc = getNumberDescByType(getMetadataForRegion(regionCode), type); PhoneNumberDesc desc = getNumberDescByType(getMetadataForRegion(regionCode), type);
try { try {
if (desc.hasExampleNumber()) {
return parse(desc.getExampleNumber(), regionCode);
if (!desc.exampleNumber.equals("")) {
return parse(desc.exampleNumber, regionCode);
} }
} catch (NumberParseException e) { } catch (NumberParseException e) {
logger.log(Level.SEVERE, e.toString()); logger.log(Level.SEVERE, e.toString());
@ -1840,10 +1840,10 @@ public class PhoneNumberUtil {
public PhoneNumber getExampleNumberForNonGeoEntity(int countryCallingCode) { public PhoneNumber getExampleNumberForNonGeoEntity(int countryCallingCode) {
PhoneMetadata metadata = getMetadataForNonGeographicalRegion(countryCallingCode); PhoneMetadata metadata = getMetadataForNonGeographicalRegion(countryCallingCode);
if (metadata != null) { if (metadata != null) {
PhoneNumberDesc desc = metadata.getGeneralDesc();
PhoneNumberDesc desc = metadata.generalDesc;
try { try {
if (desc.hasExampleNumber()) {
return parse("+" + countryCallingCode + desc.getExampleNumber(), "ZZ");
if (!desc.exampleNumber.equals("")) {
return parse("+" + countryCallingCode + desc.exampleNumber, "ZZ");
} }
} catch (NumberParseException e) { } catch (NumberParseException e) {
logger.log(Level.SEVERE, e.toString()); logger.log(Level.SEVERE, e.toString());
@ -1866,8 +1866,8 @@ public class PhoneNumberUtil {
if (numberFormat == PhoneNumberFormat.RFC3966) { if (numberFormat == PhoneNumberFormat.RFC3966) {
formattedNumber.append(RFC3966_EXTN_PREFIX).append(number.getExtension()); formattedNumber.append(RFC3966_EXTN_PREFIX).append(number.getExtension());
} else { } else {
if (metadata.hasPreferredExtnPrefix()) {
formattedNumber.append(metadata.getPreferredExtnPrefix()).append(number.getExtension());
if (metadata.preferredExtnPrefix.length() != 0) {
formattedNumber.append(metadata.preferredExtnPrefix).append(number.getExtension());
} else { } else {
formattedNumber.append(DEFAULT_EXTN_PREFIX).append(number.getExtension()); formattedNumber.append(DEFAULT_EXTN_PREFIX).append(number.getExtension());
} }
@ -1878,28 +1878,28 @@ public class PhoneNumberUtil {
PhoneNumberDesc getNumberDescByType(PhoneMetadata metadata, PhoneNumberType type) { PhoneNumberDesc getNumberDescByType(PhoneMetadata metadata, PhoneNumberType type) {
switch (type) { switch (type) {
case PREMIUM_RATE: case PREMIUM_RATE:
return metadata.getPremiumRate();
return metadata.premiumRate;
case TOLL_FREE: case TOLL_FREE:
return metadata.getTollFree();
return metadata.tollFree;
case MOBILE: case MOBILE:
return metadata.getMobile();
return metadata.mobile;
case FIXED_LINE: case FIXED_LINE:
case FIXED_LINE_OR_MOBILE: case FIXED_LINE_OR_MOBILE:
return metadata.getFixedLine();
return metadata.fixedLine;
case SHARED_COST: case SHARED_COST:
return metadata.getSharedCost();
return metadata.sharedCost;
case VOIP: case VOIP:
return metadata.getVoip();
return metadata.voip;
case PERSONAL_NUMBER: case PERSONAL_NUMBER:
return metadata.getPersonalNumber();
return metadata.personalNumber;
case PAGER: case PAGER:
return metadata.getPager();
return metadata.pager;
case UAN: case UAN:
return metadata.getUan();
return metadata.uan;
case VOICEMAIL: case VOICEMAIL:
return metadata.getVoicemail();
return metadata.voicemail;
default: default:
return metadata.getGeneralDesc();
return metadata.generalDesc;
} }
} }
@ -1920,48 +1920,48 @@ public class PhoneNumberUtil {
} }
private PhoneNumberType getNumberTypeHelper(String nationalNumber, PhoneMetadata metadata) { private PhoneNumberType getNumberTypeHelper(String nationalNumber, PhoneMetadata metadata) {
if (!isNumberMatchingDesc(nationalNumber, metadata.getGeneralDesc())) {
if (!isNumberMatchingDesc(nationalNumber, metadata.generalDesc)) {
return PhoneNumberType.UNKNOWN; return PhoneNumberType.UNKNOWN;
} }
if (isNumberMatchingDesc(nationalNumber, metadata.getPremiumRate())) {
if (isNumberMatchingDesc(nationalNumber, metadata.premiumRate)) {
return PhoneNumberType.PREMIUM_RATE; return PhoneNumberType.PREMIUM_RATE;
} }
if (isNumberMatchingDesc(nationalNumber, metadata.getTollFree())) {
if (isNumberMatchingDesc(nationalNumber, metadata.tollFree)) {
return PhoneNumberType.TOLL_FREE; return PhoneNumberType.TOLL_FREE;
} }
if (isNumberMatchingDesc(nationalNumber, metadata.getSharedCost())) {
if (isNumberMatchingDesc(nationalNumber, metadata.sharedCost)) {
return PhoneNumberType.SHARED_COST; return PhoneNumberType.SHARED_COST;
} }
if (isNumberMatchingDesc(nationalNumber, metadata.getVoip())) {
if (isNumberMatchingDesc(nationalNumber, metadata.voip)) {
return PhoneNumberType.VOIP; return PhoneNumberType.VOIP;
} }
if (isNumberMatchingDesc(nationalNumber, metadata.getPersonalNumber())) {
if (isNumberMatchingDesc(nationalNumber, metadata.personalNumber)) {
return PhoneNumberType.PERSONAL_NUMBER; return PhoneNumberType.PERSONAL_NUMBER;
} }
if (isNumberMatchingDesc(nationalNumber, metadata.getPager())) {
if (isNumberMatchingDesc(nationalNumber, metadata.pager)) {
return PhoneNumberType.PAGER; return PhoneNumberType.PAGER;
} }
if (isNumberMatchingDesc(nationalNumber, metadata.getUan())) {
if (isNumberMatchingDesc(nationalNumber, metadata.uan)) {
return PhoneNumberType.UAN; return PhoneNumberType.UAN;
} }
if (isNumberMatchingDesc(nationalNumber, metadata.getVoicemail())) {
if (isNumberMatchingDesc(nationalNumber, metadata.voicemail)) {
return PhoneNumberType.VOICEMAIL; return PhoneNumberType.VOICEMAIL;
} }
boolean isFixedLine = isNumberMatchingDesc(nationalNumber, metadata.getFixedLine());
boolean isFixedLine = isNumberMatchingDesc(nationalNumber, metadata.fixedLine);
if (isFixedLine) { if (isFixedLine) {
if (metadata.isSameMobileAndFixedLinePattern()) {
if (metadata.sameMobileAndFixedLinePattern) {
return PhoneNumberType.FIXED_LINE_OR_MOBILE; return PhoneNumberType.FIXED_LINE_OR_MOBILE;
} else if (isNumberMatchingDesc(nationalNumber, metadata.getMobile())) {
} else if (isNumberMatchingDesc(nationalNumber, metadata.mobile)) {
return PhoneNumberType.FIXED_LINE_OR_MOBILE; return PhoneNumberType.FIXED_LINE_OR_MOBILE;
} }
return PhoneNumberType.FIXED_LINE; return PhoneNumberType.FIXED_LINE;
} }
// Otherwise, test to see if the number is mobile. Only do this if certain that the patterns for // Otherwise, test to see if the number is mobile. Only do this if certain that the patterns for
// mobile and fixed line aren't the same. // mobile and fixed line aren't the same.
if (!metadata.isSameMobileAndFixedLinePattern() &&
isNumberMatchingDesc(nationalNumber, metadata.getMobile())) {
if (!metadata.sameMobileAndFixedLinePattern &&
isNumberMatchingDesc(nationalNumber, metadata.mobile)) {
return PhoneNumberType.MOBILE; return PhoneNumberType.MOBILE;
} }
return PhoneNumberType.UNKNOWN; return PhoneNumberType.UNKNOWN;
@ -1987,14 +1987,14 @@ public class PhoneNumberUtil {
boolean isNumberPossibleForDesc(String nationalNumber, PhoneNumberDesc numberDesc) { boolean isNumberPossibleForDesc(String nationalNumber, PhoneNumberDesc numberDesc) {
Matcher possibleNumberPatternMatcher = Matcher possibleNumberPatternMatcher =
regexCache.getPatternForRegex(numberDesc.getPossibleNumberPattern())
regexCache.getPatternForRegex(numberDesc.possibleNumberPattern)
.matcher(nationalNumber); .matcher(nationalNumber);
return possibleNumberPatternMatcher.matches(); return possibleNumberPatternMatcher.matches();
} }
boolean isNumberMatchingDesc(String nationalNumber, PhoneNumberDesc numberDesc) { boolean isNumberMatchingDesc(String nationalNumber, PhoneNumberDesc numberDesc) {
Matcher nationalNumberPatternMatcher = Matcher nationalNumberPatternMatcher =
regexCache.getPatternForRegex(numberDesc.getNationalNumberPattern())
regexCache.getPatternForRegex(numberDesc.nationalNumberPattern)
.matcher(nationalNumber); .matcher(nationalNumber);
return isNumberPossibleForDesc(nationalNumber, numberDesc) && return isNumberPossibleForDesc(nationalNumber, numberDesc) &&
nationalNumberPatternMatcher.matches(); nationalNumberPatternMatcher.matches();
@ -2073,8 +2073,8 @@ public class PhoneNumberUtil {
// If leadingDigits is present, use this. Otherwise, do full validation. // If leadingDigits is present, use this. Otherwise, do full validation.
// Metadata cannot be null because the region codes come from the country calling code map. // Metadata cannot be null because the region codes come from the country calling code map.
PhoneMetadata metadata = getMetadataForRegion(regionCode); PhoneMetadata metadata = getMetadataForRegion(regionCode);
if (metadata.hasLeadingDigits()) {
if (regexCache.getPatternForRegex(metadata.getLeadingDigits())
if (metadata.leadingDigits.length() != 0) {
if (regexCache.getPatternForRegex(metadata.leadingDigits)
.matcher(nationalNumber).lookingAt()) { .matcher(nationalNumber).lookingAt()) {
return regionCode; return regionCode;
} }
@ -2140,7 +2140,7 @@ public class PhoneNumberUtil {
if (metadata == null) { if (metadata == null) {
throw new IllegalArgumentException("Invalid region code: " + regionCode); throw new IllegalArgumentException("Invalid region code: " + regionCode);
} }
return metadata.getCountryCode();
return metadata.countryCode;
} }
/** /**
@ -2166,7 +2166,7 @@ public class PhoneNumberUtil {
+ ") provided."); + ") provided.");
return null; return null;
} }
String nationalPrefix = metadata.getNationalPrefix();
String nationalPrefix = metadata.nationalPrefix;
// If no national prefix was found, we return null. // If no national prefix was found, we return null.
if (nationalPrefix.length() == 0) { if (nationalPrefix.length() == 0) {
return null; return null;
@ -2200,7 +2200,7 @@ public class PhoneNumberUtil {
if (mainMetadataForCallingCode == null) { if (mainMetadataForCallingCode == null) {
return false; return false;
} }
return mainMetadataForCallingCode.isLeadingZeroPossible();
return mainMetadataForCallingCode.leadingZeroPossible;
} }
/** /**
@ -2257,7 +2257,7 @@ public class PhoneNumberUtil {
*/ */
private boolean isShorterThanPossibleNormalNumber(PhoneMetadata regionMetadata, String number) { private boolean isShorterThanPossibleNormalNumber(PhoneMetadata regionMetadata, String number) {
Pattern possibleNumberPattern = regexCache.getPatternForRegex( Pattern possibleNumberPattern = regexCache.getPatternForRegex(
regionMetadata.getGeneralDesc().getPossibleNumberPattern());
regionMetadata.generalDesc.possibleNumberPattern);
return testNumberLengthAgainstPattern(possibleNumberPattern, number) == return testNumberLengthAgainstPattern(possibleNumberPattern, number) ==
ValidationResult.TOO_SHORT; ValidationResult.TOO_SHORT;
} }
@ -2297,7 +2297,7 @@ public class PhoneNumberUtil {
// Metadata cannot be null because the country calling code is valid. // Metadata cannot be null because the country calling code is valid.
PhoneMetadata metadata = getMetadataForRegionOrCallingCode(countryCode, regionCode); PhoneMetadata metadata = getMetadataForRegionOrCallingCode(countryCode, regionCode);
Pattern possibleNumberPattern = Pattern possibleNumberPattern =
regexCache.getPatternForRegex(metadata.getGeneralDesc().getPossibleNumberPattern());
regexCache.getPatternForRegex(metadata.generalDesc.possibleNumberPattern);
return testNumberLengthAgainstPattern(possibleNumberPattern, nationalNumber); return testNumberLengthAgainstPattern(possibleNumberPattern, nationalNumber);
} }
@ -2429,7 +2429,7 @@ public class PhoneNumberUtil {
// Set the default prefix to be something that will never match. // Set the default prefix to be something that will never match.
String possibleCountryIddPrefix = "NonMatch"; String possibleCountryIddPrefix = "NonMatch";
if (defaultRegionMetadata != null) { if (defaultRegionMetadata != null) {
possibleCountryIddPrefix = defaultRegionMetadata.getInternationalPrefix();
possibleCountryIddPrefix = defaultRegionMetadata.internationalPrefix;
} }
CountryCodeSource countryCodeSource = CountryCodeSource countryCodeSource =
@ -2457,19 +2457,19 @@ public class PhoneNumberUtil {
// Check to see if the number starts with the country calling code for the default region. If // Check to see if the number starts with the country calling code for the default region. If
// so, we remove the country calling code, and do some checks on the validity of the number // so, we remove the country calling code, and do some checks on the validity of the number
// before and after. // before and after.
int defaultCountryCode = defaultRegionMetadata.getCountryCode();
int defaultCountryCode = defaultRegionMetadata.countryCode;
String defaultCountryCodeString = String.valueOf(defaultCountryCode); String defaultCountryCodeString = String.valueOf(defaultCountryCode);
String normalizedNumber = fullNumber.toString(); String normalizedNumber = fullNumber.toString();
if (normalizedNumber.startsWith(defaultCountryCodeString)) { if (normalizedNumber.startsWith(defaultCountryCodeString)) {
StringBuilder potentialNationalNumber = StringBuilder potentialNationalNumber =
new StringBuilder(normalizedNumber.substring(defaultCountryCodeString.length())); new StringBuilder(normalizedNumber.substring(defaultCountryCodeString.length()));
PhoneNumberDesc generalDesc = defaultRegionMetadata.getGeneralDesc();
PhoneNumberDesc generalDesc = defaultRegionMetadata.generalDesc;
Pattern validNumberPattern = Pattern validNumberPattern =
regexCache.getPatternForRegex(generalDesc.getNationalNumberPattern());
regexCache.getPatternForRegex(generalDesc.nationalNumberPattern);
maybeStripNationalPrefixAndCarrierCode( maybeStripNationalPrefixAndCarrierCode(
potentialNationalNumber, defaultRegionMetadata, null /* Don't need the carrier code */); potentialNationalNumber, defaultRegionMetadata, null /* Don't need the carrier code */);
Pattern possibleNumberPattern = Pattern possibleNumberPattern =
regexCache.getPatternForRegex(generalDesc.getPossibleNumberPattern());
regexCache.getPatternForRegex(generalDesc.possibleNumberPattern);
// If the number was not valid before but is valid now, or if it was too long before, we // If the number was not valid before but is valid now, or if it was too long before, we
// consider the number with the country calling code stripped to be a better result and // consider the number with the country calling code stripped to be a better result and
// keep that instead. // keep that instead.
@ -2562,7 +2562,7 @@ public class PhoneNumberUtil {
boolean maybeStripNationalPrefixAndCarrierCode( boolean maybeStripNationalPrefixAndCarrierCode(
StringBuilder number, PhoneMetadata metadata, StringBuilder carrierCode) { StringBuilder number, PhoneMetadata metadata, StringBuilder carrierCode) {
int numberLength = number.length(); int numberLength = number.length();
String possibleNationalPrefix = metadata.getNationalPrefixForParsing();
String possibleNationalPrefix = metadata.nationalPrefixForParsing;
if (numberLength == 0 || possibleNationalPrefix.length() == 0) { if (numberLength == 0 || possibleNationalPrefix.length() == 0) {
// Early return for numbers of zero length. // Early return for numbers of zero length.
return false; return false;
@ -2571,14 +2571,14 @@ public class PhoneNumberUtil {
Matcher prefixMatcher = regexCache.getPatternForRegex(possibleNationalPrefix).matcher(number); Matcher prefixMatcher = regexCache.getPatternForRegex(possibleNationalPrefix).matcher(number);
if (prefixMatcher.lookingAt()) { if (prefixMatcher.lookingAt()) {
Pattern nationalNumberRule = Pattern nationalNumberRule =
regexCache.getPatternForRegex(metadata.getGeneralDesc().getNationalNumberPattern());
regexCache.getPatternForRegex(metadata.generalDesc.nationalNumberPattern);
// Check if the original number is viable. // Check if the original number is viable.
boolean isViableOriginalNumber = nationalNumberRule.matcher(number).matches(); boolean isViableOriginalNumber = nationalNumberRule.matcher(number).matches();
// prefixMatcher.group(numOfGroups) == null implies nothing was captured by the capturing // prefixMatcher.group(numOfGroups) == null implies nothing was captured by the capturing
// groups in possibleNationalPrefix; therefore, no transformation is necessary, and we just // groups in possibleNationalPrefix; therefore, no transformation is necessary, and we just
// remove the national prefix. // remove the national prefix.
int numOfGroups = prefixMatcher.groupCount(); int numOfGroups = prefixMatcher.groupCount();
String transformRule = metadata.getNationalPrefixTransformRule();
String transformRule = metadata.nationalPrefixTransformRule;
if (transformRule == null || transformRule.length() == 0 || if (transformRule == null || transformRule.length() == 0 ||
prefixMatcher.group(numOfGroups) == null) { prefixMatcher.group(numOfGroups) == null) {
// If the original number was viable, and the resultant number is not, we return. // If the original number was viable, and the resultant number is not, we return.
@ -2864,7 +2864,7 @@ public class PhoneNumberUtil {
normalize(nationalNumber); normalize(nationalNumber);
normalizedNationalNumber.append(nationalNumber); normalizedNationalNumber.append(nationalNumber);
if (defaultRegion != null) { if (defaultRegion != null) {
countryCode = regionMetadata.getCountryCode();
countryCode = regionMetadata.countryCode;
phoneNumber.setCountryCode(countryCode); phoneNumber.setCountryCode(countryCode);
} else if (keepRawInput) { } else if (keepRawInput) {
phoneNumber.clearCountryCodeSource(); phoneNumber.clearCountryCodeSource();
@ -3138,7 +3138,7 @@ public class PhoneNumberUtil {
return true; return true;
} }
String nationalSignificantNumber = getNationalSignificantNumber(number); String nationalSignificantNumber = getNationalSignificantNumber(number);
return !isNumberMatchingDesc(nationalSignificantNumber, metadata.getNoInternationalDialling());
return !isNumberMatchingDesc(nationalSignificantNumber, metadata.noInternationalDialling);
} }
/** /**
@ -3154,6 +3154,6 @@ public class PhoneNumberUtil {
logger.log(Level.WARNING, "Invalid or unknown region code provided: " + regionCode); logger.log(Level.WARNING, "Invalid or unknown region code provided: " + regionCode);
return false; return false;
} }
return metadata.isMobileNumberPortableRegion();
return metadata.mobileNumberPortableRegion;
} }
} }

+ 183
- 539
java/libphonenumber/src/com/google/i18n/phonenumbers/Phonemetadata.java
File diff suppressed because it is too large
View File


+ 25
- 26
java/libphonenumber/src/com/google/i18n/phonenumbers/ShortNumberInfo.java View File

@ -31,7 +31,6 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.regex.Pattern;
/** /**
* Methods for getting information about short phone numbers, such as short codes and emergency * Methods for getting information about short phone numbers, such as short codes and emergency
@ -131,7 +130,7 @@ public class ShortNumberInfo {
if (phoneMetadata == null) { if (phoneMetadata == null) {
return false; return false;
} }
return matcherApi.matchesPossibleNumber(shortNumber, phoneMetadata.getGeneralDesc());
return matcherApi.matchesPossibleNumber(shortNumber, phoneMetadata.generalDesc);
} }
/** /**
@ -152,7 +151,7 @@ public class ShortNumberInfo {
return false; return false;
} }
return matcherApi.matchesPossibleNumber(getNationalSignificantNumber(number), return matcherApi.matchesPossibleNumber(getNationalSignificantNumber(number),
phoneMetadata.getGeneralDesc());
phoneMetadata.generalDesc);
} }
/** /**
@ -172,7 +171,7 @@ public class ShortNumberInfo {
if (phoneMetadata == null) { if (phoneMetadata == null) {
continue; continue;
} }
if (matcherApi.matchesPossibleNumber(shortNumber, phoneMetadata.getGeneralDesc())) {
if (matcherApi.matchesPossibleNumber(shortNumber, phoneMetadata.generalDesc)) {
return true; return true;
} }
} }
@ -200,11 +199,11 @@ public class ShortNumberInfo {
if (phoneMetadata == null) { if (phoneMetadata == null) {
return false; return false;
} }
PhoneNumberDesc generalDesc = phoneMetadata.getGeneralDesc();
PhoneNumberDesc generalDesc = phoneMetadata.generalDesc;
if (!matchesPossibleNumberAndNationalNumber(shortNumber, generalDesc)) { if (!matchesPossibleNumberAndNationalNumber(shortNumber, generalDesc)) {
return false; return false;
} }
PhoneNumberDesc shortNumberDesc = phoneMetadata.getShortCode();
PhoneNumberDesc shortNumberDesc = phoneMetadata.shortCode;
return matchesPossibleNumberAndNationalNumber(shortNumber, shortNumberDesc); return matchesPossibleNumberAndNationalNumber(shortNumber, shortNumberDesc);
} }
@ -227,11 +226,11 @@ public class ShortNumberInfo {
return false; return false;
} }
String shortNumber = getNationalSignificantNumber(number); String shortNumber = getNationalSignificantNumber(number);
PhoneNumberDesc generalDesc = phoneMetadata.getGeneralDesc();
PhoneNumberDesc generalDesc = phoneMetadata.generalDesc;
if (!matchesPossibleNumberAndNationalNumber(shortNumber, generalDesc)) { if (!matchesPossibleNumberAndNationalNumber(shortNumber, generalDesc)) {
return false; return false;
} }
PhoneNumberDesc shortNumberDesc = phoneMetadata.getShortCode();
PhoneNumberDesc shortNumberDesc = phoneMetadata.shortCode;
return matchesPossibleNumberAndNationalNumber(shortNumber, shortNumberDesc); return matchesPossibleNumberAndNationalNumber(shortNumber, shortNumberDesc);
} }
@ -293,13 +292,13 @@ public class ShortNumberInfo {
// The cost categories are tested in order of decreasing expense, since if for some reason the // The cost categories are tested in order of decreasing expense, since if for some reason the
// patterns overlap the most expensive matching cost category should be returned. // patterns overlap the most expensive matching cost category should be returned.
if (matchesPossibleNumberAndNationalNumber(shortNumber, phoneMetadata.getPremiumRate())) {
if (matchesPossibleNumberAndNationalNumber(shortNumber, phoneMetadata.premiumRate)) {
return ShortNumberCost.PREMIUM_RATE; return ShortNumberCost.PREMIUM_RATE;
} }
if (matchesPossibleNumberAndNationalNumber(shortNumber, phoneMetadata.getStandardRate())) {
if (matchesPossibleNumberAndNationalNumber(shortNumber, phoneMetadata.standardRate)) {
return ShortNumberCost.STANDARD_RATE; return ShortNumberCost.STANDARD_RATE;
} }
if (matchesPossibleNumberAndNationalNumber(shortNumber, phoneMetadata.getTollFree())) {
if (matchesPossibleNumberAndNationalNumber(shortNumber, phoneMetadata.tollFree)) {
return ShortNumberCost.TOLL_FREE; return ShortNumberCost.TOLL_FREE;
} }
if (isEmergencyNumber(shortNumber, regionDialingFrom)) { if (isEmergencyNumber(shortNumber, regionDialingFrom)) {
@ -347,13 +346,13 @@ public class ShortNumberInfo {
// The cost categories are tested in order of decreasing expense, since if for some reason the // The cost categories are tested in order of decreasing expense, since if for some reason the
// patterns overlap the most expensive matching cost category should be returned. // patterns overlap the most expensive matching cost category should be returned.
if (matchesPossibleNumberAndNationalNumber(shortNumber, phoneMetadata.getPremiumRate())) {
if (matchesPossibleNumberAndNationalNumber(shortNumber, phoneMetadata.premiumRate)) {
return ShortNumberCost.PREMIUM_RATE; return ShortNumberCost.PREMIUM_RATE;
} }
if (matchesPossibleNumberAndNationalNumber(shortNumber, phoneMetadata.getStandardRate())) {
if (matchesPossibleNumberAndNationalNumber(shortNumber, phoneMetadata.standardRate)) {
return ShortNumberCost.STANDARD_RATE; return ShortNumberCost.STANDARD_RATE;
} }
if (matchesPossibleNumberAndNationalNumber(shortNumber, phoneMetadata.getTollFree())) {
if (matchesPossibleNumberAndNationalNumber(shortNumber, phoneMetadata.tollFree)) {
return ShortNumberCost.TOLL_FREE; return ShortNumberCost.TOLL_FREE;
} }
if (isEmergencyNumber(shortNumber, regionDialingFrom)) { if (isEmergencyNumber(shortNumber, regionDialingFrom)) {
@ -430,7 +429,7 @@ public class ShortNumberInfo {
for (String regionCode : regionCodes) { for (String regionCode : regionCodes) {
PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode); PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode);
if (phoneMetadata != null if (phoneMetadata != null
&& matchesPossibleNumberAndNationalNumber(nationalNumber, phoneMetadata.getShortCode())) {
&& matchesPossibleNumberAndNationalNumber(nationalNumber, phoneMetadata.shortCode)) {
// The number is valid for this region. // The number is valid for this region.
return regionCode; return regionCode;
} }
@ -458,9 +457,9 @@ public class ShortNumberInfo {
if (phoneMetadata == null) { if (phoneMetadata == null) {
return ""; return "";
} }
PhoneNumberDesc desc = phoneMetadata.getShortCode();
if (desc.hasExampleNumber()) {
return desc.getExampleNumber();
PhoneNumberDesc desc = phoneMetadata.shortCode;
if (!desc.exampleNumber.equals("")) {
return desc.exampleNumber;
} }
return ""; return "";
} }
@ -482,20 +481,20 @@ public class ShortNumberInfo {
PhoneNumberDesc desc = null; PhoneNumberDesc desc = null;
switch (cost) { switch (cost) {
case TOLL_FREE: case TOLL_FREE:
desc = phoneMetadata.getTollFree();
desc = phoneMetadata.tollFree;
break; break;
case STANDARD_RATE: case STANDARD_RATE:
desc = phoneMetadata.getStandardRate();
desc = phoneMetadata.standardRate;
break; break;
case PREMIUM_RATE: case PREMIUM_RATE:
desc = phoneMetadata.getPremiumRate();
desc = phoneMetadata.premiumRate;
break; break;
default: default:
// UNKNOWN_COST numbers are computed by the process of elimination from the other cost // UNKNOWN_COST numbers are computed by the process of elimination from the other cost
// categories. // categories.
} }
if (desc != null && desc.hasExampleNumber()) {
return desc.getExampleNumber();
if (desc != null && !desc.exampleNumber.equals("")) {
return desc.exampleNumber;
} }
return ""; return "";
} }
@ -544,12 +543,12 @@ public class ShortNumberInfo {
return false; return false;
} }
PhoneMetadata metadata = MetadataManager.getShortNumberMetadataForRegion(regionCode); PhoneMetadata metadata = MetadataManager.getShortNumberMetadataForRegion(regionCode);
if (metadata == null || !metadata.hasEmergency()) {
if (metadata == null || metadata.emergency == null) {
return false; return false;
} }
String normalizedNumber = PhoneNumberUtil.normalizeDigitsOnly(number); String normalizedNumber = PhoneNumberUtil.normalizeDigitsOnly(number);
PhoneNumberDesc emergencyDesc = metadata.getEmergency();
PhoneNumberDesc emergencyDesc = metadata.emergency;
boolean allowPrefixMatchForRegion = boolean allowPrefixMatchForRegion =
allowPrefixMatch && !REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT.contains(regionCode); allowPrefixMatch && !REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT.contains(regionCode);
return matcherApi.matchesNationalNumber(normalizedNumber, emergencyDesc, return matcherApi.matchesNationalNumber(normalizedNumber, emergencyDesc,
@ -573,7 +572,7 @@ public class ShortNumberInfo {
PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode); PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode);
return (phoneMetadata != null) return (phoneMetadata != null)
&& (matchesPossibleNumberAndNationalNumber(nationalNumber, && (matchesPossibleNumberAndNationalNumber(nationalNumber,
phoneMetadata.getCarrierSpecific()));
phoneMetadata.carrierSpecific));
} }
/** /**


+ 2
- 2
java/libphonenumber/src/com/google/i18n/phonenumbers/SingleFileMetadataSourceImpl.java View File

@ -110,8 +110,8 @@ final class SingleFileMetadataSourceImpl implements MetadataSource {
throw new IllegalStateException("empty metadata: " + fileName); throw new IllegalStateException("empty metadata: " + fileName);
} }
for (PhoneMetadata metadata : metadataList) { for (PhoneMetadata metadata : metadataList) {
String regionCode = metadata.getId();
int countryCallingCode = metadata.getCountryCode();
String regionCode = metadata.id;
int countryCallingCode = metadata.countryCode;
boolean isNonGeoRegion = PhoneNumberUtil.REGION_CODE_FOR_NON_GEO_ENTITY.equals(regionCode); boolean isNonGeoRegion = PhoneNumberUtil.REGION_CODE_FOR_NON_GEO_ENTITY.equals(regionCode);
if (isNonGeoRegion) { if (isNonGeoRegion) {
countryCodeToNonGeographicalMetadataMap.put(countryCallingCode, metadata); countryCodeToNonGeographicalMetadataMap.put(countryCallingCode, metadata);


+ 2
- 2
java/libphonenumber/src/com/google/i18n/phonenumbers/internal/RegexBasedMatcher.java View File

@ -38,7 +38,7 @@ public final class RegexBasedMatcher implements MatcherApi {
public boolean matchesNationalNumber(String nationalNumber, PhoneNumberDesc numberDesc, public boolean matchesNationalNumber(String nationalNumber, PhoneNumberDesc numberDesc,
boolean allowPrefixMatch) { boolean allowPrefixMatch) {
Matcher nationalNumberPatternMatcher = regexCache.getPatternForRegex( Matcher nationalNumberPatternMatcher = regexCache.getPatternForRegex(
numberDesc.getNationalNumberPattern()).matcher(nationalNumber);
numberDesc.nationalNumberPattern).matcher(nationalNumber);
return nationalNumberPatternMatcher.matches() return nationalNumberPatternMatcher.matches()
|| (allowPrefixMatch && nationalNumberPatternMatcher.lookingAt()); || (allowPrefixMatch && nationalNumberPatternMatcher.lookingAt());
} }
@ -46,7 +46,7 @@ public final class RegexBasedMatcher implements MatcherApi {
// @Override // @Override
public boolean matchesPossibleNumber(String nationalNumber, PhoneNumberDesc numberDesc) { public boolean matchesPossibleNumber(String nationalNumber, PhoneNumberDesc numberDesc) {
Matcher possibleNumberPatternMatcher = regexCache.getPatternForRegex( Matcher possibleNumberPatternMatcher = regexCache.getPatternForRegex(
numberDesc.getPossibleNumberPattern()).matcher(nationalNumber);
numberDesc.possibleNumberPattern).matcher(nationalNumber);
return possibleNumberPatternMatcher.matches(); return possibleNumberPatternMatcher.matches();
} }
} }

+ 9
- 9
java/libphonenumber/test/com/google/i18n/phonenumbers/ExampleNumbersTest.java View File

@ -142,10 +142,10 @@ public class ExampleNumbersTest extends TestCase {
for (String regionCode : phoneNumberUtil.getSupportedRegions()) { for (String regionCode : phoneNumberUtil.getSupportedRegions()) {
PhoneNumber exampleNumber = null; PhoneNumber exampleNumber = null;
PhoneNumberDesc desc = PhoneNumberDesc desc =
phoneNumberUtil.getMetadataForRegion(regionCode).getNoInternationalDialling();
phoneNumberUtil.getMetadataForRegion(regionCode).noInternationalDialling;
try { try {
if (desc.hasExampleNumber()) {
exampleNumber = phoneNumberUtil.parse(desc.getExampleNumber(), regionCode);
if (desc.exampleNumber.length() != 0) {
exampleNumber = phoneNumberUtil.parse(desc.exampleNumber, regionCode);
} }
} catch (NumberParseException e) { } catch (NumberParseException e) {
LOGGER.log(Level.SEVERE, e.toString()); LOGGER.log(Level.SEVERE, e.toString());
@ -216,9 +216,9 @@ public class ExampleNumbersTest extends TestCase {
int wrongTypeCounter = 0; int wrongTypeCounter = 0;
for (String regionCode : shortNumberInfo.getSupportedRegions()) { for (String regionCode : shortNumberInfo.getSupportedRegions()) {
PhoneNumberDesc desc = PhoneNumberDesc desc =
MetadataManager.getShortNumberMetadataForRegion(regionCode).getEmergency();
if (desc.hasExampleNumber()) {
String exampleNumber = desc.getExampleNumber();
MetadataManager.getShortNumberMetadataForRegion(regionCode).emergency;
if (desc.exampleNumber.length() != 0) {
String exampleNumber = desc.exampleNumber;
PhoneNumber phoneNumber = phoneNumberUtil.parse(exampleNumber, regionCode); PhoneNumber phoneNumber = phoneNumberUtil.parse(exampleNumber, regionCode);
if (!shortNumberInfo.isPossibleShortNumberForRegion(phoneNumber, regionCode) if (!shortNumberInfo.isPossibleShortNumberForRegion(phoneNumber, regionCode)
|| !shortNumberInfo.isEmergencyNumber(exampleNumber, regionCode)) { || !shortNumberInfo.isEmergencyNumber(exampleNumber, regionCode)) {
@ -239,9 +239,9 @@ public class ExampleNumbersTest extends TestCase {
for (String regionCode : shortNumberInfo.getSupportedRegions()) { for (String regionCode : shortNumberInfo.getSupportedRegions()) {
// Test the carrier-specific tag. // Test the carrier-specific tag.
PhoneNumberDesc desc = PhoneNumberDesc desc =
MetadataManager.getShortNumberMetadataForRegion(regionCode).getCarrierSpecific();
if (desc.hasExampleNumber()) {
String exampleNumber = desc.getExampleNumber();
MetadataManager.getShortNumberMetadataForRegion(regionCode).carrierSpecific;
if (desc.exampleNumber.length() != 0) {
String exampleNumber = desc.exampleNumber;
PhoneNumber carrierSpecificNumber = phoneNumberUtil.parse(exampleNumber, regionCode); PhoneNumber carrierSpecificNumber = phoneNumberUtil.parse(exampleNumber, regionCode);
if (!shortNumberInfo.isPossibleShortNumberForRegion(carrierSpecificNumber, regionCode) if (!shortNumberInfo.isPossibleShortNumberForRegion(carrierSpecificNumber, regionCode)
|| !shortNumberInfo.isCarrierSpecific(carrierSpecificNumber)) { || !shortNumberInfo.isCarrierSpecific(carrierSpecificNumber)) {


+ 1
- 1
java/libphonenumber/test/com/google/i18n/phonenumbers/MetadataManagerTest.java View File

@ -36,7 +36,7 @@ public class MetadataManagerTest extends TestCase {
// We should have some data for France. // We should have some data for France.
PhoneMetadata franceShortNumberMetadata = MetadataManager.getShortNumberMetadataForRegion("FR"); PhoneMetadata franceShortNumberMetadata = MetadataManager.getShortNumberMetadataForRegion("FR");
assertNotNull(franceShortNumberMetadata); assertNotNull(franceShortNumberMetadata);
assertTrue(franceShortNumberMetadata.hasShortCode());
assertTrue(franceShortNumberMetadata.shortCode != null);
} }
public void testAlternateFormatsFailsGracefully() throws Exception { public void testAlternateFormatsFailsGracefully() throws Exception {


+ 59
- 58
java/libphonenumber/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java View File

@ -134,69 +134,69 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
public void testGetInstanceLoadUSMetadata() { public void testGetInstanceLoadUSMetadata() {
PhoneMetadata metadata = phoneUtil.getMetadataForRegion(RegionCode.US); PhoneMetadata metadata = phoneUtil.getMetadataForRegion(RegionCode.US);
assertEquals("US", metadata.getId());
assertEquals(1, metadata.getCountryCode());
assertEquals("011", metadata.getInternationalPrefix());
assertTrue(metadata.hasNationalPrefix());
assertEquals("US", metadata.id);
assertEquals(1, metadata.countryCode);
assertEquals("011", metadata.internationalPrefix);
assertTrue(metadata.nationalPrefix.length() != 0);
assertEquals(2, metadata.numberFormatSize()); assertEquals(2, metadata.numberFormatSize());
assertEquals("(\\d{3})(\\d{3})(\\d{4})", assertEquals("(\\d{3})(\\d{3})(\\d{4})",
metadata.getNumberFormat(1).getPattern());
assertEquals("$1 $2 $3", metadata.getNumberFormat(1).getFormat());
metadata.getNumberFormat(1).pattern);
assertEquals("$1 $2 $3", metadata.getNumberFormat(1).format);
assertEquals("[13-689]\\d{9}|2[0-35-9]\\d{8}", assertEquals("[13-689]\\d{9}|2[0-35-9]\\d{8}",
metadata.getGeneralDesc().getNationalNumberPattern());
assertEquals("\\d{7}(?:\\d{3})?", metadata.getGeneralDesc().getPossibleNumberPattern());
assertTrue(metadata.getGeneralDesc().exactlySameAs(metadata.getFixedLine()));
assertEquals("\\d{10}", metadata.getTollFree().getPossibleNumberPattern());
assertEquals("900\\d{7}", metadata.getPremiumRate().getNationalNumberPattern());
metadata.generalDesc.nationalNumberPattern);
assertEquals("\\d{7}(?:\\d{3})?", metadata.generalDesc.possibleNumberPattern);
assertTrue(metadata.generalDesc.exactlySameAs(metadata.fixedLine));
assertEquals("\\d{10}", metadata.tollFree.possibleNumberPattern);
assertEquals("900\\d{7}", metadata.premiumRate.nationalNumberPattern);
// No shared-cost data is available, so it should be initialised to "NA". // No shared-cost data is available, so it should be initialised to "NA".
assertEquals("NA", metadata.getSharedCost().getNationalNumberPattern());
assertEquals("NA", metadata.getSharedCost().getPossibleNumberPattern());
assertEquals("NA", metadata.sharedCost.nationalNumberPattern);
assertEquals("NA", metadata.sharedCost.possibleNumberPattern);
} }
public void testGetInstanceLoadDEMetadata() { public void testGetInstanceLoadDEMetadata() {
PhoneMetadata metadata = phoneUtil.getMetadataForRegion(RegionCode.DE); PhoneMetadata metadata = phoneUtil.getMetadataForRegion(RegionCode.DE);
assertEquals("DE", metadata.getId());
assertEquals(49, metadata.getCountryCode());
assertEquals("00", metadata.getInternationalPrefix());
assertEquals("0", metadata.getNationalPrefix());
assertEquals("DE", metadata.id);
assertEquals(49, metadata.countryCode);
assertEquals("00", metadata.internationalPrefix);
assertEquals("0", metadata.nationalPrefix);
assertEquals(6, metadata.numberFormatSize()); assertEquals(6, metadata.numberFormatSize());
assertEquals(1, metadata.getNumberFormat(5).leadingDigitsPatternSize()); assertEquals(1, metadata.getNumberFormat(5).leadingDigitsPatternSize());
assertEquals("900", metadata.getNumberFormat(5).getLeadingDigitsPattern(0)); assertEquals("900", metadata.getNumberFormat(5).getLeadingDigitsPattern(0));
assertEquals("(\\d{3})(\\d{3,4})(\\d{4})", assertEquals("(\\d{3})(\\d{3,4})(\\d{4})",
metadata.getNumberFormat(5).getPattern());
assertEquals("$1 $2 $3", metadata.getNumberFormat(5).getFormat());
metadata.getNumberFormat(5).pattern);
assertEquals("$1 $2 $3", metadata.getNumberFormat(5).format);
assertEquals("(?:[24-6]\\d{2}|3[03-9]\\d|[789](?:[1-9]\\d|0[2-9]))\\d{1,8}", assertEquals("(?:[24-6]\\d{2}|3[03-9]\\d|[789](?:[1-9]\\d|0[2-9]))\\d{1,8}",
metadata.getFixedLine().getNationalNumberPattern());
assertEquals("\\d{2,14}", metadata.getFixedLine().getPossibleNumberPattern());
assertEquals("30123456", metadata.getFixedLine().getExampleNumber());
assertEquals("\\d{10}", metadata.getTollFree().getPossibleNumberPattern());
assertEquals("900([135]\\d{6}|9\\d{7})", metadata.getPremiumRate().getNationalNumberPattern());
metadata.fixedLine.nationalNumberPattern);
assertEquals("\\d{2,14}", metadata.fixedLine.possibleNumberPattern);
assertEquals("30123456", metadata.fixedLine.exampleNumber);
assertEquals("\\d{10}", metadata.tollFree.possibleNumberPattern);
assertEquals("900([135]\\d{6}|9\\d{7})", metadata.premiumRate.nationalNumberPattern);
} }
public void testGetInstanceLoadARMetadata() { public void testGetInstanceLoadARMetadata() {
PhoneMetadata metadata = phoneUtil.getMetadataForRegion(RegionCode.AR); PhoneMetadata metadata = phoneUtil.getMetadataForRegion(RegionCode.AR);
assertEquals("AR", metadata.getId());
assertEquals(54, metadata.getCountryCode());
assertEquals("00", metadata.getInternationalPrefix());
assertEquals("0", metadata.getNationalPrefix());
assertEquals("0(?:(11|343|3715)15)?", metadata.getNationalPrefixForParsing());
assertEquals("9$1", metadata.getNationalPrefixTransformRule());
assertEquals("$2 15 $3-$4", metadata.getNumberFormat(2).getFormat());
assertEquals("AR", metadata.id);
assertEquals(54, metadata.countryCode);
assertEquals("00", metadata.internationalPrefix);
assertEquals("0", metadata.nationalPrefix);
assertEquals("0(?:(11|343|3715)15)?", metadata.nationalPrefixForParsing);
assertEquals("9$1", metadata.nationalPrefixTransformRule);
assertEquals("$2 15 $3-$4", metadata.getNumberFormat(2).format);
assertEquals("(9)(\\d{4})(\\d{2})(\\d{4})", assertEquals("(9)(\\d{4})(\\d{2})(\\d{4})",
metadata.getNumberFormat(3).getPattern());
metadata.getNumberFormat(3).pattern);
assertEquals("(9)(\\d{4})(\\d{2})(\\d{4})", assertEquals("(9)(\\d{4})(\\d{2})(\\d{4})",
metadata.getIntlNumberFormat(3).getPattern());
assertEquals("$1 $2 $3 $4", metadata.getIntlNumberFormat(3).getFormat());
metadata.getIntlNumberFormat(3).pattern);
assertEquals("$1 $2 $3 $4", metadata.getIntlNumberFormat(3).format);
} }
public void testGetInstanceLoadInternationalTollFreeMetadata() { public void testGetInstanceLoadInternationalTollFreeMetadata() {
PhoneMetadata metadata = phoneUtil.getMetadataForNonGeographicalRegion(800); PhoneMetadata metadata = phoneUtil.getMetadataForNonGeographicalRegion(800);
assertEquals("001", metadata.getId());
assertEquals(800, metadata.getCountryCode());
assertEquals("$1 $2", metadata.getNumberFormat(0).getFormat());
assertEquals("(\\d{4})(\\d{4})", metadata.getNumberFormat(0).getPattern());
assertEquals("12345678", metadata.getGeneralDesc().getExampleNumber());
assertEquals("12345678", metadata.getTollFree().getExampleNumber());
assertEquals("001", metadata.id);
assertEquals(800, metadata.countryCode);
assertEquals("$1 $2", metadata.getNumberFormat(0).format);
assertEquals("(\\d{4})(\\d{4})", metadata.getNumberFormat(0).pattern);
assertEquals("12345678", metadata.generalDesc.exampleNumber);
assertEquals("12345678", metadata.tollFree.exampleNumber);
} }
public void testIsNumberGeographical() { public void testIsNumberGeographical() {
@ -809,8 +809,8 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
public void testFormatByPattern() { public void testFormatByPattern() {
NumberFormat newNumFormat = new NumberFormat(); NumberFormat newNumFormat = new NumberFormat();
newNumFormat.setPattern("(\\d{3})(\\d{3})(\\d{4})");
newNumFormat.setFormat("($1) $2-$3");
newNumFormat.pattern = "(\\d{3})(\\d{3})(\\d{4})";
newNumFormat.format = "($1) $2-$3";
List<NumberFormat> newNumberFormats = new ArrayList<NumberFormat>(); List<NumberFormat> newNumberFormats = new ArrayList<NumberFormat>();
newNumberFormats.add(newNumFormat); newNumberFormats.add(newNumFormat);
@ -825,8 +825,8 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
// $NP is set to '1' for the US. Here we check that for other NANPA countries the US rules are // $NP is set to '1' for the US. Here we check that for other NANPA countries the US rules are
// followed. // followed.
newNumFormat.setNationalPrefixFormattingRule("$NP ($FG)");
newNumFormat.setFormat("$1 $2-$3");
newNumFormat.nationalPrefixFormattingRule = "$NP ($FG)";
newNumFormat.format = "$1 $2-$3";
assertEquals("1 (242) 365-1234", assertEquals("1 (242) 365-1234",
phoneUtil.formatByPattern(BS_NUMBER, PhoneNumberFormat.NATIONAL, phoneUtil.formatByPattern(BS_NUMBER, PhoneNumberFormat.NATIONAL,
newNumberFormats)); newNumberFormats));
@ -834,8 +834,8 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
phoneUtil.formatByPattern(BS_NUMBER, PhoneNumberFormat.INTERNATIONAL, phoneUtil.formatByPattern(BS_NUMBER, PhoneNumberFormat.INTERNATIONAL,
newNumberFormats)); newNumberFormats));
newNumFormat.setPattern("(\\d{2})(\\d{5})(\\d{3})");
newNumFormat.setFormat("$1-$2 $3");
newNumFormat.pattern = "(\\d{2})(\\d{5})(\\d{3})";
newNumFormat.format = "$1-$2 $3";
newNumberFormats.set(0, newNumFormat); newNumberFormats.set(0, newNumFormat);
assertEquals("02-36618 300", assertEquals("02-36618 300",
@ -845,20 +845,20 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
phoneUtil.formatByPattern(IT_NUMBER, PhoneNumberFormat.INTERNATIONAL, phoneUtil.formatByPattern(IT_NUMBER, PhoneNumberFormat.INTERNATIONAL,
newNumberFormats)); newNumberFormats));
newNumFormat.setNationalPrefixFormattingRule("$NP$FG");
newNumFormat.setPattern("(\\d{2})(\\d{4})(\\d{4})");
newNumFormat.setFormat("$1 $2 $3");
newNumFormat.nationalPrefixFormattingRule = "$NP$FG";
newNumFormat.pattern = "(\\d{2})(\\d{4})(\\d{4})";
newNumFormat.format = "$1 $2 $3";
newNumberFormats.set(0, newNumFormat); newNumberFormats.set(0, newNumFormat);
assertEquals("020 7031 3000", assertEquals("020 7031 3000",
phoneUtil.formatByPattern(GB_NUMBER, PhoneNumberFormat.NATIONAL, phoneUtil.formatByPattern(GB_NUMBER, PhoneNumberFormat.NATIONAL,
newNumberFormats)); newNumberFormats));
newNumFormat.setNationalPrefixFormattingRule("($NP$FG)");
newNumFormat.nationalPrefixFormattingRule = "($NP$FG)";
assertEquals("(020) 7031 3000", assertEquals("(020) 7031 3000",
phoneUtil.formatByPattern(GB_NUMBER, PhoneNumberFormat.NATIONAL, phoneUtil.formatByPattern(GB_NUMBER, PhoneNumberFormat.NATIONAL,
newNumberFormats)); newNumberFormats));
newNumFormat.setNationalPrefixFormattingRule("");
newNumFormat.nationalPrefixFormattingRule = "";
assertEquals("20 7031 3000", assertEquals("20 7031 3000",
phoneUtil.formatByPattern(GB_NUMBER, PhoneNumberFormat.NATIONAL, phoneUtil.formatByPattern(GB_NUMBER, PhoneNumberFormat.NATIONAL,
newNumberFormats)); newNumberFormats));
@ -1431,8 +1431,9 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
public void testMaybeStripNationalPrefix() { public void testMaybeStripNationalPrefix() {
PhoneMetadata metadata = new PhoneMetadata(); PhoneMetadata metadata = new PhoneMetadata();
metadata.setNationalPrefixForParsing("34");
metadata.setGeneralDesc(new PhoneNumberDesc().setNationalNumberPattern("\\d{4,8}"));
metadata.nationalPrefixForParsing = "34";
metadata.generalDesc = new PhoneNumberDesc();
metadata.generalDesc.nationalNumberPattern = "\\d{4,8}";
StringBuilder numberToStrip = new StringBuilder("34356778"); StringBuilder numberToStrip = new StringBuilder("34356778");
String strippedNumber = "356778"; String strippedNumber = "356778";
assertTrue(phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata, null)); assertTrue(phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata, null));
@ -1444,12 +1445,12 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
assertEquals("Should have had no change - no national prefix present.", assertEquals("Should have had no change - no national prefix present.",
strippedNumber, numberToStrip.toString()); strippedNumber, numberToStrip.toString());
// Some countries have no national prefix. Repeat test with none specified. // Some countries have no national prefix. Repeat test with none specified.
metadata.setNationalPrefixForParsing("");
metadata.nationalPrefixForParsing = "";
assertFalse(phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata, null)); assertFalse(phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata, null));
assertEquals("Should not strip anything with empty national prefix.", assertEquals("Should not strip anything with empty national prefix.",
strippedNumber, numberToStrip.toString()); strippedNumber, numberToStrip.toString());
// If the resultant number doesn't match the national rule, it shouldn't be stripped. // If the resultant number doesn't match the national rule, it shouldn't be stripped.
metadata.setNationalPrefixForParsing("3");
metadata.nationalPrefixForParsing = "3";
numberToStrip = new StringBuilder("3123"); numberToStrip = new StringBuilder("3123");
strippedNumber = "3123"; strippedNumber = "3123";
assertFalse(phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata, null)); assertFalse(phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata, null));
@ -1457,7 +1458,7 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
"the national rule.", "the national rule.",
strippedNumber, numberToStrip.toString()); strippedNumber, numberToStrip.toString());
// Test extracting carrier selection code. // Test extracting carrier selection code.
metadata.setNationalPrefixForParsing("0(81)?");
metadata.nationalPrefixForParsing = "0(81)?";
numberToStrip = new StringBuilder("08122123456"); numberToStrip = new StringBuilder("08122123456");
strippedNumber = "22123456"; strippedNumber = "22123456";
StringBuilder carrierCode = new StringBuilder(); StringBuilder carrierCode = new StringBuilder();
@ -1467,9 +1468,9 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
assertEquals("Should have had national prefix and carrier code stripped.", assertEquals("Should have had national prefix and carrier code stripped.",
strippedNumber, numberToStrip.toString()); strippedNumber, numberToStrip.toString());
// If there was a transform rule, check it was applied. // If there was a transform rule, check it was applied.
metadata.setNationalPrefixTransformRule("5$15");
metadata.nationalPrefixTransformRule = "5$15";
// Note that a capturing group is present here. // Note that a capturing group is present here.
metadata.setNationalPrefixForParsing("0(\\d{2})");
metadata.nationalPrefixForParsing = "0(\\d{2})";
numberToStrip = new StringBuilder("031123"); numberToStrip = new StringBuilder("031123");
String transformedNumber = "5315123"; String transformedNumber = "5315123";
assertTrue(phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata, null)); assertTrue(phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata, null));


+ 5
- 0
java/pom.xml View File

@ -180,6 +180,11 @@
<version>4.8.1</version> <version>4.8.1</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>2.6.1</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

+ 79
- 82
tools/java/common/src/com/google/i18n/phonenumbers/BuildMetadataFromXml.java View File

@ -126,10 +126,10 @@ public class BuildMetadataFromXml {
Map<Integer, List<String>> countryCodeToRegionCodeMap = Map<Integer, List<String>> countryCodeToRegionCodeMap =
new TreeMap<Integer, List<String>>(); new TreeMap<Integer, List<String>>();
for (PhoneMetadata metadata : metadataCollection.getMetadataList()) { for (PhoneMetadata metadata : metadataCollection.getMetadataList()) {
String regionCode = metadata.getId();
int countryCode = metadata.getCountryCode();
String regionCode = metadata.id;
int countryCode = metadata.countryCode;
if (countryCodeToRegionCodeMap.containsKey(countryCode)) { if (countryCodeToRegionCodeMap.containsKey(countryCode)) {
if (metadata.getMainCountryForCode()) {
if (metadata.mainCountryForCode) {
countryCodeToRegionCodeMap.get(countryCode).add(0, regionCode); countryCodeToRegionCodeMap.get(countryCode).add(0, regionCode);
} else { } else {
countryCodeToRegionCodeMap.get(countryCode).add(regionCode); countryCodeToRegionCodeMap.get(countryCode).add(regionCode);
@ -182,43 +182,42 @@ public class BuildMetadataFromXml {
static PhoneMetadata loadTerritoryTagMetadata(String regionCode, Element element, static PhoneMetadata loadTerritoryTagMetadata(String regionCode, Element element,
String nationalPrefix) { String nationalPrefix) {
PhoneMetadata metadata = new PhoneMetadata(); PhoneMetadata metadata = new PhoneMetadata();
metadata.setId(regionCode);
metadata.id = regionCode;
if (element.hasAttribute(COUNTRY_CODE)) { if (element.hasAttribute(COUNTRY_CODE)) {
metadata.setCountryCode(Integer.parseInt(element.getAttribute(COUNTRY_CODE)));
metadata.countryCode = Integer.parseInt(element.getAttribute(COUNTRY_CODE));
} }
if (element.hasAttribute(LEADING_DIGITS)) { if (element.hasAttribute(LEADING_DIGITS)) {
metadata.setLeadingDigits(validateRE(element.getAttribute(LEADING_DIGITS)));
metadata.leadingDigits = validateRE(element.getAttribute(LEADING_DIGITS));
} }
metadata.setInternationalPrefix(validateRE(element.getAttribute(INTERNATIONAL_PREFIX)));
metadata.internationalPrefix = validateRE(element.getAttribute(INTERNATIONAL_PREFIX));
if (element.hasAttribute(PREFERRED_INTERNATIONAL_PREFIX)) { if (element.hasAttribute(PREFERRED_INTERNATIONAL_PREFIX)) {
String preferredInternationalPrefix = element.getAttribute(PREFERRED_INTERNATIONAL_PREFIX);
metadata.setPreferredInternationalPrefix(preferredInternationalPrefix);
metadata.preferredInternationalPrefix = element.getAttribute(PREFERRED_INTERNATIONAL_PREFIX);
} }
if (element.hasAttribute(NATIONAL_PREFIX_FOR_PARSING)) { if (element.hasAttribute(NATIONAL_PREFIX_FOR_PARSING)) {
metadata.setNationalPrefixForParsing(
validateRE(element.getAttribute(NATIONAL_PREFIX_FOR_PARSING), true));
metadata.nationalPrefixForParsing =
validateRE(element.getAttribute(NATIONAL_PREFIX_FOR_PARSING), true);
if (element.hasAttribute(NATIONAL_PREFIX_TRANSFORM_RULE)) { if (element.hasAttribute(NATIONAL_PREFIX_TRANSFORM_RULE)) {
metadata.setNationalPrefixTransformRule(
validateRE(element.getAttribute(NATIONAL_PREFIX_TRANSFORM_RULE)));
metadata.nationalPrefixTransformRule =
validateRE(element.getAttribute(NATIONAL_PREFIX_TRANSFORM_RULE));
} }
} }
if (!nationalPrefix.isEmpty()) { if (!nationalPrefix.isEmpty()) {
metadata.setNationalPrefix(nationalPrefix);
if (!metadata.hasNationalPrefixForParsing()) {
metadata.setNationalPrefixForParsing(nationalPrefix);
metadata.nationalPrefix = nationalPrefix;
if (metadata.nationalPrefixForParsing.length() == 0) {
metadata.nationalPrefixForParsing = nationalPrefix;
} }
} }
if (element.hasAttribute(PREFERRED_EXTN_PREFIX)) { if (element.hasAttribute(PREFERRED_EXTN_PREFIX)) {
metadata.setPreferredExtnPrefix(element.getAttribute(PREFERRED_EXTN_PREFIX));
metadata.preferredExtnPrefix = element.getAttribute(PREFERRED_EXTN_PREFIX);
} }
if (element.hasAttribute(MAIN_COUNTRY_FOR_CODE)) { if (element.hasAttribute(MAIN_COUNTRY_FOR_CODE)) {
metadata.setMainCountryForCode(true);
metadata.mainCountryForCode = true;
} }
if (element.hasAttribute(LEADING_ZERO_POSSIBLE)) { if (element.hasAttribute(LEADING_ZERO_POSSIBLE)) {
metadata.setLeadingZeroPossible(true);
metadata.leadingZeroPossible = true;
} }
if (element.hasAttribute(MOBILE_NUMBER_PORTABLE_REGION)) { if (element.hasAttribute(MOBILE_NUMBER_PORTABLE_REGION)) {
metadata.setMobileNumberPortableRegion(true);
metadata.mobileNumberPortableRegion = true;
} }
return metadata; return metadata;
} }
@ -242,23 +241,23 @@ public class BuildMetadataFromXml {
LOGGER.log(Level.SEVERE, LOGGER.log(Level.SEVERE,
"A maximum of one intlFormat pattern for a numberFormat element should be " + "A maximum of one intlFormat pattern for a numberFormat element should be " +
"defined."); "defined.");
String countryId = metadata.getId().length() > 0 ?
metadata.getId() : Integer.toString(metadata.getCountryCode());
String countryId = metadata.id.length() > 0 ?
metadata.id : Integer.toString(metadata.countryCode);
throw new RuntimeException("Invalid number of intlFormat patterns for country: " + countryId); throw new RuntimeException("Invalid number of intlFormat patterns for country: " + countryId);
} else if (intlFormatPattern.getLength() == 0) { } else if (intlFormatPattern.getLength() == 0) {
// Default to use the same as the national pattern if none is defined. // Default to use the same as the national pattern if none is defined.
intlFormat.mergeFrom(nationalFormat); intlFormat.mergeFrom(nationalFormat);
} else { } else {
intlFormat.setPattern(numberFormatElement.getAttribute(PATTERN));
intlFormat.pattern = numberFormatElement.getAttribute(PATTERN);
setLeadingDigitsPatterns(numberFormatElement, intlFormat); setLeadingDigitsPatterns(numberFormatElement, intlFormat);
String intlFormatPatternValue = intlFormatPattern.item(0).getFirstChild().getNodeValue(); String intlFormatPatternValue = intlFormatPattern.item(0).getFirstChild().getNodeValue();
if (!intlFormatPatternValue.equals("NA")) { if (!intlFormatPatternValue.equals("NA")) {
intlFormat.setFormat(intlFormatPatternValue);
intlFormat.format = intlFormatPatternValue;
} }
hasExplicitIntlFormatDefined = true; hasExplicitIntlFormatDefined = true;
} }
if (intlFormat.hasFormat()) {
if (!intlFormat.format.isEmpty()) {
metadata.addIntlNumberFormat(intlFormat); metadata.addIntlNumberFormat(intlFormat);
} }
return hasExplicitIntlFormatDefined; return hasExplicitIntlFormatDefined;
@ -273,18 +272,18 @@ public class BuildMetadataFromXml {
static void loadNationalFormat(PhoneMetadata metadata, Element numberFormatElement, static void loadNationalFormat(PhoneMetadata metadata, Element numberFormatElement,
NumberFormat format) { NumberFormat format) {
setLeadingDigitsPatterns(numberFormatElement, format); setLeadingDigitsPatterns(numberFormatElement, format);
format.setPattern(validateRE(numberFormatElement.getAttribute(PATTERN)));
format.pattern = validateRE(numberFormatElement.getAttribute(PATTERN));
NodeList formatPattern = numberFormatElement.getElementsByTagName(FORMAT); NodeList formatPattern = numberFormatElement.getElementsByTagName(FORMAT);
int numFormatPatterns = formatPattern.getLength(); int numFormatPatterns = formatPattern.getLength();
if (numFormatPatterns != 1) { if (numFormatPatterns != 1) {
LOGGER.log(Level.SEVERE, "One format pattern for a numberFormat element should be defined."); LOGGER.log(Level.SEVERE, "One format pattern for a numberFormat element should be defined.");
String countryId = metadata.getId().length() > 0 ?
metadata.getId() : Integer.toString(metadata.getCountryCode());
String countryId = metadata.id.length() > 0 ?
metadata.id : Integer.toString(metadata.countryCode);
throw new RuntimeException("Invalid number of format patterns (" + numFormatPatterns + throw new RuntimeException("Invalid number of format patterns (" + numFormatPatterns +
") for country: " + countryId); ") for country: " + countryId);
} }
format.setFormat(formatPattern.item(0).getFirstChild().getNodeValue());
format.format = formatPattern.item(0).getFirstChild().getNodeValue();
} }
/** /**
@ -313,27 +312,27 @@ public class BuildMetadataFromXml {
NumberFormat format = new NumberFormat(); NumberFormat format = new NumberFormat();
if (numberFormatElement.hasAttribute(NATIONAL_PREFIX_FORMATTING_RULE)) { if (numberFormatElement.hasAttribute(NATIONAL_PREFIX_FORMATTING_RULE)) {
format.setNationalPrefixFormattingRule(
getNationalPrefixFormattingRuleFromElement(numberFormatElement, nationalPrefix));
format.nationalPrefixFormattingRule =
getNationalPrefixFormattingRuleFromElement(numberFormatElement, nationalPrefix);
} else { } else {
format.setNationalPrefixFormattingRule(nationalPrefixFormattingRule);
format.nationalPrefixFormattingRule = nationalPrefixFormattingRule;
} }
if (format.hasNationalPrefixFormattingRule()) {
if (!format.nationalPrefixFormattingRule.isEmpty()) {
if (numberFormatElement.hasAttribute(NATIONAL_PREFIX_OPTIONAL_WHEN_FORMATTING)) { if (numberFormatElement.hasAttribute(NATIONAL_PREFIX_OPTIONAL_WHEN_FORMATTING)) {
format.setNationalPrefixOptionalWhenFormatting(
format.nationalPrefixOptionalWhenFormatting =
Boolean.valueOf(numberFormatElement.getAttribute( Boolean.valueOf(numberFormatElement.getAttribute(
NATIONAL_PREFIX_OPTIONAL_WHEN_FORMATTING)));
NATIONAL_PREFIX_OPTIONAL_WHEN_FORMATTING));
} else { } else {
format.setNationalPrefixOptionalWhenFormatting(nationalPrefixOptionalWhenFormatting);
format.nationalPrefixOptionalWhenFormatting = nationalPrefixOptionalWhenFormatting;
} }
} }
if (numberFormatElement.hasAttribute(CARRIER_CODE_FORMATTING_RULE)) { if (numberFormatElement.hasAttribute(CARRIER_CODE_FORMATTING_RULE)) {
format.setDomesticCarrierCodeFormattingRule(validateRE(
format.domesticCarrierCodeFormattingRule = validateRE(
getDomesticCarrierCodeFormattingRuleFromElement(numberFormatElement, getDomesticCarrierCodeFormattingRuleFromElement(numberFormatElement,
nationalPrefix)));
nationalPrefix));
} else { } else {
format.setDomesticCarrierCodeFormattingRule(carrierCodeFormattingRule);
format.domesticCarrierCodeFormattingRule = carrierCodeFormattingRule;
} }
loadNationalFormat(metadata, numberFormatElement, format); loadNationalFormat(metadata, numberFormatElement, format);
metadata.addNumberFormat(format); metadata.addNumberFormat(format);
@ -415,8 +414,8 @@ public class BuildMetadataFromXml {
NodeList phoneNumberDescList = countryElement.getElementsByTagName(numberType); NodeList phoneNumberDescList = countryElement.getElementsByTagName(numberType);
PhoneNumberDesc numberDesc = new PhoneNumberDesc(); PhoneNumberDesc numberDesc = new PhoneNumberDesc();
if (phoneNumberDescList.getLength() == 0 && !isValidNumberType(numberType)) { if (phoneNumberDescList.getLength() == 0 && !isValidNumberType(numberType)) {
numberDesc.setNationalNumberPattern("NA");
numberDesc.setPossibleNumberPattern("NA");
numberDesc.nationalNumberPattern = "NA";
numberDesc.possibleNumberPattern = "NA";
return numberDesc; return numberDesc;
} }
numberDesc.mergeFrom(generalDesc); numberDesc.mergeFrom(generalDesc);
@ -424,20 +423,20 @@ public class BuildMetadataFromXml {
Element element = (Element) phoneNumberDescList.item(0); Element element = (Element) phoneNumberDescList.item(0);
NodeList possiblePattern = element.getElementsByTagName(POSSIBLE_NUMBER_PATTERN); NodeList possiblePattern = element.getElementsByTagName(POSSIBLE_NUMBER_PATTERN);
if (possiblePattern.getLength() > 0) { if (possiblePattern.getLength() > 0) {
numberDesc.setPossibleNumberPattern(
validateRE(possiblePattern.item(0).getFirstChild().getNodeValue(), true));
numberDesc.possibleNumberPattern =
validateRE(possiblePattern.item(0).getFirstChild().getNodeValue(), true);
} }
NodeList validPattern = element.getElementsByTagName(NATIONAL_NUMBER_PATTERN); NodeList validPattern = element.getElementsByTagName(NATIONAL_NUMBER_PATTERN);
if (validPattern.getLength() > 0) { if (validPattern.getLength() > 0) {
numberDesc.setNationalNumberPattern(
validateRE(validPattern.item(0).getFirstChild().getNodeValue(), true));
numberDesc.nationalNumberPattern =
validateRE(validPattern.item(0).getFirstChild().getNodeValue(), true);
} }
if (!liteBuild) { if (!liteBuild) {
NodeList exampleNumber = element.getElementsByTagName(EXAMPLE_NUMBER); NodeList exampleNumber = element.getElementsByTagName(EXAMPLE_NUMBER);
if (exampleNumber.getLength() > 0) { if (exampleNumber.getLength() > 0) {
numberDesc.setExampleNumber(exampleNumber.item(0).getFirstChild().getNodeValue());
numberDesc.exampleNumber = exampleNumber.item(0).getFirstChild().getNodeValue();
} }
} }
} }
@ -449,49 +448,48 @@ public class BuildMetadataFromXml {
boolean liteBuild, boolean isShortNumberMetadata) { boolean liteBuild, boolean isShortNumberMetadata) {
PhoneNumberDesc generalDesc = new PhoneNumberDesc(); PhoneNumberDesc generalDesc = new PhoneNumberDesc();
generalDesc = processPhoneNumberDescElement(generalDesc, element, GENERAL_DESC, liteBuild); generalDesc = processPhoneNumberDescElement(generalDesc, element, GENERAL_DESC, liteBuild);
metadata.setGeneralDesc(generalDesc);
metadata.generalDesc = generalDesc;
if (!isShortNumberMetadata) { if (!isShortNumberMetadata) {
// Set fields used only by regular length phone numbers. // Set fields used only by regular length phone numbers.
metadata.setFixedLine(
processPhoneNumberDescElement(generalDesc, element, FIXED_LINE, liteBuild));
metadata.setMobile(
processPhoneNumberDescElement(generalDesc, element, MOBILE, liteBuild));
metadata.setSharedCost(
processPhoneNumberDescElement(generalDesc, element, SHARED_COST, liteBuild));
metadata.setVoip(
processPhoneNumberDescElement(generalDesc, element, VOIP, liteBuild));
metadata.setPersonalNumber(
processPhoneNumberDescElement(generalDesc, element, PERSONAL_NUMBER, liteBuild));
metadata.setPager(
processPhoneNumberDescElement(generalDesc, element, PAGER, liteBuild));
metadata.setUan(
processPhoneNumberDescElement(generalDesc, element, UAN, liteBuild));
metadata.setVoicemail(
processPhoneNumberDescElement(generalDesc, element, VOICEMAIL, liteBuild));
metadata.setNoInternationalDialling(
metadata.fixedLine =
processPhoneNumberDescElement(generalDesc, element, FIXED_LINE, liteBuild);
metadata.mobile =
processPhoneNumberDescElement(generalDesc, element, MOBILE, liteBuild);
metadata.sharedCost =
processPhoneNumberDescElement(generalDesc, element, SHARED_COST, liteBuild);
metadata.voip =
processPhoneNumberDescElement(generalDesc, element, VOIP, liteBuild);
metadata.personalNumber =
processPhoneNumberDescElement(generalDesc, element, PERSONAL_NUMBER, liteBuild);
metadata.pager =
processPhoneNumberDescElement(generalDesc, element, PAGER, liteBuild);
metadata.uan =
processPhoneNumberDescElement(generalDesc, element, UAN, liteBuild);
metadata.voicemail =
processPhoneNumberDescElement(generalDesc, element, VOICEMAIL, liteBuild);
metadata.noInternationalDialling =
processPhoneNumberDescElement(generalDesc, element, NO_INTERNATIONAL_DIALLING, processPhoneNumberDescElement(generalDesc, element, NO_INTERNATIONAL_DIALLING,
liteBuild));
metadata.setSameMobileAndFixedLinePattern(
metadata.getMobile().getNationalNumberPattern().equals(
metadata.getFixedLine().getNationalNumberPattern()));
liteBuild);
metadata.sameMobileAndFixedLinePattern =
metadata.mobile.nationalNumberPattern.equals(metadata.fixedLine.nationalNumberPattern);
} else { } else {
// Set fields used only by short numbers. // Set fields used only by short numbers.
metadata.setStandardRate(
processPhoneNumberDescElement(generalDesc, element, STANDARD_RATE, liteBuild));
metadata.setShortCode(
processPhoneNumberDescElement(generalDesc, element, SHORT_CODE, liteBuild));
metadata.setCarrierSpecific(
processPhoneNumberDescElement(generalDesc, element, CARRIER_SPECIFIC, liteBuild));
metadata.setEmergency(
processPhoneNumberDescElement(generalDesc, element, EMERGENCY, liteBuild));
metadata.standardRate =
processPhoneNumberDescElement(generalDesc, element, STANDARD_RATE, liteBuild);
metadata.shortCode =
processPhoneNumberDescElement(generalDesc, element, SHORT_CODE, liteBuild);
metadata.carrierSpecific =
processPhoneNumberDescElement(generalDesc, element, CARRIER_SPECIFIC, liteBuild);
metadata.emergency =
processPhoneNumberDescElement(generalDesc, element, EMERGENCY, liteBuild);
} }
// Set fields used by both regular length and short numbers. // Set fields used by both regular length and short numbers.
metadata.setTollFree(
processPhoneNumberDescElement(generalDesc, element, TOLL_FREE, liteBuild));
metadata.setPremiumRate(
processPhoneNumberDescElement(generalDesc, element, PREMIUM_RATE, liteBuild));
metadata.tollFree =
processPhoneNumberDescElement(generalDesc, element, TOLL_FREE, liteBuild);
metadata.premiumRate =
processPhoneNumberDescElement(generalDesc, element, PREMIUM_RATE, liteBuild);
} }
// @VisibleForTesting // @VisibleForTesting
@ -502,8 +500,7 @@ public class BuildMetadataFromXml {
loadTerritoryTagMetadata(regionCode, element, nationalPrefix); loadTerritoryTagMetadata(regionCode, element, nationalPrefix);
String nationalPrefixFormattingRule = String nationalPrefixFormattingRule =
getNationalPrefixFormattingRuleFromElement(element, nationalPrefix); getNationalPrefixFormattingRuleFromElement(element, nationalPrefix);
loadAvailableFormats(metadata, element, nationalPrefix.toString(),
nationalPrefixFormattingRule.toString(),
loadAvailableFormats(metadata, element, nationalPrefix, nationalPrefixFormattingRule,
element.hasAttribute(NATIONAL_PREFIX_OPTIONAL_WHEN_FORMATTING)); element.hasAttribute(NATIONAL_PREFIX_OPTIONAL_WHEN_FORMATTING));
if (!isAlternateFormatsMetadata) { if (!isAlternateFormatsMetadata) {
// The alternate formats metadata does not need most of the patterns to be set. // The alternate formats metadata does not need most of the patterns to be set.


+ 66
- 68
tools/java/common/test/com/google/i18n/phonenumbers/BuildMetadataFromXmlTest.java View File

@ -122,17 +122,17 @@ public class BuildMetadataFromXmlTest extends TestCase {
Element territoryElement = parseXmlString(xmlInput); Element territoryElement = parseXmlString(xmlInput);
PhoneMetadata phoneMetadata = PhoneMetadata phoneMetadata =
BuildMetadataFromXml.loadTerritoryTagMetadata("33", territoryElement, "0"); BuildMetadataFromXml.loadTerritoryTagMetadata("33", territoryElement, "0");
assertEquals(33, phoneMetadata.getCountryCode());
assertEquals("2", phoneMetadata.getLeadingDigits());
assertEquals("00", phoneMetadata.getInternationalPrefix());
assertEquals("0011", phoneMetadata.getPreferredInternationalPrefix());
assertEquals("0", phoneMetadata.getNationalPrefixForParsing());
assertEquals("9$1", phoneMetadata.getNationalPrefixTransformRule());
assertEquals("0", phoneMetadata.getNationalPrefix());
assertEquals(" x", phoneMetadata.getPreferredExtnPrefix());
assertTrue(phoneMetadata.getMainCountryForCode());
assertTrue(phoneMetadata.isLeadingZeroPossible());
assertTrue(phoneMetadata.isMobileNumberPortableRegion());
assertEquals(33, phoneMetadata.countryCode);
assertEquals("2", phoneMetadata.leadingDigits);
assertEquals("00", phoneMetadata.internationalPrefix);
assertEquals("0011", phoneMetadata.preferredInternationalPrefix);
assertEquals("0", phoneMetadata.nationalPrefixForParsing);
assertEquals("9$1", phoneMetadata.nationalPrefixTransformRule);
assertEquals("0", phoneMetadata.nationalPrefix);
assertEquals(" x", phoneMetadata.preferredExtnPrefix);
assertTrue(phoneMetadata.mainCountryForCode);
assertTrue(phoneMetadata.leadingZeroPossible);
assertTrue(phoneMetadata.mobileNumberPortableRegion);
} }
public void testLoadTerritoryTagMetadataSetsBooleanFieldsToFalseByDefault() public void testLoadTerritoryTagMetadataSetsBooleanFieldsToFalseByDefault()
@ -141,9 +141,9 @@ public class BuildMetadataFromXmlTest extends TestCase {
Element territoryElement = parseXmlString(xmlInput); Element territoryElement = parseXmlString(xmlInput);
PhoneMetadata phoneMetadata = PhoneMetadata phoneMetadata =
BuildMetadataFromXml.loadTerritoryTagMetadata("33", territoryElement, ""); BuildMetadataFromXml.loadTerritoryTagMetadata("33", territoryElement, "");
assertFalse(phoneMetadata.getMainCountryForCode());
assertFalse(phoneMetadata.isLeadingZeroPossible());
assertFalse(phoneMetadata.isMobileNumberPortableRegion());
assertFalse(phoneMetadata.mainCountryForCode);
assertFalse(phoneMetadata.leadingZeroPossible);
assertFalse(phoneMetadata.mobileNumberPortableRegion);
} }
public void testLoadTerritoryTagMetadataSetsNationalPrefixForParsingByDefault() public void testLoadTerritoryTagMetadataSetsNationalPrefixForParsingByDefault()
@ -153,8 +153,8 @@ public class BuildMetadataFromXmlTest extends TestCase {
PhoneMetadata phoneMetadata = PhoneMetadata phoneMetadata =
BuildMetadataFromXml.loadTerritoryTagMetadata("33", territoryElement, "00"); BuildMetadataFromXml.loadTerritoryTagMetadata("33", territoryElement, "00");
// When unspecified, nationalPrefixForParsing defaults to nationalPrefix. // When unspecified, nationalPrefixForParsing defaults to nationalPrefix.
assertEquals("00", phoneMetadata.getNationalPrefix());
assertEquals(phoneMetadata.getNationalPrefix(), phoneMetadata.getNationalPrefixForParsing());
assertEquals("00", phoneMetadata.nationalPrefix);
assertEquals(phoneMetadata.nationalPrefix, phoneMetadata.nationalPrefixForParsing);
} }
public void testLoadTerritoryTagMetadataWithRequiredAttributesOnly() public void testLoadTerritoryTagMetadataWithRequiredAttributesOnly()
@ -176,7 +176,7 @@ public class BuildMetadataFromXmlTest extends TestCase {
assertTrue(BuildMetadataFromXml.loadInternationalFormat(metadata, numberFormatElement, assertTrue(BuildMetadataFromXml.loadInternationalFormat(metadata, numberFormatElement,
nationalFormat)); nationalFormat));
assertEquals(intlFormat, metadata.getIntlNumberFormat(0).getFormat());
assertEquals(intlFormat, metadata.getIntlNumberFormat(0).format);
} }
public void testLoadInternationalFormatWithBothNationalAndIntlFormatsDefined() public void testLoadInternationalFormatWithBothNationalAndIntlFormatsDefined()
@ -186,11 +186,11 @@ public class BuildMetadataFromXmlTest extends TestCase {
Element numberFormatElement = parseXmlString(xmlInput); Element numberFormatElement = parseXmlString(xmlInput);
PhoneMetadata metadata = new PhoneMetadata(); PhoneMetadata metadata = new PhoneMetadata();
NumberFormat nationalFormat = new NumberFormat(); NumberFormat nationalFormat = new NumberFormat();
nationalFormat.setFormat("$1");
nationalFormat.format = "$1";
assertTrue(BuildMetadataFromXml.loadInternationalFormat(metadata, numberFormatElement, assertTrue(BuildMetadataFromXml.loadInternationalFormat(metadata, numberFormatElement,
nationalFormat)); nationalFormat));
assertEquals(intlFormat, metadata.getIntlNumberFormat(0).getFormat());
assertEquals(intlFormat, metadata.getIntlNumberFormat(0).format);
} }
public void testLoadInternationalFormatExpectsOnlyOnePattern() public void testLoadInternationalFormatExpectsOnlyOnePattern()
@ -216,11 +216,11 @@ public class BuildMetadataFromXmlTest extends TestCase {
PhoneMetadata metadata = new PhoneMetadata(); PhoneMetadata metadata = new PhoneMetadata();
NumberFormat nationalFormat = new NumberFormat(); NumberFormat nationalFormat = new NumberFormat();
String nationalPattern = "$1 $2 $3"; String nationalPattern = "$1 $2 $3";
nationalFormat.setFormat(nationalPattern);
nationalFormat.format = nationalPattern;
assertFalse(BuildMetadataFromXml.loadInternationalFormat(metadata, numberFormatElement, assertFalse(BuildMetadataFromXml.loadInternationalFormat(metadata, numberFormatElement,
nationalFormat)); nationalFormat));
assertEquals(nationalPattern, metadata.getIntlNumberFormat(0).getFormat());
assertEquals(nationalPattern, metadata.getIntlNumberFormat(0).format);
} }
public void testLoadInternationalFormatCopiesNationalFormatData() public void testLoadInternationalFormatCopiesNationalFormatData()
@ -229,12 +229,12 @@ public class BuildMetadataFromXmlTest extends TestCase {
Element numberFormatElement = parseXmlString(xmlInput); Element numberFormatElement = parseXmlString(xmlInput);
PhoneMetadata metadata = new PhoneMetadata(); PhoneMetadata metadata = new PhoneMetadata();
NumberFormat nationalFormat = new NumberFormat(); NumberFormat nationalFormat = new NumberFormat();
nationalFormat.setFormat("$1-$2");
nationalFormat.setNationalPrefixOptionalWhenFormatting(true);
nationalFormat.format = "$1-$2";
nationalFormat.nationalPrefixOptionalWhenFormatting = true;
assertFalse(BuildMetadataFromXml.loadInternationalFormat(metadata, numberFormatElement, assertFalse(BuildMetadataFromXml.loadInternationalFormat(metadata, numberFormatElement,
nationalFormat)); nationalFormat));
assertTrue(metadata.getIntlNumberFormat(0).isNationalPrefixOptionalWhenFormatting());
assertTrue(metadata.getIntlNumberFormat(0).nationalPrefixOptionalWhenFormatting);
} }
public void testLoadNationalFormat() public void testLoadNationalFormat()
@ -246,7 +246,7 @@ public class BuildMetadataFromXmlTest extends TestCase {
PhoneMetadata metadata = new PhoneMetadata(); PhoneMetadata metadata = new PhoneMetadata();
NumberFormat numberFormat = new NumberFormat(); NumberFormat numberFormat = new NumberFormat();
BuildMetadataFromXml.loadNationalFormat(metadata, numberFormatElement, numberFormat); BuildMetadataFromXml.loadNationalFormat(metadata, numberFormatElement, numberFormat);
assertEquals(nationalFormat, numberFormat.getFormat());
assertEquals(nationalFormat, numberFormat.format);
} }
public void testLoadNationalFormatRequiresFormat() public void testLoadNationalFormatRequiresFormat()
@ -295,9 +295,9 @@ public class BuildMetadataFromXmlTest extends TestCase {
PhoneMetadata metadata = new PhoneMetadata(); PhoneMetadata metadata = new PhoneMetadata();
BuildMetadataFromXml.loadAvailableFormats( BuildMetadataFromXml.loadAvailableFormats(
metadata, element, "0", "", false /* NP not optional */); metadata, element, "0", "", false /* NP not optional */);
assertEquals("($1)", metadata.getNumberFormat(0).getNationalPrefixFormattingRule());
assertEquals("0 $CC ($1)", metadata.getNumberFormat(0).getDomesticCarrierCodeFormattingRule());
assertEquals("$1 $2 $3", metadata.getNumberFormat(0).getFormat());
assertEquals("($1)", metadata.getNumberFormat(0).nationalPrefixFormattingRule);
assertEquals("0 $CC ($1)", metadata.getNumberFormat(0).domesticCarrierCodeFormattingRule);
assertEquals("$1 $2 $3", metadata.getNumberFormat(0).format);
} }
public void testLoadAvailableFormatsPropagatesCarrierCodeFormattingRule() public void testLoadAvailableFormatsPropagatesCarrierCodeFormattingRule()
@ -314,9 +314,9 @@ public class BuildMetadataFromXmlTest extends TestCase {
PhoneMetadata metadata = new PhoneMetadata(); PhoneMetadata metadata = new PhoneMetadata();
BuildMetadataFromXml.loadAvailableFormats( BuildMetadataFromXml.loadAvailableFormats(
metadata, element, "0", "", false /* NP not optional */); metadata, element, "0", "", false /* NP not optional */);
assertEquals("($1)", metadata.getNumberFormat(0).getNationalPrefixFormattingRule());
assertEquals("0 $CC ($1)", metadata.getNumberFormat(0).getDomesticCarrierCodeFormattingRule());
assertEquals("$1 $2 $3", metadata.getNumberFormat(0).getFormat());
assertEquals("($1)", metadata.getNumberFormat(0).nationalPrefixFormattingRule);
assertEquals("0 $CC ($1)", metadata.getNumberFormat(0).domesticCarrierCodeFormattingRule);
assertEquals("$1 $2 $3", metadata.getNumberFormat(0).format);
} }
public void testLoadAvailableFormatsSetsProvidedNationalPrefixFormattingRule() public void testLoadAvailableFormatsSetsProvidedNationalPrefixFormattingRule()
@ -331,7 +331,7 @@ public class BuildMetadataFromXmlTest extends TestCase {
PhoneMetadata metadata = new PhoneMetadata(); PhoneMetadata metadata = new PhoneMetadata();
BuildMetadataFromXml.loadAvailableFormats( BuildMetadataFromXml.loadAvailableFormats(
metadata, element, "", "($1)", false /* NP not optional */); metadata, element, "", "($1)", false /* NP not optional */);
assertEquals("($1)", metadata.getNumberFormat(0).getNationalPrefixFormattingRule());
assertEquals("($1)", metadata.getNumberFormat(0).nationalPrefixFormattingRule);
} }
public void testLoadAvailableFormatsClearsIntlFormat() public void testLoadAvailableFormatsClearsIntlFormat()
@ -362,8 +362,8 @@ public class BuildMetadataFromXmlTest extends TestCase {
PhoneMetadata metadata = new PhoneMetadata(); PhoneMetadata metadata = new PhoneMetadata();
BuildMetadataFromXml.loadAvailableFormats( BuildMetadataFromXml.loadAvailableFormats(
metadata, element, "0", "($1)", false /* NP not optional */); metadata, element, "0", "($1)", false /* NP not optional */);
assertEquals("$1 $2 $3", metadata.getNumberFormat(0).getFormat());
assertEquals("$1-$2", metadata.getNumberFormat(1).getFormat());
assertEquals("$1 $2 $3", metadata.getNumberFormat(0).format);
assertEquals("$1-$2", metadata.getNumberFormat(1).format);
} }
public void testLoadInternationalFormatDoesNotSetIntlFormatWhenNA() public void testLoadInternationalFormatDoesNotSetIntlFormatWhenNA()
@ -372,7 +372,7 @@ public class BuildMetadataFromXmlTest extends TestCase {
Element numberFormatElement = parseXmlString(xmlInput); Element numberFormatElement = parseXmlString(xmlInput);
PhoneMetadata metadata = new PhoneMetadata(); PhoneMetadata metadata = new PhoneMetadata();
NumberFormat nationalFormat = new NumberFormat(); NumberFormat nationalFormat = new NumberFormat();
nationalFormat.setFormat("$1 $2");
nationalFormat.format = "$1 $2";
BuildMetadataFromXml.loadInternationalFormat(metadata, numberFormatElement, BuildMetadataFromXml.loadInternationalFormat(metadata, numberFormatElement,
nationalFormat); nationalFormat);
@ -455,26 +455,26 @@ public class BuildMetadataFromXmlTest extends TestCase {
phoneNumberDesc = BuildMetadataFromXml.processPhoneNumberDescElement( phoneNumberDesc = BuildMetadataFromXml.processPhoneNumberDescElement(
generalDesc, territoryElement, "invalidType", false); generalDesc, territoryElement, "invalidType", false);
assertEquals("NA", phoneNumberDesc.getPossibleNumberPattern());
assertEquals("NA", phoneNumberDesc.getNationalNumberPattern());
assertEquals("NA", phoneNumberDesc.possibleNumberPattern);
assertEquals("NA", phoneNumberDesc.nationalNumberPattern);
} }
public void testProcessPhoneNumberDescElementMergesWithGeneralDesc() public void testProcessPhoneNumberDescElementMergesWithGeneralDesc()
throws ParserConfigurationException, SAXException, IOException { throws ParserConfigurationException, SAXException, IOException {
PhoneNumberDesc generalDesc = new PhoneNumberDesc(); PhoneNumberDesc generalDesc = new PhoneNumberDesc();
generalDesc.setPossibleNumberPattern("\\d{6}");
generalDesc.possibleNumberPattern = "\\d{6}";
Element territoryElement = parseXmlString("<territory><fixedLine/></territory>"); Element territoryElement = parseXmlString("<territory><fixedLine/></territory>");
PhoneNumberDesc phoneNumberDesc; PhoneNumberDesc phoneNumberDesc;
phoneNumberDesc = BuildMetadataFromXml.processPhoneNumberDescElement( phoneNumberDesc = BuildMetadataFromXml.processPhoneNumberDescElement(
generalDesc, territoryElement, "fixedLine", false); generalDesc, territoryElement, "fixedLine", false);
assertEquals("\\d{6}", phoneNumberDesc.getPossibleNumberPattern());
assertEquals("\\d{6}", phoneNumberDesc.possibleNumberPattern);
} }
public void testProcessPhoneNumberDescElementOverridesGeneralDesc() public void testProcessPhoneNumberDescElementOverridesGeneralDesc()
throws ParserConfigurationException, SAXException, IOException { throws ParserConfigurationException, SAXException, IOException {
PhoneNumberDesc generalDesc = new PhoneNumberDesc(); PhoneNumberDesc generalDesc = new PhoneNumberDesc();
generalDesc.setPossibleNumberPattern("\\d{8}");
generalDesc.possibleNumberPattern = "\\d{8}";
String xmlInput = String xmlInput =
"<territory><fixedLine>" + "<territory><fixedLine>" +
" <possibleNumberPattern>\\d{6}</possibleNumberPattern>" + " <possibleNumberPattern>\\d{6}</possibleNumberPattern>" +
@ -484,7 +484,7 @@ public class BuildMetadataFromXmlTest extends TestCase {
phoneNumberDesc = BuildMetadataFromXml.processPhoneNumberDescElement( phoneNumberDesc = BuildMetadataFromXml.processPhoneNumberDescElement(
generalDesc, territoryElement, "fixedLine", false); generalDesc, territoryElement, "fixedLine", false);
assertEquals("\\d{6}", phoneNumberDesc.getPossibleNumberPattern());
assertEquals("\\d{6}", phoneNumberDesc.possibleNumberPattern);
} }
public void testProcessPhoneNumberDescElementHandlesLiteBuild() public void testProcessPhoneNumberDescElementHandlesLiteBuild()
@ -499,7 +499,7 @@ public class BuildMetadataFromXmlTest extends TestCase {
phoneNumberDesc = BuildMetadataFromXml.processPhoneNumberDescElement( phoneNumberDesc = BuildMetadataFromXml.processPhoneNumberDescElement(
generalDesc, territoryElement, "fixedLine", true); generalDesc, territoryElement, "fixedLine", true);
assertEquals("", phoneNumberDesc.getExampleNumber());
assertEquals("", phoneNumberDesc.exampleNumber);
} }
public void testProcessPhoneNumberDescOutputsExampleNumberByDefault() public void testProcessPhoneNumberDescOutputsExampleNumberByDefault()
@ -514,7 +514,7 @@ public class BuildMetadataFromXmlTest extends TestCase {
phoneNumberDesc = BuildMetadataFromXml.processPhoneNumberDescElement( phoneNumberDesc = BuildMetadataFromXml.processPhoneNumberDescElement(
generalDesc, territoryElement, "fixedLine", false); generalDesc, territoryElement, "fixedLine", false);
assertEquals("01 01 01 01", phoneNumberDesc.getExampleNumber());
assertEquals("01 01 01 01", phoneNumberDesc.exampleNumber);
} }
public void testProcessPhoneNumberDescRemovesWhiteSpacesInPatterns() public void testProcessPhoneNumberDescRemovesWhiteSpacesInPatterns()
@ -529,7 +529,7 @@ public class BuildMetadataFromXmlTest extends TestCase {
phoneNumberDesc = BuildMetadataFromXml.processPhoneNumberDescElement( phoneNumberDesc = BuildMetadataFromXml.processPhoneNumberDescElement(
generalDesc, countryElement, "fixedLine", false); generalDesc, countryElement, "fixedLine", false);
assertEquals("\\d{6}", phoneNumberDesc.getPossibleNumberPattern());
assertEquals("\\d{6}", phoneNumberDesc.possibleNumberPattern);
} }
// Tests setRelevantDescPatterns(). // Tests setRelevantDescPatterns().
@ -545,7 +545,7 @@ public class BuildMetadataFromXmlTest extends TestCase {
// Should set sameMobileAndFixedPattern to true. // Should set sameMobileAndFixedPattern to true.
BuildMetadataFromXml.setRelevantDescPatterns(metadata, territoryElement, false /* liteBuild */, BuildMetadataFromXml.setRelevantDescPatterns(metadata, territoryElement, false /* liteBuild */,
false /* isShortNumberMetadata */); false /* isShortNumberMetadata */);
assertTrue(metadata.isSameMobileAndFixedLinePattern());
assertTrue(metadata.sameMobileAndFixedLinePattern);
} }
public void testSetRelevantDescPatternsSetsAllDescriptionsForRegularLengthNumbers() public void testSetRelevantDescPatternsSetsAllDescriptionsForRegularLengthNumbers()
@ -566,15 +566,15 @@ public class BuildMetadataFromXmlTest extends TestCase {
PhoneMetadata metadata = new PhoneMetadata(); PhoneMetadata metadata = new PhoneMetadata();
BuildMetadataFromXml.setRelevantDescPatterns(metadata, territoryElement, false /* liteBuild */, BuildMetadataFromXml.setRelevantDescPatterns(metadata, territoryElement, false /* liteBuild */,
false /* isShortNumberMetadata */); false /* isShortNumberMetadata */);
assertEquals("\\d{1}", metadata.getFixedLine().getNationalNumberPattern());
assertEquals("\\d{2}", metadata.getMobile().getNationalNumberPattern());
assertEquals("\\d{3}", metadata.getPager().getNationalNumberPattern());
assertEquals("\\d{4}", metadata.getTollFree().getNationalNumberPattern());
assertEquals("\\d{5}", metadata.getPremiumRate().getNationalNumberPattern());
assertEquals("\\d{6}", metadata.getSharedCost().getNationalNumberPattern());
assertEquals("\\d{7}", metadata.getPersonalNumber().getNationalNumberPattern());
assertEquals("\\d{8}", metadata.getVoip().getNationalNumberPattern());
assertEquals("\\d{9}", metadata.getUan().getNationalNumberPattern());
assertEquals("\\d{1}", metadata.fixedLine.nationalNumberPattern);
assertEquals("\\d{2}", metadata.mobile.nationalNumberPattern);
assertEquals("\\d{3}", metadata.pager.nationalNumberPattern);
assertEquals("\\d{4}", metadata.tollFree.nationalNumberPattern);
assertEquals("\\d{5}", metadata.premiumRate.nationalNumberPattern);
assertEquals("\\d{6}", metadata.sharedCost.nationalNumberPattern);
assertEquals("\\d{7}", metadata.personalNumber.nationalNumberPattern);
assertEquals("\\d{8}", metadata.voip.nationalNumberPattern);
assertEquals("\\d{9}", metadata.uan.nationalNumberPattern);
} }
public void testSetRelevantDescPatternsSetsAllDescriptionsForShortNumbers() public void testSetRelevantDescPatternsSetsAllDescriptionsForShortNumbers()
@ -593,11 +593,11 @@ public class BuildMetadataFromXmlTest extends TestCase {
PhoneMetadata metadata = new PhoneMetadata(); PhoneMetadata metadata = new PhoneMetadata();
BuildMetadataFromXml.setRelevantDescPatterns(metadata, territoryElement, false /* liteBuild */, BuildMetadataFromXml.setRelevantDescPatterns(metadata, territoryElement, false /* liteBuild */,
true /* isShortNumberMetadata */); true /* isShortNumberMetadata */);
assertEquals("\\d{1}", metadata.getTollFree().getNationalNumberPattern());
assertEquals("\\d{2}", metadata.getStandardRate().getNationalNumberPattern());
assertEquals("\\d{3}", metadata.getPremiumRate().getNationalNumberPattern());
assertEquals("\\d{4}", metadata.getShortCode().getNationalNumberPattern());
assertEquals("\\d{5}", metadata.getCarrierSpecific().getNationalNumberPattern());
assertEquals("\\d{1}", metadata.tollFree.nationalNumberPattern);
assertEquals("\\d{2}", metadata.standardRate.nationalNumberPattern);
assertEquals("\\d{3}", metadata.premiumRate.nationalNumberPattern);
assertEquals("\\d{4}", metadata.shortCode.nationalNumberPattern);
assertEquals("\\d{5}", metadata.carrierSpecific.nationalNumberPattern);
} }
public void testAlternateFormatsOmitsDescPatterns() public void testAlternateFormatsOmitsDescPatterns()
@ -617,13 +617,11 @@ public class BuildMetadataFromXmlTest extends TestCase {
PhoneMetadata metadata = BuildMetadataFromXml.loadCountryMetadata("FR", territoryElement, PhoneMetadata metadata = BuildMetadataFromXml.loadCountryMetadata("FR", territoryElement,
false /* liteBuild */, false /* isShortNumberMetadata */, false /* liteBuild */, false /* isShortNumberMetadata */,
true /* isAlternateFormatsMetadata */); true /* isAlternateFormatsMetadata */);
assertEquals("(1)(\\d{3})", metadata.getNumberFormat(0).getPattern());
assertEquals("(1)(\\d{3})", metadata.getNumberFormat(0).pattern);
assertEquals("1", metadata.getNumberFormat(0).getLeadingDigitsPattern(0)); assertEquals("1", metadata.getNumberFormat(0).getLeadingDigitsPattern(0));
assertEquals("$1", metadata.getNumberFormat(0).getFormat());
assertFalse(metadata.hasFixedLine());
assertNull(metadata.getFixedLine());
assertFalse(metadata.hasShortCode());
assertNull(metadata.getShortCode());
assertEquals("$1", metadata.getNumberFormat(0).format);
assertNull(metadata.fixedLine);
assertNull(metadata.shortCode);
} }
public void testNationalPrefixRulesSetCorrectly() public void testNationalPrefixRulesSetCorrectly()
@ -647,11 +645,11 @@ public class BuildMetadataFromXmlTest extends TestCase {
PhoneMetadata metadata = BuildMetadataFromXml.loadCountryMetadata("FR", territoryElement, PhoneMetadata metadata = BuildMetadataFromXml.loadCountryMetadata("FR", territoryElement,
false /* liteBuild */, false /* isShortNumberMetadata */, false /* liteBuild */, false /* isShortNumberMetadata */,
true /* isAlternateFormatsMetadata */); true /* isAlternateFormatsMetadata */);
assertTrue(metadata.getNumberFormat(0).isNationalPrefixOptionalWhenFormatting());
assertTrue(metadata.getNumberFormat(0).nationalPrefixOptionalWhenFormatting);
// This is inherited from the territory, with $NP replaced by the actual national prefix, and // This is inherited from the territory, with $NP replaced by the actual national prefix, and
// $FG replaced with $1. // $FG replaced with $1.
assertEquals("0$1", metadata.getNumberFormat(0).getNationalPrefixFormattingRule());
assertEquals("0$1", metadata.getNumberFormat(0).nationalPrefixFormattingRule);
// Here it is explicitly set to false. // Here it is explicitly set to false.
assertFalse(metadata.getNumberFormat(1).isNationalPrefixOptionalWhenFormatting());
assertFalse(metadata.getNumberFormat(1).nationalPrefixOptionalWhenFormatting);
} }
} }

+ 49
- 49
tools/java/java-build/src/com/google/i18n/phonenumbers/BuildMetadataJsonFromXml.java View File

@ -136,11 +136,11 @@ public class BuildMetadataJsonFromXml extends Command {
} else { } else {
writer.write(","); writer.write(",");
} }
String key = metadata.getId();
String key = metadata.id;
// For non-geographical country calling codes (e.g. +800), use the country calling codes // For non-geographical country calling codes (e.g. +800), use the country calling codes
// instead of the region code as key in the map. // instead of the region code as key in the map.
if (key.equals("001")) { if (key.equals("001")) {
key = Integer.toString(metadata.getCountryCode());
key = Integer.toString(metadata.countryCode);
} }
JSArrayBuilder jsArrayBuilder = new JSArrayBuilder(); JSArrayBuilder jsArrayBuilder = new JSArrayBuilder();
toJsArray(metadata, jsArrayBuilder); toJsArray(metadata, jsArrayBuilder);
@ -182,9 +182,9 @@ public class BuildMetadataJsonFromXml extends Command {
// missing 0 // missing 0
jsArrayBuilder.append(null); jsArrayBuilder.append(null);
// required string pattern = 1; // required string pattern = 1;
jsArrayBuilder.append(format.getPattern());
jsArrayBuilder.append(format.pattern);
// required string format = 2; // required string format = 2;
jsArrayBuilder.append(format.getFormat());
jsArrayBuilder.append(format.format);
// repeated string leading_digits_pattern = 3; // repeated string leading_digits_pattern = 3;
int leadingDigitsPatternSize = format.leadingDigitsPatternSize(); int leadingDigitsPatternSize = format.leadingDigitsPatternSize();
if (leadingDigitsPatternSize > 0) { if (leadingDigitsPatternSize > 0) {
@ -197,20 +197,20 @@ public class BuildMetadataJsonFromXml extends Command {
jsArrayBuilder.append(null); jsArrayBuilder.append(null);
} }
// optional string national_prefix_formatting_rule = 4; // optional string national_prefix_formatting_rule = 4;
if (format.hasNationalPrefixFormattingRule()) {
jsArrayBuilder.append(format.getNationalPrefixFormattingRule());
if (format.nationalPrefixFormattingRule.length() != 0) {
jsArrayBuilder.append(format.nationalPrefixFormattingRule);
} else { } else {
jsArrayBuilder.append(null); jsArrayBuilder.append(null);
} }
// optional string domestic_carrier_code_formatting_rule = 5; // optional string domestic_carrier_code_formatting_rule = 5;
if (format.hasDomesticCarrierCodeFormattingRule()) {
jsArrayBuilder.append(format.getDomesticCarrierCodeFormattingRule());
if (format.domesticCarrierCodeFormattingRule.length() != 0) {
jsArrayBuilder.append(format.domesticCarrierCodeFormattingRule);
} else { } else {
jsArrayBuilder.append(null); jsArrayBuilder.append(null);
} }
// optional bool national_prefix_optional_when_formatting = 6; // optional bool national_prefix_optional_when_formatting = 6;
if (format.hasNationalPrefixOptionalWhenFormatting()) {
jsArrayBuilder.append(format.isNationalPrefixOptionalWhenFormatting());
if (format.nationalPrefixOptionalWhenFormatting) {
jsArrayBuilder.append(format.nationalPrefixOptionalWhenFormatting);
} else { } else {
jsArrayBuilder.append(null); jsArrayBuilder.append(null);
} }
@ -233,14 +233,14 @@ public class BuildMetadataJsonFromXml extends Command {
// missing 1 // missing 1
jsArrayBuilder.append(null); jsArrayBuilder.append(null);
// optional string national_number_pattern = 2; // optional string national_number_pattern = 2;
if (desc.hasNationalNumberPattern()) {
jsArrayBuilder.append(desc.getNationalNumberPattern());
if (desc.nationalNumberPattern.length() != 0) {
jsArrayBuilder.append(desc.nationalNumberPattern);
} else { } else {
jsArrayBuilder.append(null); jsArrayBuilder.append(null);
} }
// optional string possible_number_pattern = 3; // optional string possible_number_pattern = 3;
if (desc.hasPossibleNumberPattern()) {
jsArrayBuilder.append(desc.getPossibleNumberPattern());
if (desc.possibleNumberPattern.length() != 0) {
jsArrayBuilder.append(desc.possibleNumberPattern);
} else { } else {
jsArrayBuilder.append(null); jsArrayBuilder.append(null);
} }
@ -249,8 +249,8 @@ public class BuildMetadataJsonFromXml extends Command {
// missing 5 // missing 5
jsArrayBuilder.append(null); jsArrayBuilder.append(null);
// optional string example_number = 6; // optional string example_number = 6;
if (desc.hasExampleNumber()) {
jsArrayBuilder.append(desc.getExampleNumber());
if (desc.exampleNumber.length() != 0) {
jsArrayBuilder.append(desc.exampleNumber);
} else { } else {
jsArrayBuilder.append(null); jsArrayBuilder.append(null);
} }
@ -265,70 +265,70 @@ public class BuildMetadataJsonFromXml extends Command {
// missing 0 // missing 0
jsArrayBuilder.append(null); jsArrayBuilder.append(null);
// optional PhoneNumberDesc general_desc = 1; // optional PhoneNumberDesc general_desc = 1;
toJsArray(metadata.getGeneralDesc(), jsArrayBuilder);
toJsArray(metadata.generalDesc, jsArrayBuilder);
// optional PhoneNumberDesc fixed_line = 2; // optional PhoneNumberDesc fixed_line = 2;
toJsArray(metadata.getFixedLine(), jsArrayBuilder);
toJsArray(metadata.fixedLine, jsArrayBuilder);
// optional PhoneNumberDesc mobile = 3; // optional PhoneNumberDesc mobile = 3;
toJsArray(metadata.getMobile(), jsArrayBuilder);
toJsArray(metadata.mobile, jsArrayBuilder);
// optional PhoneNumberDesc toll_free = 4; // optional PhoneNumberDesc toll_free = 4;
toJsArray(metadata.getTollFree(), jsArrayBuilder);
toJsArray(metadata.tollFree, jsArrayBuilder);
// optional PhoneNumberDesc premium_rate = 5; // optional PhoneNumberDesc premium_rate = 5;
toJsArray(metadata.getPremiumRate(), jsArrayBuilder);
toJsArray(metadata.premiumRate, jsArrayBuilder);
// optional PhoneNumberDesc shared_cost = 6; // optional PhoneNumberDesc shared_cost = 6;
toJsArray(metadata.getSharedCost(), jsArrayBuilder);
toJsArray(metadata.sharedCost, jsArrayBuilder);
// optional PhoneNumberDesc personal_number = 7; // optional PhoneNumberDesc personal_number = 7;
toJsArray(metadata.getPersonalNumber(), jsArrayBuilder);
toJsArray(metadata.personalNumber, jsArrayBuilder);
// optional PhoneNumberDesc voip = 8; // optional PhoneNumberDesc voip = 8;
toJsArray(metadata.getVoip(), jsArrayBuilder);
toJsArray(metadata.voip, jsArrayBuilder);
// required string id = 9; // required string id = 9;
jsArrayBuilder.append(metadata.getId());
jsArrayBuilder.append(metadata.id);
// optional int32 country_code = 10; // optional int32 country_code = 10;
if (metadata.hasCountryCode()) {
jsArrayBuilder.append(metadata.getCountryCode());
if (metadata.countryCode != 0) {
jsArrayBuilder.append(metadata.countryCode);
} else { } else {
jsArrayBuilder.append(null); jsArrayBuilder.append(null);
} }
// optional string international_prefix = 11; // optional string international_prefix = 11;
if (metadata.hasInternationalPrefix()) {
jsArrayBuilder.append(metadata.getInternationalPrefix());
if (metadata.internationalPrefix.length() != 0) {
jsArrayBuilder.append(metadata.internationalPrefix);
} else { } else {
jsArrayBuilder.append(null); jsArrayBuilder.append(null);
} }
// optional string national_prefix = 12; // optional string national_prefix = 12;
if (metadata.hasNationalPrefix()) {
jsArrayBuilder.append(metadata.getNationalPrefix());
if (metadata.nationalPrefix.length() != 0) {
jsArrayBuilder.append(metadata.nationalPrefix);
} else { } else {
jsArrayBuilder.append(null); jsArrayBuilder.append(null);
} }
// optional string preferred_extn_prefix = 13; // optional string preferred_extn_prefix = 13;
if (metadata.hasPreferredExtnPrefix()) {
jsArrayBuilder.append(metadata.getPreferredExtnPrefix());
if (metadata.preferredExtnPrefix.length() != 0) {
jsArrayBuilder.append(metadata.preferredExtnPrefix);
} else { } else {
jsArrayBuilder.append(null); jsArrayBuilder.append(null);
} }
// missing 14 // missing 14
jsArrayBuilder.append(null); jsArrayBuilder.append(null);
// optional string national_prefix_for_parsing = 15; // optional string national_prefix_for_parsing = 15;
if (metadata.hasNationalPrefixForParsing()) {
jsArrayBuilder.append(metadata.getNationalPrefixForParsing());
if (metadata.nationalPrefixForParsing.length() != 0) {
jsArrayBuilder.append(metadata.nationalPrefixForParsing);
} else { } else {
jsArrayBuilder.append(null); jsArrayBuilder.append(null);
} }
// optional string national_prefix_transform_rule = 16; // optional string national_prefix_transform_rule = 16;
if (metadata.hasNationalPrefixTransformRule()) {
jsArrayBuilder.append(metadata.getNationalPrefixTransformRule());
if (metadata.nationalPrefixTransformRule.length() != 0) {
jsArrayBuilder.append(metadata.nationalPrefixTransformRule);
} else { } else {
jsArrayBuilder.append(null); jsArrayBuilder.append(null);
} }
// optional string preferred_international_prefix = 17; // optional string preferred_international_prefix = 17;
if (metadata.hasPreferredInternationalPrefix()) {
jsArrayBuilder.append(metadata.getPreferredInternationalPrefix());
if (metadata.preferredInternationalPrefix.length() != 0) {
jsArrayBuilder.append(metadata.preferredInternationalPrefix);
} else { } else {
jsArrayBuilder.append(null); jsArrayBuilder.append(null);
} }
// optional bool same_mobile_and_fixed_line_pattern = 18 [default=false]; // optional bool same_mobile_and_fixed_line_pattern = 18 [default=false];
if (metadata.isSameMobileAndFixedLinePattern()) {
if (metadata.sameMobileAndFixedLinePattern) {
jsArrayBuilder.append(1); jsArrayBuilder.append(1);
} else { } else {
jsArrayBuilder.append(null); jsArrayBuilder.append(null);
@ -356,33 +356,33 @@ public class BuildMetadataJsonFromXml extends Command {
jsArrayBuilder.append(null); jsArrayBuilder.append(null);
} }
// optional PhoneNumberDesc pager = 21; // optional PhoneNumberDesc pager = 21;
toJsArray(metadata.getPager(), jsArrayBuilder);
toJsArray(metadata.pager, jsArrayBuilder);
// optional bool main_country_for_code = 22 [default=false]; // optional bool main_country_for_code = 22 [default=false];
if (metadata.isMainCountryForCode()) {
if (metadata.mainCountryForCode) {
jsArrayBuilder.append(1); jsArrayBuilder.append(1);
} else { } else {
jsArrayBuilder.append(null); jsArrayBuilder.append(null);
} }
// optional string leading_digits = 23; // optional string leading_digits = 23;
if (metadata.hasLeadingDigits()) {
jsArrayBuilder.append(metadata.getLeadingDigits());
if (metadata.leadingDigits.length() != 0) {
jsArrayBuilder.append(metadata.leadingDigits);
} else { } else {
jsArrayBuilder.append(null); jsArrayBuilder.append(null);
} }
// optional PhoneNumberDesc no_international_dialling = 24; // optional PhoneNumberDesc no_international_dialling = 24;
toJsArray(metadata.getNoInternationalDialling(), jsArrayBuilder);
toJsArray(metadata.noInternationalDialling, jsArrayBuilder);
// optional PhoneNumberDesc uan = 25; // optional PhoneNumberDesc uan = 25;
toJsArray(metadata.getUan(), jsArrayBuilder);
toJsArray(metadata.uan, jsArrayBuilder);
// optional bool leading_zero_possible = 26 [default=false]; // optional bool leading_zero_possible = 26 [default=false];
if (metadata.isLeadingZeroPossible()) {
if (metadata.leadingZeroPossible) {
jsArrayBuilder.append(1); jsArrayBuilder.append(1);
} else { } else {
jsArrayBuilder.append(null); jsArrayBuilder.append(null);
} }
// optional PhoneNumberDesc emergency = 27; // optional PhoneNumberDesc emergency = 27;
toJsArray(metadata.getEmergency(), jsArrayBuilder);
toJsArray(metadata.emergency, jsArrayBuilder);
// optional PhoneNumberDesc voicemail = 28; // optional PhoneNumberDesc voicemail = 28;
toJsArray(metadata.getVoicemail(), jsArrayBuilder);
toJsArray(metadata.voicemail, jsArrayBuilder);
// Fields 29-31 are omitted due to space increase. // Fields 29-31 are omitted due to space increase.
// optional PhoneNumberDesc short_code = 29; // optional PhoneNumberDesc short_code = 29;
// optional PhoneNumberDesc standard_rate = 30; // optional PhoneNumberDesc standard_rate = 30;


+ 2
- 2
tools/java/java-build/src/com/google/i18n/phonenumbers/BuildMetadataProtoFromXml.java View File

@ -165,11 +165,11 @@ public class BuildMetadataProtoFromXml extends Command {
out.close(); out.close();
} else { } else {
for (PhoneMetadata metadata : metadataCollection.getMetadataList()) { for (PhoneMetadata metadata : metadataCollection.getMetadataList()) {
String regionCode = metadata.getId();
String regionCode = metadata.id;
// For non-geographical country calling codes (e.g. +800), or for alternate formats, use the // For non-geographical country calling codes (e.g. +800), or for alternate formats, use the
// country calling codes instead of the region code to form the file name. // country calling codes instead of the region code to form the file name.
if (regionCode.equals("001") || regionCode.isEmpty()) { if (regionCode.equals("001") || regionCode.isEmpty()) {
regionCode = Integer.toString(metadata.getCountryCode());
regionCode = Integer.toString(metadata.countryCode);
} }
PhoneMetadataCollection outMetadataCollection = new PhoneMetadataCollection(); PhoneMetadataCollection outMetadataCollection = new PhoneMetadataCollection();
outMetadataCollection.addMetadata(metadata); outMetadataCollection.addMetadata(metadata);


Loading…
Cancel
Save