2 * Copyright (c) 2014 Contextream, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.lispflowmapping.implementation.util;
11 import java.util.AbstractMap;
12 import java.util.ArrayList;
13 import java.util.List;
15 import java.util.Map.Entry;
17 import org.opendaylight.lispflowmapping.implementation.dao.MappingServiceKeyUtil;
18 import org.opendaylight.lispflowmapping.interfaces.dao.ILispDAO;
19 import org.opendaylight.lispflowmapping.interfaces.dao.IMappingServiceKey;
20 import org.opendaylight.lispflowmapping.interfaces.dao.MappingServiceRLOCGroup;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.LispAFIAddress;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.eidrecords.EidRecord;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.eidtolocatorrecords.EidToLocatorRecord;
25 public class DAOMappingUtil {
27 public static List<MappingServiceRLOCGroup> getLocatorsByEidRecord(EidRecord eid, ILispDAO dao, boolean iterateMask) {
28 IMappingServiceKey key = MappingServiceKeyUtil.generateMappingServiceKey(eid.getLispAddressContainer(), eid.getMask());
29 return getLocators(key, dao, iterateMask);
32 public static Object getLocatorsSpecificByEidRecord(EidRecord eid, ILispDAO dao, String subkey, boolean iterateMask) {
33 IMappingServiceKey key = MappingServiceKeyUtil.generateMappingServiceKey(eid.getLispAddressContainer(), eid.getMask());
34 return getLocatorsSpecific(key, dao, subkey, iterateMask);
37 public static List<MappingServiceRLOCGroup> getLocatorsByEidToLocatorRecord(EidToLocatorRecord eid, ILispDAO dao, boolean iterateMask) {
38 IMappingServiceKey key = MappingServiceKeyUtil.generateMappingServiceKey(eid.getLispAddressContainer(), eid.getMaskLength());
39 return getLocators(key, dao, iterateMask);
42 public static Object getLocatorsSpecificByEidtoLocatorRecord(EidToLocatorRecord eid, ILispDAO dao, String subkey, boolean iterateMask) {
43 IMappingServiceKey key = MappingServiceKeyUtil.generateMappingServiceKey(eid.getLispAddressContainer(), eid.getMaskLength());
44 return getLocatorsSpecific(key, dao, subkey, iterateMask);
47 public static List<MappingServiceRLOCGroup> getLocators(IMappingServiceKey key, ILispDAO dao, boolean iterateMask) {
48 Map<String, ?> locators = dao.get(key);
49 List<MappingServiceRLOCGroup> result = aggregateLocators(locators);
50 LispAFIAddress eid = LispAFIConvertor.toAFI(key.getEID());
51 if (iterateMask && result.isEmpty() && MaskUtil.isMaskable(eid)) {
52 result = findMaskLocators(dao, key);
57 private static List<MappingServiceRLOCGroup> aggregateLocators(Map<String, ?> locators) {
58 List<MappingServiceRLOCGroup> result = new ArrayList<MappingServiceRLOCGroup>();
59 if (locators != null) {
60 for (Object value : locators.values()) {
61 if (value != null && value instanceof MappingServiceRLOCGroup) {
62 if (!((MappingServiceRLOCGroup) value).getRecords().isEmpty()) {
63 result.add((MappingServiceRLOCGroup) value);
71 public static Object getLocatorsSpecific(IMappingServiceKey key, ILispDAO dao, String subkey, boolean iterateMask) {
72 Object locators = dao.getSpecific(key, subkey);
73 LispAFIAddress eid = LispAFIConvertor.toAFI(key.getEID());
74 if (iterateMask && locators == null && MaskUtil.isMaskable(eid)) {
75 locators = findMaskLocatorsSpecific(key, dao, subkey);
80 private static Object findMaskLocatorsSpecific(IMappingServiceKey key, ILispDAO dao, String subkey) {
81 int mask = key.getMask();
83 LispAFIAddress eid = LispAFIConvertor.toAFI(key.getEID());
84 key = MappingServiceKeyUtil.generateMappingServiceKey(
85 LispAFIConvertor.toContainer(MaskUtil.normalize(eid, mask)), mask);
87 Object locators = dao.getSpecific(key, subkey);
88 if (locators != null) {
95 private static List<MappingServiceRLOCGroup> findMaskLocators(ILispDAO dao, IMappingServiceKey key) {
96 int mask = key.getMask();
98 LispAFIAddress eid = LispAFIConvertor.toAFI(key.getEID());
99 key = MappingServiceKeyUtil.generateMappingServiceKey(
100 LispAFIConvertor.toContainer(MaskUtil.normalize(eid, mask)), mask);
102 Map<String, ?> locators = dao.get(key);
103 if (locators != null) {
104 List<MappingServiceRLOCGroup> result = aggregateLocators(locators);
105 if (result != null && !result.isEmpty()) {
113 public static Entry<IMappingServiceKey, List<MappingServiceRLOCGroup>> getMappingForEidRecord(EidRecord eid, ILispDAO dao) {
114 IMappingServiceKey key = MappingServiceKeyUtil.generateMappingServiceKey(eid.getLispAddressContainer(), eid.getMask());
115 LispAFIAddress eidAddress = LispAFIConvertor.toAFI(key.getEID());
116 if (MaskUtil.isMaskable(eidAddress)) {
117 int mask = eid.getMask();
119 key = MappingServiceKeyUtil.generateMappingServiceKey(
120 LispAFIConvertor.toContainer(MaskUtil.normalize(eidAddress, mask)), mask);
122 Map<String, ?> locators = dao.get(key);
123 if (locators != null) {
124 List<MappingServiceRLOCGroup> locatorsList = aggregateLocators(locators);
125 if (locatorsList != null && !locatorsList.isEmpty()) {
126 Entry<IMappingServiceKey, List<MappingServiceRLOCGroup>> result = new AbstractMap.SimpleImmutableEntry<>(key, locatorsList);
132 key = MappingServiceKeyUtil.generateMappingServiceKey(eid.getLispAddressContainer(), eid.getMask());
133 return new AbstractMap.SimpleImmutableEntry<>(key, null);
135 Map<String, ?> locators = dao.get(key);
136 List<MappingServiceRLOCGroup> aggLocators = aggregateLocators(locators);
137 return new AbstractMap.SimpleImmutableEntry<>(key, aggLocators);