Browse Source

Decouple Phonemetadata.java from protocol buffer.

pull/567/head
Shaopeng Jia 16 years ago
committed by Mihaela Rosca
parent
commit
14710170f7
8 changed files with 566 additions and 2312 deletions
  1. BIN
      java/lib/protobuf-lite.jar
  2. BIN
      java/resources/com/google/i18n/phonenumbers/src/generated_files/PhoneNumberMetadataProto
  3. BIN
      java/resources/com/google/i18n/phonenumbers/test/generated_files/PhoneNumberMetadataProtoForTesting
  4. +15
    -13
      java/src/com/google/i18n/phonenumbers/BuildMetadataProtoFromXml.java
  5. +6
    -27
      java/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java
  6. +521
    -2238
      java/src/com/google/i18n/phonenumbers/Phonemetadata.java
  7. +2
    -4
      java/src/com/google/i18n/phonenumbers/Phonenumber.java
  8. +22
    -30
      java/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java

BIN
java/lib/protobuf-lite.jar View File


BIN
java/resources/com/google/i18n/phonenumbers/src/generated_files/PhoneNumberMetadataProto View File


BIN
java/resources/com/google/i18n/phonenumbers/test/generated_files/PhoneNumberMetadataProtoForTesting View File


+ 15
- 13
java/src/com/google/i18n/phonenumbers/BuildMetadataProtoFromXml.java View File

@ -28,6 +28,7 @@ import org.xml.sax.SAXException;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
@ -67,7 +68,7 @@ public class BuildMetadataProtoFromXml {
document.getDocumentElement().normalize();
Element rootElement = document.getDocumentElement();
NodeList territory = rootElement.getElementsByTagName("territory");
PhoneMetadataCollection.Builder metadataCollection = PhoneMetadataCollection.newBuilder();
PhoneMetadataCollection metadataCollection = new PhoneMetadataCollection();
int numOfTerritories = territory.getLength();
for (int i = 0; i < numOfTerritories; i++) {
Element territoryElement = (Element) territory.item(i);
@ -75,7 +76,9 @@ public class BuildMetadataProtoFromXml {
PhoneMetadata metadata = loadCountryMetadata(regionCode, territoryElement);
metadataCollection.addMetadata(metadata);
}
metadataCollection.build().writeTo(output);
ObjectOutputStream out = new ObjectOutputStream(output);
out.writeObject(metadataCollection);
out.close();
} catch (IOException e) {
LOGGER.log(Level.SEVERE, e.toString());
} catch (SAXException e) {
@ -92,7 +95,7 @@ public class BuildMetadataProtoFromXml {
}
private static PhoneMetadata loadCountryMetadata(String regionCode, Element element) {
PhoneMetadata.Builder metadata = PhoneMetadata.newBuilder();
PhoneMetadata metadata = new PhoneMetadata();
metadata.setId(regionCode);
metadata.setCountryCode(Integer.parseInt(element.getAttribute("countryCode")));
metadata.setInternationalPrefix(validateRE(element.getAttribute("internationalPrefix")));
@ -129,7 +132,7 @@ public class BuildMetadataProtoFromXml {
if (numOfFormatElements > 0) {
for (int i = 0; i < numOfFormatElements; i++) {
Element numberFormatElement = (Element) numberFormatElements.item(i);
NumberFormat.Builder format = NumberFormat.newBuilder();
NumberFormat format = new NumberFormat();
if (numberFormatElement.hasAttribute("nationalPrefixFormattingRule")) {
format.setNationalPrefixFormattingRule(validateRE(
getNationalPrefixFormattingRuleFromElement(numberFormatElement, nationalPrefix)));
@ -141,7 +144,7 @@ public class BuildMetadataProtoFromXml {
}
format.setPattern(validateRE(numberFormatElement.getAttribute("pattern")));
format.setFormat(validateRE(numberFormatElement.getFirstChild().getNodeValue()));
metadata.addNumberFormat(format.build());
metadata.addNumberFormat(format);
}
}
@ -150,19 +153,18 @@ public class BuildMetadataProtoFromXml {
if (numOfIntlFormatElements > 0) {
for (int i = 0; i < numOfIntlFormatElements; i++) {
Element numberFormatElement = (Element) intlNumberFormatElements.item(i);
NumberFormat.Builder format = NumberFormat.newBuilder();
NumberFormat format = new NumberFormat();
if (numberFormatElement.hasAttribute("leadingDigits")) {
format.setLeadingDigits(validateRE(numberFormatElement.getAttribute("leadingDigits")));
}
format.setPattern(validateRE(numberFormatElement.getAttribute("pattern")));
format.setFormat(validateRE(numberFormatElement.getFirstChild().getNodeValue()));
metadata.addIntlNumberFormat(format.build());
metadata.addIntlNumberFormat(format);
}
}
PhoneNumberDesc generalDesc =
processPhoneNumberDescElement(PhoneNumberDesc.newBuilder().build(),
element, "generalDesc");
processPhoneNumberDescElement(new PhoneNumberDesc(), element, "generalDesc");
metadata.setGeneralDesc(generalDesc);
metadata.setFixedLine(processPhoneNumberDescElement(generalDesc, element, "fixedLine"));
metadata.setMobile(processPhoneNumberDescElement(generalDesc, element, "mobile"));
@ -177,7 +179,7 @@ public class BuildMetadataProtoFromXml {
metadata.getFixedLine().getNationalNumberPattern())) {
metadata.setSameMobileAndFixedLinePattern(true);
}
return metadata.build();
return metadata;
}
private static String getNationalPrefixFormattingRuleFromElement(Element element,
@ -210,13 +212,13 @@ public class BuildMetadataProtoFromXml {
Element countryElement,
String numberType) {
NodeList phoneNumberDescList = countryElement.getElementsByTagName(numberType);
PhoneNumberDesc.Builder numberDesc = PhoneNumberDesc.newBuilder();
PhoneNumberDesc numberDesc = new PhoneNumberDesc();
if (phoneNumberDescList.getLength() == 0 &&
(!numberType.equals("fixedLine") && !numberType.equals("mobile") &&
!numberType.equals("generalDesc"))) {
numberDesc.setNationalNumberPattern("NA");
numberDesc.setPossibleNumberPattern("NA");
return numberDesc.build();
return numberDesc;
}
numberDesc.mergeFrom(generalDesc);
if (phoneNumberDescList.getLength() > 0) {
@ -240,6 +242,6 @@ public class BuildMetadataProtoFromXml {
}
}
}
return numberDesc.build();
return numberDesc;
}
}

+ 6
- 27
java/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java View File

@ -22,12 +22,10 @@ import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadataCollection;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc;
import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber.CountryCodeSource;
import com.google.protobuf.MessageLite;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.ObjectInputStream;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
@ -359,7 +357,8 @@ public class PhoneNumberUtil {
private void init(InputStream source) {
// Read in metadata for each country.
try {
PhoneMetadataCollection metadataCollection = PhoneMetadataCollection.parseFrom(source);
ObjectInputStream in = new ObjectInputStream(source);
PhoneMetadataCollection metadataCollection = (PhoneMetadataCollection) in.readObject();
for (PhoneMetadata metadata : metadataCollection.getMetadataList()) {
String regionCode = metadata.getId();
countryToMetadataMap.put(regionCode, metadata);
@ -391,6 +390,8 @@ public class PhoneNumberUtil {
countryCodeToRegionCodeMap.put(FRENCH_INDIAN_OCEAN_COUNTRY_CODE, "RE");
} catch (IOException e) {
LOGGER.log(Level.WARNING, e.toString());
} catch (ClassNotFoundException e) {
LOGGER.log(Level.WARNING, e.toString());
}
}
@ -747,8 +748,7 @@ public Set<String> getSupportedCountries() {
NP_PATTERN.matcher(nationalPrefixFormattingRule).replaceFirst(nationalPrefix);
nationalPrefixFormattingRule =
FG_PATTERN.matcher(nationalPrefixFormattingRule).replaceFirst("\\$1");
userDefinedFormats.set(i, NumberFormat.newBuilder(numFormat)
.setNationalPrefixFormattingRule(nationalPrefixFormattingRule).build());
numFormat.setNationalPrefixFormattingRule(nationalPrefixFormattingRule);
}
}
@ -1688,28 +1688,7 @@ public Set<String> getSupportedCountries() {
parseHelper(numberToParse, defaultCountry, true, phoneNumber);
}
/**
* As no equals method is implemented for MessageLite, we implement our own equals method here
* to compare the serialized data.
*/
static Boolean areSameMessages(MessageLite message1, MessageLite message2) {
if (message1 == null && message2 == null) {
return true;
}
if (message1 == null || message2 == null) {
return false;
}
OutputStream output1 = new ByteArrayOutputStream();
OutputStream output2 = new ByteArrayOutputStream();
try {
message1.writeTo(output1);
message2.writeTo(output2);
} catch (IOException e) {
LOGGER.log(Level.WARNING, e.toString());
}
return output1.toString().equals(output2.toString());
}
/**


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


+ 2
- 4
java/src/com/google/i18n/phonenumbers/Phonenumber.java View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2009 Google Inc.
* Copyright (C) 2010 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -18,8 +18,6 @@
* Definition of the class representing international telephone numbers. This class is hand created
* based on the class file compiled from phonenumber.proto. Please refer to that file for detailed
* descriptions of the meaning of each field.
*
* @author Shaopeng Jia
*/
package com.google.i18n.phonenumbers;
@ -27,9 +25,9 @@ package com.google.i18n.phonenumbers;
import java.io.Serializable;
public final class Phonenumber {
private Phonenumber() {}
public static final class PhoneNumber implements Serializable {
private static final long serialVersionUID = 1;
public enum CountryCodeSource {
FROM_NUMBER_WITH_PLUS_SIGN,
FROM_NUMBER_WITH_IDD,


+ 22
- 30
java/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java View File

@ -20,7 +20,6 @@ import com.google.i18n.phonenumbers.Phonemetadata.NumberFormat;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata;
import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber.CountryCodeSource;
import com.google.protobuf.MessageLite;
import junit.framework.TestCase;
import java.io.IOException;
@ -70,10 +69,6 @@ public class PhoneNumberUtilTest extends TestCase {
return number1.exactlySameAs(number2);
}
private boolean assertEquals(MessageLite message1, MessageLite message2) {
return PhoneNumberUtil.areSameMessages(message1, message2);
}
public void testGetInstanceLoadUSMetadata() throws IOException {
PhoneMetadata metadata = phoneUtil.getMetadataForRegion("US");
assertEquals("US", metadata.getId());
@ -87,7 +82,7 @@ public class PhoneNumberUtilTest extends TestCase {
assertEquals("[13-9]\\d{9}|2[0-35-9]\\d{8}",
metadata.getGeneralDesc().getNationalNumberPattern());
assertEquals("\\d{7,10}", metadata.getGeneralDesc().getPossibleNumberPattern());
assertEquals(metadata.getGeneralDesc(), metadata.getFixedLine());
assertTrue(metadata.getGeneralDesc().exactlySameAs(metadata.getFixedLine()));
assertEquals("\\d{10}", metadata.getTollFree().getPossibleNumberPattern());
assertEquals("900\\d{7}", metadata.getPremiumRate().getNationalNumberPattern());
// No shared-cost data is available, so it should be initialised to "NA".
@ -487,11 +482,11 @@ public class PhoneNumberUtilTest extends TestCase {
public void testFormatByPattern() {
PhoneNumber usNumber = new PhoneNumber();
usNumber.setCountryCode(1).setNationalNumber(6502530000L);
NumberFormat newNumFormat1 =
NumberFormat.newBuilder().setPattern("(\\d{3})(\\d{3})(\\d{4})")
.setFormat("($1) $2-$3").build();
NumberFormat newNumFormat = new NumberFormat();
newNumFormat.setPattern("(\\d{3})(\\d{3})(\\d{4})");
newNumFormat.setFormat("($1) $2-$3");
List<NumberFormat> newNumberFormats = new ArrayList<NumberFormat>();
newNumberFormats.add(newNumFormat1);
newNumberFormats.add(newNumFormat);
assertEquals("(650) 253-0000",
phoneUtil.formatByPattern(usNumber,
@ -505,10 +500,9 @@ public class PhoneNumberUtilTest extends TestCase {
PhoneNumber itNumber = new PhoneNumber();
itNumber.setCountryCode(39).setNationalNumber(236618300L).setItalianLeadingZero(true);
NumberFormat newNumFormat2 =
NumberFormat.newBuilder().setPattern("(\\d{2})(\\d{5})(\\d{3})")
.setFormat("$1-$2 $3").build();
newNumberFormats.set(0, newNumFormat2);
newNumFormat.setPattern("(\\d{2})(\\d{5})(\\d{3})");
newNumFormat.setFormat("$1-$2 $3");
newNumberFormats.set(0, newNumFormat);
assertEquals("02-36618 300",
phoneUtil.formatByPattern(itNumber,
@ -519,36 +513,34 @@ public class PhoneNumberUtilTest extends TestCase {
PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL,
newNumberFormats));
PhoneNumber gbNumber = new PhoneNumber();
gbNumber.setCountryCode(44).setNationalNumber(2012345678L);
PhoneNumber gbNumber = new PhoneNumber();
gbNumber.setCountryCode(44).setNationalNumber(2012345678L);
NumberFormat newNumFormat3 =
NumberFormat.newBuilder().setNationalPrefixFormattingRule("$NP$FG")
.setPattern("(\\d{2})(\\d{4})(\\d{4})").setFormat("$1 $2 $3").build();
newNumberFormats.set(0, newNumFormat3);
newNumFormat.setNationalPrefixFormattingRule("$NP$FG");
newNumFormat.setPattern("(\\d{2})(\\d{4})(\\d{4})");
newNumFormat.setFormat("$1 $2 $3");
newNumberFormats.set(0, newNumFormat);
assertEquals("020 1234 5678",
phoneUtil.formatByPattern(gbNumber,
PhoneNumberUtil.PhoneNumberFormat.NATIONAL,
newNumberFormats));
NumberFormat newNumFormat4 =
NumberFormat.newBuilder(newNumFormat3).setNationalPrefixFormattingRule("($NP$FG)").build();
newNumberFormats.set(0, newNumFormat4);
newNumFormat.setNationalPrefixFormattingRule("($NP$FG)");
newNumberFormats.set(0, newNumFormat);
assertEquals("(020) 1234 5678",
phoneUtil.formatByPattern(gbNumber,
PhoneNumberUtil.PhoneNumberFormat.NATIONAL,
newNumberFormats));
NumberFormat newNumFormat5 =
NumberFormat.newBuilder(newNumFormat4).setNationalPrefixFormattingRule("").build();
newNumberFormats.set(0, newNumFormat5);
newNumFormat.setNationalPrefixFormattingRule("");
newNumberFormats.set(0, newNumFormat);
assertEquals("20 1234 5678",
phoneUtil.formatByPattern(gbNumber,
PhoneNumberUtil.PhoneNumberFormat.NATIONAL,
newNumberFormats));
NumberFormat newNumFormat6 =
NumberFormat.newBuilder(newNumFormat5).setNationalPrefixFormattingRule("").build();
newNumberFormats.set(0, newNumFormat6);
newNumFormat.setNationalPrefixFormattingRule("");
newNumberFormats.set(0, newNumFormat);
assertEquals("+44 20 1234 5678",
phoneUtil.formatByPattern(gbNumber,
PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL,
@ -881,7 +873,7 @@ public class PhoneNumberUtilTest extends TestCase {
number.clear();
number.setCountryCode(1).setNationalNumber(65025300000L);
assertEquals(PhoneNumberUtil.ValidationResult.TOO_LONG,
phoneUtil.isPossibleNumberWithReason(number));
phoneUtil.isPossibleNumberWithReason(number));
}
public void testIsNotPossibleNumber() {


Loading…
Cancel
Save