Browse Source

replace the generation from proto with generation from nanoproto

pull/880/head
David Yonge-Mallo 10 years ago
parent
commit
03ce6d2713
21 changed files with 1195 additions and 689 deletions
  1. +2
    -2
      java/libphonenumber/src/com/google/i18n/phonenumbers/AsYouTypeFormatter.java
  2. +26
    -6
      java/libphonenumber/src/com/google/i18n/phonenumbers/MetadataManager.java
  3. +1
    -1
      java/libphonenumber/src/com/google/i18n/phonenumbers/MetadataSource.java
  4. +11
    -6
      java/libphonenumber/src/com/google/i18n/phonenumbers/MultiFileMetadataSourceImpl.java
  5. +3
    -3
      java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberMatcher.java
  6. +24
    -9
      java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java
  7. +0
    -603
      java/libphonenumber/src/com/google/i18n/phonenumbers/Phonemetadata.java
  8. +3
    -3
      java/libphonenumber/src/com/google/i18n/phonenumbers/ShortNumberInfo.java
  9. +10
    -3
      java/libphonenumber/src/com/google/i18n/phonenumbers/SingleFileMetadataSourceImpl.java
  10. +1
    -1
      java/libphonenumber/src/com/google/i18n/phonenumbers/internal/MatcherApi.java
  11. +1
    -1
      java/libphonenumber/src/com/google/i18n/phonenumbers/internal/RegexBasedMatcher.java
  12. +1040
    -0
      java/libphonenumber/src/com/google/i18n/phonenumbers/nano/Phonemetadata.java
  13. +1
    -1
      java/libphonenumber/test/com/google/i18n/phonenumbers/ExampleNumbersTest.java
  14. +1
    -1
      java/libphonenumber/test/com/google/i18n/phonenumbers/MetadataManagerTest.java
  15. +9
    -4
      java/libphonenumber/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java
  16. +20
    -8
      tools/java/common/src/com/google/i18n/phonenumbers/BuildMetadataFromXml.java
  17. +3
    -3
      tools/java/common/test/com/google/i18n/phonenumbers/BuildMetadataFromXmlTest.java
  18. +1
    -20
      tools/java/cpp-build/pom.xml
  19. +12
    -2
      tools/java/cpp-build/src/com/google/i18n/phonenumbers/BuildMetadataCppFromXml.java
  20. +4
    -4
      tools/java/java-build/src/com/google/i18n/phonenumbers/BuildMetadataJsonFromXml.java
  21. +22
    -8
      tools/java/java-build/src/com/google/i18n/phonenumbers/BuildMetadataProtoFromXml.java

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

@ -16,8 +16,8 @@
package com.google.i18n.phonenumbers;
import com.google.i18n.phonenumbers.Phonemetadata.NumberFormat;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata;
import com.google.i18n.phonenumbers.nano.Phonemetadata.NumberFormat;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneMetadata;
import java.util.ArrayList;
import java.util.Iterator;


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

@ -16,16 +16,16 @@
package com.google.i18n.phonenumbers;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadataCollection;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneMetadata;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneMetadataCollection;
import com.google.protobuf.nano.CodedInputByteBufferNano;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
@ -71,14 +71,33 @@ class MetadataManager {
}
}
// The size of the byte buffer used for deserializing the alternate formats and short number
// metadata files for each region.
private static final int BUFFER_SIZE = 16 * 1024;
static CodedInputByteBufferNano convertStreamToByteBuffer(ObjectInputStream in, int bufferSize)
throws IOException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[bufferSize];
while ((nRead = in.read(data, 0, bufferSize)) != -1) {
outputStream.write(data, 0, nRead);
}
outputStream.flush();
return CodedInputByteBufferNano.newInstance(outputStream.toByteArray());
}
private static void loadAlternateFormatsMetadataFromFile(int countryCallingCode) {
InputStream source = PhoneNumberMatcher.class.getResourceAsStream(
ALTERNATE_FORMATS_FILE_PREFIX + "_" + countryCallingCode);
ObjectInputStream in = null;
try {
in = new ObjectInputStream(source);
CodedInputByteBufferNano byteBuffer = convertStreamToByteBuffer(in, BUFFER_SIZE);
PhoneMetadataCollection alternateFormats = new PhoneMetadataCollection();
alternateFormats.readExternal(in);
alternateFormats.mergeFrom(byteBuffer);
for (PhoneMetadata metadata : alternateFormats.metadata) {
callingCodeToAlternateFormatsMap.put(metadata.countryCode, metadata);
}
@ -107,8 +126,9 @@ class MetadataManager {
ObjectInputStream in = null;
try {
in = new ObjectInputStream(source);
CodedInputByteBufferNano byteBuffer = convertStreamToByteBuffer(in, BUFFER_SIZE);
PhoneMetadataCollection shortNumberMetadata = new PhoneMetadataCollection();
shortNumberMetadata.readExternal(in);
shortNumberMetadata.mergeFrom(byteBuffer);
for (PhoneMetadata metadata : shortNumberMetadata.metadata) {
regionCodeToShortNumberMetadataMap.put(regionCode, metadata);
}


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

@ -16,7 +16,7 @@
package com.google.i18n.phonenumbers;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneMetadata;
/**
* A source for phone metadata for all regions.


+ 11
- 6
java/libphonenumber/src/com/google/i18n/phonenumbers/MultiFileMetadataSourceImpl.java View File

@ -16,15 +16,15 @@
package com.google.i18n.phonenumbers;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadataCollection;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneMetadata;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneMetadataCollection;
import com.google.protobuf.nano.CodedInputByteBufferNano;
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.logging.Level;
import java.util.logging.Logger;
@ -103,9 +103,8 @@ final class MultiFileMetadataSourceImpl implements MetadataSource {
logger.log(Level.SEVERE, "missing metadata: " + fileName);
throw new IllegalStateException("missing metadata: " + fileName);
}
ObjectInputStream in = null;
try {
in = new ObjectInputStream(source);
ObjectInputStream in = new ObjectInputStream(source);
PhoneMetadataCollection metadataCollection = loadMetadataAndCloseInput(in);
PhoneMetadata[] metadataList = metadataCollection.metadata;
if (metadataList.length == 0) {
@ -135,9 +134,15 @@ final class MultiFileMetadataSourceImpl implements MetadataSource {
* @return the loaded metadata protocol buffer.
*/
private static PhoneMetadataCollection loadMetadataAndCloseInput(ObjectInputStream source) {
// The size of the byte buffer used for deserializing the phone number metadata files for each
// region.
final int MULTI_FILE_BUFFER_SIZE = 16 * 1024;
PhoneMetadataCollection metadataCollection = new PhoneMetadataCollection();
try {
metadataCollection.readExternal(source);
CodedInputByteBufferNano byteBuffer = MetadataManager.convertStreamToByteBuffer(source,
MULTI_FILE_BUFFER_SIZE);
metadataCollection.mergeFrom(byteBuffer);
} catch (IOException e) {
logger.log(Level.WARNING, "error reading input (ignored)", e);
} finally {


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

@ -19,10 +19,10 @@ package com.google.i18n.phonenumbers;
import com.google.i18n.phonenumbers.PhoneNumberUtil.Leniency;
import com.google.i18n.phonenumbers.PhoneNumberUtil.MatchType;
import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat;
import com.google.i18n.phonenumbers.Phonemetadata.NumberFormat;
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.Phonenumber.PhoneNumber.CountryCodeSource;
import com.google.i18n.phonenumbers.nano.Phonemetadata.NumberFormat;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneMetadata;
import java.lang.Character.UnicodeBlock;
import java.util.Iterator;


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

@ -16,11 +16,11 @@
package com.google.i18n.phonenumbers;
import com.google.i18n.phonenumbers.Phonemetadata.NumberFormat;
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.Phonenumber.PhoneNumber.CountryCodeSource;
import com.google.i18n.phonenumbers.nano.Phonemetadata.NumberFormat;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneMetadata;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneNumberDesc;
import java.io.InputStream;
import java.util.ArrayList;
@ -586,6 +586,24 @@ public class PhoneNumberUtil {
nanpaRegions.addAll(countryCallingCodeToRegionCodeMap.get(NANPA_COUNTRY_CODE));
}
/**
* Returns a copy of the given NumberFormat object.
*/
static NumberFormat copyNumberFormat(NumberFormat other) {
NumberFormat copy = new NumberFormat();
copy.pattern = other.pattern;
copy.format = other.format;
int leadingDigitsPatternSize = other.leadingDigitsPattern.length;
copy.leadingDigitsPattern = new String[leadingDigitsPatternSize];
for (int i = 0; i < leadingDigitsPatternSize; i++) {
copy.leadingDigitsPattern[i] = other.leadingDigitsPattern[i];
}
copy.nationalPrefixFormattingRule = other.nationalPrefixFormattingRule;
copy.domesticCarrierCodeFormattingRule = other.domesticCarrierCodeFormattingRule;
copy.nationalPrefixOptionalWhenFormatting = other.nationalPrefixOptionalWhenFormatting;
return copy;
}
/**
* Attempts to extract a possible number from the string passed in. This currently strips all
* leading characters that cannot be used to start a phone number. Characters that can be used to
@ -1119,11 +1137,10 @@ public class PhoneNumberUtil {
// If no pattern above is matched, we format the number as a whole.
formattedNumber.append(nationalSignificantNumber);
} else {
NumberFormat numFormatCopy = new NumberFormat();
// Before we do a replacement of the national prefix pattern $NP with the national prefix, we
// need to copy the rule so that subsequent replacements for different numbers have the
// appropriate national prefix.
numFormatCopy.mergeFrom(formattingPattern);
NumberFormat numFormatCopy = copyNumberFormat(formattingPattern);
String nationalPrefixFormattingRule = formattingPattern.nationalPrefixFormattingRule;
if (nationalPrefixFormattingRule.length() > 0) {
String nationalPrefix = metadata.nationalPrefix;
@ -1475,8 +1492,7 @@ public class PhoneNumberUtil {
break;
}
// Otherwise, we need to remove the national prefix from our output.
NumberFormat numFormatCopy = new NumberFormat();
numFormatCopy.mergeFrom(formatRule);
NumberFormat numFormatCopy = copyNumberFormat(formatRule);
numFormatCopy.nationalPrefixFormattingRule = "";
List<NumberFormat> numberFormats = new ArrayList<NumberFormat>(1);
numberFormats.add(numFormatCopy);
@ -1604,8 +1620,7 @@ public class PhoneNumberUtil {
// If no pattern above is matched, we format the original input.
return rawInput;
}
NumberFormat newFormat = new NumberFormat();
newFormat.mergeFrom(formattingPattern);
NumberFormat newFormat = copyNumberFormat(formattingPattern);
// The first group is the first group of digits that the user wrote together.
newFormat.pattern = "(\\d+)(.*)";
// Here we just concatenate them back together after the national prefix has been fixed.


+ 0
- 603
java/libphonenumber/src/com/google/i18n/phonenumbers/Phonemetadata.java View File

@ -1,603 +0,0 @@
/*
* Copyright (C) 2010 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.
*/
/**
* Definition of the class representing metadata for international telephone numbers. This class is
* hand created based on the class file compiled from phonemetadata.proto. Please refer to that file
* for detailed descriptions of the meaning of each field.
*/
package com.google.i18n.phonenumbers;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.io.OutputStream;
public final class Phonemetadata {
private Phonemetadata() {}
public static class NumberFormat implements Externalizable {
private static final long serialVersionUID = 1;
public NumberFormat() {}
// required string pattern = 1;
public String pattern = "";
// required string format = 2;
public String format = "";
// repeated string leading_digits_pattern = 3;
public String[] leadingDigitsPattern = new String[0];
// optional string national_prefix_formatting_rule = 4;
public String nationalPrefixFormattingRule = "";
// optional bool national_prefix_optional_when_formatting = 6;
public boolean nationalPrefixOptionalWhenFormatting = false;
// optional string domestic_carrier_code_formatting_rule = 5;
public String domesticCarrierCodeFormattingRule = "";
public NumberFormat mergeFrom(NumberFormat other) {
if (other.pattern.length() != 0) {
pattern = other.pattern;
}
if (other.format.length() != 0) {
format = other.format;
}
int leadingDigitsPatternSize = other.leadingDigitsPattern.length;
leadingDigitsPattern = new String[leadingDigitsPatternSize];
for (int i = 0; i < leadingDigitsPatternSize; i++) {
leadingDigitsPattern[i] = other.leadingDigitsPattern[i];
}
if (other.nationalPrefixFormattingRule.length() != 0) {
nationalPrefixFormattingRule = other.nationalPrefixFormattingRule;
}
if (other.domesticCarrierCodeFormattingRule.length() != 0) {
domesticCarrierCodeFormattingRule = other.domesticCarrierCodeFormattingRule;
}
nationalPrefixOptionalWhenFormatting = other.nationalPrefixOptionalWhenFormatting;
return this;
}
public void writeExternal(ObjectOutput objectOutput) throws IOException {
objectOutput.writeUTF(pattern);
objectOutput.writeUTF(format);
int leadingDigitsPatternSize = leadingDigitsPattern.length;
objectOutput.writeInt(leadingDigitsPatternSize);
for (int i = 0; i < leadingDigitsPatternSize; i++) {
objectOutput.writeUTF(leadingDigitsPattern[i]);
}
objectOutput.writeBoolean(nationalPrefixFormattingRule.length() != 0);
if (nationalPrefixFormattingRule.length() != 0) {
objectOutput.writeUTF(nationalPrefixFormattingRule);
}
objectOutput.writeBoolean(domesticCarrierCodeFormattingRule.length() != 0);
if (domesticCarrierCodeFormattingRule.length() != 0) {
objectOutput.writeUTF(domesticCarrierCodeFormattingRule);
}
objectOutput.writeBoolean(nationalPrefixOptionalWhenFormatting);
}
public void readExternal(ObjectInput objectInput) throws IOException {
pattern = objectInput.readUTF();
format = objectInput.readUTF();
int leadingDigitsPatternSize = objectInput.readInt();
leadingDigitsPattern = new String[leadingDigitsPatternSize];
for (int i = 0; i < leadingDigitsPatternSize; i++) {
leadingDigitsPattern[i] = objectInput.readUTF();
}
if (objectInput.readBoolean()) {
nationalPrefixFormattingRule = objectInput.readUTF();
}
if (objectInput.readBoolean()) {
domesticCarrierCodeFormattingRule = objectInput.readUTF();
}
nationalPrefixOptionalWhenFormatting = objectInput.readBoolean();
}
}
public static class PhoneNumberDesc implements Externalizable {
private static final long serialVersionUID = 1;
public PhoneNumberDesc() {}
// optional string national_number_pattern = 2;
public String nationalNumberPattern = "";
// optional string possible_number_pattern = 3;
public String possibleNumberPattern = "";
// optional string example_number = 6;
public String exampleNumber = "";
public PhoneNumberDesc mergeFrom(PhoneNumberDesc other) {
if (other.nationalNumberPattern.length() != 0) {
nationalNumberPattern = other.nationalNumberPattern;
}
if (other.possibleNumberPattern.length() != 0) {
possibleNumberPattern = other.possibleNumberPattern;
}
if (other.exampleNumber.length() != 0) {
exampleNumber = other.exampleNumber;
}
return this;
}
public boolean exactlySameAs(PhoneNumberDesc other) {
return nationalNumberPattern.equals(other.nationalNumberPattern) &&
possibleNumberPattern.equals(other.possibleNumberPattern) &&
exampleNumber.equals(other.exampleNumber);
}
public void writeExternal(ObjectOutput objectOutput) throws IOException {
objectOutput.writeBoolean(nationalNumberPattern.length() != 0);
if (nationalNumberPattern.length() != 0) {
objectOutput.writeUTF(nationalNumberPattern);
}
objectOutput.writeBoolean(possibleNumberPattern.length() != 0);
if (possibleNumberPattern.length() != 0) {
objectOutput.writeUTF(possibleNumberPattern);
}
objectOutput.writeBoolean(exampleNumber.length() != 0);
if (exampleNumber.length() != 0) {
objectOutput.writeUTF(exampleNumber);
}
}
public void readExternal(ObjectInput objectInput) throws IOException {
if (objectInput.readBoolean()) {
nationalNumberPattern = objectInput.readUTF();
}
if (objectInput.readBoolean()) {
possibleNumberPattern = objectInput.readUTF();
}
if (objectInput.readBoolean()) {
exampleNumber = objectInput.readUTF();
}
}
}
public static class PhoneMetadata implements Externalizable {
private static final long serialVersionUID = 1;
public PhoneMetadata() {}
// optional PhoneNumberDesc general_desc = 1;
public PhoneNumberDesc generalDesc = null;
// optional PhoneNumberDesc fixed_line = 2;
public PhoneNumberDesc fixedLine = null;
// optional PhoneNumberDesc mobile = 3;
public PhoneNumberDesc mobile = null;
// optional PhoneNumberDesc toll_free = 4;
public PhoneNumberDesc tollFree = null;
// optional PhoneNumberDesc premium_rate = 5;
public PhoneNumberDesc premiumRate = null;
// optional PhoneNumberDesc shared_cost = 6;
public PhoneNumberDesc sharedCost = null;
// optional PhoneNumberDesc personal_number = 7;
public PhoneNumberDesc personalNumber = null;
// optional PhoneNumberDesc voip = 8;
public PhoneNumberDesc voip = null;
// optional PhoneNumberDesc pager = 21;
public PhoneNumberDesc pager = null;
// optional PhoneNumberDesc uan = 25;
public PhoneNumberDesc uan = null;
// optional PhoneNumberDesc emergency = 27;
public PhoneNumberDesc emergency = null;
// optional PhoneNumberDesc voicemail = 28;
public PhoneNumberDesc voicemail = null;
// optional PhoneNumberDesc short_code = 29;
public PhoneNumberDesc shortCode = null;
// optional PhoneNumberDesc standard_rate = 30;
public PhoneNumberDesc standardRate = null;
// optional PhoneNumberDesc carrier_specific = 31;
public PhoneNumberDesc carrierSpecific = null;
// optional PhoneNumberDesc noInternationalDialling = 24;
public PhoneNumberDesc noInternationalDialling = null;
// required string id = 9;
public String id = "";
// optional int32 country_code = 10;
public int countryCode = 0;
// optional string international_prefix = 11;
public String internationalPrefix = "";
// optional string preferred_international_prefix = 17;
public String preferredInternationalPrefix = "";
// optional string national_prefix = 12;
public String nationalPrefix = "";
// optional string preferred_extn_prefix = 13;
public String preferredExtnPrefix = "";
// optional string national_prefix_for_parsing = 15;
public String nationalPrefixForParsing = "";
// optional string national_prefix_transform_rule = 16;
public String nationalPrefixTransformRule = "";
// optional bool same_mobile_and_fixed_line_pattern = 18 [default = false];
public boolean sameMobileAndFixedLinePattern = false;
// repeated NumberFormat number_format = 19;
public NumberFormat[] numberFormat = new NumberFormat[0];
// repeated NumberFormat intl_number_format = 20;
public NumberFormat[] intlNumberFormat = new NumberFormat[0];
// optional bool main_country_for_code = 22 [default = false];
public boolean mainCountryForCode = false;
// optional string leading_digits = 23;
public String leadingDigits = "";
// optional bool leading_zero_possible = 26 [default = false];
public boolean leadingZeroPossible = false;
// optional bool mobile_number_portable_region = 32 [default = false];
public boolean mobileNumberPortableRegion = false;
public void writeExternal(ObjectOutput objectOutput) throws IOException {
objectOutput.writeBoolean(generalDesc != null);
if (generalDesc != null) {
generalDesc.writeExternal(objectOutput);
}
objectOutput.writeBoolean(fixedLine != null);
if (fixedLine != null) {
fixedLine.writeExternal(objectOutput);
}
objectOutput.writeBoolean(mobile != null);
if (mobile != null) {
mobile.writeExternal(objectOutput);
}
objectOutput.writeBoolean(tollFree != null);
if (tollFree != null) {
tollFree.writeExternal(objectOutput);
}
objectOutput.writeBoolean(premiumRate != null);
if (premiumRate != null) {
premiumRate.writeExternal(objectOutput);
}
objectOutput.writeBoolean(sharedCost != null);
if (sharedCost != null) {
sharedCost.writeExternal(objectOutput);
}
objectOutput.writeBoolean(personalNumber != null);
if (personalNumber != null) {
personalNumber.writeExternal(objectOutput);
}
objectOutput.writeBoolean(voip != null);
if (voip != null) {
voip.writeExternal(objectOutput);
}
objectOutput.writeBoolean(pager != null);
if (pager != null) {
pager.writeExternal(objectOutput);
}
objectOutput.writeBoolean(uan != null);
if (uan != null) {
uan.writeExternal(objectOutput);
}
objectOutput.writeBoolean(emergency != null);
if (emergency != null) {
emergency.writeExternal(objectOutput);
}
objectOutput.writeBoolean(voicemail != null);
if (voicemail != null) {
voicemail.writeExternal(objectOutput);
}
objectOutput.writeBoolean(shortCode != null);
if (shortCode != null) {
shortCode.writeExternal(objectOutput);
}
objectOutput.writeBoolean(standardRate != null);
if (standardRate != null) {
standardRate.writeExternal(objectOutput);
}
objectOutput.writeBoolean(carrierSpecific != null);
if (carrierSpecific != null) {
carrierSpecific.writeExternal(objectOutput);
}
objectOutput.writeBoolean(noInternationalDialling != null);
if (noInternationalDialling != null) {
noInternationalDialling.writeExternal(objectOutput);
}
objectOutput.writeUTF(id);
objectOutput.writeInt(countryCode);
objectOutput.writeUTF(internationalPrefix);
objectOutput.writeBoolean(preferredInternationalPrefix.length() != 0);
if (preferredInternationalPrefix.length() != 0) {
objectOutput.writeUTF(preferredInternationalPrefix);
}
objectOutput.writeBoolean(nationalPrefix.length() != 0);
if (nationalPrefix.length() != 0) {
objectOutput.writeUTF(nationalPrefix);
}
objectOutput.writeBoolean(preferredExtnPrefix.length() != 0);
if (preferredExtnPrefix.length() != 0) {
objectOutput.writeUTF(preferredExtnPrefix);
}
objectOutput.writeBoolean(nationalPrefixForParsing.length() != 0);
if (nationalPrefixForParsing.length() != 0) {
objectOutput.writeUTF(nationalPrefixForParsing);
}
objectOutput.writeBoolean(nationalPrefixTransformRule.length() != 0);
if (nationalPrefixTransformRule.length() != 0) {
objectOutput.writeUTF(nationalPrefixTransformRule);
}
objectOutput.writeBoolean(sameMobileAndFixedLinePattern);
int numberFormatSize = numberFormat.length;
objectOutput.writeInt(numberFormatSize);
for (int i = 0; i < numberFormatSize; i++) {
numberFormat[i].writeExternal(objectOutput);
}
int intlNumberFormatSize = intlNumberFormat.length;
objectOutput.writeInt(intlNumberFormatSize);
for (int i = 0; i < intlNumberFormatSize; i++) {
intlNumberFormat[i].writeExternal(objectOutput);
}
objectOutput.writeBoolean(mainCountryForCode);
objectOutput.writeBoolean(leadingDigits.length() != 0);
if (leadingDigits.length() != 3) {
objectOutput.writeUTF(leadingDigits);
}
objectOutput.writeBoolean(leadingZeroPossible);
objectOutput.writeBoolean(mobileNumberPortableRegion);
}
public void readExternal(ObjectInput objectInput) throws IOException {
boolean hasDesc = objectInput.readBoolean();
if (hasDesc) {
PhoneNumberDesc desc = new PhoneNumberDesc();
desc.readExternal(objectInput);
generalDesc = desc;
}
hasDesc = objectInput.readBoolean();
if (hasDesc) {
PhoneNumberDesc desc = new PhoneNumberDesc();
desc.readExternal(objectInput);
fixedLine = desc;
}
hasDesc = objectInput.readBoolean();
if (hasDesc) {
PhoneNumberDesc desc = new PhoneNumberDesc();
desc.readExternal(objectInput);
mobile = desc;
}
hasDesc = objectInput.readBoolean();
if (hasDesc) {
PhoneNumberDesc desc = new PhoneNumberDesc();
desc.readExternal(objectInput);
tollFree = desc;
}
hasDesc = objectInput.readBoolean();
if (hasDesc) {
PhoneNumberDesc desc = new PhoneNumberDesc();
desc.readExternal(objectInput);
premiumRate = desc;
}
hasDesc = objectInput.readBoolean();
if (hasDesc) {
PhoneNumberDesc desc = new PhoneNumberDesc();
desc.readExternal(objectInput);
sharedCost = desc;
}
hasDesc = objectInput.readBoolean();
if (hasDesc) {
PhoneNumberDesc desc = new PhoneNumberDesc();
desc.readExternal(objectInput);
personalNumber = desc;
}
hasDesc = objectInput.readBoolean();
if (hasDesc) {
PhoneNumberDesc desc = new PhoneNumberDesc();
desc.readExternal(objectInput);
voip = desc;
}
hasDesc = objectInput.readBoolean();
if (hasDesc) {
PhoneNumberDesc desc = new PhoneNumberDesc();
desc.readExternal(objectInput);
pager = desc;
}
hasDesc = objectInput.readBoolean();
if (hasDesc) {
PhoneNumberDesc desc = new PhoneNumberDesc();
desc.readExternal(objectInput);
uan = desc;
}
hasDesc = objectInput.readBoolean();
if (hasDesc) {
PhoneNumberDesc desc = new PhoneNumberDesc();
desc.readExternal(objectInput);
emergency = desc;
}
hasDesc = objectInput.readBoolean();
if (hasDesc) {
PhoneNumberDesc desc = new PhoneNumberDesc();
desc.readExternal(objectInput);
voicemail = desc;
}
hasDesc = objectInput.readBoolean();
if (hasDesc) {
PhoneNumberDesc desc = new PhoneNumberDesc();
desc.readExternal(objectInput);
shortCode = desc;
}
hasDesc = objectInput.readBoolean();
if (hasDesc) {
PhoneNumberDesc desc = new PhoneNumberDesc();
desc.readExternal(objectInput);
standardRate = desc;
}
hasDesc = objectInput.readBoolean();
if (hasDesc) {
PhoneNumberDesc desc = new PhoneNumberDesc();
desc.readExternal(objectInput);
carrierSpecific = desc;
}
hasDesc = objectInput.readBoolean();
if (hasDesc) {
PhoneNumberDesc desc = new PhoneNumberDesc();
desc.readExternal(objectInput);
noInternationalDialling = desc;
}
id = objectInput.readUTF();
countryCode = objectInput.readInt();
internationalPrefix = objectInput.readUTF();
boolean hasString = objectInput.readBoolean();
if (hasString) {
preferredInternationalPrefix = objectInput.readUTF();
}
hasString = objectInput.readBoolean();
if (hasString) {
nationalPrefix = objectInput.readUTF();
}
hasString = objectInput.readBoolean();
if (hasString) {
preferredExtnPrefix = objectInput.readUTF();
}
hasString = objectInput.readBoolean();
if (hasString) {
nationalPrefixForParsing = objectInput.readUTF();
}
hasString = objectInput.readBoolean();
if (hasString) {
nationalPrefixTransformRule = objectInput.readUTF();
}
sameMobileAndFixedLinePattern = objectInput.readBoolean();
int nationalFormatSize = objectInput.readInt();
numberFormat = new NumberFormat[nationalFormatSize];
for (int i = 0; i < nationalFormatSize; i++) {
numberFormat[i] = new NumberFormat();
numberFormat[i].readExternal(objectInput);
}
int intlNumberFormatSize = objectInput.readInt();
intlNumberFormat = new NumberFormat[intlNumberFormatSize];
for (int i = 0; i < intlNumberFormatSize; i++) {
intlNumberFormat[i] = new NumberFormat();
intlNumberFormat[i].readExternal(objectInput);
}
mainCountryForCode = objectInput.readBoolean();
hasString = objectInput.readBoolean();
if (hasString) {
leadingDigits = objectInput.readUTF();
}
leadingZeroPossible = objectInput.readBoolean();
mobileNumberPortableRegion = objectInput.readBoolean();
}
}
public static class PhoneMetadataCollection implements Externalizable {
private static final long serialVersionUID = 1;
public PhoneMetadataCollection() {}
// repeated PhoneMetadata metadata = 1;
public PhoneMetadata[] metadata = new PhoneMetadata[0];
public PhoneMetadataCollection addMetadata(PhoneMetadata value) {
if (value == null) {
throw new NullPointerException();
}
List<PhoneMetadata> metadataList =
new ArrayList<PhoneMetadata>(Arrays.asList(metadata));
metadataList.add(value);
metadata = metadataList.toArray(new PhoneMetadata[metadataList.size()]);
return this;
}
public void writeExternal(ObjectOutput objectOutput) throws IOException {
int size = metadata.length;
objectOutput.writeInt(size);
for (int i = 0; i < size; i++) {
metadata[i].writeExternal(objectOutput);
}
}
public void readExternal(ObjectInput objectInput) throws IOException {
int size = objectInput.readInt();
for (int i = 0; i < size; i++) {
PhoneMetadata phoneMetadata = new PhoneMetadata();
phoneMetadata.readExternal(objectInput);
List<PhoneMetadata> metadataList =
new ArrayList<PhoneMetadata>(Arrays.asList(metadata));
metadataList.add(phoneMetadata);
metadata = metadataList.toArray(new PhoneMetadata[metadataList.size()]);
}
}
public PhoneMetadataCollection clear() {
metadata = new PhoneMetadata[0];
return this;
}
public void writeTo(OutputStream output) throws java.io.IOException {
// Note: This is a stub for compilation purposes.
}
}
}

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

@ -16,11 +16,11 @@
package com.google.i18n.phonenumbers;
import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
import com.google.i18n.phonenumbers.internal.MatcherApi;
import com.google.i18n.phonenumbers.internal.RegexBasedMatcher;
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.nano.Phonemetadata.PhoneMetadata;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneNumberDesc;
import java.util.ArrayList;
import java.util.Arrays;


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

@ -16,8 +16,9 @@
package com.google.i18n.phonenumbers;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadataCollection;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneMetadata;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneMetadataCollection;
import com.google.protobuf.nano.CodedInputByteBufferNano;
import java.io.IOException;
import java.io.InputStream;
@ -133,9 +134,15 @@ final class SingleFileMetadataSourceImpl implements MetadataSource {
* @return the loaded metadata protocol buffer.
*/
private static PhoneMetadataCollection loadMetadataAndCloseInput(ObjectInputStream source) {
// The size of the byte buffer for deserializing the single nano metadata file which holds
// metadata for all regions.
final int SINGLE_FILE_BUFFER_SIZE = 256 * 1024;
PhoneMetadataCollection metadataCollection = new PhoneMetadataCollection();
try {
metadataCollection.readExternal(source);
CodedInputByteBufferNano byteBuffer = MetadataManager.convertStreamToByteBuffer(
source, SINGLE_FILE_BUFFER_SIZE);
metadataCollection.mergeFrom(byteBuffer);
} catch (IOException e) {
logger.log(Level.WARNING, "error reading input (ignored)", e);
} finally {


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

@ -16,7 +16,7 @@
package com.google.i18n.phonenumbers.internal;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneNumberDesc;
/**
* Internal phonenumber matching API used to isolate the underlying implementation of the


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

@ -16,8 +16,8 @@
package com.google.i18n.phonenumbers.internal;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc;
import com.google.i18n.phonenumbers.RegexCache;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneNumberDesc;
import java.util.regex.Matcher;


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


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

@ -17,8 +17,8 @@
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 com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneNumberDesc;
import junit.framework.TestCase;


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

@ -16,7 +16,7 @@
package com.google.i18n.phonenumbers;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneMetadata;
import junit.framework.TestCase;


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

@ -17,11 +17,11 @@
package com.google.i18n.phonenumbers;
import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat;
import com.google.i18n.phonenumbers.Phonemetadata.NumberFormat;
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.Phonenumber.PhoneNumber.CountryCodeSource;
import com.google.i18n.phonenumbers.nano.Phonemetadata.NumberFormat;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneMetadata;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneNumberDesc;
import java.util.ArrayList;
import java.util.List;
@ -145,7 +145,12 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase {
assertEquals("[13-689]\\d{9}|2[0-35-9]\\d{8}",
metadata.generalDesc.nationalNumberPattern);
assertEquals("\\d{7}(?:\\d{3})?", metadata.generalDesc.possibleNumberPattern);
assertTrue(metadata.generalDesc.exactlySameAs(metadata.fixedLine));
assertTrue(metadata.generalDesc.nationalNumberPattern.equals(
metadata.fixedLine.nationalNumberPattern));
assertTrue(metadata.generalDesc.possibleNumberPattern.equals(
metadata.fixedLine.possibleNumberPattern));
assertTrue(metadata.generalDesc.exampleNumber.equals(
metadata.fixedLine.exampleNumber));
assertEquals("\\d{10}", metadata.tollFree.possibleNumberPattern);
assertEquals("900\\d{7}", metadata.premiumRate.nationalNumberPattern);
// No shared-cost data is available, so it should be initialised to "NA".


+ 20
- 8
tools/java/common/src/com/google/i18n/phonenumbers/BuildMetadataFromXml.java View File

@ -16,10 +16,10 @@
package com.google.i18n.phonenumbers;
import com.google.i18n.phonenumbers.Phonemetadata.NumberFormat;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadataCollection;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc;
import com.google.i18n.phonenumbers.nano.Phonemetadata.NumberFormat;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneMetadata;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneMetadataCollection;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneNumberDesc;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@ -103,6 +103,7 @@ public class BuildMetadataFromXml {
// a separate constants file.
boolean isShortNumberMetadata = inputXmlFile.contains("ShortNumberMetadata");
boolean isAlternateFormatsMetadata = inputXmlFile.contains("PhoneNumberAlternateFormats");
List<PhoneMetadata> phoneMetadataList = new ArrayList<PhoneMetadata>();
for (int i = 0; i < numOfTerritories; i++) {
Element territoryElement = (Element) territory.item(i);
String regionCode = "";
@ -113,8 +114,10 @@ public class BuildMetadataFromXml {
}
PhoneMetadata metadata = loadCountryMetadata(regionCode, territoryElement, liteBuild,
isShortNumberMetadata, isAlternateFormatsMetadata);
metadataCollection.addMetadata(metadata);
phoneMetadataList.add(metadata);
}
metadataCollection.metadata =
phoneMetadataList.toArray(new PhoneMetadata[phoneMetadataList.size()]);
return metadataCollection;
}
@ -247,7 +250,7 @@ public class BuildMetadataFromXml {
throw new RuntimeException("Invalid number of intlFormat patterns for country: " + countryId);
} else if (intlFormatPattern.getLength() == 0) {
// Default to use the same as the national pattern if none is defined.
intlFormat.mergeFrom(nationalFormat);
intlFormat = PhoneNumberUtil.copyNumberFormat(nationalFormat);
} else {
intlFormat.pattern = numberFormatElement.getAttribute(PATTERN);
setLeadingDigitsPatterns(numberFormatElement, intlFormat);
@ -260,7 +263,7 @@ public class BuildMetadataFromXml {
if (!intlFormat.format.isEmpty()) {
List<NumberFormat> formatList =
new ArrayList<NumberFormat> (Arrays.asList(metadata.intlNumberFormat));
new ArrayList<NumberFormat>(Arrays.asList(metadata.intlNumberFormat));
formatList.add(intlFormat);
metadata.intlNumberFormat = formatList.toArray(new NumberFormat[formatList.size()]);
}
@ -427,7 +430,16 @@ public class BuildMetadataFromXml {
numberDesc.possibleNumberPattern = "NA";
return numberDesc;
}
numberDesc.mergeFrom(generalDesc);
if (generalDesc.nationalNumberPattern.length() != 0) {
numberDesc.nationalNumberPattern = generalDesc.nationalNumberPattern;
}
if (generalDesc.possibleNumberPattern.length() != 0) {
numberDesc.possibleNumberPattern = generalDesc.possibleNumberPattern;
}
if (generalDesc.exampleNumber.length() != 0) {
numberDesc.exampleNumber = generalDesc.exampleNumber;
}
if (phoneNumberDescList.getLength() > 0) {
Element element = (Element) phoneNumberDescList.item(0);
NodeList possiblePattern = element.getElementsByTagName(POSSIBLE_NUMBER_PATTERN);


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

@ -16,9 +16,9 @@
package com.google.i18n.phonenumbers;
import com.google.i18n.phonenumbers.Phonemetadata.NumberFormat;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc;
import com.google.i18n.phonenumbers.nano.Phonemetadata.NumberFormat;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneMetadata;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneNumberDesc;
import junit.framework.TestCase;


+ 1
- 20
tools/java/cpp-build/pom.xml View File

@ -30,25 +30,6 @@
<target>1.5</target>
</configuration>
</plugin>
<!-- Create a directory called 'generated'. -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>create-generated-directory</id>
<phase>generate-sources</phase>
<configuration>
<tasks>
<mkdir dir="generated"/>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
@ -86,7 +67,7 @@
<configuration>
<executable>protoc</executable>
<arguments>
<argument>--java_out=generated</argument>
<argument>--javanano_out=java_package=phonemetadata.proto|com.google.i18n.phonenumbers.nano:../../../java/libphonenumber/src</argument>
<argument>../../../resources/phonemetadata.proto</argument>
<argument>--proto_path=../../../resources</argument>
</arguments>


+ 12
- 2
tools/java/cpp-build/src/com/google/i18n/phonenumbers/BuildMetadataCppFromXml.java View File

@ -17,6 +17,8 @@
package com.google.i18n.phonenumbers;
import com.google.i18n.phonenumbers.CppMetadataGenerator.Type;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneMetadataCollection;
import com.google.protobuf.nano.CodedOutputByteBufferNano;
import java.io.ByteArrayOutputStream;
import java.io.File;
@ -201,8 +203,16 @@ public class BuildMetadataCppFromXml extends Command {
// @VisibleForTesting
void writePhoneMetadataCollection(
String inputFilePath, boolean liteMetadata, OutputStream out) throws IOException, Exception {
// Note: This is a stub and does nothing.
BuildMetadataFromXml.buildPhoneMetadataCollection(inputFilePath, liteMetadata).writeTo(out);
// The size of the byte buffer used for serializing the PhoneMetadataCollection.
int COLLECTION_BUFFER_SIZE = 256 * 1024;
PhoneMetadataCollection metadataCollection =
BuildMetadataFromXml.buildPhoneMetadataCollection(inputFilePath, liteMetadata);
byte[] outputArray = new byte[COLLECTION_BUFFER_SIZE];
CodedOutputByteBufferNano outputByteBuffer = CodedOutputByteBufferNano.newInstance(outputArray);
metadataCollection.writeTo(outputByteBuffer);
out.write(outputArray, 0, outputByteBuffer.position());
out.flush();
}
// @VisibleForTesting


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

@ -16,10 +16,10 @@
package com.google.i18n.phonenumbers;
import com.google.i18n.phonenumbers.Phonemetadata.NumberFormat;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadataCollection;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc;
import com.google.i18n.phonenumbers.nano.Phonemetadata.NumberFormat;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneMetadata;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneMetadataCollection;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneNumberDesc;
import java.io.BufferedWriter;
import java.io.FileWriter;


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

@ -16,8 +16,9 @@
package com.google.i18n.phonenumbers;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadataCollection;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneMetadata;
import com.google.i18n.phonenumbers.nano.Phonemetadata.PhoneMetadataCollection;
import com.google.protobuf.nano.CodedOutputByteBufferNano;
import java.io.BufferedWriter;
import java.io.File;
@ -159,23 +160,36 @@ public class BuildMetadataProtoFromXml extends Command {
BuildMetadataFromXml.buildPhoneMetadataCollection(inputFile, liteBuild);
if (singleFile) {
int SINGLE_FILE_BUFFER_SIZE = 256 * 1024;
FileOutputStream output = new FileOutputStream(filePrefix);
ObjectOutputStream out = new ObjectOutputStream(output);
metadataCollection.writeExternal(out);
byte[] outputArray = new byte[SINGLE_FILE_BUFFER_SIZE];
CodedOutputByteBufferNano outputByteBuffer =
CodedOutputByteBufferNano.newInstance(outputArray);
metadataCollection.writeTo(outputByteBuffer);
out.write(outputArray, 0, outputByteBuffer.position());
out.flush();
out.close();
} else {
int MULTI_FILE_BUFFER_SIZE = 16 * 1024;
for (PhoneMetadata metadata : metadataCollection.metadata) {
String regionCode = metadata.id;
// For non-geographical country calling codes (e.g. +800), or for alternate formats, use the
// country calling codes instead of the region code to form the file name.
// For non-geographical country calling codes (e.g. +800), or for alternate formats, use
// the country calling codes instead of the region code to form the file name.
if (regionCode.equals("001") || regionCode.isEmpty()) {
regionCode = Integer.toString(metadata.countryCode);
}
PhoneMetadataCollection outMetadataCollection = new PhoneMetadataCollection();
outMetadataCollection.addMetadata(metadata);
PhoneMetadataCollection singleCollection = new PhoneMetadataCollection();
singleCollection.metadata = new PhoneMetadata[1];
singleCollection.metadata[0] = metadata;
FileOutputStream outputForRegion = new FileOutputStream(filePrefix + "_" + regionCode);
ObjectOutputStream out = new ObjectOutputStream(outputForRegion);
outMetadataCollection.writeExternal(out);
byte[] outputArray = new byte[MULTI_FILE_BUFFER_SIZE];
CodedOutputByteBufferNano outputBufferNano =
CodedOutputByteBufferNano.newInstance(outputArray);
singleCollection.writeTo(outputBufferNano);
out.write(outputArray, 0, outputBufferNano.position());
out.flush();
out.close();
}
}


Loading…
Cancel
Save