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