Prepare the YANG models for RESTCONF
[lispflowmapping.git] / mappingservice / implementation / src / main / java / org / opendaylight / lispflowmapping / implementation / util / DAOMappingUtil.java
1 /*
2  * Copyright (c) 2014 Contextream, Inc. and others.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.lispflowmapping.implementation.util;
10
11 import java.util.AbstractMap;
12 import java.util.ArrayList;
13 import java.util.List;
14 import java.util.Map;
15 import java.util.Map.Entry;
16
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;
24
25 public class DAOMappingUtil {
26
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);
30     }
31
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);
35     }
36
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);
40     }
41
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);
45     }
46
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);
53         }
54         return result;
55     }
56
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);
64                     }
65                 }
66             }
67         }
68         return result;
69     }
70
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);
76         }
77         return locators;
78     }
79
80     private static Object findMaskLocatorsSpecific(IMappingServiceKey key, ILispDAO dao, String subkey) {
81         int mask = key.getMask();
82         while (mask > 0) {
83             LispAFIAddress eid = LispAFIConvertor.toAFI(key.getEID());
84             key = MappingServiceKeyUtil.generateMappingServiceKey(
85                     LispAFIConvertor.toContainer(MaskUtil.normalize(eid, mask)), mask);
86             mask--;
87             Object locators = dao.getSpecific(key, subkey);
88             if (locators != null) {
89                 return locators;
90             }
91         }
92         return null;
93     }
94
95     private static List<MappingServiceRLOCGroup> findMaskLocators(ILispDAO dao, IMappingServiceKey key) {
96         int mask = key.getMask();
97         while (mask > 0) {
98             LispAFIAddress eid = LispAFIConvertor.toAFI(key.getEID());
99             key = MappingServiceKeyUtil.generateMappingServiceKey(
100                     LispAFIConvertor.toContainer(MaskUtil.normalize(eid, mask)), mask);
101             mask--;
102             Map<String, ?> locators = dao.get(key);
103             if (locators != null) {
104                 List<MappingServiceRLOCGroup> result = aggregateLocators(locators);
105                 if (result != null && !result.isEmpty()) {
106                     return result;
107                 }
108             }
109         }
110         return null;
111     }
112
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();
118             while (mask > 0) {
119                 key = MappingServiceKeyUtil.generateMappingServiceKey(
120                         LispAFIConvertor.toContainer(MaskUtil.normalize(eidAddress, mask)), mask);
121                 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);
127                         return result;
128                     }
129                 }
130             }
131             // empty mapping
132             key = MappingServiceKeyUtil.generateMappingServiceKey(eid.getLispAddressContainer(), eid.getMask());
133             return new AbstractMap.SimpleImmutableEntry<>(key, null);
134         } else {
135             Map<String, ?> locators = dao.get(key);
136             List<MappingServiceRLOCGroup> aggLocators = aggregateLocators(locators);
137             return new AbstractMap.SimpleImmutableEntry<>(key, aggLocators);
138         }
139     }
140 }