blob: 9f72c4aeee1f1d1c7d85346a6bcce54f0c327ff4 [file] [log] [blame]
<?php
/**
* File containing the ezcConfigurationManager class
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
* @package Configuration
* @version //autogen//
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
*/
/**
* ezcConfigurationManager provides easy access to application settings.
*
* Using this class removes the need to work with specific readers and writers
* and also handles caching to speed up the process. This can be useful for
* smaller applications which don't have too many settings and does not have
* high memory or speed requirements.
*
* Many of the methods of this class that fetch settings accept one to three
* parameters with the following names: $name - the configuration's name. For
* the ini file reader, this is the name of the configuration file without the
* path or the extension (.ini); $group - the name of the group in which the
* setting is located; and $setting - the name of the setting itself.
*
* Before the manager can be used it must be configured so it knows where to
* fetch the settings, this is usually at the start of the program.
* <code>
* $man = ezcConfigurationManager::getInstance();
* $man->init( 'ezcConfigurationIniReader', 'settings', $options );
* </code>
*
* After it is configured the rest of the code can simply access the global
* instance and fetch the settings using getSetting().
* <code>
* $color = ezcConfigurationManager::getInstance()->getSetting( 'site', 'Colors', 'Background' );
* </code>
*
* @see ezcConfiguration
* @see ezcConfigurationReader
* @see ezcConfigurationWriter
*
* @package Configuration
* @mainclass
* @version //autogen//
*/
class ezcConfigurationManager
{
/**
* The name of the class to create readers from. This class must implement
* the ezcConfigurationReader interface, if not the
* ezcConfigurationInvalidReaderClassException exception is thrown when the
* class with the class name in this property is created.
*
* @var ezcConfigurationReader
*/
private $readerClass = null;
/**
* The main location of the configurations which is passed to each reader, this
* is either the path on the filesystem or a PHP stream prefix.
*
* @var mixed
*/
private $location = null;
/**
* Options for the readers, this is passed on when the reader is created
* for the first time.
*
* @var array
*/
private $options = array();
/**
* Maps the name of the configuration to the ezcConfiguration object.
*
* @var array
*/
private $nameMap = array();
/**
* ezcConfigurationManager Singleton instance
*
* @var ezcConfigurationManager
*/
static private $instance = null;
/**
* Constructs an empty manager.
*
* The constructor is private to prevent non-singleton.
*/
private function __construct()
{
}
/**
* Returns the instance of the class ezcConfigurationManager.
*
* @return ezcConfigurationManager
*/
public static function getInstance()
{
if ( is_null( self::$instance ) )
{
self::$instance = new ezcConfigurationManager();
ezcBaseInit::fetchConfig( 'ezcInitConfigurationManager', self::$instance );
}
return self::$instance;
}
/**
* Initializes the manager.
*
* Initializes the manager with the values which will be used by the configuration
* reader. It sets the default location and reader options and which reader to
* use by specifying the class name.
*
* @throws ezcConfigurationInvalidReaderClassException if the $readerClass
* does not exist or does not implement the ezcConfigurationReader
* interface.
*
* @param string $readerClass The name of the class to use as a
* configuration reader. This class must implement the
* ezcConfigurationReader interface.
* @param string $location The main placement for the configuration. It is
* up to the specific reader to interpret this value. This
* can for instance be used to determine the directory
* location for an INI file.
* @param array $options Options for the configuration reader, this is
* passed on the reader specified in $readerClass when it is
* created. Check the documentation for the specific reader
* to see which options it supports.
* @return void
*/
public function init( $readerClass, $location, array $options = array() )
{
// Check if the passed classname actually exists
if ( !ezcBaseFeatures::classExists( $readerClass, true ) )
{
throw new ezcConfigurationInvalidReaderClassException( $readerClass );
}
// Check if the passed classname actually implements the interface.
if ( !in_array( 'ezcConfigurationReader', class_parents( $readerClass ) ) )
{
throw new ezcConfigurationInvalidReaderClassException( $readerClass );
}
$this->readerClass = $readerClass;
$this->location = $location;
$this->options = $options;
}
/**
* Resets the manager to the uninitialized state.
*
* @return void
*/
public function reset()
{
$this->readerClass = null;
$this->location = null;
$this->options = array();
$this->nameMap = array();
}
/**
* Fetches a reader for the configuration $name.
*
* This method checks whether the configuration name was previously
* requested. If it is not requested before, the method will construct a
* new configuration reader based on the settings that were passed to this
* class with the init() method.
*
* @throws ezcConfigurationUnknownConfigException
* if the configuration $name does not exist.
* @throws ezcConfigurationManagerNotInitializedException
* if the manager has not been initialized with the init() method.
*
* @param string $name
* @return ezcConfigurationReader The constructed reader
*/
private function fetchReader( $name )
{
if ( $this->readerClass === null || $this->location === null )
{
throw new ezcConfigurationManagerNotInitializedException();
}
$key = "{$this->readerClass}-{$this->location}-{$name}";
if ( !isset( $this->nameMap[$key] ) )
{
$className = $this->readerClass;
$class = new $className();
$class->init( $this->location, $name, $this->options );
if ( $class->configExists() )
{
$class->load();
}
$this->nameMap[$key] = $class;
}
return $this->nameMap[$key];
}
/**
* Returns whether the setting $setting exists in group $group in the
* configuration named $name.
*
* @throws ezcConfigurationUnknownConfigException if the configuration does not
* exist.
* @throws ezcConfigurationManagerNotInitializedException
* if the manager has not been initialized with the init() method.
*
* @param string $name
* @param string $group
* @param string $setting
* @return bool
*/
public function hasSetting( $name, $group, $setting )
{
$reader = $this->fetchReader( $name );
$config = $reader->getConfig();
if ( $config )
{
return $reader->getConfig()->hasSetting( $group, $setting );
}
else
{
throw new ezcConfigurationUnknownConfigException( $name );
}
}
/**
* Returns if the requested configuration file exists.
*
* Returns a boolean value indicating whether the configuration file exists
* or not.
*
* @throws ezcConfigurationManagerNotInitializedException
* if the manager has not been initialized with the init() method.
*
* @param string $name
* @return bool
*/
public function hasConfigFile( $name )
{
$reader = $this->fetchReader( $name );
$config = $reader->getConfig();
return $config instanceof ezcConfiguration;
}
/**
* Returns the configuration object for the configuration named $name.
*
* @throws ezcConfigurationUnknownConfigException if the configuration
* $name does not exist.
* @throws ezcConfigurationManagerNotInitializedException
* if the manager has not been initialized with the init() method.
*
* @param string $name
* @return ezcConfiguration
*/
private function fetchConfig( $name )
{
$reader = $this->fetchReader( $name );
if ( $reader->configExists() )
{
return $reader->getConfig();
}
else
{
throw new ezcConfigurationUnknownConfigException( $name );
}
}
/**
* Returns configuration setting.
*
* This method fetches a setting depending on the $name, $group and
* $setting parameters. The $functionType parameter determines what type of
* setting (mixed, boolean, number, string or array) should be retrieve. The
* name that you have to pass is one 'setting', 'boolSetting',
* 'numberSetting', 'stringSetting' or 'arraySetting'. This is not checked
* as this is a private function.
*
* @throws ezcConfigurationUnknownConfigException if the configuration does
* not exist.
* @throws ezcConfigurationUnknownGroupException if the group does not
* exist.
* @throws ezcConfigurationUnknownSettingException if the setting does not
* exist.
*
* @param string $functionType
* @param string $name
* @param string $group
* @param string $setting
* @return mixed
*/
private function fetchSetting( $functionType, $name, $group, $setting )
{
return $this->fetchConfig( $name )->$functionType( $group, $setting );
}
/**
* Returns the value of the setting $setting in group $group in the configuration
* named $name.
*
* Uses the fetchSetting() method to fetch the value, this method can throw
* exceptions.
*
* @throws ezcConfigurationUnknownConfigException if the configuration does
* not exist.
* @throws ezcConfigurationUnknownGroupException if the group does not
* exist.
* @throws ezcConfigurationUnknownSettingException if the setting does not
* exist.
*
* @param string $name
* @param string $group
* @param string $setting
* @return mixed
*/
public function getSetting( $name, $group, $setting )
{
return $this->fetchSetting( 'getSetting', $name, $group, $setting );
}
/**
* Returns whether the setting $group group exists in the
* configuration named $name.
*
* @param string $name
* @param string $group
* @return bool True if the group exist.
*/
public function hasGroup( $name, $group )
{
$config = $this->fetchConfig( $name );
return $config->hasGroup( $group );
}
/**
* Returns all settings in group $group in the configuration named $name.
*
* @throws ezcConfigurationUnknownGroupException if the group does not
* exist.
* @param string $name
* @param string $group
* @return array
*/
public function getSettingsInGroup( $name, $group )
{
$config = $this->fetchConfig( $name );
return $config->getSettingsInGroup( $group );
}
/**
* Returns the value of the setting $setting in group $group in the configuration
* named $name.
*
* Uses the fetchSetting() method to fetch the value, this method can throw
* exceptions. This method also validates whether the value is actually a
* boolean value.
*
* @see fetchSetting
*
* @throws ezcConfigurationUnknownConfigException if the configuration does
* not exist.
* @throws ezcConfigurationUnknownGroupException if the group does not
* exist.
* @throws ezcConfigurationUnknownSettingException if the setting does not
* exist.
* @throws ezcConfigurationSettingWrongTypeException if the setting value
* is not a boolean.
* @param string $name
* @param string $group
* @param string $setting
* @return bool
*/
public function getBoolSetting( $name, $group, $setting )
{
return $this->fetchSetting( 'getBoolSetting', $name, $group, $setting );
}
/**
* Returns the value of the setting $setting in group $group in the configuration
* named $name.
*
* Uses the fetchSetting() method to fetch the value, this method can throw
* exceptions. This method also validates whether the value is actually an
* integer value.
*
* @see fetchSetting
*
* @throws ezcConfigurationUnknownConfigException if the configuration does
* not exist.
* @throws ezcConfigurationUnknownGroupException if the group does not
* exist.
* @throws ezcConfigurationUnknownSettingException if the setting does not
* exist.
* @throws ezcConfigurationSettingWrongTypeException if the setting value
* is not a number.
* @param string $name
* @param string $group
* @param string $setting
* @return int
*/
public function getNumberSetting( $name, $group, $setting )
{
return $this->fetchSetting( 'getNumberSetting', $name, $group, $setting );
}
/**
* Returns the value of the setting $setting in group $group in the configuration
* named $name.
*
* Uses the fetchSetting() method to fetch the value, this method can throw
* exceptions. This method also validates whether the value is actually a
* string value.
*
* @see fetchSetting
*
* @throws ezcConfigurationUnknownConfigException if the configuration does
* not exist.
* @throws ezcConfigurationUnknownGroupException if the group does not
* exist.
* @throws ezcConfigurationUnknownSettingException if the setting does not
* exist.
* @throws ezcConfigurationSettingWrongTypeException if the setting value
* is not a string.
* @param string $name
* @param string $group
* @param string $setting
* @return string
*/
public function getStringSetting( $name, $group, $setting )
{
return $this->fetchSetting( 'getStringSetting', $name, $group, $setting );
}
/**
* Returns the value of the setting $setting in group $group in the configuration
* named $name.
*
* Uses the fetchSetting() method to fetch the value, this method can throw
* exceptions. This method also validates whether the value is actually an
* array value.
*
* @see fetchSetting
*
* @throws ezcConfigurationUnknownConfigException if the configuration does
* not exist.
* @throws ezcConfigurationUnknownGroupException if the group does not
* exist.
* @throws ezcConfigurationUnknownSettingException if the setting does not
* exist.
* @throws ezcConfigurationSettingWrongTypeException if the setting value
* is not an array.
* @param string $name
* @param string $group
* @param string $setting
* @return array
*/
public function getArraySetting( $name, $group, $setting )
{
return $this->fetchSetting( 'getArraySetting', $name, $group, $setting );
}
/**
* Returns the values of the settings $settings in group $group in the configuration
* named $name.
*
* For each of the setting names passed in the $settings array it will
* return the setting in the returned array with the name of the setting as
* key.
*
* @see getSettingsAsList
*
* @throws ezcConfigurationUnknownConfigException if the configuration does
* not exist.
* @throws ezcConfigurationUnknownGroupException if the group does not
* exist.
* @throws ezcConfigurationUnknownSettingException if one or more of the
* settings do not exist.
* @param string $name
* @param string $group
* @param array $settings
* @return array
*/
public function getSettings( $name, $group, array $settings )
{
$config = $this->fetchConfig( $name );
return $config->getSettings( $group, $settings );
}
/**
* Returns the values of the settings $settings in group $group as an array.
*
* For each of the setting names passed in the $settings array it will only
* return the values of the settings in the returned array, and not include
* the name of the setting as the array's key.
*
* @see getSettings
*
* @throws ezcConfigurationUnknownConfigException if the configuration does
* not exist.
* @throws ezcConfigurationUnknownGroupException if the group does not
* exist.
* @throws ezcConfigurationUnknownSettingException if one or more of the
* settings do not exist.
* @param string $name
* @param string $group
* @param array $settings
* @return array
*/
public function getSettingsAsList( $name, $group, array $settings )
{
$return = array();
$settings = $this->getSettings( $name, $group, $settings );
foreach ( $settings as $setting )
{
$return[] = $setting;
}
return $return;
}
/**
* Returns true if the configuration named $name exists.
*
* @throws ezcConfigurationManagerNotInitializedException
* if the manager has not been initialized with the init() method.
*
* @param string $name
* @return bool
*/
public function exists( $name )
{
$reader = $this->fetchReader( $name );
return $reader->configExists();
}
/**
* Returns the names of all the groups as an array
*
* @throws ezcConfigurationUnknownConfigException if the configuration
* $name does not exist.
* @throws ezcConfigurationManagerNotInitializedException
* if the manager has not been initialized with the init() method.
*
* @param string $name
* @return array
*/
public function getGroupNames( $name )
{
$config = $this->fetchConfig( $name );
return $config->getGroupNames();
}
}
?>