server/src/app/Services/ViafResolver.php
author ymh <ymh.work@gmail.com>
Thu, 25 Feb 2016 21:26:15 +0100
changeset 133 821253d361d1
parent 23 037687868bc4
child 524 85e8382852e7
permissions -rw-r--r--
add bnf resolver
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
23
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
namespace CorpusParole\Services;
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
use CorpusParole\Services\ViafResolverInterface;
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
use Cache;
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
use Config;
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
use EasyRdf\Graph;
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
use GuzzleHttp\Client;
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
use GuzzleHttp\Exception\RequestException;
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
use GuzzleHttp\Exception\ClientException;
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
use GuzzleHttp\Exception\GuzzleException;
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
use Illuminate\Contracts\Cache\Repository as CacheRepository;
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
class ViafResolver implements ViafResolverInterface {
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
    private $client = null;
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
    public function __construct(Client $httpClient) {
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
        $this->client = $httpClient;
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
    }
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
    /**
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
     * make the viaf query.
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
     */
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
    public function queryName($id) {
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
        $url = config('corpusparole.viaf_base_url').$id;
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
        try {
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
            $response = $this->client->get($url."/", ['headers'=>['Accept' => 'application/rdf+xml'],]);
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
        }
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
        catch(ClientException $e) {
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
            if($e->getResponse()->getStatusCode() === 404) {
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
                return null;
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
            } else {
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
                throw new ViafResolverException(
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
                    $e->getMessage(),
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
                    $e->getResponse()->getStatusCode(),
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
                    $e
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
                );
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
            }
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
        }
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
        catch(RequestException $e) {
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
            throw new ViafResolverException(
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
                $e->getMessage(),
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
                $e->hasResponse()?$e->getResponse()->getStatusCode():500,
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
                $e
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
            );
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
        }
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
        $graph = new Graph($url, $response->getBody());
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
        $names = [];
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
        foreach ($graph->allLiterals("<$url>", "schema:name") as $nameLit) {
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
            $lang = $nameLit->getLang();
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
            if(!$lang && !isset($names[''])) {
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
                $names[''] = $nameLit->getvalue();
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
            }
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
            elseif (strpos($lang, 'fr') === 0 && !isset($names['fr'])) {
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
                $names['fr'] = $nameLit->getvalue();
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
            }
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
            elseif (strpos($lang, 'en') === 0 && !isset($names['en'])) {
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
                $names['en'] = $nameLit->getvalue();
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
            }
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
        }
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
        return (isset($names['fr'])) ? $names['fr'] : ((isset($names['en'])) ? $names['en'] : ((isset($names['']))? $names[''] : null));
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
    }
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
    /**
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
     * Check viaf id format
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
     */
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
    private function checkViafIdFormat($viafid) {
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
        return ctype_digit($viafid);
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
    }
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
    /**
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
     * Get name from Viaf id
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
     * @param string $id The id to resolve. Can be an url starting with http://viaf.org/viaf/
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
     * @return a string with the name
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
     */
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
    public function getName($id) {
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
        $viafid = $id;
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
        if(strpos($id, config('corpusparole.viaf_base_url')) === 0) {
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
            $viafid = substr($id, strlen(config('corpusparole.viaf_base_url')));
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
        }
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
        $viafid = rtrim($viafid, '/');
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
        if(!$this->checkViafIdFormat($viafid)) {
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
            throw new ViafResolverException("ViafId not in correct format", 400);
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
        }
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
        $that = $this;
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
        return Cache::remember("viaf:$viafid", config('corpusparole.viaf_cache_expiration'), function() use ($that, $viafid)  {
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
            return $that->queryName($viafid);
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
        });
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
    }
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
    /**
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
     * Get a list of names from an array of viaf ids.
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
     * @param array $ids The array of ids to resolve.
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
     *                   Each id can be an url starting with http://viaf.org/viaf/
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
     */
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
    public function getNames(array $ids) {
133
821253d361d1 add bnf resolver
ymh <ymh.work@gmail.com>
parents: 23
diff changeset
   110
821253d361d1 add bnf resolver
ymh <ymh.work@gmail.com>
parents: 23
diff changeset
   111
        if(count($ids) > config('corpusparole.viaf_max_ids')) {
821253d361d1 add bnf resolver
ymh <ymh.work@gmail.com>
parents: 23
diff changeset
   112
            throw new ViafResolverException("Too manys ids provided");
821253d361d1 add bnf resolver
ymh <ymh.work@gmail.com>
parents: 23
diff changeset
   113
        }
821253d361d1 add bnf resolver
ymh <ymh.work@gmail.com>
parents: 23
diff changeset
   114
23
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
        return array_combine($ids, array_map([$this,'getName'], $ids));
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
    }
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
037687868bc4 add viaf resolver service & api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
}