<exec executable="java">
<arg value="-jar" />
<arg value="${build.tools.jar}"/>
- <arg value="GenerateAreaCodeData"/>
+ <arg value="GeneratePhonePrefixData"/>
<arg value="${resources.dir}/geocoding/"/>
<arg value="geocoder/src/com/google/i18n/phonenumbers/geocoding/data"/>
</exec>
<exec executable="java">
<arg value="-jar" />
<arg value="${build.tools.jar}"/>
- <arg value="GenerateAreaCodeData"/>
+ <arg value="GeneratePhonePrefixData"/>
<arg value="${resources.dir}/test/geocoding/"/>
<arg value="geocoder/test/com/google/i18n/phonenumbers/geocoding/testing_data"/>
</exec>
<include name="**/geocoding/*.class"/>
<include name="**/prefixmapper/*.class"/>
<exclude name="**/*Test*"/>
- <exclude name="**/geocoding/GenerateAreaCodeData*"/>
</fileset>
<fileset dir="${geocoder.src.dir}">
<include name="**/geocoding/data/*"/>
+Sep 23, 2013: libphonenumber-5.8.6
+* Code changes:
+ - Restructured the geocoder binary generation code, moving the classes under tools/ from
+ geocoding/ to buildtools/ and renaming AreaCode to PhonePrefix.
+
Sep 23, 2013: libphonenumber-5.8.5
* Code changes:
- Restructured the geocoder, moving the utility classes to a new module internal/prefixmapper.
<!-- Add ../../../java/libphonenumber/src/ to make Phonemetadata.java available to
the source directories. -->
<source>../../../java/libphonenumber/src/</source>
- <!-- Add ../../../java/geocoder/src/ to make AreaCodeMap.java available to the
- source directories. -->
- <source>../../../java/geocoder/src/</source>
+ <!-- Add ../../../java/internal/phoneprefix/src/ to make PhonePrefixMap.java
+ available to the source directories. -->
+ <source>../../../java/internal/prefixmapper/src/</source>
<!-- Add ../common/src/ which contains BuildMetadataFromXml.java -->
<source>../common/src/</source>
</sources>
package com.google.i18n.phonenumbers;
-import com.google.i18n.phonenumbers.geocoding.GenerateAreaCodeDataEntryPoint;
+import com.google.i18n.phonenumbers.buildtools.GeneratePhonePrefixDataEntryPoint;
/**
* Entry point class for Java and JavaScript build tools.
boolean status = new CommandDispatcher(args, new Command[] {
new BuildMetadataJsonFromXml(),
new BuildMetadataProtoFromXml(),
- new GenerateAreaCodeDataEntryPoint(),
+ new GeneratePhonePrefixDataEntryPoint(),
}).start();
System.exit(status ? 0 : 1);
* limitations under the License.
*/
-package com.google.i18n.phonenumbers.geocoding;
+package com.google.i18n.phonenumbers.buildtools;
import java.io.Closeable;
import java.io.File;
import java.util.logging.Logger;
/**
- * Abstracts the way GenerateAreaCodeDataEntryPoint creates files and writes the area code data to
- * them.
+ * Abstracts the way GeneratePhonePrefixDataEntryPoint creates files and writes
+ * the phone prefix data to them.
*/
-public abstract class AbstractAreaCodeDataIOHandler {
+public abstract class AbstractPhonePrefixDataIOHandler {
private static final Logger LOGGER = Logger.getLogger(
- AbstractAreaCodeDataIOHandler.class.getName());
+ AbstractPhonePrefixDataIOHandler.class.getName());
/**
* Adds the provided file to a global output that can be for example a JAR.
*
* limitations under the License.
*/
-package com.google.i18n.phonenumbers.geocoding;
+package com.google.i18n.phonenumbers.buildtools;
+
+import com.google.i18n.phonenumbers.prefixmapper.MappingFileProvider;
+import com.google.i18n.phonenumbers.prefixmapper.PhonePrefixMap;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.util.regex.Pattern;
/**
- * A utility that generates the binary serialization of the area code/location mappings from
+ * A utility that generates the binary serialization of the phone prefix mappings from
* human-readable text files. It also generates a configuration file which contains information on
* data files available for use.
*
*
* @author Philippe Liard
*/
-public class GenerateAreaCodeData {
+public class GeneratePhonePrefixData {
// The path to the input directory containing the languages directories.
private final File inputPath;
private static final int NANPA_COUNTRY_CODE = 1;
private final Map<Integer /* country code */, SortedMap<Integer, String>> englishMaps =
new HashMap<Integer, SortedMap<Integer, String>>();
// The IO Handler used to output the generated binary files.
- private final AbstractAreaCodeDataIOHandler ioHandler;
+ private final AbstractPhonePrefixDataIOHandler ioHandler;
- private static final Logger LOGGER = Logger.getLogger(GenerateAreaCodeData.class.getName());
+ private static final Logger LOGGER = Logger.getLogger(GeneratePhonePrefixData.class.getName());
- public GenerateAreaCodeData(File inputPath, AbstractAreaCodeDataIOHandler ioHandler)
+ public GeneratePhonePrefixData(File inputPath, AbstractPhonePrefixDataIOHandler ioHandler)
throws IOException {
if (!inputPath.isDirectory()) {
throw new IOException("The provided input path does not exist: " +
/**
* Implement this interface to provide a callback to the parseTextFile() method.
*/
- static interface AreaCodeMappingHandler {
+ static interface PhonePrefixMappingHandler {
/**
* Method called every time the parser matches a mapping. Note that 'prefix' is the prefix as
* it is written in the text file (i.e phone number prefix appended to country code).
* mapping read.
*/
// @VisibleForTesting
- static void parseTextFile(InputStream input, AreaCodeMappingHandler handler) throws IOException {
+ static void parseTextFile(InputStream input,
+ PhonePrefixMappingHandler handler) throws IOException {
BufferedReader bufferedReader =
new BufferedReader(new InputStreamReader(
new BufferedInputStream(input), Charset.forName("UTF-8")));
}
/**
- * Writes the provided area code map to the provided output stream.
+ * Writes the provided phone prefix map to the provided output stream.
*
* @throws IOException
*/
// @VisibleForTesting
static void writeToBinaryFile(SortedMap<Integer, String> sortedMap, OutputStream output)
throws IOException {
- // Build the corresponding area code map and serialize it to the binary format.
- AreaCodeMap areaCodeMap = new AreaCodeMap();
- areaCodeMap.readAreaCodeMap(sortedMap);
+ // Build the corresponding phone prefix map and serialize it to the binary format.
+ PhonePrefixMap phonePrefixMap = new PhonePrefixMap();
+ phonePrefixMap.readPhonePrefixMap(sortedMap);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(output);
- areaCodeMap.writeExternal(objectOutputStream);
+ phonePrefixMap.writeExternal(objectOutputStream);
objectOutputStream.flush();
}
// @VisibleForTesting
static SortedMap<Integer, String> readMappingsFromTextFile(InputStream input)
throws IOException {
- final SortedMap<Integer, String> areaCodeMap = new TreeMap<Integer, String>();
- parseTextFile(input, new AreaCodeMappingHandler() {
+ final SortedMap<Integer, String> phonePrefixMap = new TreeMap<Integer, String>();
+ parseTextFile(input, new PhonePrefixMappingHandler() {
@Override
public void process(int prefix, String location) {
- if (areaCodeMap.put(prefix, location) != null) {
+ if (phonePrefixMap.put(prefix, location) != null) {
throw new RuntimeException(String.format("duplicated prefix %d", prefix));
}
}
});
- return areaCodeMap;
+ return phonePrefixMap;
}
private static class PhonePrefixLanguagePair {
// Fetch the 4-digit prefixes stored in the file.
final Set<Integer> phonePrefixes = new HashSet<Integer>();
FileInputStream inputStream = new FileInputStream(countryCodeFile);
- parseTextFile(inputStream, new AreaCodeMappingHandler() {
+ parseTextFile(inputStream, new PhonePrefixMappingHandler() {
@Override
public void process(int prefix, String location) {
phonePrefixes.add(Integer.parseInt(String.valueOf(prefix).substring(0, 4)));
/**
* Adds a phone number prefix/language mapping to the provided map. The prefix and language are
- * generated from the provided file name previously used to output the area code/location mappings
- * for the given country.
+ * generated from the provided file name previously used to output the phone prefix mappings for
+ * the given country.
*/
// @VisibleForTesting
static void addConfigurationMapping(SortedMap<Integer, Set<String>> availableDataFiles,
- File outputAreaCodeMappingsFile) {
- String outputAreaCodeMappingsFileName = outputAreaCodeMappingsFile.getName();
- PhonePrefixLanguagePair areaCodeLanguagePair =
- getPhonePrefixLanguagePairFromFilename(outputAreaCodeMappingsFileName);
- int prefix = Integer.parseInt(areaCodeLanguagePair.prefix);
- String language = areaCodeLanguagePair.language;
+ File outputPhonePrefixMappingsFile) {
+ String outputPhonePrefixMappingsFileName = outputPhonePrefixMappingsFile.getName();
+ PhonePrefixLanguagePair phonePrefixLanguagePair =
+ getPhonePrefixLanguagePairFromFilename(outputPhonePrefixMappingsFileName);
+ int prefix = Integer.parseInt(phonePrefixLanguagePair.prefix);
+ String language = phonePrefixLanguagePair.language;
Set<String> languageSet = availableDataFiles.get(prefix);
if (languageSet == null) {
languageSet = new HashSet<String>();
}
/**
- * Splits the provided area code map into multiple maps according to the provided list of output
- * binary files. A map associating output binary files to area code maps is returned as a result.
+ * Splits the provided phone prefix map into multiple maps according to the provided list of
+ * output binary files. A map associating output binary files to phone prefix maps is returned as
+ * a result.
* <pre>
* Example:
- * input map: { 12011: Location1, 12021: Location2 }
+ * input map: { 12011: Description1, 12021: Description2 }
* outputBinaryFiles: { 1201_en, 1202_en }
- * output map: { 1201_en: { 12011: Location1 }, 1202_en: { 12021: Location2 } }
+ * output map: { 1201_en: { 12011: Description1 }, 1202_en: { 12021: Description2 } }
* </pre>
*/
// @VisibleForTesting
break;
}
}
- SortedMap<Integer, String> mappingsForAreaCodeLangPair = mappingsForFiles.get(targetFile);
- if (mappingsForAreaCodeLangPair == null) {
- mappingsForAreaCodeLangPair = new TreeMap<Integer, String>();
- mappingsForFiles.put(targetFile, mappingsForAreaCodeLangPair);
+ SortedMap<Integer, String> mappingsForPhonePrefixLangPair = mappingsForFiles.get(targetFile);
+ if (mappingsForPhonePrefixLangPair == null) {
+ mappingsForPhonePrefixLangPair = new TreeMap<Integer, String>();
+ mappingsForFiles.put(targetFile, mappingsForPhonePrefixLangPair);
}
- mappingsForAreaCodeLangPair.put(mapping.getKey(), mapping.getValue());
+ mappingsForPhonePrefixLangPair.put(mapping.getKey(), mapping.getValue());
}
return mappingsForFiles;
}
}
/**
- * Runs the area code data generator.
+ * Runs the phone prefix data generator.
*
* @throws IOException
*/
ioHandler.closeFile(fileOutputStream);
ioHandler.close();
}
- LOGGER.log(Level.INFO, "Geocoding data successfully generated.");
+ LOGGER.log(Level.INFO, "Phone prefix data successfully generated.");
}
}
* limitations under the License.
*/
-package com.google.i18n.phonenumbers.geocoding;
+package com.google.i18n.phonenumbers.buildtools;
import com.google.i18n.phonenumbers.Command;
import java.util.logging.Logger;
/**
- * Entry point class used to invoke the generation of the binary geocoding data files.
+ * Entry point class used to invoke the generation of the binary phone prefix data files.
*
* @author Philippe Liard
*/
-public class GenerateAreaCodeDataEntryPoint extends Command {
- private static final Logger LOGGER = Logger.getLogger(GenerateAreaCodeData.class.getName());
+public class GeneratePhonePrefixDataEntryPoint extends Command {
+ private static final Logger LOGGER = Logger.getLogger(GeneratePhonePrefixData.class.getName());
@Override
public String getCommandName() {
- return "GenerateAreaCodeData";
+ return "GeneratePhonePrefixData";
}
@Override
if (args.length != 3) {
LOGGER.log(Level.SEVERE,
- "usage: GenerateAreaCodeData /path/to/input/directory /path/to/output/directory");
+ "usage: GeneratePhonePrefixData /path/to/input/directory /path/to/output/directory");
return false;
}
try {
- GenerateAreaCodeData generateAreaCodeData =
- new GenerateAreaCodeData(new File(args[1]), new AreaCodeDataIOHandler(new File(args[2])));
- generateAreaCodeData.run();
+ GeneratePhonePrefixData generatePhonePrefixData =
+ new GeneratePhonePrefixData(new File(args[1]), new PhonePrefixDataIOHandler(new File(args[2])));
+ generatePhonePrefixData.run();
} catch (IOException e) {
LOGGER.log(Level.SEVERE, e.getMessage());
return false;
* limitations under the License.
*/
-package com.google.i18n.phonenumbers.geocoding;
+package com.google.i18n.phonenumbers.buildtools;
import java.io.File;
import java.io.IOException;
/**
- * Implementation of the IOHandler required by the GenerateAreaCodeData class used here to create
+ * Implementation of the IOHandler required by the GeneratePhonePrefixData class used here to create
* the output files.
*/
-class AreaCodeDataIOHandler extends AbstractAreaCodeDataIOHandler {
+class PhonePrefixDataIOHandler extends AbstractPhonePrefixDataIOHandler {
// The path to the output directory.
private final File outputPath;
- public AreaCodeDataIOHandler(File outputPath) throws IOException {
+ public PhonePrefixDataIOHandler(File outputPath) throws IOException {
if (outputPath.exists()) {
if (!outputPath.isDirectory()) {
throw new IOException("Expected directory: " + outputPath.getAbsolutePath());
* limitations under the License.
*/
-package com.google.i18n.phonenumbers.geocoding;
+package com.google.i18n.phonenumbers.buildtools;
-import com.google.i18n.phonenumbers.geocoding.GenerateAreaCodeData.AreaCodeMappingHandler;
+import com.google.i18n.phonenumbers.buildtools.GeneratePhonePrefixData.PhonePrefixMappingHandler;
+import com.google.i18n.phonenumbers.prefixmapper.MappingFileProvider;
+import com.google.i18n.phonenumbers.prefixmapper.PhonePrefixMap;
import junit.framework.TestCase;
import java.util.TreeMap;
/**
- * Unittests for GenerateAreaCodeData.java
+ * Unittests for GeneratePhonePrefixData.java
*
* @author Philippe Liard
*/
-public class GenerateAreaCodeDataTest extends TestCase {
+public class GeneratePhonePrefixDataTest extends TestCase {
private static final SortedMap<Integer, Set<String>> AVAILABLE_DATA_FILES;
static {
SortedMap<Integer, Set<String>> temporaryMap = new TreeMap<Integer, Set<String>>();
// Languages for US.
- GenerateAreaCodeData.addConfigurationMapping(temporaryMap, new File("1_en"));
- GenerateAreaCodeData.addConfigurationMapping(temporaryMap, new File("1_en_US"));
- GenerateAreaCodeData.addConfigurationMapping(temporaryMap, new File("1_es"));
+ GeneratePhonePrefixData.addConfigurationMapping(temporaryMap, new File("1_en"));
+ GeneratePhonePrefixData.addConfigurationMapping(temporaryMap, new File("1_en_US"));
+ GeneratePhonePrefixData.addConfigurationMapping(temporaryMap, new File("1_es"));
// Languages for France.
- GenerateAreaCodeData.addConfigurationMapping(temporaryMap, new File("33_fr"));
- GenerateAreaCodeData.addConfigurationMapping(temporaryMap, new File("33_en"));
+ GeneratePhonePrefixData.addConfigurationMapping(temporaryMap, new File("33_fr"));
+ GeneratePhonePrefixData.addConfigurationMapping(temporaryMap, new File("33_en"));
// Languages for China.
- GenerateAreaCodeData.addConfigurationMapping(temporaryMap, new File("86_zh_Hans"));
+ GeneratePhonePrefixData.addConfigurationMapping(temporaryMap, new File("86_zh_Hans"));
AVAILABLE_DATA_FILES = Collections.unmodifiableSortedMap(temporaryMap);
}
public void testOutputBinaryConfiguration() throws IOException {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
- GenerateAreaCodeData.outputBinaryConfiguration(AVAILABLE_DATA_FILES, byteArrayOutputStream);
+ GeneratePhonePrefixData.outputBinaryConfiguration(AVAILABLE_DATA_FILES, byteArrayOutputStream);
MappingFileProvider mappingFileProvider = new MappingFileProvider();
mappingFileProvider.readExternal(
new ObjectInputStream(new ByteArrayInputStream(byteArrayOutputStream.toByteArray())));
private static Map<Integer, String> parseTextFileHelper(String input) throws IOException {
final Map<Integer, String> mappings = new HashMap<Integer, String>();
- GenerateAreaCodeData.parseTextFile(new ByteArrayInputStream(input.getBytes()),
- new AreaCodeMappingHandler() {
+ GeneratePhonePrefixData.parseTextFile(new ByteArrayInputStream(input.getBytes()),
+ new PhonePrefixMappingHandler() {
@Override
- public void process(int areaCode, String location) {
- mappings.put(areaCode, location);
+ public void process(int phonePrefix, String location) {
+ mappings.put(phonePrefix, location);
}
});
return mappings;
mappings.put(12022, "Location4");
Map<File, SortedMap<Integer, String>> splitMaps =
- GenerateAreaCodeData.splitMap(mappings, outputFiles);
+ GeneratePhonePrefixData.splitMap(mappings, outputFiles);
assertEquals(2, splitMaps.size());
assertEquals("Location1", splitMaps.get(new File("1201_en")).get(12011));
assertEquals("Location2", splitMaps.get(new File("1201_en")).get(12012));
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(input.getBytes());
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
- SortedMap<Integer, String> areaCodeMappings =
- GenerateAreaCodeData.readMappingsFromTextFile(byteArrayInputStream);
- GenerateAreaCodeData.writeToBinaryFile(areaCodeMappings, byteArrayOutputStream);
- // The byte array output stream now contains the corresponding serialized area code map. Try
+ SortedMap<Integer, String> phonePrefixMappings =
+ GeneratePhonePrefixData.readMappingsFromTextFile(byteArrayInputStream);
+ GeneratePhonePrefixData.writeToBinaryFile(phonePrefixMappings, byteArrayOutputStream);
+ // The byte array output stream now contains the corresponding serialized phone prefix map. Try
// to deserialize it and compare it with the initial input.
- AreaCodeMap areaCodeMap = new AreaCodeMap();
- areaCodeMap.readExternal(
+ PhonePrefixMap phonePrefixMap = new PhonePrefixMap();
+ phonePrefixMap.readExternal(
new ObjectInputStream(new ByteArrayInputStream(byteArrayOutputStream.toByteArray())));
- return areaCodeMap.toString();
+ return phonePrefixMap.toString();
}
public void testConvertData() throws IOException {
assertEquals(input, dataAfterDeserialization);
}
- public void testConvertDataThrowsExceptionWithDuplicatedAreaCodes() throws IOException {
+ public void testConvertDataThrowsExceptionWithDuplicatedPhonePrefixes() throws IOException {
String input = "331|Paris\n331|Marseilles\n";
try {
}
public void testGetEnglishDataPath() {
- assertEquals("/path/en/33.txt", GenerateAreaCodeData.getEnglishDataPath("/path/fr/33.txt"));
+ assertEquals("/path/en/33.txt", GeneratePhonePrefixData.getEnglishDataPath("/path/fr/33.txt"));
}
public void testHasOverlap() {
map.put(123, "");
map.put(2345, "");
- assertTrue(GenerateAreaCodeData.hasOverlappingPrefix(1234, map));
- assertFalse(GenerateAreaCodeData.hasOverlappingPrefix(2345, map));
+ assertTrue(GeneratePhonePrefixData.hasOverlappingPrefix(1234, map));
+ assertFalse(GeneratePhonePrefixData.hasOverlappingPrefix(2345, map));
}
public void testCompressAccordingToEnglishDataMakesDescriptionEmpty() {
// The English map should not be modified.
englishMappings = Collections.unmodifiableSortedMap(englishMappings);
- GenerateAreaCodeData.compressAccordingToEnglishData(englishMappings, frenchMappings);
+ GeneratePhonePrefixData.compressAccordingToEnglishData(englishMappings, frenchMappings);
assertEquals(2, frenchMappings.size());
assertEquals("Genève", frenchMappings.get(411));
// The English map should not be modified.
englishMappings = Collections.unmodifiableSortedMap(englishMappings);
- GenerateAreaCodeData.compressAccordingToEnglishData(englishMappings, frenchMappings);
+ GeneratePhonePrefixData.compressAccordingToEnglishData(englishMappings, frenchMappings);
assertEquals(1, frenchMappings.size());
assertEquals("Genève", frenchMappings.get(411));
// The English map should not be modified.
englishMappings = Collections.unmodifiableSortedMap(englishMappings);
- GenerateAreaCodeData.compressAccordingToEnglishData(englishMappings, frenchMappings);
+ GeneratePhonePrefixData.compressAccordingToEnglishData(englishMappings, frenchMappings);
assertEquals(0, frenchMappings.size());
}
// The French map should not be modified.
frenchMappings = Collections.unmodifiableSortedMap(frenchMappings);
- GenerateAreaCodeData.removeEmptyEnglishMappings(frenchMappings, "fr");
+ GeneratePhonePrefixData.removeEmptyEnglishMappings(frenchMappings, "fr");
assertEquals(2, frenchMappings.size());
}
englishMappings.put(331, "Paris");
englishMappings.put(334, "");
- GenerateAreaCodeData.removeEmptyEnglishMappings(englishMappings, "en");
+ GeneratePhonePrefixData.removeEmptyEnglishMappings(englishMappings, "en");
assertEquals(1, englishMappings.size());
assertEquals("Paris", englishMappings.get(331));