16 #include <boost/shared_ptr.hpp> 22 namespace isc {
namespace data {
106 Position(
const std::string& file,
const uint32_t line,
108 : file_(file), line_(line), pos_(pos) {
114 std::string str()
const;
147 : type_(t), position_(pos) {
155 enum types { integer, real, boolean, null, string, list, map, any };
176 std::string str()
const;
182 std::string toWire()
const;
183 void toWire(std::ostream& out)
const;
187 #define throwTypeError(error) \ 189 std::string msg_ = error; \ 190 if ((position_.file_ != "") || \ 191 (position_.line_ != 0) || \ 192 (position_.pos_ != 0)) { \ 193 msg_ += " in (" + position_.str() + ")"; \ 195 isc_throw(TypeError, msg_); \ 201 virtual bool equals(
const Element& other)
const = 0;
205 virtual void toJSON(std::ostream& ss)
const = 0;
218 {
throwTypeError(
"doubleValue() called on non-double Element"); };
222 {
throwTypeError(
"stringValue() called on non-string Element"); };
223 virtual const std::vector<ElementPtr>&
listValue()
const {
227 virtual const std::map<std::string, ConstElementPtr>&
mapValue()
const {
242 virtual bool getValue(int64_t& t)
const;
243 virtual bool getValue(
double& t)
const;
244 virtual bool getValue(
bool& t)
const;
245 virtual bool getValue(std::string& t)
const;
246 virtual bool getValue(std::vector<ElementPtr>& t)
const;
247 virtual bool getValue(std::map<std::string, ConstElementPtr>& t)
const;
260 virtual bool setValue(
const long long int v);
263 virtual bool setValue(
const double v);
264 virtual bool setValue(
const bool t);
265 virtual bool setValue(
const std::string& v);
266 virtual bool setValue(
const std::vector<ElementPtr>& v);
267 virtual bool setValue(
const std::map<std::string, ConstElementPtr>& v);
277 virtual ConstElementPtr
get(
const int i)
const;
286 virtual ElementPtr getNonConst(
const int i)
const;
292 virtual void set(
const size_t i, ElementPtr element);
296 virtual void add(ElementPtr element);
301 virtual void remove(
const int i);
304 virtual size_t size()
const;
307 virtual bool empty()
const;
316 virtual ConstElementPtr
get(
const std::string& name)
const;
324 virtual void set(
const std::string& name, ConstElementPtr element);
328 virtual void remove(
const std::string& name);
333 virtual bool contains(
const std::string& name)
const;
348 virtual ConstElementPtr find(
const std::string& identifier)
const;
354 virtual bool find(
const std::string& identifier, ConstElementPtr& t)
const;
376 static ElementPtr create(
const Position& pos = ZERO_POSITION());
377 static ElementPtr create(
const long long int i,
378 const Position& pos = ZERO_POSITION());
379 static ElementPtr create(
const int i,
380 const Position& pos = ZERO_POSITION());
381 static ElementPtr create(
const long int i,
382 const Position& pos = ZERO_POSITION());
383 static ElementPtr create(
const double d,
384 const Position& pos = ZERO_POSITION());
385 static ElementPtr create(
const bool b,
386 const Position& pos = ZERO_POSITION());
387 static ElementPtr create(
const std::string& s,
388 const Position& pos = ZERO_POSITION());
391 static ElementPtr create(
const char *s,
392 const Position& pos = ZERO_POSITION());
398 static ElementPtr createList(
const Position& pos = ZERO_POSITION());
404 static ElementPtr createMap(
const Position& pos = ZERO_POSITION());
414 static ElementPtr fromJSON(
const std::string& in,
bool preproc =
false);
431 static ElementPtr fromJSON(std::istream& in,
bool preproc =
false);
444 static ElementPtr fromJSON(std::istream& in,
const std::string& file_name,
445 bool preproc =
false);
461 static ElementPtr fromJSON(std::istream& in,
const std::string& file,
462 int& line,
int &pos);
471 static ElementPtr fromJSONFile(
const std::string& file_name,
472 bool preproc =
false);
505 static void preprocess(std::istream& in, std::stringstream& out);
514 static ElementPtr fromWire(std::stringstream& in,
int length);
530 static ElementPtr fromWire(
const std::string& s);
536 if (type_ == list || type_ == map) {
538 for (
size_t i = 0; i < s; ++i) {
542 child = getNonConst(i);
543 }
else if (type_ == map) {
544 std::string
const key(
get(i)->stringValue());
554 child = boost::const_pointer_cast<
Element>(
get(key));
558 if (child->getType() != list && child->getType() != map) {
563 if (!child->empty()){
564 child->removeEmptyContainersRecursively();
568 if (child->empty()) {
592 :
Element(integer, pos), i(v) { }
595 bool getValue(int64_t& t)
const { t = i;
return (
true); }
597 bool setValue(
long long int v) { i = v;
return (
true); }
598 void toJSON(std::ostream& ss)
const;
599 bool equals(
const Element& other)
const;
610 bool getValue(
double& t)
const { t = d;
return (
true); }
612 bool setValue(
const double v) { d = v;
return (
true); }
613 void toJSON(std::ostream& ss)
const;
614 bool equals(
const Element& other)
const;
622 :
Element(boolean, pos), b(v) {};
625 bool getValue(
bool& t)
const { t = b;
return (
true); }
627 bool setValue(
const bool v) { b = v;
return (
true); }
628 void toJSON(std::ostream& ss)
const;
629 bool equals(
const Element& other)
const;
636 void toJSON(std::ostream& ss)
const;
637 bool equals(
const Element& other)
const;
645 :
Element(string, pos), s(v) {};
648 bool getValue(std::string& t)
const { t = s;
return (
true); }
650 bool setValue(
const std::string& v) { s = v;
return (
true); }
651 void toJSON(std::ostream& ss)
const;
652 bool equals(
const Element& other)
const;
656 std::vector<ElementPtr> l;
661 const std::vector<ElementPtr>&
listValue()
const {
return (l); }
673 ConstElementPtr
get(
int i)
const {
return (l.at(i)); }
676 void set(
size_t i, ElementPtr e) {
679 void add(ElementPtr e) { l.push_back(e); };
681 void remove(
int i) { l.erase(l.begin() + i); };
682 void toJSON(std::ostream& ss)
const;
683 size_t size()
const {
return (l.size()); }
684 bool empty()
const {
return (l.empty()); }
685 bool equals(
const Element& other)
const;
696 void sort(std::string
const& index = std::string());
700 std::map<std::string, ConstElementPtr> m;
706 const std::map<std::string, ConstElementPtr>&
mapValue()
const override {
710 bool getValue(std::map<std::string, ConstElementPtr>& t)
const override {
715 bool setValue(
const std::map<std::string, ConstElementPtr>& v)
override {
720 ConstElementPtr
get(
const std::string& s)
const override {
721 auto found = m.find(s);
731 ConstElementPtr
get(
int const i)
const override {
734 return create(it->first);
738 void set(
const std::string& key, ConstElementPtr value)
override;
740 void remove(
const std::string& s)
override { m.erase(s); }
745 void remove(
int const i)
override {
751 bool contains(
const std::string& s)
const override {
752 return (m.find(s) != m.end());
754 void toJSON(std::ostream& ss)
const override;
761 ConstElementPtr find(
const std::string&
id)
const override;
767 bool find(
const std::string&
id, ConstElementPtr& t)
const override;
776 bool equals(
const Element& other)
const override;
778 bool empty()
const override {
return (m.empty()); }
784 bool isNull(ConstElementPtr p);
814 void merge(ElementPtr element, ConstElementPtr other);
826 ElementPtr
copy(ConstElementPtr from,
int level = 100);
833 bool isEquivalent(ConstElementPtr a, ConstElementPtr b);
846 void prettyPrint(ConstElementPtr element, std::ostream& out,
847 unsigned indent = 0,
unsigned step = 2);
860 unsigned indent = 0,
unsigned step = 2);
virtual std::string stringValue() const
bool getValue(double &t) const
bool operator<(Element const &a, Element const &b)
bool setValue(const int i)
uint32_t line_
Line number.
virtual void set(const size_t i, ElementPtr element)
Sets the ElementPtr at the given index.
bool empty() const
Return true if there are no elements in the list.
static const Position & ZERO_POSITION()
Returns Position object with line_ and pos_ set to 0, and with an empty file name.
const Position & getPosition() const
Returns position where the data element's value starts in a configuration string. ...
bool setValue(const std::vector< ElementPtr > &v)
A standard Data module exception that is thrown if a parse error is encountered when constructing an ...
void prettyPrint(ConstElementPtr element, std::ostream &out, unsigned indent, unsigned step)
Pretty prints the data into stream.
const std::map< std::string, ConstElementPtr > & mapValue() const override
bool operator!=(const Element &a, const Element &b)
virtual int64_t intValue() const
bool isEquivalent(ConstElementPtr a, ConstElementPtr b)
Compares the data with other using unordered lists.
bool setValue(long long int v)
virtual bool getValue(int64_t &t) const
boost::shared_ptr< Element > ElementPtr
ListElement(const Position &pos=ZERO_POSITION())
#define throwTypeError(error)
Add the position to a TypeError message should be used in place of isc_throw(TypeError, error)
void removeIdentical(ElementPtr a, ConstElementPtr b)
Remove all values from the first ElementPtr that are equal in the second.
StringElement(std::string v, const Position &pos=ZERO_POSITION())
bool isNull(ConstElementPtr p)
Checks whether the given ElementPtr is a NULL pointer.
double doubleValue() const
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
bool getValue(std::map< std::string, ConstElementPtr > &t) const override
Position()
Default constructor.
Position(const std::string &file, const uint32_t line, const uint32_t pos)
Constructor.
bool operator==(const Element &a, const Element &b)
bool getValue(bool &t) const
bool setValue(const std::map< std::string, ConstElementPtr > &v) override
ElementPtr copy(ConstElementPtr from, int level)
Copy the data up to a nesting level.
std::ostream & operator<<(std::ostream &out, const Element::Position &pos)
Insert Element::Position as a string into stream.
size_t size() const override
Returns number of stored elements.
bool setValue(const bool v)
virtual const std::map< std::string, ConstElementPtr > & mapValue() const
Notes: IntElement type is changed to int64_t.
TypeError(const char *file, size_t line, const char *what)
IntElement(int64_t v, const Position &pos=ZERO_POSITION())
boost::shared_ptr< const Element > ConstElementPtr
virtual const std::vector< ElementPtr > & listValue() const
bool getValue(int64_t &t) const
void removeEmptyContainersRecursively()
Remove all empty maps and lists from this Element and its descendants.
NullElement(const Position &pos=ZERO_POSITION())
A standard Data module exception that is thrown if a function is called for an Element that has a wro...
DoubleElement(double v, const Position &pos=ZERO_POSITION())
MapElement(const Position &pos=ZERO_POSITION())
Represents the position of the data element within a configuration string.
This is a base class for exceptions thrown from the DNS library module.
Defines the logger used by the top-level component of kea-lfc.
uint32_t pos_
Position within the line.
bool contains(const std::string &s) const override
Checks if there is data at the given key.
void merge(ElementPtr element, ConstElementPtr other)
Merges the data from other into element.
bool setValue(const long int i)
virtual double doubleValue() const
bool getValue(std::string &t) const
virtual ConstElementPtr get(const int i) const
Returns the ElementPtr at the given index.
The Element class represents a piece of data, used by the command channel and configuration parts...
bool empty() const override
Return true if there are no elements in the list.
bool setValue(const std::string &v)
ElementPtr getNonConst(int i) const
returns element as non-const pointer
bool getValue(std::vector< ElementPtr > &t) const
virtual bool setValue(const long long int v)
bool setValue(const double v)
BoolElement(const bool v, const Position &pos=ZERO_POSITION())
size_t size() const
Returns the number of elements in the list.
virtual void remove(const int i)
Removes the element at the given position.
std::string file_
File name.
void add(ElementPtr e)
Adds an ElementPtr to the list.
virtual bool boolValue() const
JSONError(const char *file, size_t line, const char *what)
Element(int t, const Position &pos=ZERO_POSITION())
Constructor.
const std::vector< ElementPtr > & listValue() const
std::string stringValue() const