diff options
author | Treehugger Robot <treehugger-gerrit@google.com> | 2022-08-25 20:52:23 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2022-08-25 20:52:23 +0000 |
commit | f5f32642d44ffa610051d640985a7a0e6e1e62a6 (patch) | |
tree | 37017a582ee037520263bab6a4b6394c8753da3e | |
parent | ebca162c0e053039762ff380ef4a8ac617637985 (diff) | |
parent | 5cdc5094a5be9275b4d2b8700a701f5fff266df7 (diff) | |
download | libphonenumber-f5f32642d44ffa610051d640985a7a0e6e1e62a6.tar.gz |
Merge "Update libphonenumber to v8.12.54" am: 84f52584d0 am: 93a35a2c43 am: 5cdc5094a5
Original change: https://android-review.googlesource.com/c/platform/external/libphonenumber/+/2192266
Change-Id: Icfc25d828605e0f3d980fb9a9782f75350197844
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
383 files changed, 3005 insertions, 1373 deletions
@@ -115,6 +115,10 @@ java_library { static_libs: [ "libphonenumber", "junit", + "mockito-target-extended", + ], + libs: [ + "android.test.mock", ], java_version: "1.7", } diff --git a/README.android b/README.android index 75c93203..a7522a72 100644 --- a/README.android +++ b/README.android @@ -1,5 +1,5 @@ URL: https://github.com/googlei18n/libphonenumber -Version: 8.12.46 +Version: 8.12.54 License: Apache 2 Description: Google Phone Number Library. diff --git a/README.version b/README.version index e1cf22b8..91bd84d5 100644 --- a/README.version +++ b/README.version @@ -1,3 +1,3 @@ URL: https://github.com/googlei18n/libphonenumber/ -Version: 8.12.46 +Version: 8.12.54 BugComponent: 20868 diff --git a/carrier/pom.xml b/carrier/pom.xml index 0ed9500a..5e122949 100644 --- a/carrier/pom.xml +++ b/carrier/pom.xml @@ -3,14 +3,14 @@ <modelVersion>4.0.0</modelVersion> <groupId>com.googlecode.libphonenumber</groupId> <artifactId>carrier</artifactId> - <version>1.172</version> + <version>1.180</version> <packaging>jar</packaging> <url>https://github.com/google/libphonenumber/</url> <parent> <groupId>com.googlecode.libphonenumber</groupId> <artifactId>libphonenumber-parent</artifactId> - <version>8.12.46</version> + <version>8.12.54</version> </parent> <build> @@ -55,12 +55,12 @@ <dependency> <groupId>com.googlecode.libphonenumber</groupId> <artifactId>libphonenumber</artifactId> - <version>8.12.46</version> + <version>8.12.54</version> </dependency> <dependency> <groupId>com.googlecode.libphonenumber</groupId> <artifactId>prefixmapper</artifactId> - <version>2.182</version> + <version>2.190</version> </dependency> </dependencies> diff --git a/carrier/src/com/google/i18n/phonenumbers/PhoneNumberToCarrierMapper.java b/carrier/src/com/google/i18n/phonenumbers/PhoneNumberToCarrierMapper.java index b99abe6e..ed3d6d88 100644 --- a/carrier/src/com/google/i18n/phonenumbers/PhoneNumberToCarrierMapper.java +++ b/carrier/src/com/google/i18n/phonenumbers/PhoneNumberToCarrierMapper.java @@ -16,11 +16,10 @@ package com.google.i18n.phonenumbers; -import com.google.i18n.phonenumbers.PhoneNumberUtil; import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberType; import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; +import com.google.i18n.phonenumbers.metadata.DefaultMetadataDependenciesProvider; import com.google.i18n.phonenumbers.prefixmapper.PrefixFileReader; - import java.util.Locale; /** @@ -30,9 +29,7 @@ import java.util.Locale; */ public class PhoneNumberToCarrierMapper { private static PhoneNumberToCarrierMapper instance = null; - private static final String MAPPING_DATA_DIRECTORY = - "/com/google/i18n/phonenumbers/carrier/data/"; - private PrefixFileReader prefixFileReader = null; + private final PrefixFileReader prefixFileReader; private final PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); @@ -51,7 +48,8 @@ public class PhoneNumberToCarrierMapper { */ public static synchronized PhoneNumberToCarrierMapper getInstance() { if (instance == null) { - instance = new PhoneNumberToCarrierMapper(MAPPING_DATA_DIRECTORY); + instance = new PhoneNumberToCarrierMapper(DefaultMetadataDependenciesProvider.getInstance() + .getCarrierDataDirectory()); } return instance; } diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/1246_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/1246_en Binary files differindex 8ffce001..1368ea03 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/1246_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/1246_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/1345_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/1345_en Binary files differindex 39013444..f687d25c 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/1345_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/1345_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/212_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/212_en Binary files differindex 05983c7e..befb5c08 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/212_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/212_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/223_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/223_en Binary files differindex 5c04fd1f..f8217c8f 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/223_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/223_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/226_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/226_en Binary files differindex 88130d58..8230d0aa 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/226_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/226_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/233_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/233_en Binary files differindex 66bb3700..dc32ada3 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/233_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/233_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/237_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/237_en Binary files differindex 729f6508..483a7655 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/237_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/237_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/244_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/244_en Binary files differindex 48e01f4c..e47a30a8 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/244_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/244_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/251_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/251_en Binary files differindex 354c0111..8e13f331 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/251_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/251_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/254_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/254_en Binary files differindex 60412710..ea8d7761 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/254_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/254_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/262_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/262_en Binary files differindex 1df02841..74a5de6f 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/262_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/262_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/298_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/298_en Binary files differindex e3a67dac..1f76f32a 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/298_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/298_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/33_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/33_en Binary files differindex 0438dc33..51b64fa8 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/33_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/33_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/34_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/34_en Binary files differindex 42dbe35a..7a54e180 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/34_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/34_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/351_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/351_en Binary files differindex 6e730420..fc8db80c 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/351_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/351_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/354_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/354_en Binary files differindex 15476176..f7731a6f 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/354_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/354_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/370_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/370_en Binary files differindex 32cd4aac..076f5925 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/370_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/370_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/372_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/372_en Binary files differindex b07561a9..1de891a3 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/372_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/372_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/380_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/380_en Binary files differindex 43384783..609b47f3 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/380_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/380_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/380_uk b/carrier/src/com/google/i18n/phonenumbers/carrier/data/380_uk Binary files differindex f4756ff7..add3a08a 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/380_uk +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/380_uk diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/385_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/385_en Binary files differindex 3e9b2db4..e0c34c21 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/385_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/385_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/386_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/386_en Binary files differindex c0b89dec..461263c5 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/386_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/386_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/41_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/41_en Binary files differindex 058355f2..d5820e5a 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/41_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/41_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/420_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/420_en Binary files differindex a17f7d80..c42f60e1 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/420_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/420_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/421_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/421_en Binary files differindex 83605f0a..424ea380 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/421_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/421_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/44_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/44_en Binary files differindex 79b9f945..e764cc8a 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/44_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/44_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/46_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/46_en Binary files differindex 719c0bc4..c85b3d94 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/46_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/46_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/48_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/48_en Binary files differindex 66546b28..a5ae3fee 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/48_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/48_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/503_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/503_en Binary files differindex 57520a34..69a232b7 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/503_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/503_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/56_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/56_en Binary files differindex 67386fe3..056751d1 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/56_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/56_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/57_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/57_en Binary files differindex 811c55d2..1052ada7 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/57_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/57_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/60_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/60_en Binary files differindex 28ea3fc5..a7021aa8 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/60_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/60_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/65_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/65_en Binary files differindex 9dc543a2..8b002a4f 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/65_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/65_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/675_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/675_en Binary files differindex 328156d4..c044c835 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/675_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/675_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/852_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/852_en Binary files differindex 6828fc69..05339f91 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/852_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/852_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/852_zh b/carrier/src/com/google/i18n/phonenumbers/carrier/data/852_zh Binary files differindex 7669b5b7..f05af53e 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/852_zh +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/852_zh diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/86_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/86_en Binary files differindex 1e2437c1..2d943068 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/86_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/86_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/963_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/963_en Binary files differindex 593e0c46..ee4fe314 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/963_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/963_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/972_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/972_en Binary files differindex 862fba3f..556d6645 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/972_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/972_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/974_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/974_en Binary files differindex c34cabb5..d92d9ddc 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/974_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/974_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/976_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/976_en Binary files differindex 5e41d40c..7be52323 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/976_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/976_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/977_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/977_en Binary files differindex 1a3376bc..94d491a7 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/977_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/977_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/98_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/98_en Binary files differindex 24d29024..cafaee21 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/98_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/98_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/98_fa b/carrier/src/com/google/i18n/phonenumbers/carrier/data/98_fa Binary files differindex b7635df2..cdacabfb 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/98_fa +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/98_fa diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/992_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/992_en Binary files differindex 74499f5a..fa9bb9ba 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/992_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/992_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/995_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/995_en Binary files differindex 9275bbed..c7243dbb 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/995_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/995_en diff --git a/carrier/src/com/google/i18n/phonenumbers/carrier/data/996_en b/carrier/src/com/google/i18n/phonenumbers/carrier/data/996_en Binary files differindex 1a790e74..93b2fd32 100644 --- a/carrier/src/com/google/i18n/phonenumbers/carrier/data/996_en +++ b/carrier/src/com/google/i18n/phonenumbers/carrier/data/996_en diff --git a/demo/README b/demo/README index ae42c5bc..0bc32d88 100644 --- a/demo/README +++ b/demo/README @@ -1,21 +1,6 @@ -How to install the Appengine SDK to the Maven local repository? -Note that this needs to be done only once. - $ mvn gae:unpack - Note that you don't need to manually download any SDK. +Prerequisite: + Install the Appengine SDK. + $ sudo apt-get install google-cloud-sdk-app-engine-java -How to generate the WAR? - $ mvn package - $ mvn war:war - Note that this must be done before running the webapp locally and before - deploying it to Appengine. - -How to run the webapp locally? - $ mvn gae:run - -How to deploy the webapp to Appengine? - $ mvn gae:update - -If you have made any changes to the code or pom.xml file of demo here, -you may need to run Maven commands like ```mvn clean install -U``` -(especially one hierarchy above i.e at java/ folder) to resolve any -dependency issues w.r.t new developement version. +How to regenreate the WAR, deploy and run in appengine? + $ mvn appengine:run diff --git a/demo/build.xml b/demo/build.xml deleted file mode 100644 index 5cc93a78..00000000 --- a/demo/build.xml +++ /dev/null @@ -1,59 +0,0 @@ -<project> - <property name="appengine-sdk.dir" location="../../appengine-java-sdk" /> - - <import file="${appengine-sdk.dir}/config/user/ant-macros.xml" /> - - <path id="project.classpath"> - <pathelement path="war/WEB-INF/classes" /> - <fileset dir="war/WEB-INF/lib"> - <include name="**/*.jar" /> - </fileset> - <fileset dir="${appengine-sdk.dir}/lib"> - <include name="shared/**/*.jar" /> - </fileset> - </path> - - <target name="copyjars" description="Copies the App Engine JARs to the WAR."> - <copy todir="war/WEB-INF/lib" flatten="true"> - <fileset dir="${appengine-sdk.dir}/lib/user"> - <include name="**/*.jar" /> - </fileset> - </copy> - </target> - - <target name="compile" depends="copyjars" - description="Compiles Java source and copies other source files to the WAR."> - <mkdir dir="war/WEB-INF/classes" /> - <copy todir="war/WEB-INF/classes"> - <fileset dir="src"> - <exclude name="**/*.java" /> - </fileset> - </copy> - <javac srcdir="src" destdir="war/WEB-INF/classes" classpathref="project.classpath" debug="on" - includeAntRuntime="false" source="1.8" target="1.8"/> - </target> - - <target name="runserver" depends="compile" description="Starts the development server."> - <dev_appserver war="war" /> - </target> - - <target name="update" depends="compile" description="Uploads the application to App Engine."> - <appcfg action="update" war="war" /> - </target> - - <target name="rollback" depends="compile" - description="Rolls back an interrupted application update."> - <appcfg action="rollback" war="war" /> - </target> - - <target name="request_logs" description="Downloads log data from App Engine for the application."> - <appcfg action="request_logs" war="war"> - <options> - <arg value="--num_days=5"/> - </options> - <args> - <arg value="logs.txt"/> - </args> - </appcfg> - </target> -</project> diff --git a/demo/pom.xml b/demo/pom.xml index 775474c8..76de20b9 100644 --- a/demo/pom.xml +++ b/demo/pom.xml @@ -3,73 +3,42 @@ <modelVersion>4.0.0</modelVersion> <groupId>com.googlecode.libphonenumber</groupId> <artifactId>demo</artifactId> - <version>8.12.46</version> - <packaging>jar</packaging> + <version>8.12.54</version> + <packaging>war</packaging> <url>https://github.com/google/libphonenumber/</url> <parent> <groupId>com.googlecode.libphonenumber</groupId> <artifactId>libphonenumber-parent</artifactId> - <version>8.12.46</version> + <version>8.12.54</version> </parent> <properties> - <gae.version>1.9.32</gae.version> + <app.deploy.project>libphonenumber-hrd</app.deploy.project> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> + <maven.compiler.source>1.8</maven.compiler.source> + <maven.compiler.target>1.8</maven.compiler.target> + <maven.compiler.showDeprecation>true</maven.compiler.showDeprecation> + <archiveClasses>true</archiveClasses> </properties> - <build> - <sourceDirectory>src</sourceDirectory> - <testSourceDirectory>test</testSourceDirectory> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-compiler-plugin</artifactId> - <version>2.3.2</version> - <configuration> - <source>1.7</source> - <target>1.7</target> - <encoding>UTF-8</encoding> - </configuration> - </plugin> - <plugin> - <groupId>net.kindleit</groupId> - <artifactId>maven-gae-plugin</artifactId> - <version>0.9.1</version> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-war-plugin</artifactId> - <version>2.1.1</version> - <configuration> - <warSourceDirectory>war</warSourceDirectory> - </configuration> - </plugin> - <plugin> - <groupId>org.mortbay.jetty</groupId> - <artifactId>maven-jetty-plugin</artifactId> - <version>6.1.10</version> - <configuration> - <webAppSourceDirectory>webapp</webAppSourceDirectory> - <scanIntervalSeconds>10</scanIntervalSeconds> - <webAppConfig> - <contextPath>/</contextPath> - </webAppConfig> - <connectors> - <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"> - <port>8080</port> - <maxIdleTime>60000</maxIdleTime> - </connector> - </connectors> - </configuration> - </plugin> - </plugins> - </build> - + <prerequisites> + <maven>3.5</maven> + </prerequisites> <dependencies> + <!-- Compile/runtime dependencies --> + <dependency> + <groupId>com.google.appengine</groupId> + <artifactId>appengine-api-1.0-sdk</artifactId> + <version>1.9.96</version> + </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> + <type>jar</type> + <scope>provided</scope> </dependency> <dependency> <groupId>commons-io</groupId> @@ -79,7 +48,7 @@ <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> - <version>1.3.3</version> + <version>1.4</version> </dependency> <dependency> <groupId>commons-lang</groupId> @@ -89,18 +58,31 @@ <dependency> <groupId>com.googlecode.libphonenumber</groupId> <artifactId>libphonenumber</artifactId> - <version>8.12.46</version> + <version>8.12.54</version> </dependency> <dependency> <groupId>com.googlecode.libphonenumber</groupId> <artifactId>geocoder</artifactId> - <version>2.182</version> + <version>2.190</version> </dependency> <dependency> <groupId>com.googlecode.libphonenumber</groupId> <artifactId>carrier</artifactId> - <version>1.172</version> + <version>1.180</version> </dependency> </dependencies> + <build> + <!-- for hot reload of the web application--> + <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/classes</outputDirectory> + <plugins> + <plugin> + <groupId>com.google.cloud.tools</groupId> + <artifactId>appengine-maven-plugin</artifactId> + <version>1.3.1</version> + <configuration> + </configuration> + </plugin> + </plugins> + </build> </project> diff --git a/demo/src/com/google/phonenumbers/PhoneNumberParserServlet.java b/demo/src/main/java/com/google/phonenumbers/PhoneNumberParserServlet.java index 40f0fa8f..40f0fa8f 100644 --- a/demo/src/com/google/phonenumbers/PhoneNumberParserServlet.java +++ b/demo/src/main/java/com/google/phonenumbers/PhoneNumberParserServlet.java diff --git a/demo/war/WEB-INF/appengine-web.xml b/demo/src/main/webapp/WEB-INF/appengine-web.xml index 1a367eca..1a367eca 100644 --- a/demo/war/WEB-INF/appengine-web.xml +++ b/demo/src/main/webapp/WEB-INF/appengine-web.xml diff --git a/demo/war/WEB-INF/logging.properties b/demo/src/main/webapp/WEB-INF/logging.properties index a1720668..0c2ea51b 100644 --- a/demo/war/WEB-INF/logging.properties +++ b/demo/src/main/webapp/WEB-INF/logging.properties @@ -3,7 +3,7 @@ # # To use this configuration, copy it into your application's WEB-INF # folder and add the following to your appengine-web.xml: -# +# # <system-properties> # <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/> # </system-properties> diff --git a/demo/war/WEB-INF/web.xml b/demo/src/main/webapp/WEB-INF/web.xml index 5a4ba5c9..5a4ba5c9 100644 --- a/demo/war/WEB-INF/web.xml +++ b/demo/src/main/webapp/WEB-INF/web.xml diff --git a/demo/war/favicon.ico b/demo/src/main/webapp/favicon.ico Binary files differindex 789f24fc..789f24fc 100644 --- a/demo/war/favicon.ico +++ b/demo/src/main/webapp/favicon.ico diff --git a/demo/war/phonenumberparser.jsp b/demo/src/main/webapp/phonenumberparser.jsp index 4e7b7f2f..4e7b7f2f 100644 --- a/demo/war/phonenumberparser.jsp +++ b/demo/src/main/webapp/phonenumberparser.jsp diff --git a/demo/war/stylesheets/main.css b/demo/src/main/webapp/stylesheets/main.css index 80b8361a..80b8361a 100644 --- a/demo/war/stylesheets/main.css +++ b/demo/src/main/webapp/stylesheets/main.css diff --git a/demo/war/WEB-INF/lib/commons-fileupload-1.2.1.jar b/demo/war/WEB-INF/lib/commons-fileupload-1.2.1.jar Binary files differdeleted file mode 100644 index aa209b38..00000000 --- a/demo/war/WEB-INF/lib/commons-fileupload-1.2.1.jar +++ /dev/null diff --git a/demo/war/WEB-INF/lib/commons-io-1.4.jar b/demo/war/WEB-INF/lib/commons-io-1.4.jar Binary files differdeleted file mode 100644 index 133dc6cb..00000000 --- a/demo/war/WEB-INF/lib/commons-io-1.4.jar +++ /dev/null diff --git a/demo/war/WEB-INF/lib/commons-lang-2.6.jar b/demo/war/WEB-INF/lib/commons-lang-2.6.jar Binary files differdeleted file mode 100644 index 98467d3a..00000000 --- a/demo/war/WEB-INF/lib/commons-lang-2.6.jar +++ /dev/null diff --git a/demo/war/WEB-INF/lib/servlet-api-2.5.jar b/demo/war/WEB-INF/lib/servlet-api-2.5.jar Binary files differdeleted file mode 100644 index fb524934..00000000 --- a/demo/war/WEB-INF/lib/servlet-api-2.5.jar +++ /dev/null diff --git a/geocoder/pom.xml b/geocoder/pom.xml index 37c7cc32..2802afc9 100644 --- a/geocoder/pom.xml +++ b/geocoder/pom.xml @@ -3,14 +3,14 @@ <modelVersion>4.0.0</modelVersion> <groupId>com.googlecode.libphonenumber</groupId> <artifactId>geocoder</artifactId> - <version>2.182</version> + <version>2.190</version> <packaging>jar</packaging> <url>https://github.com/google/libphonenumber/</url> <parent> <groupId>com.googlecode.libphonenumber</groupId> <artifactId>libphonenumber-parent</artifactId> - <version>8.12.46</version> + <version>8.12.54</version> </parent> <build> @@ -63,12 +63,12 @@ <dependency> <groupId>com.googlecode.libphonenumber</groupId> <artifactId>libphonenumber</artifactId> - <version>8.12.46</version> + <version>8.12.54</version> </dependency> <dependency> <groupId>com.googlecode.libphonenumber</groupId> <artifactId>prefixmapper</artifactId> - <version>2.182</version> + <version>2.190</version> </dependency> </dependencies> diff --git a/geocoder/src/com/google/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java b/geocoder/src/com/google/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java index a48ed903..f26cc103 100644 --- a/geocoder/src/com/google/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java +++ b/geocoder/src/com/google/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java @@ -20,6 +20,7 @@ import com.google.i18n.phonenumbers.NumberParseException; import com.google.i18n.phonenumbers.PhoneNumberUtil; import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberType; import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; +import com.google.i18n.phonenumbers.metadata.DefaultMetadataDependenciesProvider; import com.google.i18n.phonenumbers.prefixmapper.PrefixFileReader; import java.util.List; @@ -32,9 +33,7 @@ import java.util.Locale; */ public class PhoneNumberOfflineGeocoder { private static PhoneNumberOfflineGeocoder instance = null; - private static final String MAPPING_DATA_DIRECTORY = - "/com/google/i18n/phonenumbers/geocoding/data/"; - private PrefixFileReader prefixFileReader = null; + private final PrefixFileReader prefixFileReader; private final PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); @@ -54,7 +53,8 @@ public class PhoneNumberOfflineGeocoder { */ public static synchronized PhoneNumberOfflineGeocoder getInstance() { if (instance == null) { - instance = new PhoneNumberOfflineGeocoder(MAPPING_DATA_DIRECTORY); + instance = new PhoneNumberOfflineGeocoder(DefaultMetadataDependenciesProvider.getInstance() + .getGeocodingDataDirectory()); } return instance; } diff --git a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1263_en b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1263_en Binary files differnew file mode 100644 index 00000000..04e95159 --- /dev/null +++ b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1263_en diff --git a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1310_en b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1310_en Binary files differindex 26fd3041..edb45ee7 100644 --- a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1310_en +++ b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1310_en diff --git a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1468_en b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1468_en Binary files differnew file mode 100644 index 00000000..93016187 --- /dev/null +++ b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1468_en diff --git a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1584_en b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1584_en Binary files differnew file mode 100644 index 00000000..41d8570b --- /dev/null +++ b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1584_en diff --git a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1656_en b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1656_en Binary files differnew file mode 100644 index 00000000..8625c98f --- /dev/null +++ b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1656_en diff --git a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1826_en b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1826_en Binary files differnew file mode 100644 index 00000000..2eda79af --- /dev/null +++ b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1826_en diff --git a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1943_en b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1943_en Binary files differnew file mode 100644 index 00000000..6cf5625e --- /dev/null +++ b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1943_en diff --git a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1948_en b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1948_en Binary files differnew file mode 100644 index 00000000..9577cef8 --- /dev/null +++ b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/1948_en diff --git a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/212_en b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/212_en Binary files differindex 2ae8176b..9a806f96 100644 --- a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/212_en +++ b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/212_en diff --git a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/212_fr b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/212_fr Binary files differindex 9016b0d0..92f3a0ce 100644 --- a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/212_fr +++ b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/212_fr diff --git a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/33_en b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/33_en Binary files differindex c94e1399..d8b8de7d 100644 --- a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/33_en +++ b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/33_en diff --git a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/34_en b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/34_en Binary files differindex 4e81c8af..ced2084e 100644 --- a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/34_en +++ b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/34_en diff --git a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/34_es b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/34_es Binary files differindex 3ab2985b..fe9f8a59 100644 --- a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/34_es +++ b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/34_es diff --git a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/351_en b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/351_en Binary files differindex 61f0da1e..5d925521 100644 --- a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/351_en +++ b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/351_en diff --git a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/44_en b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/44_en Binary files differindex b40793e7..0b9330fd 100644 --- a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/44_en +++ b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/44_en diff --git a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/52_en b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/52_en Binary files differindex e51cd55d..e1006cd9 100644 --- a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/52_en +++ b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/52_en diff --git a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/54_en b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/54_en Binary files differindex 53245827..a277f96d 100644 --- a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/54_en +++ b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/54_en diff --git a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/57_en b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/57_en Binary files differindex ec254fad..fde61aae 100644 --- a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/57_en +++ b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/57_en diff --git a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/61_en b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/61_en Binary files differindex e56bfb93..b5cd9779 100644 --- a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/61_en +++ b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/61_en diff --git a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/config b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/config Binary files differindex 49659897..909cabf3 100644 --- a/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/config +++ b/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/config diff --git a/geocoder/src/com/google/i18n/phonenumbers/timezones/data/map_data b/geocoder/src/com/google/i18n/phonenumbers/timezones/data/map_data Binary files differindex a2c80e64..aaa5ddfe 100644 --- a/geocoder/src/com/google/i18n/phonenumbers/timezones/data/map_data +++ b/geocoder/src/com/google/i18n/phonenumbers/timezones/data/map_data diff --git a/internal/prefixmapper/pom.xml b/internal/prefixmapper/pom.xml index 47770b85..441cc8f6 100644 --- a/internal/prefixmapper/pom.xml +++ b/internal/prefixmapper/pom.xml @@ -3,14 +3,14 @@ <modelVersion>4.0.0</modelVersion> <groupId>com.googlecode.libphonenumber</groupId> <artifactId>prefixmapper</artifactId> - <version>2.182</version> + <version>2.190</version> <packaging>jar</packaging> <url>https://github.com/google/libphonenumber/</url> <parent> <groupId>com.googlecode.libphonenumber</groupId> <artifactId>libphonenumber-parent</artifactId> - <version>8.12.46</version> + <version>8.12.54</version> <relativePath>../../pom.xml</relativePath> </parent> @@ -50,7 +50,7 @@ <dependency> <groupId>com.googlecode.libphonenumber</groupId> <artifactId>libphonenumber</artifactId> - <version>8.12.46</version> + <version>8.12.54</version> </dependency> </dependencies> diff --git a/internal/prefixmapper/src/com/google/i18n/phonenumbers/prefixmapper/PrefixFileReader.java b/internal/prefixmapper/src/com/google/i18n/phonenumbers/prefixmapper/PrefixFileReader.java index 8a4fde70..6033b678 100644 --- a/internal/prefixmapper/src/com/google/i18n/phonenumbers/prefixmapper/PrefixFileReader.java +++ b/internal/prefixmapper/src/com/google/i18n/phonenumbers/prefixmapper/PrefixFileReader.java @@ -16,8 +16,10 @@ package com.google.i18n.phonenumbers.prefixmapper; +import com.google.i18n.phonenumbers.MetadataLoader; import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; +import com.google.i18n.phonenumbers.metadata.DefaultMetadataDependenciesProvider; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; @@ -40,17 +42,17 @@ public class PrefixFileReader { private MappingFileProvider mappingFileProvider = new MappingFileProvider(); // A mapping from countryCallingCode_lang to the corresponding phone prefix map that has been // loaded. - private Map<String, PhonePrefixMap> availablePhonePrefixMaps = - new HashMap<String, PhonePrefixMap>(); + private Map<String, PhonePrefixMap> availablePhonePrefixMaps = new HashMap<>(); + private final MetadataLoader metadataLoader; public PrefixFileReader(String phonePrefixDataDirectory) { this.phonePrefixDataDirectory = phonePrefixDataDirectory; + this.metadataLoader = DefaultMetadataDependenciesProvider.getInstance().getMetadataLoader(); loadMappingFileProvider(); } private void loadMappingFileProvider() { - InputStream source = - PrefixFileReader.class.getResourceAsStream(phonePrefixDataDirectory + "config"); + InputStream source = metadataLoader.loadMetadata(phonePrefixDataDirectory + "config"); ObjectInputStream in = null; try { in = new ObjectInputStream(source); @@ -75,8 +77,7 @@ public class PrefixFileReader { } private void loadPhonePrefixMapFromFile(String fileName) { - InputStream source = - PrefixFileReader.class.getResourceAsStream(phonePrefixDataDirectory + fileName); + InputStream source = metadataLoader.loadMetadata(phonePrefixDataDirectory + fileName); ObjectInputStream in = null; try { in = new ObjectInputStream(source); diff --git a/lib/mockito-all-1.10.19.jar b/lib/mockito-all-1.10.19.jar Binary files differnew file mode 100644 index 00000000..c831489c --- /dev/null +++ b/lib/mockito-all-1.10.19.jar diff --git a/libphonenumber/pom.xml b/libphonenumber/pom.xml index eb163163..332ec818 100644 --- a/libphonenumber/pom.xml +++ b/libphonenumber/pom.xml @@ -3,14 +3,14 @@ <modelVersion>4.0.0</modelVersion> <groupId>com.googlecode.libphonenumber</groupId> <artifactId>libphonenumber</artifactId> - <version>8.12.46</version> + <version>8.12.54</version> <packaging>jar</packaging> <url>https://github.com/google/libphonenumber/</url> <parent> <groupId>com.googlecode.libphonenumber</groupId> <artifactId>libphonenumber-parent</artifactId> - <version>8.12.46</version> + <version>8.12.54</version> </parent> <build> diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/AlternateFormatsCountryCodeSet.java b/libphonenumber/src/com/google/i18n/phonenumbers/AlternateFormatsCountryCodeSet.java index 834c9d80..3975c2d3 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/AlternateFormatsCountryCodeSet.java +++ b/libphonenumber/src/com/google/i18n/phonenumbers/AlternateFormatsCountryCodeSet.java @@ -25,7 +25,7 @@ import java.util.Set; public class AlternateFormatsCountryCodeSet { // A set of all country codes for which data is available. - static Set<Integer> getCountryCodeSet() { + public static Set<Integer> getCountryCodeSet() { // The capacity is set to 61 as there are 46 different entries, // and this offers a load factor of roughly 0.75. Set<Integer> countryCodeSet = new HashSet<Integer>(61); diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMap.java b/libphonenumber/src/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMap.java index 159f940d..06571d15 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMap.java +++ b/libphonenumber/src/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMap.java @@ -30,7 +30,7 @@ public class CountryCodeToRegionCodeMap { // country/region represented by that country code. In the case of multiple // countries sharing a calling code, such as the NANPA countries, the one // indicated with "isMainCountryForCode" in the metadata should be first. - static Map<Integer, List<String>> getCountryCodeToRegionCodeMap() { + public static Map<Integer, List<String>> getCountryCodeToRegionCodeMap() { // The capacity is set to 286 as there are 215 different entries, // and this offers a load factor of roughly 0.75. Map<Integer, List<String>> countryCodeToRegionCodeMap = diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/MetadataManager.java b/libphonenumber/src/com/google/i18n/phonenumbers/MetadataManager.java deleted file mode 100644 index 5c072d6a..00000000 --- a/libphonenumber/src/com/google/i18n/phonenumbers/MetadataManager.java +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright (C) 2012 The Libphonenumber Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.i18n.phonenumbers; - -import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; -import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadataCollection; -import java.io.IOException; -import java.io.InputStream; -import java.io.ObjectInputStream; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicReference; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Manager for loading metadata for alternate formats and short numbers. We also declare some - * constants for phone number metadata loading, to more easily maintain all three types of metadata - * together. - * TODO: Consider managing phone number metadata loading here too. - */ -final class MetadataManager { - static final String MULTI_FILE_PHONE_NUMBER_METADATA_FILE_PREFIX = - "/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto"; - static final String SINGLE_FILE_PHONE_NUMBER_METADATA_FILE_NAME = - "/com/google/i18n/phonenumbers/data/SingleFilePhoneNumberMetadataProto"; - private static final String ALTERNATE_FORMATS_FILE_PREFIX = - "/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto"; - private static final String SHORT_NUMBER_METADATA_FILE_PREFIX = - "/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto"; - - static final MetadataLoader DEFAULT_METADATA_LOADER = new MetadataLoader() { - @Override - public InputStream loadMetadata(String metadataFileName) { - return MetadataManager.class.getResourceAsStream(metadataFileName); - } - }; - - private static final Logger logger = Logger.getLogger(MetadataManager.class.getName()); - - // A mapping from a country calling code to the alternate formats for that country calling code. - private static final ConcurrentHashMap<Integer, PhoneMetadata> alternateFormatsMap = - new ConcurrentHashMap<Integer, PhoneMetadata>(); - - // A mapping from a region code to the short number metadata for that region code. - private static final ConcurrentHashMap<String, PhoneMetadata> shortNumberMetadataMap = - new ConcurrentHashMap<String, PhoneMetadata>(); - - // The set of country calling codes for which there are alternate formats. For every country - // calling code in this set there should be metadata linked into the resources. - private static final Set<Integer> alternateFormatsCountryCodes = - AlternateFormatsCountryCodeSet.getCountryCodeSet(); - - // The set of region codes for which there are short number metadata. For every region code in - // this set there should be metadata linked into the resources. - private static final Set<String> shortNumberMetadataRegionCodes = - ShortNumbersRegionCodeSet.getRegionCodeSet(); - - private MetadataManager() {} - - static PhoneMetadata getAlternateFormatsForCountry(int countryCallingCode) { - if (!alternateFormatsCountryCodes.contains(countryCallingCode)) { - return null; - } - return getMetadataFromMultiFilePrefix(countryCallingCode, alternateFormatsMap, - ALTERNATE_FORMATS_FILE_PREFIX, DEFAULT_METADATA_LOADER); - } - - static PhoneMetadata getShortNumberMetadataForRegion(String regionCode) { - if (!shortNumberMetadataRegionCodes.contains(regionCode)) { - return null; - } - return getMetadataFromMultiFilePrefix(regionCode, shortNumberMetadataMap, - SHORT_NUMBER_METADATA_FILE_PREFIX, DEFAULT_METADATA_LOADER); - } - - static Set<String> getSupportedShortNumberRegions() { - return Collections.unmodifiableSet(shortNumberMetadataRegionCodes); - } - - /** - * @param key the lookup key for the provided map, typically a region code or a country calling - * code - * @param map the map containing mappings of already loaded metadata from their {@code key}. If - * this {@code key}'s metadata isn't already loaded, it will be added to this map after - * loading - * @param filePrefix the prefix of the file to load metadata from - * @param metadataLoader the metadata loader used to inject alternative metadata sources - */ - static <T> PhoneMetadata getMetadataFromMultiFilePrefix(T key, - ConcurrentHashMap<T, PhoneMetadata> map, String filePrefix, MetadataLoader metadataLoader) { - PhoneMetadata metadata = map.get(key); - if (metadata != null) { - return metadata; - } - // We assume key.toString() is well-defined. - String fileName = filePrefix + "_" + key; - List<PhoneMetadata> metadataList = getMetadataFromSingleFileName(fileName, metadataLoader); - if (metadataList.size() > 1) { - logger.log(Level.WARNING, "more than one metadata in file " + fileName); - } - metadata = metadataList.get(0); - PhoneMetadata oldValue = map.putIfAbsent(key, metadata); - return (oldValue != null) ? oldValue : metadata; - } - - // Loader and holder for the metadata maps loaded from a single file. - static class SingleFileMetadataMaps { - static SingleFileMetadataMaps load(String fileName, MetadataLoader metadataLoader) { - List<PhoneMetadata> metadataList = getMetadataFromSingleFileName(fileName, metadataLoader); - Map<String, PhoneMetadata> regionCodeToMetadata = new HashMap<String, PhoneMetadata>(); - Map<Integer, PhoneMetadata> countryCallingCodeToMetadata = - new HashMap<Integer, PhoneMetadata>(); - for (PhoneMetadata metadata : metadataList) { - String regionCode = metadata.getId(); - if (PhoneNumberUtil.REGION_CODE_FOR_NON_GEO_ENTITY.equals(regionCode)) { - // regionCode belongs to a non-geographical entity. - countryCallingCodeToMetadata.put(metadata.getCountryCode(), metadata); - } else { - regionCodeToMetadata.put(regionCode, metadata); - } - } - return new SingleFileMetadataMaps(regionCodeToMetadata, countryCallingCodeToMetadata); - } - - // A map from a region code to the PhoneMetadata for that region. - // For phone number metadata, the region code "001" is excluded, since that is used for the - // non-geographical phone number entities. - private final Map<String, PhoneMetadata> regionCodeToMetadata; - - // A map from a country calling code to the PhoneMetadata for that country calling code. - // Examples of the country calling codes include 800 (International Toll Free Service) and 808 - // (International Shared Cost Service). - // For phone number metadata, only the non-geographical phone number entities' country calling - // codes are present. - private final Map<Integer, PhoneMetadata> countryCallingCodeToMetadata; - - private SingleFileMetadataMaps(Map<String, PhoneMetadata> regionCodeToMetadata, - Map<Integer, PhoneMetadata> countryCallingCodeToMetadata) { - this.regionCodeToMetadata = Collections.unmodifiableMap(regionCodeToMetadata); - this.countryCallingCodeToMetadata = Collections.unmodifiableMap(countryCallingCodeToMetadata); - } - - PhoneMetadata get(String regionCode) { - return regionCodeToMetadata.get(regionCode); - } - - PhoneMetadata get(int countryCallingCode) { - return countryCallingCodeToMetadata.get(countryCallingCode); - } - } - - // Manages the atomic reference lifecycle of a SingleFileMetadataMaps encapsulation. - static SingleFileMetadataMaps getSingleFileMetadataMaps( - AtomicReference<SingleFileMetadataMaps> ref, String fileName, MetadataLoader metadataLoader) { - SingleFileMetadataMaps maps = ref.get(); - if (maps != null) { - return maps; - } - maps = SingleFileMetadataMaps.load(fileName, metadataLoader); - ref.compareAndSet(null, maps); - return ref.get(); - } - - private static List<PhoneMetadata> getMetadataFromSingleFileName(String fileName, - MetadataLoader metadataLoader) { - InputStream source = metadataLoader.loadMetadata(fileName); - if (source == null) { - // Sanity check; this would only happen if we packaged jars incorrectly. - throw new IllegalStateException("missing metadata: " + fileName); - } - PhoneMetadataCollection metadataCollection = loadMetadataAndCloseInput(source); - List<PhoneMetadata> metadataList = metadataCollection.getMetadataList(); - if (metadataList.size() == 0) { - // Sanity check; this should not happen since we build with non-empty metadata. - throw new IllegalStateException("empty metadata: " + fileName); - } - return metadataList; - } - - /** - * Loads and returns the metadata from the given stream and closes the stream. - * - * @param source the non-null stream from which metadata is to be read - * @return the loaded metadata - */ - private static PhoneMetadataCollection loadMetadataAndCloseInput(InputStream source) { - ObjectInputStream ois = null; - try { - try { - ois = new ObjectInputStream(source); - } catch (IOException e) { - throw new RuntimeException("cannot load/parse metadata", e); - } - PhoneMetadataCollection metadataCollection = new PhoneMetadataCollection(); - try { - metadataCollection.readExternal(ois); - } catch (IOException e) { - throw new RuntimeException("cannot load/parse metadata", e); - } - return metadataCollection; - } finally { - try { - if (ois != null) { - // This will close all underlying streams as well, including source. - ois.close(); - } else { - source.close(); - } - } catch (IOException e) { - logger.log(Level.WARNING, "error closing input stream (ignored)", e); - } - } - } -} diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/MissingMetadataException.java b/libphonenumber/src/com/google/i18n/phonenumbers/MissingMetadataException.java new file mode 100644 index 00000000..c2a8544c --- /dev/null +++ b/libphonenumber/src/com/google/i18n/phonenumbers/MissingMetadataException.java @@ -0,0 +1,9 @@ +package com.google.i18n.phonenumbers; + +/** Exception class for cases when expected metadata cannot be found. */ +public final class MissingMetadataException extends IllegalStateException { + + public MissingMetadataException(String message) { + super(message); + } +}
\ No newline at end of file diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/MultiFileMetadataSourceImpl.java b/libphonenumber/src/com/google/i18n/phonenumbers/MultiFileMetadataSourceImpl.java deleted file mode 100644 index 9a0b8e69..00000000 --- a/libphonenumber/src/com/google/i18n/phonenumbers/MultiFileMetadataSourceImpl.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2015 The Libphonenumber Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.i18n.phonenumbers; - -import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; - -/** - * Implementation of {@link MetadataSource} that reads from multiple resource files. - */ -final class MultiFileMetadataSourceImpl implements MetadataSource { - // The prefix of the binary files containing phone number metadata for different regions. - // This enables us to set up with different metadata, such as for testing. - private final String phoneNumberMetadataFilePrefix; - - // The {@link MetadataLoader} used to inject alternative metadata sources. - private final MetadataLoader metadataLoader; - - // A mapping from a region code to the phone number metadata for that region code. - // Unlike the mappings for alternate formats and short number metadata, the phone number metadata - // is loaded from a non-statically determined file prefix; therefore this map is bound to the - // instance and not static. - private final ConcurrentHashMap<String, PhoneMetadata> geographicalRegions = - new ConcurrentHashMap<String, PhoneMetadata>(); - - // A mapping from a country calling code for a non-geographical entity to the phone number - // metadata for that country calling code. Examples of the country calling codes include 800 - // (International Toll Free Service) and 808 (International Shared Cost Service). - // Unlike the mappings for alternate formats and short number metadata, the phone number metadata - // is loaded from a non-statically determined file prefix; therefore this map is bound to the - // instance and not static. - private final ConcurrentHashMap<Integer, PhoneMetadata> nonGeographicalRegions = - new ConcurrentHashMap<Integer, PhoneMetadata>(); - - // It is assumed that metadataLoader is not null. Checks should happen before passing it in here. - // @VisibleForTesting - MultiFileMetadataSourceImpl(String phoneNumberMetadataFilePrefix, MetadataLoader metadataLoader) { - this.phoneNumberMetadataFilePrefix = phoneNumberMetadataFilePrefix; - this.metadataLoader = metadataLoader; - } - - // It is assumed that metadataLoader is not null. Checks should happen before passing it in here. - MultiFileMetadataSourceImpl(MetadataLoader metadataLoader) { - this(MetadataManager.MULTI_FILE_PHONE_NUMBER_METADATA_FILE_PREFIX, metadataLoader); - } - - @Override - public PhoneMetadata getMetadataForRegion(String regionCode) { - return MetadataManager.getMetadataFromMultiFilePrefix(regionCode, geographicalRegions, - phoneNumberMetadataFilePrefix, metadataLoader); - } - - @Override - public PhoneMetadata getMetadataForNonGeographicalRegion(int countryCallingCode) { - if (!isNonGeographical(countryCallingCode)) { - // The given country calling code was for a geographical region. - return null; - } - return MetadataManager.getMetadataFromMultiFilePrefix(countryCallingCode, nonGeographicalRegions, - phoneNumberMetadataFilePrefix, metadataLoader); - } - - // A country calling code is non-geographical if it only maps to the non-geographical region code, - // i.e. "001". - private boolean isNonGeographical(int countryCallingCode) { - List<String> regionCodes = - CountryCodeToRegionCodeMap.getCountryCodeToRegionCodeMap().get(countryCallingCode); - return (regionCodes.size() == 1 - && PhoneNumberUtil.REGION_CODE_FOR_NON_GEO_ENTITY.equals(regionCodes.get(0))); - } -} diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberMatcher.java b/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberMatcher.java index c7bde8e1..b812551d 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberMatcher.java +++ b/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberMatcher.java @@ -24,6 +24,7 @@ import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber.CountryCodeSource; import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; import com.google.i18n.phonenumbers.internal.RegexCache; +import com.google.i18n.phonenumbers.metadata.DefaultMetadataDependenciesProvider; import java.lang.Character.UnicodeBlock; import java.util.Iterator; import java.util.NoSuchElementException; @@ -575,7 +576,9 @@ final class PhoneNumberMatcher implements Iterator<PhoneNumberMatch> { } // If this didn't pass, see if there are any alternate formats that match, and try them instead. PhoneMetadata alternateFormats = - MetadataManager.getAlternateFormatsForCountry(number.getCountryCode()); + DefaultMetadataDependenciesProvider.getInstance() + .getAlternateFormatsMetadataSource() + .getFormattingMetadataForCountryCallingCode(number.getCountryCode()); String nationalSignificantNumber = util.getNationalSignificantNumber(number); if (alternateFormats != null) { for (NumberFormat alternateFormat : alternateFormats.getNumberFormatList()) { diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java b/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java index 646b1345..200bea5a 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java +++ b/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java @@ -24,11 +24,12 @@ import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber.CountryCodeSource; import com.google.i18n.phonenumbers.internal.MatcherApi; import com.google.i18n.phonenumbers.internal.RegexBasedMatcher; import com.google.i18n.phonenumbers.internal.RegexCache; - +import com.google.i18n.phonenumbers.metadata.DefaultMetadataDependenciesProvider; +import com.google.i18n.phonenumbers.metadata.source.MetadataSource; +import com.google.i18n.phonenumbers.metadata.source.MetadataSourceImpl; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -73,10 +74,6 @@ public class PhoneNumberUtil { private static final int NANPA_COUNTRY_CODE = 1; - // The prefix that needs to be inserted in front of a Colombian landline number when dialed from - // a mobile phone in Colombia. - private static final String COLOMBIA_MOBILE_TO_FIXED_LINE_PREFIX = "3"; - // Map of country calling codes that use a mobile token before the area code. One example of when // this is relevant is when determining the length of the national destination code, which should // be the length of the area code plus the length of the mobile token. @@ -121,16 +118,16 @@ public class PhoneNumberUtil { private static final Map<Character, Character> ALL_PLUS_NUMBER_GROUPING_SYMBOLS; static { - HashMap<Integer, String> mobileTokenMap = new HashMap<Integer, String>(); + HashMap<Integer, String> mobileTokenMap = new HashMap<>(); mobileTokenMap.put(54, "9"); MOBILE_TOKEN_MAPPINGS = Collections.unmodifiableMap(mobileTokenMap); - HashSet<Integer> geoMobileCountriesWithoutMobileAreaCodes = new HashSet<Integer>(); + HashSet<Integer> geoMobileCountriesWithoutMobileAreaCodes = new HashSet<>(); geoMobileCountriesWithoutMobileAreaCodes.add(86); // China GEO_MOBILE_COUNTRIES_WITHOUT_MOBILE_AREA_CODES = Collections.unmodifiableSet(geoMobileCountriesWithoutMobileAreaCodes); - HashSet<Integer> geoMobileCountries = new HashSet<Integer>(); + HashSet<Integer> geoMobileCountries = new HashSet<>(); geoMobileCountries.add(52); // Mexico geoMobileCountries.add(54); // Argentina geoMobileCountries.add(55); // Brazil @@ -140,7 +137,7 @@ public class PhoneNumberUtil { // Simple ASCII digits map used to populate ALPHA_PHONE_MAPPINGS and // ALL_PLUS_NUMBER_GROUPING_SYMBOLS. - HashMap<Character, Character> asciiDigitMappings = new HashMap<Character, Character>(); + HashMap<Character, Character> asciiDigitMappings = new HashMap<>(); asciiDigitMappings.put('0', '0'); asciiDigitMappings.put('1', '1'); asciiDigitMappings.put('2', '2'); @@ -152,7 +149,7 @@ public class PhoneNumberUtil { asciiDigitMappings.put('8', '8'); asciiDigitMappings.put('9', '9'); - HashMap<Character, Character> alphaMap = new HashMap<Character, Character>(40); + HashMap<Character, Character> alphaMap = new HashMap<>(40); alphaMap.put('A', '2'); alphaMap.put('B', '2'); alphaMap.put('C', '2'); @@ -181,19 +178,19 @@ public class PhoneNumberUtil { alphaMap.put('Z', '9'); ALPHA_MAPPINGS = Collections.unmodifiableMap(alphaMap); - HashMap<Character, Character> combinedMap = new HashMap<Character, Character>(100); + HashMap<Character, Character> combinedMap = new HashMap<>(100); combinedMap.putAll(ALPHA_MAPPINGS); combinedMap.putAll(asciiDigitMappings); ALPHA_PHONE_MAPPINGS = Collections.unmodifiableMap(combinedMap); - HashMap<Character, Character> diallableCharMap = new HashMap<Character, Character>(); + HashMap<Character, Character> diallableCharMap = new HashMap<>(); diallableCharMap.putAll(asciiDigitMappings); diallableCharMap.put(PLUS_SIGN, PLUS_SIGN); diallableCharMap.put('*', '*'); diallableCharMap.put('#', '#'); DIALLABLE_CHAR_MAPPINGS = Collections.unmodifiableMap(diallableCharMap); - HashMap<Character, Character> allPlusNumberGroupings = new HashMap<Character, Character>(); + HashMap<Character, Character> allPlusNumberGroupings = new HashMap<>(); // Put (lower letter -> upper letter) and (upper letter -> upper letter) mappings. for (char c : ALPHA_MAPPINGS.keySet()) { allPlusNumberGroupings.put(Character.toLowerCase(c), c); @@ -308,8 +305,8 @@ public class PhoneNumberUtil { // version. private static final String EXTN_PATTERNS_FOR_PARSING = createExtnPattern(true); static final String EXTN_PATTERNS_FOR_MATCHING = createExtnPattern(false); - - /** + + /** * Helper method for constructing regular expressions for parsing. Creates an expression that * captures up to maxLength digits. */ @@ -659,7 +656,7 @@ public class PhoneNumberUtil { // The set of regions that share country calling code 1. // There are roughly 26 regions. // We set the initial capacity of the HashSet to 35 to offer a load factor of roughly 0.75. - private final Set<String> nanpaRegions = new HashSet<String>(35); + private final Set<String> nanpaRegions = new HashSet<>(35); // A cache for frequently used region-specific regular expressions. // The initial capacity is set to 100 as this seems to be an optimal value for Android, based on @@ -669,11 +666,11 @@ public class PhoneNumberUtil { // The set of regions the library supports. // There are roughly 240 of them and we set the initial capacity of the HashSet to 320 to offer a // load factor of roughly 0.75. - private final Set<String> supportedRegions = new HashSet<String>(320); + private final Set<String> supportedRegions = new HashSet<>(320); // The set of country calling codes that map to the non-geo entity region ("001"). This set // currently contains < 12 elements so the default capacity of 16 (load factor=0.75) is fine. - private final Set<Integer> countryCodesForNonGeographicalRegion = new HashSet<Integer>(); + private final Set<Integer> countryCodesForNonGeographicalRegion = new HashSet<>(); /** * This class implements a singleton, the constructor is only visible to facilitate testing. @@ -1089,7 +1086,7 @@ public class PhoneNumberUtil { * be non-null. */ private Set<PhoneNumberType> getSupportedTypesForMetadata(PhoneMetadata metadata) { - Set<PhoneNumberType> types = new TreeSet<PhoneNumberType>(); + Set<PhoneNumberType> types = new TreeSet<>(); for (PhoneNumberType type : PhoneNumberType.values()) { if (type == PhoneNumberType.FIXED_LINE_OR_MOBILE || type == PhoneNumberType.UNKNOWN) { // Never return FIXED_LINE_OR_MOBILE (it is a convenience type, and represents that a @@ -1149,7 +1146,9 @@ public class PhoneNumberUtil { */ public static synchronized PhoneNumberUtil getInstance() { if (instance == null) { - setInstance(createInstance(MetadataManager.DEFAULT_METADATA_LOADER)); + MetadataLoader metadataLoader = DefaultMetadataDependenciesProvider.getInstance() + .getMetadataLoader(); + setInstance(createInstance(metadataLoader)); } return instance; } @@ -1170,7 +1169,11 @@ public class PhoneNumberUtil { if (metadataLoader == null) { throw new IllegalArgumentException("metadataLoader could not be null."); } - return createInstance(new MultiFileMetadataSourceImpl(metadataLoader)); + return createInstance(new MetadataSourceImpl( + DefaultMetadataDependenciesProvider.getInstance().getPhoneNumberMetadataFileNameProvider(), + metadataLoader, + DefaultMetadataDependenciesProvider.getInstance().getMetadataParser() + )); } /** @@ -1464,10 +1467,7 @@ public class PhoneNumberUtil { (numberType == PhoneNumberType.FIXED_LINE) || (numberType == PhoneNumberType.MOBILE) || (numberType == PhoneNumberType.FIXED_LINE_OR_MOBILE); // Carrier codes may be needed in some countries. We handle this here. - if (regionCode.equals("CO") && numberType == PhoneNumberType.FIXED_LINE) { - formattedNumber = - formatNationalNumberWithCarrierCode(numberNoExt, COLOMBIA_MOBILE_TO_FIXED_LINE_PREFIX); - } else if (regionCode.equals("BR") && isFixedLineOrMobile) { + if (regionCode.equals("BR") && isFixedLineOrMobile) { // Historically, we set this to an empty string when parsing with raw input if none was // found in the input string. However, this doesn't result in a number we can dial. For this // reason, we treat the empty string the same as if it isn't set at all. @@ -1608,19 +1608,21 @@ public class PhoneNumberUtil { } /** - * Formats a phone number using the original phone number format that the number is parsed from. - * The original format is embedded in the country_code_source field of the PhoneNumber object - * passed in. If such information is missing, the number will be formatted into the NATIONAL - * format by default. When we don't have a formatting pattern for the number, the method returns - * the raw input when it is available. + * Formats a phone number using the original phone number format (e.g. INTERNATIONAL or NATIONAL) + * that the number is parsed from, provided that the number has been parsed with {@link + * parseAndKeepRawInput}. Otherwise the number will be formatted in NATIONAL format. + * + * <p>The original format is embedded in the country_code_source field of the PhoneNumber object + * passed in, which is only set when parsing keeps the raw input. When we don't have a formatting + * pattern for the number, the method falls back to returning the raw input. * - * Note this method guarantees no digit will be inserted, removed or modified as a result of + * <p>Note this method guarantees no digit will be inserted, removed or modified as a result of * formatting. * - * @param number the phone number that needs to be formatted in its original number format - * @param regionCallingFrom the region whose IDD needs to be prefixed if the original number - * has one - * @return the formatted phone number in its original number format + * @param number the phone number that needs to be formatted in its original number format + * @param regionCallingFrom the region whose IDD needs to be prefixed if the original number has + * one + * @return the formatted phone number in its original number format */ public String formatInOriginalFormat(PhoneNumber number, String regionCallingFrom) { if (number.hasRawInput() && !hasFormattingPatternForNumber(number)) { @@ -1699,7 +1701,7 @@ public class PhoneNumberUtil { NumberFormat.Builder numFormatCopy = NumberFormat.newBuilder(); numFormatCopy.mergeFrom(formatRule); numFormatCopy.clearNationalPrefixFormattingRule(); - List<NumberFormat> numberFormats = new ArrayList<NumberFormat>(1); + List<NumberFormat> numberFormats = new ArrayList<>(1); numberFormats.add(numFormatCopy.build()); formattedNumber = formatByPattern(number, PhoneNumberFormat.NATIONAL, numberFormats); break; @@ -2275,21 +2277,42 @@ public class PhoneNumberUtil { } /** - * Returns the metadata for the given region code or {@code null} if the region code is invalid - * or unknown. + * Returns the metadata for the given region code or {@code null} if the region code is invalid or + * unknown. + * + * @throws MissingMetadataException if the region code is valid, but metadata cannot be found. */ PhoneMetadata getMetadataForRegion(String regionCode) { if (!isValidRegionCode(regionCode)) { return null; } - return metadataSource.getMetadataForRegion(regionCode); + PhoneMetadata phoneMetadata = metadataSource.getMetadataForRegion(regionCode); + ensureMetadataIsNonNull(phoneMetadata, "Missing metadata for region code " + regionCode); + return phoneMetadata; } + /** + * Returns the metadata for the given country calling code or {@code null} if the country calling + * code is invalid or unknown. + * + * @throws MissingMetadataException if the country calling code is valid, but metadata cannot be + * found. + */ PhoneMetadata getMetadataForNonGeographicalRegion(int countryCallingCode) { - if (!countryCallingCodeToRegionCodeMap.containsKey(countryCallingCode)) { + if (!countryCodesForNonGeographicalRegion.contains(countryCallingCode)) { return null; } - return metadataSource.getMetadataForNonGeographicalRegion(countryCallingCode); + PhoneMetadata phoneMetadata = metadataSource.getMetadataForNonGeographicalRegion( + countryCallingCode); + ensureMetadataIsNonNull(phoneMetadata, + "Missing metadata for country code " + countryCallingCode); + return phoneMetadata; + } + + private static void ensureMetadataIsNonNull(PhoneMetadata phoneMetadata, String message) { + if (phoneMetadata == null) { + throw new MissingMetadataException(message); + } } boolean isNumberMatchingDesc(String nationalNumber, PhoneNumberDesc numberDesc) { @@ -2585,7 +2608,7 @@ public class PhoneNumberUtil { PhoneNumberDesc mobileDesc = getNumberDescByType(metadata, PhoneNumberType.MOBILE); if (descHasPossibleNumberData(mobileDesc)) { // Merge the mobile data in if there was any. We have to make a copy to do this. - possibleLengths = new ArrayList<Integer>(possibleLengths); + possibleLengths = new ArrayList<>(possibleLengths); // Note that when adding the possible lengths from mobile, we have to again check they // aren't empty since if they are this indicates they are the same as the general desc and // should be obtained from there. @@ -2599,7 +2622,7 @@ public class PhoneNumberUtil { if (localLengths.isEmpty()) { localLengths = mobileDesc.getPossibleLengthLocalOnlyList(); } else { - localLengths = new ArrayList<Integer>(localLengths); + localLengths = new ArrayList<>(localLengths); localLengths.addAll(mobileDesc.getPossibleLengthLocalOnlyList()); Collections.sort(localLengths); } diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/ShortNumberInfo.java b/libphonenumber/src/com/google/i18n/phonenumbers/ShortNumberInfo.java index 3e7df59e..7ce2972b 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/ShortNumberInfo.java +++ b/libphonenumber/src/com/google/i18n/phonenumbers/ShortNumberInfo.java @@ -22,6 +22,8 @@ import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc; import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; +import com.google.i18n.phonenumbers.metadata.DefaultMetadataDependenciesProvider; +import com.google.i18n.phonenumbers.metadata.source.RegionMetadataSource; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -44,12 +46,13 @@ public class ShortNumberInfo { private static final Logger logger = Logger.getLogger(ShortNumberInfo.class.getName()); private static final ShortNumberInfo INSTANCE = - new ShortNumberInfo(RegexBasedMatcher.create()); + new ShortNumberInfo( + RegexBasedMatcher.create(), + DefaultMetadataDependenciesProvider.getInstance().getShortNumberMetadataSource()); // In these countries, if extra digits are added to an emergency number, it no longer connects // to the emergency service. - private static final Set<String> REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT = - new HashSet<String>(); + private static final Set<String> REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT = new HashSet<>(); static { REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT.add("BR"); REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT.add("CL"); @@ -61,7 +64,7 @@ public class ShortNumberInfo { TOLL_FREE, STANDARD_RATE, PREMIUM_RATE, - UNKNOWN_COST; + UNKNOWN_COST } /** Returns the singleton instance of the ShortNumberInfo. */ @@ -79,9 +82,13 @@ public class ShortNumberInfo { // first. private final Map<Integer, List<String>> countryCallingCodeToRegionCodeMap; + private final RegionMetadataSource shortNumberMetadataSource; + // @VisibleForTesting - ShortNumberInfo(MatcherApi matcherApi) { + ShortNumberInfo(MatcherApi matcherApi, + RegionMetadataSource shortNumberMetadataSource) { this.matcherApi = matcherApi; + this.shortNumberMetadataSource = shortNumberMetadataSource; // TODO: Create ShortNumberInfo for a given map this.countryCallingCodeToRegionCodeMap = CountryCodeToRegionCodeMap.getCountryCodeToRegionCodeMap(); @@ -109,6 +116,21 @@ public class ShortNumberInfo { } /** + * A thin wrapper around {@code shortNumberMetadataSource} which catches {@link + * IllegalArgumentException} for invalid region code and instead returns {@code null} + */ + private PhoneMetadata getShortNumberMetadataForRegion(String regionCode) { + if (regionCode == null) { + return null; + } + try { + return shortNumberMetadataSource.getMetadataForRegion(regionCode); + } catch (IllegalArgumentException e) { + return null; + } + } + + /** * Check whether a short number is a possible number when dialed from the given region. This * provides a more lenient check than {@link #isValidShortNumberForRegion}. * @@ -120,8 +142,7 @@ public class ShortNumberInfo { if (!regionDialingFromMatchesNumber(number, regionDialingFrom)) { return false; } - PhoneMetadata phoneMetadata = - MetadataManager.getShortNumberMetadataForRegion(regionDialingFrom); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionDialingFrom); if (phoneMetadata == null) { return false; } @@ -142,7 +163,7 @@ public class ShortNumberInfo { List<String> regionCodes = getRegionCodesForCountryCode(number.getCountryCode()); int shortNumberLength = getNationalSignificantNumber(number).length(); for (String region : regionCodes) { - PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(region); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(region); if (phoneMetadata == null) { continue; } @@ -166,8 +187,7 @@ public class ShortNumberInfo { if (!regionDialingFromMatchesNumber(number, regionDialingFrom)) { return false; } - PhoneMetadata phoneMetadata = - MetadataManager.getShortNumberMetadataForRegion(regionDialingFrom); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionDialingFrom); if (phoneMetadata == null) { return false; } @@ -228,8 +248,7 @@ public class ShortNumberInfo { return ShortNumberCost.UNKNOWN_COST; } // Note that regionDialingFrom may be null, in which case phoneMetadata will also be null. - PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion( - regionDialingFrom); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionDialingFrom); if (phoneMetadata == null) { return ShortNumberCost.UNKNOWN_COST; } @@ -326,7 +345,7 @@ public class ShortNumberInfo { } String nationalNumber = getNationalSignificantNumber(number); for (String regionCode : regionCodes) { - PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionCode); if (phoneMetadata != null && matchesPossibleNumberAndNationalNumber(nationalNumber, phoneMetadata.getShortCode())) { // The number is valid for this region. @@ -337,13 +356,6 @@ public class ShortNumberInfo { } /** - * Convenience method to get a list of what regions the library has metadata for. - */ - Set<String> getSupportedRegions() { - return MetadataManager.getSupportedShortNumberRegions(); - } - - /** * Gets a valid short number for the specified region. * * @param regionCode the region for which an example short number is needed @@ -352,7 +364,7 @@ public class ShortNumberInfo { */ // @VisibleForTesting String getExampleShortNumber(String regionCode) { - PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionCode); if (phoneMetadata == null) { return ""; } @@ -373,7 +385,7 @@ public class ShortNumberInfo { */ // @VisibleForTesting String getExampleShortNumberForCost(String regionCode, ShortNumberCost cost) { - PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionCode); if (phoneMetadata == null) { return ""; } @@ -441,7 +453,7 @@ public class ShortNumberInfo { // add additional logic here to handle it. return false; } - PhoneMetadata metadata = MetadataManager.getShortNumberMetadataForRegion(regionCode); + PhoneMetadata metadata = getShortNumberMetadataForRegion(regionCode); if (metadata == null || !metadata.hasEmergency()) { return false; } @@ -468,7 +480,7 @@ public class ShortNumberInfo { List<String> regionCodes = getRegionCodesForCountryCode(number.getCountryCode()); String regionCode = getRegionCodeForShortNumberFromRegionList(number, regionCodes); String nationalNumber = getNationalSignificantNumber(number); - PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionCode); return (phoneMetadata != null) && (matchesPossibleNumberAndNationalNumber(nationalNumber, phoneMetadata.getCarrierSpecific())); @@ -492,8 +504,7 @@ public class ShortNumberInfo { return false; } String nationalNumber = getNationalSignificantNumber(number); - PhoneMetadata phoneMetadata = - MetadataManager.getShortNumberMetadataForRegion(regionDialingFrom); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionDialingFrom); return (phoneMetadata != null) && (matchesPossibleNumberAndNationalNumber(nationalNumber, phoneMetadata.getCarrierSpecific())); @@ -516,8 +527,7 @@ public class ShortNumberInfo { if (!regionDialingFromMatchesNumber(number, regionDialingFrom)) { return false; } - PhoneMetadata phoneMetadata = - MetadataManager.getShortNumberMetadataForRegion(regionDialingFrom); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionDialingFrom); return phoneMetadata != null && matchesPossibleNumberAndNationalNumber(getNationalSignificantNumber(number), phoneMetadata.getSmsServices()); diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/ShortNumbersRegionCodeSet.java b/libphonenumber/src/com/google/i18n/phonenumbers/ShortNumbersRegionCodeSet.java index 4b5e8b07..e2046b0c 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/ShortNumbersRegionCodeSet.java +++ b/libphonenumber/src/com/google/i18n/phonenumbers/ShortNumbersRegionCodeSet.java @@ -25,7 +25,7 @@ import java.util.Set; public class ShortNumbersRegionCodeSet { // A set of all region codes for which data is available. - static Set<String> getRegionCodeSet() { + public static Set<String> getRegionCodeSet() { // The capacity is set to 321 as there are 241 different entries, // and this offers a load factor of roughly 0.75. Set<String> regionCodeSet = new HashSet<String>(321); diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/SingleFileMetadataSourceImpl.java b/libphonenumber/src/com/google/i18n/phonenumbers/SingleFileMetadataSourceImpl.java deleted file mode 100644 index a988a543..00000000 --- a/libphonenumber/src/com/google/i18n/phonenumbers/SingleFileMetadataSourceImpl.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2015 The Libphonenumber Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.i18n.phonenumbers; - -import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; -import java.util.concurrent.atomic.AtomicReference; - -/** - * Implementation of {@link MetadataSource} that reads from a single resource file. - */ -final class SingleFileMetadataSourceImpl implements MetadataSource { - // The name of the binary file containing phone number metadata for different regions. - // This enables us to set up with different metadata, such as for testing. - private final String phoneNumberMetadataFileName; - - // The {@link MetadataLoader} used to inject alternative metadata sources. - private final MetadataLoader metadataLoader; - - private final AtomicReference<MetadataManager.SingleFileMetadataMaps> phoneNumberMetadataRef = - new AtomicReference<MetadataManager.SingleFileMetadataMaps>(); - - // It is assumed that metadataLoader is not null. Checks should happen before passing it in here. - // @VisibleForTesting - SingleFileMetadataSourceImpl(String phoneNumberMetadataFileName, MetadataLoader metadataLoader) { - this.phoneNumberMetadataFileName = phoneNumberMetadataFileName; - this.metadataLoader = metadataLoader; - } - - // It is assumed that metadataLoader is not null. Checks should happen before passing it in here. - SingleFileMetadataSourceImpl(MetadataLoader metadataLoader) { - this(MetadataManager.SINGLE_FILE_PHONE_NUMBER_METADATA_FILE_NAME, metadataLoader); - } - - @Override - public PhoneMetadata getMetadataForRegion(String regionCode) { - return MetadataManager.getSingleFileMetadataMaps(phoneNumberMetadataRef, - phoneNumberMetadataFileName, metadataLoader).get(regionCode); - } - - @Override - public PhoneMetadata getMetadataForNonGeographicalRegion(int countryCallingCode) { - // A country calling code is non-geographical if it only maps to the non-geographical region - // code, i.e. "001". If this is not true of the given country calling code, then we will return - // null here. If not for the atomic reference, such as if we were loading in multiple stages, we - // would check that the passed in country calling code was indeed non-geographical to avoid - // loading costs for a null result. Here though we do not check this since the entire data must - // be loaded anyway if any of it is needed at some point in the life cycle of this class. - return MetadataManager.getSingleFileMetadataMaps(phoneNumberMetadataRef, - phoneNumberMetadataFileName, metadataLoader).get(countryCallingCode); - } -} diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_375 b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_375 Binary files differdeleted file mode 100644 index b7d8cacd..00000000 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_375 +++ /dev/null diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_380 b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_380 Binary files differindex 874e5e13..f01473b5 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_380 +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_380 diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_49 b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_49 Binary files differindex d169d31e..fdb9f55c 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_49 +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_49 diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_63 b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_63 Binary files differdeleted file mode 100644 index e6f03ad1..00000000 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_63 +++ /dev/null diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_800 b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_800 Binary files differindex 6806a009..f4091758 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_800 +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_800 diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG Binary files differindex dfe50786..600f043a 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI Binary files differindex 6ba5be41..50c61861 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AO b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AO Binary files differindex 894d4fab..09ca4ed5 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AO +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AO diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR Binary files differindex 41c00923..dd6e97b0 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS Binary files differindex 29424fbe..8fd93bf2 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT Binary files differindex a54f4ca3..c9dc3115 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB Binary files differindex 339334bf..51ce25ba 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE Binary files differindex 01bb8dac..d3feed89 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF Binary files differindex dc01444b..2bcb8e83 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ Binary files differindex bb43464a..09d12540 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM Binary files differindex efa9b058..4a01f606 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR Binary files differindex ed648e4b..6a1c9818 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS Binary files differindex 6ccdd69a..73e27753 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW Binary files differindex e1cab68c..ca363123 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA Binary files differindex 5e981c85..b9ee37d2 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL Binary files differindex ddebc8f7..6bc75af5 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM Binary files differindex 283e679d..5fc149d4 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN Binary files differindex 3f7fcbbc..95fc994a 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO Binary files differindex 492f70af..b2942a98 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE Binary files differindex ebb5fb49..4be09b00 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM Binary files differindex 2b89782e..4075371b 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO Binary files differindex 5a7271eb..245f2c6c 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE Binary files differindex cdfd1f86..fbe8f680 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EH b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EH Binary files differindex 43163312..c91bbb61 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EH +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EH diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET Binary files differindex 33d742f9..bbc37a6f 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO Binary files differindex c7ee185a..9fea3ab0 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR Binary files differindex d52abcfc..80847ce0 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB Binary files differindex b11e9fda..12d9f4a7 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD Binary files differindex e11e957c..5538023d 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GE b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GE Binary files differindex 009e48ab..eb003a64 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GE +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GE diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GF b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GF Binary files differindex 8a056eb2..f6d9e149 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GF +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GF diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG Binary files differindex e1da75ca..c765fb03 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GH b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GH Binary files differindex 296fcf9d..45e6bc8f 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GH +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GH diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP Binary files differindex d0da8506..2633c4ad 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU Binary files differindex f6a759c8..5ccbef1a 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK Binary files differindex 7d938623..7b464ce8 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN Binary files differindex 00752953..883376c4 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR Binary files differindex 11de05ac..a38c7113 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL Binary files differindex 993af32f..2a4a84c8 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR Binary files differindex 8a720626..43229559 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS Binary files differindex c75dce67..857459b8 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT Binary files differindex 0cea04e8..d7001a5f 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE Binary files differindex bd6d7e51..0393a859 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM Binary files differindex fa01bc2c..ca4265cc 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP Binary files differindex 97585357..3ac3c9de 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE Binary files differindex ec6030f6..85766380 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG Binary files differindex 7672fa34..eeff6fe0 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN Binary files differindex 0c9dd320..1bf09f59 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY Binary files differindex 4ba22785..da2f3cf0 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC Binary files differindex 85135ca2..36adc17f 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA Binary files differindex 47c2eec0..25cac90d 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MH b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MH Binary files differindex a29c69d8..fc1542b9 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MH +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MH diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML Binary files differindex 7efdbaee..cabf18c5 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM Binary files differindex dbd636e5..c4e58998 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN Binary files differindex 5ab6a0d6..2723b92c 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP Binary files differindex 41b92f5b..51eaccdc 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MQ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MQ Binary files differindex f8b5f35c..a53de1f6 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MQ +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MQ diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS Binary files differindex 51ff6a48..a51b808d 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MT b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MT Binary files differindex cde7ce65..e7133bec 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MT +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MT diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MV b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MV Binary files differindex 365bafd7..22fc4c93 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MV +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MV diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX Binary files differindex a885cb56..8c6a632c 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY Binary files differindex 4622c358..9317fcae 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NC b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NC Binary files differindex 21951ced..486c78a0 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NC +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NC diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NL b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NL Binary files differindex 852c356a..4ee5e60c 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NL +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NL diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP Binary files differindex 36dc1e39..6b02afaa 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ Binary files differindex 49e38ad9..05a1d226 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA Binary files differindex 6ec881ff..e1eddfda 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE Binary files differindex 45b707a5..db7408c2 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG Binary files differindex 81dd47e2..f68e5223 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM Binary files differindex 305b85e9..257a20e6 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR Binary files differindex 67735fad..204e12d5 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT Binary files differindex 15e4a2a7..53563095 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA Binary files differindex 857b6d9b..1ae59572 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RE b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RE Binary files differindex dddb34ea..62d1a5d1 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RE +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RE diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE Binary files differindex fb9422cc..170d0d5c 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG Binary files differindex d3d777cf..eadddf85 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SI b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SI Binary files differindex 0e2e60c2..9b044f61 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SI +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SI diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX Binary files differindex b0fd135b..4b330f71 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SY b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SY Binary files differindex 1f1ce10f..b2d56078 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SY +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SY diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC Binary files differindex 23c56495..ce6cd976 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT Binary files differindex ddbeb93b..ae0d173b 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA Binary files differindex 76b49f27..ed30c934 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG Binary files differindex d08e73c7..ee2e0579 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_US b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_US Binary files differindex f8859190..6fad5941 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_US +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_US diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC Binary files differindex 7cfd32e7..a94967ad 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG Binary files differindex 057bc582..87aa6c65 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI Binary files differindex b340ff45..0e99feaa 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN Binary files differindex 0a8fd5af..d7470ecd 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_YT b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_YT Binary files differindex cec9da09..728c7e64 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_YT +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_YT diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AT b/libphonenumber/src/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AT Binary files differindex 1947aa2a..ecfe1344 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AT +++ b/libphonenumber/src/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AT diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/internal/GeoEntityUtility.java b/libphonenumber/src/com/google/i18n/phonenumbers/internal/GeoEntityUtility.java new file mode 100644 index 00000000..ef0cf67f --- /dev/null +++ b/libphonenumber/src/com/google/i18n/phonenumbers/internal/GeoEntityUtility.java @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.internal; + +import com.google.i18n.phonenumbers.CountryCodeToRegionCodeMap; +import java.util.List; + +/** + * Utility class for checking whether identifiers region code and country calling code belong + * to geographical entities. For more information about geo vs. non-geo entities see {@link + * com.google.i18n.phonenumbers.metadata.source.RegionMetadataSource} and {@link + * com.google.i18n.phonenumbers.metadata.source.NonGeographicalEntityMetadataSource} + */ +public final class GeoEntityUtility { + + /** Region code with a special meaning, used to mark non-geographical entities */ + public static final String REGION_CODE_FOR_NON_GEO_ENTITIES = "001"; + + /** Determines whether {@code regionCode} belongs to a geographical entity. */ + public static boolean isGeoEntity(String regionCode) { + return !regionCode.equals(REGION_CODE_FOR_NON_GEO_ENTITIES); + } + + /** + * Determines whether {@code countryCallingCode} belongs to a geographical entity. + * + * <p>A single country calling code could map to several different regions. It is considered that + * {@code countryCallingCode} belongs to a geo entity if all of these regions are geo entities + * + * <p>Note that this method will not throw an exception even when the underlying mapping for the + * {@code countryCallingCode} does not exist, instead it will return {@code false} + */ + public static boolean isGeoEntity(int countryCallingCode) { + List<String> regionCodesForCountryCallingCode = + CountryCodeToRegionCodeMap.getCountryCodeToRegionCodeMap().get(countryCallingCode); + + return regionCodesForCountryCallingCode != null + && !regionCodesForCountryCallingCode.contains(REGION_CODE_FOR_NON_GEO_ENTITIES); + } + + private GeoEntityUtility() {} +} diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/metadata/DefaultMetadataDependenciesProvider.java b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/DefaultMetadataDependenciesProvider.java new file mode 100644 index 00000000..6bf4df94 --- /dev/null +++ b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/DefaultMetadataDependenciesProvider.java @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata; + +import com.google.i18n.phonenumbers.MetadataLoader; +import com.google.i18n.phonenumbers.metadata.init.ClassPathResourceMetadataLoader; +import com.google.i18n.phonenumbers.metadata.init.MetadataParser; +import com.google.i18n.phonenumbers.metadata.source.FormattingMetadataSource; +import com.google.i18n.phonenumbers.metadata.source.FormattingMetadataSourceImpl; +import com.google.i18n.phonenumbers.metadata.source.MetadataSource; +import com.google.i18n.phonenumbers.metadata.source.MetadataSourceImpl; +import com.google.i18n.phonenumbers.metadata.source.MultiFileModeFileNameProvider; +import com.google.i18n.phonenumbers.metadata.source.PhoneMetadataFileNameProvider; +import com.google.i18n.phonenumbers.metadata.source.RegionMetadataSource; +import com.google.i18n.phonenumbers.metadata.source.RegionMetadataSourceImpl; + +/** + * Provides metadata init and source dependencies when metadata is stored in multi-file mode and + * loaded as a classpath resource. + */ +public final class DefaultMetadataDependenciesProvider { + + private static final DefaultMetadataDependenciesProvider INSTANCE = new DefaultMetadataDependenciesProvider(); + + public static DefaultMetadataDependenciesProvider getInstance() { + return INSTANCE; + } + + private DefaultMetadataDependenciesProvider() { + } + + private final MetadataParser metadataParser = MetadataParser.newLenientParser(); + private final MetadataLoader metadataLoader = new ClassPathResourceMetadataLoader(); + + private final PhoneMetadataFileNameProvider phoneNumberMetadataFileNameProvider = + new MultiFileModeFileNameProvider( + "/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto"); + private final MetadataSource phoneNumberMetadataSource = + new MetadataSourceImpl( + phoneNumberMetadataFileNameProvider, + metadataLoader, + metadataParser); + + private final PhoneMetadataFileNameProvider shortNumberMetadataFileNameProvider = + new MultiFileModeFileNameProvider( + "/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto"); + private final RegionMetadataSource shortNumberMetadataSource = + new RegionMetadataSourceImpl( + shortNumberMetadataFileNameProvider, + metadataLoader, + metadataParser); + + private final PhoneMetadataFileNameProvider alternateFormatsMetadataFileNameProvider = + new MultiFileModeFileNameProvider( + "/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto"); + private final FormattingMetadataSource alternateFormatsMetadataSource = + new FormattingMetadataSourceImpl( + alternateFormatsMetadataFileNameProvider, + metadataLoader, + metadataParser); + + public MetadataParser getMetadataParser() { + return metadataParser; + } + + public MetadataLoader getMetadataLoader() { + return metadataLoader; + } + + public PhoneMetadataFileNameProvider getPhoneNumberMetadataFileNameProvider() { + return phoneNumberMetadataFileNameProvider; + } + + public MetadataSource getPhoneNumberMetadataSource() { + return phoneNumberMetadataSource; + } + + public PhoneMetadataFileNameProvider getShortNumberMetadataFileNameProvider() { + return shortNumberMetadataFileNameProvider; + } + + public RegionMetadataSource getShortNumberMetadataSource() { + return shortNumberMetadataSource; + } + + public PhoneMetadataFileNameProvider getAlternateFormatsMetadataFileNameProvider() { + return alternateFormatsMetadataFileNameProvider; + } + + public FormattingMetadataSource getAlternateFormatsMetadataSource() { + return alternateFormatsMetadataSource; + } + + public String getCarrierDataDirectory() { + return "/com/google/i18n/phonenumbers/carrier/data/"; + } + + public String getGeocodingDataDirectory() { + return "/com/google/i18n/phonenumbers/geocoding/data/"; + } +} diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/metadata/init/ClassPathResourceMetadataLoader.java b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/init/ClassPathResourceMetadataLoader.java new file mode 100644 index 00000000..76122b8a --- /dev/null +++ b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/init/ClassPathResourceMetadataLoader.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.init; + +import com.google.i18n.phonenumbers.MetadataLoader; +import java.io.InputStream; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * A {@link MetadataLoader} implementation that reads phone number metadata files as classpath + * resources. + */ +public final class ClassPathResourceMetadataLoader implements MetadataLoader { + + private static final Logger logger = + Logger.getLogger(ClassPathResourceMetadataLoader.class.getName()); + + @Override + public InputStream loadMetadata(String metadataFileName) { + InputStream inputStream = + ClassPathResourceMetadataLoader.class.getResourceAsStream(metadataFileName); + if (inputStream == null) { + logger.log(Level.WARNING, String.format("File %s not found", metadataFileName)); + } + return inputStream; + } +}
\ No newline at end of file diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/metadata/init/MetadataParser.java b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/init/MetadataParser.java new file mode 100644 index 00000000..e923dfad --- /dev/null +++ b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/init/MetadataParser.java @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.init; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadataCollection; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Exposes single method for parsing {@link InputStream} content into {@link Collection} of {@link + * PhoneMetadata} + */ +public final class MetadataParser { + + private static final Logger logger = Logger.getLogger(MetadataParser.class.getName()); + + /** + * Creates new instance in lenient mode, see {@link MetadataParser#parse(InputStream)} for more + * info. + */ + public static MetadataParser newLenientParser() { + return new MetadataParser(false); + } + + /** + * Creates new instance in strict mode, see {@link MetadataParser#parse(InputStream)} for more + * info + */ + public static MetadataParser newStrictParser() { + return new MetadataParser(true); + } + + private final boolean strictMode; + + private MetadataParser(boolean strictMode) { + this.strictMode = strictMode; + } + + /** + * Parses given {@link InputStream} into a {@link Collection} of {@link PhoneMetadata}. + * + * @throws IllegalArgumentException if {@code source} is {@code null} and strict mode is on + * @return parsed {@link PhoneMetadata}, or empty {@link Collection} if {@code source} is {@code + * null} and lenient mode is on + */ + public Collection<PhoneMetadata> parse(InputStream source) { + if (source == null) { + return handleNullSource(); + } + ObjectInputStream ois = null; + try { + ois = new ObjectInputStream(source); + PhoneMetadataCollection phoneMetadataCollection = new PhoneMetadataCollection(); + phoneMetadataCollection.readExternal(ois); + List<PhoneMetadata> phoneMetadata = phoneMetadataCollection.getMetadataList(); + // Sanity check; this should not happen if provided InputStream is valid + if (phoneMetadata.isEmpty()) { + throw new IllegalStateException("Empty metadata"); + } + return phoneMetadataCollection.getMetadataList(); + } catch (IOException e) { + throw new IllegalStateException("Unable to parse metadata file", e); + } finally { + if (ois != null) { + // This will close all underlying streams as well, including source. + close(ois); + } else { + close(source); + } + } + } + + private List<PhoneMetadata> handleNullSource() { + if (strictMode) { + throw new IllegalArgumentException("Source cannot be null"); + } + return Collections.emptyList(); + } + + private void close(InputStream inputStream) { + try { + inputStream.close(); + } catch (IOException e) { + logger.log(Level.WARNING, "Error closing input stream (ignored)", e); + } + } +}
\ No newline at end of file diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/BlockingMetadataBootstrappingGuard.java b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/BlockingMetadataBootstrappingGuard.java new file mode 100644 index 00000000..d621e0cf --- /dev/null +++ b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/BlockingMetadataBootstrappingGuard.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.MetadataLoader; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.metadata.init.MetadataParser; +import java.io.InputStream; +import java.util.Collection; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * A blocking implementation of {@link MetadataBootstrappingGuard}. Can be used for both single-file + * (bulk) and multi-file metadata + * + * @param <T> needs to extend {@link MetadataContainer} + */ +final class BlockingMetadataBootstrappingGuard<T extends MetadataContainer> + implements MetadataBootstrappingGuard<T> { + + private final MetadataLoader metadataLoader; + private final MetadataParser metadataParser; + private final T metadataContainer; + private final Map<String, String> loadedFiles; // identity map + + BlockingMetadataBootstrappingGuard( + MetadataLoader metadataLoader, MetadataParser metadataParser, T metadataContainer) { + this.metadataLoader = metadataLoader; + this.metadataParser = metadataParser; + this.metadataContainer = metadataContainer; + this.loadedFiles = new ConcurrentHashMap<>(); + } + + @Override + public T getOrBootstrap(String phoneMetadataFile) { + if (!loadedFiles.containsKey(phoneMetadataFile)) { + bootstrapMetadata(phoneMetadataFile); + } + return metadataContainer; + } + + private synchronized void bootstrapMetadata(String phoneMetadataFile) { + // Additional check is needed because multiple threads could pass the first check when calling + // getOrBootstrap() at the same time for unloaded metadata file + if (loadedFiles.containsKey(phoneMetadataFile)) { + return; + } + Collection<PhoneMetadata> phoneMetadata = read(phoneMetadataFile); + for (PhoneMetadata metadata : phoneMetadata) { + metadataContainer.accept(metadata); + } + loadedFiles.put(phoneMetadataFile, phoneMetadataFile); + } + + private Collection<PhoneMetadata> read(String phoneMetadataFile) { + try { + InputStream metadataStream = metadataLoader.loadMetadata(phoneMetadataFile); + return metadataParser.parse(metadataStream); + } catch (IllegalArgumentException | IllegalStateException e) { + throw new IllegalStateException("Failed to read file " + phoneMetadataFile, e); + } + } +} diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/CompositeMetadataContainer.java b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/CompositeMetadataContainer.java new file mode 100644 index 00000000..72757495 --- /dev/null +++ b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/CompositeMetadataContainer.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.internal.GeoEntityUtility; + +/** + * Implementation of {@link MetadataContainer} which is a composition of different {@link + * MapBackedMetadataContainer}s. It adds items to a single simpler container at a time depending on + * the content of {@link PhoneMetadata}. + */ +final class CompositeMetadataContainer implements MetadataContainer { + + private final MapBackedMetadataContainer<Integer> metadataByCountryCode = + MapBackedMetadataContainer.byCountryCallingCode(); + private final MapBackedMetadataContainer<String> metadataByRegionCode = + MapBackedMetadataContainer.byRegionCode(); + + /** + * Intended to be called for geographical regions only. For non-geographical entities, use {@link + * CompositeMetadataContainer#getMetadataBy(int)} + */ + PhoneMetadata getMetadataBy(String regionCode) { + return metadataByRegionCode.getMetadataBy(regionCode); + } + + /** + * Intended to be called for non-geographical entities only, such as 800 (country code assigned to + * the Universal International Freephone Service). For geographical regions, use {@link + * CompositeMetadataContainer#getMetadataBy(String)} + */ + PhoneMetadata getMetadataBy(int countryCallingCode) { + return metadataByCountryCode.getMetadataBy(countryCallingCode); + } + + /** + * If the metadata belongs to a specific geographical region (it has a region code other than + * {@link GeoEntityUtility#REGION_CODE_FOR_NON_GEO_ENTITIES}), it will be added to a {@link + * MapBackedMetadataContainer} which stores metadata by region code. Otherwise, it will be added + * to a {@link MapBackedMetadataContainer} which stores metadata by country calling code. This + * means that {@link CompositeMetadataContainer#getMetadataBy(int)} will not work for country + * calling codes such as 41 (country calling code for Switzerland), only for country calling codes + * such as 800 (country code assigned to the Universal International Freephone Service) + */ + @Override + public void accept(PhoneMetadata phoneMetadata) { + String regionCode = metadataByRegionCode.getKeyProvider().getKeyOf(phoneMetadata); + if (GeoEntityUtility.isGeoEntity(regionCode)) { + metadataByRegionCode.accept(phoneMetadata); + } else { + metadataByCountryCode.accept(phoneMetadata); + } + } +} diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/FormattingMetadataSource.java b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/FormattingMetadataSource.java new file mode 100644 index 00000000..f4f332cb --- /dev/null +++ b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/FormattingMetadataSource.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; + +/** A source of formatting phone metadata. */ +public interface FormattingMetadataSource { + + /** + * Returns formatting phone metadata for provided country calling code. + * + * <p>This method is similar to the one in {@link + * NonGeographicalEntityMetadataSource#getMetadataForNonGeographicalRegion(int)}, except that it + * will not fail for geographical regions, it can be used for both geo- and non-geo entities. + * + * <p>In case the provided {@code countryCallingCode} maps to several different regions, only one + * would contain formatting metadata. + * + * @return the phone metadata for provided {@code countryCallingCode}, or null if there is none. + */ + PhoneMetadata getFormattingMetadataForCountryCallingCode(int countryCallingCode); +} diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/FormattingMetadataSourceImpl.java b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/FormattingMetadataSourceImpl.java new file mode 100644 index 00000000..d6a81909 --- /dev/null +++ b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/FormattingMetadataSourceImpl.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.MetadataLoader; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.metadata.init.MetadataParser; + +/** + * Implementation of {@link FormattingMetadataSource} guarded by {@link MetadataBootstrappingGuard} + * + * <p>By default, a {@link BlockingMetadataBootstrappingGuard} will be used, but any custom + * implementation can be injected. + */ +public final class FormattingMetadataSourceImpl implements FormattingMetadataSource { + + private final PhoneMetadataFileNameProvider phoneMetadataFileNameProvider; + private final MetadataBootstrappingGuard<MapBackedMetadataContainer<Integer>> bootstrappingGuard; + + public FormattingMetadataSourceImpl( + PhoneMetadataFileNameProvider phoneMetadataFileNameProvider, + MetadataBootstrappingGuard<MapBackedMetadataContainer<Integer>> bootstrappingGuard) { + this.phoneMetadataFileNameProvider = phoneMetadataFileNameProvider; + this.bootstrappingGuard = bootstrappingGuard; + } + + public FormattingMetadataSourceImpl( + PhoneMetadataFileNameProvider phoneMetadataFileNameProvider, + MetadataLoader metadataLoader, + MetadataParser metadataParser) { + this( + phoneMetadataFileNameProvider, + new BlockingMetadataBootstrappingGuard<>( + metadataLoader, metadataParser, MapBackedMetadataContainer.byCountryCallingCode())); + } + + @Override + public PhoneMetadata getFormattingMetadataForCountryCallingCode(int countryCallingCode) { + return bootstrappingGuard + .getOrBootstrap(phoneMetadataFileNameProvider.getFor(countryCallingCode)) + .getMetadataBy(countryCallingCode); + } +} diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/MapBackedMetadataContainer.java b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/MapBackedMetadataContainer.java new file mode 100644 index 00000000..639280d8 --- /dev/null +++ b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/MapBackedMetadataContainer.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * A {@link MetadataContainer} implementation backed by a {@link ConcurrentHashMap} with generic + * keys. + */ +final class MapBackedMetadataContainer<T> implements MetadataContainer { + + static MapBackedMetadataContainer<String> byRegionCode() { + return new MapBackedMetadataContainer<>( + new KeyProvider<String>() { + @Override + public String getKeyOf(PhoneMetadata phoneMetadata) { + return phoneMetadata.getId(); + } + }); + } + + static MapBackedMetadataContainer<Integer> byCountryCallingCode() { + return new MapBackedMetadataContainer<>( + new KeyProvider<Integer>() { + @Override + public Integer getKeyOf(PhoneMetadata phoneMetadata) { + return phoneMetadata.getCountryCode(); + } + }); + } + + private final ConcurrentMap<T, PhoneMetadata> metadataMap; + + private final KeyProvider<T> keyProvider; + + private MapBackedMetadataContainer(KeyProvider<T> keyProvider) { + this.metadataMap = new ConcurrentHashMap<>(); + this.keyProvider = keyProvider; + } + + PhoneMetadata getMetadataBy(T key) { + return key != null ? metadataMap.get(key) : null; + } + + KeyProvider<T> getKeyProvider() { + return keyProvider; + } + + @Override + public void accept(PhoneMetadata phoneMetadata) { + metadataMap.put(keyProvider.getKeyOf(phoneMetadata), phoneMetadata); + } + + interface KeyProvider<T> { + T getKeyOf(PhoneMetadata phoneMetadata); + } +} diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/MetadataBootstrappingGuard.java b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/MetadataBootstrappingGuard.java new file mode 100644 index 00000000..9380c595 --- /dev/null +++ b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/MetadataBootstrappingGuard.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +/** + * Guard that ensures that metadata bootstrapping process (loading and parsing) is triggered only + * once per metadata file. + * + * @param <T> needs to extend {@link MetadataContainer} + */ +public interface MetadataBootstrappingGuard<T extends MetadataContainer> { + + /** + * If metadata from the provided file has not yet been read, invokes loading and parsing from the + * provided file and adds the result to guarded {@link MetadataContainer}. + * + * @param phoneMetadataFile to read from + * @return guarded {@link MetadataContainer} + */ + T getOrBootstrap(String phoneMetadataFile); +} diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/MetadataSource.java b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/MetadataContainer.java index f5ffcad8..3f6b21ed 100644 --- a/libphonenumber/src/com/google/i18n/phonenumbers/MetadataSource.java +++ b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/MetadataContainer.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015 The Libphonenumber Authors + * Copyright (C) 2022 The Libphonenumber Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,26 +14,19 @@ * limitations under the License. */ -package com.google.i18n.phonenumbers; +package com.google.i18n.phonenumbers.metadata.source; import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; /** - * A source for phone metadata for all regions. + * A container for {@link PhoneMetadata} */ -interface MetadataSource { +interface MetadataContainer { /** - * Gets phone metadata for a region. - * @param regionCode the region code. - * @return the phone metadata for that region, or null if there is none. + * Adds {@link PhoneMetadata} to the container. It depends on the implementation of the interface + * what this means, for example {@link MapBackedMetadataContainer} simply adds the provided + * metadata into the backing map. Implementing classes should ensure thread-safety. */ - PhoneMetadata getMetadataForRegion(String regionCode); - - /** - * Gets phone metadata for a non-geographical region. - * @param countryCallingCode the country calling code. - * @return the phone metadata for that region, or null if there is none. - */ - PhoneMetadata getMetadataForNonGeographicalRegion(int countryCallingCode); + void accept(PhoneMetadata phoneMetadata); } diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/MetadataSource.java b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/MetadataSource.java new file mode 100644 index 00000000..d353ce96 --- /dev/null +++ b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/MetadataSource.java @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +/** A source of phone metadata split by different regions. */ +public interface MetadataSource extends RegionMetadataSource, NonGeographicalEntityMetadataSource { +} diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/MetadataSourceImpl.java b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/MetadataSourceImpl.java new file mode 100644 index 00000000..c3d1c736 --- /dev/null +++ b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/MetadataSourceImpl.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.MetadataLoader; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.internal.GeoEntityUtility; +import com.google.i18n.phonenumbers.metadata.init.MetadataParser; + +/** + * Implementation of {@link MetadataSource} guarded by {@link MetadataBootstrappingGuard}. + * + * <p>By default, a {@link BlockingMetadataBootstrappingGuard} will be used, but any custom + * implementation can be injected. + */ +public final class MetadataSourceImpl implements MetadataSource { + + private final PhoneMetadataFileNameProvider phoneMetadataFileNameProvider; + private final MetadataBootstrappingGuard<CompositeMetadataContainer> bootstrappingGuard; + + public MetadataSourceImpl( + PhoneMetadataFileNameProvider phoneMetadataFileNameProvider, + MetadataBootstrappingGuard<CompositeMetadataContainer> bootstrappingGuard) { + this.phoneMetadataFileNameProvider = phoneMetadataFileNameProvider; + this.bootstrappingGuard = bootstrappingGuard; + } + + public MetadataSourceImpl( + PhoneMetadataFileNameProvider phoneMetadataFileNameProvider, + MetadataLoader metadataLoader, + MetadataParser metadataParser) { + this( + phoneMetadataFileNameProvider, + new BlockingMetadataBootstrappingGuard<>( + metadataLoader, metadataParser, new CompositeMetadataContainer())); + } + + @Override + public PhoneMetadata getMetadataForNonGeographicalRegion(int countryCallingCode) { + if (GeoEntityUtility.isGeoEntity(countryCallingCode)) { + throw new IllegalArgumentException( + countryCallingCode + " calling code belongs to a geo entity"); + } + return bootstrappingGuard + .getOrBootstrap(phoneMetadataFileNameProvider.getFor(countryCallingCode)) + .getMetadataBy(countryCallingCode); + } + + @Override + public PhoneMetadata getMetadataForRegion(String regionCode) { + if (!GeoEntityUtility.isGeoEntity(regionCode)) { + throw new IllegalArgumentException(regionCode + " region code is a non-geo entity"); + } + return bootstrappingGuard + .getOrBootstrap(phoneMetadataFileNameProvider.getFor(regionCode)) + .getMetadataBy(regionCode); + } +} diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProvider.java b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProvider.java new file mode 100644 index 00000000..0d9adb5e --- /dev/null +++ b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProvider.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import java.util.regex.Pattern; + +/** + * {@link PhoneMetadataFileNameProvider} implementation which appends key as a suffix to the + * predefined metadata file name base. + */ +public final class MultiFileModeFileNameProvider implements PhoneMetadataFileNameProvider { + + private final String phoneMetadataFileNamePrefix; + private static final Pattern ALPHANUMERIC = Pattern.compile("^[\\p{L}\\p{N}]+$"); + + public MultiFileModeFileNameProvider(String phoneMetadataFileNameBase) { + this.phoneMetadataFileNamePrefix = phoneMetadataFileNameBase + "_"; + } + + @Override + public String getFor(Object key) { + String keyAsString = key.toString(); + if (!ALPHANUMERIC.matcher(keyAsString).matches()) { + throw new IllegalArgumentException("Invalid key: " + keyAsString); + } + return phoneMetadataFileNamePrefix + key; + } +} diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/NonGeographicalEntityMetadataSource.java b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/NonGeographicalEntityMetadataSource.java new file mode 100644 index 00000000..70db06df --- /dev/null +++ b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/NonGeographicalEntityMetadataSource.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; + +/** + * A source of phone metadata for non-geographical entities. + * + * <p>Non-geographical entities are phone number ranges that have a country calling code, but either + * do not belong to an actual country (some international services), or belong to a region which has + * a different country calling code from the country it is part of. Examples of such ranges are + * those starting with: + * + * <ul> + * <li>800 - country code assigned to the Universal International Freephone Service + * <li>808 - country code assigned to the International Shared Cost Service + * <li>870 - country code assigned to the Pitcairn Islands + * <li>... + * </ul> + */ +public interface NonGeographicalEntityMetadataSource { + + /** + * Gets phone metadata for a non-geographical entity. + * + * @param countryCallingCode the country calling code. + * @return the phone metadata for that entity, or null if there is none. + * @throws IllegalArgumentException if provided {@code countryCallingCode} does not belong to a + * non-geographical entity + */ + PhoneMetadata getMetadataForNonGeographicalRegion(int countryCallingCode); +} diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/PhoneMetadataFileNameProvider.java b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/PhoneMetadataFileNameProvider.java new file mode 100644 index 00000000..c3d16887 --- /dev/null +++ b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/PhoneMetadataFileNameProvider.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +/** + * Abstraction responsible for inferring the metadata file name. + * + * <p>Two implementations are available: + * + * <ul> + * <li>{@link SingleFileModeFileNameProvider} for single-file metadata. + * <li>{@link MultiFileModeFileNameProvider} for multi-file metadata. + * </ul> + */ +public interface PhoneMetadataFileNameProvider { + + /** + * Returns phone metadata file path for the given key. Assumes that key.toString() is + * well-defined. + */ + String getFor(Object key); +} diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/RegionMetadataSource.java b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/RegionMetadataSource.java new file mode 100644 index 00000000..3cf15c20 --- /dev/null +++ b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/RegionMetadataSource.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.internal.GeoEntityUtility; + +/** + * A source of phone metadata split by geographical regions. + */ +public interface RegionMetadataSource { + + /** + * Returns phone metadata for provided geographical region. + * + * <p>The {@code regionCode} must be different from {@link + * GeoEntityUtility#REGION_CODE_FOR_NON_GEO_ENTITIES}, which has a special meaning and is used to + * mark non-geographical regions (see {@link NonGeographicalEntityMetadataSource} for more + * information). + * + * @return the phone metadata for provided {@code regionCode}, or null if there is none. + * @throws IllegalArgumentException if provided {@code regionCode} is {@link + * GeoEntityUtility#REGION_CODE_FOR_NON_GEO_ENTITIES} + */ + PhoneMetadata getMetadataForRegion(String regionCode); +} diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/RegionMetadataSourceImpl.java b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/RegionMetadataSourceImpl.java new file mode 100644 index 00000000..0078dd94 --- /dev/null +++ b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/RegionMetadataSourceImpl.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.MetadataLoader; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.internal.GeoEntityUtility; +import com.google.i18n.phonenumbers.metadata.init.MetadataParser; + +/** + * Implementation of {@link RegionMetadataSource} guarded by {@link MetadataBootstrappingGuard} + * + * <p>By default, a {@link BlockingMetadataBootstrappingGuard} will be used, but any custom + * implementation can be injected. + */ +public final class RegionMetadataSourceImpl implements RegionMetadataSource { + + private final PhoneMetadataFileNameProvider phoneMetadataFileNameProvider; + private final MetadataBootstrappingGuard<MapBackedMetadataContainer<String>> + bootstrappingGuard; + + public RegionMetadataSourceImpl( + PhoneMetadataFileNameProvider phoneMetadataFileNameProvider, + MetadataBootstrappingGuard<MapBackedMetadataContainer<String>> bootstrappingGuard) { + this.phoneMetadataFileNameProvider = phoneMetadataFileNameProvider; + this.bootstrappingGuard = bootstrappingGuard; + } + + public RegionMetadataSourceImpl( + PhoneMetadataFileNameProvider phoneMetadataFileNameProvider, + MetadataLoader metadataLoader, + MetadataParser metadataParser) { + this( + phoneMetadataFileNameProvider, + new BlockingMetadataBootstrappingGuard<>( + metadataLoader, metadataParser, MapBackedMetadataContainer.byRegionCode())); + } + + @Override + public PhoneMetadata getMetadataForRegion(String regionCode) { + if (!GeoEntityUtility.isGeoEntity(regionCode)) { + throw new IllegalArgumentException(regionCode + " region code is a non-geo entity"); + } + return bootstrappingGuard + .getOrBootstrap(phoneMetadataFileNameProvider.getFor(regionCode)) + .getMetadataBy(regionCode); + } +} diff --git a/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/SingleFileModeFileNameProvider.java b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/SingleFileModeFileNameProvider.java new file mode 100644 index 00000000..1d3d1eb8 --- /dev/null +++ b/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/SingleFileModeFileNameProvider.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +/** + * {@link PhoneMetadataFileNameProvider} implementation that returns the same metadata file name for + * each key + */ +public final class SingleFileModeFileNameProvider implements PhoneMetadataFileNameProvider { + + private final String phoneMetadataFileName; + + public SingleFileModeFileNameProvider(String phoneMetadataFileName) { + this.phoneMetadataFileName = phoneMetadataFileName; + } + + @Override + public String getFor(Object key) { + return phoneMetadataFileName; + } +} diff --git a/libphonenumber/test/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java b/libphonenumber/test/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java index 0c2188e8..a68d45fe 100644 --- a/libphonenumber/test/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java +++ b/libphonenumber/test/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java @@ -30,11 +30,11 @@ public class CountryCodeToRegionCodeMapForTesting { // country/region represented by that country code. In the case of multiple // countries sharing a calling code, such as the NANPA countries, the one // indicated with "isMainCountryForCode" in the metadata should be first. - static Map<Integer, List<String>> getCountryCodeToRegionCodeMap() { - // The capacity is set to 37 as there are 28 different entries, + public static Map<Integer, List<String>> getCountryCodeToRegionCodeMap() { + // The capacity is set to 38 as there are 29 different entries, // and this offers a load factor of roughly 0.75. Map<Integer, List<String>> countryCodeToRegionCodeMap = - new HashMap<Integer, List<String>>(37); + new HashMap<Integer, List<String>>(38); ArrayList<String> listWithRegionCode; @@ -86,6 +86,10 @@ public class CountryCodeToRegionCodeMapForTesting { listWithRegionCode.add("BR"); countryCodeToRegionCodeMap.put(55, listWithRegionCode); + listWithRegionCode = new ArrayList<String>(1); + listWithRegionCode.add("CO"); + countryCodeToRegionCodeMap.put(57, listWithRegionCode); + listWithRegionCode = new ArrayList<String>(3); listWithRegionCode.add("AU"); listWithRegionCode.add("CC"); diff --git a/libphonenumber/test/com/google/i18n/phonenumbers/ExampleNumbersTest.java b/libphonenumber/test/com/google/i18n/phonenumbers/ExampleNumbersTest.java index ebea7b7d..e98470bf 100644 --- a/libphonenumber/test/com/google/i18n/phonenumbers/ExampleNumbersTest.java +++ b/libphonenumber/test/com/google/i18n/phonenumbers/ExampleNumbersTest.java @@ -19,15 +19,15 @@ package com.google.i18n.phonenumbers; import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberType; import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc; import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; - -import junit.framework.TestCase; - +import com.google.i18n.phonenumbers.metadata.DefaultMetadataDependenciesProvider; +import com.google.i18n.phonenumbers.metadata.source.RegionMetadataSource; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; +import junit.framework.TestCase; /** * Verifies all of the example numbers in the metadata are valid and of the correct type. If no @@ -37,10 +37,14 @@ import java.util.logging.Logger; */ public class ExampleNumbersTest extends TestCase { private static final Logger logger = Logger.getLogger(ExampleNumbersTest.class.getName()); - private PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance(); - private ShortNumberInfo shortNumberInfo = ShortNumberInfo.getInstance(); - private List<PhoneNumber> invalidCases = new ArrayList<PhoneNumber>(); - private List<PhoneNumber> wrongTypeCases = new ArrayList<PhoneNumber>(); + private final PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance(); + private final ShortNumberInfo shortNumberInfo = ShortNumberInfo.getInstance(); + private final RegionMetadataSource shortNumberMetadataSource = + DefaultMetadataDependenciesProvider.getInstance().getShortNumberMetadataSource(); + + private final List<PhoneNumber> invalidCases = new ArrayList<>(); + private final List<PhoneNumber> wrongTypeCases = new ArrayList<>(); + private final Set<String> shortNumberSupportedRegions = ShortNumbersRegionCodeSet.getRegionCodeSet(); /** * @param exampleNumberRequestedType type we are requesting an example number for @@ -55,14 +59,14 @@ public class ExampleNumbersTest extends TestCase { if (exampleNumber != null) { if (!phoneNumberUtil.isValidNumber(exampleNumber)) { invalidCases.add(exampleNumber); - logger.log(Level.SEVERE, "Failed validation for " + exampleNumber.toString()); + logger.log(Level.SEVERE, "Failed validation for " + exampleNumber); } else { // We know the number is valid, now we check the type. PhoneNumberType exampleNumberType = phoneNumberUtil.getNumberType(exampleNumber); if (!possibleExpectedTypes.contains(exampleNumberType)) { wrongTypeCases.add(exampleNumber); logger.log(Level.SEVERE, "Wrong type for " - + exampleNumber.toString() + + exampleNumber + ": got " + exampleNumberType); logger.log(Level.WARNING, "Expected types: "); for (PhoneNumberType type : possibleExpectedTypes) { @@ -74,7 +78,7 @@ public class ExampleNumbersTest extends TestCase { } } - public void testFixedLine() throws Exception { + public void testFixedLine() { Set<PhoneNumberType> fixedLineTypes = EnumSet.of(PhoneNumberType.FIXED_LINE, PhoneNumberType.FIXED_LINE_OR_MOBILE); checkNumbersValidAndCorrectType(PhoneNumberType.FIXED_LINE, fixedLineTypes); @@ -82,7 +86,7 @@ public class ExampleNumbersTest extends TestCase { assertEquals(0, wrongTypeCases.size()); } - public void testMobile() throws Exception { + public void testMobile() { Set<PhoneNumberType> mobileTypes = EnumSet.of(PhoneNumberType.MOBILE, PhoneNumberType.FIXED_LINE_OR_MOBILE); checkNumbersValidAndCorrectType(PhoneNumberType.MOBILE, mobileTypes); @@ -90,56 +94,56 @@ public class ExampleNumbersTest extends TestCase { assertEquals(0, wrongTypeCases.size()); } - public void testTollFree() throws Exception { + public void testTollFree() { Set<PhoneNumberType> tollFreeTypes = EnumSet.of(PhoneNumberType.TOLL_FREE); checkNumbersValidAndCorrectType(PhoneNumberType.TOLL_FREE, tollFreeTypes); assertEquals(0, invalidCases.size()); assertEquals(0, wrongTypeCases.size()); } - public void testPremiumRate() throws Exception { + public void testPremiumRate() { Set<PhoneNumberType> premiumRateTypes = EnumSet.of(PhoneNumberType.PREMIUM_RATE); checkNumbersValidAndCorrectType(PhoneNumberType.PREMIUM_RATE, premiumRateTypes); assertEquals(0, invalidCases.size()); assertEquals(0, wrongTypeCases.size()); } - public void testVoip() throws Exception { + public void testVoip() { Set<PhoneNumberType> voipTypes = EnumSet.of(PhoneNumberType.VOIP); checkNumbersValidAndCorrectType(PhoneNumberType.VOIP, voipTypes); assertEquals(0, invalidCases.size()); assertEquals(0, wrongTypeCases.size()); } - public void testPager() throws Exception { + public void testPager() { Set<PhoneNumberType> pagerTypes = EnumSet.of(PhoneNumberType.PAGER); checkNumbersValidAndCorrectType(PhoneNumberType.PAGER, pagerTypes); assertEquals(0, invalidCases.size()); assertEquals(0, wrongTypeCases.size()); } - public void testUan() throws Exception { + public void testUan() { Set<PhoneNumberType> uanTypes = EnumSet.of(PhoneNumberType.UAN); checkNumbersValidAndCorrectType(PhoneNumberType.UAN, uanTypes); assertEquals(0, invalidCases.size()); assertEquals(0, wrongTypeCases.size()); } - public void testVoicemail() throws Exception { + public void testVoicemail() { Set<PhoneNumberType> voicemailTypes = EnumSet.of(PhoneNumberType.VOICEMAIL); checkNumbersValidAndCorrectType(PhoneNumberType.VOICEMAIL, voicemailTypes); assertEquals(0, invalidCases.size()); assertEquals(0, wrongTypeCases.size()); } - public void testSharedCost() throws Exception { + public void testSharedCost() { Set<PhoneNumberType> sharedCostTypes = EnumSet.of(PhoneNumberType.SHARED_COST); checkNumbersValidAndCorrectType(PhoneNumberType.SHARED_COST, sharedCostTypes); assertEquals(0, invalidCases.size()); assertEquals(0, wrongTypeCases.size()); } - public void testCanBeInternationallyDialled() throws Exception { + public void testCanBeInternationallyDialled() { for (String regionCode : phoneNumberUtil.getSupportedRegions()) { PhoneNumber exampleNumber = null; PhoneNumberDesc desc = @@ -153,41 +157,41 @@ public class ExampleNumbersTest extends TestCase { } if (exampleNumber != null && phoneNumberUtil.canBeInternationallyDialled(exampleNumber)) { wrongTypeCases.add(exampleNumber); - logger.log(Level.SEVERE, "Number " + exampleNumber.toString() + logger.log(Level.SEVERE, "Number " + exampleNumber + " should not be internationally diallable"); } } assertEquals(0, wrongTypeCases.size()); } - public void testGlobalNetworkNumbers() throws Exception { + public void testGlobalNetworkNumbers() { for (Integer callingCode : phoneNumberUtil.getSupportedGlobalNetworkCallingCodes()) { PhoneNumber exampleNumber = phoneNumberUtil.getExampleNumberForNonGeoEntity(callingCode); assertNotNull("No example phone number for calling code " + callingCode, exampleNumber); if (!phoneNumberUtil.isValidNumber(exampleNumber)) { invalidCases.add(exampleNumber); - logger.log(Level.SEVERE, "Failed validation for " + exampleNumber.toString()); + logger.log(Level.SEVERE, "Failed validation for " + exampleNumber); } } assertEquals(0, invalidCases.size()); } - public void testEveryRegionHasAnExampleNumber() throws Exception { + public void testEveryRegionHasAnExampleNumber() { for (String regionCode : phoneNumberUtil.getSupportedRegions()) { PhoneNumber exampleNumber = phoneNumberUtil.getExampleNumber(regionCode); assertNotNull("No example number found for region " + regionCode, exampleNumber); } } - public void testEveryRegionHasAnInvalidExampleNumber() throws Exception { + public void testEveryRegionHasAnInvalidExampleNumber() { for (String regionCode : phoneNumberUtil.getSupportedRegions()) { PhoneNumber exampleNumber = phoneNumberUtil.getInvalidExampleNumber(regionCode); assertNotNull("No invalid example number found for region " + regionCode, exampleNumber); } } - public void testEveryTypeHasAnExampleNumber() throws Exception { + public void testEveryTypeHasAnExampleNumber() { for (PhoneNumberUtil.PhoneNumberType type : PhoneNumberUtil.PhoneNumberType.values()) { if (type == PhoneNumberType.UNKNOWN) { continue; @@ -198,8 +202,8 @@ public class ExampleNumbersTest extends TestCase { } public void testShortNumbersValidAndCorrectCost() throws Exception { - List<String> invalidStringCases = new ArrayList<String>(); - for (String regionCode : shortNumberInfo.getSupportedRegions()) { + List<String> invalidStringCases = new ArrayList<>(); + for (String regionCode : shortNumberSupportedRegions) { String exampleShortNumber = shortNumberInfo.getExampleShortNumber(regionCode); if (!shortNumberInfo.isValidShortNumberForRegion( phoneNumberUtil.parse(exampleShortNumber, regionCode), regionCode)) { @@ -211,7 +215,7 @@ public class ExampleNumbersTest extends TestCase { PhoneNumber phoneNumber = phoneNumberUtil.parse(exampleShortNumber, regionCode); if (!shortNumberInfo.isValidShortNumber(phoneNumber)) { invalidCases.add(phoneNumber); - logger.log(Level.SEVERE, "Failed validation for " + phoneNumber.toString()); + logger.log(Level.SEVERE, "Failed validation for " + phoneNumber); } for (ShortNumberInfo.ShortNumberCost cost : ShortNumberInfo.ShortNumberCost.values()) { @@ -236,9 +240,8 @@ public class ExampleNumbersTest extends TestCase { public void testEmergency() throws Exception { int wrongTypeCounter = 0; - for (String regionCode : shortNumberInfo.getSupportedRegions()) { - PhoneNumberDesc desc = - MetadataManager.getShortNumberMetadataForRegion(regionCode).getEmergency(); + for (String regionCode : shortNumberSupportedRegions) { + PhoneNumberDesc desc = shortNumberMetadataSource.getMetadataForRegion(regionCode).getEmergency(); if (desc.hasExampleNumber()) { String exampleNumber = desc.getExampleNumber(); PhoneNumber phoneNumber = phoneNumberUtil.parse(exampleNumber, regionCode); @@ -258,9 +261,8 @@ public class ExampleNumbersTest extends TestCase { public void testCarrierSpecificShortNumbers() throws Exception { int wrongTagCounter = 0; - for (String regionCode : shortNumberInfo.getSupportedRegions()) { - PhoneNumberDesc desc = - MetadataManager.getShortNumberMetadataForRegion(regionCode).getCarrierSpecific(); + for (String regionCode : shortNumberSupportedRegions) { + PhoneNumberDesc desc = shortNumberMetadataSource.getMetadataForRegion(regionCode).getCarrierSpecific(); if (desc.hasExampleNumber()) { String exampleNumber = desc.getExampleNumber(); PhoneNumber carrierSpecificNumber = phoneNumberUtil.parse(exampleNumber, regionCode); @@ -276,9 +278,8 @@ public class ExampleNumbersTest extends TestCase { public void testSmsServiceShortNumbers() throws Exception { int wrongTagCounter = 0; - for (String regionCode : shortNumberInfo.getSupportedRegions()) { - PhoneNumberDesc desc = - MetadataManager.getShortNumberMetadataForRegion(regionCode).getSmsServices(); + for (String regionCode : shortNumberSupportedRegions) { + PhoneNumberDesc desc = shortNumberMetadataSource.getMetadataForRegion(regionCode).getSmsServices(); if (desc.hasExampleNumber()) { String exampleNumber = desc.getExampleNumber(); PhoneNumber smsServiceNumber = phoneNumberUtil.parse(exampleNumber, regionCode); diff --git a/libphonenumber/test/com/google/i18n/phonenumbers/MetadataManagerTest.java b/libphonenumber/test/com/google/i18n/phonenumbers/MetadataManagerTest.java deleted file mode 100644 index 91b2f395..00000000 --- a/libphonenumber/test/com/google/i18n/phonenumbers/MetadataManagerTest.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (C) 2012 The Libphonenumber Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.i18n.phonenumbers; - -import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; -import java.util.concurrent.ConcurrentHashMap; -import junit.framework.TestCase; - -/** - * Some basic tests to check that metadata can be correctly loaded. - */ -public class MetadataManagerTest extends TestCase { - public void testAlternateFormatsLoadCorrectly() { - // We should have some data for Germany. - PhoneMetadata germanyMetadata = MetadataManager.getAlternateFormatsForCountry(49); - assertNotNull(germanyMetadata); - assertTrue(germanyMetadata.getNumberFormatCount() > 0); - } - - public void testAlternateFormatsFailsGracefully() throws Exception { - PhoneMetadata noAlternateFormats = MetadataManager.getAlternateFormatsForCountry(999); - assertNull(noAlternateFormats); - } - - public void testShortNumberMetadataLoadCorrectly() throws Exception { - // We should have some data for France. - PhoneMetadata franceMetadata = MetadataManager.getShortNumberMetadataForRegion("FR"); - assertNotNull(franceMetadata); - assertTrue(franceMetadata.hasShortCode()); - } - - public void testShortNumberMetadataFailsGracefully() throws Exception { - PhoneMetadata noShortNumberMetadata = MetadataManager.getShortNumberMetadataForRegion("XXX"); - assertNull(noShortNumberMetadata); - } - - public void testGetMetadataFromMultiFilePrefix_regionCode() { - ConcurrentHashMap<String, PhoneMetadata> map = new ConcurrentHashMap<String, PhoneMetadata>(); - PhoneMetadata metadata = MetadataManager.getMetadataFromMultiFilePrefix("CA", map, - "/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting", - MetadataManager.DEFAULT_METADATA_LOADER); - assertEquals(metadata, map.get("CA")); - } - - public void testGetMetadataFromMultiFilePrefix_countryCallingCode() { - ConcurrentHashMap<Integer, PhoneMetadata> map = new ConcurrentHashMap<Integer, PhoneMetadata>(); - PhoneMetadata metadata = MetadataManager.getMetadataFromMultiFilePrefix(800, map, - "/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting", - MetadataManager.DEFAULT_METADATA_LOADER); - assertEquals(metadata, map.get(800)); - } - - public void testGetMetadataFromMultiFilePrefix_missingMetadataFileThrowsRuntimeException() { - // In normal usage we should never get a state where we are asking to load metadata that doesn't - // exist. However if the library is packaged incorrectly in the jar, this could happen and the - // best we can do is make sure the exception has the file name in it. - try { - MetadataManager.getMetadataFromMultiFilePrefix("XX", - new ConcurrentHashMap<String, PhoneMetadata>(), "no/such/file", - MetadataManager.DEFAULT_METADATA_LOADER); - fail("expected exception"); - } catch (RuntimeException e) { - assertTrue("Unexpected error: " + e, e.getMessage().contains("no/such/file_XX")); - } - try { - MetadataManager.getMetadataFromMultiFilePrefix(123, - new ConcurrentHashMap<Integer, PhoneMetadata>(), "no/such/file", - MetadataManager.DEFAULT_METADATA_LOADER); - fail("expected exception"); - } catch (RuntimeException e) { - assertTrue("Unexpected error: " + e, e.getMessage().contains("no/such/file_123")); - } - } -} diff --git a/libphonenumber/test/com/google/i18n/phonenumbers/MultiFileMetadataSourceImplTest.java b/libphonenumber/test/com/google/i18n/phonenumbers/MultiFileMetadataSourceImplTest.java deleted file mode 100644 index 7c9b0faf..00000000 --- a/libphonenumber/test/com/google/i18n/phonenumbers/MultiFileMetadataSourceImplTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2015 The Libphonenumber Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.i18n.phonenumbers; - -import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; -import junit.framework.TestCase; - -/** - * Unit tests for MultiFileMetadataSourceImpl.java. - */ -public class MultiFileMetadataSourceImplTest extends TestCase { - private static final MultiFileMetadataSourceImpl SOURCE = - new MultiFileMetadataSourceImpl(MetadataManager.DEFAULT_METADATA_LOADER); - private static final MultiFileMetadataSourceImpl MISSING_FILE_SOURCE = - new MultiFileMetadataSourceImpl("no/such/file", MetadataManager.DEFAULT_METADATA_LOADER); - - public void testGeoPhoneNumberMetadataLoadCorrectly() { - // We should have some data for the UAE. - PhoneMetadata uaeMetadata = SOURCE.getMetadataForRegion("AE"); - assertEquals(uaeMetadata.getCountryCode(), 971); - assertTrue(uaeMetadata.hasGeneralDesc()); - } - - public void testGeoPhoneNumberMetadataLoadFromMissingFileThrowsException() throws Exception { - try { - MISSING_FILE_SOURCE.getMetadataForRegion("AE"); - fail("expected exception"); - } catch (RuntimeException e) { - assertTrue("Unexpected error: " + e, e.getMessage().contains("no/such/file")); - } - } - - public void testNonGeoPhoneNumberMetadataLoadCorrectly() { - // We should have some data for international toll-free numbers. - PhoneMetadata intlMetadata = SOURCE.getMetadataForNonGeographicalRegion(800); - assertEquals(intlMetadata.getId(), "001"); - assertTrue(intlMetadata.hasGeneralDesc()); - } - - public void testNonGeoPhoneNumberMetadataLoadFromMissingFileThrowsException() throws Exception { - try { - MISSING_FILE_SOURCE.getMetadataForNonGeographicalRegion(800); - fail("expected exception"); - } catch (RuntimeException e) { - assertTrue("Unexpected error: " + e, e.getMessage().contains("no/such/file")); - } - } -} diff --git a/libphonenumber/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java b/libphonenumber/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java index 641bd77d..6a466e43 100644 --- a/libphonenumber/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java +++ b/libphonenumber/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java @@ -16,6 +16,8 @@ package com.google.i18n.phonenumbers; +import static org.junit.Assert.assertThrows; + import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat; import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberType; import com.google.i18n.phonenumbers.PhoneNumberUtil.ValidationResult; @@ -25,9 +27,13 @@ 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.i18n.phonenumbers.metadata.source.MetadataSource; import java.util.ArrayList; import java.util.List; import java.util.Set; +import org.junit.Assert; +import org.junit.function.ThrowingRunnable; +import org.mockito.Mockito; /** * Unit tests for PhoneNumberUtil.java @@ -55,6 +61,8 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { new PhoneNumber().setCountryCode(1).setNationalNumber(2423570000L); private static final PhoneNumber BS_NUMBER = new PhoneNumber().setCountryCode(1).setNationalNumber(2423651234L); + private static final PhoneNumber CO_FIXED_LINE = + new PhoneNumber().setCountryCode(57).setNationalNumber(6012345678L); // Note that this is the same as the example number for DE in the metadata. private static final PhoneNumber DE_NUMBER = new PhoneNumber().setCountryCode(49).setNationalNumber(30123456L); @@ -119,6 +127,11 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { private static final PhoneNumber UNKNOWN_COUNTRY_CODE_NO_RAW_INPUT = new PhoneNumber().setCountryCode(2).setNationalNumber(12345L); + private final MetadataSource mockedMetadataSource = Mockito.mock(MetadataSource.class); + private final PhoneNumberUtil phoneNumberUtilWithMissingMetadata = + new PhoneNumberUtil(mockedMetadataSource, + CountryCodeToRegionCodeMapForTesting.getCountryCodeToRegionCodeMap()); + public void testGetSupportedRegions() { assertTrue(phoneUtil.getSupportedRegions().size() > 0); } @@ -799,6 +812,8 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { public void testFormatNumberForMobileDialing() { // Numbers are normally dialed in national format in-country, and international format from // outside the country. + assertEquals("6012345678", + phoneUtil.formatNumberForMobileDialing(CO_FIXED_LINE, RegionCode.CO, false)); assertEquals("030123456", phoneUtil.formatNumberForMobileDialing(DE_NUMBER, RegionCode.DE, false)); assertEquals("+4930123456", @@ -3160,4 +3175,38 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { assertFalse(phoneUtil.isMobileNumberPortableRegion(RegionCode.AE)); assertFalse(phoneUtil.isMobileNumberPortableRegion(RegionCode.BS)); } + + public void testGetMetadataForRegionForNonGeoEntity_shouldBeNull() { + assertNull(phoneUtil.getMetadataForRegion(RegionCode.UN001)); + } + + public void testGetMetadataForRegionForUnknownRegion_shouldBeNull() { + assertNull(phoneUtil.getMetadataForRegion(RegionCode.ZZ)); + } + + public void testGetMetadataForNonGeographicalRegionForGeoRegion_shouldBeNull() { + assertNull(phoneUtil.getMetadataForNonGeographicalRegion(/* countryCallingCode = */ 1)); + } + + public void testGetMetadataForRegionForMissingMetadata() { + assertThrows( + MissingMetadataException.class, + new ThrowingRunnable() { + @Override + public void run() { + phoneNumberUtilWithMissingMetadata.getMetadataForRegion(RegionCode.US); + } + }); + } + + public void testGetMetadataForNonGeographicalRegionForMissingMetadata() { + assertThrows( + MissingMetadataException.class, + new ThrowingRunnable() { + @Override + public void run() { + phoneNumberUtilWithMissingMetadata.getMetadataForNonGeographicalRegion(800); + } + }); + } } diff --git a/libphonenumber/test/com/google/i18n/phonenumbers/RegionCode.java b/libphonenumber/test/com/google/i18n/phonenumbers/RegionCode.java index 32169f6a..20fc1212 100644 --- a/libphonenumber/test/com/google/i18n/phonenumbers/RegionCode.java +++ b/libphonenumber/test/com/google/i18n/phonenumbers/RegionCode.java @@ -37,6 +37,7 @@ final class RegionCode { static final String CH = "CH"; static final String CL = "CL"; static final String CN = "CN"; + static final String CO = "CO"; static final String CS = "CS"; static final String CX = "CX"; static final String DE = "DE"; diff --git a/libphonenumber/test/com/google/i18n/phonenumbers/SingleFileMetadataSourceImplTest.java b/libphonenumber/test/com/google/i18n/phonenumbers/SingleFileMetadataSourceImplTest.java deleted file mode 100644 index 664fc52d..00000000 --- a/libphonenumber/test/com/google/i18n/phonenumbers/SingleFileMetadataSourceImplTest.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2015 The Libphonenumber Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.i18n.phonenumbers; - -import junit.framework.TestCase; - -/** - * Unit tests for SingleFileMetadataSourceImpl.java. - * - * <p> - * We do not package single file metadata files, so it is only possible to test failures here. - */ -public class SingleFileMetadataSourceImplTest extends TestCase { - private static final SingleFileMetadataSourceImpl MISSING_FILE_SOURCE = - new SingleFileMetadataSourceImpl("no/such/file", MetadataManager.DEFAULT_METADATA_LOADER); - - public void testGeoPhoneNumberMetadataLoadFromMissingFileThrowsException() throws Exception { - try { - MISSING_FILE_SOURCE.getMetadataForRegion("AE"); - fail("expected exception"); - } catch (RuntimeException e) { - assertTrue("Unexpected error: " + e, e.getMessage().contains("no/such/file")); - } - } - - public void testNonGeoPhoneNumberMetadataLoadFromMissingFileThrowsException() throws Exception { - try { - MISSING_FILE_SOURCE.getMetadataForNonGeographicalRegion(800); - fail("expected exception"); - } catch (RuntimeException e) { - assertTrue("Unexpected error: " + e, e.getMessage().contains("no/such/file")); - } - } -} diff --git a/libphonenumber/test/com/google/i18n/phonenumbers/TestMetadataTestCase.java b/libphonenumber/test/com/google/i18n/phonenumbers/TestMetadataTestCase.java index 51360d71..5dfb56e9 100644 --- a/libphonenumber/test/com/google/i18n/phonenumbers/TestMetadataTestCase.java +++ b/libphonenumber/test/com/google/i18n/phonenumbers/TestMetadataTestCase.java @@ -16,6 +16,9 @@ package com.google.i18n.phonenumbers; +import com.google.i18n.phonenumbers.metadata.DefaultMetadataDependenciesProvider; +import com.google.i18n.phonenumbers.metadata.source.MetadataSourceImpl; +import com.google.i18n.phonenumbers.metadata.source.MultiFileModeFileNameProvider; import junit.framework.TestCase; /** @@ -33,15 +36,20 @@ import junit.framework.TestCase; * @author Shaopeng Jia */ public class TestMetadataTestCase extends TestCase { + private static final String TEST_METADATA_FILE_PREFIX = "/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting"; - /** An instance of PhoneNumberUtil that uses test metadata. */ + /** + * An instance of PhoneNumberUtil that uses test metadata. + */ protected final PhoneNumberUtil phoneUtil; public TestMetadataTestCase() { - phoneUtil = new PhoneNumberUtil(new MultiFileMetadataSourceImpl(TEST_METADATA_FILE_PREFIX, - MetadataManager.DEFAULT_METADATA_LOADER), + phoneUtil = new PhoneNumberUtil( + new MetadataSourceImpl(new MultiFileModeFileNameProvider(TEST_METADATA_FILE_PREFIX), + DefaultMetadataDependenciesProvider.getInstance().getMetadataLoader(), + DefaultMetadataDependenciesProvider.getInstance().getMetadataParser()), CountryCodeToRegionCodeMapForTesting.getCountryCodeToRegionCodeMap()); } diff --git a/libphonenumber/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_CO b/libphonenumber/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_CO Binary files differnew file mode 100644 index 00000000..daea5fb9 --- /dev/null +++ b/libphonenumber/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_CO diff --git a/libphonenumber/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_HU b/libphonenumber/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_HU Binary files differdeleted file mode 100644 index 8e7a77b1..00000000 --- a/libphonenumber/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_HU +++ /dev/null diff --git a/libphonenumber/test/com/google/i18n/phonenumbers/internal/GeoEntityUtilityTest.java b/libphonenumber/test/com/google/i18n/phonenumbers/internal/GeoEntityUtilityTest.java new file mode 100644 index 00000000..300c5f53 --- /dev/null +++ b/libphonenumber/test/com/google/i18n/phonenumbers/internal/GeoEntityUtilityTest.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.internal; + +import junit.framework.TestCase; + +public class GeoEntityUtilityTest extends TestCase { + + public void test_isGeoEntity_shouldReturnTrueForCountryRegionCode() { + assertTrue(GeoEntityUtility.isGeoEntity("DE")); + } + + public void test_isGeoEntity_shouldReturnFalseForWorldRegionCode() { + assertFalse(GeoEntityUtility.isGeoEntity("001")); + } + + public void test_isGeoEntity_shouldReturnTrueForCountryCallingCode() { + assertTrue(GeoEntityUtility.isGeoEntity(41)); + } + + public void test_isGeoEntity_shouldReturnFalseForInternationalSharedCostServiceCallingCode() { + assertFalse(GeoEntityUtility.isGeoEntity(808)); + } + + public void test_isGeoEntity_shouldReturnFalseForNonExistingCountryCallingCode() { + assertFalse(GeoEntityUtility.isGeoEntity(111111111)); + } +} diff --git a/libphonenumber/test/com/google/i18n/phonenumbers/metadata/PhoneMetadataCollectionUtil.java b/libphonenumber/test/com/google/i18n/phonenumbers/metadata/PhoneMetadataCollectionUtil.java new file mode 100644 index 00000000..57fab191 --- /dev/null +++ b/libphonenumber/test/com/google/i18n/phonenumbers/metadata/PhoneMetadataCollectionUtil.java @@ -0,0 +1,21 @@ +package com.google.i18n.phonenumbers.metadata; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadataCollection; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectOutputStream; + +public class PhoneMetadataCollectionUtil { + + public static InputStream toInputStream(PhoneMetadataCollection metadata) throws IOException { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream); + metadata.writeExternal(objectOutputStream); + objectOutputStream.flush(); + InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray()); + objectOutputStream.close(); + return inputStream; + } +} diff --git a/libphonenumber/test/com/google/i18n/phonenumbers/metadata/init/MetadataParserTest.java b/libphonenumber/test/com/google/i18n/phonenumbers/metadata/init/MetadataParserTest.java new file mode 100644 index 00000000..22c52e29 --- /dev/null +++ b/libphonenumber/test/com/google/i18n/phonenumbers/metadata/init/MetadataParserTest.java @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.init; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.junit.Assert.assertThrows; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadataCollection; +import com.google.i18n.phonenumbers.metadata.PhoneMetadataCollectionUtil; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Collection; +import junit.framework.TestCase; +import org.junit.function.ThrowingRunnable; + +public final class MetadataParserTest extends TestCase { + + private static final MetadataParser metadataParser = MetadataParser.newStrictParser(); + + public void test_parse_shouldThrowExceptionForNullInput() { + assertThrows( + IllegalArgumentException.class, + new ThrowingRunnable() { + @Override + public void run() { + metadataParser.parse(null); + } + }); + } + + public void test_parse_shouldThrowExceptionForEmptyInput() { + final InputStream emptyInput = new ByteArrayInputStream(new byte[0]); + + assertThrows( + IllegalStateException.class, + new ThrowingRunnable() { + @Override + public void run() { + metadataParser.parse(emptyInput); + } + }); + } + + public void test_parse_shouldThrowExceptionForInvalidInput() { + final InputStream invalidInput = new ByteArrayInputStream("Some random input".getBytes(UTF_8)); + + assertThrows( + IllegalStateException.class, + new ThrowingRunnable() { + @Override + public void run() { + metadataParser.parse(invalidInput); + } + }); + } + + public void test_parse_shouldParseValidInput() throws IOException { + InputStream input = PhoneMetadataCollectionUtil.toInputStream( + PhoneMetadataCollection.newBuilder() + .addMetadata(PhoneMetadata.newBuilder().setId("id").build())); + + Collection<PhoneMetadata> actual = metadataParser.parse(input); + + assertEquals(1, actual.size()); + } + + public void test_parse_shouldReturnEmptyCollectionForNullInput() { + Collection<PhoneMetadata> actual = MetadataParser.newLenientParser().parse(null); + + assertTrue(actual.isEmpty()); + } +}
\ No newline at end of file diff --git a/libphonenumber/test/com/google/i18n/phonenumbers/metadata/source/BlockingMetadataBootstrappingGuardTest.java b/libphonenumber/test/com/google/i18n/phonenumbers/metadata/source/BlockingMetadataBootstrappingGuardTest.java new file mode 100644 index 00000000..c2917708 --- /dev/null +++ b/libphonenumber/test/com/google/i18n/phonenumbers/metadata/source/BlockingMetadataBootstrappingGuardTest.java @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import static org.junit.Assert.assertThrows; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.google.i18n.phonenumbers.MetadataLoader; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadataCollection; +import com.google.i18n.phonenumbers.metadata.PhoneMetadataCollectionUtil; +import com.google.i18n.phonenumbers.metadata.init.MetadataParser; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import junit.framework.TestCase; +import org.junit.Assert; +import org.junit.function.ThrowingRunnable; +import org.mockito.Mockito; + +public class BlockingMetadataBootstrappingGuardTest extends TestCase { + + private static final String PHONE_METADATA_FILE = "some metadata file"; + private static final PhoneMetadataCollection PHONE_METADATA = + PhoneMetadataCollection.newBuilder() + .addMetadata(PhoneMetadata.newBuilder().setId("id").build()); + + private final MetadataLoader metadataLoader = Mockito.mock(MetadataLoader.class); + private final MetadataContainer metadataContainer = Mockito.mock(MetadataContainer.class); + + private BlockingMetadataBootstrappingGuard<MetadataContainer> bootstrappingGuard; + + @Override + public void setUp() throws IOException { + when(metadataLoader.loadMetadata(PHONE_METADATA_FILE)) + .thenReturn(PhoneMetadataCollectionUtil.toInputStream(PHONE_METADATA)); + bootstrappingGuard = + new BlockingMetadataBootstrappingGuard<>( + metadataLoader, MetadataParser.newStrictParser(), metadataContainer); + } + + public void test_getOrBootstrap_shouldInvokeBootstrappingOnlyOnce() { + bootstrappingGuard.getOrBootstrap(PHONE_METADATA_FILE); + bootstrappingGuard.getOrBootstrap(PHONE_METADATA_FILE); + + verify(metadataLoader, times(1)).loadMetadata(PHONE_METADATA_FILE); + } + + public void test_getOrBootstrap_shouldIncludeFileNameInExceptionOnFailure() { + when(metadataLoader.loadMetadata(PHONE_METADATA_FILE)).thenReturn(null); + + ThrowingRunnable throwingRunnable = + new ThrowingRunnable() { + @Override + public void run() { + bootstrappingGuard.getOrBootstrap(PHONE_METADATA_FILE); + } + }; + + IllegalStateException exception = assertThrows(IllegalStateException.class, throwingRunnable); + Assert.assertTrue(exception.getMessage().contains(PHONE_METADATA_FILE)); + } + + public void test_getOrBootstrap_shouldInvokeBootstrappingOnlyOnceWhenThreadsCallItAtTheSameTime() + throws InterruptedException { + ExecutorService executorService = Executors.newFixedThreadPool(2); + + List<BootstrappingRunnable> runnables = new ArrayList<>(); + runnables.add(new BootstrappingRunnable()); + runnables.add(new BootstrappingRunnable()); + executorService.invokeAll(runnables); + + verify(metadataLoader, times(1)).loadMetadata(PHONE_METADATA_FILE); + } + + private class BootstrappingRunnable implements Callable<MetadataContainer> { + + @Override + public MetadataContainer call() { + return bootstrappingGuard.getOrBootstrap(PHONE_METADATA_FILE); + } + } +} diff --git a/libphonenumber/test/com/google/i18n/phonenumbers/metadata/source/CompositeMetadataContainerTest.java b/libphonenumber/test/com/google/i18n/phonenumbers/metadata/source/CompositeMetadataContainerTest.java new file mode 100644 index 00000000..75b66c49 --- /dev/null +++ b/libphonenumber/test/com/google/i18n/phonenumbers/metadata/source/CompositeMetadataContainerTest.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.internal.GeoEntityUtility; +import junit.framework.TestCase; + +public class CompositeMetadataContainerTest extends TestCase { + + private static final String REGION_CODE = "US"; + private static final Integer COUNTRY_CODE = 1; + private static final PhoneMetadata PHONE_METADATA_WITH_REGION_CODE = + PhoneMetadata.newBuilder().setId(REGION_CODE).setCountryCode(COUNTRY_CODE); + private static final PhoneMetadata PHONE_METADATA_WITH_COUNTRY_CODE = + PhoneMetadata.newBuilder() + .setId(GeoEntityUtility.REGION_CODE_FOR_NON_GEO_ENTITIES) + .setCountryCode(COUNTRY_CODE); + + private CompositeMetadataContainer metadataContainer; + + @Override + public void setUp() { + metadataContainer = new CompositeMetadataContainer(); + } + + public void test_getMetadataBy_shouldReturnNullForNonExistingRegionCode() { + assertNull(metadataContainer.getMetadataBy(REGION_CODE)); + } + + public void test_getMetadataBy_shouldReturnMetadataForExistingRegionCode() { + metadataContainer.accept(PHONE_METADATA_WITH_REGION_CODE); + + assertSame(PHONE_METADATA_WITH_REGION_CODE, metadataContainer.getMetadataBy(REGION_CODE)); + } + + public void test_getMetadataBy_shouldReturnNullForNonExistingCountryCode() { + assertNull(metadataContainer.getMetadataBy(COUNTRY_CODE)); + } + + public void test_getMetadataBy_shouldReturnMetadataForExistingCountryCode() { + metadataContainer.accept(PHONE_METADATA_WITH_COUNTRY_CODE); + + assertSame(PHONE_METADATA_WITH_COUNTRY_CODE, metadataContainer.getMetadataBy(COUNTRY_CODE)); + } + + public void test_getMetadataBy_shouldReturnNullForExistingCountryCodeOfGeoRegion() { + metadataContainer.accept(PHONE_METADATA_WITH_REGION_CODE); + + assertNull(metadataContainer.getMetadataBy(COUNTRY_CODE)); + } +} diff --git a/libphonenumber/test/com/google/i18n/phonenumbers/metadata/source/MapBackedMetadataContainerTest.java b/libphonenumber/test/com/google/i18n/phonenumbers/metadata/source/MapBackedMetadataContainerTest.java new file mode 100644 index 00000000..21fbea64 --- /dev/null +++ b/libphonenumber/test/com/google/i18n/phonenumbers/metadata/source/MapBackedMetadataContainerTest.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import junit.framework.TestCase; + +public class MapBackedMetadataContainerTest extends TestCase { + + private static final String REGION_CODE = "US"; + private static final Integer COUNTRY_CODE = 41; + private static final PhoneMetadata PHONE_METADATA = + PhoneMetadata.newBuilder().setId(REGION_CODE).setCountryCode(COUNTRY_CODE); + + public void test_getMetadataBy_shouldReturnNullForNullRegionCode() { + assertNull(MapBackedMetadataContainer.byRegionCode().getMetadataBy(null)); + } + + public void test_getMetadataBy_shouldReturnNullForNonExistingRegionCode() { + assertNull(MapBackedMetadataContainer.byRegionCode().getMetadataBy(REGION_CODE)); + } + + public void test_getMetadataBy_shouldReturnMetadataForExistingRegionCode() { + MapBackedMetadataContainer<String> metadataContainer = + MapBackedMetadataContainer.byRegionCode(); + + metadataContainer.accept(PHONE_METADATA); + + assertSame(PHONE_METADATA, metadataContainer.getMetadataBy(REGION_CODE)); + } + + public void test_getMetadataBy_shouldReturnNullForNullCountryCode() { + assertNull(MapBackedMetadataContainer.byCountryCallingCode().getMetadataBy(null)); + } + + public void test_getMetadataBy_shouldReturnNullForNonExistingCountryCode() { + assertNull(MapBackedMetadataContainer.byCountryCallingCode().getMetadataBy(COUNTRY_CODE)); + } + + public void test_getMetadataBy_shouldReturnMetadataForExistingCountryCode() { + MapBackedMetadataContainer<Integer> metadataContainer = + MapBackedMetadataContainer.byCountryCallingCode(); + + metadataContainer.accept(PHONE_METADATA); + + assertSame(PHONE_METADATA, metadataContainer.getMetadataBy(COUNTRY_CODE)); + } +} diff --git a/libphonenumber/test/com/google/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProviderTest.java b/libphonenumber/test/com/google/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProviderTest.java new file mode 100644 index 00000000..c7ad7ddc --- /dev/null +++ b/libphonenumber/test/com/google/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProviderTest.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import static org.junit.Assert.assertThrows; + +import junit.framework.TestCase; +import org.junit.function.ThrowingRunnable; + +public final class MultiFileModeFileNameProviderTest extends TestCase { + + private final PhoneMetadataFileNameProvider metadataFileNameProvider = + new MultiFileModeFileNameProvider("some/file"); + + public void test_getFor_shouldAppendKeyToTheBase() { + String metadataFileName = metadataFileNameProvider.getFor("key1"); + + assertEquals("some/file_key1", metadataFileName); + } + + public void test_getFor_shouldThrowExceptionForNonAlphanumericKey() { + assertThrows( + IllegalArgumentException.class, + new ThrowingRunnable() { + @Override + public void run() { + metadataFileNameProvider.getFor("\tkey1\n"); + } + }); + } +} diff --git a/libphonenumber/test/com/google/i18n/phonenumbers/metadata/source/SingleFileModeFileNameProviderTest.java b/libphonenumber/test/com/google/i18n/phonenumbers/metadata/source/SingleFileModeFileNameProviderTest.java new file mode 100644 index 00000000..21d3bf75 --- /dev/null +++ b/libphonenumber/test/com/google/i18n/phonenumbers/metadata/source/SingleFileModeFileNameProviderTest.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import junit.framework.TestCase; + +public final class SingleFileModeFileNameProviderTest extends TestCase { + + private final PhoneMetadataFileNameProvider metadataFileNameProvider = + new SingleFileModeFileNameProvider("some/file"); + + public void test_getFor_shouldReturnTheFileNameBase() { + String metadataFileName = metadataFileNameProvider.getFor("key1"); + + assertEquals("some/file", metadataFileName); + } +} @@ -3,7 +3,7 @@ <modelVersion>4.0.0</modelVersion> <groupId>com.googlecode.libphonenumber</groupId> <artifactId>libphonenumber-parent</artifactId> - <version>8.12.46</version> + <version>8.12.54</version> <packaging>pom</packaging> <url>https://github.com/google/libphonenumber/</url> @@ -34,7 +34,7 @@ <connection>scm:git:https://github.com/google/libphonenumber.git</connection> <developerConnection>scm:git:git@github.com:googlei18n/libphonenumber.git</developerConnection> <url>https://github.com/google/libphonenumber/</url> - <tag>v8.12.46</tag> + <tag>v8.12.54</tag> </scm> <properties> @@ -235,6 +235,12 @@ <version>4.13.1</version> <scope>test</scope> </dependency> + <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-all</artifactId> + <version>1.10.19</version> + <scope>test</scope> + </dependency> </dependencies> </project> diff --git a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java index 34829607..e40d68ab 100644 --- a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java +++ b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java @@ -21,6 +21,7 @@ import com.android.i18n.phonenumbers.NumberParseException; import com.android.i18n.phonenumbers.PhoneNumberUtil; import com.android.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberType; import com.android.i18n.phonenumbers.Phonenumber.PhoneNumber; +import com.android.i18n.phonenumbers.metadata.DefaultMetadataDependenciesProvider; import com.android.i18n.phonenumbers.prefixmapper.PrefixFileReader; import java.util.List; @@ -34,9 +35,7 @@ import java.util.Locale; */ public class PhoneNumberOfflineGeocoder { private static PhoneNumberOfflineGeocoder instance = null; - private static final String MAPPING_DATA_DIRECTORY = - "/com/android/i18n/phonenumbers/geocoding/data/"; - private PrefixFileReader prefixFileReader = null; + private final PrefixFileReader prefixFileReader; private final PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); @@ -57,7 +56,8 @@ public class PhoneNumberOfflineGeocoder { @android.compat.annotation.UnsupportedAppUsage public static synchronized PhoneNumberOfflineGeocoder getInstance() { if (instance == null) { - instance = new PhoneNumberOfflineGeocoder(MAPPING_DATA_DIRECTORY); + instance = new PhoneNumberOfflineGeocoder(DefaultMetadataDependenciesProvider.getInstance() + .getGeocodingDataDirectory()); } return instance; } diff --git a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/1263_en b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/1263_en Binary files differnew file mode 100644 index 00000000..04e95159 --- /dev/null +++ b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/1263_en diff --git a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/1310_en b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/1310_en Binary files differindex 26fd3041..edb45ee7 100644 --- a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/1310_en +++ b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/1310_en diff --git a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/1468_en b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/1468_en Binary files differnew file mode 100644 index 00000000..93016187 --- /dev/null +++ b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/1468_en diff --git a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/1584_en b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/1584_en Binary files differnew file mode 100644 index 00000000..41d8570b --- /dev/null +++ b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/1584_en diff --git a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/1656_en b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/1656_en Binary files differnew file mode 100644 index 00000000..8625c98f --- /dev/null +++ b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/1656_en diff --git a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/1826_en b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/1826_en Binary files differnew file mode 100644 index 00000000..2eda79af --- /dev/null +++ b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/1826_en diff --git a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/1943_en b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/1943_en Binary files differnew file mode 100644 index 00000000..6cf5625e --- /dev/null +++ b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/1943_en diff --git a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/1948_en b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/1948_en Binary files differnew file mode 100644 index 00000000..9577cef8 --- /dev/null +++ b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/1948_en diff --git a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/212_en b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/212_en Binary files differindex 2ae8176b..9a806f96 100644 --- a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/212_en +++ b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/212_en diff --git a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/212_fr b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/212_fr Binary files differindex 9016b0d0..92f3a0ce 100644 --- a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/212_fr +++ b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/212_fr diff --git a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/33_en b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/33_en Binary files differindex c94e1399..d8b8de7d 100644 --- a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/33_en +++ b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/33_en diff --git a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/34_en b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/34_en Binary files differindex 4e81c8af..ced2084e 100644 --- a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/34_en +++ b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/34_en diff --git a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/34_es b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/34_es Binary files differindex 3ab2985b..fe9f8a59 100644 --- a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/34_es +++ b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/34_es diff --git a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/351_en b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/351_en Binary files differindex 61f0da1e..5d925521 100644 --- a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/351_en +++ b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/351_en diff --git a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/44_en b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/44_en Binary files differindex b40793e7..0b9330fd 100644 --- a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/44_en +++ b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/44_en diff --git a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/52_en b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/52_en Binary files differindex e51cd55d..e1006cd9 100644 --- a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/52_en +++ b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/52_en diff --git a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/54_en b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/54_en Binary files differindex 53245827..a277f96d 100644 --- a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/54_en +++ b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/54_en diff --git a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/57_en b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/57_en Binary files differindex ec254fad..fde61aae 100644 --- a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/57_en +++ b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/57_en diff --git a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/61_en b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/61_en Binary files differindex e56bfb93..b5cd9779 100644 --- a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/61_en +++ b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/61_en diff --git a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/config b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/config Binary files differindex 49659897..909cabf3 100644 --- a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/config +++ b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/data/config diff --git a/repackaged/geocoder/src/com/android/i18n/phonenumbers/timezones/data/map_data b/repackaged/geocoder/src/com/android/i18n/phonenumbers/timezones/data/map_data Binary files differindex a2c80e64..aaa5ddfe 100644 --- a/repackaged/geocoder/src/com/android/i18n/phonenumbers/timezones/data/map_data +++ b/repackaged/geocoder/src/com/android/i18n/phonenumbers/timezones/data/map_data diff --git a/repackaged/internal/prefixmapper/src/com/android/i18n/phonenumbers/prefixmapper/PrefixFileReader.java b/repackaged/internal/prefixmapper/src/com/android/i18n/phonenumbers/prefixmapper/PrefixFileReader.java index 98861215..825e53b3 100644 --- a/repackaged/internal/prefixmapper/src/com/android/i18n/phonenumbers/prefixmapper/PrefixFileReader.java +++ b/repackaged/internal/prefixmapper/src/com/android/i18n/phonenumbers/prefixmapper/PrefixFileReader.java @@ -17,8 +17,10 @@ package com.android.i18n.phonenumbers.prefixmapper; +import com.android.i18n.phonenumbers.MetadataLoader; import com.android.i18n.phonenumbers.Phonenumber.PhoneNumber; +import com.android.i18n.phonenumbers.metadata.DefaultMetadataDependenciesProvider; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; @@ -42,17 +44,17 @@ public class PrefixFileReader { private MappingFileProvider mappingFileProvider = new MappingFileProvider(); // A mapping from countryCallingCode_lang to the corresponding phone prefix map that has been // loaded. - private Map<String, PhonePrefixMap> availablePhonePrefixMaps = - new HashMap<String, PhonePrefixMap>(); + private Map<String, PhonePrefixMap> availablePhonePrefixMaps = new HashMap<>(); + private final MetadataLoader metadataLoader; public PrefixFileReader(String phonePrefixDataDirectory) { this.phonePrefixDataDirectory = phonePrefixDataDirectory; + this.metadataLoader = DefaultMetadataDependenciesProvider.getInstance().getMetadataLoader(); loadMappingFileProvider(); } private void loadMappingFileProvider() { - InputStream source = - PrefixFileReader.class.getResourceAsStream(phonePrefixDataDirectory + "config"); + InputStream source = metadataLoader.loadMetadata(phonePrefixDataDirectory + "config"); ObjectInputStream in = null; try { in = new ObjectInputStream(source); @@ -77,8 +79,7 @@ public class PrefixFileReader { } private void loadPhonePrefixMapFromFile(String fileName) { - InputStream source = - PrefixFileReader.class.getResourceAsStream(phonePrefixDataDirectory + fileName); + InputStream source = metadataLoader.loadMetadata(phonePrefixDataDirectory + fileName); ObjectInputStream in = null; try { in = new ObjectInputStream(source); diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/AlternateFormatsCountryCodeSet.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/AlternateFormatsCountryCodeSet.java index cca8a0b8..1b964008 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/AlternateFormatsCountryCodeSet.java +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/AlternateFormatsCountryCodeSet.java @@ -29,7 +29,7 @@ import java.util.Set; */ public class AlternateFormatsCountryCodeSet { // A set of all country codes for which data is available. - static Set<Integer> getCountryCodeSet() { + public static Set<Integer> getCountryCodeSet() { // The capacity is set to 61 as there are 46 different entries, // and this offers a load factor of roughly 0.75. Set<Integer> countryCodeSet = new HashSet<Integer>(61); diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/CountryCodeToRegionCodeMap.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/CountryCodeToRegionCodeMap.java index 6d6b33f6..28072bfb 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/CountryCodeToRegionCodeMap.java +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/CountryCodeToRegionCodeMap.java @@ -34,7 +34,7 @@ public class CountryCodeToRegionCodeMap { // country/region represented by that country code. In the case of multiple // countries sharing a calling code, such as the NANPA countries, the one // indicated with "isMainCountryForCode" in the metadata should be first. - static Map<Integer, List<String>> getCountryCodeToRegionCodeMap() { + public static Map<Integer, List<String>> getCountryCodeToRegionCodeMap() { // The capacity is set to 286 as there are 215 different entries, // and this offers a load factor of roughly 0.75. Map<Integer, List<String>> countryCodeToRegionCodeMap = diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/MetadataManager.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/MetadataManager.java deleted file mode 100644 index 45941115..00000000 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/MetadataManager.java +++ /dev/null @@ -1,234 +0,0 @@ -/* GENERATED SOURCE. DO NOT MODIFY. */ -/* - * Copyright (C) 2012 The Libphonenumber Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.i18n.phonenumbers; - -import com.android.i18n.phonenumbers.Phonemetadata.PhoneMetadata; -import com.android.i18n.phonenumbers.Phonemetadata.PhoneMetadataCollection; -import java.io.IOException; -import java.io.InputStream; -import java.io.ObjectInputStream; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicReference; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Manager for loading metadata for alternate formats and short numbers. We also declare some - * constants for phone number metadata loading, to more easily maintain all three types of metadata - * together. - * TODO: Consider managing phone number metadata loading here too. - */ -final class MetadataManager { - static final String MULTI_FILE_PHONE_NUMBER_METADATA_FILE_PREFIX = - "/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto"; - static final String SINGLE_FILE_PHONE_NUMBER_METADATA_FILE_NAME = - "/com/android/i18n/phonenumbers/data/SingleFilePhoneNumberMetadataProto"; - private static final String ALTERNATE_FORMATS_FILE_PREFIX = - "/com/android/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto"; - private static final String SHORT_NUMBER_METADATA_FILE_PREFIX = - "/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto"; - - static final MetadataLoader DEFAULT_METADATA_LOADER = new MetadataLoader() { - @Override - public InputStream loadMetadata(String metadataFileName) { - return MetadataManager.class.getResourceAsStream(metadataFileName); - } - }; - - private static final Logger logger = Logger.getLogger(MetadataManager.class.getName()); - - // A mapping from a country calling code to the alternate formats for that country calling code. - private static final ConcurrentHashMap<Integer, PhoneMetadata> alternateFormatsMap = - new ConcurrentHashMap<Integer, PhoneMetadata>(); - - // A mapping from a region code to the short number metadata for that region code. - private static final ConcurrentHashMap<String, PhoneMetadata> shortNumberMetadataMap = - new ConcurrentHashMap<String, PhoneMetadata>(); - - // The set of country calling codes for which there are alternate formats. For every country - // calling code in this set there should be metadata linked into the resources. - private static final Set<Integer> alternateFormatsCountryCodes = - AlternateFormatsCountryCodeSet.getCountryCodeSet(); - - // The set of region codes for which there are short number metadata. For every region code in - // this set there should be metadata linked into the resources. - private static final Set<String> shortNumberMetadataRegionCodes = - ShortNumbersRegionCodeSet.getRegionCodeSet(); - - private MetadataManager() {} - - static PhoneMetadata getAlternateFormatsForCountry(int countryCallingCode) { - if (!alternateFormatsCountryCodes.contains(countryCallingCode)) { - return null; - } - return getMetadataFromMultiFilePrefix(countryCallingCode, alternateFormatsMap, - ALTERNATE_FORMATS_FILE_PREFIX, DEFAULT_METADATA_LOADER); - } - - static PhoneMetadata getShortNumberMetadataForRegion(String regionCode) { - if (!shortNumberMetadataRegionCodes.contains(regionCode)) { - return null; - } - return getMetadataFromMultiFilePrefix(regionCode, shortNumberMetadataMap, - SHORT_NUMBER_METADATA_FILE_PREFIX, DEFAULT_METADATA_LOADER); - } - - static Set<String> getSupportedShortNumberRegions() { - return Collections.unmodifiableSet(shortNumberMetadataRegionCodes); - } - - /** - * @param key the lookup key for the provided map, typically a region code or a country calling - * code - * @param map the map containing mappings of already loaded metadata from their {@code key}. If - * this {@code key}'s metadata isn't already loaded, it will be added to this map after - * loading - * @param filePrefix the prefix of the file to load metadata from - * @param metadataLoader the metadata loader used to inject alternative metadata sources - */ - static <T> PhoneMetadata getMetadataFromMultiFilePrefix(T key, - ConcurrentHashMap<T, PhoneMetadata> map, String filePrefix, MetadataLoader metadataLoader) { - PhoneMetadata metadata = map.get(key); - if (metadata != null) { - return metadata; - } - // We assume key.toString() is well-defined. - String fileName = filePrefix + "_" + key; - List<PhoneMetadata> metadataList = getMetadataFromSingleFileName(fileName, metadataLoader); - if (metadataList.size() > 1) { - logger.log(Level.WARNING, "more than one metadata in file " + fileName); - } - metadata = metadataList.get(0); - PhoneMetadata oldValue = map.putIfAbsent(key, metadata); - return (oldValue != null) ? oldValue : metadata; - } - - // Loader and holder for the metadata maps loaded from a single file. - static class SingleFileMetadataMaps { - static SingleFileMetadataMaps load(String fileName, MetadataLoader metadataLoader) { - List<PhoneMetadata> metadataList = getMetadataFromSingleFileName(fileName, metadataLoader); - Map<String, PhoneMetadata> regionCodeToMetadata = new HashMap<String, PhoneMetadata>(); - Map<Integer, PhoneMetadata> countryCallingCodeToMetadata = - new HashMap<Integer, PhoneMetadata>(); - for (PhoneMetadata metadata : metadataList) { - String regionCode = metadata.getId(); - if (PhoneNumberUtil.REGION_CODE_FOR_NON_GEO_ENTITY.equals(regionCode)) { - // regionCode belongs to a non-geographical entity. - countryCallingCodeToMetadata.put(metadata.getCountryCode(), metadata); - } else { - regionCodeToMetadata.put(regionCode, metadata); - } - } - return new SingleFileMetadataMaps(regionCodeToMetadata, countryCallingCodeToMetadata); - } - - // A map from a region code to the PhoneMetadata for that region. - // For phone number metadata, the region code "001" is excluded, since that is used for the - // non-geographical phone number entities. - private final Map<String, PhoneMetadata> regionCodeToMetadata; - - // A map from a country calling code to the PhoneMetadata for that country calling code. - // Examples of the country calling codes include 800 (International Toll Free Service) and 808 - // (International Shared Cost Service). - // For phone number metadata, only the non-geographical phone number entities' country calling - // codes are present. - private final Map<Integer, PhoneMetadata> countryCallingCodeToMetadata; - - private SingleFileMetadataMaps(Map<String, PhoneMetadata> regionCodeToMetadata, - Map<Integer, PhoneMetadata> countryCallingCodeToMetadata) { - this.regionCodeToMetadata = Collections.unmodifiableMap(regionCodeToMetadata); - this.countryCallingCodeToMetadata = Collections.unmodifiableMap(countryCallingCodeToMetadata); - } - - PhoneMetadata get(String regionCode) { - return regionCodeToMetadata.get(regionCode); - } - - PhoneMetadata get(int countryCallingCode) { - return countryCallingCodeToMetadata.get(countryCallingCode); - } - } - - // Manages the atomic reference lifecycle of a SingleFileMetadataMaps encapsulation. - static SingleFileMetadataMaps getSingleFileMetadataMaps( - AtomicReference<SingleFileMetadataMaps> ref, String fileName, MetadataLoader metadataLoader) { - SingleFileMetadataMaps maps = ref.get(); - if (maps != null) { - return maps; - } - maps = SingleFileMetadataMaps.load(fileName, metadataLoader); - ref.compareAndSet(null, maps); - return ref.get(); - } - - private static List<PhoneMetadata> getMetadataFromSingleFileName(String fileName, - MetadataLoader metadataLoader) { - InputStream source = metadataLoader.loadMetadata(fileName); - if (source == null) { - // Sanity check; this would only happen if we packaged jars incorrectly. - throw new IllegalStateException("missing metadata: " + fileName); - } - PhoneMetadataCollection metadataCollection = loadMetadataAndCloseInput(source); - List<PhoneMetadata> metadataList = metadataCollection.getMetadataList(); - if (metadataList.size() == 0) { - // Sanity check; this should not happen since we build with non-empty metadata. - throw new IllegalStateException("empty metadata: " + fileName); - } - return metadataList; - } - - /** - * Loads and returns the metadata from the given stream and closes the stream. - * - * @param source the non-null stream from which metadata is to be read - * @return the loaded metadata - */ - private static PhoneMetadataCollection loadMetadataAndCloseInput(InputStream source) { - ObjectInputStream ois = null; - try { - try { - ois = new ObjectInputStream(source); - } catch (IOException e) { - throw new RuntimeException("cannot load/parse metadata", e); - } - PhoneMetadataCollection metadataCollection = new PhoneMetadataCollection(); - try { - metadataCollection.readExternal(ois); - } catch (IOException e) { - throw new RuntimeException("cannot load/parse metadata", e); - } - return metadataCollection; - } finally { - try { - if (ois != null) { - // This will close all underlying streams as well, including source. - ois.close(); - } else { - source.close(); - } - } catch (IOException e) { - logger.log(Level.WARNING, "error closing input stream (ignored)", e); - } - } - } -} diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/MissingMetadataException.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/MissingMetadataException.java new file mode 100644 index 00000000..ee09e99f --- /dev/null +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/MissingMetadataException.java @@ -0,0 +1,11 @@ +/* GENERATED SOURCE. DO NOT MODIFY. */ +package com.android.i18n.phonenumbers; + +/** Exception class for cases when expected metadata cannot be found. + * @hide This class is not part of the Android public SDK API*/ +public final class MissingMetadataException extends IllegalStateException { + + public MissingMetadataException(String message) { + super(message); + } +}
\ No newline at end of file diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/MultiFileMetadataSourceImpl.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/MultiFileMetadataSourceImpl.java deleted file mode 100644 index 7d9e713c..00000000 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/MultiFileMetadataSourceImpl.java +++ /dev/null @@ -1,87 +0,0 @@ -/* GENERATED SOURCE. DO NOT MODIFY. */ -/* - * Copyright (C) 2015 The Libphonenumber Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.i18n.phonenumbers; - -import com.android.i18n.phonenumbers.Phonemetadata.PhoneMetadata; -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; - -/** - * Implementation of {@link MetadataSource} that reads from multiple resource files. - */ -final class MultiFileMetadataSourceImpl implements MetadataSource { - // The prefix of the binary files containing phone number metadata for different regions. - // This enables us to set up with different metadata, such as for testing. - private final String phoneNumberMetadataFilePrefix; - - // The {@link MetadataLoader} used to inject alternative metadata sources. - private final MetadataLoader metadataLoader; - - // A mapping from a region code to the phone number metadata for that region code. - // Unlike the mappings for alternate formats and short number metadata, the phone number metadata - // is loaded from a non-statically determined file prefix; therefore this map is bound to the - // instance and not static. - private final ConcurrentHashMap<String, PhoneMetadata> geographicalRegions = - new ConcurrentHashMap<String, PhoneMetadata>(); - - // A mapping from a country calling code for a non-geographical entity to the phone number - // metadata for that country calling code. Examples of the country calling codes include 800 - // (International Toll Free Service) and 808 (International Shared Cost Service). - // Unlike the mappings for alternate formats and short number metadata, the phone number metadata - // is loaded from a non-statically determined file prefix; therefore this map is bound to the - // instance and not static. - private final ConcurrentHashMap<Integer, PhoneMetadata> nonGeographicalRegions = - new ConcurrentHashMap<Integer, PhoneMetadata>(); - - // It is assumed that metadataLoader is not null. Checks should happen before passing it in here. - // @VisibleForTesting - MultiFileMetadataSourceImpl(String phoneNumberMetadataFilePrefix, MetadataLoader metadataLoader) { - this.phoneNumberMetadataFilePrefix = phoneNumberMetadataFilePrefix; - this.metadataLoader = metadataLoader; - } - - // It is assumed that metadataLoader is not null. Checks should happen before passing it in here. - MultiFileMetadataSourceImpl(MetadataLoader metadataLoader) { - this(MetadataManager.MULTI_FILE_PHONE_NUMBER_METADATA_FILE_PREFIX, metadataLoader); - } - - @Override - public PhoneMetadata getMetadataForRegion(String regionCode) { - return MetadataManager.getMetadataFromMultiFilePrefix(regionCode, geographicalRegions, - phoneNumberMetadataFilePrefix, metadataLoader); - } - - @Override - public PhoneMetadata getMetadataForNonGeographicalRegion(int countryCallingCode) { - if (!isNonGeographical(countryCallingCode)) { - // The given country calling code was for a geographical region. - return null; - } - return MetadataManager.getMetadataFromMultiFilePrefix(countryCallingCode, nonGeographicalRegions, - phoneNumberMetadataFilePrefix, metadataLoader); - } - - // A country calling code is non-geographical if it only maps to the non-geographical region code, - // i.e. "001". - private boolean isNonGeographical(int countryCallingCode) { - List<String> regionCodes = - CountryCodeToRegionCodeMap.getCountryCodeToRegionCodeMap().get(countryCallingCode); - return (regionCodes.size() == 1 - && PhoneNumberUtil.REGION_CODE_FOR_NON_GEO_ENTITY.equals(regionCodes.get(0))); - } -} diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/PhoneNumberMatcher.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/PhoneNumberMatcher.java index 2e2d96a3..a9f60e96 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/PhoneNumberMatcher.java +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/PhoneNumberMatcher.java @@ -25,6 +25,7 @@ import com.android.i18n.phonenumbers.Phonemetadata.PhoneMetadata; import com.android.i18n.phonenumbers.Phonenumber.PhoneNumber.CountryCodeSource; import com.android.i18n.phonenumbers.Phonenumber.PhoneNumber; import com.android.i18n.phonenumbers.internal.RegexCache; +import com.android.i18n.phonenumbers.metadata.DefaultMetadataDependenciesProvider; import java.lang.Character.UnicodeBlock; import java.util.Iterator; import java.util.NoSuchElementException; @@ -576,7 +577,9 @@ final class PhoneNumberMatcher implements Iterator<PhoneNumberMatch> { } // If this didn't pass, see if there are any alternate formats that match, and try them instead. PhoneMetadata alternateFormats = - MetadataManager.getAlternateFormatsForCountry(number.getCountryCode()); + DefaultMetadataDependenciesProvider.getInstance() + .getAlternateFormatsMetadataSource() + .getFormattingMetadataForCountryCallingCode(number.getCountryCode()); String nationalSignificantNumber = util.getNationalSignificantNumber(number); if (alternateFormats != null) { for (NumberFormat alternateFormat : alternateFormats.getNumberFormatList()) { diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/PhoneNumberUtil.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/PhoneNumberUtil.java index 95e4c4e7..77f1a13c 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/PhoneNumberUtil.java +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/PhoneNumberUtil.java @@ -25,11 +25,12 @@ import com.android.i18n.phonenumbers.Phonenumber.PhoneNumber.CountryCodeSource; import com.android.i18n.phonenumbers.internal.MatcherApi; import com.android.i18n.phonenumbers.internal.RegexBasedMatcher; import com.android.i18n.phonenumbers.internal.RegexCache; - +import com.android.i18n.phonenumbers.metadata.DefaultMetadataDependenciesProvider; +import com.android.i18n.phonenumbers.metadata.source.MetadataSource; +import com.android.i18n.phonenumbers.metadata.source.MetadataSourceImpl; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -75,10 +76,6 @@ public class PhoneNumberUtil { private static final int NANPA_COUNTRY_CODE = 1; - // The prefix that needs to be inserted in front of a Colombian landline number when dialed from - // a mobile phone in Colombia. - private static final String COLOMBIA_MOBILE_TO_FIXED_LINE_PREFIX = "3"; - // Map of country calling codes that use a mobile token before the area code. One example of when // this is relevant is when determining the length of the national destination code, which should // be the length of the area code plus the length of the mobile token. @@ -123,16 +120,16 @@ public class PhoneNumberUtil { private static final Map<Character, Character> ALL_PLUS_NUMBER_GROUPING_SYMBOLS; static { - HashMap<Integer, String> mobileTokenMap = new HashMap<Integer, String>(); + HashMap<Integer, String> mobileTokenMap = new HashMap<>(); mobileTokenMap.put(54, "9"); MOBILE_TOKEN_MAPPINGS = Collections.unmodifiableMap(mobileTokenMap); - HashSet<Integer> geoMobileCountriesWithoutMobileAreaCodes = new HashSet<Integer>(); + HashSet<Integer> geoMobileCountriesWithoutMobileAreaCodes = new HashSet<>(); geoMobileCountriesWithoutMobileAreaCodes.add(86); // China GEO_MOBILE_COUNTRIES_WITHOUT_MOBILE_AREA_CODES = Collections.unmodifiableSet(geoMobileCountriesWithoutMobileAreaCodes); - HashSet<Integer> geoMobileCountries = new HashSet<Integer>(); + HashSet<Integer> geoMobileCountries = new HashSet<>(); geoMobileCountries.add(52); // Mexico geoMobileCountries.add(54); // Argentina geoMobileCountries.add(55); // Brazil @@ -142,7 +139,7 @@ public class PhoneNumberUtil { // Simple ASCII digits map used to populate ALPHA_PHONE_MAPPINGS and // ALL_PLUS_NUMBER_GROUPING_SYMBOLS. - HashMap<Character, Character> asciiDigitMappings = new HashMap<Character, Character>(); + HashMap<Character, Character> asciiDigitMappings = new HashMap<>(); asciiDigitMappings.put('0', '0'); asciiDigitMappings.put('1', '1'); asciiDigitMappings.put('2', '2'); @@ -154,7 +151,7 @@ public class PhoneNumberUtil { asciiDigitMappings.put('8', '8'); asciiDigitMappings.put('9', '9'); - HashMap<Character, Character> alphaMap = new HashMap<Character, Character>(40); + HashMap<Character, Character> alphaMap = new HashMap<>(40); alphaMap.put('A', '2'); alphaMap.put('B', '2'); alphaMap.put('C', '2'); @@ -183,19 +180,19 @@ public class PhoneNumberUtil { alphaMap.put('Z', '9'); ALPHA_MAPPINGS = Collections.unmodifiableMap(alphaMap); - HashMap<Character, Character> combinedMap = new HashMap<Character, Character>(100); + HashMap<Character, Character> combinedMap = new HashMap<>(100); combinedMap.putAll(ALPHA_MAPPINGS); combinedMap.putAll(asciiDigitMappings); ALPHA_PHONE_MAPPINGS = Collections.unmodifiableMap(combinedMap); - HashMap<Character, Character> diallableCharMap = new HashMap<Character, Character>(); + HashMap<Character, Character> diallableCharMap = new HashMap<>(); diallableCharMap.putAll(asciiDigitMappings); diallableCharMap.put(PLUS_SIGN, PLUS_SIGN); diallableCharMap.put('*', '*'); diallableCharMap.put('#', '#'); DIALLABLE_CHAR_MAPPINGS = Collections.unmodifiableMap(diallableCharMap); - HashMap<Character, Character> allPlusNumberGroupings = new HashMap<Character, Character>(); + HashMap<Character, Character> allPlusNumberGroupings = new HashMap<>(); // Put (lower letter -> upper letter) and (upper letter -> upper letter) mappings. for (char c : ALPHA_MAPPINGS.keySet()) { allPlusNumberGroupings.put(Character.toLowerCase(c), c); @@ -310,8 +307,8 @@ public class PhoneNumberUtil { // version. private static final String EXTN_PATTERNS_FOR_PARSING = createExtnPattern(true); static final String EXTN_PATTERNS_FOR_MATCHING = createExtnPattern(false); - - /** + + /** * Helper method for constructing regular expressions for parsing. Creates an expression that * captures up to maxLength digits. */ @@ -692,7 +689,7 @@ public class PhoneNumberUtil { // The set of regions that share country calling code 1. // There are roughly 26 regions. // We set the initial capacity of the HashSet to 35 to offer a load factor of roughly 0.75. - private final Set<String> nanpaRegions = new HashSet<String>(35); + private final Set<String> nanpaRegions = new HashSet<>(35); // A cache for frequently used region-specific regular expressions. // The initial capacity is set to 100 as this seems to be an optimal value for Android, based on @@ -702,11 +699,11 @@ public class PhoneNumberUtil { // The set of regions the library supports. // There are roughly 240 of them and we set the initial capacity of the HashSet to 320 to offer a // load factor of roughly 0.75. - private final Set<String> supportedRegions = new HashSet<String>(320); + private final Set<String> supportedRegions = new HashSet<>(320); // The set of country calling codes that map to the non-geo entity region ("001"). This set // currently contains < 12 elements so the default capacity of 16 (load factor=0.75) is fine. - private final Set<Integer> countryCodesForNonGeographicalRegion = new HashSet<Integer>(); + private final Set<Integer> countryCodesForNonGeographicalRegion = new HashSet<>(); /** * This class implements a singleton, the constructor is only visible to facilitate testing. @@ -1122,7 +1119,7 @@ public class PhoneNumberUtil { * be non-null. */ private Set<PhoneNumberType> getSupportedTypesForMetadata(PhoneMetadata metadata) { - Set<PhoneNumberType> types = new TreeSet<PhoneNumberType>(); + Set<PhoneNumberType> types = new TreeSet<>(); for (PhoneNumberType type : PhoneNumberType.values()) { if (type == PhoneNumberType.FIXED_LINE_OR_MOBILE || type == PhoneNumberType.UNKNOWN) { // Never return FIXED_LINE_OR_MOBILE (it is a convenience type, and represents that a @@ -1183,7 +1180,9 @@ public class PhoneNumberUtil { @android.compat.annotation.UnsupportedAppUsage public static synchronized PhoneNumberUtil getInstance() { if (instance == null) { - setInstance(createInstance(MetadataManager.DEFAULT_METADATA_LOADER)); + MetadataLoader metadataLoader = DefaultMetadataDependenciesProvider.getInstance() + .getMetadataLoader(); + setInstance(createInstance(metadataLoader)); } return instance; } @@ -1204,7 +1203,11 @@ public class PhoneNumberUtil { if (metadataLoader == null) { throw new IllegalArgumentException("metadataLoader could not be null."); } - return createInstance(new MultiFileMetadataSourceImpl(metadataLoader)); + return createInstance(new MetadataSourceImpl( + DefaultMetadataDependenciesProvider.getInstance().getPhoneNumberMetadataFileNameProvider(), + metadataLoader, + DefaultMetadataDependenciesProvider.getInstance().getMetadataParser() + )); } /** @@ -1499,10 +1502,7 @@ public class PhoneNumberUtil { (numberType == PhoneNumberType.FIXED_LINE) || (numberType == PhoneNumberType.MOBILE) || (numberType == PhoneNumberType.FIXED_LINE_OR_MOBILE); // Carrier codes may be needed in some countries. We handle this here. - if (regionCode.equals("CO") && numberType == PhoneNumberType.FIXED_LINE) { - formattedNumber = - formatNationalNumberWithCarrierCode(numberNoExt, COLOMBIA_MOBILE_TO_FIXED_LINE_PREFIX); - } else if (regionCode.equals("BR") && isFixedLineOrMobile) { + if (regionCode.equals("BR") && isFixedLineOrMobile) { // Historically, we set this to an empty string when parsing with raw input if none was // found in the input string. However, this doesn't result in a number we can dial. For this // reason, we treat the empty string the same as if it isn't set at all. @@ -1643,19 +1643,21 @@ public class PhoneNumberUtil { } /** - * Formats a phone number using the original phone number format that the number is parsed from. - * The original format is embedded in the country_code_source field of the PhoneNumber object - * passed in. If such information is missing, the number will be formatted into the NATIONAL - * format by default. When we don't have a formatting pattern for the number, the method returns - * the raw input when it is available. + * Formats a phone number using the original phone number format (e.g. INTERNATIONAL or NATIONAL) + * that the number is parsed from, provided that the number has been parsed with {@link + * parseAndKeepRawInput}. Otherwise the number will be formatted in NATIONAL format. + * + * <p>The original format is embedded in the country_code_source field of the PhoneNumber object + * passed in, which is only set when parsing keeps the raw input. When we don't have a formatting + * pattern for the number, the method falls back to returning the raw input. * - * Note this method guarantees no digit will be inserted, removed or modified as a result of + * <p>Note this method guarantees no digit will be inserted, removed or modified as a result of * formatting. * - * @param number the phone number that needs to be formatted in its original number format - * @param regionCallingFrom the region whose IDD needs to be prefixed if the original number - * has one - * @return the formatted phone number in its original number format + * @param number the phone number that needs to be formatted in its original number format + * @param regionCallingFrom the region whose IDD needs to be prefixed if the original number has + * one + * @return the formatted phone number in its original number format */ @android.compat.annotation.UnsupportedAppUsage public String formatInOriginalFormat(PhoneNumber number, String regionCallingFrom) { @@ -1735,7 +1737,7 @@ public class PhoneNumberUtil { NumberFormat.Builder numFormatCopy = NumberFormat.newBuilder(); numFormatCopy.mergeFrom(formatRule); numFormatCopy.clearNationalPrefixFormattingRule(); - List<NumberFormat> numberFormats = new ArrayList<NumberFormat>(1); + List<NumberFormat> numberFormats = new ArrayList<>(1); numberFormats.add(numFormatCopy.build()); formattedNumber = formatByPattern(number, PhoneNumberFormat.NATIONAL, numberFormats); break; @@ -2313,21 +2315,42 @@ public class PhoneNumberUtil { } /** - * Returns the metadata for the given region code or {@code null} if the region code is invalid - * or unknown. + * Returns the metadata for the given region code or {@code null} if the region code is invalid or + * unknown. + * + * @throws MissingMetadataException if the region code is valid, but metadata cannot be found. */ PhoneMetadata getMetadataForRegion(String regionCode) { if (!isValidRegionCode(regionCode)) { return null; } - return metadataSource.getMetadataForRegion(regionCode); + PhoneMetadata phoneMetadata = metadataSource.getMetadataForRegion(regionCode); + ensureMetadataIsNonNull(phoneMetadata, "Missing metadata for region code " + regionCode); + return phoneMetadata; } + /** + * Returns the metadata for the given country calling code or {@code null} if the country calling + * code is invalid or unknown. + * + * @throws MissingMetadataException if the country calling code is valid, but metadata cannot be + * found. + */ PhoneMetadata getMetadataForNonGeographicalRegion(int countryCallingCode) { - if (!countryCallingCodeToRegionCodeMap.containsKey(countryCallingCode)) { + if (!countryCodesForNonGeographicalRegion.contains(countryCallingCode)) { return null; } - return metadataSource.getMetadataForNonGeographicalRegion(countryCallingCode); + PhoneMetadata phoneMetadata = metadataSource.getMetadataForNonGeographicalRegion( + countryCallingCode); + ensureMetadataIsNonNull(phoneMetadata, + "Missing metadata for country code " + countryCallingCode); + return phoneMetadata; + } + + private static void ensureMetadataIsNonNull(PhoneMetadata phoneMetadata, String message) { + if (phoneMetadata == null) { + throw new MissingMetadataException(message); + } } boolean isNumberMatchingDesc(String nationalNumber, PhoneNumberDesc numberDesc) { @@ -2627,7 +2650,7 @@ public class PhoneNumberUtil { PhoneNumberDesc mobileDesc = getNumberDescByType(metadata, PhoneNumberType.MOBILE); if (descHasPossibleNumberData(mobileDesc)) { // Merge the mobile data in if there was any. We have to make a copy to do this. - possibleLengths = new ArrayList<Integer>(possibleLengths); + possibleLengths = new ArrayList<>(possibleLengths); // Note that when adding the possible lengths from mobile, we have to again check they // aren't empty since if they are this indicates they are the same as the general desc and // should be obtained from there. @@ -2641,7 +2664,7 @@ public class PhoneNumberUtil { if (localLengths.isEmpty()) { localLengths = mobileDesc.getPossibleLengthLocalOnlyList(); } else { - localLengths = new ArrayList<Integer>(localLengths); + localLengths = new ArrayList<>(localLengths); localLengths.addAll(mobileDesc.getPossibleLengthLocalOnlyList()); Collections.sort(localLengths); } diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/ShortNumberInfo.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/ShortNumberInfo.java index a09b9228..64c2c743 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/ShortNumberInfo.java +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/ShortNumberInfo.java @@ -23,6 +23,8 @@ import com.android.i18n.phonenumbers.Phonemetadata.PhoneMetadata; import com.android.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc; import com.android.i18n.phonenumbers.Phonenumber.PhoneNumber; +import com.android.i18n.phonenumbers.metadata.DefaultMetadataDependenciesProvider; +import com.android.i18n.phonenumbers.metadata.source.RegionMetadataSource; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -46,12 +48,13 @@ public class ShortNumberInfo { private static final Logger logger = Logger.getLogger(ShortNumberInfo.class.getName()); private static final ShortNumberInfo INSTANCE = - new ShortNumberInfo(RegexBasedMatcher.create()); + new ShortNumberInfo( + RegexBasedMatcher.create(), + DefaultMetadataDependenciesProvider.getInstance().getShortNumberMetadataSource()); // In these countries, if extra digits are added to an emergency number, it no longer connects // to the emergency service. - private static final Set<String> REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT = - new HashSet<String>(); + private static final Set<String> REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT = new HashSet<>(); static { REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT.add("BR"); REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT.add("CL"); @@ -64,7 +67,7 @@ public class ShortNumberInfo { TOLL_FREE, STANDARD_RATE, PREMIUM_RATE, - UNKNOWN_COST; + UNKNOWN_COST } /** Returns the singleton instance of the ShortNumberInfo. */ @@ -82,9 +85,13 @@ public class ShortNumberInfo { // first. private final Map<Integer, List<String>> countryCallingCodeToRegionCodeMap; + private final RegionMetadataSource shortNumberMetadataSource; + // @VisibleForTesting - ShortNumberInfo(MatcherApi matcherApi) { + ShortNumberInfo(MatcherApi matcherApi, + RegionMetadataSource shortNumberMetadataSource) { this.matcherApi = matcherApi; + this.shortNumberMetadataSource = shortNumberMetadataSource; // TODO: Create ShortNumberInfo for a given map this.countryCallingCodeToRegionCodeMap = CountryCodeToRegionCodeMap.getCountryCodeToRegionCodeMap(); @@ -112,6 +119,21 @@ public class ShortNumberInfo { } /** + * A thin wrapper around {@code shortNumberMetadataSource} which catches {@link + * IllegalArgumentException} for invalid region code and instead returns {@code null} + */ + private PhoneMetadata getShortNumberMetadataForRegion(String regionCode) { + if (regionCode == null) { + return null; + } + try { + return shortNumberMetadataSource.getMetadataForRegion(regionCode); + } catch (IllegalArgumentException e) { + return null; + } + } + + /** * Check whether a short number is a possible number when dialed from the given region. This * provides a more lenient check than {@link #isValidShortNumberForRegion}. * @@ -123,8 +145,7 @@ public class ShortNumberInfo { if (!regionDialingFromMatchesNumber(number, regionDialingFrom)) { return false; } - PhoneMetadata phoneMetadata = - MetadataManager.getShortNumberMetadataForRegion(regionDialingFrom); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionDialingFrom); if (phoneMetadata == null) { return false; } @@ -145,7 +166,7 @@ public class ShortNumberInfo { List<String> regionCodes = getRegionCodesForCountryCode(number.getCountryCode()); int shortNumberLength = getNationalSignificantNumber(number).length(); for (String region : regionCodes) { - PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(region); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(region); if (phoneMetadata == null) { continue; } @@ -169,8 +190,7 @@ public class ShortNumberInfo { if (!regionDialingFromMatchesNumber(number, regionDialingFrom)) { return false; } - PhoneMetadata phoneMetadata = - MetadataManager.getShortNumberMetadataForRegion(regionDialingFrom); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionDialingFrom); if (phoneMetadata == null) { return false; } @@ -231,8 +251,7 @@ public class ShortNumberInfo { return ShortNumberCost.UNKNOWN_COST; } // Note that regionDialingFrom may be null, in which case phoneMetadata will also be null. - PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion( - regionDialingFrom); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionDialingFrom); if (phoneMetadata == null) { return ShortNumberCost.UNKNOWN_COST; } @@ -329,7 +348,7 @@ public class ShortNumberInfo { } String nationalNumber = getNationalSignificantNumber(number); for (String regionCode : regionCodes) { - PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionCode); if (phoneMetadata != null && matchesPossibleNumberAndNationalNumber(nationalNumber, phoneMetadata.getShortCode())) { // The number is valid for this region. @@ -340,13 +359,6 @@ public class ShortNumberInfo { } /** - * Convenience method to get a list of what regions the library has metadata for. - */ - Set<String> getSupportedRegions() { - return MetadataManager.getSupportedShortNumberRegions(); - } - - /** * Gets a valid short number for the specified region. * * @param regionCode the region for which an example short number is needed @@ -355,7 +367,7 @@ public class ShortNumberInfo { */ // @VisibleForTesting String getExampleShortNumber(String regionCode) { - PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionCode); if (phoneMetadata == null) { return ""; } @@ -376,7 +388,7 @@ public class ShortNumberInfo { */ // @VisibleForTesting String getExampleShortNumberForCost(String regionCode, ShortNumberCost cost) { - PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionCode); if (phoneMetadata == null) { return ""; } @@ -444,7 +456,7 @@ public class ShortNumberInfo { // add additional logic here to handle it. return false; } - PhoneMetadata metadata = MetadataManager.getShortNumberMetadataForRegion(regionCode); + PhoneMetadata metadata = getShortNumberMetadataForRegion(regionCode); if (metadata == null || !metadata.hasEmergency()) { return false; } @@ -471,7 +483,7 @@ public class ShortNumberInfo { List<String> regionCodes = getRegionCodesForCountryCode(number.getCountryCode()); String regionCode = getRegionCodeForShortNumberFromRegionList(number, regionCodes); String nationalNumber = getNationalSignificantNumber(number); - PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionCode); return (phoneMetadata != null) && (matchesPossibleNumberAndNationalNumber(nationalNumber, phoneMetadata.getCarrierSpecific())); @@ -495,8 +507,7 @@ public class ShortNumberInfo { return false; } String nationalNumber = getNationalSignificantNumber(number); - PhoneMetadata phoneMetadata = - MetadataManager.getShortNumberMetadataForRegion(regionDialingFrom); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionDialingFrom); return (phoneMetadata != null) && (matchesPossibleNumberAndNationalNumber(nationalNumber, phoneMetadata.getCarrierSpecific())); @@ -519,8 +530,7 @@ public class ShortNumberInfo { if (!regionDialingFromMatchesNumber(number, regionDialingFrom)) { return false; } - PhoneMetadata phoneMetadata = - MetadataManager.getShortNumberMetadataForRegion(regionDialingFrom); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionDialingFrom); return phoneMetadata != null && matchesPossibleNumberAndNationalNumber(getNationalSignificantNumber(number), phoneMetadata.getSmsServices()); diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/ShortNumbersRegionCodeSet.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/ShortNumbersRegionCodeSet.java index 12f1745c..227881cb 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/ShortNumbersRegionCodeSet.java +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/ShortNumbersRegionCodeSet.java @@ -29,7 +29,7 @@ import java.util.Set; */ public class ShortNumbersRegionCodeSet { // A set of all region codes for which data is available. - static Set<String> getRegionCodeSet() { + public static Set<String> getRegionCodeSet() { // The capacity is set to 321 as there are 241 different entries, // and this offers a load factor of roughly 0.75. Set<String> regionCodeSet = new HashSet<String>(321); diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/SingleFileMetadataSourceImpl.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/SingleFileMetadataSourceImpl.java deleted file mode 100644 index 8b15cbb8..00000000 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/SingleFileMetadataSourceImpl.java +++ /dev/null @@ -1,66 +0,0 @@ -/* GENERATED SOURCE. DO NOT MODIFY. */ -/* - * Copyright (C) 2015 The Libphonenumber Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.i18n.phonenumbers; - -import com.android.i18n.phonenumbers.Phonemetadata.PhoneMetadata; -import java.util.concurrent.atomic.AtomicReference; - -/** - * Implementation of {@link MetadataSource} that reads from a single resource file. - */ -final class SingleFileMetadataSourceImpl implements MetadataSource { - // The name of the binary file containing phone number metadata for different regions. - // This enables us to set up with different metadata, such as for testing. - private final String phoneNumberMetadataFileName; - - // The {@link MetadataLoader} used to inject alternative metadata sources. - private final MetadataLoader metadataLoader; - - private final AtomicReference<MetadataManager.SingleFileMetadataMaps> phoneNumberMetadataRef = - new AtomicReference<MetadataManager.SingleFileMetadataMaps>(); - - // It is assumed that metadataLoader is not null. Checks should happen before passing it in here. - // @VisibleForTesting - SingleFileMetadataSourceImpl(String phoneNumberMetadataFileName, MetadataLoader metadataLoader) { - this.phoneNumberMetadataFileName = phoneNumberMetadataFileName; - this.metadataLoader = metadataLoader; - } - - // It is assumed that metadataLoader is not null. Checks should happen before passing it in here. - SingleFileMetadataSourceImpl(MetadataLoader metadataLoader) { - this(MetadataManager.SINGLE_FILE_PHONE_NUMBER_METADATA_FILE_NAME, metadataLoader); - } - - @Override - public PhoneMetadata getMetadataForRegion(String regionCode) { - return MetadataManager.getSingleFileMetadataMaps(phoneNumberMetadataRef, - phoneNumberMetadataFileName, metadataLoader).get(regionCode); - } - - @Override - public PhoneMetadata getMetadataForNonGeographicalRegion(int countryCallingCode) { - // A country calling code is non-geographical if it only maps to the non-geographical region - // code, i.e. "001". If this is not true of the given country calling code, then we will return - // null here. If not for the atomic reference, such as if we were loading in multiple stages, we - // would check that the passed in country calling code was indeed non-geographical to avoid - // loading costs for a null result. Here though we do not check this since the entire data must - // be loaded anyway if any of it is needed at some point in the life cycle of this class. - return MetadataManager.getSingleFileMetadataMaps(phoneNumberMetadataRef, - phoneNumberMetadataFileName, metadataLoader).get(countryCallingCode); - } -} diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_375 b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_375 Binary files differdeleted file mode 100644 index b7d8cacd..00000000 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_375 +++ /dev/null diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_380 b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_380 Binary files differindex 874e5e13..f01473b5 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_380 +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_380 diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_49 b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_49 Binary files differindex d169d31e..fdb9f55c 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_49 +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_49 diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_63 b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_63 Binary files differdeleted file mode 100644 index e6f03ad1..00000000 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_63 +++ /dev/null diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_800 b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_800 Binary files differindex 6806a009..f4091758 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_800 +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_800 diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG Binary files differindex dfe50786..600f043a 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI Binary files differindex 6ba5be41..50c61861 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AO b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AO Binary files differindex 894d4fab..09ca4ed5 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AO +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AO diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR Binary files differindex 41c00923..dd6e97b0 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS Binary files differindex 29424fbe..8fd93bf2 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT Binary files differindex a54f4ca3..c9dc3115 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB Binary files differindex 339334bf..51ce25ba 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE Binary files differindex 01bb8dac..d3feed89 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF Binary files differindex dc01444b..2bcb8e83 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ Binary files differindex bb43464a..09d12540 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM Binary files differindex efa9b058..4a01f606 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR Binary files differindex ed648e4b..6a1c9818 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS Binary files differindex 6ccdd69a..73e27753 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW Binary files differindex e1cab68c..ca363123 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA Binary files differindex 5e981c85..b9ee37d2 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL Binary files differindex ddebc8f7..6bc75af5 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM Binary files differindex 283e679d..5fc149d4 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN Binary files differindex 3f7fcbbc..95fc994a 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO Binary files differindex 492f70af..b2942a98 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE Binary files differindex ebb5fb49..4be09b00 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM Binary files differindex 2b89782e..4075371b 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO Binary files differindex 5a7271eb..245f2c6c 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE Binary files differindex cdfd1f86..fbe8f680 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EH b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EH Binary files differindex 43163312..c91bbb61 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EH +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EH diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET Binary files differindex 33d742f9..bbc37a6f 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO Binary files differindex c7ee185a..9fea3ab0 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR Binary files differindex d52abcfc..80847ce0 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB Binary files differindex b11e9fda..12d9f4a7 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD Binary files differindex e11e957c..5538023d 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GE b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GE Binary files differindex 009e48ab..eb003a64 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GE +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GE diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GF b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GF Binary files differindex 8a056eb2..f6d9e149 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GF +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GF diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG Binary files differindex e1da75ca..c765fb03 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GH b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GH Binary files differindex 296fcf9d..45e6bc8f 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GH +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GH diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP Binary files differindex d0da8506..2633c4ad 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU Binary files differindex f6a759c8..5ccbef1a 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK Binary files differindex 7d938623..7b464ce8 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN Binary files differindex 00752953..883376c4 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR Binary files differindex 11de05ac..a38c7113 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL Binary files differindex 993af32f..2a4a84c8 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR Binary files differindex 8a720626..43229559 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS Binary files differindex c75dce67..857459b8 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT Binary files differindex 0cea04e8..d7001a5f 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE Binary files differindex bd6d7e51..0393a859 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM Binary files differindex fa01bc2c..ca4265cc 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP Binary files differindex 97585357..3ac3c9de 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE Binary files differindex ec6030f6..85766380 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG Binary files differindex 7672fa34..eeff6fe0 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN Binary files differindex 0c9dd320..1bf09f59 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY Binary files differindex 4ba22785..da2f3cf0 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC Binary files differindex 85135ca2..36adc17f 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA Binary files differindex 47c2eec0..25cac90d 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MH b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MH Binary files differindex a29c69d8..fc1542b9 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MH +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MH diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML Binary files differindex 7efdbaee..cabf18c5 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM Binary files differindex dbd636e5..c4e58998 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN Binary files differindex 5ab6a0d6..2723b92c 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP Binary files differindex 41b92f5b..51eaccdc 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MQ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MQ Binary files differindex f8b5f35c..a53de1f6 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MQ +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MQ diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS Binary files differindex 51ff6a48..a51b808d 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MT b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MT Binary files differindex cde7ce65..e7133bec 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MT +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MT diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MV b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MV Binary files differindex 365bafd7..22fc4c93 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MV +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MV diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX Binary files differindex a885cb56..8c6a632c 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY Binary files differindex 4622c358..9317fcae 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NC b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NC Binary files differindex 21951ced..486c78a0 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NC +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NC diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NL b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NL Binary files differindex 852c356a..4ee5e60c 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NL +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NL diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP Binary files differindex 36dc1e39..6b02afaa 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ Binary files differindex 49e38ad9..05a1d226 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA Binary files differindex 6ec881ff..e1eddfda 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE Binary files differindex 45b707a5..db7408c2 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG Binary files differindex 81dd47e2..f68e5223 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM Binary files differindex 305b85e9..257a20e6 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR Binary files differindex 67735fad..204e12d5 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT Binary files differindex 15e4a2a7..53563095 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA Binary files differindex 857b6d9b..1ae59572 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RE b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RE Binary files differindex dddb34ea..62d1a5d1 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RE +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RE diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE Binary files differindex fb9422cc..170d0d5c 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG Binary files differindex d3d777cf..eadddf85 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SI b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SI Binary files differindex 0e2e60c2..9b044f61 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SI +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SI diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX Binary files differindex b0fd135b..4b330f71 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SY b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SY Binary files differindex 1f1ce10f..b2d56078 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SY +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SY diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC Binary files differindex 23c56495..ce6cd976 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT Binary files differindex ddbeb93b..ae0d173b 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA Binary files differindex 76b49f27..ed30c934 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG Binary files differindex d08e73c7..ee2e0579 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_US b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_US Binary files differindex f8859190..6fad5941 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_US +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_US diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC Binary files differindex 7cfd32e7..a94967ad 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG Binary files differindex 057bc582..87aa6c65 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI Binary files differindex b340ff45..0e99feaa 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN Binary files differindex 0a8fd5af..d7470ecd 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_YT b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_YT Binary files differindex cec9da09..728c7e64 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_YT +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_YT diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_AT b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_AT Binary files differindex 1947aa2a..ecfe1344 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_AT +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto_AT diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/internal/GeoEntityUtility.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/internal/GeoEntityUtility.java new file mode 100644 index 00000000..e4576344 --- /dev/null +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/internal/GeoEntityUtility.java @@ -0,0 +1,58 @@ +/* GENERATED SOURCE. DO NOT MODIFY. */ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.i18n.phonenumbers.internal; + +import com.android.i18n.phonenumbers.CountryCodeToRegionCodeMap; +import java.util.List; + +/** + * Utility class for checking whether identifiers region code and country calling code belong + * to geographical entities. For more information about geo vs. non-geo entities see {@link + * com.android.i18n.phonenumbers.metadata.source.RegionMetadataSource} and {@link + * com.android.i18n.phonenumbers.metadata.source.NonGeographicalEntityMetadataSource} + * @hide This class is not part of the Android public SDK API + */ +public final class GeoEntityUtility { + + /** Region code with a special meaning, used to mark non-geographical entities */ + public static final String REGION_CODE_FOR_NON_GEO_ENTITIES = "001"; + + /** Determines whether {@code regionCode} belongs to a geographical entity. */ + public static boolean isGeoEntity(String regionCode) { + return !regionCode.equals(REGION_CODE_FOR_NON_GEO_ENTITIES); + } + + /** + * Determines whether {@code countryCallingCode} belongs to a geographical entity. + * + * <p>A single country calling code could map to several different regions. It is considered that + * {@code countryCallingCode} belongs to a geo entity if all of these regions are geo entities + * + * <p>Note that this method will not throw an exception even when the underlying mapping for the + * {@code countryCallingCode} does not exist, instead it will return {@code false} + */ + public static boolean isGeoEntity(int countryCallingCode) { + List<String> regionCodesForCountryCallingCode = + CountryCodeToRegionCodeMap.getCountryCodeToRegionCodeMap().get(countryCallingCode); + + return regionCodesForCountryCallingCode != null + && !regionCodesForCountryCallingCode.contains(REGION_CODE_FOR_NON_GEO_ENTITIES); + } + + private GeoEntityUtility() {} +} diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/DefaultMetadataDependenciesProvider.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/DefaultMetadataDependenciesProvider.java new file mode 100644 index 00000000..cca19b90 --- /dev/null +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/DefaultMetadataDependenciesProvider.java @@ -0,0 +1,117 @@ +/* GENERATED SOURCE. DO NOT MODIFY. */ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.i18n.phonenumbers.metadata; + +import com.android.i18n.phonenumbers.MetadataLoader; +import com.android.i18n.phonenumbers.metadata.init.ClassPathResourceMetadataLoader; +import com.android.i18n.phonenumbers.metadata.init.MetadataParser; +import com.android.i18n.phonenumbers.metadata.source.FormattingMetadataSource; +import com.android.i18n.phonenumbers.metadata.source.FormattingMetadataSourceImpl; +import com.android.i18n.phonenumbers.metadata.source.MetadataSource; +import com.android.i18n.phonenumbers.metadata.source.MetadataSourceImpl; +import com.android.i18n.phonenumbers.metadata.source.MultiFileModeFileNameProvider; +import com.android.i18n.phonenumbers.metadata.source.PhoneMetadataFileNameProvider; +import com.android.i18n.phonenumbers.metadata.source.RegionMetadataSource; +import com.android.i18n.phonenumbers.metadata.source.RegionMetadataSourceImpl; + +/** + * Provides metadata init and source dependencies when metadata is stored in multi-file mode and + * loaded as a classpath resource. + * @hide This class is not part of the Android public SDK API + */ +public final class DefaultMetadataDependenciesProvider { + + private static final DefaultMetadataDependenciesProvider INSTANCE = new DefaultMetadataDependenciesProvider(); + + public static DefaultMetadataDependenciesProvider getInstance() { + return INSTANCE; + } + + private DefaultMetadataDependenciesProvider() { + } + + private final MetadataParser metadataParser = MetadataParser.newLenientParser(); + private final MetadataLoader metadataLoader = new ClassPathResourceMetadataLoader(); + + private final PhoneMetadataFileNameProvider phoneNumberMetadataFileNameProvider = + new MultiFileModeFileNameProvider( + "/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto"); + private final MetadataSource phoneNumberMetadataSource = + new MetadataSourceImpl( + phoneNumberMetadataFileNameProvider, + metadataLoader, + metadataParser); + + private final PhoneMetadataFileNameProvider shortNumberMetadataFileNameProvider = + new MultiFileModeFileNameProvider( + "/com/android/i18n/phonenumbers/data/ShortNumberMetadataProto"); + private final RegionMetadataSource shortNumberMetadataSource = + new RegionMetadataSourceImpl( + shortNumberMetadataFileNameProvider, + metadataLoader, + metadataParser); + + private final PhoneMetadataFileNameProvider alternateFormatsMetadataFileNameProvider = + new MultiFileModeFileNameProvider( + "/com/android/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto"); + private final FormattingMetadataSource alternateFormatsMetadataSource = + new FormattingMetadataSourceImpl( + alternateFormatsMetadataFileNameProvider, + metadataLoader, + metadataParser); + + public MetadataParser getMetadataParser() { + return metadataParser; + } + + public MetadataLoader getMetadataLoader() { + return metadataLoader; + } + + public PhoneMetadataFileNameProvider getPhoneNumberMetadataFileNameProvider() { + return phoneNumberMetadataFileNameProvider; + } + + public MetadataSource getPhoneNumberMetadataSource() { + return phoneNumberMetadataSource; + } + + public PhoneMetadataFileNameProvider getShortNumberMetadataFileNameProvider() { + return shortNumberMetadataFileNameProvider; + } + + public RegionMetadataSource getShortNumberMetadataSource() { + return shortNumberMetadataSource; + } + + public PhoneMetadataFileNameProvider getAlternateFormatsMetadataFileNameProvider() { + return alternateFormatsMetadataFileNameProvider; + } + + public FormattingMetadataSource getAlternateFormatsMetadataSource() { + return alternateFormatsMetadataSource; + } + + public String getCarrierDataDirectory() { + return "/com/android/i18n/phonenumbers/carrier/data/"; + } + + public String getGeocodingDataDirectory() { + return "/com/android/i18n/phonenumbers/geocoding/data/"; + } +} diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/init/ClassPathResourceMetadataLoader.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/init/ClassPathResourceMetadataLoader.java new file mode 100644 index 00000000..4a5d4738 --- /dev/null +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/init/ClassPathResourceMetadataLoader.java @@ -0,0 +1,44 @@ +/* GENERATED SOURCE. DO NOT MODIFY. */ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.i18n.phonenumbers.metadata.init; + +import com.android.i18n.phonenumbers.MetadataLoader; +import java.io.InputStream; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * A {@link MetadataLoader} implementation that reads phone number metadata files as classpath + * resources. + * @hide This class is not part of the Android public SDK API + */ +public final class ClassPathResourceMetadataLoader implements MetadataLoader { + + private static final Logger logger = + Logger.getLogger(ClassPathResourceMetadataLoader.class.getName()); + + @Override + public InputStream loadMetadata(String metadataFileName) { + InputStream inputStream = + ClassPathResourceMetadataLoader.class.getResourceAsStream(metadataFileName); + if (inputStream == null) { + logger.log(Level.WARNING, String.format("File %s not found", metadataFileName)); + } + return inputStream; + } +}
\ No newline at end of file diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/init/MetadataParser.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/init/MetadataParser.java new file mode 100644 index 00000000..2f045232 --- /dev/null +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/init/MetadataParser.java @@ -0,0 +1,110 @@ +/* GENERATED SOURCE. DO NOT MODIFY. */ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.i18n.phonenumbers.metadata.init; + +import com.android.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.android.i18n.phonenumbers.Phonemetadata.PhoneMetadataCollection; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Exposes single method for parsing {@link InputStream} content into {@link Collection} of {@link + * PhoneMetadata} + * @hide This class is not part of the Android public SDK API + */ +public final class MetadataParser { + + private static final Logger logger = Logger.getLogger(MetadataParser.class.getName()); + + /** + * Creates new instance in lenient mode, see {@link MetadataParser#parse(InputStream)} for more + * info. + */ + public static MetadataParser newLenientParser() { + return new MetadataParser(false); + } + + /** + * Creates new instance in strict mode, see {@link MetadataParser#parse(InputStream)} for more + * info + */ + public static MetadataParser newStrictParser() { + return new MetadataParser(true); + } + + private final boolean strictMode; + + private MetadataParser(boolean strictMode) { + this.strictMode = strictMode; + } + + /** + * Parses given {@link InputStream} into a {@link Collection} of {@link PhoneMetadata}. + * + * @throws IllegalArgumentException if {@code source} is {@code null} and strict mode is on + * @return parsed {@link PhoneMetadata}, or empty {@link Collection} if {@code source} is {@code + * null} and lenient mode is on + */ + public Collection<PhoneMetadata> parse(InputStream source) { + if (source == null) { + return handleNullSource(); + } + ObjectInputStream ois = null; + try { + ois = new ObjectInputStream(source); + PhoneMetadataCollection phoneMetadataCollection = new PhoneMetadataCollection(); + phoneMetadataCollection.readExternal(ois); + List<PhoneMetadata> phoneMetadata = phoneMetadataCollection.getMetadataList(); + // Sanity check; this should not happen if provided InputStream is valid + if (phoneMetadata.isEmpty()) { + throw new IllegalStateException("Empty metadata"); + } + return phoneMetadataCollection.getMetadataList(); + } catch (IOException e) { + throw new IllegalStateException("Unable to parse metadata file", e); + } finally { + if (ois != null) { + // This will close all underlying streams as well, including source. + close(ois); + } else { + close(source); + } + } + } + + private List<PhoneMetadata> handleNullSource() { + if (strictMode) { + throw new IllegalArgumentException("Source cannot be null"); + } + return Collections.emptyList(); + } + + private void close(InputStream inputStream) { + try { + inputStream.close(); + } catch (IOException e) { + logger.log(Level.WARNING, "Error closing input stream (ignored)", e); + } + } +}
\ No newline at end of file diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/BlockingMetadataBootstrappingGuard.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/BlockingMetadataBootstrappingGuard.java new file mode 100644 index 00000000..ddb2fb9f --- /dev/null +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/BlockingMetadataBootstrappingGuard.java @@ -0,0 +1,79 @@ +/* GENERATED SOURCE. DO NOT MODIFY. */ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.i18n.phonenumbers.metadata.source; + +import com.android.i18n.phonenumbers.MetadataLoader; +import com.android.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.android.i18n.phonenumbers.metadata.init.MetadataParser; +import java.io.InputStream; +import java.util.Collection; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * A blocking implementation of {@link MetadataBootstrappingGuard}. Can be used for both single-file + * (bulk) and multi-file metadata + * + * @param <T> needs to extend {@link MetadataContainer} + */ +final class BlockingMetadataBootstrappingGuard<T extends MetadataContainer> + implements MetadataBootstrappingGuard<T> { + + private final MetadataLoader metadataLoader; + private final MetadataParser metadataParser; + private final T metadataContainer; + private final Map<String, String> loadedFiles; // identity map + + BlockingMetadataBootstrappingGuard( + MetadataLoader metadataLoader, MetadataParser metadataParser, T metadataContainer) { + this.metadataLoader = metadataLoader; + this.metadataParser = metadataParser; + this.metadataContainer = metadataContainer; + this.loadedFiles = new ConcurrentHashMap<>(); + } + + @Override + public T getOrBootstrap(String phoneMetadataFile) { + if (!loadedFiles.containsKey(phoneMetadataFile)) { + bootstrapMetadata(phoneMetadataFile); + } + return metadataContainer; + } + + private synchronized void bootstrapMetadata(String phoneMetadataFile) { + // Additional check is needed because multiple threads could pass the first check when calling + // getOrBootstrap() at the same time for unloaded metadata file + if (loadedFiles.containsKey(phoneMetadataFile)) { + return; + } + Collection<PhoneMetadata> phoneMetadata = read(phoneMetadataFile); + for (PhoneMetadata metadata : phoneMetadata) { + metadataContainer.accept(metadata); + } + loadedFiles.put(phoneMetadataFile, phoneMetadataFile); + } + + private Collection<PhoneMetadata> read(String phoneMetadataFile) { + try { + InputStream metadataStream = metadataLoader.loadMetadata(phoneMetadataFile); + return metadataParser.parse(metadataStream); + } catch (IllegalArgumentException | IllegalStateException e) { + throw new IllegalStateException("Failed to read file " + phoneMetadataFile, e); + } + } +} diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/CompositeMetadataContainer.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/CompositeMetadataContainer.java new file mode 100644 index 00000000..93d52a18 --- /dev/null +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/CompositeMetadataContainer.java @@ -0,0 +1,70 @@ +/* GENERATED SOURCE. DO NOT MODIFY. */ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.i18n.phonenumbers.metadata.source; + +import com.android.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.android.i18n.phonenumbers.internal.GeoEntityUtility; + +/** + * Implementation of {@link MetadataContainer} which is a composition of different {@link + * MapBackedMetadataContainer}s. It adds items to a single simpler container at a time depending on + * the content of {@link PhoneMetadata}. + */ +final class CompositeMetadataContainer implements MetadataContainer { + + private final MapBackedMetadataContainer<Integer> metadataByCountryCode = + MapBackedMetadataContainer.byCountryCallingCode(); + private final MapBackedMetadataContainer<String> metadataByRegionCode = + MapBackedMetadataContainer.byRegionCode(); + + /** + * Intended to be called for geographical regions only. For non-geographical entities, use {@link + * CompositeMetadataContainer#getMetadataBy(int)} + */ + PhoneMetadata getMetadataBy(String regionCode) { + return metadataByRegionCode.getMetadataBy(regionCode); + } + + /** + * Intended to be called for non-geographical entities only, such as 800 (country code assigned to + * the Universal International Freephone Service). For geographical regions, use {@link + * CompositeMetadataContainer#getMetadataBy(String)} + */ + PhoneMetadata getMetadataBy(int countryCallingCode) { + return metadataByCountryCode.getMetadataBy(countryCallingCode); + } + + /** + * If the metadata belongs to a specific geographical region (it has a region code other than + * {@link GeoEntityUtility#REGION_CODE_FOR_NON_GEO_ENTITIES}), it will be added to a {@link + * MapBackedMetadataContainer} which stores metadata by region code. Otherwise, it will be added + * to a {@link MapBackedMetadataContainer} which stores metadata by country calling code. This + * means that {@link CompositeMetadataContainer#getMetadataBy(int)} will not work for country + * calling codes such as 41 (country calling code for Switzerland), only for country calling codes + * such as 800 (country code assigned to the Universal International Freephone Service) + */ + @Override + public void accept(PhoneMetadata phoneMetadata) { + String regionCode = metadataByRegionCode.getKeyProvider().getKeyOf(phoneMetadata); + if (GeoEntityUtility.isGeoEntity(regionCode)) { + metadataByRegionCode.accept(phoneMetadata); + } else { + metadataByCountryCode.accept(phoneMetadata); + } + } +} diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/FormattingMetadataSource.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/FormattingMetadataSource.java new file mode 100644 index 00000000..0638eb7a --- /dev/null +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/FormattingMetadataSource.java @@ -0,0 +1,39 @@ +/* GENERATED SOURCE. DO NOT MODIFY. */ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.i18n.phonenumbers.metadata.source; + +import com.android.i18n.phonenumbers.Phonemetadata.PhoneMetadata; + +/** A source of formatting phone metadata. + * @hide This class is not part of the Android public SDK API*/ +public interface FormattingMetadataSource { + + /** + * Returns formatting phone metadata for provided country calling code. + * + * <p>This method is similar to the one in {@link + * NonGeographicalEntityMetadataSource#getMetadataForNonGeographicalRegion(int)}, except that it + * will not fail for geographical regions, it can be used for both geo- and non-geo entities. + * + * <p>In case the provided {@code countryCallingCode} maps to several different regions, only one + * would contain formatting metadata. + * + * @return the phone metadata for provided {@code countryCallingCode}, or null if there is none. + */ + PhoneMetadata getFormattingMetadataForCountryCallingCode(int countryCallingCode); +} diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/FormattingMetadataSourceImpl.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/FormattingMetadataSourceImpl.java new file mode 100644 index 00000000..b2c806be --- /dev/null +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/FormattingMetadataSourceImpl.java @@ -0,0 +1,59 @@ +/* GENERATED SOURCE. DO NOT MODIFY. */ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.i18n.phonenumbers.metadata.source; + +import com.android.i18n.phonenumbers.MetadataLoader; +import com.android.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.android.i18n.phonenumbers.metadata.init.MetadataParser; + +/** + * Implementation of {@link FormattingMetadataSource} guarded by {@link MetadataBootstrappingGuard} + * + * <p>By default, a {@link BlockingMetadataBootstrappingGuard} will be used, but any custom + * implementation can be injected. + * @hide This class is not part of the Android public SDK API + */ +public final class FormattingMetadataSourceImpl implements FormattingMetadataSource { + + private final PhoneMetadataFileNameProvider phoneMetadataFileNameProvider; + private final MetadataBootstrappingGuard<MapBackedMetadataContainer<Integer>> bootstrappingGuard; + + public FormattingMetadataSourceImpl( + PhoneMetadataFileNameProvider phoneMetadataFileNameProvider, + MetadataBootstrappingGuard<MapBackedMetadataContainer<Integer>> bootstrappingGuard) { + this.phoneMetadataFileNameProvider = phoneMetadataFileNameProvider; + this.bootstrappingGuard = bootstrappingGuard; + } + + public FormattingMetadataSourceImpl( + PhoneMetadataFileNameProvider phoneMetadataFileNameProvider, + MetadataLoader metadataLoader, + MetadataParser metadataParser) { + this( + phoneMetadataFileNameProvider, + new BlockingMetadataBootstrappingGuard<>( + metadataLoader, metadataParser, MapBackedMetadataContainer.byCountryCallingCode())); + } + + @Override + public PhoneMetadata getFormattingMetadataForCountryCallingCode(int countryCallingCode) { + return bootstrappingGuard + .getOrBootstrap(phoneMetadataFileNameProvider.getFor(countryCallingCode)) + .getMetadataBy(countryCallingCode); + } +} diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/MapBackedMetadataContainer.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/MapBackedMetadataContainer.java new file mode 100644 index 00000000..5183984f --- /dev/null +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/MapBackedMetadataContainer.java @@ -0,0 +1,75 @@ +/* GENERATED SOURCE. DO NOT MODIFY. */ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.i18n.phonenumbers.metadata.source; + +import com.android.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * A {@link MetadataContainer} implementation backed by a {@link ConcurrentHashMap} with generic + * keys. + */ +final class MapBackedMetadataContainer<T> implements MetadataContainer { + + static MapBackedMetadataContainer<String> byRegionCode() { + return new MapBackedMetadataContainer<>( + new KeyProvider<String>() { + @Override + public String getKeyOf(PhoneMetadata phoneMetadata) { + return phoneMetadata.getId(); + } + }); + } + + static MapBackedMetadataContainer<Integer> byCountryCallingCode() { + return new MapBackedMetadataContainer<>( + new KeyProvider<Integer>() { + @Override + public Integer getKeyOf(PhoneMetadata phoneMetadata) { + return phoneMetadata.getCountryCode(); + } + }); + } + + private final ConcurrentMap<T, PhoneMetadata> metadataMap; + + private final KeyProvider<T> keyProvider; + + private MapBackedMetadataContainer(KeyProvider<T> keyProvider) { + this.metadataMap = new ConcurrentHashMap<>(); + this.keyProvider = keyProvider; + } + + PhoneMetadata getMetadataBy(T key) { + return key != null ? metadataMap.get(key) : null; + } + + KeyProvider<T> getKeyProvider() { + return keyProvider; + } + + @Override + public void accept(PhoneMetadata phoneMetadata) { + metadataMap.put(keyProvider.getKeyOf(phoneMetadata), phoneMetadata); + } + + interface KeyProvider<T> { + T getKeyOf(PhoneMetadata phoneMetadata); + } +} diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/MetadataBootstrappingGuard.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/MetadataBootstrappingGuard.java new file mode 100644 index 00000000..770bfb3b --- /dev/null +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/MetadataBootstrappingGuard.java @@ -0,0 +1,37 @@ +/* GENERATED SOURCE. DO NOT MODIFY. */ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.i18n.phonenumbers.metadata.source; + +/** + * Guard that ensures that metadata bootstrapping process (loading and parsing) is triggered only + * once per metadata file. + * + * @param <T> needs to extend {@link MetadataContainer} + * @hide This class is not part of the Android public SDK API + */ +public interface MetadataBootstrappingGuard<T extends MetadataContainer> { + + /** + * If metadata from the provided file has not yet been read, invokes loading and parsing from the + * provided file and adds the result to guarded {@link MetadataContainer}. + * + * @param phoneMetadataFile to read from + * @return guarded {@link MetadataContainer} + */ + T getOrBootstrap(String phoneMetadataFile); +} diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/MetadataSource.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/MetadataContainer.java index 0e338a89..e5aacd7e 100644 --- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/MetadataSource.java +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/MetadataContainer.java @@ -1,6 +1,6 @@ /* GENERATED SOURCE. DO NOT MODIFY. */ /* - * Copyright (C) 2015 The Libphonenumber Authors + * Copyright (C) 2022 The Libphonenumber Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,26 +15,19 @@ * limitations under the License. */ -package com.android.i18n.phonenumbers; +package com.android.i18n.phonenumbers.metadata.source; import com.android.i18n.phonenumbers.Phonemetadata.PhoneMetadata; /** - * A source for phone metadata for all regions. + * A container for {@link PhoneMetadata} */ -interface MetadataSource { +interface MetadataContainer { /** - * Gets phone metadata for a region. - * @param regionCode the region code. - * @return the phone metadata for that region, or null if there is none. + * Adds {@link PhoneMetadata} to the container. It depends on the implementation of the interface + * what this means, for example {@link MapBackedMetadataContainer} simply adds the provided + * metadata into the backing map. Implementing classes should ensure thread-safety. */ - PhoneMetadata getMetadataForRegion(String regionCode); - - /** - * Gets phone metadata for a non-geographical region. - * @param countryCallingCode the country calling code. - * @return the phone metadata for that region, or null if there is none. - */ - PhoneMetadata getMetadataForNonGeographicalRegion(int countryCallingCode); + void accept(PhoneMetadata phoneMetadata); } diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/MetadataSource.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/MetadataSource.java new file mode 100644 index 00000000..cd377d84 --- /dev/null +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/MetadataSource.java @@ -0,0 +1,23 @@ +/* GENERATED SOURCE. DO NOT MODIFY. */ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.i18n.phonenumbers.metadata.source; + +/** A source of phone metadata split by different regions. + * @hide This class is not part of the Android public SDK API*/ +public interface MetadataSource extends RegionMetadataSource, NonGeographicalEntityMetadataSource { +} diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/MetadataSourceImpl.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/MetadataSourceImpl.java new file mode 100644 index 00000000..e2b97b0b --- /dev/null +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/MetadataSourceImpl.java @@ -0,0 +1,74 @@ +/* GENERATED SOURCE. DO NOT MODIFY. */ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.i18n.phonenumbers.metadata.source; + +import com.android.i18n.phonenumbers.MetadataLoader; +import com.android.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.android.i18n.phonenumbers.internal.GeoEntityUtility; +import com.android.i18n.phonenumbers.metadata.init.MetadataParser; + +/** + * Implementation of {@link MetadataSource} guarded by {@link MetadataBootstrappingGuard}. + * + * <p>By default, a {@link BlockingMetadataBootstrappingGuard} will be used, but any custom + * implementation can be injected. + * @hide This class is not part of the Android public SDK API + */ +public final class MetadataSourceImpl implements MetadataSource { + + private final PhoneMetadataFileNameProvider phoneMetadataFileNameProvider; + private final MetadataBootstrappingGuard<CompositeMetadataContainer> bootstrappingGuard; + + public MetadataSourceImpl( + PhoneMetadataFileNameProvider phoneMetadataFileNameProvider, + MetadataBootstrappingGuard<CompositeMetadataContainer> bootstrappingGuard) { + this.phoneMetadataFileNameProvider = phoneMetadataFileNameProvider; + this.bootstrappingGuard = bootstrappingGuard; + } + + public MetadataSourceImpl( + PhoneMetadataFileNameProvider phoneMetadataFileNameProvider, + MetadataLoader metadataLoader, + MetadataParser metadataParser) { + this( + phoneMetadataFileNameProvider, + new BlockingMetadataBootstrappingGuard<>( + metadataLoader, metadataParser, new CompositeMetadataContainer())); + } + + @Override + public PhoneMetadata getMetadataForNonGeographicalRegion(int countryCallingCode) { + if (GeoEntityUtility.isGeoEntity(countryCallingCode)) { + throw new IllegalArgumentException( + countryCallingCode + " calling code belongs to a geo entity"); + } + return bootstrappingGuard + .getOrBootstrap(phoneMetadataFileNameProvider.getFor(countryCallingCode)) + .getMetadataBy(countryCallingCode); + } + + @Override + public PhoneMetadata getMetadataForRegion(String regionCode) { + if (!GeoEntityUtility.isGeoEntity(regionCode)) { + throw new IllegalArgumentException(regionCode + " region code is a non-geo entity"); + } + return bootstrappingGuard + .getOrBootstrap(phoneMetadataFileNameProvider.getFor(regionCode)) + .getMetadataBy(regionCode); + } +} diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProvider.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProvider.java new file mode 100644 index 00000000..b8ee7c91 --- /dev/null +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProvider.java @@ -0,0 +1,44 @@ +/* GENERATED SOURCE. DO NOT MODIFY. */ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.i18n.phonenumbers.metadata.source; + +import java.util.regex.Pattern; + +/** + * {@link PhoneMetadataFileNameProvider} implementation which appends key as a suffix to the + * predefined metadata file name base. + * @hide This class is not part of the Android public SDK API + */ +public final class MultiFileModeFileNameProvider implements PhoneMetadataFileNameProvider { + + private final String phoneMetadataFileNamePrefix; + private static final Pattern ALPHANUMERIC = Pattern.compile("^[\\p{L}\\p{N}]+$"); + + public MultiFileModeFileNameProvider(String phoneMetadataFileNameBase) { + this.phoneMetadataFileNamePrefix = phoneMetadataFileNameBase + "_"; + } + + @Override + public String getFor(Object key) { + String keyAsString = key.toString(); + if (!ALPHANUMERIC.matcher(keyAsString).matches()) { + throw new IllegalArgumentException("Invalid key: " + keyAsString); + } + return phoneMetadataFileNamePrefix + key; + } +} diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/NonGeographicalEntityMetadataSource.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/NonGeographicalEntityMetadataSource.java new file mode 100644 index 00000000..a7dbbef1 --- /dev/null +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/NonGeographicalEntityMetadataSource.java @@ -0,0 +1,49 @@ +/* GENERATED SOURCE. DO NOT MODIFY. */ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.i18n.phonenumbers.metadata.source; + +import com.android.i18n.phonenumbers.Phonemetadata.PhoneMetadata; + +/** + * A source of phone metadata for non-geographical entities. + * + * <p>Non-geographical entities are phone number ranges that have a country calling code, but either + * do not belong to an actual country (some international services), or belong to a region which has + * a different country calling code from the country it is part of. Examples of such ranges are + * those starting with: + * + * <ul> + * <li>800 - country code assigned to the Universal International Freephone Service + * <li>808 - country code assigned to the International Shared Cost Service + * <li>870 - country code assigned to the Pitcairn Islands + * <li>... + * </ul> + * @hide This class is not part of the Android public SDK API + */ +public interface NonGeographicalEntityMetadataSource { + + /** + * Gets phone metadata for a non-geographical entity. + * + * @param countryCallingCode the country calling code. + * @return the phone metadata for that entity, or null if there is none. + * @throws IllegalArgumentException if provided {@code countryCallingCode} does not belong to a + * non-geographical entity + */ + PhoneMetadata getMetadataForNonGeographicalRegion(int countryCallingCode); +} diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/PhoneMetadataFileNameProvider.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/PhoneMetadataFileNameProvider.java new file mode 100644 index 00000000..55e0849d --- /dev/null +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/PhoneMetadataFileNameProvider.java @@ -0,0 +1,38 @@ +/* GENERATED SOURCE. DO NOT MODIFY. */ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.i18n.phonenumbers.metadata.source; + +/** + * Abstraction responsible for inferring the metadata file name. + * + * <p>Two implementations are available: + * + * <ul> + * <li>{@link SingleFileModeFileNameProvider} for single-file metadata. + * <li>{@link MultiFileModeFileNameProvider} for multi-file metadata. + * </ul> + * @hide This class is not part of the Android public SDK API + */ +public interface PhoneMetadataFileNameProvider { + + /** + * Returns phone metadata file path for the given key. Assumes that key.toString() is + * well-defined. + */ + String getFor(Object key); +} diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/RegionMetadataSource.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/RegionMetadataSource.java new file mode 100644 index 00000000..bc80dea3 --- /dev/null +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/RegionMetadataSource.java @@ -0,0 +1,42 @@ +/* GENERATED SOURCE. DO NOT MODIFY. */ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.i18n.phonenumbers.metadata.source; + +import com.android.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.android.i18n.phonenumbers.internal.GeoEntityUtility; + +/** + * A source of phone metadata split by geographical regions. + * @hide This class is not part of the Android public SDK API + */ +public interface RegionMetadataSource { + + /** + * Returns phone metadata for provided geographical region. + * + * <p>The {@code regionCode} must be different from {@link + * GeoEntityUtility#REGION_CODE_FOR_NON_GEO_ENTITIES}, which has a special meaning and is used to + * mark non-geographical regions (see {@link NonGeographicalEntityMetadataSource} for more + * information). + * + * @return the phone metadata for provided {@code regionCode}, or null if there is none. + * @throws IllegalArgumentException if provided {@code regionCode} is {@link + * GeoEntityUtility#REGION_CODE_FOR_NON_GEO_ENTITIES} + */ + PhoneMetadata getMetadataForRegion(String regionCode); +} diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/RegionMetadataSourceImpl.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/RegionMetadataSourceImpl.java new file mode 100644 index 00000000..95f009fb --- /dev/null +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/RegionMetadataSourceImpl.java @@ -0,0 +1,64 @@ +/* GENERATED SOURCE. DO NOT MODIFY. */ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.i18n.phonenumbers.metadata.source; + +import com.android.i18n.phonenumbers.MetadataLoader; +import com.android.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.android.i18n.phonenumbers.internal.GeoEntityUtility; +import com.android.i18n.phonenumbers.metadata.init.MetadataParser; + +/** + * Implementation of {@link RegionMetadataSource} guarded by {@link MetadataBootstrappingGuard} + * + * <p>By default, a {@link BlockingMetadataBootstrappingGuard} will be used, but any custom + * implementation can be injected. + * @hide This class is not part of the Android public SDK API + */ +public final class RegionMetadataSourceImpl implements RegionMetadataSource { + + private final PhoneMetadataFileNameProvider phoneMetadataFileNameProvider; + private final MetadataBootstrappingGuard<MapBackedMetadataContainer<String>> + bootstrappingGuard; + + public RegionMetadataSourceImpl( + PhoneMetadataFileNameProvider phoneMetadataFileNameProvider, + MetadataBootstrappingGuard<MapBackedMetadataContainer<String>> bootstrappingGuard) { + this.phoneMetadataFileNameProvider = phoneMetadataFileNameProvider; + this.bootstrappingGuard = bootstrappingGuard; + } + + public RegionMetadataSourceImpl( + PhoneMetadataFileNameProvider phoneMetadataFileNameProvider, + MetadataLoader metadataLoader, + MetadataParser metadataParser) { + this( + phoneMetadataFileNameProvider, + new BlockingMetadataBootstrappingGuard<>( + metadataLoader, metadataParser, MapBackedMetadataContainer.byRegionCode())); + } + + @Override + public PhoneMetadata getMetadataForRegion(String regionCode) { + if (!GeoEntityUtility.isGeoEntity(regionCode)) { + throw new IllegalArgumentException(regionCode + " region code is a non-geo entity"); + } + return bootstrappingGuard + .getOrBootstrap(phoneMetadataFileNameProvider.getFor(regionCode)) + .getMetadataBy(regionCode); + } +} diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/SingleFileModeFileNameProvider.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/SingleFileModeFileNameProvider.java new file mode 100644 index 00000000..52566dc7 --- /dev/null +++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/metadata/source/SingleFileModeFileNameProvider.java @@ -0,0 +1,37 @@ +/* GENERATED SOURCE. DO NOT MODIFY. */ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.i18n.phonenumbers.metadata.source; + +/** + * {@link PhoneMetadataFileNameProvider} implementation that returns the same metadata file name for + * each key + * @hide This class is not part of the Android public SDK API + */ +public final class SingleFileModeFileNameProvider implements PhoneMetadataFileNameProvider { + + private final String phoneMetadataFileName; + + public SingleFileModeFileNameProvider(String phoneMetadataFileName) { + this.phoneMetadataFileName = phoneMetadataFileName; + } + + @Override + public String getFor(Object key) { + return phoneMetadataFileName; + } +} |