blob: 924421f1ecef42d19449fb3ea57209cbd47a7bd0 [file] [log] [blame]
<?php
/**
* File containing the ezcConfigurationFileReader 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
*/
/**
* ezcConfigurationFileReader class provides the functionality for reading
* file based configuration formats.
*
* This class implements most of the interface of ezcConfigurationReader and
* makes it easier to work on file based configuration. All methods except
* load() and validate() are implemented by this class, so a subclass only
* needs to handle the actual serialization.
*
* @package Configuration
* @version //autogen//
*/
abstract class ezcConfigurationFileReader extends ezcConfigurationReader
{
/**
* The path to the file which will contain the serialized configuration data.
*
* @var string
*/
protected $path = '';
/**
* The current location of the config, this is either the path on the filesystem
* or a PHP stream prefix.
*
* @var string
*/
protected $location = '';
/**
* The base name of the configuration file, the suffix will be appended to this
* to find the real filename.
*
* @var string
*/
protected $name = '';
/**
* Current options for the reader.
* See the specific reader to see which options it supports.
*
* @var array
*/
protected $options = array();
/**
* Contains the configuration object that was read from the file with
* load().
*
* @var ezcConfiguration
*/
protected $config = false;
/**
* Controls whether comments are read from the INI file or not.
*
* @var bool
*/
private $useComments;
/**
* Constructs the reader object.
*
* $path must contain the relative or absolute path to the configuration file.
* You can use PHP streams, e.g compress.gz://site.ini.gz.
*
* After construction call load() to parse the INI file from disk and return a
* configuration object.
*
* @param string $path
*/
public function __construct( $path = null )
{
if ( $path !== null )
{
$this->parseLocationPath( $path, $this->getSuffix() );
}
}
/**
* Initializes the reader with a location and a name. These values determine
* where the configuration will be serialized.
*
* @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 string $name The name for the configuration. It is up to the
* specific reader to interpret this value. This can for
* instance be the basename for the INI file, so a value of
* 'site' would create a file with name 'site.ini'.
* @param array $options An associative array of options for the reader.
* Which options to use is determined by the specific reader
* class.
* @return void
*/
public function init( $location, $name, array $options = array() )
{
$this->path = $location . DIRECTORY_SEPARATOR . $name . '.' . $this->getSuffix();
$this->location = $location;
$this->name = $name;
$this->setOptions( $options );
}
/**
* Sets the options $configurationData.
*
* The options are specified in a associative array in the form 'optionName' => value.
*
* @throws ezcBaseSettingNotFoundException if you try to set a non existent setting.
* @throws ezcBaseSettingValueException if you specify a value out of range for a setting.
* @param array(string=>mixed) $configurationData
* @return void
*/
public function setOptions( $configurationData )
{
foreach ( $configurationData as $name => $value )
{
switch ( $name )
{
case 'useComments':
if ( gettype( $value ) != 'boolean' )
{
throw new ezcBaseSettingValueException( $name, $value, 'bool' );
}
$this->useComments = $value;
break;
default:
throw new ezcBaseSettingNotFoundException( $name );
}
}
}
/**
* Returns the current options for the reader.
*
* @return array
*/
public function getOptions()
{
return array( 'useComments' => $this->useComments );
}
/**
* Returns the current configuration object.
*
* Returns false if there no current configuration.
*
* @return ezcConfiguration
*/
public function getConfig()
{
return $this->config;
}
/**
* Returns the current location string.
*
* @return string
*/
public function getLocation()
{
return $this->location;
}
/**
* Returns the current name for the configuration to be read.
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Parses a the path $path and sets the location and name
* properties on this object.
*
* ezcConfigurationFileWriter::parseLocationPath() has the same
* code. It is duplicated to prevent complex OO hacks.
*
* @throws ezcConfigurationException if the configuration file has the wrong suffix.
* @param string $path
* @param string $suffix
* @return void
*/
protected function parseLocationPath( $path, $suffix )
{
$this->path = $path;
$this->location = dirname( $path );
$base = basename( $path );
if ( $suffix[0] != '.' )
{
$suffix = ".$suffix";
}
if ( !preg_match( '@' . preg_quote( $suffix ) . '$@', $path ) )
{
throw new ezcConfigurationInvalidSuffixException( $path, $suffix );
}
$this->name = basename( $base, $suffix );
}
/**
* Returns the last modified timestamp.
*
* Returns false if there is not last current timestamp.
*
* @return int
*/
public function getTimestamp()
{
if ( file_exists( $this->path ) )
{
return filemtime( $this->path );
}
return false;
}
/**
* Returns true if the configuration exists.
*
* @return bool
*/
public function configExists()
{
return file_exists( $this->path );
}
}
?>