Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
PropertyManagerOwner.cpp 8.61 KiB
//----------------------------------------------------------------------
// Includes
//----------------------------------------------------------------------
#include "MantidKernel/Logger.h"
#include "MantidKernel/Property.h"
#include "MantidKernel/PropertyManagerOwner.h"
#include "MantidKernel/PropertyManager.h"
#include <json/json.h>
#include <algorithm>

namespace Mantid {
namespace Kernel {
namespace {
// Get a reference to the logger
Logger g_log("PropertyManagerOwner");
}

/// Default constructor
PropertyManagerOwner::PropertyManagerOwner()
    : m_properties(new PropertyManager) {}

/// Copy constructor
PropertyManagerOwner::PropertyManagerOwner(const PropertyManagerOwner &po) {
  m_properties = po.m_properties;
}

/// Assignment operator
PropertyManagerOwner &PropertyManagerOwner::
operator=(const PropertyManagerOwner &po) {
  m_properties = po.m_properties;
  return *this;
}

/** Add a property to the list of managed properties
*  @param p :: The property object to add
*  @param doc :: A description of the property that may be displayed to users
*  @throw Exception::ExistsError if a property with the given name already
* exists
*  @throw std::invalid_argument  if the property declared has an empty name.
*/
void PropertyManagerOwner::declareProperty(std::unique_ptr<Property> p,
                                           const std::string &doc) {
  m_properties->declareProperty(std::move(p), doc);
}

/** Set the ordered list of properties by one string of values, separated by
 *semicolons.
 *
 * The string should be a json formatted collection of name value pairs
 *
 *  @param propertiesJson :: The string of property values
 *  @param ignoreProperties :: A set of names of any properties NOT to set
 *      from the propertiesArray
 *  @throw invalid_argument if error in parameters
 */
void PropertyManagerOwner::setProperties(
    const std::string &propertiesJson,
    const std::unordered_set<std::string> &ignoreProperties) {
  m_properties->setProperties(propertiesJson, this, ignoreProperties);
}

/** Sets all the declared properties from a json object
  @param jsonValue :: A json name value pair collection
  @param ignoreProperties :: A set of names of any properties NOT to set
  from the propertiesArray
  */
void PropertyManagerOwner::setProperties(
    const ::Json::Value &jsonValue,
    const std::unordered_set<std::string> &ignoreProperties) {
  m_properties->setProperties(jsonValue, this, ignoreProperties);
}

/** Sets all the declared properties from a string.
  @param propertiesString :: A list of name = value pairs separated by a
    semicolon
  @param ignoreProperties :: A set of names of any properties NOT to set
  from the propertiesArray
*/
void PropertyManagerOwner::setPropertiesWithString(
    const std::string &propertiesString,
    const std::unordered_set<std::string> &ignoreProperties) {
  m_properties->setPropertiesWithString(propertiesString, ignoreProperties);
}

/** Set the value of a property by string
*  N.B. bool properties must be set using 1/0 rather than true/false
*  @param name :: The name of the property (case insensitive)
*  @param value :: The value to assign to the property
*  @throw Exception::NotFoundError if the named property is unknown
*  @throw std::invalid_argument If the value is not valid for the property given
*/
void PropertyManagerOwner::setPropertyValue(const std::string &name,
                                            const std::string &value) {
  m_properties->setPropertyValue(name, value);
  this->afterPropertySet(name);
}

/** Set the value of a property by an index
*  N.B. bool properties must be set using 1/0 rather than true/false
*  @param index :: The index of the property to assign
*  @param value :: The value to assign to the property
*  @throw std::runtime_error if the property index is too high
*/
void PropertyManagerOwner::setPropertyOrdinal(const int &index,
                                              const std::string &value) {
  m_properties->setPropertyOrdinal(index, value);
  this->afterPropertySet(
      m_properties->getPointerToPropertyOrdinal(index)->name());
}

/** Checks whether the named property is already in the list of managed
* property.
*  @param name :: The name of the property (case insensitive)
*  @return True if the property is already stored
*/
bool PropertyManagerOwner::existsProperty(const std::string &name) const {
  return m_properties->existsProperty(name);
}

/** Validates all the properties in the collection
*  @return True if all properties have a valid value
*/
bool PropertyManagerOwner::validateProperties() const {
  return m_properties->validateProperties();
}

/**
 * Count the number of properties under management
 * @returns The number of properties being managed
 */
size_t PropertyManagerOwner::propertyCount() const {
  return m_properties->propertyCount();
}

/** Get the value of a property as a string
*  @param name :: The name of the property (case insensitive)
*  @return The value of the named property
*  @throw Exception::NotFoundError if the named property is unknown
*/
std::string
PropertyManagerOwner::getPropertyValue(const std::string &name) const {
  return m_properties->getPropertyValue(name);
}

/** Get a property by name
*  @param name :: The name of the property (case insensitive)
*  @return A pointer to the named property
*  @throw Exception::NotFoundError if the named property is unknown
*/
Property *
PropertyManagerOwner::getPointerToProperty(const std::string &name) const {
  return m_properties->getPointerToProperty(name);
}

/** Get a property by an index
*  @param index :: The name of the property (case insensitive)
*  @return A pointer to the named property
*  @throw std::runtime_error if the property index is too high
*/
Property *
PropertyManagerOwner::getPointerToPropertyOrdinal(const int &index) const {
  return m_properties->getPointerToPropertyOrdinal(index);
}

/** Get the list of managed properties.
*  The properties will be stored in the order that they were declared.
*  @return A vector holding pointers to the list of properties
*/
const std::vector<Property *> &PropertyManagerOwner::getProperties() const {
  return m_properties->getProperties();
}

/** Get the value of a property. Allows you to assign directly to a variable of
*the property's type
*  (if a supported type).
*
*  *** This method does NOT work for assigning to an existing std::string.
*      In this case you have to use getPropertyValue() instead.
*      Note that you can, though, construct a local string variable by writing,
*      e.g. std::string s = getProperty("myProperty"). ***
*
*  @param name :: The name of the property
*  @return The value of the property. Will be cast to the desired type (if a
*supported type).
*  @throw std::runtime_error If an attempt is made to assign a property to a
*different type
*  @throw Exception::NotFoundError If the property requested does not exist
*/
IPropertyManager::TypedValue
PropertyManagerOwner::getProperty(const std::string &name) const {
  return m_properties->getProperty(name);
}

/**
 * @param name
 * @return True if the property is its default value.
 */
bool PropertyManagerOwner::isDefault(const std::string &name) const {
  return m_properties->getPointerToProperty(name)->isDefault();
}

/**
* Return the property manager serialized as a string.
* The format is propName=value,propName=value,propName=value
* @param withDefaultValues :: If true then the value of default parameters will
* be included
* @returns A stringized version of the manager
*/
std::string PropertyManagerOwner::asString(bool withDefaultValues) const {
  return m_properties->asString(withDefaultValues);
}
/**
* Return the property manager serialized as a json object.
* @param withDefaultValues :: If true then the value of default parameters will
* be included
* @returns A jsonValue of the manager
*/
::Json::Value PropertyManagerOwner::asJson(bool withDefaultValues) const {
  return m_properties->asJson(withDefaultValues);
}

/**
 * Removes the property from properties map.
 * @param name :: Name of the property to be removed.
 *  @param delproperty :: if true, delete the named property
 */
void PropertyManagerOwner::removeProperty(const std::string &name,
                                          const bool delproperty) {
  m_properties->removeProperty(name, delproperty);
}

/**
 * Clears all properties under management
 */
void PropertyManagerOwner::clear() { m_properties->clear(); }

/**
 * Override this method to perform a custom action right after a property was
 * set.
 * The argument is the property name. Default - do nothing.
 * @param name :: A property name.
 */
void PropertyManagerOwner::afterPropertySet(const std::string &name) {
  m_properties->afterPropertySet(name);
}

} // namespace Kernel
} // namespace Mantid