110 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  *
 | |
|  *
 | |
|  * @author joshuag
 | |
|  * @created: 04/08/2015 09:03
 | |
|  * @project libphonenumber-for-php
 | |
|  */
 | |
| 
 | |
| namespace libphonenumber;
 | |
| 
 | |
| 
 | |
| class MultiFileMetadataSourceImpl implements MetadataSourceInterface
 | |
| {
 | |
|     private static $metaDataFilePrefix = PhoneNumberUtil::META_DATA_FILE_PREFIX;
 | |
| 
 | |
|     /**
 | |
|      * A mapping from a region code to the PhoneMetadata for that region.
 | |
|      * @var PhoneMetadata[]
 | |
|      */
 | |
|     private $regionToMetadataMap = array();
 | |
| 
 | |
|     /**
 | |
|      * A mapping from a country calling code for a non-geographical entity to the PhoneMetadata for
 | |
|      * that country calling code. Examples of the country calling codes include 800 (International
 | |
|      * Toll Free Service) and 808 (International Shared Cost Service).
 | |
|      * @var PhoneMetadata[]
 | |
|      */
 | |
|     private $countryCodeToNonGeographicalMetadataMap = array();
 | |
| 
 | |
|     /**
 | |
|      * The prefix of the metadata files from which region data is loaded.
 | |
|      * @var String
 | |
|      */
 | |
|     private $currentFilePrefix;
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * The metadata loader used to inject alternative metadata sources.
 | |
|      * @var MetadataLoaderInterface
 | |
|      */
 | |
|     private $metadataLoader;
 | |
| 
 | |
|     /**
 | |
|      * @param MetadataLoaderInterface $metadataLoader
 | |
|      * @param string|null $currentFilePrefix
 | |
|      */
 | |
|     public function __construct(MetadataLoaderInterface $metadataLoader, $currentFilePrefix = null)
 | |
|     {
 | |
|         if ($currentFilePrefix === null) {
 | |
|             $currentFilePrefix = self::$metaDataFilePrefix;
 | |
|         }
 | |
| 
 | |
|         $this->currentFilePrefix = $currentFilePrefix;
 | |
|         $this->metadataLoader = $metadataLoader;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @inheritdoc
 | |
|      */
 | |
|     public function getMetadataForRegion($regionCode)
 | |
|     {
 | |
|         if (!array_key_exists($regionCode, $this->regionToMetadataMap)) {
 | |
|             // The regionCode here will be valid and won't be '001', so we don't need to worry about
 | |
|             // what to pass in for the country calling code.
 | |
|             $this->loadMetadataFromFile($this->currentFilePrefix, $regionCode, 0, $this->metadataLoader);
 | |
|         }
 | |
| 
 | |
|         return $this->regionToMetadataMap[$regionCode];
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @inheritdoc
 | |
|      */
 | |
|     public function getMetadataForNonGeographicalRegion($countryCallingCode)
 | |
|     {
 | |
|         if (!array_key_exists($countryCallingCode, $this->countryCodeToNonGeographicalMetadataMap)) {
 | |
|             $this->loadMetadataFromFile($this->currentFilePrefix, PhoneNumberUtil::REGION_CODE_FOR_NON_GEO_ENTITY, $countryCallingCode, $this->metadataLoader);
 | |
|         }
 | |
| 
 | |
|         return $this->countryCodeToNonGeographicalMetadataMap[$countryCallingCode];
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param string $filePrefix
 | |
|      * @param string $regionCode
 | |
|      * @param int $countryCallingCode
 | |
|      * @param MetadataLoaderInterface $metadataLoader
 | |
|      * @throws \RuntimeException
 | |
|      */
 | |
|     public function loadMetadataFromFile($filePrefix, $regionCode, $countryCallingCode, MetadataLoaderInterface $metadataLoader)
 | |
|     {
 | |
|         $isNonGeoRegion = PhoneNumberUtil::REGION_CODE_FOR_NON_GEO_ENTITY === $regionCode;
 | |
|         $fileName = $filePrefix . '_' . ($isNonGeoRegion ? $countryCallingCode : $regionCode) . '.php';
 | |
|         if (!is_readable($fileName)) {
 | |
|             throw new \RuntimeException('missing metadata: ' . $fileName);
 | |
|         } else {
 | |
|             $data = $metadataLoader->loadMetadata($fileName);
 | |
|             $metadata = new PhoneMetadata();
 | |
|             $metadata->fromArray($data);
 | |
|             if ($isNonGeoRegion) {
 | |
|                 $this->countryCodeToNonGeographicalMetadataMap[$countryCallingCode] = $metadata;
 | |
|             } else {
 | |
|                 $this->regionToMetadataMap[$regionCode] = $metadata;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
| }
 | 
