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
47  void addCategoryDescription(ConfigCategoryDescription* elem);
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);
78  ~ConfigCategory();
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::vector<std::string> getValueList(const std::string& name) const;
101  std::map<std::string, std::string> getValueKVList(const std::string& name) const;
102  std::string getType(const std::string& name) const;
103  std::string getDescription(const std::string& name) const;
104  std::string getDefault(const std::string& name) const;
105  bool setDefault(const std::string& name, const std::string& value);
106  bool setValue(const std::string& name, const std::string& value);
107  std::string getDisplayName(const std::string& name) const;
108  std::string getmParentName() const {return (m_parent_name);};
109  std::vector<std::string> getOptions(const std::string& name) const;
110  std::string getLength(const std::string& name) const;
111  std::string getMinimum(const std::string& name) const;
112  std::string getMaximum(const std::string& name) const;
113  bool isString(const std::string& name) const;
114  bool isEnumeration(const std::string& name) const;
115  bool isJSON(const std::string& name) const;
116  bool isBool(const std::string& name) const;
117  bool isNumber(const std::string& name) const;
118  bool isDouble(const std::string& name) const;
119  bool isList(const std::string& name) const;
120  bool isKVList(const std::string& name) const;
121  bool isDeprecated(const std::string& name) const;
122  std::string toJSON(const bool full=false) const;
123  std::string itemsToJSON(const bool full=false) const;
124  ConfigCategory& operator=(ConfigCategory const& rhs);
125  ConfigCategory& operator+=(ConfigCategory const& rhs);
126  void setItemsValueFromDefault();
127  void checkDefaultValuesOnly() const;
128  std::string itemToJSON(const std::string& itemName) const;
129  std::string to_string(const rapidjson::Value& v) const;
130  std::vector<std::string> getPermissions(const std::string& name) const;
131  bool hasPermission(const std::string& name, const std::string& username) const;
132  enum ItemAttribute {
133  ORDER_ATTR,
134  READONLY_ATTR,
135  MANDATORY_ATTR,
136  FILE_ATTR,
137  MINIMUM_ATTR,
138  MAXIMUM_ATTR,
139  LENGTH_ATTR,
140  VALIDITY_ATTR,
141  GROUP_ATTR,
142  DISPLAY_NAME_ATTR,
143  DEPRECATED_ATTR,
144  RULE_ATTR,
145  BUCKET_PROPERTIES_ATTR,
146  LIST_SIZE_ATTR,
147  ITEM_TYPE_ATTR,
148  LIST_NAME_ATTR,
149  KVLIST_KEY_NAME_ATTR,
150  KVLIST_KEY_DESCRIPTION_ATTR,
151  JSON_SCHEMA_ATTR
152  };
153  std::string getItemAttribute(const std::string& itemName,
154  ItemAttribute itemAttribute) const;
155 
156  bool setItemAttribute(const std::string& itemName,
157  ItemAttribute itemAttribute, const std::string& value);
158 
159  std::vector<std::pair<std::string,std::string>>* parseBucketItemValue(const std::string &);
160 
161  protected:
162  class CategoryItem {
163  public:
164  CategoryItem(const std::string& name, const rapidjson::Value& item);
165  CategoryItem(const std::string& name, const std::string& description,
166  const std::string& type, const std::string def,
167  const std::string& value);
168  CategoryItem(const std::string& name, const std::string& description,
169  const std::string def, const std::string& value,
170  const std::vector<std::string> options);
171  CategoryItem(const CategoryItem& rhs);
172  // Return both "value" and "default" items
173  std::string toJSON(const bool full=false) const;
174  // Return only "default" items
175  std::string defaultToJSON() const;
176 
177  public:
178  std::string m_name;
179  std::string m_displayName;
180  std::string m_type;
181  std::string m_default;
182  std::string m_value;
183  std::string m_description;
184  std::string m_order;
185  std::string m_readonly;
186  std::string m_mandatory;
187  std::string m_deprecated;
188  std::string m_length;
189  std::string m_minimum;
190  std::string m_maximum;
191  std::string m_filename;
192  std::vector<std::string>
193  m_options;
194  std::string m_file;
195  ItemType m_itemType;
196  std::string m_validity;
197  std::string m_group;
198  std::string m_rule;
199  std::string m_bucketProperties;
200  std::string m_listSize;
201  std::string m_listItemType;
202  std::string m_listName;
203  std::string m_kvlistKeyName;
204  std::string m_kvlistKeyDescription;
205  std::vector<std::string>
206  m_permissions;
207  std::string m_jsonSchema;
208  };
209  std::vector<CategoryItem *> m_items;
210  std::string m_name;
211  std::string m_parent_name;
212  std::string m_description;
213  std::string m_displayName;
214 
215  public:
216  using iterator = std::vector<CategoryItem *>::iterator;
217  using const_iterator = std::vector<CategoryItem *>::const_iterator;
218 
219  const_iterator begin() const { return m_items.begin(); }
220  const_iterator end() const { return m_items.end(); }
221  const_iterator cbegin() const { return m_items.cbegin(); }
222  const_iterator cend() const { return m_items.cend(); }
223 
224 };
225 
237 {
238  public:
239  DefaultConfigCategory(const std::string& name, const std::string& json);
241  {
242  };
244  std::string toJSON() const;
245  std::string itemsToJSON() const;
246 };
247 
249 {
250  public:
251  ConfigCategoryChange(const std::string& json);
252 };
253 
254 class ConfigItemNotFound : public std::exception {
255  public:
256  virtual const char *what() const throw()
257  {
258  return "Configuration item not found in configuration category";
259  }
260 };
261 
262 class ConfigMalformed : public std::exception {
263  public:
264  virtual const char *what() const throw()
265  {
266  return "Configuration category JSON is malformed";
267  }
268 };
269 
274 class ConfigValueFoundWithDefault : public std::exception {
275  public:
276  // Constructor with parameter
277  ConfigValueFoundWithDefault(const std::string& item)
278  {
279  m_errmsg = "Configuration item '";
280  m_errmsg.append(item);
281  m_errmsg += "' has both 'value' and 'default' fields.";
282  };
283 
284  virtual const char *what() const throw()
285  {
286  return m_errmsg.c_str();
287  }
288  private:
289  std::string m_errmsg;
290 };
291 
297 class ConfigItemAttributeNotFound : public std::exception {
298  public:
299  virtual const char *what() const throw()
300  {
301  return "Configuration item attribute not found in configuration category";
302  }
303 };
304 
309 class ConfigItemNotAList : public std::exception {
310  public:
311  virtual const char *what() const throw()
312  {
313  return "Configuration item is not a list type item";
314  }
315 };
316 #endif
Definition: config_category.h:248
DefaultConfigCategory.
Definition: config_category.h:236
Definition: config_category.h:56
Definition: config_category.h:37
Definition: config_category.h:262
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:309
This exception must be raised when at least one of the JSON items of a new being created category hav...
Definition: config_category.h:274
Definition: config_category.h:162
Definition: config_category.h:20
Definition: config_category.h:254
std::string toJSON() const
Return the JSON string of a ConfigCategoryDescription element.
Definition: config_category.cpp:101
This exception must be raised when a requested item attribute does not exist.
Definition: config_category.h:297