From b861050c4ea9e3c0e26e5e7c65d56261c4d2a546 Mon Sep 17 00:00:00 2001 From: Pieter Colpaert Date: Sat, 24 Sep 2011 23:04:56 +0200 Subject: [PATCH] At least TDTInfo works again --- controllers/RController.class.php | 40 ++++---------- model/AResourceFactory.class.php | 20 +++++++ model/CoreResourceFactory.class.php | 44 +++++++++------- model/Doc.class.php | 1 + model/GenericResourceFactory.class.php | 47 ++++++++++++----- model/InstalledResourceFactory.class.php | 21 +++++--- model/RemoteResourceFactory.class.php | 30 ++++++++--- model/ResourcesModel.class.php | 18 ++++--- model/packages/Feedback/Messages.class.php | 19 +++---- model/packages/TDTInfo/Exceptions.class.php | 2 +- model/packages/TDTInfo/Mapping.class.php | 6 +-- model/packages/TDTInfo/Packages.class.php | 2 +- model/packages/TDTInfo/Queries.class.php | 2 +- model/packages/TDTInfo/Resources.class.php | 7 +-- model/packages/TDTInfo/Sparql.class.php | 2 +- model/resources/AResource.class.php | 45 +++------------- model/resources/read/AReader.class.php | 58 ++------------------- router.php | 14 ----- 18 files changed, 161 insertions(+), 217 deletions(-) diff --git a/controllers/RController.class.php b/controllers/RController.class.php index b1afb65d..2d476cf6 100644 --- a/controllers/RController.class.php +++ b/controllers/RController.class.php @@ -27,50 +27,32 @@ function GET($matches) { //This will create an instance of a factory depending on which format is set $this->formatterfactory = FormatterFactory::getInstance($matches["format"]); - //This will create an instance of AResource + //Get an instance of our model $model = ResourcesModel::getInstance(); - $resource = $model->getResource($package,$resourcename); + //ask the model for our documentation: access to all packages and resources! + $doc = $model->getAllDoc(); $RESTparameters = array(); if(isset($matches['RESTparameters']) && $matches['RESTparameters'] != ""){ $RESTparameters = explode("/",rtrim($matches['RESTparameters'],"/")); } - $requiredparams = array(); + $parameters = $_GET; - foreach($model->getResourceRequiredParameters($package,$resourcename) as $parameter){ + //check for required parameters + foreach($doc->$package->$resourcename->requiredparameters as $parameter){ //set the parameter of the method if(!isset($RESTparameters[0])){ throw new ParameterTDTException($parameter); } - $resource->setParameter($parameter, $RESTparameters[0]); - $requiredparams[$parameter]=$RESTparameters[0]; - - //removes the first element and reindex the array + $parameters[$parameter]=$RESTparameters[0]; + //removes the first element and reindex the array - this way we'll only keep the object specifiers in this array array_shift($RESTparameters); } //what remains in the $resources array are specification for a RESTful way of identifying objectparts //for instance: http://api.../TDTInfo/Modules/module/1/ would make someone only select the second module - - //also give the non REST parameters to the resource class - $resource->processParameters(); - // check if the given format is allowed by the method - $printmethod = ""; - foreach($model->getAllowedPrintMethods($package,$resourcename) as $printername){ - if(strtolower($this->formatterfactory->getFormat()) == strtolower($printername)){ - $printmethod = $printername; - break; - } - } - - //if the printmethod is not allowed, just throw an exception - if($printmethod == "" || strtolower($this->formatterfactory->getFormat()) == "about"){ - throw new FormatNotAllowedTDTException($this->formatterfactory->getFormat(),$resource->getAllowedPrintMethods()); - } - - //Let's do the call! - $result = $resource->call(); + $result = $model->readResource($package,$resourcename, $parameters); /* * Add foreign the required foreign relations URL's to the resulting object @@ -142,9 +124,9 @@ function GET($matches) { $printer = $this->formatterfactory->getPrinter(strtolower($resourcename), $result); $printer->printAll(); - if($model->getResourceType($package,$resourcename) != "remote"){ + //if($model->getResourceType($package,$resourcename) != "remote"){ RequestLogger::logRequest(); - } + //} } /** diff --git a/model/AResourceFactory.class.php b/model/AResourceFactory.class.php index 67c28edb..8a1013af 100644 --- a/model/AResourceFactory.class.php +++ b/model/AResourceFactory.class.php @@ -9,6 +9,26 @@ */ abstract class AResourceFactory{ + + /** + * Quickly check if this factory has a specific resource + * @param package the name of the package the resource has + * @param resource the name of the resource + * @return boolean whether or not this factory has the package + */ + public function hasResource($package,$resource){ + foreach($this->getAllResourceNames() as $packagename => $resourcenames){ + foreach($resourcenames as $resourcename){ + if($resourcename == $resource && $package == $packagename){ + return true; + } + } + } + return false; + } + + abstract protected function getAllResourceNames(); + /** * Creates an instance of a creator class. * @param $package the new package of the resource. It may exist already diff --git a/model/CoreResourceFactory.class.php b/model/CoreResourceFactory.class.php index 4bf1ed72..d18f6971 100644 --- a/model/CoreResourceFactory.class.php +++ b/model/CoreResourceFactory.class.php @@ -10,33 +10,43 @@ class CoreResourceFactory extends AResourceFactory { + protected function getAllResourceNames(){ + return array("TDTInfo" => array("Resources", "Queries", "Packages", "Exceptions", "Mapping")); + } + public function createCreator($package,$resource, $parameters){ //do nothing } public function createReader($package,$resource, $parameters){ - - } - - public function createUpdater($package,$resource, $parameters){ - + include_once("model/packages/" . $package . "/" . $resource . ".class.php"); + $creator = new $resource($package,$resource); + $creator->processParameters($parameters); + return $creator; } public function createDeleter($package,$resource){ - + //do nothing } public function makeDoc($doc){ //ask every resource we have for documentation foreach($this->getAllResourceNames() as $package => $resourcenames){ + if(!isset($doc->$package)){ + $doc->$package = new StdClass(); + } foreach($resourcenames as $resourcename){ - include_once("model/packages/" . $package . "/" . $resourcename . ".class.php"); - $docs->$package->$resourcename->doc = $resourcename::getDoc(); - $docs->$package->$resourcename->requiredparameters = $resourcename::getRequiredParameters(); - $docs->$package->$resourcename->parameters = $resourcename::getParameters(); - $docs->$package->$resourcename->formats = $resourcename::getAllowedFormats(); - $docs->$package->$resourcename->creation_timestamp = $this->getCreationTime($package,$resource); - $docs->$package->$resourcename->modification_timestamp = $this->getModificationTime($package,$resource); + $doc->$package->$resourcename = new StdClass(); + include_once("model/packages/" . $package . "/" . $resourcename . ".class.php"); + $doc->$package->$resourcename->doc = $resourcename::getDoc(); + $doc->$package->$resourcename->requiredparameters = $resourcename::getRequiredParameters(); + $doc->$package->$resourcename->parameters = $resourcename::getParameters(); + $doc->$package->$resourcename->formats = array();//if empty array: allow all + if(function_exists("$resourcename::getAllowedFormatters")){ + $doc->$package->$resourcename->formats = $resourcename::getAllowedFormatters(); + } + $doc->$package->$resourcename->creation_timestamp = $this->getCreationTime($package,$resourcename); + $doc->$package->$resourcename->modification_timestamp = $this->getModificationTime($package,$resourcename); } } } @@ -53,12 +63,6 @@ private function getCreationTime($package, $resource) { private function getModificationTime($package, $resource) { // for an existing folder you can only get the last modification date in php, so return $this->getCreationTime($package, $resource); - } - - private function getAllResourceNames(){ - return array("TDTInfo" => array("Resources", "Queries", "Packages", "Exceptions", "Mapping")); - } - + } } - ?> diff --git a/model/Doc.class.php b/model/Doc.class.php index 1822e3cf..d8f14aec 100644 --- a/model/Doc.class.php +++ b/model/Doc.class.php @@ -18,6 +18,7 @@ public function visitAll($factories){ $c = Cache::getInstance(); $doc = $c->get("documentation"); if(is_null($doc)){ + $doc = new stdClass(); foreach($factories as $factory){ $factory->makeDoc($doc); } diff --git a/model/GenericResourceFactory.class.php b/model/GenericResourceFactory.class.php index 3b1cb355..c11ad684 100644 --- a/model/GenericResourceFactory.class.php +++ b/model/GenericResourceFactory.class.php @@ -1,5 +1,4 @@ processParameters($parameters); + return $creator; } public function createReader($package,$resource, $parameters){ - include_once("model/resources/create/GenericResourceReader.class.php"); - //Todo: processParameters - foreach($parameters as $key => $value){ - - } - - return new GenericResourceReader($parameters["generic_type"]); + include_once("model/resources/read/GenericResourceReader.class.php"); + $reader = new GenericResourceReader($package, $resource, $parameters["generic_type"]); + $reader->processParameters($parameters); + return $reader; } public function createDeleter($package,$resource){ - + include_once("model/resources/delete/GenericResourceDeleter.class.php"); + $deleter = new GenericResourceDeleter($package,$resource); + return $deleter; } - + public function makeDoc($doc){ + //ask every resource we have for documentation + foreach($this->getAllResourceNames() as $package => $resourcenames){ + foreach($resourcenames as $resourcename){ + include_once("model/packages/" . $package . "/" . $resourcename . ".class.php"); + $docs->$package->$resourcename->doc = $resourcename::getDoc(); + $docs->$package->$resourcename->requiredparameters = $resourcename::getRequiredParameters(); + $docs->$package->$resourcename->parameters = $resourcename::getParameters(); + $docs->$package->$resourcename->formats = $resourcename::getAllowedFormats(); + $docs->$package->$resourcename->creation_timestamp = $this->getCreationTime($package,$resource); + $docs->$package->$resourcename->modification_timestamp = $this->getModificationTime($package,$resource); + } + } + } + protected function getAllResourceNames(){ + $results = DBQueries::getAllGenericResourceNames(); + $resources = array(); + foreach($results as $result){ + if(!array_key_exists($result["package_name"],$resources)){ + $resources[$result["package_name"]] = array(); + } + $resources[$result["package_name"]][] = $result["res_name"]; + } + return $resources; } } diff --git a/model/InstalledResourceFactory.class.php b/model/InstalledResourceFactory.class.php index 66cdb8ae..ba248e2d 100644 --- a/model/InstalledResourceFactory.class.php +++ b/model/InstalledResourceFactory.class.php @@ -27,14 +27,20 @@ public function createDeleter($package,$resource){ public function makeDoc($doc){ //ask every resource we have for documentation foreach($this->getAllResourceNames() as $package => $resourcenames){ + if(!isset($doc->$package)){ + $doc->$package = new StdClass(); + } foreach($resourcenames as $resourcename){ + $doc->$package->$resourcename = new StdClass(); include_once("custom/packages/" . $package . "/" . $resourcename . ".class.php"); - $docs->$package->$resourcename->doc = $resourcename::getDoc(); - $docs->$package->$resourcename->requiredparameters = $resourcename::getRequiredParameters(); - $docs->$package->$resourcename->parameters = $resourcename::getParameters(); - $docs->$package->$resourcename->formats = $resourcename::getAllowedFormats(); - $docs->$package->$resourcename->creation_timestamp = $this->getCreationTime($package,$resource); - $docs->$package->$resourcename->modification_timestamp = $this->getModificationTime($package,$resource); + $doc->$package->$resourcename->doc = $resourcename::getDoc(); + $doc->$package->$resourcename->requiredparameters = $resourcename::getRequiredParameters(); + $doc->$package->$resourcename->parameters = $resourcename::getParameters(); + if(function_exists("$resourcename::getAllowedFormatters")){ + $doc->$package->$resourcename->formats = $resourcename::getAllowedFormatters(); + } + $doc->$package->$resourcename->creation_timestamp = $this->getCreationTime($package,$resourcename); + $doc->$package->$resourcename->modification_timestamp = $this->getModificationTime($package,$resourcename); } } } @@ -53,7 +59,7 @@ private function getModificationTime($package, $resource) { return $this->getCreationTime($package, $resource); } - private function getAllResourceNames(){ + protected function getAllResourceNames(){ $packages = array(); //open the custom directory and loop through it if ($handle = opendir('custom/packages')) { @@ -66,7 +72,6 @@ private function getAllResourceNames(){ } closedir($handle); } - return $packages; } } diff --git a/model/RemoteResourceFactory.class.php b/model/RemoteResourceFactory.class.php index 8fa3f4e5..1805e0e7 100644 --- a/model/RemoteResourceFactory.class.php +++ b/model/RemoteResourceFactory.class.php @@ -8,24 +8,36 @@ * @author Jan Vansteenlandt * @author Pieter Colpaert */ -include_once("model/resources/RemoteResource.class.php"); +include_once("model/resources/AResource.class.php"); class RemoteResourceFactory extends AResourceFactory{ + protected function getAllResourceNames(){ + $resultset = DBQueries::getAllRemoteResourceNames(); + $resources = array(); + foreach($resultset as $result){ + if(!isset($resources[$result["package_name"]])){ + $resources[$result["package_name"]] = array(); + } + $resources[$result["package_name"]][] = $result["res_name"]; + } + return $resources; + } + public function createCreator($package,$resource, $parameters){ include_once("model/resources/create/RemoteResourceCreator.class.php"); - //todo: give parameters to the creator through processparameters - return new RemoteResourceCreator(); + $creator = new RemoteResourceCreator(); + $creator->processParameters($parameters); + return $creator; } public function createReader($package,$resource, $parameters){ include_once("model/resources/read/RemoteResourceReader.class.php"); - return new RemoteResourceReader($package, $resource); + $reader = new RemoteResourceReader($package, $resource); + $reader->processParameters($parameters); + return $reader; } - public function createUpdater($package,$resource, $parameters){ - - } public function createDeleter($package,$resource){ @@ -33,7 +45,11 @@ public function createDeleter($package,$resource){ public function makeDoc($doc){ foreach($this->getAllResourceNames() as $package => $resourcenames){ + if(!isset($doc->$package)){ + $doc->$package = new StdClass(); + } foreach($resourcenames as $resource){ + $doc->$resource = new StdClass(); $doc->$package->$resource = $this->fetchResourceDocumentation($package, $resource); } } diff --git a/model/ResourcesModel.class.php b/model/ResourcesModel.class.php index f1ce8e96..e3ea6eb5 100644 --- a/model/ResourcesModel.class.php +++ b/model/ResourcesModel.class.php @@ -1,6 +1,6 @@ getAllDoc(); foreach($doc as $packagename => $resourcenames){ if($package == $packagename){ - foreach($resourcenames as $resourcename){ + foreach($resourcenames as $resourcename => $var){ if($resourcename == $resource){ return true; } @@ -100,7 +102,7 @@ public function readResource($package, $resource, $parameters){ foreach($this->factories as $factory){ if($factory->hasResource($package, $resource)){ $reader = $factory->createReader($package,$resource,$parameters); - $reader->read(); + return $reader->read(); } } } @@ -137,8 +139,8 @@ public function deleteResource($package, $resource){ */ public function getAllDoc(){ $doc = new Doc(); - $doc->visitAll($this->factories); - return $doc; + $d = $doc->visitAll($this->factories); + return $d; } } diff --git a/model/packages/Feedback/Messages.class.php b/model/packages/Feedback/Messages.class.php index 5988ac37..3005e5e3 100644 --- a/model/packages/Feedback/Messages.class.php +++ b/model/packages/Feedback/Messages.class.php @@ -1,17 +1,12 @@ - * @license: AGPLv3 - */ - -include_once("model/resources/AResource.class.php"); - /** - * Class messages. Allows to push a feedback for a certain method. + * This file contains the Messages method needed for the feedback concept. + * @package The-DataTank/packages/Feedback/ + * @copyright (C) 2011 by iRail vzw/asbl + * @author: Werner Laurensse + * @license: AGPLv3 */ + class Messages extends AResource { private $lang; private $system; @@ -41,7 +36,7 @@ public function setParameter($name,$val) { $this->$name = $val; } - public static function getAllowedPrintMethods() { + public static function getAllowedFormatters() { return array("php","xml","json","jsonp"); } diff --git a/model/packages/TDTInfo/Exceptions.class.php b/model/packages/TDTInfo/Exceptions.class.php index fb57d63a..fcf995c5 100644 --- a/model/packages/TDTInfo/Exceptions.class.php +++ b/model/packages/TDTInfo/Exceptions.class.php @@ -38,7 +38,7 @@ public function call() { return $o; } - public static function getAllowedPrintMethods() { + public static function getAllowedFormatters() { return array("json", "xml", "jsonp", "php", "html"); } diff --git a/model/packages/TDTInfo/Mapping.class.php b/model/packages/TDTInfo/Mapping.class.php index e359c89e..c8321a37 100644 --- a/model/packages/TDTInfo/Mapping.class.php +++ b/model/packages/TDTInfo/Mapping.class.php @@ -39,11 +39,7 @@ public function setParameter($key, $val) { } } - public function processParameters() { - parent::processParameters(); - } - - public static function getAllowedPrintMethods() { + public static function getAllowedFormatters() { return array("html", "rdf_xml", "rdf_ntriple", "rdf_n3", "rdf_json"); } diff --git a/model/packages/TDTInfo/Packages.class.php b/model/packages/TDTInfo/Packages.class.php index 383f0f75..281258b3 100644 --- a/model/packages/TDTInfo/Packages.class.php +++ b/model/packages/TDTInfo/Packages.class.php @@ -27,7 +27,7 @@ public function call(){ return $o; } - public static function getAllowedPrintMethods(){ + public static function getAllowedFormatters(){ return array("json","xml", "jsonp", "php", "html"); } diff --git a/model/packages/TDTInfo/Queries.class.php b/model/packages/TDTInfo/Queries.class.php index 902b17dc..97734a8a 100644 --- a/model/packages/TDTInfo/Queries.class.php +++ b/model/packages/TDTInfo/Queries.class.php @@ -170,7 +170,7 @@ public function call(){ return $this->queryResults; } - public static function getAllowedPrintMethods(){ + public static function getAllowedFormatters(){ return array("json","xml", "jsonp", "php", "html"); } diff --git a/model/packages/TDTInfo/Resources.class.php b/model/packages/TDTInfo/Resources.class.php index e665e88b..c5bae2d6 100644 --- a/model/packages/TDTInfo/Resources.class.php +++ b/model/packages/TDTInfo/Resources.class.php @@ -20,17 +20,14 @@ public static function getRequiredParameters(){ } public function setParameter($key,$val){ + //we don't have any parameters } public function call(){ $resmod = ResourcesModel::getInstance(); - $o = $resmod->getAllDocs(); + $o = $resmod->getAllDoc(); return $o; } - - public static function getAllowedPrintMethods(){ - return array("json","xml", "jsonp", "php", "html", "rdf_xml", "rdf_n3"); - } public static function getDoc(){ return "This resource contains the most important information"; diff --git a/model/packages/TDTInfo/Sparql.class.php b/model/packages/TDTInfo/Sparql.class.php index af006a92..31a059d7 100644 --- a/model/packages/TDTInfo/Sparql.class.php +++ b/model/packages/TDTInfo/Sparql.class.php @@ -25,7 +25,7 @@ public function call() { } - public static function getAllowedPrintMethods() { + public static function getAllowedFormatters() { return array("html","xml"); } diff --git a/model/resources/AResource.class.php b/model/resources/AResource.class.php index 4cb16138..25b9ebdb 100644 --- a/model/resources/AResource.class.php +++ b/model/resources/AResource.class.php @@ -1,52 +1,19 @@ * @author Jan Vansteenlandt */ -/** - * This class is an abstract class that represent a php method that can be called. It provides certain - * functionality, yet method specific functionality still needs to be implement by inheriting classes. - */ +include_once("model/resources/read/AReader.class.php"); abstract class AResource extends AReader{ - - public static $BASICPARAMS = array("callback", "filterBy","filterValue","filterOp"); - - /** - * This function need to be called to set all parameters correctly - */ - public function processParameters(){ - // Check all GET parameters and give them to setParameter, which needs to be handled by the extended method. - foreach($_GET as $key => $value){ - //the method and module will already be parsed by another system - //we don't need the format as well, this is used by printer - if(!in_array($key,self::$BASICPARAMS)){ - //check whether this parameter is in the documented parameters - $params = $this->getParameters(); - if(isset($params[$key])){ - $this->setParameter($key,$value); - }else{ - throw new ParameterDoesntExistTDTException($key); - } - } - } + public function read(){ + return $this->call(); } - - /** - * This functions contains the businesslogic of the method - * @return Object representing the result of the businesslogic. - */ - abstract public function call(); - - /** - * This function is used to set a value for a certain parameter. - * @param string $name Name of the parameter - * @param mixed $val Value that will be set to the parameter. - */ - abstract public function setParameter($name,$val); } ?> \ No newline at end of file diff --git a/model/resources/read/AReader.class.php b/model/resources/read/AReader.class.php index 8f4c8ca4..5b20be8f 100644 --- a/model/resources/read/AReader.class.php +++ b/model/resources/read/AReader.class.php @@ -14,13 +14,6 @@ abstract class AReader{ // package and resource are always the two minimum parameters protected $parameters = array(); protected $requiredParameters = array(); - protected $package; - protected $resource; - - public function __construct($package,$resource){ - $this->package = $package; - $this->resource = $resource; - } /** * execution method @@ -29,7 +22,7 @@ abstract public function read(); public function processParameters($parameters){ // Check all GET parameters and give them to setParameter, which needs to be handled by the extended method. - foreach($parameters as $key => $value){ + /*foreach($parameters as $key => $value){ //the method and module will already be parsed by another system //we don't need the format as well, this is used by printer if(!in_array($key,self::$BASICPARAMS)){ @@ -44,13 +37,13 @@ public function processParameters($parameters){ /* * check if all requiredparameters have been set - */ - foreach($this->requiredParameters as $key){ + + foreach($this->getRequiredParameters() as $key){ if($this->$key == ""){ throw new ParameterTDTException("Required parameter ".$key ." has not been passed"); } } - +*/ /* * set the parameters */ @@ -60,48 +53,5 @@ public function processParameters($parameters){ } abstract protected function setParameter($key, $value); - - /** - * get the required parameters - * @return Array with all the required Read parameters - */ - public function getRequiredParameters(){ - return $this->requiredParameters; - } - - /** - * get the optional parameters - * @return Array with all the optional Read parameters - */ - public function getParameters(){ - return $this->parameters; - } - - /** - * get the documentation about getting of a resource - * @return String with some documentation about the resource - */ - abstract public function getDocumentation(); - - /** - * get the allowed formats - * @return Array with all of the allowed formatter names - */ - abstract public function getAllowedFormatters(); - - /* - * get the creation time - */ - - public function getCreationTime(){ - return DBQueries::getCreationTime($this->package,$this->resource); - } - - /* - * get the modification time - */ - public function getModificationTime(){ - return DBQueries::getModificationTime($this->package,$this->resource); - } } ?> \ No newline at end of file diff --git a/router.php b/router.php index 4a46593a..d41043e3 100644 --- a/router.php +++ b/router.php @@ -22,12 +22,7 @@ include_once('TDT.class.php'); //general purpose static class include_once('Config.class.php'); //Configfile include_once('RequestURI.class.php'); -include_once('model/AResourceFactory.class.php'); -include_once('model/GenericResourceFactory.class.php'); -include_once('model/InstalledResourceFactory.class.php'); -include_once('model/RemoteResourceFactory.class.php'); include_once('model/ResourcesModel.class.php'); -include_once('model/resources/AResource.class.php'); include_once('model/semantics/RDFMapper.class.php'); include_once('model/semantics/RDFOutput.class.php'); @@ -78,13 +73,4 @@ ErrorHandler::logException($e); } -//TODO Werner: needs to move. -class FeedbackHandler { - function POST($matches) { - require_once ('PostMessage.class.php'); - $post = new PostMessage(); - $post->post(); - } -} - ?>