diff -r a50cbd7d702f -r 037687868bc4 server/src/app/Services/ViafResolver.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/src/app/Services/ViafResolver.php Thu Dec 10 16:05:53 2015 +0100 @@ -0,0 +1,114 @@ +client = $httpClient; + } + + /** + * make the viaf query. + */ + public function queryName($id) { + + $url = config('corpusparole.viaf_base_url').$id; + + try { + $response = $this->client->get($url."/", ['headers'=>['Accept' => 'application/rdf+xml'],]); + } + catch(ClientException $e) { + if($e->getResponse()->getStatusCode() === 404) { + return null; + } else { + throw new ViafResolverException( + $e->getMessage(), + $e->getResponse()->getStatusCode(), + $e + ); + } + } + catch(RequestException $e) { + throw new ViafResolverException( + $e->getMessage(), + $e->hasResponse()?$e->getResponse()->getStatusCode():500, + $e + ); + } + + $graph = new Graph($url, $response->getBody()); + $names = []; + foreach ($graph->allLiterals("<$url>", "schema:name") as $nameLit) { + $lang = $nameLit->getLang(); + if(!$lang && !isset($names[''])) { + $names[''] = $nameLit->getvalue(); + } + elseif (strpos($lang, 'fr') === 0 && !isset($names['fr'])) { + $names['fr'] = $nameLit->getvalue(); + } + elseif (strpos($lang, 'en') === 0 && !isset($names['en'])) { + $names['en'] = $nameLit->getvalue(); + } + } + + return (isset($names['fr'])) ? $names['fr'] : ((isset($names['en'])) ? $names['en'] : ((isset($names['']))? $names[''] : null)); + + } + + /** + * Check viaf id format + */ + private function checkViafIdFormat($viafid) { + return ctype_digit($viafid); + } + + /** + * Get name from Viaf id + * @param string $id The id to resolve. Can be an url starting with http://viaf.org/viaf/ + * @return a string with the name + */ + public function getName($id) { + $viafid = $id; + if(strpos($id, config('corpusparole.viaf_base_url')) === 0) { + $viafid = substr($id, strlen(config('corpusparole.viaf_base_url'))); + } + $viafid = rtrim($viafid, '/'); + + if(!$this->checkViafIdFormat($viafid)) { + throw new ViafResolverException("ViafId not in correct format", 400); + } + + $that = $this; + + return Cache::remember("viaf:$viafid", config('corpusparole.viaf_cache_expiration'), function() use ($that, $viafid) { + + return $that->queryName($viafid); + + }); + + } + + /** + * Get a list of names from an array of viaf ids. + * @param array $ids The array of ids to resolve. + * Each id can be an url starting with http://viaf.org/viaf/ + */ + public function getNames(array $ids) { + return array_combine($ids, array_map([$this,'getName'], $ids)); + } + + +}