phonelib 0.5.2 → 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/README.rdoc +8 -0
  3. data/data/extended_data.dat +0 -0
  4. data/data/libphonenumber/README.md +1 -1
  5. data/data/libphonenumber/cpp/src/phonenumbers/lite_metadata.cc +9888 -9854
  6. data/data/libphonenumber/cpp/src/phonenumbers/metadata.cc +9798 -9762
  7. data/data/libphonenumber/cpp/src/phonenumbers/phonenumberutil.cc +6 -6
  8. data/data/libphonenumber/cpp/src/phonenumbers/short_metadata.cc +2495 -2494
  9. data/data/libphonenumber/debian/control +9 -7
  10. data/data/libphonenumber/debian/{libphonenumber6-dev.install → libphonenumber7-dev.install} +0 -0
  11. data/data/libphonenumber/debian/{libphonenumber6-java.jlibs → libphonenumber7-java.jlibs} +0 -0
  12. data/data/libphonenumber/debian/{libphonenumber6-java.poms → libphonenumber7-java.poms} +0 -0
  13. data/data/libphonenumber/debian/{libphonenumber6.install → libphonenumber7.install} +0 -0
  14. data/data/libphonenumber/debian/rules +2 -2
  15. data/data/libphonenumber/java/carrier/pom.xml +4 -4
  16. data/data/libphonenumber/java/carrier/src/com/google/i18n/phonenumbers/carrier/data/1246_en +0 -0
  17. data/data/libphonenumber/java/carrier/src/com/google/i18n/phonenumbers/carrier/data/245_en +0 -0
  18. data/data/libphonenumber/java/carrier/src/com/google/i18n/phonenumbers/carrier/data/252_en +0 -0
  19. data/data/libphonenumber/java/carrier/src/com/google/i18n/phonenumbers/carrier/data/373_en +0 -0
  20. data/data/libphonenumber/java/carrier/src/com/google/i18n/phonenumbers/carrier/data/62_en +0 -0
  21. data/data/libphonenumber/java/carrier/src/com/google/i18n/phonenumbers/carrier/data/678_en +0 -0
  22. data/data/libphonenumber/java/carrier/src/com/google/i18n/phonenumbers/carrier/data/880_en +0 -0
  23. data/data/libphonenumber/java/carrier/src/com/google/i18n/phonenumbers/carrier/data/968_en +0 -0
  24. data/data/libphonenumber/java/carrier/src/com/google/i18n/phonenumbers/carrier/data/98_en +0 -0
  25. data/data/libphonenumber/java/demo/pom.xml +5 -5
  26. data/data/libphonenumber/java/geocoder/pom.xml +4 -4
  27. data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/245_en +0 -0
  28. data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/245_pt +0 -0
  29. data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/968_en +0 -0
  30. data/data/libphonenumber/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/config +0 -0
  31. data/data/libphonenumber/java/internal/prefixmapper/pom.xml +3 -3
  32. data/data/libphonenumber/java/libphonenumber/pom.xml +4 -2
  33. data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/MetadataSource.java +1 -1
  34. data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/MultiFileMetadataSourceImpl.java +7 -10
  35. data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java +6 -4
  36. data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/SingleFileMetadataSourceImpl.java +82 -30
  37. data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT +0 -0
  38. data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB +0 -0
  39. data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR +0 -0
  40. data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS +0 -0
  41. data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GW +0 -0
  42. data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HT +0 -0
  43. data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID +0 -0
  44. data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR +0 -0
  45. data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW +0 -0
  46. data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MC +0 -0
  47. data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD +0 -0
  48. data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_OM +0 -0
  49. data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA +0 -0
  50. data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO +0 -0
  51. data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT +0 -0
  52. data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VU +0 -0
  53. data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BB +0 -0
  54. data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NO +0 -0
  55. data/data/libphonenumber/java/libphonenumber/src/com/google/i18n/phonenumbers/data/SingleFilePhoneNumberMetadataProto +0 -0
  56. data/data/libphonenumber/java/libphonenumber/test/com/google/i18n/phonenumbers/MultiFileMetadataSourceImplTest.java +10 -14
  57. data/data/libphonenumber/java/libphonenumber/test/com/google/i18n/phonenumbers/SingleFileMetadataSourceImplTest.java +40 -0
  58. data/data/libphonenumber/java/libphonenumber/test/com/google/i18n/phonenumbers/TestMetadataTestCase.java +1 -1
  59. data/data/libphonenumber/java/pom.xml +1 -1
  60. data/data/libphonenumber/java/release_notes.txt +19 -0
  61. data/data/libphonenumber/javascript/i18n/phonenumbers/demo-compiled.js +108 -106
  62. data/data/libphonenumber/javascript/i18n/phonenumbers/metadata.js +37 -34
  63. data/data/libphonenumber/javascript/i18n/phonenumbers/metadatalite.js +37 -34
  64. data/data/libphonenumber/resources/PhoneNumberMetadata.xml +199 -91
  65. data/data/libphonenumber/resources/ShortNumberMetadata.xml +20 -9
  66. data/data/libphonenumber/resources/carrier/en/1.txt +8 -0
  67. data/data/libphonenumber/resources/carrier/en/245.txt +4 -2
  68. data/data/libphonenumber/resources/carrier/en/252.txt +8 -0
  69. data/data/libphonenumber/resources/carrier/en/373.txt +1 -0
  70. data/data/libphonenumber/resources/carrier/en/62.txt +1 -0
  71. data/data/libphonenumber/resources/carrier/en/678.txt +4 -0
  72. data/data/libphonenumber/resources/carrier/en/968.txt +10 -4
  73. data/data/libphonenumber/resources/carrier/en/98.txt +1 -0
  74. data/data/libphonenumber/resources/geocoding/en/245.txt +22 -20
  75. data/data/libphonenumber/resources/geocoding/en/968.txt +18 -0
  76. data/data/libphonenumber/tools/java/cpp-build/target/cpp-build-1.0-SNAPSHOT-jar-with-dependencies.jar +0 -0
  77. data/data/libphonenumber/tools/java/java-build/target/java-build-1.0-SNAPSHOT-jar-with-dependencies.jar +0 -0
  78. data/data/phone_data.dat +0 -0
  79. data/lib/phonelib/core.rb +26 -0
  80. data/lib/phonelib/phone.rb +20 -2
  81. data/lib/phonelib/phone_analyzer_helper.rb +1 -0
  82. data/lib/phonelib/version.rb +1 -1
  83. data/lib/validators/phone_validator.rb +5 -1
  84. metadata +23 -6
@@ -28,15 +28,17 @@ Build-Depends: cdbs,
28
28
  libprotobuf-java,
29
29
  libservlet2.5-java,
30
30
  libservlet2.5-java-doc
31
- Standards-Version: 3.9.5
31
+ Standards-Version: 3.9.6
32
32
  Section: libs
33
33
  Homepage: https://github.com/googlei18n/libphonenumber/
34
- Vcs-Browser: https://github.com/googlei18n/libphonenumber/
35
- Vcs-Git: https://github.com/googlei18n/libphonenumber.git
34
+ Vcs-Browser: https://anonscm.debian.org/cgit/collab-maint/libphonenumber.git/
35
+ Vcs-Git: git://anonscm.debian.org/collab-maint/libphonenumber.git
36
36
 
37
- Package: libphonenumber6-java
37
+ Package: libphonenumber7-java
38
38
  Section: java
39
39
  Architecture: all
40
+ Conflicts: libphonenumber6-java
41
+ Replaces: libphonenumber6-java
40
42
  Depends: ${misc:Depends}, ${maven:Depends}
41
43
  Recommends: ${maven:OptionalDepends}
42
44
  Description: parsing/formatting/validating phone numbers - java
@@ -45,13 +47,13 @@ Description: parsing/formatting/validating phone numbers - java
45
47
  .
46
48
  This package contains the runtime library JARs for Java users.
47
49
 
48
- Package: libphonenumber6-dev
50
+ Package: libphonenumber7-dev
49
51
  Section: libdevel
50
52
  Architecture: any
51
53
  Provides: libphonenumber-dev
52
54
  Conflicts: libphonenumber-dev
53
55
  Replaces: libphonenumber-dev
54
- Depends: libphonenumber6 (=${binary:Version}), ${misc:Depends},
56
+ Depends: libphonenumber7 (=${binary:Version}), ${misc:Depends},
55
57
  libboost-dev (>= 1.40),
56
58
  libboost-system-dev (>= 1.40),
57
59
  libboost-thread-dev (>= 1.40),
@@ -62,7 +64,7 @@ Description: parsing/formatting/validating phone numbers - development files
62
64
  .
63
65
  This package contains the static libraries and include files.
64
66
 
65
- Package: libphonenumber6
67
+ Package: libphonenumber7
66
68
  Architecture: any
67
69
  Pre-Depends: ${misc:Pre-Depends}
68
70
  Depends: ${shlibs:Depends}, ${misc:Depends}
@@ -53,7 +53,7 @@ endif
53
53
  # dh $@ --with javahelper
54
54
 
55
55
  #override_dh_auto_configure:
56
- configure/libphonenumber6::
56
+ configure/libphonenumber7::
57
57
  mkdir -p $(CPP_BUILD) && cd $(CPP_BUILD) && $(CMAKE) $(CMAKE_FLAGS) ..
58
58
 
59
59
  #override_dh_auto_build:
@@ -61,7 +61,7 @@ configure/libphonenumber6::
61
61
  # mkdir java/lib
62
62
  # ln -s /usr/share/java/junit4.jar java/lib/junit-4.8.1.jar
63
63
  # $(ANT) -f $(JAVA_BUILD).xml jar
64
- build/libphonenumber6::
64
+ build/libphonenumber7::
65
65
  ln -sf cpp-build-1.0-SNAPSHOT.jar tools/java/cpp-build/target/cpp-build-1.0-SNAPSHOT-jar-with-dependencies.jar
66
66
  ln -sf /usr/share/java/protobuf.jar tools/java/cpp-build/target/protobuf-java-debian.jar
67
67
  $(MAKE) -C $(CPP_BUILD) phonenumber phonenumber-shared
@@ -3,14 +3,14 @@
3
3
  <modelVersion>4.0.0</modelVersion>
4
4
  <groupId>com.googlecode.libphonenumber</groupId>
5
5
  <artifactId>carrier</artifactId>
6
- <version>1.18-SNAPSHOT</version>
6
+ <version>1.20-SNAPSHOT</version>
7
7
  <packaging>jar</packaging>
8
8
  <url>https://github.com/googlei18n/libphonenumber/</url>
9
9
 
10
10
  <parent>
11
11
  <groupId>com.googlecode.libphonenumber</groupId>
12
12
  <artifactId>libphonenumber-parent</artifactId>
13
- <version>7.0.12-SNAPSHOT</version>
13
+ <version>7.1.2-SNAPSHOT</version>
14
14
  </parent>
15
15
 
16
16
  <build>
@@ -34,12 +34,12 @@
34
34
  <dependency>
35
35
  <groupId>com.googlecode.libphonenumber</groupId>
36
36
  <artifactId>libphonenumber</artifactId>
37
- <version>7.0.12-SNAPSHOT</version>
37
+ <version>7.1.2-SNAPSHOT</version>
38
38
  </dependency>
39
39
  <dependency>
40
40
  <groupId>com.googlecode.libphonenumber</groupId>
41
41
  <artifactId>prefixmapper</artifactId>
42
- <version>2.28-SNAPSHOT</version>
42
+ <version>2.30-SNAPSHOT</version>
43
43
  </dependency>
44
44
  </dependencies>
45
45
 
@@ -4,11 +4,11 @@
4
4
  <parent>
5
5
  <artifactId>libphonenumber-parent</artifactId>
6
6
  <groupId>com.googlecode.libphonenumber</groupId>
7
- <version>7.0.12-SNAPSHOT</version>
7
+ <version>7.1.2-SNAPSHOT</version>
8
8
  </parent>
9
9
  <groupId>com.googlecode.libphonenumber</groupId>
10
10
  <artifactId>demo</artifactId>
11
- <version>7.0.12-SNAPSHOT</version>
11
+ <version>7.1.2-SNAPSHOT</version>
12
12
 
13
13
  <properties>
14
14
  <gae.version>1.5.4</gae.version>
@@ -43,17 +43,17 @@
43
43
  <dependency>
44
44
  <groupId>com.googlecode.libphonenumber</groupId>
45
45
  <artifactId>libphonenumber</artifactId>
46
- <version>7.0.12-SNAPSHOT</version>
46
+ <version>7.1.2-SNAPSHOT</version>
47
47
  </dependency>
48
48
  <dependency>
49
49
  <groupId>com.googlecode.libphonenumber</groupId>
50
50
  <artifactId>geocoder</artifactId>
51
- <version>2.28-SNAPSHOT</version>
51
+ <version>2.30-SNAPSHOT</version>
52
52
  </dependency>
53
53
  <dependency>
54
54
  <groupId>com.googlecode.libphonenumber</groupId>
55
55
  <artifactId>carrier</artifactId>
56
- <version>1.18-SNAPSHOT</version>
56
+ <version>1.20-SNAPSHOT</version>
57
57
  </dependency>
58
58
  </dependencies>
59
59
 
@@ -3,14 +3,14 @@
3
3
  <modelVersion>4.0.0</modelVersion>
4
4
  <groupId>com.googlecode.libphonenumber</groupId>
5
5
  <artifactId>geocoder</artifactId>
6
- <version>2.28-SNAPSHOT</version>
6
+ <version>2.30-SNAPSHOT</version>
7
7
  <packaging>jar</packaging>
8
8
  <url>https://github.com/googlei18n/libphonenumber/</url>
9
9
 
10
10
  <parent>
11
11
  <groupId>com.googlecode.libphonenumber</groupId>
12
12
  <artifactId>libphonenumber-parent</artifactId>
13
- <version>7.0.12-SNAPSHOT</version>
13
+ <version>7.1.2-SNAPSHOT</version>
14
14
  </parent>
15
15
 
16
16
  <build>
@@ -42,12 +42,12 @@
42
42
  <dependency>
43
43
  <groupId>com.googlecode.libphonenumber</groupId>
44
44
  <artifactId>libphonenumber</artifactId>
45
- <version>7.0.12-SNAPSHOT</version>
45
+ <version>7.1.2-SNAPSHOT</version>
46
46
  </dependency>
47
47
  <dependency>
48
48
  <groupId>com.googlecode.libphonenumber</groupId>
49
49
  <artifactId>prefixmapper</artifactId>
50
- <version>2.28-SNAPSHOT</version>
50
+ <version>2.30-SNAPSHOT</version>
51
51
  </dependency>
52
52
  </dependencies>
53
53
 
@@ -3,14 +3,14 @@
3
3
  <modelVersion>4.0.0</modelVersion>
4
4
  <groupId>com.googlecode.libphonenumber</groupId>
5
5
  <artifactId>prefixmapper</artifactId>
6
- <version>2.28-SNAPSHOT</version>
6
+ <version>2.30-SNAPSHOT</version>
7
7
  <packaging>jar</packaging>
8
8
  <url>https://github.com/googlei18n/libphonenumber/</url>
9
9
 
10
10
  <parent>
11
11
  <groupId>com.googlecode.libphonenumber</groupId>
12
12
  <artifactId>libphonenumber-parent</artifactId>
13
- <version>7.0.12-SNAPSHOT</version>
13
+ <version>7.1.2-SNAPSHOT</version>
14
14
  <relativePath>../../pom.xml</relativePath>
15
15
  </parent>
16
16
 
@@ -29,7 +29,7 @@
29
29
  <dependency>
30
30
  <groupId>com.googlecode.libphonenumber</groupId>
31
31
  <artifactId>libphonenumber</artifactId>
32
- <version>7.0.12-SNAPSHOT</version>
32
+ <version>7.1.2-SNAPSHOT</version>
33
33
  </dependency>
34
34
  </dependencies>
35
35
 
@@ -3,14 +3,14 @@
3
3
  <modelVersion>4.0.0</modelVersion>
4
4
  <groupId>com.googlecode.libphonenumber</groupId>
5
5
  <artifactId>libphonenumber</artifactId>
6
- <version>7.0.12-SNAPSHOT</version>
6
+ <version>7.1.2-SNAPSHOT</version>
7
7
  <packaging>jar</packaging>
8
8
  <url>https://github.com/googlei18n/libphonenumber/</url>
9
9
 
10
10
  <parent>
11
11
  <groupId>com.googlecode.libphonenumber</groupId>
12
12
  <artifactId>libphonenumber-parent</artifactId>
13
- <version>7.0.12-SNAPSHOT</version>
13
+ <version>7.1.2-SNAPSHOT</version>
14
14
  </parent>
15
15
 
16
16
  <build>
@@ -36,6 +36,8 @@
36
36
  <excludes>
37
37
  <exclude>**/SingleFileMetadataSourceImpl.class</exclude>
38
38
  <exclude>**/SingleFileMetadataSourceImpl.java</exclude>
39
+ <exclude>**/SingleFileMetadataSourceImplTest.class</exclude>
40
+ <exclude>**/SingleFileMetadataSourceImplTest.java</exclude>
39
41
  <exclude>**/SingleFilePhoneNumberMetadataProto</exclude>
40
42
  <exclude>**/SingleFilePhoneNumberMetadataProtoForTesting</exclude>
41
43
  </excludes>
@@ -19,7 +19,7 @@ package com.google.i18n.phonenumbers;
19
19
  import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata;
20
20
 
21
21
  /**
22
- * A source for phone metadata from resources.
22
+ * A source for phone metadata for all regions.
23
23
  */
24
24
  interface MetadataSource {
25
25
  /**
@@ -55,14 +55,14 @@ final class MultiFileMetadataSourceImpl implements MetadataSource {
55
55
  Collections.synchronizedMap(new HashMap<Integer, PhoneMetadata>());
56
56
 
57
57
  // The prefix of the metadata files from which region data is loaded.
58
- private final String currentFilePrefix;
58
+ private final String filePrefix;
59
59
 
60
60
  // The metadata loader used to inject alternative metadata sources.
61
61
  private final MetadataLoader metadataLoader;
62
62
 
63
63
  // It is assumed that metadataLoader is not null.
64
- public MultiFileMetadataSourceImpl(String currentFilePrefix, MetadataLoader metadataLoader) {
65
- this.currentFilePrefix = currentFilePrefix;
64
+ public MultiFileMetadataSourceImpl(String filePrefix, MetadataLoader metadataLoader) {
65
+ this.filePrefix = filePrefix;
66
66
  this.metadataLoader = metadataLoader;
67
67
  }
68
68
 
@@ -77,7 +77,7 @@ final class MultiFileMetadataSourceImpl implements MetadataSource {
77
77
  if (!regionToMetadataMap.containsKey(regionCode)) {
78
78
  // The regionCode here will be valid and won't be '001', so we don't need to worry about
79
79
  // what to pass in for the country calling code.
80
- loadMetadataFromFile(currentFilePrefix, regionCode, 0, metadataLoader);
80
+ loadMetadataFromFile(regionCode, 0);
81
81
  }
82
82
  }
83
83
  return regionToMetadataMap.get(regionCode);
@@ -87,16 +87,14 @@ final class MultiFileMetadataSourceImpl implements MetadataSource {
87
87
  public PhoneMetadata getMetadataForNonGeographicalRegion(int countryCallingCode) {
88
88
  synchronized (countryCodeToNonGeographicalMetadataMap) {
89
89
  if (!countryCodeToNonGeographicalMetadataMap.containsKey(countryCallingCode)) {
90
- loadMetadataFromFile(currentFilePrefix, PhoneNumberUtil.REGION_CODE_FOR_NON_GEO_ENTITY,
91
- countryCallingCode, metadataLoader);
90
+ loadMetadataFromFile(PhoneNumberUtil.REGION_CODE_FOR_NON_GEO_ENTITY, countryCallingCode);
92
91
  }
93
92
  }
94
93
  return countryCodeToNonGeographicalMetadataMap.get(countryCallingCode);
95
94
  }
96
95
 
97
96
  // @VisibleForTesting
98
- void loadMetadataFromFile(String filePrefix, String regionCode, int countryCallingCode,
99
- MetadataLoader metadataLoader) {
97
+ void loadMetadataFromFile(String regionCode, int countryCallingCode) {
100
98
  boolean isNonGeoRegion = PhoneNumberUtil.REGION_CODE_FOR_NON_GEO_ENTITY.equals(regionCode);
101
99
  String fileName = filePrefix + "_" +
102
100
  (isNonGeoRegion ? String.valueOf(countryCallingCode) : regionCode);
@@ -131,8 +129,7 @@ final class MultiFileMetadataSourceImpl implements MetadataSource {
131
129
 
132
130
  /**
133
131
  * Loads the metadata protocol buffer from the given stream and closes the stream afterwards. Any
134
- * exceptions that occur while reading the stream are propagated (though exceptions that occur
135
- * when the stream is closed will be ignored).
132
+ * exceptions that occur while reading or closing the stream are ignored.
136
133
  *
137
134
  * @param source the non-null stream from which metadata is to be read.
138
135
  * @return the loaded metadata protocol buffer.
@@ -1639,10 +1639,12 @@ public class PhoneNumberUtil {
1639
1639
  } else {
1640
1640
  // Invalid region entered as country-calling-from (so no metadata was found for it) or the
1641
1641
  // region chosen has multiple international dialling prefixes.
1642
- logger.log(Level.WARNING,
1643
- "Trying to format number from invalid region "
1644
- + regionCallingFrom
1645
- + ". International formatting applied.");
1642
+ if (!isValidRegionCode(regionCallingFrom)) {
1643
+ logger.log(Level.WARNING,
1644
+ "Trying to format number from invalid region "
1645
+ + regionCallingFrom
1646
+ + ". International formatting applied.");
1647
+ }
1646
1648
  prefixNumberWithCountryCallingCode(countryCode,
1647
1649
  PhoneNumberFormat.INTERNATIONAL,
1648
1650
  formattedNumber);
@@ -1,3 +1,19 @@
1
+ /*
2
+ * Copyright (C) 2015 The Libphonenumber Authors
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
1
17
  package com.google.i18n.phonenumbers;
2
18
 
3
19
  import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata;
@@ -7,23 +23,21 @@ import java.io.IOException;
7
23
  import java.io.InputStream;
8
24
  import java.io.ObjectInputStream;
9
25
  import java.util.Collections;
10
- import java.util.EnumMap;
11
26
  import java.util.HashMap;
12
- import java.util.Iterator;
27
+ import java.util.List;
13
28
  import java.util.Map;
14
29
  import java.util.logging.Level;
15
30
  import java.util.logging.Logger;
16
31
 
17
32
  /**
18
- * Implementation of {@link MetadataSource} that reads from a resource file
19
- * during initialization.
33
+ * Implementation of {@link MetadataSource} that reads from a single resource file.
20
34
  */
21
- public final class SingleFileMetadataSourceImpl implements MetadataSource {
35
+ final class SingleFileMetadataSourceImpl implements MetadataSource {
22
36
 
23
37
  private static final Logger logger =
24
38
  Logger.getLogger(SingleFileMetadataSourceImpl.class.getName());
25
39
 
26
- private static final String META_DATA_FILE =
40
+ private static final String META_DATA_FILE_NAME =
27
41
  "/com/google/i18n/phonenumbers/data/SingleFilePhoneNumberMetadataProto";
28
42
 
29
43
  // A mapping from a region code to the PhoneMetadata for that region.
@@ -40,57 +54,95 @@ public final class SingleFileMetadataSourceImpl implements MetadataSource {
40
54
  private final Map<Integer, PhoneMetadata> countryCodeToNonGeographicalMetadataMap =
41
55
  Collections.synchronizedMap(new HashMap<Integer, PhoneMetadata>());
42
56
 
57
+ // The metadata file from which region data is loaded.
58
+ private final String fileName;
59
+
60
+ // The metadata loader used to inject alternative metadata sources.
61
+ private final MetadataLoader metadataLoader;
62
+
63
+ // It is assumed that metadataLoader is not null.
64
+ public SingleFileMetadataSourceImpl(String fileName, MetadataLoader metadataLoader) {
65
+ this.fileName = fileName;
66
+ this.metadataLoader = metadataLoader;
67
+ }
68
+
43
69
  // It is assumed that metadataLoader is not null.
44
70
  public SingleFileMetadataSourceImpl(MetadataLoader metadataLoader) {
45
- InputStream input = metadataLoader.loadMetadata(META_DATA_FILE);
46
- if (input == null) {
47
- throw new IllegalStateException(
48
- "no metadata available for PhoneNumberUtil: " + META_DATA_FILE);
49
- }
50
- PhoneMetadataCollection metadataCollection = loadMetadataAndCloseInput(input);
51
- for (PhoneMetadata metadata : metadataCollection.getMetadataList()) {
52
- String regionCode = metadata.getId();
53
- int countryCallingCode = metadata.getCountryCode();
54
- if (PhoneNumberUtil.REGION_CODE_FOR_NON_GEO_ENTITY.equals(regionCode)) {
55
- countryCodeToNonGeographicalMetadataMap.put(countryCallingCode, metadata);
56
- } else {
57
- regionToMetadataMap.put(regionCode, metadata);
58
- }
59
- }
71
+ this(META_DATA_FILE_NAME, metadataLoader);
60
72
  }
61
73
 
62
74
  @Override
63
75
  public PhoneMetadata getMetadataForRegion(String regionCode) {
76
+ synchronized (regionToMetadataMap) {
77
+ if (!regionToMetadataMap.containsKey(regionCode)) {
78
+ // The regionCode here will be valid and won't be '001', so we don't need to worry about
79
+ // what to pass in for the country calling code.
80
+ loadMetadataFromFile();
81
+ }
82
+ }
64
83
  return regionToMetadataMap.get(regionCode);
65
84
  }
66
85
 
67
86
  @Override
68
87
  public PhoneMetadata getMetadataForNonGeographicalRegion(int countryCallingCode) {
88
+ synchronized (countryCodeToNonGeographicalMetadataMap) {
89
+ if (!countryCodeToNonGeographicalMetadataMap.containsKey(countryCallingCode)) {
90
+ loadMetadataFromFile();
91
+ }
92
+ }
69
93
  return countryCodeToNonGeographicalMetadataMap.get(countryCallingCode);
70
94
  }
71
95
 
96
+ // @VisibleForTesting
97
+ void loadMetadataFromFile() {
98
+ InputStream source = metadataLoader.loadMetadata(fileName);
99
+ if (source == null) {
100
+ logger.log(Level.SEVERE, "missing metadata: " + fileName);
101
+ throw new IllegalStateException("missing metadata: " + fileName);
102
+ }
103
+ ObjectInputStream in = null;
104
+ try {
105
+ in = new ObjectInputStream(source);
106
+ PhoneMetadataCollection metadataCollection = loadMetadataAndCloseInput(in);
107
+ List<PhoneMetadata> metadataList = metadataCollection.getMetadataList();
108
+ if (metadataList.isEmpty()) {
109
+ logger.log(Level.SEVERE, "empty metadata: " + fileName);
110
+ throw new IllegalStateException("empty metadata: " + fileName);
111
+ }
112
+ for (PhoneMetadata metadata : metadataList) {
113
+ String regionCode = metadata.getId();
114
+ int countryCallingCode = metadata.getCountryCode();
115
+ boolean isNonGeoRegion = PhoneNumberUtil.REGION_CODE_FOR_NON_GEO_ENTITY.equals(regionCode);
116
+ if (isNonGeoRegion) {
117
+ countryCodeToNonGeographicalMetadataMap.put(countryCallingCode, metadata);
118
+ } else {
119
+ regionToMetadataMap.put(regionCode, metadata);
120
+ }
121
+ }
122
+ } catch (IOException e) {
123
+ logger.log(Level.SEVERE, "cannot load/parse metadata: " + fileName, e);
124
+ throw new RuntimeException("cannot load/parse metadata: " + fileName, e);
125
+ }
126
+ }
127
+
72
128
  /**
73
129
  * Loads the metadata protocol buffer from the given stream and closes the stream afterwards. Any
74
- * exceptions that occur while reading the stream are propagated (though exceptions that occur
75
- * when the stream is closed will be ignored).
130
+ * exceptions that occur while reading or closing the stream are ignored.
76
131
  *
77
132
  * @param source the non-null stream from which metadata is to be read.
78
133
  * @return the loaded metadata protocol buffer.
79
134
  */
80
- private static PhoneMetadataCollection loadMetadataAndCloseInput(InputStream source) {
135
+ private static PhoneMetadataCollection loadMetadataAndCloseInput(ObjectInputStream source) {
81
136
  PhoneMetadataCollection metadataCollection = new PhoneMetadataCollection();
82
137
  try {
83
- // Read in metadata for each region.
84
- ObjectInputStream in = new ObjectInputStream(source);
85
- metadataCollection.readExternal(in);
86
- return metadataCollection;
138
+ metadataCollection.readExternal(source);
87
139
  } catch (IOException e) {
88
- logger.log(Level.WARNING, e.toString());
140
+ logger.log(Level.WARNING, "error reading input (ignored)", e);
89
141
  } finally {
90
142
  try {
91
143
  source.close();
92
144
  } catch (IOException e) {
93
- logger.log(Level.WARNING, e.toString());
145
+ logger.log(Level.WARNING, "error closing input stream (ignored)", e);
94
146
  }
95
147
  }
96
148
  return metadataCollection;