Update DAO API
[lispflowmapping.git] / mappingservice / implementation / src / main / java / org / opendaylight / lispflowmapping / implementation / util / DAOMappingUtil.java
diff --git a/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/util/DAOMappingUtil.java b/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/util/DAOMappingUtil.java
deleted file mode 100644 (file)
index a2d5d6a..0000000
+++ /dev/null
@@ -1,549 +0,0 @@
-/*
- * Copyright (c) 2014 Contextream, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.lispflowmapping.implementation.util;
-
-import java.util.AbstractMap;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.Map.Entry;
-
-import org.opendaylight.lispflowmapping.implementation.dao.MappingKeyUtil;
-import org.opendaylight.lispflowmapping.interfaces.dao.ILispDAO;
-import org.opendaylight.lispflowmapping.interfaces.dao.IMappingKey;
-import org.opendaylight.lispflowmapping.interfaces.dao.MappingEntry;
-import org.opendaylight.lispflowmapping.interfaces.dao.RLOCGroup;
-import org.opendaylight.lispflowmapping.interfaces.dao.SubscriberRLOC;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.LispAFIAddress;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.eidrecords.EidRecord;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.eidtolocatorrecords.EidToLocatorRecord;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lcafsourcedestaddress.DstAddressBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lcafsourcedestaddress.SrcAddressBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.LispAddressContainer;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.Address;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.LcafKeyValue;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.LcafSourceDest;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.lcafsourcedest.LcafSourceDestAddr;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispaddress.lispaddresscontainer.address.lcafsourcedest.LcafSourceDestAddrBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispsimpleaddress.primitiveaddress.DistinguishedName;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.locatorrecords.LocatorRecord;
-import org.opendaylight.lispflowmapping.inmemorydb.HashMapDb;
-import org.opendaylight.lispflowmapping.lisp.util.LispAFIConvertor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class DAOMappingUtil {
-    private static final Logger LOG = LoggerFactory.getLogger(DAOMappingUtil.class);
-
-    public static List<RLOCGroup> getLocatorsByEidRecord(EidRecord eid, ILispDAO dao, boolean iterateMask) {
-        IMappingKey key = MappingKeyUtil.generateMappingKey(eid.getLispAddressContainer(), eid.getMask());
-        return getLocators(key, dao, iterateMask);
-    }
-
-    public static Object getLocatorsSpecificByEidRecord(EidRecord eid, ILispDAO dao, String subkey,
-            boolean iterateMask) {
-        IMappingKey key = MappingKeyUtil.generateMappingKey(eid.getLispAddressContainer(), eid.getMask());
-        return getLocatorsSpecific(key, dao, subkey, iterateMask);
-    }
-
-    public static List<RLOCGroup> getLocatorsByEidToLocatorRecord(EidToLocatorRecord eid, ILispDAO dao,
-            boolean iterateMask) {
-        IMappingKey key = MappingKeyUtil.generateMappingKey(eid.getLispAddressContainer(), eid.getMaskLength());
-        return getLocators(key, dao, iterateMask);
-    }
-
-    public static Object getLocatorsSpecificByEidtoLocatorRecord(EidToLocatorRecord eid, ILispDAO dao, String subkey,
-            boolean iterateMask) {
-        IMappingKey key = MappingKeyUtil.generateMappingKey(eid.getLispAddressContainer(), eid.getMaskLength());
-        return getLocatorsSpecific(key, dao, subkey, iterateMask);
-    }
-
-    public static List<RLOCGroup> getLocators(IMappingKey key, ILispDAO dao, boolean iterateMask) {
-        Map<String, ?> locators = dao.get(key);
-        List<RLOCGroup> result = aggregateLocators(locators);
-        LispAFIAddress eid = LispAFIConvertor.toAFI(key.getEID());
-        if (iterateMask && result.isEmpty() && MaskUtil.isMaskable(eid)) {
-            result = findMaskLocators(dao, key);
-        }
-        return result;
-    }
-
-    private static List<RLOCGroup> aggregateLocators(Map<String, ?> locators) {
-        List<RLOCGroup> result = new ArrayList<RLOCGroup>();
-        if (locators != null) {
-            for (Object value : locators.values()) {
-                if (value != null && value instanceof RLOCGroup) {
-                    result.add((RLOCGroup) value);
-                }
-            }
-        }
-        return result;
-    }
-
-    public static Object getLocatorsSpecific(IMappingKey key, ILispDAO dao, String subkey, boolean iterateMask) {
-        Object locators = dao.getSpecific(key, subkey);
-        LispAFIAddress eid = LispAFIConvertor.toAFI(key.getEID());
-        if (iterateMask && locators == null && MaskUtil.isMaskable(eid)) {
-            locators = findMaskLocatorsSpecific(key, dao, subkey);
-        }
-        return locators;
-    }
-
-    private static Object findMaskLocatorsSpecific(IMappingKey key, ILispDAO dao, String subkey) {
-        int mask = key.getMask();
-        while (mask > 0) {
-            LispAFIAddress eid = LispAFIConvertor.toAFI(key.getEID());
-            key = MappingKeyUtil.generateMappingKey(LispAFIConvertor.toContainer(MaskUtil.normalize(eid, mask)), mask);
-            mask--;
-            Object locators = dao.getSpecific(key, subkey);
-            if (locators != null) {
-                return locators;
-            }
-        }
-        return null;
-    }
-
-    private static List<RLOCGroup> findMaskLocators(ILispDAO dao, IMappingKey key) {
-        int mask = key.getMask();
-        while (mask > 0) {
-            LispAFIAddress eid = LispAFIConvertor.toAFI(key.getEID());
-            key = MappingKeyUtil.generateMappingKey(LispAFIConvertor.toContainer(MaskUtil.normalize(eid, mask)), mask);
-            mask--;
-            Map<String, ?> locators = dao.get(key);
-            if (locators != null) {
-                List<RLOCGroup> result = aggregateLocators(locators);
-                if (result != null && !result.isEmpty()) {
-                    return result;
-                }
-            }
-        }
-        return null;
-    }
-
-    public static Entry<IMappingKey, List<RLOCGroup>> getMapping(LispAFIAddress srcEid, EidRecord eidRecord,
-            ILispDAO dao) {
-        // a map-request for an actual SrcDst LCAF, ignore src eid
-        if (eidRecord.getLispAddressContainer().getAddress() instanceof LcafSourceDest) {
-            LcafSourceDestAddr eid = ((LcafSourceDest) eidRecord.getLispAddressContainer().getAddress())
-                    .getLcafSourceDestAddr();
-            LispAFIAddress srcAddr = LispAFIConvertor.toAFIfromPrimitive(eid.getSrcAddress().getPrimitiveAddress());
-            LispAFIAddress dstAddr = LispAFIConvertor.toAFIfromPrimitive(eid.getDstAddress().getPrimitiveAddress());
-            return getMapping(srcAddr, dstAddr, eid.getSrcMaskLength(), eid.getDstMaskLength(), dao);
-        }
-
-        // potential map-request for SrcDst LCAF from non SrcDst capable devices
-        Entry<IMappingKey, List<RLOCGroup>> mapping = getMapping(srcEid,
-                LispAFIConvertor.toAFI(eidRecord.getLispAddressContainer()), (short) MaskUtil.getMaxMask(srcEid),
-                eidRecord.getMask(), dao);
-
-        // if indeed SrcDst LCAF change the key to matched dst eid
-        if (mapping.getKey().getEID().getAddress() instanceof LcafSourceDest) {
-            LcafSourceDestAddr srcDst = ((LcafSourceDest) mapping.getKey().getEID().getAddress())
-                    .getLcafSourceDestAddr();
-            IMappingKey newKey = MappingKeyUtil.generateMappingKey(
-                    LispAFIConvertor.toAFIfromPrimitive(srcDst.getDstAddress().getPrimitiveAddress()),
-                    srcDst.getDstMaskLength());
-            return new AbstractMap.SimpleImmutableEntry<>(newKey, mapping.getValue());
-        }
-
-        return mapping;
-    }
-
-    public static Entry<IMappingKey, List<RLOCGroup>> getMapping(LispAFIAddress srcEid, LispAFIAddress dstEid,
-            short srcMask, short dstMask, ILispDAO dao) {
-        IMappingKey key = MappingKeyUtil.generateMappingKey(dstEid, dstMask);
-        Entry<IMappingKey, Map<String, ?>> daoEntry = getDaoEntry(key, dao);
-        if (daoEntry != null) {
-            // try SrcDst eid lookup
-            ILispDAO srcDstDao = (ILispDAO) daoEntry.getValue().get(DAOSubKeys.LCAF_SRCDST_SUBKEY.toString());
-            if (srcDstDao != null) {
-                Entry<IMappingKey, List<RLOCGroup>> mapping = getMappingForEid(srcEid, srcMask, srcDstDao);
-                // if lookup fails, return whatever is found for dst eid
-                if (mapping.getValue() != null) {
-                    LispAFIAddress newDst = LispAFIConvertor.toAFI(daoEntry.getKey().getEID());
-                    LispAFIAddress newSrc = LispAFIConvertor.toAFI(mapping.getKey().getEID());
-
-                    LispAFIAddress newEid = new LcafSourceDestAddrBuilder()
-                            .setDstAddress(
-                                    new DstAddressBuilder().setPrimitiveAddress(LispAFIConvertor.toPrimitive(newDst))
-                                            .build())
-                            .setSrcAddress(
-                                    new SrcAddressBuilder().setPrimitiveAddress(LispAFIConvertor.toPrimitive(newSrc))
-                                            .build()).setDstMaskLength((short) daoEntry.getKey().getMask())
-                            .setSrcMaskLength((short) mapping.getKey().getMask()).setAfi((short) 16387)
-                            .setLcafType((short) 12).build();
-                    IMappingKey newKey = MappingKeyUtil.generateMappingKey(newEid, dstMask);
-                    return new AbstractMap.SimpleImmutableEntry<>(newKey, mapping.getValue());
-                }
-            }
-
-            // dst eid lookup
-            return makeMappingEntry(daoEntry.getKey(), daoEntry.getValue());
-        }
-        return new AbstractMap.SimpleImmutableEntry<>(key, null);
-    }
-
-    public static Entry<IMappingKey, List<RLOCGroup>> getMappingExact(LispAFIAddress srcEid, LispAFIAddress dstEid,
-            short srcMask, short dstMask, ILispDAO dao) {
-        IMappingKey dstKey = MappingKeyUtil.generateMappingKey(dstEid, dstMask);
-        Map<String, ?> daoEntry = dao.get(dstKey);
-        if (daoEntry != null) {
-            // try SrcDst eid lookup
-            ILispDAO srcDstDao = (ILispDAO) daoEntry.get(DAOSubKeys.LCAF_SRCDST_SUBKEY.toString());
-            // if lookup fails, return whatever is found for dst eid
-            if (srcDstDao != null) {
-                IMappingKey srcKey = MappingKeyUtil.generateMappingKey(srcEid, srcMask);
-                Map<String, ?> mapping = srcDstDao.get(srcKey);
-                LispAFIAddress newEid = new LcafSourceDestAddrBuilder()
-                        .setDstAddress(
-                                new DstAddressBuilder().setPrimitiveAddress(LispAFIConvertor.toPrimitive(dstEid))
-                                        .build())
-                        .setSrcAddress(
-                                new SrcAddressBuilder().setPrimitiveAddress(LispAFIConvertor.toPrimitive(srcEid))
-                                        .build()).setDstMaskLength((short) dstMask).setSrcMaskLength((short) srcMask)
-                        .setAfi((short) 16387).setLcafType((short) 12).build();
-                IMappingKey newKey = MappingKeyUtil.generateMappingKey(newEid, dstMask);
-                return makeMappingEntry(newKey, mapping);
-            }
-
-            // dst eid lookup
-            return makeMappingEntry(dstKey, daoEntry);
-        }
-        return new AbstractMap.SimpleImmutableEntry<>(dstKey, null);
-    }
-
-    public static Entry<IMappingKey, List<RLOCGroup>> getMappingForEidRecord(EidRecord eid, ILispDAO dao) {
-        return getMappingForEid(LispAFIConvertor.toAFI(eid.getLispAddressContainer()), eid.getMask(), dao);
-    }
-
-    private static Entry<IMappingKey, List<RLOCGroup>> makeMappingEntry(IMappingKey key, Map<String, ?> locators) {
-        if (locators != null) {
-            List<RLOCGroup> locatorsList = aggregateLocators(locators);
-            if (locatorsList != null && !locatorsList.isEmpty()) {
-                return new AbstractMap.SimpleImmutableEntry<>(key, locatorsList);
-            }
-        }
-        return new AbstractMap.SimpleImmutableEntry<>(key, null);
-    }
-
-    public static Entry<IMappingKey, List<RLOCGroup>> getMappingForEid(LispAFIAddress eid, int maskLen, ILispDAO dao) {
-        if (eid instanceof LcafSourceDestAddr) {
-            LispAFIAddress srcAddr = LispAFIConvertor.toAFIfromPrimitive(((LcafSourceDestAddr) eid).getSrcAddress()
-                    .getPrimitiveAddress());
-            LispAFIAddress dstAddr = LispAFIConvertor.toAFIfromPrimitive(((LcafSourceDestAddr) eid).getDstAddress()
-                    .getPrimitiveAddress());
-
-            return getMapping(srcAddr, dstAddr, ((LcafSourceDestAddr) eid).getSrcMaskLength(),
-                    ((LcafSourceDestAddr) eid).getDstMaskLength(), dao);
-        }
-        IMappingKey key = MappingKeyUtil.generateMappingKey(eid, maskLen);
-        Entry<IMappingKey, Map<String, ?>> entry = getDaoEntry(key, dao);
-        if (entry == null) {
-            return makeMappingEntry(key, null);
-        } else {
-            return makeMappingEntry(entry.getKey(), entry.getValue());
-        }
-    }
-
-    public static Entry<IMappingKey, Map<String, ?>> getDaoEntry(IMappingKey lookupKey, ILispDAO dao) {
-        LispAFIAddress eidAddress = LispAFIConvertor.toAFI(lookupKey.getEID());
-        if (MaskUtil.isMaskable(eidAddress)) {
-            IMappingKey key;
-            int mask = lookupKey.getMask();
-            while (mask > 0) {
-                key = MappingKeyUtil.generateMappingKey(eidAddress, mask);
-                mask--;
-                Map<String, ?> entry = dao.get(key);
-                if (entry != null) {
-                    return new AbstractMap.SimpleImmutableEntry<IMappingKey, Map<String, ?>>(key, entry);
-                }
-            }
-            return null;
-        } else {
-            Map<String, ?> entry = dao.get(lookupKey);
-            if (entry != null) {
-                return new AbstractMap.SimpleImmutableEntry<IMappingKey, Map<String, ?>>(lookupKey,
-                        dao.get(lookupKey));
-            } else {
-                return null;
-            }
-        }
-    }
-
-    public static void addSubscribers(LispAddressContainer eid, int mask, Set<SubscriberRLOC> subscribers,
-            ILispDAO dao) {
-        IMappingKey key = MappingKeyUtil.generateMappingKey(eid, mask);
-        dao.put(key, new MappingEntry<Set<SubscriberRLOC>>(DAOSubKeys.SUBSCRIBERS_SUBKEY.toString(), subscribers));
-    }
-
-    public static void addAuthenticationKey(LispAddressContainer address, int maskLen, String key, ILispDAO dao) {
-        IMappingKey mappingServiceKey = MappingKeyUtil.generateMappingKey(address, maskLen);
-        if (address.getAddress() instanceof LcafSourceDest) {
-            IMappingKey srcKey = MappingKeyUtil.generateMappingKey(getSrcForLcafSrcDst(address),
-                    getSrcMaskForLcafSrcDst(address));
-            ILispDAO srcDstDao = getOrInstantiateSrcDstInnerDao(address, maskLen, dao);
-            srcDstDao.put(srcKey, new MappingEntry<String>(DAOSubKeys.PASSWORD_SUBKEY.toString(), key));
-        } else {
-            dao.put(mappingServiceKey, new MappingEntry<String>(DAOSubKeys.PASSWORD_SUBKEY.toString(), key));
-        }
-    }
-
-    public static String getPasswordForMaskable(LispAddressContainer prefix, int maskLength, ILispDAO db,
-            boolean shouldIterate) {
-        while (maskLength >= 0) {
-            IMappingKey key = MappingKeyUtil.generateMappingKey(prefix, maskLength);
-            Object password = db.getSpecific(key, DAOSubKeys.PASSWORD_SUBKEY.toString());
-            if (password != null && password instanceof String) {
-                return (String) password;
-            } else if (shouldIterate) {
-                maskLength -= 1;
-            } else {
-                LOG.warn("Failed to find password!");
-                return null;
-            }
-        }
-        return null;
-    }
-
-    public static String getPassword(LispAddressContainer prefix, int maskLength, ILispDAO dao, boolean iterate) {
-        if (MaskUtil.isMaskable(LispAFIConvertor.toAFI(prefix))) {
-            return getPasswordForMaskable(prefix, maskLength, dao, iterate);
-        } else if (prefix.getAddress() instanceof LcafSourceDest) {
-            ILispDAO srcDstDao = getSrcDstInnerDao(prefix, maskLength, dao);
-            if (srcDstDao != null) {
-                return getPasswordForMaskable(LispAFIConvertor.toContainer(getSrcForLcafSrcDst(prefix)),
-                        getSrcMaskForLcafSrcDst(prefix), srcDstDao, iterate);
-            }
-            return null;
-        } else {
-            IMappingKey key = MappingKeyUtil.generateMappingKey(prefix, maskLength);
-            Object password = dao.getSpecific(key, DAOSubKeys.PASSWORD_SUBKEY.toString());
-            if (password != null && password instanceof String) {
-                return (String) password;
-            } else {
-                LOG.warn("Failed to find password!");
-                return null;
-            }
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    public static Set<SubscriberRLOC> getSubscribers(LispAddressContainer prefix, int maskLength, ILispDAO dao) {
-        Object subscribers;
-        if (prefix.getAddress() instanceof LcafSourceDest) {
-            IMappingKey srcKey = MappingKeyUtil.generateMappingKey(getSrcForLcafSrcDst(prefix),
-                    getSrcMaskForLcafSrcDst(prefix));
-            ILispDAO srcDstDao = getSrcDstInnerDao(prefix, maskLength, dao);
-            subscribers = srcDstDao.getSpecific(srcKey, DAOSubKeys.SUBSCRIBERS_SUBKEY.toString());
-        } else {
-            IMappingKey key = MappingKeyUtil.generateMappingKey(prefix, maskLength);
-            subscribers = dao.getSpecific(key, DAOSubKeys.SUBSCRIBERS_SUBKEY.toString());
-        }
-
-        if (subscribers != null && subscribers instanceof Set<?>) {
-            return (Set<SubscriberRLOC>) subscribers;
-        }
-        return null;
-    }
-
-    // SrcDst LCAFs are stored in a 2-tier DAO with dst having priority over
-    // src. This method returns the DAO
-    // associated to a dst or creates it if it doesn't exist.
-    public static ILispDAO getOrInstantiateSrcDstInnerDao(LispAddressContainer address, int maskLen, ILispDAO dao) {
-        IMappingKey dstKey = MappingKeyUtil.generateMappingKey(getDstForLcafSrcDst(address),
-                getDstMaskForLcafSrcDst(address));
-        ILispDAO srcDstDao = (ILispDAO) dao.getSpecific(dstKey, DAOSubKeys.LCAF_SRCDST_SUBKEY.toString());
-        if (srcDstDao == null) {
-            srcDstDao = new HashMapDb();
-            dao.put(dstKey, new MappingEntry<>(DAOSubKeys.LCAF_SRCDST_SUBKEY.toString(), srcDstDao));
-        }
-        return srcDstDao;
-    }
-
-    // SrcDst LCAFs are stored in a 2-tier DAO with dst having priority over
-    // src. This method returns the DAO
-    // associated to a dst or null if it doesn't exist.
-    public static ILispDAO getSrcDstInnerDao(LispAddressContainer address, int maskLen, ILispDAO dao) {
-        IMappingKey dstKey = MappingKeyUtil.generateMappingKey(getDstForLcafSrcDst(address),
-                getDstMaskForLcafSrcDst(address));
-        return (ILispDAO) dao.getSpecific(dstKey, DAOSubKeys.LCAF_SRCDST_SUBKEY.toString());
-    }
-
-    public static boolean saveRlocs(EidToLocatorRecord eidRecord, boolean checkForChanges, ILispDAO dao,
-            boolean shouldIterate, boolean shouldOverwrite) {
-        Map<String, RLOCGroup> rlocGroups = new HashMap<String, RLOCGroup>();
-        if (eidRecord.getLocatorRecord() != null) {
-            for (LocatorRecord locatorRecord : eidRecord.getLocatorRecord()) {
-                String subkey = getAddressKey(locatorRecord.getLispAddressContainer().getAddress(), shouldOverwrite);
-                if (!rlocGroups.containsKey(subkey)) {
-                    rlocGroups
-                            .put(subkey,
-                                    new RLOCGroup(eidRecord.getRecordTtl(), eidRecord.getAction(), eidRecord
-                                            .isAuthoritative()));
-                }
-                rlocGroups.get(subkey).addRecord(locatorRecord);
-            }
-        } else {
-            rlocGroups.put(DAOSubKeys.ADDRESS_SUBKEY.toString(),
-                    new RLOCGroup(eidRecord.getRecordTtl(), eidRecord.getAction(), eidRecord.isAuthoritative()));
-        }
-        List<MappingEntry<RLOCGroup>> entries = new ArrayList<>();
-        for (String subkey : rlocGroups.keySet()) {
-            entries.add(new MappingEntry<>(subkey, rlocGroups.get(subkey)));
-        }
-
-        if (eidRecord.getLispAddressContainer().getAddress() instanceof LcafSourceDest) {
-            Entry<IMappingKey, List<RLOCGroup>> oldMapping = null, newMapping = null;
-            LispAFIAddress srcAddr = getSrcForLcafSrcDst(eidRecord.getLispAddressContainer());
-            LispAFIAddress dstAddr = getDstForLcafSrcDst(eidRecord.getLispAddressContainer());
-            short srcMask = getSrcMaskForLcafSrcDst(eidRecord.getLispAddressContainer());
-            short dstMask = getDstMaskForLcafSrcDst(eidRecord.getLispAddressContainer());
-
-            if (checkForChanges) {
-                oldMapping = DAOMappingUtil.getMappingExact(srcAddr, dstAddr, srcMask, dstMask, dao);
-            }
-            IMappingKey dstKey = MappingKeyUtil.generateMappingKey(dstAddr, dstMask);
-            ILispDAO srcDstDao = (ILispDAO) dao.getSpecific(dstKey, DAOSubKeys.LCAF_SRCDST_SUBKEY.toString());
-            if (srcDstDao == null) {
-                srcDstDao = new HashMapDb();
-                dao.put(dstKey, new MappingEntry<>(DAOSubKeys.LCAF_SRCDST_SUBKEY.toString(), srcDstDao));
-            }
-            IMappingKey srcKey = MappingKeyUtil.generateMappingKey(srcAddr, srcMask);
-            srcDstDao.put(srcKey, entries.toArray(new MappingEntry[entries.size()]));
-            if (checkForChanges) {
-                newMapping = DAOMappingUtil.getMappingExact(srcAddr, dstAddr, srcMask, dstMask, dao);
-                return (newMapping.getValue() == null) ? oldMapping.getValue() != null : !newMapping.getValue()
-                        .equals(oldMapping.getValue());
-            }
-        } else {
-            List<RLOCGroup> oldLocators = null, newLocators = null;
-            if (checkForChanges) {
-                oldLocators = DAOMappingUtil.getLocatorsByEidToLocatorRecord(eidRecord, dao, shouldIterate);
-            }
-            IMappingKey key = MappingKeyUtil.generateMappingKey(eidRecord.getLispAddressContainer(),
-                    eidRecord.getMaskLength());
-            dao.put(key, entries.toArray(new MappingEntry[entries.size()]));
-            if (checkForChanges) {
-                newLocators = DAOMappingUtil.getLocatorsByEidToLocatorRecord(eidRecord, dao, shouldIterate);
-                return (newLocators == null) ? oldLocators != null : !newLocators.equals(oldLocators);
-            }
-        }
-        return false;
-    }
-
-    public static String getAddressKey(Address address, boolean shouldOverwrite) {
-        if (address instanceof LcafKeyValue) {
-            LcafKeyValue keyVal = (LcafKeyValue) address;
-            if (keyVal.getLcafKeyValueAddressAddr().getKey().getPrimitiveAddress() instanceof DistinguishedName) {
-                return ((DistinguishedName) keyVal.getLcafKeyValueAddressAddr().getKey().getPrimitiveAddress())
-                        .getDistinguishedNameAddress().getDistinguishedName();
-            }
-        }
-        if (shouldOverwrite) {
-            return DAOSubKeys.ADDRESS_SUBKEY.toString();
-        } else {
-            return String.valueOf(address.hashCode());
-        }
-    }
-
-    public static void removeAuthenticationKey(LispAddressContainer address, int maskLen, ILispDAO dao) {
-        if (address.getAddress() instanceof LcafSourceDest) {
-            ILispDAO srcDstDao = getSrcDstInnerDao(address, maskLen, dao);
-            if (srcDstDao != null) {
-                IMappingKey srcKey = MappingKeyUtil.generateMappingKey(getSrcForLcafSrcDst(address),
-                        getSrcMaskForLcafSrcDst(address));
-                srcDstDao.removeSpecific(srcKey, DAOSubKeys.PASSWORD_SUBKEY.toString());
-            }
-        } else {
-            IMappingKey key = MappingKeyUtil.generateMappingKey(address, maskLen);
-            dao.removeSpecific(key, DAOSubKeys.PASSWORD_SUBKEY.toString());
-        }
-    }
-
-    private static void removeMappingRlocs(Entry<IMappingKey, List<RLOCGroup>> mapping, ILispDAO db,
-            boolean shouldOverwrite) {
-        if (mapping == null || mapping.getValue() == null) {
-            return;
-        }
-        for (RLOCGroup group : mapping.getValue()) {
-            for (LocatorRecord record : group.getRecords()) {
-                db.removeSpecific(mapping.getKey(),
-                        DAOMappingUtil.getAddressKey(record.getLispAddressContainer().getAddress(), shouldOverwrite));
-            }
-        }
-    }
-
-    public static void removeMapping(LispAddressContainer address, int maskLen, ILispDAO dao, boolean oerwrite) {
-        Entry<IMappingKey, List<RLOCGroup>> mapping;
-        ILispDAO db;
-        if (address.getAddress() instanceof LcafSourceDest) {
-            db = getSrcDstInnerDao(address, maskLen, dao);
-            LispAFIAddress srcAddr = getSrcForLcafSrcDst(address);
-            short srcMask = getSrcMaskForLcafSrcDst(address);
-            mapping = DAOMappingUtil.getMappingForEid(srcAddr, srcMask, db);
-        } else {
-            db = dao;
-            mapping = DAOMappingUtil.getMappingForEid(LispAFIConvertor.toAFI(address), maskLen, db);
-        }
-        removeMappingRlocs(mapping, db, oerwrite);
-    }
-
-    public static void removeSubscribers(LispAddressContainer address, int maskLen, ILispDAO dao,
-            boolean shouldOverwrite) {
-        Entry<IMappingKey, List<RLOCGroup>> mapping;
-        ILispDAO db;
-        if (address.getAddress() instanceof LcafSourceDest) {
-            db = getSrcDstInnerDao(address, maskLen, dao);
-            LispAFIAddress srcAddr = getSrcForLcafSrcDst(address);
-            short srcMask = getSrcMaskForLcafSrcDst(address);
-            mapping = DAOMappingUtil.getMappingForEid(srcAddr, srcMask, db);
-        } else {
-            db = dao;
-            mapping = DAOMappingUtil.getMappingForEid(LispAFIConvertor.toAFI(address), maskLen, db);
-        }
-        db.removeSpecific(mapping.getKey(), DAOSubKeys.SUBSCRIBERS_SUBKEY.toString());
-    }
-
-    public static void removeEntry(LispAddressContainer address, int maskLen, ILispDAO dao, boolean shouldOverwrite) {
-        Entry<IMappingKey, List<RLOCGroup>> mapping;
-        ILispDAO db;
-        if (address.getAddress() instanceof LcafSourceDest) {
-            db = getSrcDstInnerDao(address, maskLen, dao);
-            LispAFIAddress srcAddr = getSrcForLcafSrcDst(address);
-            short srcMask = getSrcMaskForLcafSrcDst(address);
-            mapping = DAOMappingUtil.getMappingForEid(srcAddr, srcMask, db);
-        } else {
-            db = dao;
-            mapping = DAOMappingUtil.getMappingForEid(LispAFIConvertor.toAFI(address), maskLen, db);
-        }
-
-        db.remove(mapping.getKey());
-    }
-
-    public static LispAFIAddress getSrcForLcafSrcDst(LispAddressContainer container) {
-        return LispAFIConvertor.toAFIfromPrimitive(((LcafSourceDest) container.getAddress()).getLcafSourceDestAddr()
-                .getSrcAddress().getPrimitiveAddress());
-    }
-
-    public static LispAFIAddress getDstForLcafSrcDst(LispAddressContainer container) {
-        return LispAFIConvertor.toAFIfromPrimitive(((LcafSourceDest) container.getAddress()).getLcafSourceDestAddr()
-                .getDstAddress().getPrimitiveAddress());
-    }
-
-    public static short getSrcMaskForLcafSrcDst(LispAddressContainer container) {
-        return ((LcafSourceDest) container.getAddress()).getLcafSourceDestAddr().getSrcMaskLength();
-    }
-
-    public static short getDstMaskForLcafSrcDst(LispAddressContainer container) {
-        return ((LcafSourceDest) container.getAddress()).getLcafSourceDestAddr().getDstMaskLength();
-    }
-
-}