Home | History | Annotate | Download | only in geocoding
      1 /*
      2  * Copyright (C) 2011 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 
     17 package com.android.i18n.phonenumbers.geocoding;
     18 
     19 import java.io.IOException;
     20 import java.io.ObjectInput;
     21 import java.io.ObjectOutput;
     22 import java.util.SortedMap;
     23 import java.util.TreeSet;
     24 
     25 /**
     26  * Abstracts the way area code data is stored into memory and serialized to a stream. It is used by
     27  * {@link AreaCodeMap} to support the most space-efficient storage strategy according to the
     28  * provided data.
     29  *
     30  * @author Philippe Liard
     31  */
     32 abstract class AreaCodeMapStorageStrategy {
     33   protected int numOfEntries = 0;
     34   protected final TreeSet<Integer> possibleLengths = new TreeSet<Integer>();
     35 
     36   /**
     37    * Gets the phone number prefix located at the provided {@code index}.
     38    *
     39    * @param index  the index of the prefix that needs to be returned
     40    * @return  the phone number prefix at the provided index
     41    */
     42   public abstract int getPrefix(int index);
     43 
     44   /**
     45    * Gets the description corresponding to the phone number prefix located at the provided {@code
     46    * index}. If the description is not available in the current language an empty string is
     47    * returned.
     48    *
     49    * @param index  the index of the phone number prefix that needs to be returned
     50    * @return  the description corresponding to the phone number prefix at the provided index
     51    */
     52   public abstract String getDescription(int index);
     53 
     54   /**
     55    * Sets the internal state of the underlying storage implementation from the provided {@code
     56    * sortedAreaCodeMap} that maps phone number prefixes to description strings.
     57    *
     58    * @param sortedAreaCodeMap  a sorted map that maps phone number prefixes including country
     59    *    calling code to description strings
     60    */
     61   public abstract void readFromSortedMap(SortedMap<Integer, String> sortedAreaCodeMap);
     62 
     63   /**
     64    * Sets the internal state of the underlying storage implementation reading the provided {@code
     65    * objectInput}.
     66    *
     67    * @param objectInput  the object input stream from which the area code map is read
     68    * @throws IOException  if an error occurred reading the provided input stream
     69    */
     70   public abstract void readExternal(ObjectInput objectInput) throws IOException;
     71 
     72   /**
     73    * Writes the internal state of the underlying storage implementation to the provided {@code
     74    * objectOutput}.
     75    *
     76    * @param objectOutput  the object output stream to which the area code map is written
     77    * @throws IOException  if an error occurred writing to the provided output stream
     78    */
     79   public abstract void writeExternal(ObjectOutput objectOutput) throws IOException;
     80 
     81   /**
     82    * @return  the number of entries contained in the area code map
     83    */
     84   public int getNumOfEntries() {
     85     return numOfEntries;
     86   }
     87 
     88   /**
     89    * @return  the set containing the possible lengths of prefixes
     90    */
     91   public TreeSet<Integer> getPossibleLengths() {
     92     return possibleLengths;
     93   }
     94 
     95   @Override
     96   public String toString() {
     97     StringBuilder output = new StringBuilder();
     98     int numOfEntries = getNumOfEntries();
     99 
    100     for (int i = 0; i < numOfEntries; i++) {
    101       output.append(getPrefix(i))
    102           .append("|")
    103           .append(getDescription(i))
    104           .append("\n");
    105     }
    106     return output.toString();
    107   }
    108 }
    109