diff --git a/classes/Endpoint.php b/classes/Endpoint.php index 42da91c4934ac26e60573d6264e68f4e562c3c1e..d05c38658e95de4b89059033c37f142446728dc1 100644 --- a/classes/Endpoint.php +++ b/classes/Endpoint.php @@ -42,6 +42,9 @@ class Endpoint{ if(preg_match("/describe/i", $q)){ return $aux; } + if(preg_match("/construct/i", $q)){ + return $aux; + } } public function queryPost($q){ diff --git a/classes/Utils.php b/classes/Utils.php index 7e49e97b9c2e396641cecf5507553c677f2342b1..2cd85bc6f90a57f67ced7b817d380df0d4b4a452 100644 --- a/classes/Utils.php +++ b/classes/Utils.php @@ -156,12 +156,39 @@ class Utils{ return $ct; } + + private static function travelTree($tree){ + $results = array(); + if(is_string($tree)){ + return $tree; + } + foreach($tree as $t){ + $aux = Utils::travelTree($t); + if(is_array($aux)){ + $results = array_merge($results, $aux); + }else{ + array_push($results, $aux); + } + } + return $results; + } + + private static function serializeRdf($data, $extension){ global $conf; - require('lib/arc2/ARC2.php'); + $ser; + $dPointer; + $docs = Utils::travelTree($data); + require_once('lib/arc2/ARC2.php'); $parser = ARC2::getRDFParser(); - $parser->parse($conf['basedir'], $data); - $triples = $parser->getTriples(); + $triples = array(); + + foreach($docs as $d){ + $parser->parse($conf['basedir'], $d); + $t = $parser->getTriples(); + $triples = array_merge($triples, $t); + } + if($conf['mirror_external_uris']){ global $uri; global $localUri; @@ -175,7 +202,6 @@ class Utils{ $t['p'] = "http://www.w3.org/2000/10/swap/pim/contact#preferredURI"; array_push($triples, $t); } - $ser; switch ($extension){ case 'ttl': $ser = ARC2::getTurtleSerializer(); @@ -200,7 +226,7 @@ class Utils{ $extension = Utils::getExtension($contentType); header('Content-Type: '.$contentType); - if(!is_object($data)){ + if($extension != 'html'){ $data = Utils::serializeRdf($data, $extension); } Utils::showView($base, $data, $viewFile); @@ -265,16 +291,18 @@ class Utils{ } closedir($handle); $originalDir = $base['model']['directory']; - foreach($subDirs as $v){ - if(!isset($r[$modelDir])){ - $r[$modelDir] = array(); - } - if($modelDir != $base['type']){ - Utils::queryDir($v, $r[$modelDir]); - }else{ - Utils::queryDir($v, $r); - } - } + if(isset($subDIrs)){ + foreach($subDirs as $v){ + if(!isset($r[$modelDir])){ + $r[$modelDir] = array(); + } + if($modelDir != $base['type']){ + Utils::queryDir($v, $r[$modelDir]); + }else{ + Utils::queryDir($v, $r); + } + } + } chdir($conf['home']); //return $data; } @@ -288,8 +316,6 @@ class Utils{ $uri = $base['this']['value']; $data = array(); $strippedModelFile = str_replace('.query', '',$modelFile); - - if(!is_dir($modelFile)){ require_once($conf['home'].'lib/Haanga/lib/Haanga.php'); Haanga::configure(array( @@ -306,12 +332,73 @@ class Utils{ $r = Convert::array_to_object($r2); $f = Convert::array_to_object($first); $vars = compact('uri', 'base', 'r', 'f'); + $fnc = Haanga::compile(file_get_contents($modelFile)); $query = $fnc($vars, TRUE); + if(is_object($base)){ $baseObj = Convert::object_to_array($base); $base = $baseObj; } + + + if($base['transform_select_query']==true){ + include_once($conf['home'].'lib/arc2/ARC2.php'); + $parser = ARC2::getSPARQLParser(); + $parser->parse($query); + $sparqlConstruct = array(); + if (!$parser->getErrors()) { + $resultVars = array(); + $q_infos = $parser->getQueryInfos(); + foreach($q_infos['query']['result_vars'] as $v){ + if($v['type'] == 'var'){ + $resultVars[$v['value']] = 1; + } + }; + $x = Utils::extractTriples($q_infos['query']['pattern']); + foreach($x as $v){ + if(($resultVars[$v['s']] && $v['s_type'] == 'var') + || ($resultVars[$v['p']] && $v['p_type'] == 'var') + || ($resultVars[$v['o']] && $v['o_type'] == 'var')){ + array_push($sparqlConstruct, $v); + } + } + $construct = ""; + foreach($sparqlConstruct as $v){ + if($v['s_type'] == 'uri'){ + $construct .= "<".$v['s']."> "; + }elseif($v['s_type'] == 'var'){ + $construct .= '?'.$v['s'].' '; + }else{ + $construct.= $v['s']." "; + } + + if($v['p_type'] == 'uri'){ + $construct .= "<".$v['p']."> "; + }elseif($v['p_type'] == 'var'){ + $construct .= '?'.$v['p'].' '; + }else{ + $construct.= $v['p']." "; + } + + if($v['o_type'] == 'uri'){ + $construct .= "<".$v['o']."> "; + }elseif($v['o_type'] == 'literal'){ + $construct .= '"'.$v['o'].'" '; + }elseif($v['o_type'] == 'var'){ + $construct .= '?'.$v['o'].' '; + }else{ + $construct.= $v['o']." "; + } + + $construct .= ".\n"; + } + $query = preg_replace('/select.*where/i', 'CONSTRUCT {'.$construct.'} WHERE', $query); + }else { + Utils::send500("invalid query: " . $parser->getErrors()); + } + } + if($conf['debug']){ echo $query; } @@ -395,8 +482,11 @@ class Utils{ public static function showView($baseData, $data, $view){ global $conf; + global $uri; + global $extension; $base = $conf['view']['standard']; $base = $baseData; + if(isset($baseData['params'])){ $base['this']['params'] = $baseData['params']; } @@ -408,11 +498,13 @@ class Utils{ $r = $data; $first = $base['first']; unset($base['first']); - $vars = compact('base', 'r', 'first'); + $vars = compact('uri','base', 'r', 'first'); if($conf['debug']){ var_dump($vars); } - if(is_file($base['view']['directory'].$view)){ + if(is_string($data)){ + echo($data); + }elseif(is_file($base['view']['directory'].$view)){ Haanga::Load($view, $vars); }else{ $fnc = Haanga::compile($view); @@ -421,7 +513,25 @@ class Utils{ } - + private static function extractTriples($obj){ + $triples = array(); + if(is_array($obj)){ + foreach($obj as $k => $v){ + if($v['type'] != 'triple'){ + $aux = Utils::extractTriples($v); + if($aux['type'] != 'triple'){ + $triples = array_merge($triples,$aux); + }else{ + $triples = array_merge($triples, $aux); + } + }else{ + array_push($triples, $v); + } + } + } + return $triples; + } + } ?> diff --git a/modules/classModule.php b/modules/classModule.php index 66ae43d9f7415738af93833fb2461caad8195ee7..3f4d7a55da2d50d4893e0ed38cefb53c8a39de46 100644 --- a/modules/classModule.php +++ b/modules/classModule.php @@ -63,12 +63,16 @@ class ClassModule extends abstractModule{ list($modelFile, $viewFile) = $this::getModelandView($t, $extension); $base = $conf['view']['standard']; + if($viewFile == null){ + $base['transform_select_query'] = true; + } $base['type'] = $modelFile; $base['this']['value'] = $uri; $base['this']['curie'] = Utils::uri2curie($uri); $base['thislocal']['value'] = $localUri; $base['thislocal']['curie'] = Utils::uri2curie($localUri); + $base['this']['extension'] = $extension; $base['this']['contentType'] = $acceptContentType; $base['model']['directory'] = $conf['model']['directory']; $base['view']['directory'] = $conf['view']['directory']; @@ -95,6 +99,7 @@ class ClassModule extends abstractModule{ global $conf; global $results; global $rPointer; + global $base; //Defining default views and models $curieType=""; $modelFile = 'class.rdfs:Resource/'.$extension.'.queries'; @@ -117,6 +122,13 @@ class ClassModule extends abstractModule{ $viewFile = $conf['class']['prefix'].$v.'/'.$extension.'.template'; $modelFile = $conf['class']['prefix'].$v.'/'.$extension.'.queries'; break; + }elseif($extension != 'html' && + file_exists($conf['view']['directory'].$conf['class']['prefix'].$v.'/html.template') && + file_exists($conf['model']['directory'].$conf['class']['prefix'].$v.'/html.queries') && $v != null){ + $modelFile = $conf['class']['prefix'].$v.'/html.queries'; + $viewFile = null;//$conf['class']['prefix'].$v.'/html.queries'; + trigger_error("LODSPeaKr can't find the proper query. Using HTML query instead.", E_USER_NOTICE); + break; } } return array($modelFile, $viewFile); diff --git a/utils/ldspkr.sh b/utils/ldspkr.sh new file mode 100755 index 0000000000000000000000000000000000000000..b06509735d02563334c918caf8a26a3fd52ca00b --- /dev/null +++ b/utils/ldspkr.sh @@ -0,0 +1,58 @@ +#!/bin/bash + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +USAGE="Usage: $0 create|delete uri|class|service foo [html|rdf|ttl|nt|json]" +formats=( html rdf ttl nt json all ) +operations=( create delete ) +modules=( class service uri ) + +currentOperation= +currentFormat= +currentModule= + +if [[ ${operations[@]} =~ $1 ]] +then + currentOperation=$1 +else + echo "Operation \"$1\" not valid" + echo $USAGE + exit 1 +fi + +if [[ ${modules[@]} =~ $2 ]] +then + currentModule=$2 +else + echo "Module \"$2\" not valid" + echo $USAGE + exit 1 +fi + +if [[ ${formats[@]} =~ $4 ]] +then + currentFormat=$4 +else + if [ -z "$4" ] + then + currentFormat="all" + else + echo "Format \"$4\" not valid" + echo $USAGE + exit 1 + fi +fi + + +currentUnit=$3 + + +if [[ $currentOperation == "create" ]] +then + $DIR/modules/create-$currentModule.sh "$currentUnit" "$currentFormat" +fi +if [[ $currentOperation == "delete" ]] +then + $DIR/modules/delete-$currentModule.sh "$currentUnit" "$currentFormat" +fi + + diff --git a/utils/modules/create-class.sh b/utils/modules/create-class.sh index bf86e068b9aac12456651e27ff76e4d85ac0ae9d..a39ae2664e46b909042ac444880ecc8580794eca 100755 --- a/utils/modules/create-class.sh +++ b/utils/modules/create-class.sh @@ -76,7 +76,7 @@ DESCRIBE ?resource WHERE { QUERY) viewRdf=$(cat <<VIEW -{{r|safe}} +{{r.main|safe}} VIEW) modelTtl=$modelRdf