Switch to side-by-side view

--- a
+++ b/src/DAF/DA/NamingInformation.cc
@@ -0,0 +1,135 @@
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+// 
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public License
+// along with this program.  If not, see http://www.gnu.org/licenses/.
+// 
+
+#include "NamingInformation.h"
+
+//Constants
+const char*   ELEM_NAMINGTABLE     = "NamingInfo";
+const char*   ELEM_SYNONYM         = "Synonym";
+
+Define_Module(NamingInformation);
+
+void NamingInformation::initialize()
+{
+    //Parse XML config
+    parseConfig(par(PAR_CONFIGDATA).xmlValue());
+
+    //Init watchers
+    WATCH_LIST(NamingInfoTable);
+}
+
+void NamingInformation::addNamingEntry(const APN& apn) {
+    NamingInfoTable.push_back(NamingInformationEntry(apn));
+}
+
+NamingInformationEntry* NamingInformation::findNamingEntryByApn(const APN& apn) {
+    for (NamingItem it = NamingInfoTable.begin(); it != NamingInfoTable.end(); ++it) {
+        if (it->getApn() == apn)
+            return &(*it);
+    }
+    return NULL;
+}
+
+void NamingInformation::addNewSynonym(const APN& apn, const APN& synonym) {
+    findNamingEntryByApn(apn)->addSynonym(synonym);
+}
+
+void NamingInformation::removeNamingEntry(const APN& apn) {
+    NamingInfoTable.remove(*(findNamingEntryByApn(apn)));
+}
+
+NamingInformationEntry* NamingInformation::findNamingEntryBySynonym(const APN& synonym) {
+    for (NamingItem it = NamingInfoTable.begin(); it != NamingInfoTable.end(); ++it) {
+        if (it->hasSynonym(synonym))
+            return &(*it);
+    }
+    return NULL;
+
+}
+
+const APN* NamingInformation::findApnBySynonym(const APN& synonym) {
+    NamingInformationEntry* entry = findNamingEntryBySynonym(synonym);
+    return entry ? &(entry->getApn()) : NULL;
+}
+
+void NamingInformation::handleMessage(cMessage *msg)
+{
+
+}
+
+const APNList NamingInformation::findAllApnNames(const APN& apn) {
+    NamingInformationEntry* entry1 = findNamingEntryByApn(apn);
+    NamingInformationEntry* entry2 = findNamingEntryBySynonym(apn);
+
+    APNList result = APNList();
+    //APN does not exist within NamingInfo
+    if (entry1 == NULL && entry2 == NULL) {
+        EV << "No NamingInfo thus considering " << apn << " as unique!" << endl;
+        result.push_back(apn);
+    }
+    //APN without any synonyms
+    else if (entry1 != NULL && entry2 == NULL) {
+        result.push_back(apn);
+    }
+    //Found based on synonym
+    else if (entry1 == NULL && entry2 != NULL) {
+        result = entry2->getSynonyms();
+        result.push_back(apn);
+    }
+    //Inconsistancy where two different NI are returned
+    else {
+        EV << "NamingInfo contains inconsistency" << endl
+           << *entry1 << endl
+           << *entry2 << endl;
+    }
+    return result;
+}
+
+void NamingInformation::parseConfig(cXMLElement* config) {
+    cXMLElement* mainTag = NULL;
+    if (config != NULL && config->hasChildren() && config->getFirstChildWithTag(ELEM_NAMINGTABLE))
+        mainTag = config->getFirstChildWithTag(ELEM_NAMINGTABLE);
+    else {
+        EV << "configData parameter not initialized!" << endl;
+        return;
+    }
+
+
+    cXMLElementList apnlist = mainTag->getChildrenByTagName(ELEM_APN);
+    for (cXMLElementList::const_iterator it = apnlist.begin(); it != apnlist.end(); ++it) {
+        cXMLElement* m = *it;
+
+        if (!(m->getAttribute(ATTR_APN) && m->getFirstChildWithTag(ELEM_SYNONYM))) {
+            EV << "\nError when parsing NaimingInfo record" << endl;
+            continue;
+        }
+
+        APN newapn = APN(m->getAttribute(ATTR_APN));
+
+        addNamingEntry(newapn);
+
+        cXMLElementList synonymlist = m->getChildrenByTagName(ELEM_SYNONYM);
+        for (cXMLElementList::const_iterator jt = synonymlist.begin(); jt != synonymlist.end(); ++jt) {
+            cXMLElement* n = *jt;
+
+            if (!(n->getAttribute(ATTR_APN))) {
+                EV << "\nError when parsing Synonym record" << endl;
+                continue;
+            }
+
+            addNewSynonym(newapn, APN(n->getAttribute(ATTR_APN)));
+        }
+    }
+}