/* Throws std::invalid_argument if any argument is invalid */ void Tree::addSubNodes(NodeRefPtr parent, XMLElement &thisNode, KVMRefCntPtr env) { string resName; if(thisNode.isNamed(RESOURCE_RESULT) && thisNode.getAttributeValue(NAME, resName)) { XMLElement decn; NodeRefPtr newNode; if(thisNode.getSubElement(POLICY_DECISION, decn)) { PDRefCntPtr decision = PolicyDecision::construct_policy_decision(resName, decn, env); newNode = new Node(parent, decision); // If the parent is NULL, then this is the root Node. if(parent != NULL) { parent->addNode(newNode); } else { rootNode = newNode; } } else { throw std::invalid_argument("Tree:addSubNodes(...) Cannot find " "Policy Decision node under resource " "result."); } XMLElement subElems; if(thisNode.getSubElement(RESOURCE_RESULT, subElems)) { for(;subElems.isValid(); subElems.nextSibling(RESOURCE_RESULT)) { addSubNodes(newNode, subElems, env); } } } else { throw std::invalid_argument("Tree::addSubNodes(...) has an invalid XML as input."); } }
bool Tree::insertBelow(NodeRefPtr parent, PDRefCntPtr &elem) { std::list<NodeRefPtr>::iterator iter; NodeRefPtr newNode(new Node(parent, elem)); // add the subordinate nodes of newNode under // new node. In the next loop, we iterate nodes // under new node and remove them from parent. // Reason: if we remove nodes under parent in this // loop, iterator becomes invalid. ScopeLock myLock(treeLock); for(iter = parent->begin(); iter != parent->end(); iter++) { NodeRefPtr node = *iter; PDRefCntPtr data = node->getPolicyDecision(); switch(compare(data->getName(), elem->getName(), false)) { case AM_EXACT_MATCH: case AM_SUB_RESOURCE_MATCH: return false; case AM_NO_MATCH: break; case AM_SUPER_RESOURCE_MATCH: newNode->addNode(node); break; } } for(iter = newNode->begin(); iter != newNode->end(); iter++) { NodeRefPtr node = *iter; parent->remove(node); } parent->addNode(newNode); return true; }