Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
100.00% |
1 / 1 |
|
100.00% |
5 / 5 |
CRAP | |
100.00% |
62 / 62 |
Config | |
100.00% |
1 / 1 |
|
100.00% |
5 / 5 |
22 | |
100.00% |
62 / 62 |
convertStr(&$val) | |
100.00% |
1 / 1 |
3 | |
100.00% |
8 / 8 |
|||
findConfigFile($cfgFile) | |
100.00% |
1 / 1 |
3 | |
100.00% |
9 / 9 |
|||
__construct(\Scrivo\String $path=null) | |
100.00% |
1 / 1 |
13 | |
100.00% |
40 / 40 |
|||
__isset($name) | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
__get($name) | |
100.00% |
1 / 1 |
2 | |
100.00% |
4 / 4 |
<?php | |
/* Copyright (c) 2012, Geert Bergman (geert@scrivo.nl) | |
* All rights reserved. | |
* | |
* Redistribution and use in source and binary forms, with or without | |
* modification, are permitted provided that the following conditions are met: | |
* | |
* 1. Redistributions of source code must retain the above copyright notice, | |
* this list of conditions and the following disclaimer. | |
* 2. Redistributions in binary form must reproduce the above copyright notice, | |
* this list of conditions and the following disclaimer in the documentation | |
* and/or other materials provided with the distribution. | |
* 3. Neither the name of "Scrivo" nor the names of its contributors may be | |
* used to endorse or promote products derived from this software without | |
* specific prior written permission. | |
* | |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | |
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
* POSSIBILITY OF SUCH DAMAGE. | |
* | |
* $Id: Config.php 866 2013-08-25 16:22:35Z geert $ | |
*/ | |
/** | |
* Implementation of the \Scrivo\Config class. | |
*/ | |
namespace Scrivo; | |
/** | |
* Class to hold Scrivo configuration data. | |
* | |
* Scrivo configuration data is stored in instances of this class. Scrivo | |
* configuration data comes from two different sources: | |
* | |
* * Default configuration data: entries that always exist and which have | |
* values that can be overwritten by entries in the Scrivo configuration | |
* file. | |
* * Optional configuration data: all entries in the Scrivo configuration | |
* file that are no part of the default set will also become members of the | |
* configuration class. | |
* | |
* There are also id-label pairs: certain id's can be labbelled in the database, | |
* this configuration data can be accessed through the class \Scrivo\IdLabel. | |
* | |
* When instantiating this class it will search up the directory tree for a | |
* Scrivo config file named ".htscrivo". Alternatively you can specify a file | |
* when instantiating a configuration data object. | |
* | |
* Note that only string and numeric values can be specified. These will be | |
* converted to a \Scrivo\String, int or float value. It is not possible | |
* to specify boolean values due to limitations of the php function | |
* parse_ini_file. So also note that specifing values like true, false, yes, | |
* no, on and off without quotes might not give you the expected results. | |
* When you need boolean values it is preferred to use the numeric values 0 | |
* or 1. | |
* | |
* @property-read \Scrivo\String $ADMIN_IP_ADDRESSES | |
* @property-read \Scrivo\String $CACHE_DIR | |
* @property-read int $CACHE_DIR_GC | |
* @property-read \Scrivo\String $CACHE_TYPE | |
* @property-read \Scrivo\String $DB_API | |
* @property-read int $HTML_TIDY | |
* @property-read \Scrivo\String $HTTP_PROTOCOL | |
* @property-read int $JS_DEBUG | |
* @property-read \Scrivo\String $KEY_PREFIX | |
* @property-read int $ROOT_PAGE_ID | |
* @property-read int $ROOT_FOLDER_ID | |
* @property-read \Scrivo\String $SESSION_PREFIX | |
* @property-read \Scrivo\String $UI_LANG | |
* @property-read \Scrivo\String $WEBSERVICE_SPELL | |
* @property-read \Scrivo\String $WEBSERVICE_TIDY | |
*/ | |
class Config { | |
/** | |
* Array to hold all data from the config file. | |
* @var array | |
*/ | |
protected $ini; | |
/** | |
* Convert a string read from an ini file to its most likely type. | |
* | |
* @param string $val The value read from the ini file. | |
* | |
* @return int|float|\Scrivo\String The given value converted to its | |
* most likely type. | |
*/ | |
private function convertStr(&$val) { | |
if (is_numeric($val)) { | |
if ((string)$val === (string)(int)$val) { | |
$val = intval($val); | |
} else { | |
$val = floatval($val); | |
} | |
} else { | |
$val = new \Scrivo\String($val); | |
} | |
} | |
/** | |
* Try to find a Scrivo config file higher up the directory tree. | |
* | |
* @param string $cfgFile The name of the configuration file to locate. | |
* | |
* @return string A Scrivo configuration file name. | |
*/ | |
private function findConfigFile($cfgFile) { | |
$parts = \Scrivo\String::create($_SERVER["SCRIPT_FILENAME"])->split( | |
new \Scrivo\String(DIRECTORY_SEPARATOR)); | |
for ($i = count($parts)-2; $i >=0; $i--) { | |
array_pop($parts); | |
$file = implode("/", $parts)."/$cfgFile"; | |
if (file_exists($file)) { | |
return($file); | |
} | |
} | |
throw new \Scrivo\SystemException("Could not locate config file"); | |
} | |
/** | |
* Create a configuration data object. As input the constructor will | |
* look for an Scrivo config file at expected locations or at an | |
* alternative location if provided. | |
* | |
* @param \Scrivo\String If you don't want/can't use the standard Scrivo | |
* configuration file you can provide the location of an alternative file. | |
*/ | |
public function __construct(\Scrivo\String $path=null) { | |
\Scrivo\ArgumentCheck::assertArgs(func_get_args(), array(null), 0); | |
// Read the ini file. | |
if (!$path) { | |
$path = $this->findConfigFile(".htscrivo"); | |
} | |
try { | |
$this->ini = parse_ini_file((string)$path); | |
} catch (\Exception $e) { | |
throw new \Scrivo\SystemException( | |
"Invalid config file: ".$e->getMessage()); | |
} | |
// The basic set of properties and their default values. | |
$def = array( | |
"ADMIN_IP_ADDRESSES" => "127.0.0.1", | |
"CACHE_DIR" => "", | |
"CACHE_DIR_GC" => 0, | |
"CACHE_TYPE" => function_exists("apc_fetch") ? "APC" : "", | |
"DB_API" => "mysql", | |
"HTML_TIDY" => 0, | |
"HTTP_PROTOCOL" => "http://", | |
"JS_DEBUG" => 0, | |
"KEY_PREFIX" => strtoupper(preg_replace("/[^a-zA_Z0-9]+/", "_", | |
isset($this->ini["WWW_ROOT"])?$this->ini["WWW_ROOT"]:""))."_", | |
"ROOT_PAGE_ID" => "1", | |
"ROOT_FOLDER_ID" => "2", | |
"SESSION_PREFIX" => | |
(isset($this->ini["DB_NAME"])?$this->ini["DB_NAME"]:"")."_". | |
(isset($this->ini["INSTANCE_ID"])?$this->ini["INSTANCE_ID"]:""). | |
"_", | |
"UI_LANG" => "en_US", | |
"WEBSERVICE_SPELL" => "http://www.scrivo.nl/spell/spell.php", | |
"WEBSERVICE_TIDY" => "http://www.scrivo.nl/tidy/tidy.php", | |
); | |
// Set missing entries to the default values. | |
foreach ($def as $d=>$v) { | |
if (!isset($this->ini[$d])) { | |
$this->ini[$d] = $v; | |
} | |
} | |
// Rename legacy key names | |
if (!isset($this->ini["DB_HOST"]) && isset($this->ini["DB_SERVER"])) { | |
$this->ini["DB_HOST"] = $this->ini["DB_SERVER"]; | |
} | |
if (!isset($this->ini["DB_USER"]) && isset($this->ini["DB_USERCODE"])) { | |
$this->ini["DB_USER"] = $this->ini["DB_USERCODE"]; | |
} | |
// Convert types | |
array_walk($this->ini, array($this, 'convertStr')); | |
} | |
/** | |
* Test if a particular property was set. | |
* | |
* @param string $name The name of the configuration property to test. | |
* | |
* @return boolean True if the property was set, false if not. | |
*/ | |
public function __isset($name) { | |
return isset($this->ini[$name]); | |
} | |
/** | |
* Accessor method for configuration data members. | |
* | |
* @param string $name The configuration property name to retrieve for | |
* which to retrieve it's value. | |
* | |
* @return \Scrivo\String|float|int The value of the property $name. | |
*/ | |
public function __get($name) { | |
if (!$this->__isset($name)) { | |
throw new \Scrivo\SystemException( | |
"Invalid configuration property '$name'"); | |
} | |
return $this->ini[$name]; | |
} | |
} | |
?> |