phonelib 0.5.2 → 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
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;