From e3089512a009f2589ad58e9d5395b917b9f08ae6 Mon Sep 17 00:00:00 2001
From: Alvaro Graves <alvaro@graves.cl>
Date: Fri, 27 Jan 2012 16:31:47 -0800
Subject: [PATCH] Adding query conversion to services

---
 classes/Utils.php                 |  17 +++-
 classes/modules/serviceModule.php | 146 ++++++++++++++++++++++++------
 2 files changed, 131 insertions(+), 32 deletions(-)

diff --git a/classes/Utils.php b/classes/Utils.php
index 5e0d8149..1408fade 100644
--- a/classes/Utils.php
+++ b/classes/Utils.php
@@ -355,7 +355,7 @@ class Utils{
   	  	  	  $resultVars[$v['value']] = 1;
   	  	  	}
   	  	  };
-  	  	  $x = Utils::extractTriples($q_infos['query']['pattern']);
+  	  	  $x = Utils::extractObj($q_infos['query']['pattern']);
   	  	  foreach($x as $v){
   	  	  	if(($resultVars[$v['s']] && $v['s_type'] == 'var')
   	  	  	  || ($resultVars[$v['p']] && $v['p_type'] == 'var')
@@ -393,7 +393,16 @@ class Utils{
 	  	  	
 	  	  	$construct .= ".\n";
 	  	  }
-	  	  $query = preg_replace('/select.*where/i', 'CONSTRUCT {'.$construct.'} WHERE', $query);
+	  	  if($construct == ""){
+	  	  	if(sizeof($q_infos['query']['result_vars'])>0){
+	  	  	  //For now, assuming variables are in the GRAPH ?g
+	  	  	  $query = "CONSTRUCT {?g ?x ?y} WHERE{GRAPH ?g{?g ?x ?y}}";
+	  	  	}else{
+	  	  	  Utils::send500();
+	  	  	}
+	  	  }else{
+	  	  	$query = preg_replace('/select.*where/i', 'CONSTRUCT {'.$construct.'} WHERE', $query);
+	  	  }
 	  	}else {
 	  	  Utils::send500("invalid query: " . $parser->getErrors());
 	  	}
@@ -519,12 +528,12 @@ class Utils{
   	
   }
   
-  private static function extractTriples($obj){
+  private static function extractObj($obj, $term = 'triple'){
   	$triples = array();
   	if(is_array($obj)){
   	  foreach($obj as $k => $v){
   	  	if($v['type'] != 'triple'){
-  	  	  $aux = Utils::extractTriples($v);
+  	  	  $aux = Utils::extractObj($v);
   	  	  if($aux['type'] != 'triple'){
   	  	  	$triples = array_merge($triples,$aux);
   	  	  }else{
diff --git a/classes/modules/serviceModule.php b/classes/modules/serviceModule.php
index af4284b0..1e5d53ae 100644
--- a/classes/modules/serviceModule.php
+++ b/classes/modules/serviceModule.php
@@ -13,38 +13,128 @@ class ServiceModule extends abstractModule{
   	  return FALSE;
   	}
   	$extension = Utils::getExtension($acceptContentType); 
-  	$auxViewFile  = $conf['home'].$conf['view']['directory'].$conf['service']['prefix'].$qArr[0]."/".$extension.".template";
-  	$auxModelFile = $conf['home'].$conf['model']['directory'].$conf['service']['prefix'].$qArr[0]."/".$extension.".queries";
-  	if(is_dir($auxModelFile) && is_file($auxViewFile)){
-  	  return $uri;// $qArr[0];
+  	$viewFile  = $conf['service']['prefix'].$qArr[0]."/".$extension.".template";
+  	$modelFile = $conf['service']['prefix'].$qArr[0]."/".$extension.".queries";
+  	if(file_exists($conf['home'].$conf['model']['directory'].$modelFile) && file_exists($conf['home'].$conf['view']['directory'].$viewFile) && $qArr[0] != null){
+  	  return array($modelFile, $viewFile);
+  	}elseif($extension != 'html' && file_exists($conf['model']['directory'].$conf['service']['prefix'].$qArr[0].'/html.queries')){
+  	  $modelFile = $conf['service']['prefix'].$qArr[0].'/html.queries';
+  	  $viewFile = null;
+  	  return array($modelFile, $viewFile);
   	}
-  	$auxViewFile  = $conf['home'].$conf['view']['directory'].$conf['service']['prefix'].$qArr[0];
-  	$auxModelFile = $conf['home'].$conf['model']['directory'].$conf['service']['prefix'].$qArr[0];
-  	if(is_dir($auxModelFile) && is_dir($auxViewFile)){
-  	  Utils::send406($uri);// $qArr[0];
+  	
+  	return FALSE;  
+  }
+
+public function execute($service){
+  global $conf;
+  global $localUri;
+  global $uri;
+  global $acceptContentType;
+  global $endpoints;
+  global $lodspk;
+  $context = array();
+  $context['contentType'] = $acceptContentType;
+  $context['endpoints'] = $endpoints;
+  //$sp = new SpecialFunction();
+  //$sp->execute($localUri, $context);
+  $f = $this->getFunction($uri);
+  $params = array();
+  $params = $this->getParams($uri);
+  //$params[] = $context;
+  $acceptContentType = Utils::getBestContentType($_SERVER['HTTP_ACCEPT']);
+  $extension = Utils::getExtension($acceptContentType); 
+  $args = array();
+  list($modelFile, $viewFile) = $service;
+  
+  try{
+  	$prefixHeader = array();
+  	
+  	for($i=0;$i<sizeof($params);$i++){
+  	  if($conf['mirror_external_uris']){
+  	  	$altUri = Utils::curie2uri($params[$i]);
+  	  	$altUri = preg_replace("|^".$conf['basedir']."|", $conf['ns']['local'], $altUri);
+  	  	$params[$i] = Utils::uri2curie($altUri);
+  	  }
   	}
-  	if(is_dir($auxModelFile) && is_file($auxViewFile)){
-  	  return $localUri;// $qArr[0];
+  	
+  	for($i=0;$i<sizeof($params);$i++){  
+  	  $auxPrefix = Utils::getPrefix($params[$i]);
+  	  if($auxPrefix['ns'] != NULL){
+  	  	$prefixHeader[] = $auxPrefix;
+  	  }
+  	  $args["arg".$i]=$params[$i];
   	}
-
-  	return FALSE;
+  	$results['params'] = $params;
+  	$lodspk = $conf['view']['standard'];
+  	$lodspk['type'] = $modelFile;
+  	$lodspk['root'] = $conf['root'];
+  	$lodspk['home'] = $conf['basedir'];
+  	$lodspk['this']['value'] = $uri;
+  	$lodspk['this']['curie'] = Utils::uri2curie($uri);
+  	$lodspk['this']['contentType'] = $acceptContentType;
+  	$lodspk['model']['directory'] = $conf['model']['directory'];
+  	$lodspk['view']['directory'] = $conf['view']['directory'];
+  	$lodspk['ns'] = $conf['ns'];
+  	$lodspk['endpoint'] = $conf['endpoint'];
+  	$lodspk['type'] = $modelFile;
+  	$lodspk['header'] = $prefixHeader;
+  	$lodspk['args'] = $args;
+  	$lodspk['module'] = 'service';
+  	$lodspk['add_mirrored_uris'] = false;
+  	$lodspk['baseUrl'] = $conf['basedir'];
+  	$lodspk['this']['value'] = $uri;
+  	$lodspk['this']['contentType'] = $acceptContentType;
+  	$lodspk['view']['directory'] = $conf['home'].$conf['view']['directory'].$conf['service']['prefix'].$f.'/';
+  	$lodspk['model']['directory'] = $conf['home'].$conf['model']['directory'];
+  	if($viewFile == null){
+  	  $lodspk['transform_select_query'] = true;
+  	}
+  	
+  	chdir($conf['model']['directory']);
+  	$first = array();
+  	Utils::queryFile($modelFile, $endpoints['local'], $results, $first);
+  	chdir($conf['home']);
+  	$results = Utils::internalize($results);
+  	
+  	if(is_array($results)){
+  	  $results = Convert::array_to_object($results);
+  	}
+  	
+  	//Need to redefine viewFile as 'local' i.e., inside service.foo/ so I can load files with the relative path correctly
+  	$viewFile = $extension.".template";
+  	Utils::processDocument($viewFile, $lodspk, $results);  
+  	
+  }catch (Exception $ex){
+  	echo $ex->getMessage();
+  	trigger_error($ex->getMessage(), E_ERROR);
+  	Utils::send500($uri);
   }
-  
-  public function execute($service){
-  	global $conf;
-  	global $localUri;
-  	global $uri;
-  	global $acceptContentType;
-  	global $endpoints;
-  	global $lodspk;
-  	require_once($conf['home'].$conf['service']['class']);
-  	$context = array();
-  	$context['contentType'] = $acceptContentType;
-  	$context['endpoints'] = $endpoints;
-  	$sp = new SpecialFunction();
-  	$sp->execute($localUri, $context);
-  	exit(0);	
+  exit(0);	
+}
+
+
+protected function getFunction($uri){
+  global $conf;
+  $count = 1;
+  $prefixUri = $conf['basedir'];
+  $aux = str_replace($prefixUri, '', $uri, $count);
+  $functionAndParams = explode('/', $aux);
+  return $functionAndParams[0];
+}
+
+protected function getParams($uri){
+  global $conf;
+  $count = 1;
+  $prefixUri = $conf['basedir'];
+  $functionAndParams = explode('/', str_replace($prefixUri, '', $uri, $count));
+  if(sizeof($functionAndParams) > 1){
+  	array_shift($functionAndParams);
+  	return $functionAndParams;
+  }else{
+  	return array(null);
   }
-  
+}
+
 }
 ?>
-- 
GitLab