Line data Source code
1 : /* 2 : * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved. 3 : */ 4 : 5 : #include "ifmap_node.h" 6 : 7 : #include <iostream> 8 : 9 : #include <pugixml/pugixml.hpp> 10 : 11 : #include "ifmap/ifmap_table.h" 12 : 13 : using namespace std; 14 : using pugi::xml_node; 15 : 16 : 17 1055394 : IFMapNode::IFMapNode(IFMapTable *table) 18 1055394 : : table_(table) { 19 1055394 : } 20 : 21 : struct IFMapObjectDeleter { 22 105081 : void operator()(IFMapObject *obj) const { 23 105081 : intrusive_ptr_release(obj); 24 105081 : } 25 : }; 26 : 27 2110788 : IFMapNode::~IFMapNode() { 28 1055394 : list_.clear_and_dispose(IFMapObjectDeleter()); 29 2110788 : } 30 : 31 2088906 : string IFMapNode::ToString() const { 32 2088906 : string repr(table_->Typename()); 33 2088906 : repr += ":"; 34 2088906 : repr += name_; 35 2088906 : return repr; 36 0 : } 37 : 38 139486 : IFMapObject *IFMapNode::Find(IFMapOrigin origin) { 39 279338 : for (ObjectList::iterator iter = list_.begin(); iter != list_.end(); 40 : ++iter) { 41 39944 : IFMapObject *object = iter.operator->(); 42 39944 : if (object->origin() == origin) { 43 39761 : return object; 44 : } 45 : } 46 99725 : return NULL; 47 : } 48 : 49 132511 : void IFMapNode::Insert(IFMapObject *obj) { 50 132511 : intrusive_ptr_add_ref(obj); 51 132511 : if (obj->origin().IsOriginXmpp()) { 52 80 : list_.push_back(*obj); 53 : } else { 54 132431 : list_.push_front(*obj); 55 : } 56 132511 : } 57 : 58 27430 : void IFMapNode::Remove(IFMapObject *obj) { 59 54860 : list_.erase(list_.iterator_to(*obj)); 60 27430 : intrusive_ptr_release(obj); 61 27430 : } 62 : 63 1969694 : IFMapObject *IFMapNode::GetObject() { 64 1969694 : if (list_.empty()) { 65 191929 : return NULL; 66 : } 67 1777765 : return &list_.front(); 68 : } 69 : 70 48144 : const IFMapObject *IFMapNode::GetObject() const { 71 48144 : if (list_.empty()) { 72 25 : return NULL; 73 : } 74 48119 : return &list_.front(); 75 : } 76 : 77 3583 : IFMapNode::crc32type IFMapNode::GetConfigCrc() { 78 3583 : IFMapNode::crc32type crc = 0; 79 3583 : IFMapObject *object = Find(IFMapOrigin(IFMapOrigin::CASSANDRA)); 80 3583 : if (object) { 81 3024 : crc = object->CalculateCrc(); 82 3024 : if (crc == 0) { 83 510 : crc = 0xffffffff; 84 : } 85 : } 86 : 87 3583 : return crc; 88 : } 89 : 90 0 : void IFMapNode::PrintAllObjects() { 91 0 : cout << name_ << ": " << list_.size() << " objects" << endl; 92 0 : for (ObjectList::iterator iter = list_.begin(); iter != list_.end(); 93 : ++iter) { 94 0 : IFMapObject *object = iter.operator->(); 95 0 : cout << "\t" << object->origin().ToString() << endl; 96 : } 97 0 : } 98 : 99 444 : void IFMapNode::EncodeNodeDetail(pugi::xml_node *parent) const { 100 444 : xml_node node = parent->append_child("node"); 101 444 : node.append_attribute("type") = table_->Typename(); 102 444 : node.append_child("name").text().set(name_.c_str()); 103 444 : const IFMapObject *object = GetObject(); 104 444 : if (object != NULL) { 105 419 : object->EncodeUpdate(&node); 106 : } 107 444 : } 108 : 109 0 : void IFMapNode::EncodeNode(xml_node *parent) const { 110 0 : xml_node node = parent->append_child("node"); 111 0 : node.append_attribute("type") = table_->Typename(); 112 0 : node.append_child("name").text().set(name_.c_str()); 113 0 : } 114 : 115 936 : void IFMapNode::EncodeNode(const Descriptor &descriptor, xml_node *parent) { 116 936 : xml_node node = parent->append_child("node"); 117 936 : node.append_attribute("type") = descriptor.first.c_str(); 118 936 : node.append_child("name").text().set(descriptor.second.c_str()); 119 936 : } 120 : 121 1729 : DBEntryBase::KeyPtr IFMapNode::GetDBRequestKey() const { 122 1729 : IFMapTable::RequestKey *keyptr = new IFMapTable::RequestKey(); 123 1729 : keyptr->id_name = name_; 124 1729 : return KeyPtr(keyptr); 125 : } 126 : 127 1055394 : void IFMapNode::SetKey(const DBRequestKey *genkey) { 128 1055394 : const IFMapTable::RequestKey *keyptr = 129 : static_cast<const IFMapTable::RequestKey *>(genkey); 130 1055394 : name_ = keyptr->id_name; 131 1055394 : } 132 : 133 127134 : IFMapNode *IFMapNode::DescriptorLookup( 134 : DB *db, const IFMapNode::Descriptor &descriptor) { 135 127134 : if (db == NULL) { 136 0 : return NULL; 137 : } 138 127134 : IFMapTable *table = IFMapTable::FindTable(db, descriptor.first); 139 127134 : if (table == NULL) { 140 0 : return NULL; 141 : } 142 127134 : return table->FindNode(descriptor.second); 143 : }