Newer
Older
use uib\ub\loadspeakr\Convert;
use uib\ub\loadspeakr\HTTPStatus;
use uib\ub\loadspeakr\Logging;
use uib\ub\loadspeakr\Utils;
class ServiceModule extends abstractModule {
global $lodspk;
$lodspk['model'] = null;
$lodspk['view'] = null;
$extension = Utils::getExtension($acceptContentType);
$viewFile = null;
while(sizeof($tokens) > 0){
$serviceName = join("%2F", $tokens);
//Use .extension at the end of the service to force a particular content type
$lastSegment = end($tokens);
if(strpos($lastSegment, '.')>0){
$aux = explode(".", $lastSegment);
if(sizeof($aux)>1){
$requestExtension = array_pop($aux);
$contentTypes = $conf['http_accept'][$requestExtension];
if($contentTypes != null){
$acceptContentType = $contentTypes[0];
$extension = $requestExtension;
}
}
$serviceName = join(".",$aux);
//checking default components
if(file_exists($conf['model']['directory'].'/'.$conf['service']['prefix'].'/'.$serviceName.'/scaffold.ttl')){
$subDir = $this->readScaffold($conf['model']['directory'].'/'.$conf['service']['prefix'].'/'.$serviceName.'/scaffold.ttl', join("/", $arguments));
$subDir.= '/';
$lodspk['model'] = $conf['home'].$conf['model']['directory'].'/'.$conf['service']['prefix'].'/'.$serviceName.'/'.$subDir;
$lodspk['view'] = $conf['view']['directory'].'/'.$conf['service']['prefix'].'/'.$serviceName.'/'.$subDir.$extension.'.template';
}elseif(file_exists($conf['home'].$conf['model']['directory'].'/'.$conf['service']['prefix'].'/'.$serviceName)){
$lodspk['model'] = $conf['home'].$conf['model']['directory'].'/'.$conf['service']['prefix'].'/'.$serviceName.'/';
$lodspk['view'] = $conf['home'].$conf['view']['directory'].'/'.$conf['service']['prefix'].'/'.$serviceName.'/'.$extension.'.template';
}else{
if(is_null($lodspk['model']) && is_null($lodspk['view'])){
//checking other components
if(!empty($conf['components']['services']) && count($conf['components']['services'])>0){
foreach($conf['components']['services'] as $service){
$serviceArray = explode("/", $service);
if($serviceName == end($serviceArray)){
array_pop($serviceArray);
$conf['service']['prefix'] = array_pop($serviceArray);
$conf['model']['directory'] = join("/", $serviceArray);
$conf['view']['directory'] = $conf['model']['directory'];
if(file_exists($conf['model']['directory'].'/'.$conf['service']['prefix'].'/'.$serviceName.'/scaffold.ttl')){
$subDir = $this->readScaffold($conf['model']['directory'].'/'.$conf['service']['prefix'].'/'.$serviceName.'/scaffold.ttl', join("/", $arguments));
$subDir.= '/';
$lodspk['model'] = $conf['model']['directory'].'/'.$conf['service']['prefix'].'/'.$serviceName.'/'.$subDir;
$lodspk['view'] = $conf['view']['directory'].'/'.$conf['service']['prefix'].'/'.$serviceName.'/'.$subDir.$extension.'.template';
}elseif(file_exists($conf['model']['directory'].'/'.$conf['service']['prefix'].'/'.$serviceName)){
$lodspk['model'] = $conf['model']['directory'].'/'.$conf['service']['prefix'].'/'.$serviceName.'/';
$lodspk['view'] = $conf['view']['directory'].'/'.$conf['service']['prefix'].'/'.$serviceName.'/'.$extension.'.template';
}
$lodspk['serviceName'] = join("/", $tokens);
$lodspk['componentName'] = $lodspk['serviceName'];
$modelFile = $lodspk['model'].$extension.'.queries';
if(file_exists($lodspk['model'].$extension.'.queries')){
if(!file_exists($lodspk['view'])){
$viewFile = null;
}else{
$viewFile = $lodspk['view'];
}
return array($modelFile, $viewFile);
}elseif(file_exists($lodspk['model'].'queries')){
$modelFile = $lodspk['model'].'queries';
if(!file_exists($lodspk['view'])){
$lodspk['resultRdf'] = true;
$viewFile = null;
}else{
$viewFile = $lodspk['view'];
}
return array($modelFile, $viewFile);
}elseif(file_exists($lodspk['model'])){
HTTPStatus::send406($uri);
public function execute($service){
global $conf;
global $localUri;
global $uri;
global $acceptContentType;
global $endpoints;
global $lodspk;
global $results;
$context = array();
$context['contentType'] = $acceptContentType;
$context['endpoints'] = $endpoints;
//$f = $this->getFunction($localUri);
$params = $this->getParams($localUri);
//$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'] != false){
$altUri = Utils::curie2uri($params[$i]);
$altUri = preg_replace("|^".$conf['basedir']."|", $conf['ns']['local'], $altUri);
$params[$i] = Utils::uri2curie($altUri);
}
for($i=0;$i<sizeof($params);$i++){
Utils::curie2uri($params[$i]);
//echo $params[$i]." ".Utils::curie2uri($params[$i]);exit(0);
$auxPrefix = Utils::getPrefix($params[$i]);
if($auxPrefix['ns'] != NULL){
$prefixHeader[] = $auxPrefix;
}
$args["arg".$i]=$params[$i];
$args["all"] .= $segmentConnector.$params[$i];
if($segmentConnector == ""){
$segmentConnector = "/";
}
$results['params'] = $params;
$lodspk['baseUrl'] = $conf['basedir'];
$lodspk['module'] = 'service';
$lodspk['root'] = $conf['root'];
$lodspk['contentType'] = $acceptContentType;
$lodspk['ns'] = $conf['ns'];
$lodspk['this']['value'] = $uri;
$lodspk['this']['curie'] = Utils::uri2curie($uri);
$lodspk['local']['value'] = $localUri;
$lodspk['local']['curie'] = Utils::uri2curie($localUri);
$lodspk['contentType'] = $acceptContentType;
$lodspk['endpoint'] = $conf['endpoint'];
$lodspk['type'] = $modelFile;
$lodspk['header'] = $prefixHeader;
$lodspk['args'] = $args;
$lodspk['add_mirrored_uris'] = false;
$lodspk['baseUrl'] = $conf['basedir'];
$lodspk['this']['value'] = $uri;
if($viewFile == null){
$lodspk['transform_select_query'] = true;
}
Utils::queryFile($modelFile, $endpoints['local'], $results, $firstResults);
if(!$lodspk['resultRdf']){
$results = Utils::internalize($results);
if(is_array($results)){
$resultsObj = Convert::array_to_object($results);
Alvaro Graves
committed
$results = $resultsObj;
}else{
$resultsObj = $results;
}
$lodspk['firstResults'] = Convert::array_to_object($firstAux);
alvaro
committed
}
//Need to redefine viewFile as 'local' i.e., inside service.foo/ so I can load files with the relative path correctly
//$viewFile = $extension.".template";
alvaro
committed
//chdir($conf['home']);
Utils::processDocument($viewFile, $lodspk, $results);
}catch (Exception $ex){
echo $ex->getMessage();
if($conf['debug']){
Logging::log($ex->getMessage(), E_ERROR);
}
protected function getParams($uri){
global $conf;
$count = 1;
$prefixUri = $conf['basedir'];
$functionAndParams = explode('/', str_replace($prefixUri.$lodspk['serviceName'], '', $uri, $count));
if(sizeof($functionAndParams) > 1){
array_shift($functionAndParams);
return $functionAndParams;
}else{
return array(null);
}
}
protected function readScaffold($scaffold, $serviceArgs){
global $conf;
require_once __DIR__ . '/../../vendor/semsol/arc2/ARC2.php';
$parser = ARC2::getTurtleParser();
$parser->parse($scaffold);
$triples = $parser->getTriples();
$aux=Utils::filterTriples($triples, array(null, "http://www.w3.org/1999/02/22-rdf-syntax-ns#type", "http://lodspeakr.org/vocab/ScaffoldedService"));
$scaffoldUri = $aux[0][0];
$aux=Utils::filterTriples($triples, array($scaffoldUri, "http://lodspeakr.org/vocab/scaffold", null));
foreach($aux as $r){
$patterns = Utils::filterTriples($triples, array($r[2], "http://lodspeakr.org/vocab/uriPattern", null));
$pattern = stripcslashes($patterns[0][2]);
if(preg_match("|$pattern|", $serviceArgs) > 0){
// echo "match ! \n ".$pattern."\n";
$patternDir = Utils::filterTriples($triples, array($r[2], "http://lodspeakr.org/vocab/subComponent", null));
return $patternDir[0][2];
}
}
// exit(0);
return "";
}