<?php
// src/Controller/WorkController.php
namespace App\Controller;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class WorkController extends DMAbstractController
{
function creationeventStructurer($description)
{
$descstruct = array();
$descstruct["class"] = array();
$item = $description["results"]["bindings"][0];
$descstruct["timespan"] = ""; // TODO mettre ce champs à jour
$descstruct["name"] = $descstruct["entityid"] = $descstruct["productid"] = $descstruct["family"] =
$descstruct["musee"] = $descstruct["note"] = $descstruct["title"] = "";
$descstruct["musee"] = $item["label"]["value"];
$descstruct["physical"] = $item["physical"]["value"];
$descstruct["concept"] = $item["concept"]["value"];
if (array_key_exists("createur", $item)) {
$descstruct["createur"] = $item["createur"]["value"];
$descstruct["createurlabel"] = $item["createurlabel"]["value"];
} else $descstruct["createur"] = $descstruct["createurlabel"] = "";
if (array_key_exists("title", $item))
$descstruct["title"] = $item["title"]["value"];
else
$descstruct["title"] = "<titre inconnu dans cette base>";
/*
* if (array_key_exists("note", $item))
$descstruct["note"] = $item["note"]["value"];
*/
return $descstruct;
}
function creationeventDescription($desc)
{
$uri = $desc["uri"];
$user = $this->getParameter('app.sparql_user');
$pass = $this->getParameter('app.sparql_pass');
$auth = $user . ":" . $pass; // le dataset dmsites devrait être en libre accès
$format = "application/sparql-results+json";
$sparqltemplate = <<<txt
prefix ecrm: <http://www.cidoc-crm.org/cidoc-crm/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
select distinct ?site ?source ?label ?acte ?concept ?createur ?createurlabel ?title ?note ?physical #?p ?o
where {
# temporaire cause mauvais report sur tpt values ?dmsiteservice { <https://kg.grains-de-culture.fr/dmsites/sparql>}
values ?dmsiteservice { <https://graphpat.telecom-paris.fr/dmsites/sparql>}
graph ?g {
<__uri__>
ecrm:P108_has_produced ?physical ;
ecrm:P94_has_created ?concept .
OPTIONAL {
<__uri__> ecrm:P14_carried_out_by ?createur . # et si plusieurs créateurs?
?createur rdfs:label ?createurlabel .
}
OPTIONAL {
?concept ecrm:P149_is_identified_by ?title
}
OPTIONAL {
?concept ecrm:P3_has_note ?note
}
?physical
<http://datamusee.givingsense.eu/onto/DMP18_has_current_curator> ?site;
<http://datamusee.givingsense.eu/onto/PX1_source> ?source.
service ?dmsiteservice {
?site skos:prefLabel ?label
filter(lang(?label)="fr")
}
}
}
txt;
$query = str_replace("__uri__", $uri, $sparqltemplate);
$endpoint = $desc["endpoint"];
$requestURL = $endpoint . '?'
. 'query=' . urlencode($query)
. '&format=' . urlencode($format);
$description = json_decode(self::request($requestURL, $auth), true);
if (!(array_key_exists("results", $description)) or (count($description["results"]["bindings"])==0))
{
foreach ($desc["altendpoints"] as $endpoint) {
$desc["endpoint"] = $endpoint;
$requestURL = $endpoint . '?'
. 'query=' . urlencode($query)
. '&format=' . urlencode($format);
$description = json_decode(self::request($requestURL, $auth), true);
if (count($description) != 0) break;
}
}
$descstruct["name"] = "";
$descstruct["musee"] = "";
$descstruct["acte"] = "";
$descstruct["concept"] = "";
$descstruct["note"] = "";
$descstruct = self::creationeventStructurer($description);
$descstruct["dataset"] = "dm";
$descstruct["timespan"] = ""; // TODO mettre ce champs à jour
// 26/6/2024 changement de point car le report sur TPT ne marche pas actuellement
// $descstruct["triplestore"] = "https://kg.grains-de-culture.fr/";
$descstruct["triplestore"] = "https://kg.grains-de-culture.fr/";
$descstruct["query"] = $query;
$descstruct["jsonarray"] = $description;
$descstruct["url"] = $requestURL;
$descstruct["uri"] = $uri;
$descstruct["entitytype"] = "Evénement de création";
/* $descstruct["entityid"] = $entityid; */
//return $this->render('work/dmcreationevent.html.twig', [
return $this->render('testTemplateSite.html.twig', [
'desc' => $desc,
'descstruct' => $descstruct,
'entitytype' => $descstruct["entitytype"],
//'description' => $description
'description' => count($description) /* => self::printArray($description), */
]);
}
function workconceptStructurer($description)
{
$descstruct = array();
$descstruct["class"] = array();
$descstruct["name"] = "";
$descstruct["musee"] = "";
$descstruct["museelabel"] = "";
$descstruct["acte"] = "";
$descstruct["concept"] = "";
$descstruct["note"] = "";
$descstruct["physical"] = "";
if (count($description["results"]["bindings"])) {
$item = $description["results"]["bindings"][0];
$descstruct["name"] = $descstruct["entityid"] = $descstruct["productid"] = $descstruct["physical"] =
$descstruct["musee"] = $descstruct["museelabel"] = $descstruct["note"] = "";
if (array_key_exists("label", $item)) {
$descstruct["museelabel"] = $item["label"]["value"];
}
$descstruct["musee"] = $item["site"]["value"];
$descstruct["acte"] = $item["acte"]["value"];
$descstruct["concept"] = $item["concept"]["value"];
$descstruct["physical"] = $item["physical"]["value"];
if (array_key_exists("createur", $item)) {
$descstruct["createur"] = $item["createur"]["value"];
$descstruct["createurlabel"] = $item["createurlabel"]["value"];
} else {
$descstruct["createur"] = "";
$descstruct["createurlabel"] = "<inconnu>";
}
if (array_key_exists("title", $item))
$descstruct["title"] = $item["title"]["value"];
else
$descstruct["title"] = "l'oeuvre n'a pas de titre connu dans cette base";
/*
* if (array_key_exists("note", $item))
$descstruct["note"] = $item["note"]["value"];
*/
}
return $descstruct;
}
function workconceptDescription($desc, $format)
{
$uri = $desc["uri"];
$user = $this->getParameter('app.sparql_user');
$pass = $this->getParameter('app.sparql_pass');
$auth = $user . ":" . $pass; // le dataset dmsites devrait être en libre accès
//$format = "application/sparql-results+json";
$reqformat = $format;
if ($reqformat=="html")
$reqformat = "json";
$sparqltemplate = <<<txt
prefix ecrm: <http://www.cidoc-crm.org/cidoc-crm/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
select distinct ?concept ?site ?source ?label ?acte ?concept ?createur ?createurlabel ?title ?note ?physical #?p ?o
where {
values ?concept {<__uri__> } .
graph ?g {
?concept ecrm:P65_is_shown_by ?physical .
?physical <http://datamusee.givingsense.eu/onto/DMP18_has_current_curator> ?site.
?acte ecrm:P108_has_produced ?physical ;
OPTIONAL {
?acte ecrm:P14_carried_out_by ?createur . # et si plusieurs créateurs?
?createur rdfs:label ?createurlabel .
}
OPTIONAL {
?concept ecrm:P149_is_identified_by ?title
}
OPTIONAL {
?concept ecrm:P3_has_note ?note
}
#service <https://kg.grains-de-culture.fr/dmsites/sparql>
OPTIONAL {
?site rdfs:label*/skos:prefLabel* ?label
filter(lang(?label)="fr")
}
}
}
txt;
$query = str_replace("__uri__", $uri, $sparqltemplate);
$requestURL = $desc["endpoint"] . '?'
. 'query=' . urlencode($query)
. '&format=' . urlencode($reqformat);
$jsonres = self::request($requestURL, $auth);
$description = json_decode($jsonres, true);
if (($description==null) or (!(array_key_exists("results", $description)) or (count($description["results"]["bindings"])==0)))
{
foreach ($desc["altendpoints"] as $endpoint) {
$desc["endpoint"] = $endpoint;
$requestURL = $endpoint . '?'
. 'query=' . urlencode($query)
. '&format=' . urlencode($reqformat);
$jsonres = self::request($requestURL, $auth);
$description = json_decode($jsonres, true);
if (count($description["results"]["bindings"]) != 0) break;
# les sites de SemJoconde n'ont pas été reportés dans le dataset dmsites => chercher directement sans appel au service
$query = str_replace("service <https://kg.grains-de-culture.fr/dmsites/sparql>", "", $query);
$query = str_replace("service <https://graphpat.telecom-paris.fr/dmsites/sparql>", "", $query);
$requestURL = $endpoint . '?'
. 'query=' . urlencode($query)
. '&format=' . urlencode($reqformat);
$jsonres = self::request($requestURL, $auth);
//echo $jsonres;
$description = json_decode($jsonres, true);
if (count($description["results"]["bindings"]) != 0) break;
}
}
$descstruct = self::workconceptStructurer($description);
$descstruct["dataset"] = "dm";
// 26/6/2024 changement de point car le report sur TPT ne marche pas actuellement
// $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"] = "Eléments conceptuels décrivant la création";
/* $descstruct["entityid"] = $entityid; */
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('work/dmconcept.html.twig', [
// $this->render('testTemplateConcept2.html.twig', [
'desc' => $desc,
'descstruct' => $descstruct,
'entitytype' => $descstruct["entitytype"],
'description' => $description
//'description' => count($description) /* => self::printArray($description), */
//'description' => var_dump($description)
]);
break;
}
$response->headers->addCacheControlDirective('must-revalidate', true);
$response->setSharedMaxAge(3600);
//$response->headers->set('Content-Type', 'application/json');
return $response;
}
function physicalworkStructurer($description)
{
/*
*
$descstruct = array();
$descstruct["types"] = array();
$descstruct["name"] = $descstruct["musee"] =$descstruct["acte"] =$descstruct["concept"] =$descstruct["title"] =
$descstruct["createur"] = $descstruct["createurlabel"] = $descstruct["note"] = "";
if ($description) {
if (array_key_exists("P108_has_produced", $description)) $descstruct["phys"] = $description["P108_has_produced"];
if (array_key_exists("P94_has_created", $description)) $descstruct["concept"] = $description["P94_has_created"];
if (array_key_exists("P4_has_time_span", $description)) $descstruct["timespan"] = $description["P4_has_time_span"];
#if (array_key_exists("@type", $description)) $descstruct["types"] = $description["@type"];
}
return $descstruct;
*/
$descstruct = array();
$descstruct["class"] = array();
$descstruct["name"] = $descstruct["entityid"] = $descstruct["productid"] = $descstruct["family"] =
$descstruct["musee"] =$descstruct["museelabel"] = $descstruct["note"] = "";
$descstruct["acte"] = "";
$descstruct["concept"] = "";
$descstruct["title"] = "pas de titre connu pour l'oeuvre";
$descstruct["createur"] = "";
$descstruct["createurlabel"] = "<inconnu>";
// echo "count ".count($description["results"]["bindings"]);
if (count($description["results"]["bindings"])) {
$item = $description["results"]["bindings"][0];
if (array_key_exists("label", $item)) {
$descstruct["museelabel"] = $item["label"]["value"];
} elseif (array_key_exists("labelJoc", $item)) {
$descstruct["museelabel"] = $item["labelJoc"]["value"];
}
$descstruct["musee"] = $item["site"]["value"];
$descstruct["acte"] = $item["acte"]["value"];
$descstruct["concept"] = $item["concept"]["value"];
$descstruct["timespan"] ="";
if (array_key_exists("createur", $item)) {
$descstruct["createur"] = $item["createur"]["value"];
$descstruct["createurlabel"] = $item["createurlabel"]["value"];
}
if (array_key_exists("title", $item))
$descstruct["title"] = $item["title"]["value"];
/**/
/*
* if (array_key_exists("note", $item))
$descstruct["note"] = $item["note"]["value"];
*/
} // TODO ici, l'élément non trouvé devrait donner lieu à un affichage spécifique
return $descstruct;
}
function physicalworkDescription($desc, $format)
{
$uri = $desc["uri"];
$user = $this->getParameter('app.sparql_user');
$pass = $this->getParameter('app.sparql_pass');
$auth = $user . ":" . $pass; // le dataset dmsites devrait être en libre accès
//$format = "application/sparql-results+json";
$sparqltemplate = <<<txt
prefix ecrm: <http://www.cidoc-crm.org/cidoc-crm/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
select distinct ?uri ?site ?concept ?title ?acte ?source ?createur ?createurlabel ?note ?label ?labelJoc
where {
values ?uri { <__uri__>}
# temporaire cause mauvais report sur TPT values ?dmsitesendpoint { <https://kg.grains-de-culture.fr/dmsites/sparql> }
values ?dmsitesendpoint { <https://graphpat.telecom-paris.fr/dmsites/sparql>}
# temporaire cause mauvais report sur TPT values ?jocondeendpoint { <https://kg.grains-de-culture.fr/SemJoconde/sparql> }
values ?jocondeendpoint { <https://graphpat.telecom-paris.fr/SemJoconde/sparql>}
graph ?g {
?uri
<http://datamusee.givingsense.eu/onto/DMP18_has_current_curator> ?site ;
<http://datamusee.givingsense.eu/onto/PX1_source> ?source.
?acte ecrm:P108_has_produced ?uri .
?concept ecrm:P65_is_shown_by ?uri .
OPTIONAL {
?acte ecrm:P14_carried_out_by ?createur . # et si plusieurs créateurs?
?createur rdfs:label ?createurlabel .
}
OPTIONAL {
?concept ecrm:P149_is_identified_by ?title
}
OPTIONAL {
?concept ecrm:P3_has_note ?note
}
# OPTIONAL { service ?dmsitesendpoint {
# graph ?gsites { # à cause de la non-configuration du graphe par défaut sur l'installation TPT
# ?site skos:prefLabel ?label
# filter(lang(?label)="fr") }}
#}
# OPTIONAL { service ?jocondeendpoint {
#graph ?gjoc { # à cause de la non-configuration du graphe par défaut sur l'installation TPT
# ?site skos:prefLabel ?labelJoc
# filter(lang(?labelJoc)="fr") }}
#}
}
}
txt;
$query = str_replace("__uri__", $uri, $sparqltemplate);
$reqformat = $format;
if ($reqformat=="html")
$reqformat = "json";
$requestURL = $desc["endpoint"] . '?'
. 'query=' . urlencode($query)
. '&format=' . urlencode($reqformat);
$jsonres = self::request($requestURL, $auth);
$description = json_decode($jsonres, true);
if (($description==null) or (!(array_key_exists("results", $description)) or (count($description["results"]["bindings"])==0)))
{
foreach ($desc["altendpoints"] as $endpoint) {
$desc["endpoint"] = $endpoint;
$requestURL = $endpoint . '?'
. 'query=' . urlencode($query)
. '&format=' . urlencode($reqformat);
$jsonres = self::request($requestURL, $auth);
$description = json_decode($jsonres, true);
// 26/6/2024 bug à comprendre sur ce test 'Parameter must be an array or an object that implements Countable' if (count($description) != 0) break;
}
}
$descstruct["name"] = "";
$descstruct["musee"] = "";
$descstruct["acte"] = "";
$descstruct["concept"] = "";
$descstruct["note"] = "";
$descstruct = self::physicalworkStructurer($description);
$descstruct["dataset"] = "dmworks ou SemJoconde";
// 26/6/2024 changement de point car le report sur TPT ne marche pas actuellement
// $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"] = "Instance matérielle de la création";
//$descstruct["entityid"] = $entityid; */
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('work/dmwork.html.twig', [
//$this->render('testTemplateSite.html.twig', [
'desc' => $desc,
'descstruct' => $descstruct,
'entitytype' => $descstruct["entitytype"],
'description' => $description
//'description' => count($description) /* => self::printArray($description), */
//'description' => var_dump($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}")
*/
/*
* ATTENTION Défini dans EventContoller, qui prime sur cette définition
*/
public function dmcreationevent($id)
{
// exemple: http://datamusee.givingsense.eu/onto/product/@1234
$desc = array();
$desc["endpoint"] = "https://kg.grains-de-culture.fr/dmworks/sparql";
# replace temporaire cause mauvais report sur TPT
$desc["endpoint"] = str_replace("https://kg.grains-de-culture.fr/", "https://graphpat.telecom-paris.fr/",$desc["endpoint"]);
$desc["altendpoints"] = ["https://kg.grains-de-culture.fr/SemJoconde/sparql"];
# replace temporaire cause mauvais report sur TPT
$desc["altendpoints"] = str_replace("https://kg.grains-de-culture.fr/", "https://graphpat.telecom-paris.fr/",$desc["altendpoints"]);
$desc["dataset"] = "dmworks or SemJoconde";
$desc["comment"] = "";
$desc["id"] = $id;
$desc["uri"] = "http://datamusee.givingsense.eu/onto/event/creation/" . $desc["id"];
return self::creationeventDescription($desc);
}
/**
@Route("onto/work/physical/{id}.{_format}", defaults={"_format": "html"}, requirements={
* "_format": "html|json|xml|ttl"
* })
*/
public function dmphysicalwork(Request $request, $id)
{
// exemple: http://datamusee.givingsense.eu/onto/work/physical/AE037477
$format = $this->getFormat($request);
$desc = array();
$desc["endpoint"] = "https://kg.grains-de-culture.fr/dmworks/sparql";
# replace temporaire cause mauvais report sur TPT
$desc["endpoint"] = str_replace("https://kg.grains-de-culture.fr/", "https://graphpat.telecom-paris.fr/",$desc["endpoint"]);
$desc["altendpoints"] = ["https://kg.grains-de-culture.fr/SemJoconde/sparql"];
# replace temporaire cause mauvais report sur TPT
$desc["altendpoints"] = str_replace("https://kg.grains-de-culture.fr/", "https://graphpat.telecom-paris.fr/",$desc["altendpoints"]);
$desc["dataset"] = "dmworks or SemJoconde";
$desc["comment"] = "";
$desc["id"] = $id;
$desc["uri"] = "http://datamusee.givingsense.eu/onto/work/physical/" . $desc["id"];
return self::physicalworkDescription($desc, $format);
}
/**
@Route("onto/work/concept/{id}.{_format}", defaults={"_format": "html"}, requirements={
* "_format": "html|json|xml|ttl"
* })
*/
public function dmconceptobject(Request $request, $id)
{
// exemple: http://datamusee.givingsense.eu/onto/work/concept/AE037477
$format = $this->getFormat($request);
$desc = array();
$desc["endpoint"] = "https://kg.grains-de-culture.fr/dmworks/sparql";
# replace temporaire cause mauvais report sur TPT
$desc["endpoint"] = str_replace("https://kg.grains-de-culture.fr/", "https://graphpat.telecom-paris.fr/",$desc["endpoint"]);
$desc["altendpoints"] = ["https://kg.grains-de-culture.fr/SemJoconde/sparql"];
# replace temporaire cause mauvais report sur TPT
$desc["altendpoints"] = str_replace("https://kg.grains-de-culture.fr/", "https://graphpat.telecom-paris.fr/",$desc["altendpoints"]);
$desc["dataset"] = "dmworks or SemJoconde";
$desc["comment"] = "";
$desc["id"] = $id;
$desc["uri"] = "http://datamusee.givingsense.eu/onto/work/concept/" . $desc["id"];
return self::workconceptDescription($desc, $format);
}
}