BUG-6650: ep-ip/sgt, update/rename models and yangs for sxp-ise-adapter
[groupbasedpolicy.git] / sxp-mapper / src / main / java / org / opendaylight / groupbasedpolicy / sxp / mapper / impl / dao / SimpleCachedDaoEPForwardingTemplateImpl.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, 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 package org.opendaylight.groupbasedpolicy.sxp.mapper.impl.dao;
9
10 import com.google.common.base.Optional;
11 import com.google.common.collect.Iterables;
12 import java.util.Map;
13 import java.util.concurrent.ConcurrentHashMap;
14 import java.util.concurrent.ConcurrentMap;
15 import java.util.regex.Pattern;
16 import javax.annotation.Nonnull;
17 import javax.annotation.Nullable;
18 import org.apache.commons.net.util.SubnetUtils;
19 import org.opendaylight.groupbasedpolicy.sxp.mapper.api.SimpleCachedDao;
20 import org.opendaylight.groupbasedpolicy.sxp.mapper.impl.util.EPTemplateUtil;
21 import org.opendaylight.groupbasedpolicy.sxp.mapper.impl.util.SubnetInfoKeyDecorator;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.mapper.model.rev160302.sxp.mapper.EndpointForwardingTemplateBySubnet;
24
25 /**
26  * Purpose: generic implementation of {@link SimpleCachedDao}
27  */
28 public class SimpleCachedDaoEPForwardingTemplateImpl implements SimpleCachedDao<IpPrefix, EndpointForwardingTemplateBySubnet> {
29
30     private final ConcurrentMap<IpPrefix, EndpointForwardingTemplateBySubnet> plainCache;
31     private final ConcurrentMap<SubnetInfoKeyDecorator, EndpointForwardingTemplateBySubnet> subnetCache;
32     private final Pattern IP_MASK_EATER_RE = Pattern.compile("/[0-9]+");
33
34     public SimpleCachedDaoEPForwardingTemplateImpl() {
35         plainCache = new ConcurrentHashMap<>();
36         subnetCache = new ConcurrentHashMap<>();
37     }
38
39     @Override
40     public EndpointForwardingTemplateBySubnet update(@Nonnull final IpPrefix key, @Nullable final EndpointForwardingTemplateBySubnet value) {
41         final EndpointForwardingTemplateBySubnet previousValue;
42         if (EPTemplateUtil.isPlain(key)) {
43             previousValue = updatePlainCache(key, value);
44         } else {
45             previousValue = updateSubnetCache(key, value);
46         }
47
48         return previousValue;
49     }
50
51     private EndpointForwardingTemplateBySubnet updateSubnetCache(final IpPrefix key, final EndpointForwardingTemplateBySubnet value) {
52         final EndpointForwardingTemplateBySubnet previousValue;
53         final SubnetInfoKeyDecorator subnetKey = EPTemplateUtil.buildSubnetInfoKey(key);
54         if (value != null) {
55             previousValue = subnetCache.put(subnetKey, value);
56         } else {
57             previousValue = subnetCache.remove(subnetKey);
58         }
59         return previousValue;
60     }
61
62     private EndpointForwardingTemplateBySubnet updatePlainCache(final @Nonnull IpPrefix key, final @Nullable EndpointForwardingTemplateBySubnet value) {
63         final EndpointForwardingTemplateBySubnet previousValue;
64         if (value != null) {
65             previousValue = plainCache.put(key, value);
66         } else {
67             previousValue = plainCache.remove(key);
68         }
69         return previousValue;
70     }
71
72     @Override
73     public Optional<EndpointForwardingTemplateBySubnet> find(@Nonnull final IpPrefix key) {
74         final Optional<EndpointForwardingTemplateBySubnet> template;
75         if (EPTemplateUtil.isPlain(key)) {
76             final Optional<EndpointForwardingTemplateBySubnet> fastPlain = Optional.fromNullable(plainCache.get(key));
77             if (fastPlain.isPresent()) {
78                 template = fastPlain;
79             } else {
80                 template = lookupSlowSubnet(key.getIpv4Prefix().getValue());
81             }
82         } else {
83             final SubnetInfoKeyDecorator keyDecorator = EPTemplateUtil.buildSubnetInfoKey(key);
84             final Optional<EndpointForwardingTemplateBySubnet> fastSubnet =
85                     Optional.fromNullable(subnetCache.get(keyDecorator));
86             if (fastSubnet.isPresent()) {
87                 template = fastSubnet;
88             } else {
89                 template = Optional.absent();
90             }
91         }
92         return template;
93     }
94
95     private Optional<EndpointForwardingTemplateBySubnet> lookupSlowSubnet(final String value) {
96         final String plainIp = IP_MASK_EATER_RE.matcher(value).replaceFirst("");
97         EndpointForwardingTemplateBySubnet valueCandidate = null;
98         int addressCount = 0;
99         for (Map.Entry<SubnetInfoKeyDecorator, EndpointForwardingTemplateBySubnet> entry : subnetCache.entrySet()) {
100             final SubnetUtils.SubnetInfo subnetInfo = entry.getKey().getDelegate();
101             if (subnetInfo.isInRange(plainIp)) {
102                 final int addressCountTmp = subnetInfo.getAddressCount();
103                 if (valueCandidate == null || addressCount > addressCountTmp) {
104                     valueCandidate = entry.getValue();
105                     addressCount = addressCountTmp;
106                 }
107             }
108         }
109         return Optional.fromNullable(valueCandidate);
110     }
111
112     @Override
113     public void invalidateCache() {
114         plainCache.clear();
115         subnetCache.clear();
116     }
117
118     @Override
119     public boolean isEmpty() {
120         return plainCache.isEmpty() && subnetCache.isEmpty();
121     }
122
123     @Override
124     public Iterable<EndpointForwardingTemplateBySubnet> values() {
125         return Iterables.unmodifiableIterable(Iterables.concat(plainCache.values(), subnetCache.values()));
126     }
127 }