/*
 * ConfigDataElement.h
 *
 *  Created on: Jan 9, 2012
 *      Author: godin
 */

#ifndef CONFIGDATAELEMENT_H_
#define CONFIGDATAELEMENT_H_

#include "SimpleDataElement.h"
#include "utils/FlexArray.h"

class ConfigDataElement: public SimpleDataElement
{
public:

    ConfigDataElement( const ConfigURI& name,
                       DataValue* initialValue );

    virtual ~ConfigDataElement();

    void setConfigValue( DataValue* setFromValue );

    void applyConfigValue( const Timestamp& ifWrittenBefore );

    /// Override this to clear flag: isConfigValue_
    virtual void setTimestamp( const Timestamp& timestamp );

    virtual bool requiresRestart() const
    {
        return requiresRestart_;
    }

    virtual void setRequiresRestart( bool requiresRestart )
    {
        requiresRestart_ = requiresRestart;
    }

    virtual bool isSecure( void ) const
    {
        return secure_;
    }

    virtual void setSecure( bool secure )
    {
        secure_ = secure;
    }

    virtual bool isActive() const
    {
        return true;
    }

    virtual bool isFailed( void ) const
    {
        return false;
    }

    virtual bool isOrphaned( void ) const
    {
        return false;
    }

    static void ApplyConfigValues( const Timestamp& ifWrittenBefore );

    static unsigned int GetConfigDataElementCount()
    {
        return ConfigDataElements_.size();
    }

    static ConfigDataElement* GetConfigDataElement( unsigned int index );

protected:

    DataValue* configValue_;
    bool isConfigValue_;
    bool requiresRestart_;
    bool secure_;

    static Mutex ListMutex_;
    static FlexArray<ConfigDataElement*> ConfigDataElements_;

private:
    // Note that the copy constructor below is private and not given a body.
    // Any attempt to call it will return a compiler error.
    ConfigDataElement( const ConfigDataElement& old ); // disallow copy constructor
};

#endif /* CONFIGDATAELEMENT_H_ */
