From 78004056e4d22b8bd798fda16ae61e6e62b7d65a Mon Sep 17 00:00:00 2001 From: alvaro <alvaro@alia.(none)> Date: Wed, 4 Jul 2012 08:26:23 -0700 Subject: [PATCH] Added sparql filter module that allow users to filter by a random query rather than a type to select a model/view for a URI --- classes/Endpoint.php | 1 - classes/Utils.php | 11 +- classes/modules/sparqlFilterModule.php | 194 +++++++++++++++++++++++++ common.inc.php | 12 +- 4 files changed, 211 insertions(+), 7 deletions(-) create mode 100644 classes/modules/sparqlFilterModule.php diff --git a/classes/Endpoint.php b/classes/Endpoint.php index f31dd3e8..3d8fbb6d 100644 --- a/classes/Endpoint.php +++ b/classes/Endpoint.php @@ -16,7 +16,6 @@ class Endpoint{ if($output != null){ $this->params['output'] = $output; } - if($output == 'xml'){ $accept = 'application/sparql-results+xml'; }elseif($output == 'rdf'){ diff --git a/classes/Utils.php b/classes/Utils.php index b719da9c..1e355827 100644 --- a/classes/Utils.php +++ b/classes/Utils.php @@ -240,14 +240,17 @@ class Utils{ public static function getResultsType($query){ global $conf; + global $uri; if(preg_match("/select/i", $query)){ return $conf['output']['select']; }elseif(preg_match("/describe/i", $query)){ return $conf['output']['describe']; }elseif(preg_match("/construct/i", $query)){ return $conf['output']['describe']; + }elseif(preg_match("/ask/i", $query)){ + return $conf['output']['ask']; }else{ - HTTPStatus::send500(null); + HTTPStatus::send500($uri); } } @@ -257,7 +260,7 @@ class Utils{ global $lodspk; global $endpoints; global $results; - $strippedModelDir = str_replace('endpoint.', '', $modelDir); + $strippedModelDir = str_replace('endpoint.', '', $modelDir); $lodspk['model'] = $modelDir; $originalDir = getcwd(); $subDirs= array(); @@ -324,7 +327,7 @@ class Utils{ global $lodspk; global $results; global $firstResults; - $uri = $lodspk['this']['value']; + global $uri; $data = array(); $strippedModelFile = str_replace('endpoint.', '', str_replace('.query', '',$modelFile)); if(!is_dir($modelFile)){ @@ -583,7 +586,7 @@ class Utils{ return $triples; } - private static function addPrefixes($q){ + public static function addPrefixes($q){ global $conf; $matches = array(); $visited = array(); diff --git a/classes/modules/sparqlFilterModule.php b/classes/modules/sparqlFilterModule.php new file mode 100644 index 00000000..d532377b --- /dev/null +++ b/classes/modules/sparqlFilterModule.php @@ -0,0 +1,194 @@ +<? +require_once('abstractModule.php'); +class sparqlFilterModule extends abstractModule{ + //Class module + + public function match($uri){ + global $conf; + global $localUri; + global $uri; + global $acceptContentType; + global $endpoints; + global $lodspk; + global $results; + global $firstResults; + + require_once($conf['home'].'classes/MetaDb.php'); + $metaDb = new MetaDb($conf['metadata']['db']['location']); + + $pair = Queries::getMetadata($localUri, $acceptContentType, $metaDb); + + if($pair == NULL){ // Original URI is not in metadata + if(Queries::uriExist($uri, $endpoints['local'])){ + $page = Queries::createPage($uri, $localUri, $acceptContentType, $metaDb); + if($page == NULL){ + HTTPStatus::send500("Can't write sqlite database."); + } + HTTPStatus::send303($page, $acceptContentType); + exit(0); + }else{ + return false; + } + } + + list($res, $page, $format) = $pair; + $uri = $res; + $queries = $this->getQueries(); + $e = $endpoints['local']; + require_once($conf['home'].'lib/Haanga/lib/Haanga.php'); + Haanga::configure(array( + 'cache_dir' => $conf['home'].'cache/', + 'autoescape' => FALSE, + )); + $vars = compact('uri', 'lodspk', 'models', 'first'); + + foreach($queries as $l => $v){ + $q = Utils::addPrefixes(file_get_contents($v)); + $fnc = Haanga::compile($q); + $query = $fnc($vars, TRUE); + $aux = $e->query($query, Utils::getResultsType($query)); + if($aux["boolean"] === true){ + $pair[] = $l; + return $pair; + } + } + return false; + } + +public function execute($pair){ + global $conf; + global $localUri; + global $uri; + global $acceptContentType; + global $endpoints; + global $lodspk; + global $results; + global $firstResults; + $results = array(); + list($res, $page, $format, $filter) = $pair; + //If resource is not the page, send a 303 to the document + if($res == $localUri){ + HTTPStatus::send303($page, $acceptContentType); + } + + $uri = $res; + if($conf['mirror_external_uris'] != false){ + $localUri = preg_replace("|^".$conf['ns']['local']."|", $conf['basedir'], $res); + } + + $extension = Utils::getExtension($format); + + /*Redefine Content type based on the + * dcterms:format for this page + */ + $acceptContentType = $format; + //Check if files for model and view exist + $t = array($pair[3]); + $obj = $this->getModelandView($t, $extension); + $modelFile = $obj['modelFile']; + $lodspk['model'] = $conf['model']['directory']; + $viewFile = $obj['viewFile']; + $lodspk['view'] = $obj['view']['directory']; + if($viewFile == null){ + $lodspk['transform_select_query'] = true; + } + + $lodspk['sparqlFilter'] = $modelFile; + $lodspk['home'] = $conf['basedir']; + $lodspk['baseUrl'] = $conf['basedir']; + $lodspk['module'] = 'sparqlFilter'; + $lodspk['root'] = $conf['root']; + $lodspk['contentType'] = $acceptContentType; + $lodspk['ns'] = $conf['ns']; + $lodspk['endpoint'] = $conf['endpoint']; + $lodspk['view'] = $conf['view']['directory']; + $lodspk['type'] = $modelFile; + + $lodspk['add_mirrored_uris'] = true; + $lodspk['this']['value'] = $uri; + $lodspk['this']['curie'] = Utils::uri2curie($uri); + $lodspk['this']['local'] = $localUri; + $lodspk['this']['extension'] = $extension; + //chdir($conf['home'].$conf['model']['directory']); + + Utils::queryFile($modelFile, $endpoints['local'], $results, $firstResults); + if(!$lodspk['resultRdf']){ + $results = Utils::internalize($results); + $firstAux = Utils::getfirstResults($results); + + //chdir($conf['home']); + if(is_array($results)){ + $resultsObj = Convert::array_to_object($results); + $results = $resultsObj; + }else{ + $resultsObj = $results; + } + $lodspk['firstResults'] = Convert::array_to_object($firstAux); + }else{ + $resultsObj = $results; + } + //chdir($conf['home'].$conf['model']['directory']); + Utils::processDocument($viewFile, $lodspk, $resultsObj); + + } + + private function getQueries(){ + global $conf; + $results = array(); + $dir = $conf['home'].$conf['model']['directory'].'/'.$conf['sparqlFilter']['prefix']; + if ($handle = opendir($dir)) { + + /* This is the correct way to loop over the directory. */ + while (false !== ($entry = readdir($handle))) { + if($entry != '.' && $entry != '..'){ + if(file_exists($dir.'/'.$entry.'/'.$conf['sparqlFilter']['filterFileName'])) + $results[$entry] = $dir.'/'.$entry.'/'.$conf['sparqlFilter']['filterFileName']; + } + } + + closedir($handle); + return $results; + }else{ + return null; + } + } + + + private static function getModelandView($t, $extension){ + global $conf; + global $results; + global $rPointer; + global $lodspk; + $objResult = array('modelFile' => null, 'viewFile' => null); + //Defining default views and models + $curieType=""; + //Get the firstResults type available + foreach($t as $v){ + if($v == null){continue;} + $auxViewFile = $conf['view']['directory'].'/'.$conf['sparqlFilter']['prefix'].'/'.$v.'/'.$extension.'.template'; + $auxModelFile = $conf['model']['directory'].'/'.$conf['sparqlFilter']['prefix'].'/'.$v.'/'.$extension.'queries'; + if(file_exists($auxModelFile)){ + $objResult['modelFile'] = $auxModelFile;//$conf['sparqlFilter']['prefix'].'/'.$v.'/'.$extensionModel.'queries'; + if(file_exists($auxViewFile)){ + $objResult['viewFile'] = $auxViewFile;//$conf['sparqlFilter']['prefix'].'/'.$v.'/'.$extensionView.'template'; + }elseif($extension != 'html'){ //View doesn't exists (and is not HTML) + $objResult['viewFile'] = null; + } + return $objResult; + }elseif(file_exists($conf['model']['directory'].'/'.$conf['sparqlFilter']['prefix'].'/'.$v.'/queries')){ + $objResult['modelFile'] = $conf['model']['directory'].'/'.$conf['sparqlFilter']['prefix'].'/'.$v.'/queries'; + if(file_exists($auxViewFile) ){ + $objResult['viewFile'] = $auxViewFile; + }else{ + $lodspk['transform_select_query'] = true; + $objResult['viewFile'] = null; + } + trigger_error("LODSPeaKr can't find the proper query. Using HTML query instead.", E_USER_NOTICE); + break; + } + } + return $objResult; + } + +} +?> diff --git a/common.inc.php b/common.inc.php index 9d59d4c2..5eff8e21 100644 --- a/common.inc.php +++ b/common.inc.php @@ -1,6 +1,7 @@ <? $conf['version'] = '20120630'; $conf['output']['select'] = 'json'; +$conf['output']['ask'] = 'json'; $conf['output']['describe'] = 'rdf'; $conf['endpointParams']['config']['show_inline'] = 0; $conf['endpointParams']['config']['named_graph'] = ''; @@ -19,7 +20,7 @@ $conf['model']['default'] = 'rdfs:Resource'; $conf['view']['directory'] = 'components'; #include trailing slash! $conf['view']['extension'] = '.view'; -$conf['view']['default'] = 'rdfs:Resource'; +$conf['view']['default'] = 'rdfs:Resource'; $conf['static']['directory'] = 'static/'; #include trailing slash! $conf['static']['haanga'] = false; //Should static files be processed by Haanga? @@ -38,6 +39,8 @@ $conf['service']['prefix'] = 'services'; $conf['type']['prefix'] = 'types'; $conf['uri']['prefix'] = 'uris'; $conf['redirect']['prefix'] = 'redirect'; +$conf['sparqlFilter']['prefix'] = 'sparqlFilter'; +$conf['sparqlFilter']['filterFileName'] = 'filter.query'; //Frontpage when user goes to http://example.org/ $conf['root'] = 'index.html'; @@ -60,7 +63,12 @@ $conf['session']['password'] = 'admin'; $conf['modules'] = array(); $conf['modules']['directory'] = 'classes/modules/'; -$conf['modules']['available'] = array('static','uri', 'type', 'service');//, 'export'); +$conf['modules']['available'] = array('static','uri', 'type', 'service'); + + +//To add sparqlFilter module, copy the following line in your settings.inc.php +//$conf['modules']['available'] = array('static','uri', 'sparqlFilter', 'type', 'service'); + //Uncomment next line to enable sessions //$conf['modules']['available'] = array('session', 'static','uri', 'type', 'service'); -- GitLab