Fledge
An open source edge computing platform for industrial users
config_category.h
1 #ifndef _CONFIG_CATEGORY_H
2 #define _CONFIG_CATEGORY_H
3 
4 /*
5  * Fledge category management
6  *
7  * Copyright (c) 2017-2018 OSisoft, LLC
8  *
9  * Released under the Apache 2.0 Licence
10  *
11  * Author: Mark Riddoch, Massimiliano Pinto
12  */
13 
14 #include <string>
15 #include <vector>
16 #include <map>
17 #include <rapidjson/document.h>
18 #include <json_utils.h>
19 
21  public:
22  ConfigCategoryDescription(const std::string& name, const std::string& description) :
23  m_name(name), m_displayName(name), m_description(description) {};
24  ConfigCategoryDescription(const std::string& name, const std::string& displayName, const std::string& description) :
25  m_name(name), m_displayName(displayName), m_description(description) {};
26  std::string getName() const { return m_name; };
27  std::string getDisplayName() const { return m_displayName; };
28  std::string getDescription() const { return m_description; };
29  // JSON string with m_name and m_description
30  std::string toJSON() const;
31  private:
32  const std::string m_name;
33  const std::string m_displayName;
34  const std::string m_description;
35 };
36 
38  public:
39  ConfigCategories(const std::string& json);
40  ConfigCategories(); // Constructor without parameters
42  unsigned int length() { return m_categories.size(); };
43  ConfigCategoryDescription *operator[] (const unsigned int idx) {
44  return m_categories[idx];
45  };
46  // Add one category name with description
48  // JSON string of all categories
49  std::string toJSON() const;
50 
51  private:
52  std::vector<ConfigCategoryDescription *> m_categories;
53 
54 };
55 
57  public:
58  enum ItemType {
59  UnknownType,
60  StringItem,
61  EnumerationItem,
62  JsonItem,
63  BoolItem,
64  NumberItem,
65  DoubleItem,
66  ScriptItem,
67  CategoryType,
68  CodeItem,
69  BucketItem,
70  ListItem,
71  KVListItem
72  };
73 
74  ConfigCategory(const std::string& name, const std::string& json);
75  ConfigCategory() {};
76  ConfigCategory(const ConfigCategory& orig);
77  ConfigCategory(const ConfigCategory *orig);
79  void addItem(const std::string& name, const std::string description,
80  const std::string& type, const std::string def,
81  const std::string& value);
82  void addItem(const std::string& name, const std::string description,
83  const std::string def, const std::string& value,
84  const std::vector<std::string> options);
85  void removeItems();
86  void removeItemsType(ItemType type);
87  void keepItemsType(ItemType type);
88  bool extractSubcategory(ConfigCategory &subCategories);
89  void setDescription(const std::string& description);
90  std::string getName() const { return m_name; };
91  std::string getDescription() const { return m_description; };
92 
93  std::string getDisplayName() const { return m_displayName; };
94  void setDisplayName(const std::string& displayName) {m_displayName = displayName;};
95 
96  unsigned int getCount() const { return m_items.size(); };
97  bool itemExists(const std::string& name) const;
98  bool setItemDisplayName(const std::string& name, const std::string& displayName);
99  std::string getValue(const std::string& name) const;
100  std::string getValue(const std::string& name, const std::string& defaultValue) const;
101  bool getBoolValue(const std::string& name, bool defaultValue = false) const;
102  int getIntegerValue(const std::string& name, int defaultValue = 0) const;
103  long getLongValue(const std::string& name, long defaultValue = 0) const;
104  double getDoubleValue(const std::string& name, double defaultValue = 0) const;
105  std::vector<std::string> getValueList(const std::string& name) const;
106  std::map<std::string, std::string> getValueKVList(const std::string& name) const;
107  std::string getType(const std::string& name) const;
108  std::string getDescription(const std::string& name) const;
109  std::string getDefault(const std::string& name) const;
110  bool setDefault(const std::string& name, const std::string& value);
111  bool setValue(const std::string& name, const std::string& value);
112  std::string getDisplayName(const std::string& name) const;
113  std::string getmParentName() const {return (m_parent_name);};
114  std::vector<std::string> getOptions(const std::string& name) const;
115  std::string getLength(const std::string& name) const;
116  std::string getMinimum(const std::string& name) const;
117  std::string getMaximum(const std::string& name) const;
118  bool isString(const std::string& name) const;
119  bool isEnumeration(const std::string& name) const;
120  bool isJSON(const std::string& name) const;
121  bool isBool(const std::string& name) const;
122  bool isNumber(const std::string& name) const;
123  bool isDouble(const std::string& name) const;
124  bool isList(const std::string& name) const;
125  bool isKVList(const std::string& name) const;
126  bool isDeprecated(const std::string& name) const;
127  std::string toJSON(const bool full=false) const;
128  std::string itemsToJSON(const bool full=false) const;
132  void checkDefaultValuesOnly() const;
133  std::string itemToJSON(const std::string& itemName) const;
134  std::string to_string(const rapidjson::Value& v) const;
135  std::vector<std::string> getPermissions(const std::string& name) const;
136  bool hasPermission(const std::string& name, const std::string& username) const;
137  enum ItemAttribute {
138  ORDER_ATTR,
139  READONLY_ATTR,
140  MANDATORY_ATTR,
141  FILE_ATTR,
142  MINIMUM_ATTR,
143  MAXIMUM_ATTR,
144  LENGTH_ATTR,
145  VALIDITY_ATTR,
146  GROUP_ATTR,
147  DISPLAY_NAME_ATTR,
148  DEPRECATED_ATTR,
149  RULE_ATTR,
150  BUCKET_PROPERTIES_ATTR,
151  LIST_SIZE_ATTR,
152  ITEM_TYPE_ATTR,
153  LIST_NAME_ATTR,
154  KVLIST_KEY_NAME_ATTR,
155  KVLIST_KEY_DESCRIPTION_ATTR,
156  JSON_SCHEMA_ATTR
157  };
158  std::string getItemAttribute(const std::string& itemName,
159  ItemAttribute itemAttribute) const;
160 
161  bool setItemAttribute(const std::string& itemName,
162  ItemAttribute itemAttribute, const std::string& value);
163 
164  std::vector<std::pair<std::string,std::string>>* parseBucketItemValue(const std::string &);
165 
166  protected:
167  class CategoryItem {
168  public:
169  CategoryItem(const std::string& name, const rapidjson::Value& item);
170  CategoryItem(const std::string& name, const std::string& description,
171  const std::string& type, const std::string def,
172  const std::string& value);
173  CategoryItem(const std::string& name, const std::string& description,
174  const std::string def, const std::string& value,
175  const std::vector<std::string> options);
176  CategoryItem(const CategoryItem& rhs);
177  // Return both "value" and "default" items
178  std::string toJSON(const bool full=false) const;
179  // Return only "default" items
180  std::string defaultToJSON() const;
181 
182  public:
183  std::string m_name;
184  std::string m_displayName;
185  std::string m_type;
186  std::string m_default;
187  std::string m_value;
188  std::string m_description;
189  std::string m_order;
190  std::string m_readonly;
191  std::string m_mandatory;
192  std::string m_deprecated;
193  std::string m_length;
194  std::string m_minimum;
195  std::string m_maximum;
196  std::string m_filename;
197  std::vector<std::string>
198  m_options;
199  std::string m_file;
200  ItemType m_itemType;
201  std::string m_validity;
202  std::string m_group;
203  std::string m_rule;
204  std::string m_bucketProperties;
205  std::string m_listSize;
206  std::string m_listItemType;
207  std::string m_listName;
208  std::string m_kvlistKeyName;
209  std::string m_kvlistKeyDescription;
210  std::vector<std::string>
211  m_permissions;
212  std::string m_jsonSchema;
213  };
214  std::vector<CategoryItem *> m_items;
215  std::string m_name;
216  std::string m_parent_name;
217  std::string m_description;
218  std::string m_displayName;
219 
220  public:
221  using iterator = std::vector<CategoryItem *>::iterator;
222  using const_iterator = std::vector<CategoryItem *>::const_iterator;
223 
224  const_iterator begin() const { return m_items.begin(); }
225  const_iterator end() const { return m_items.end(); }
226  const_iterator cbegin() const { return m_items.cbegin(); }
227  const_iterator cend() const { return m_items.cend(); }
228 
229 };
230 
242 {
243  public:
244  DefaultConfigCategory(const std::string& name, const std::string& json);
246  {
247  };
249  std::string toJSON() const;
250  std::string itemsToJSON() const;
251 };
252 
254 {
255  public:
256  ConfigCategoryChange(const std::string& json);
257 };
258 
259 class ConfigItemNotFound : public std::exception {
260  public:
261  virtual const char *what() const throw()
262  {
263  return "Configuration item not found in configuration category";
264  }
265 };
266 
267 class ConfigMalformed : public std::exception {
268  public:
269  virtual const char *what() const throw()
270  {
271  return "Configuration category JSON is malformed";
272  }
273 };
274 
279 class ConfigValueFoundWithDefault : public std::exception {
280  public:
281  // Constructor with parameter
282  ConfigValueFoundWithDefault(const std::string& item)
283  {
284  m_errmsg = "Configuration item '";
285  m_errmsg.append(item);
286  m_errmsg += "' has both 'value' and 'default' fields.";
287  };
288 
289  virtual const char *what() const throw()
290  {
291  return m_errmsg.c_str();
292  }
293  private:
294  std::string m_errmsg;
295 };
296 
302 class ConfigItemAttributeNotFound : public std::exception {
303  public:
304  virtual const char *what() const throw()
305  {
306  return "Configuration item attribute not found in configuration category";
307  }
308 };
309 
314 class ConfigItemNotAList : public std::exception {
315  public:
316  virtual const char *what() const throw()
317  {
318  return "Configuration item is not a list type item";
319  }
320 };
321 #endif
DefaultConfigCategory
DefaultConfigCategory.
Definition: config_category.h:241
ConfigItemNotAList
An attempt has been made to access a configuration item as a list when the item is not of type list.
Definition: config_category.h:314
DefaultConfigCategory::~DefaultConfigCategory
~DefaultConfigCategory()
Destructor for the default configuration category.
Definition: config_category.cpp:2244
ConfigCategory::isString
bool isString(const std::string &name) const
Return if the configuration item is a string item.
Definition: config_category.cpp:1098
ConfigCategory::checkDefaultValuesOnly
void checkDefaultValuesOnly() const
Check whether at least one item in the category object has both 'value' and 'default' set.
Definition: config_category.cpp:270
ConfigCategory::itemExists
bool itemExists(const std::string &name) const
Check for the existence of an item within the configuration category.
Definition: config_category.cpp:430
ConfigCategory::parseBucketItemValue
std::vector< std::pair< std::string, std::string > > * parseBucketItemValue(const std::string &)
Parse BucketItem value in JSON dict format and return the key value pairs within that.
Definition: config_category.cpp:2215
ConfigCategory::operator+=
ConfigCategory & operator+=(ConfigCategory const &rhs)
Operator+= for ConfigCategory.
Definition: config_category.cpp:241
ConfigCategory::removeItemsType
void removeItemsType(ItemType type)
Delete all the items from the configuration category having a specific type.
Definition: config_category.cpp:326
ConfigCategory::setDefault
bool setDefault(const std::string &name, const std::string &value)
Update the default value of the configuration category item.
Definition: config_category.cpp:916
ConfigCategory::setItemAttribute
bool setItemAttribute(const std::string &itemName, ItemAttribute itemAttribute, const std::string &value)
Set the requested attribute of a configuration category item.
Definition: config_category.cpp:777
ConfigCategories
Definition: config_category.h:37
ConfigCategory::setValue
bool setValue(const std::string &name, const std::string &value)
Update the value of the configuration category item.
Definition: config_category.cpp:936
ConfigCategory::getDefault
std::string getDefault(const std::string &name) const
Return the default value of the configuration category item.
Definition: config_category.cpp:897
ConfigCategory::setDescription
void setDescription(const std::string &description)
Set the description for the configuration category.
Definition: config_category.cpp:1267
ConfigCategory::isJSON
bool isJSON(const std::string &name) const
Return if the configuration item is a JSON item.
Definition: config_category.cpp:1136
ConfigValueFoundWithDefault
This exception must be raised when at least one of the JSON items of a new being created category hav...
Definition: config_category.h:279
ConfigCategory::itemToJSON
std::string itemToJSON(const std::string &itemName) const
Return JSON string of a category item.
Definition: config_category.cpp:2294
ConfigCategory::getIntegerValue
int getIntegerValue(const std::string &name, int defaultValue=0) const
Return an integer value from a configuration category item.
Definition: config_category.cpp:512
ConfigCategory::isBool
bool isBool(const std::string &name) const
Return if the configuration item is a Bool item.
Definition: config_category.cpp:1155
ConfigCategories::ConfigCategories
ConfigCategories()
ConfigCategories constructor without parameters.
Definition: config_category.cpp:35
ConfigCategory::getValueList
std::vector< std::string > getValueList(const std::string &name) const
Return the value of the configuration category item list, this is a convience function used when simp...
Definition: config_category.cpp:608
ConfigCategory::getLongValue
long getLongValue(const std::string &name, long defaultValue=0) const
Return a long value from a configuration category item.
Definition: config_category.cpp:542
ConfigCategory::removeItems
void removeItems()
Delete all the items from the configuration category.
Definition: config_category.cpp:346
ConfigCategory::hasPermission
bool hasPermission(const std::string &name, const std::string &username) const
Return true if the user has permission to update the named item.
Definition: config_category.cpp:1074
ConfigCategory::keepItemsType
void keepItemsType(ItemType type)
Delete all the items from the configuration category not having a specific type.
Definition: config_category.cpp:360
ConfigMalformed
Definition: config_category.h:267
ConfigCategory::isDouble
bool isDouble(const std::string &name) const
Return if the configuration item is a Double item.
Definition: config_category.cpp:1193
ConfigCategory::getBoolValue
bool getBoolValue(const std::string &name, bool defaultValue=false) const
Return a boolean value from a configuration category item.
Definition: config_category.cpp:489
ConfigCategory::isEnumeration
bool isEnumeration(const std::string &name) const
Return if the configuration item is an enumeration item.
Definition: config_category.cpp:1117
ConfigCategory::getItemAttribute
std::string getItemAttribute(const std::string &itemName, ItemAttribute itemAttribute) const
Return the requested attribute of a configuration category item.
Definition: config_category.cpp:717
ConfigCategory::setItemsValueFromDefault
void setItemsValueFromDefault()
Set the m_value from m_default for each item.
Definition: config_category.cpp:256
ConfigItemNotFound
Definition: config_category.h:259
ConfigCategories::toJSON
std::string toJSON() const
Return the JSON string of all ConfigCategoryDescription elements in m_categories.
Definition: config_category.cpp:115
ConfigCategory
Definition: config_category.h:56
ConfigCategoryDescription::toJSON
std::string toJSON() const
Return the JSON string of a ConfigCategoryDescription element.
Definition: config_category.cpp:101
ConfigCategoryChange
Definition: config_category.h:253
ConfigCategory::setItemDisplayName
bool setItemDisplayName(const std::string &name, const std::string &displayName)
Set the display name of an item.
Definition: config_category.cpp:308
ConfigCategory::itemsToJSON
std::string itemsToJSON(const bool full=false) const
Return JSON string of category items only.
Definition: config_category.cpp:1297
ConfigCategory::isDeprecated
bool isDeprecated(const std::string &name) const
Return if the configuration item is deprecated a item.
Definition: config_category.cpp:1212
ConfigItemAttributeNotFound
This exception must be raised when a requested item attribute does not exist.
Definition: config_category.h:302
ConfigCategory::getType
std::string getType(const std::string &name) const
Return the type of the configuration category item.
Definition: config_category.cpp:859
DefaultConfigCategory::toJSON
std::string toJSON() const
Return JSON string of all category components of a DefaultConfigCategory class.
Definition: config_category.cpp:2253
ConfigCategory::~ConfigCategory
~ConfigCategory()
Configuration category destructor.
Definition: config_category.cpp:210
ConfigCategory::getLength
std::string getLength(const std::string &name) const
Return the length value of the configuration category item.
Definition: config_category.cpp:976
ConfigCategory::to_string
std::string to_string(const rapidjson::Value &v) const
Convert a RapidJSON value to a string.
Definition: config_category.cpp:692
ConfigCategory::CategoryItem::toJSON
std::string toJSON(const bool full=false) const
Create a JSON representation of the configuration item.
Definition: config_category.cpp:1915
ConfigCategoryChange::ConfigCategoryChange
ConfigCategoryChange(const std::string &json)
Configuration Category constructor.
Definition: config_category.cpp:2317
ConfigCategory::toJSON
std::string toJSON(const bool full=false) const
Return JSON string of all category components.
Definition: config_category.cpp:1278
ConfigCategory::getValueKVList
std::map< std::string, std::string > getValueKVList(const std::string &name) const
Return the value of the configuration category item kvlist, this is a convience function used when ke...
Definition: config_category.cpp:656
ConfigCategories::~ConfigCategories
~ConfigCategories()
ConfigCategories destructor.
Definition: config_category.cpp:80
ConfigCategory::isList
bool isList(const std::string &name) const
Return if the configuration item is a list item.
Definition: config_category.cpp:1231
ConfigCategory::getPermissions
std::vector< std::string > getPermissions(const std::string &name) const
Return the permissions of the configuration category item.
Definition: config_category.cpp:1054
ConfigCategories::addCategoryDescription
void addCategoryDescription(ConfigCategoryDescription *elem)
Add a ConfigCategoryDescription element.
Definition: config_category.cpp:93
ConfigCategory::isKVList
bool isKVList(const std::string &name) const
Return if the configuration item is a kvlist item.
Definition: config_category.cpp:1250
ConfigCategory::addItem
void addItem(const std::string &name, const std::string description, const std::string &type, const std::string def, const std::string &value)
Add an item to a configuration category.
Definition: config_category.cpp:284
ConfigCategory::getDoubleValue
double getDoubleValue(const std::string &name, double defaultValue=0) const
Return a double value from a configuration category item.
Definition: config_category.cpp:572
ConfigCategory::extractSubcategory
bool extractSubcategory(ConfigCategory &subCategories)
Extracts, process and adds subcategory information from a given category to the current instance.
Definition: config_category.cpp:382
ConfigCategory::getOptions
std::vector< std::string > getOptions(const std::string &name) const
Return the options of the configuration category item.
Definition: config_category.cpp:1035
ConfigCategory::getMinimum
std::string getMinimum(const std::string &name) const
Return the minimum value of the configuration category item.
Definition: config_category.cpp:995
ConfigCategory::getMaximum
std::string getMaximum(const std::string &name) const
Return the maximum of the configuration category item.
Definition: config_category.cpp:1014
ConfigCategory::CategoryItem::defaultToJSON
std::string defaultToJSON() const
Return only "default" item values.
Definition: config_category.cpp:2064
ConfigCategory::isNumber
bool isNumber(const std::string &name) const
Return if the configuration item is a Numeric item.
Definition: config_category.cpp:1174
ConfigCategoryDescription
Definition: config_category.h:20
DefaultConfigCategory::itemsToJSON
std::string itemsToJSON() const
Return DefaultConfigCategory "default" items only.
Definition: config_category.cpp:2270
ConfigCategory::CategoryItem
Definition: config_category.h:167
ConfigCategory::operator=
ConfigCategory & operator=(ConfigCategory const &rhs)
Operator= for ConfigCategory.
Definition: config_category.cpp:221