<?php 
declare(strict_types=1); 
 
namespace frdlweb\Api\Rpc; 
 
use Opis\JsonSchema\Loaders\File; 
use Opis\JsonSchema\Schema; 
 
class SchemaLoader extends File 
{ 
    /** @var string[] */ 
    protected $dirs; 
    /** @var string */ 
    protected $prefix; 
    /** @var int */ 
    protected $prefixLength; 
     
    protected $cacheDir; 
    /** 
     * File constructor. 
     * @param string $prefix 
     * @param string[] $dirs 
     */ 
    public function __construct(string $prefix = '', array $dirs,string $cacheDir = null) 
    { 
         
         
        $this->dirs = $dirs; 
        $this->prefix = $prefix; 
        $this->prefixLength = strlen($prefix); 
        if(!$cacheDir){ 
           $cacheDir = sys_get_temp_dir() . \DIRECTORY_SEPARATOR . get_current_user(). \DIRECTORY_SEPARATOR . 'json-schema-store' . \DIRECTORY_SEPARATOR;     
        } 
        $this->cacheDir = $cacheDir; 
         
    } 
     
     
    public function prueCache(int $limit = 86400, $removeDir = false, $skipDotFiles = true){ 
        return \webfan\hps\patch\Fs::pruneDir($this->cacheDir, $limit, $skipDotFiles, $removeDir); 
    } 
     
    public function filepath($uri){ 
       $path = str_replace(['http://', 'https://', '/'], ['','',\DIRECTORY_SEPARATOR], $uri); 
       return rtrim($this->cacheDir, \DIRECTORY_SEPARATOR.'/ ').\DIRECTORY_SEPARATOR.$path;     
    } 
    /** 
     * @inheritDoc 
     */ 
    public function loadSchema(string $uri) 
    { 
        if (isset($this->schemas[$uri])) { 
            return $this->schemas[$uri]; 
        } 
        if ($this->prefixLength !== 0 && strpos($uri, $this->prefix) !== 0) { 
            return null; 
        } 
        $path = substr($uri, $this->prefixLength); 
         
         
        $schema = null; 
         
         
        $cacheFile = $this->filepath($uri); 
             
         
        if(file_exists($cacheFile) && is_file($cacheFile)){ 
               $schema = json_decode(file_get_contents($cacheFile), false); 
               $schema = new Schema($schema, $uri);             
        } 
         
     if(null === $schema){     
        foreach ($this->dirs as $dir) { 
            if (file_exists($dir . $path)) { 
                $schema = json_decode(file_get_contents($dir . $path), false); 
                $schema = new Schema($schema, $uri); 
                break; 
            } 
        } 
     } 
         
     
             if(null === $schema){     
                 
                 $c = file_get_contents($uri); 
                 if(false!==$c){ 
                    if(!is_dir(dirname($cacheFile))){ 
                       mkdir($cacheFile, 0755, true);     
                    } 
                    file_put_contents($cacheFile, $c);  
                    $schema = json_decode($c, false); 
                    $schema = new Schema($schema, $uri);                      
                 } 
             } 
         
         
         
 
        $this->schemas[$uri] = $schema; 
        return $schema; 
    } 
} 
 
 
 |