*/
public class BuildMetadataProtoFromXml extends Command {
private static final String PACKAGE_NAME = "com/google/i18n/phonenumbers";
+
private static final String META_DATA_FILE_PREFIX =
"/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto";
private static final String TEST_META_DATA_FILE_PREFIX =
"/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting";
- private static final String TEST_COUNTRY_CODE_TO_REGION_CODE_MAP_CLASS_NAME =
- "CountryCodeToRegionCodeMapForTesting";
+ private static final String ALTERNATE_FORMATS_FILE_PREFIX =
+ "/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto";
+
private static final String COUNTRY_CODE_TO_REGION_CODE_MAP_CLASS_NAME =
"CountryCodeToRegionCodeMap";
+ private static final String TEST_COUNTRY_CODE_TO_REGION_CODE_MAP_CLASS_NAME =
+ "CountryCodeToRegionCodeMapForTesting";
+ private static final String ALTERNATE_COUNTRY_CODE_TO_REGION_CODE_MAP_CLASS_NAME =
+ "CountryCodeToRegionCodeMapForAlternate";
private static final String HELP_MESSAGE =
"Usage:\n" +
- "BuildMetadataProtoFromXml <inputFile> <outputDir> <forTesting> [<liteBuild>]\n" +
+ "BuildMetadataProtoFromXml <inputFile> <outputDir>" +
+ " <forTesting> <forAlternate> [<liteBuild>]\n" +
"\n" +
"where:\n" +
" inputFile The input file containing phone number metadata in XML format.\n" +
" format (one file per region) and the country code to region code\n" +
" mapping file.\n" +
" forTesting Flag whether to generate metadata for testing purposes or not.\n" +
+ " forAlternate Flag whether to generate metadata for alternate formats or not.\n" +
" liteBuild Whether to generate the lite-version of the metadata (default:\n" +
" false). When set to true certain metadata will be omitted.\n" +
" At this moment, example numbers information is omitted.\n" +
COUNTRY_CODE_TO_REGION_CODE_MAP_CLASS_NAME + ".java\n" +
"\n" +
"Example command line invocation:\n" +
- "BuildMetadataProtoFromXml PhoneNumberMetadata.xml src false false\n";
+ "BuildMetadataProtoFromXml PhoneNumberMetadata.xml src false false false\n";
private static final String GENERATION_COMMENT =
"/* This file is automatically generated by {@link BuildMetadataProtoFromXml}.\n" +
@Override
public boolean start() {
String[] args = getArgs();
- if (args.length != 4 && args.length != 5) {
+ if (args.length != 5 && args.length != 6) {
System.err.println(HELP_MESSAGE);
return false;
}
String inputFile = args[1];
String outputDir = args[2];
boolean forTesting = args[3].equals("true");
- boolean liteBuild = args.length > 4 && args[4].equals("true");
+ boolean forAlternate = args[4].equals("true");
+ boolean liteBuild = args.length > 5 && args[5].equals("true");
String filePrefix;
- if (forTesting) {
+ if (forAlternate) {
+ filePrefix = outputDir + ALTERNATE_FORMATS_FILE_PREFIX;
+ } else if (forTesting) {
filePrefix = outputDir + TEST_META_DATA_FILE_PREFIX;
} else {
filePrefix = outputDir + META_DATA_FILE_PREFIX;
for (PhoneMetadata metadata : metadataCollection.getMetadataList()) {
String regionCode = metadata.getId();
- // For non-geographical country calling codes (e.g. +800), use the country calling codes
- // instead of the region code to form the file name.
- if (regionCode.equals("001")) {
+ // 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.getCountryCode());
}
PhoneMetadataCollection outMetadataCollection = new PhoneMetadataCollection();
Map<Integer, List<String>> countryCodeToRegionCodeMap =
BuildMetadataFromXml.buildCountryCodeToRegionCodeMap(metadataCollection);
- writeCountryCallingCodeMappingToJavaFile(countryCodeToRegionCodeMap, outputDir, forTesting);
+ writeCountryCallingCodeMappingToJavaFile(
+ countryCodeToRegionCodeMap, outputDir, forTesting, forAlternate);
} catch (Exception e) {
e.printStackTrace();
return false;
private static void writeCountryCallingCodeMappingToJavaFile(
Map<Integer, List<String>> countryCodeToRegionCodeMap,
- String outputDir, boolean forTesting) throws IOException {
+ String outputDir, boolean forTesting, boolean forAlternate) throws IOException {
String mappingClassName;
- if (forTesting) {
+ if (forAlternate) {
+ // For alternate formats there will be no region codes in the map (and a set would have been
+ // more appropriate), but we are lazy and re-use existing infrastructure.
+ mappingClassName = ALTERNATE_COUNTRY_CODE_TO_REGION_CODE_MAP_CLASS_NAME;
+ } else if (forTesting) {
mappingClassName = TEST_COUNTRY_CODE_TO_REGION_CODE_MAP_CLASS_NAME;
} else {
mappingClassName = COUNTRY_CODE_TO_REGION_CODE_MAP_CLASS_NAME;