diff --git a/classes/BasicSpecialFunction.php b/classes/BasicSpecialFunction.php index e87f2c97c553a833042ee73c370bf5f733a46e9d..6a3fc28fcce06f485042f7b8dbd44496e4500d10 100644 --- a/classes/BasicSpecialFunction.php +++ b/classes/BasicSpecialFunction.php @@ -6,7 +6,7 @@ class SpecialFunction extends AbstractSpecialFunction{ protected function getFunction($uri){ global $conf; $count = 1; - $prefixUri = $conf['basedir'].$conf['special']['uri']."/"; + $prefixUri = $conf['basedir']; $aux = str_replace($prefixUri, '', $uri, $count); $functionAndParams = explode('/', $aux); return $functionAndParams[0]; @@ -15,7 +15,7 @@ class SpecialFunction extends AbstractSpecialFunction{ protected function getParams($uri){ global $conf; $count = 1; - $prefixUri = $conf['basedir'].$conf['special']['uri']; + $prefixUri = $conf['basedir']; $functionAndParams = explode('/', str_replace($prefixUri, '', $uri, $count)); if(sizeof($functionAndParams) > 1){ array_shift($functionAndParams); @@ -38,10 +38,10 @@ class SpecialFunction extends AbstractSpecialFunction{ $extension = Utils::getExtension($acceptContentType); $args = array(); try{ - $viewFile = $conf['special']['uri'].".".$f.$conf['view']['extension'].".".$extension; - $modelFile = $conf['special']['uri'].".".$f.$conf['model']['extension'].".".$extension; + $viewFile = $conf['service']['prefix'].$f."/".$extension.".template"; + $modelFile = $conf['service']['prefix'].$f."/".$extension.".queries"; if(!(is_dir($conf['model']['directory'].$modelFile) || is_file($conf['model']['directory'].$modelFile))){ - $msg = '<h1>Method does not exist!</h1><br/>This means that <tt>'.$conf['model']['directory'].$modelFile."</tt> doesn't exist.<br/>Please refer to this tutorial to create one.<br/>"; + $msg = '<h1>Method does not exist!</h1><br/>This means that <tt>'.$modelFile."</tt> doesn't exist.<br/>Please refer to this tutorial to create one.<br/>"; throw new Exception($msg); } if(!is_file($conf['view']['directory'].$viewFile)){ diff --git a/classes/Utils.php b/classes/Utils.php index eaf6767e91a41aa587866a58cde53cdfaaa06aaa..855d77835d69d9d918b7499008db5967cd8c4ee3 100644 --- a/classes/Utils.php +++ b/classes/Utils.php @@ -18,7 +18,7 @@ class Utils{ public static function send406($uri){ header("HTTP/1.0 406 Not Acceptable"); - echo "I can't find a representation suitable for the content type you accept\n\n"; + echo "LODSPeaKr can't find a representation suitable for the content type you accept\n\n"; exit(0); } @@ -287,7 +287,8 @@ class Utils{ global $first; $uri = $base['this']['value']; $data = array(); - + $strippedModelFile = str_replace('.query', '',$modelFile); + if(!is_dir($modelFile)){ require_once($conf['home'].'lib/Haanga/lib/Haanga.php'); @@ -315,25 +316,25 @@ class Utils{ echo $query; } trigger_error("Running query on endpoint", E_USER_NOTICE); - $aux = $e->query($query, Utils::getResultsType($query)); + $aux = $e->query($query, Utils::getResultsType($query)); if($modelFile != $base['type']){ - if(!isset($rPointer[$modelFile])){ - $rPointer[$modelFile] = array(); - $first[$modelFile] = array(); + if(!isset($rPointer[$strippedModelFile])){ + $rPointer[$strippedModelFile] = array(); + $first[$strippedModelFile] = array(); } if(Utils::getResultsType($query) == $conf['output']['select']){ - $rPointer[$modelFile] = Utils::sparqlResult2Obj($aux); - $fPointer[$modelFile] = $rPointer[$modelFile][0]; + $rPointer[$strippedModelFile] = Utils::sparqlResult2Obj($aux); + $fPointer[$strippedModelFile] = $rPointer[$strippedModelFile][0]; /*if(sizeof($rPointer)>0){ $rPointer[$modelFile]['first'] = $rPointer[$modelFile][0]; }*/ }else{ - $rPointer[$modelFile] = $aux; + $rPointer[$strippedModelFile] = $aux; } }else{ if(Utils::getResultsType($query) == $conf['output']['select']){ $rPointer = Utils::sparqlResult2Obj($aux); - $fPointer[$modelFile] = $rPointer[0]; + $fPointer[$strippedModelFile] = $rPointer[0]; /*if(sizeof($rPointer)>0){ $rPointer['first'] = $rPointer[0]; }*/ @@ -342,12 +343,12 @@ class Utils{ } } }else{ - trigger_error("$modelFile is a directory, will process it later", E_USER_NOTICE); + trigger_error("$modelFile is a directory, will process it later", E_USER_NOTICE); if($modelFile != $base['type']){ - if(!isset($rPointer[$modelFile])){ - $rPointer[$modelFile] = array(); + if(!isset($rPointer[$strippedModelFile])){ + $rPointer[$strippedModelFile] = array(); } - Utils::queryDir($modelFile, $rPointer[$modelFile], $fPointer[$modelFile]); + Utils::queryDir($modelFile, $rPointer[$strippedModelFile], $fPointer[$strippedModelFile]); }else{ Utils::queryDir($modelFile, $rPointer, $fPointer); } @@ -409,7 +410,7 @@ class Utils{ unset($base['first']); $vars = compact('base', 'r', 'first'); if($conf['debug']){ - var_dump($vars); + var_dump($r); } if(is_file($base['view']['directory'].$view)){ Haanga::Load($view, $vars); diff --git a/common.inc.php b/common.inc.php index 5579e1a7b535677fc8a3b043147a65079391046c..eaf3f2574e2265e642031a995e7da4ae0dc037f5 100644 --- a/common.inc.php +++ b/common.inc.php @@ -32,8 +32,8 @@ $conf['http_accept']['json'] = array('application/json', 'application/x-javascri $conf['http_accept']['nt'] = array('text/plain'); -$conf['special']['uri'] = 'special'; -$conf['special']['class'] = 'classes/BasicSpecialFunction.php'; +$conf['service']['prefix'] = 'service.'; +$conf['service']['class'] = 'classes/BasicSpecialFunction.php'; //Frontpage when user goes to http://example.org/ $conf['root'] = 'index.html'; diff --git a/models/class.rdfs:Resource/html.queries/main.query b/models/class.rdfs:Resource/html.queries/main.query new file mode 100644 index 0000000000000000000000000000000000000000..107b0b99b6106b2b56b3292423c6824477325017 --- /dev/null +++ b/models/class.rdfs:Resource/html.queries/main.query @@ -0,0 +1,7 @@ +SELECT ?s2 ?p2 ?s1 ?p1 WHERE { + { + <{{uri}}> ?s1 ?p1 . + }UNION{ + ?s2 ?p2 <{{uri}}> . + } +} diff --git a/models/class.rdfs:Resource/json.queries/main.query b/models/class.rdfs:Resource/json.queries/main.query new file mode 100644 index 0000000000000000000000000000000000000000..fbb7078a7f79be8481dba37143d62038ef36366d --- /dev/null +++ b/models/class.rdfs:Resource/json.queries/main.query @@ -0,0 +1,3 @@ +DESCRIBE ?resource WHERE { + [] a ?resource . +} diff --git a/models/class.rdfs:Resource/nt.queries/main.query b/models/class.rdfs:Resource/nt.queries/main.query new file mode 100644 index 0000000000000000000000000000000000000000..fbb7078a7f79be8481dba37143d62038ef36366d --- /dev/null +++ b/models/class.rdfs:Resource/nt.queries/main.query @@ -0,0 +1,3 @@ +DESCRIBE ?resource WHERE { + [] a ?resource . +} diff --git a/models/class.rdfs:Resource/rdf.queries/main.query b/models/class.rdfs:Resource/rdf.queries/main.query new file mode 100644 index 0000000000000000000000000000000000000000..fbb7078a7f79be8481dba37143d62038ef36366d --- /dev/null +++ b/models/class.rdfs:Resource/rdf.queries/main.query @@ -0,0 +1,3 @@ +DESCRIBE ?resource WHERE { + [] a ?resource . +} diff --git a/models/class.rdfs:Resource/ttl.queries/main.query b/models/class.rdfs:Resource/ttl.queries/main.query new file mode 100644 index 0000000000000000000000000000000000000000..fbb7078a7f79be8481dba37143d62038ef36366d --- /dev/null +++ b/models/class.rdfs:Resource/ttl.queries/main.query @@ -0,0 +1,3 @@ +DESCRIBE ?resource WHERE { + [] a ?resource . +} diff --git a/models/rdfs:Resource.model.html b/models/rdfs:Resource.model.html deleted file mode 100644 index 5e8f44e2f6e46c5d1bb4858707c27526d1b5e405..0000000000000000000000000000000000000000 --- a/models/rdfs:Resource.model.html +++ /dev/null @@ -1,8 +0,0 @@ -SELECT ?s2 ?p2 ?s1 ?p1 WHERE { - { - <{{uri}}> ?s1 ?p1 . - }UNION{ - ?s2 ?p2 <{{uri}}> . - } -} - diff --git a/models/rdfs:Resource.model.rdf b/models/rdfs:Resource.model.rdf deleted file mode 100644 index 61df9dc82ae823fb1ebafe746788f4ebecb6f20c..0000000000000000000000000000000000000000 --- a/models/rdfs:Resource.model.rdf +++ /dev/null @@ -1 +0,0 @@ -DESCRIBE <{{uri}}> diff --git a/models/special.classes.model.html b/models/service.classes/html.queries/main.query similarity index 100% rename from models/special.classes.model.html rename to models/service.classes/html.queries/main.query diff --git a/models/special.instances.model.html b/models/special.instances.model.html deleted file mode 100644 index d7de13cc16c4e8ec8619293db9b4a9cf8a1a76fb..0000000000000000000000000000000000000000 --- a/models/special.instances.model.html +++ /dev/null @@ -1,6 +0,0 @@ -{%for h in base.header %} -PREFIX {{h.prefix}}: <{{h.ns}}> -{%endfor%} -SELECT DISTINCT ?resource WHERE { - ?resource a {{base.args.arg0}} . -} diff --git a/models/special.namedGraphs.model.html b/models/special.namedGraphs.model.html deleted file mode 100644 index b73ae66e3f2a16aed3d8342b2b913e4984f7885a..0000000000000000000000000000000000000000 --- a/models/special.namedGraphs.model.html +++ /dev/null @@ -1,5 +0,0 @@ -SELECT DISTINCT ?g WHERE { - GRAPH ?g{ - ?s ?p ?o . - } -} diff --git a/modules/classModule.php b/modules/classModule.php index 68ab226636ba6aceabc3d8d1b5aef529c1a17552..3348c78d90616618568d28293bec39a5cf70b406 100644 --- a/modules/classModule.php +++ b/modules/classModule.php @@ -38,6 +38,8 @@ class ClassModule extends abstractModule{ global $acceptContentType; global $endpoints; global $base; + global $results; + global $first; list($res, $page, $format) = $pair; //If resource is not the page, send a 303 to the document if($res == $localUri){ @@ -75,7 +77,7 @@ class ClassModule extends abstractModule{ chdir($conf['home'].$conf['model']['directory']); -// echo $conf['home'].$conf['model']['directory'].$modelFile;exit(0); + Utils::queryFile($modelFile, $endpoints['local'], $results, $first); $results = Utils::internalize($results); @@ -92,17 +94,14 @@ class ClassModule extends abstractModule{ private static function getModelandView($t, $extension){ global $conf; + global $results; + global $rPointer; //Defining default views and models $curieType=""; - $modelFile = $conf['model']['default'].$conf['model']['extension'].".".$extension; - $viewFile = $conf['view']['default'].$conf['view']['extension'].".".$extension; + $modelFile = 'class.rdfs:Resource/'.$extension.'.queries'; + $viewFile = 'class.rdfs:Resource/'.$extension.'.template'; //Get the first class available - /* TODO: Allow user to priotize - * which class should be used - * Example: URI is foaf:Person and ex:Student - * If both, prefer ex:Student - */ $typesAndValues = array(); foreach($t as $v){ $curie = Utils::uri2curie($v); diff --git a/modules/serviceModule.php b/modules/serviceModule.php index 695229fe147559c6cea082ac9dad296bc7cb7558..7e2e08656ffac4c0a801cc3c353608bd3350fcc4 100644 --- a/modules/serviceModule.php +++ b/modules/serviceModule.php @@ -4,18 +4,40 @@ class ServiceModule extends abstractModule{ //Service module public function match($uri){ - global $conf; - return preg_match("|^".$conf['basedir'].$conf['special']['uri']."|", $uri); + global $conf; + global $acceptContentType; + + $q = preg_replace('|^'.$conf['basedir'].'|', '', $uri); + $qArr = explode('/', $q); + if(sizeof($qArr)==0){ + 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]; + } + $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]; + } + if(is_dir($auxModelFile) && is_file($auxViewFile)){ + return $uri;// $qArr[0]; + } + + return FALSE; } - public function execute($pair){ + public function execute($service){ global $conf; global $localUri; global $uri; global $acceptContentType; global $endpoints; global $base; - require_once($conf['home'].$conf['special']['class']); + require_once($conf['home'].$conf['service']['class']); $context = array(); $context['contentType'] = $acceptContentType; $context['endpoints'] = $endpoints; diff --git a/views/rdfs:Resource.view.html b/views/class.rdfs:Resource/html.template similarity index 93% rename from views/rdfs:Resource.view.html rename to views/class.rdfs:Resource/html.template index 59f3631899154cb32d0456a682340ac5adfff40f..2cd8b212289059e162fb8c58b6c688b7739f9368 100644 --- a/views/rdfs:Resource.view.html +++ b/views/class.rdfs:Resource/html.template @@ -11,32 +11,32 @@ <link rel="alternate" type="text/plain" title="N-Triples Version" href="{{base.this.value}}.nt" /> <link rel="alternate" type="application/json" title="RDFJSON Version" href="{{base.this.value}}.json" /> </head> - <body about="{{base.this.value}}"> + <body about="{{base.this.value}}"> <h1>Page about <a href='{{base.this.value}}'>{{base.this.curie}}</a></h1> <div> <h2>Information from {{base.this.curie}}</h2> - <table> - {% for row in r %} + <table> + {% for row in r.main %} {% if row.s1%} <tr> <td><a href='{{row.s1.value}}'>{{row.s1.curie}}</a></td> - + {% if row.p1.uri == 1 %} <td><a rel='{{row.s1.curie}}' href='{{row.p1.value}}'>{{row.p1.curie}}</a></td> {% else %} <td><span property='{{row.s1.curie}}'>{{row.p1.value}}</span></td> {% endif %} - + </tr> {% endif %} {% endfor %} </table> - + <br/><br/> <h2>Information pointing to {{base.this.curie}}</h2> - <table> - {% for row in r %} + <table> + {% for row in r.main %} {% if row.s2%} <tr> <td><a href='{{row.s2.value}}'>{{row.s2.curie}}</a></td> @@ -48,4 +48,3 @@ </div> </body> </html> - diff --git a/views/class.rdfs:Resource/json.template b/views/class.rdfs:Resource/json.template new file mode 100644 index 0000000000000000000000000000000000000000..f6451d60b03e01731a9e01adfacf9c9cbdc5cfda --- /dev/null +++ b/views/class.rdfs:Resource/json.template @@ -0,0 +1 @@ +{{r.main|safe}} diff --git a/views/rdfs:Resource.view.rdf b/views/class.rdfs:Resource/nt.template similarity index 100% rename from views/rdfs:Resource.view.rdf rename to views/class.rdfs:Resource/nt.template diff --git a/views/class.rdfs:Resource/rdf.template b/views/class.rdfs:Resource/rdf.template new file mode 100644 index 0000000000000000000000000000000000000000..f6451d60b03e01731a9e01adfacf9c9cbdc5cfda --- /dev/null +++ b/views/class.rdfs:Resource/rdf.template @@ -0,0 +1 @@ +{{r.main|safe}} diff --git a/views/class.rdfs:Resource/ttl.template b/views/class.rdfs:Resource/ttl.template new file mode 100644 index 0000000000000000000000000000000000000000..ca994557126054d192c1e40eca4f28f5e635bab8 --- /dev/null +++ b/views/class.rdfs:Resource/ttl.template @@ -0,0 +1 @@ +{{r|safe}} diff --git a/views/special.classes.view.html b/views/service.classes/html.template similarity index 72% rename from views/special.classes.view.html rename to views/service.classes/html.template index 8a7777fe863303235d9f846e0be11cfbb70b9f00..dac4c802940d35494e891f008e41b28fbd4806d8 100644 --- a/views/special.classes.view.html +++ b/views/service.classes/html.template @@ -4,17 +4,15 @@ <html xmlns="http://www.w3.org/1999/xhtml" {% for i, ns in base.ns %}xmlns:{{i}}="{{ns}}" {%endfor%}version="XHTML+RDFa 1.0" xml:lang="en"> <head> - <title>Classes available</title> + <title>My new Service</title> <link href="{{base.baseUrl}}/lodspeakr/css/basic.css" rel="stylesheet" type="text/css" media="screen" /> </head> <body> <h1>Classes available</h1> -{%include "header.inc"%} <ul> - {% for row in r %} - <li><a href='{{base.baseUrl}}special/instances/{{ row.resource.curie }}'>{{row.resource.curie}}</a></li> + {% for row in r.main %} + <li><a href="{{base.baseUrl}}special/instances/{{ row.resource.curie }}">{{row.resource.curie}}</a></li> {% endfor %} </ul> </body> </html> - diff --git a/views/special.instances.view.html b/views/special.instances.view.html deleted file mode 100644 index b164024cf0adbbd522503ca1bd7e72e2066057ae..0000000000000000000000000000000000000000 --- a/views/special.instances.view.html +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" - "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd"> - <html xmlns="http://www.w3.org/1999/xhtml" {% for i, ns in base.ns %}xmlns:{{i}}="{{ns}}" - {%endfor%}version="XHTML+RDFa 1.0" xml:lang="en"> - <head> - <title>Instance of {{base.args.arg0}}</title> - <link href="{{base.baseUrl}}/lodspeakr/css/basic.css" rel="stylesheet" type="text/css" media="screen" /> - </head> - <body> - <h1>Instances of {{base.args.arg0}}</h1> -{%include "header.inc"%} - <ul> - {% for row in r %} - <li><a href='{{ row.resource.value }}'>{{row.resource.curie}}</a></li> - {% endfor %} - </ul> - </body> -</html> - diff --git a/views/special.namedGraphs.view.html b/views/special.namedGraphs.view.html deleted file mode 100644 index 65ee0d422589ded5522de1f6a0330367f293fefc..0000000000000000000000000000000000000000 --- a/views/special.namedGraphs.view.html +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" - "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd"> - <html xmlns="http://www.w3.org/1999/xhtml" {% for i, ns in base.ns %}xmlns:{{i}}="{{ns}}" - {%endfor%}version="XHTML+RDFa 1.0" xml:lang="en"> - <head> - <title>Graphs available in the triple store</title> - <link href="{{base.baseUrl}}/lodspeakr/css/basic.css" rel="stylesheet" type="text/css" media="screen" /> - </head> - <body> - <h1>Graphs available</h1> -{%include "header.inc"%} - <ul> - {% for row in r %} - <li>{{row.g.curie}}</li> - {% endfor %} - </ul> - </body> -</html> -