<?php
/**
 * File containing the ezcConfigurationReader 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
 */

/**
 * This class provides the interface for readers of configuration objects of
 * type ezcConfiguration.
 *
 * The reader will unserialize the data from a given format e.g. from an INI
 * file or a given XML format which can later be written by a
 * ezcConfigurationWriter.
 *
 * The reader is meant to be initialized with setLocation() and setConfig() and
 * then a call to save(). It is also possible to initialize everything with the
 * init() function.
 *
 * <code>
 * $reader = new ezcConfigurationIniReader();
 * $reader->init( 'site', 'settings' );
 * $conf = $reader->load();
 * </code>
 *
 * Most readers allows even quicker initialization with the constructor. For
 * instance the INI reader allows you to specify the full path to the INI file.
 *
 * <code>
 * $reader = new ezcConfigurationIniReader( 'settings/site.ini' );
 * $conf = $reader->load();
 * </code>
 *
 * @package Configuration
 * @version //autogen//
 */
abstract class ezcConfigurationReader
{
    /**
     * Returns the suffix used in the storage filename.
     *
     * @return string
     */
    abstract protected function 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
     */
    abstract public function init( $location, $name, array $options = array() );

    /**
     * Loads the current config object.
     *
     * The configuration can stored later with a ezcConfigurationWriter.
     *
     * @see config()
     *
     * @throws ezcConfigurationNoConfigException if there is no config
     *         object to be read from the location.
     * @throws ezcConfigurationInvalidSuffixException if the current
     *         location values cannot be used for reading.
     * @throws ezcConfigurationReadFailedException if the configuration
     *         could not be read from the given location.
     * @return ezcConfiguration
     */
    abstract public function load();

    /**
     * Returns the current configuration object.
     *
     * Returns the current configuration object if one is set, false otherwise.
     * The object will be set each time load() is called.
     *
     * @return ezcConfiguration
     */
    abstract public function getConfig();

    /**
     * Checks if the configuration exists.
     *
     * Returns true if a configuration exists at the location specified in the
     * constructor.
     *
     * @return bool
     */
    abstract public function configExists();

    /**
     * Returns the last modified timestamp.
     *
     * Returns false if the configuration does not exist.
     *
     * @return mixed
     */
    abstract public function getTimestamp();

    /**
     * Returns the current location string.
     *
     * @return string
     */
    abstract public function getLocation();

    /**
     * Returns the name of the configuration to be read.
     *
     * @return string
     */
    abstract public function getName();

    /**
     * Returns the options for the reader.
     *
     * @return array
     */
    abstract public function getOptions();

    /**
     * Sets the options $options for the reader.
     *
     * The options will be used the next time the save() method is called.
     *
     * @param array $options An associative array of options for the reader.
     *              Which options to use is determined by the specific reader
     *              class.
     * @return void
     */
    abstract public function setOptions( $options );

    /**
     * Validates the configuration.
     *
     * Validates the configuration at the given location and returns the
     * validation result.
     *
     * If $strict is set it will not validate the file if it contains any
     * errors or warnings. If false it will allow warnings but not errors.
     *
     * @param bool $strict
     * @return ezcConfigurationValidationResult
     */
    abstract public function validate( $strict = false );
}
?>
