From 60029fdd473cffbd06259081e1b9e718bf35d2a0 Mon Sep 17 00:00:00 2001
From: alangrafu <alvaro@graves.cl>
Date: Mon, 23 Jan 2012 20:29:18 -0800
Subject: [PATCH] Fixed bugs in modules

Service now return 406 if service exists but the content type is not
supported

Fixed use of previously returned values in classModule

Adding new format for ref:Resource

Delete old format
---
 classes/BasicSpecialFunction.php              | 10 +++---
 classes/Utils.php                             | 31 ++++++++++---------
 common.inc.php                                |  4 +--
 .../html.queries/main.query                   |  7 +++++
 .../json.queries/main.query                   |  3 ++
 .../class.rdfs:Resource/nt.queries/main.query |  3 ++
 .../rdf.queries/main.query                    |  3 ++
 .../ttl.queries/main.query                    |  3 ++
 models/rdfs:Resource.model.html               |  8 -----
 models/rdfs:Resource.model.rdf                |  1 -
 .../html.queries/main.query}                  |  0
 models/special.instances.model.html           |  6 ----
 models/special.namedGraphs.model.html         |  5 ---
 modules/classModule.php                       | 15 +++++----
 modules/serviceModule.php                     | 30 +++++++++++++++---
 .../html.template}                            | 17 +++++-----
 views/class.rdfs:Resource/json.template       |  1 +
 .../nt.template}                              |  0
 views/class.rdfs:Resource/rdf.template        |  1 +
 views/class.rdfs:Resource/ttl.template        |  1 +
 .../html.template}                            |  8 ++---
 views/special.instances.view.html             | 20 ------------
 views/special.namedGraphs.view.html           | 20 ------------
 23 files changed, 89 insertions(+), 108 deletions(-)
 create mode 100644 models/class.rdfs:Resource/html.queries/main.query
 create mode 100644 models/class.rdfs:Resource/json.queries/main.query
 create mode 100644 models/class.rdfs:Resource/nt.queries/main.query
 create mode 100644 models/class.rdfs:Resource/rdf.queries/main.query
 create mode 100644 models/class.rdfs:Resource/ttl.queries/main.query
 delete mode 100644 models/rdfs:Resource.model.html
 delete mode 100644 models/rdfs:Resource.model.rdf
 rename models/{special.classes.model.html => service.classes/html.queries/main.query} (100%)
 delete mode 100644 models/special.instances.model.html
 delete mode 100644 models/special.namedGraphs.model.html
 rename views/{rdfs:Resource.view.html => class.rdfs:Resource/html.template} (93%)
 create mode 100644 views/class.rdfs:Resource/json.template
 rename views/{rdfs:Resource.view.rdf => class.rdfs:Resource/nt.template} (100%)
 create mode 100644 views/class.rdfs:Resource/rdf.template
 create mode 100644 views/class.rdfs:Resource/ttl.template
 rename views/{special.classes.view.html => service.classes/html.template} (72%)
 delete mode 100644 views/special.instances.view.html
 delete mode 100644 views/special.namedGraphs.view.html

diff --git a/classes/BasicSpecialFunction.php b/classes/BasicSpecialFunction.php
index e87f2c97..6a3fc28f 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 eaf6767e..855d7783 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 5579e1a7..eaf3f257 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 00000000..107b0b99
--- /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 00000000..fbb7078a
--- /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 00000000..fbb7078a
--- /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 00000000..fbb7078a
--- /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 00000000..fbb7078a
--- /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 5e8f44e2..00000000
--- 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 61df9dc8..00000000
--- 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 d7de13cc..00000000
--- 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 b73ae66e..00000000
--- 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 68ab2266..3348c78d 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 695229fe..7e2e0865 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 59f36318..2cd8b212 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 00000000..f6451d60
--- /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 00000000..f6451d60
--- /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 00000000..ca994557
--- /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 8a7777fe..dac4c802 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 b164024c..00000000
--- 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 65ee0d42..00000000
--- 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>
-
-- 
GitLab