<?php
// src/Controller/EventController.php
namespace App\Controller;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use App\Controller\DMAbstractController;
class EventController extends DMAbstractController
{
public function getElementaryQuery($uri)
{
$sparqlTemplate = <<<txt
construct { ?s ?p ?o }
WHERE
{
graph ?g {
bind(<__uri__> as ?s) .
graph ?g { ?s ?p ?o } .
}
}
txt;
$query = str_replace( "__uri__" , $uri , $sparqlTemplate);
return $query;
}
function getCreatorName($endpoint, $uri) {
$user = $this->getParameter('app.sparql_user');
$pass = $this->getParameter('app.sparql_pass');
$name = "Données sur le créateur inconnues dans cette base";
$auth = $user . ":" . $pass; // le dataset dmsites devrait être en libre accès
$queryTemplate = "select ?creatorName where { graph ?g { <__uri__> <http://www.w3.org/2004/02/skos/core#prefLabel> ?creatorName }}";
$query = str_replace( "__uri__" , $uri , $queryTemplate);
$requestURL = $endpoint.'?'
.'query='.urlencode($query)
.'&format=json';
$jsonres = self::request($requestURL, $auth);
$description = json_decode($jsonres, true);
// echo "description".print_r($description, true)."<br/>";
if (array_key_exists("results", $description)) {
if (array_key_exists("bindings", $description["results"])) {
if (count($description["results"]["bindings"])) {
if (array_key_exists("creatorName", $description["results"]["bindings"][0])) {
$name = $description["results"]["bindings"][0]["creatorName"]["value"];
} else {
$name = "Données sur le créateur non accessible"; // le recuperer sur le concept associé
}
}
}
}
return $name;
}
function getTitle($endpoint, $uri) {
$user = $this->getParameter('app.sparql_user');
$pass = $this->getParameter('app.sparql_pass');
$title = "Titre inconnu dans cette base";
$auth = $user . ":" . $pass; // le dataset dmsites devrait être en libre accès
$queryTemplate = "select ?title where { graph ?g { <__uri__> <http://www.cidoc-crm.org/cidoc-crm/P149_is_identified_by> ?title }}";
$query = str_replace( "__uri__" , $uri , $queryTemplate);
$requestURL = $endpoint.'?'
.'query='.urlencode($query)
.'&format=json';
$jsonres = self::request($requestURL, $auth);
//echo "jsonres: ". print_r($jsonres, true)."<br/>";
$description = json_decode($jsonres, true);
// echo "description".print_r($description, true)."<br/>";
if (array_key_exists("results", $description)) {
if (array_key_exists("bindings", $description["results"])) {
if (count($description["results"]["bindings"])) {
if (array_key_exists("title", $description["results"]["bindings"][0])) {
$title = $description["results"]["bindings"][0]["title"]["value"];
} else {
$title = "Non accessible"; // le recuperer sur le concept associé
}
}
}
}
return $title;
}
function eventStructurer($description) {
$descstruct = array();
$descstruct["types"] = array();
$descstruct["phys"] = $descstruct["concept"] ="";
$descstruct["creatoruri"] = array();
// echo "description: ".print_r($description, true)."\n"; a permis de détecter que certains événements n'ont pas de P108 et P94 associé!
if ($description) {
if (array_key_exists("http://www.cidoc-crm.org/cidoc-crm/P108_has_produced", $description)) $descstruct["phys"] = $description["http://www.cidoc-crm.org/cidoc-crm/P108_has_produced"]["@id"];
if (array_key_exists("http://www.cidoc-crm.org/cidoc-crm/P94_has_created", $description)) $descstruct["concept"] = $description["http://www.cidoc-crm.org/cidoc-crm/P94_has_created"]["@id"];
if (array_key_exists("cur:P108_has_produced", $description)) $descstruct["phys"] = str_replace("ex:",$description["@context"]["ex"],$description["cur:P108_has_produced"]["@id"]);
if (array_key_exists("cur:P94_has_created", $description)) $descstruct["concept"] = str_replace("ex:",$description["@context"]["ex"],$description["cur:P94_has_created"]["@id"]);
if (array_key_exists("http://www.cidoc-crm.org/cidoc-crm/P14_carried_out_by", $description)) {
if (array_key_exists("@id",$description["http://www.cidoc-crm.org/cidoc-crm/P14_carried_out_by"])) {
array_push($descstruct["creatoruri"], $description["http://www.cidoc-crm.org/cidoc-crm/P14_carried_out_by"]["@id"]);
} else {
foreach ($description["http://www.cidoc-crm.org/cidoc-crm/P14_carried_out_by"] as $crea) {
array_push($descstruct["creatoruri"], $crea["@id"]);
}
}
}
if (array_key_exists("http://www.cidoc-crm.org/cidoc-crm/P4_has_time_span", $description)) $descstruct["timespan"] = $description["http://www.cidoc-crm.org/cidoc-crm/P4_has_time_span"]["@id"];
#if (array_key_exists("@type", $description)) $descstruct["types"] = $description["@type"];
}
return $descstruct;
}
function eventDescription($desc, $format)
{
$uri = $desc["uri"];
$user = $this->getParameter('app.sparql_user');
$pass = $this->getParameter('app.sparql_pass');
// $auth = "student:igr2018%"; // le dataset dmsites devrait être en libre accès
$auth = $user . ":" . $pass; // le dataset dmsites devrait être en libre accès
//$format = "json";
$query = self::getElementaryQuery($uri);
$requestURL = $desc["eventendpoint"].'?'
.'query='.urlencode($query)
.'&format=json';
// echo "eventendpoint: ". print_r($desc["eventendpoint"], true)."<br/>";
// echo "uri: ". print_r($uri, true)."<br/>";
// echo "query: ". print_r($query, true)."<br/>";
$jsonres = self::request($requestURL, $auth);
// echo "jsonres: ". print_r($jsonres, true)."<br/>";
$description = json_decode($jsonres, true);
$descstruct = array();
$descstruct["class"] = array();
$descstruct = self::eventStructurer($description);
// aller chercher le titre
$descstruct["title"] = $this->getTitle($desc["eventendpoint"], $descstruct["concept"]);
$descstruct["altLabel"] = array();
$descstruct["dataset"] = "dmexpo ou SemJoconde";
// $descstruct["triplestore"] = "https://kg.grains-de-culture.fr/";
$descstruct["triplestore"] = "https://graphpat.telecom-paris.fr/";
$descstruct["query"] = $query;
$descstruct["jsonarray"] = $description;
$descstruct["url"] = $requestURL;
$descstruct["uri"] = $uri;
$descstruct["entitytype"] = "Evènement (exposition, acte de création...)";
$descstruct["entityid"] = $desc["id"];
if (count($descstruct["creatoruri"])) {
$descstruct["creatorLink"] = $descstruct["creatoruri"][0];
$descstruct["creatorName"] = $this->getCreatorName($desc["eventendpoint"], $descstruct["creatoruri"][0]);
} else {
$descstruct["creatorLink"] = "";
$descstruct["creatorName"] = "Créateur inconnu dans cette base";
}
if (!array_key_exists("timespan", $descstruct))
$descstruct["timespan"] = "<inconnue>";
$descstruct["jsonld"] = "";
$descstruct["altLabel"] = "";
$descstruct["uriville"] = "";
$descstruct["urljson"] = $descstruct["uri"].".json";
$yasguilink = "https://grains-de-culture.fr/fuseki/ui/#"
.'query='.urlencode(
str_replace("construct { ?s ?p ?o }", "select ?s ?p ?o", $query))
.'&contentTypeConstruct='.urlencode("text/turtle")
.'&contentTypeSelect='.urlencode("application/sparql-results+json")
.'&endpoint='.urlencode($desc["eventendpoint"])
.'&requestMethod=POST'
.'&tabTitle='.urlencode("Propriétés")
.'&headers=%7B%7D'
.'&outputFormat=table';
$descstruct["yasguilink"] = $yasguilink;
switch($format) {
case 'json':
$mime = $this->mimetype($format);
$response = new Response($jsonres,
Response::HTTP_OK,
array('content-type' => $mime)
);
break;
case 'xml':
$call = $desc["eventendpoint"].'?'
.'query='.urlencode($query)
.'&format='.$this->mimetype($format)
.'&output='.$format;
$mime = $this->mimetype($format);
$result =self::request($call, $auth);
$response = new Response($result,
Response::HTTP_OK,
array('content-type' => $mime)
);
break;
default:
$response = $this->render('event/dmcreationevent.html.twig', [
# $response = $this->render('work/dmdebugevent.html.twig', [
'desc' => $desc,
'descstruct' => $descstruct,
'entitytype' => $descstruct["entitytype"],
'description' => $description
]);
break;
}
$response->headers->addCacheControlDirective('must-revalidate', true);
$response->setSharedMaxAge(3600);
//$response->headers->set('Content-Type', 'application/json');
return $response;
}
/**
@Route("onto/event/creation/{id}.{_format}", defaults={"_format": "html"}, requirements={
* "_format": "html|json|xml|ttl"
* })
*/
public function dmcreationevent(Request $request, $id)
{
// exemple: http://datamusee.givingsense.eu/onto/event/creation/AE037477
$format = $this->getFormat($request);
$desc = array();
// 26/6/2024 changement de point car le report sur TPT ne marche pas actuellement
//$desc["eventendpoint"] = "https://kg.grains-de-culture.fr/SemJoconde/sparql";
$desc["eventendpoint"] = "https://graphpat.telecom-paris.fr/SemJoconde/sparql";
$desc["eventdataset"] = "SemJoconde";
$desc["eventgraph"] = "";
$desc["comment"] = "";
$desc["id"] = $id;
$desc["uri"] = "http://datamusee.givingsense.eu/onto/event/creation/".$desc["id"];
return self::eventDescription($desc, $format);
}
}