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