BGPCEP-754: Rework EffectiveRibInWriter
[bgpcep.git] / bgp / openconfig-rp-spi / src / main / java / org / opendaylight / protocol / bgp / openconfig / routing / policy / spi / registry / ConditionsRegistryImpl.java
1 /*
2  * Copyright (c) 2018 AT&T Intellectual Property. 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.protocol.bgp.openconfig.routing.policy.spi.registry;
10
11 import com.google.common.base.Preconditions;
12 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
13 import java.util.HashMap;
14 import java.util.Map;
15 import javax.annotation.concurrent.GuardedBy;
16 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
17 import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.RouteEntryBaseAttributes;
18 import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.policy.condition.BgpConditionsAugmentationPolicy;
19 import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.policy.condition.BgpConditionsPolicy;
20 import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.policy.condition.ConditionsAugPolicy;
21 import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryExportParameters;
22 import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryImportParameters;
23 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.BgpMatchConditions;
24 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.routing.policy.policy.definitions.policy.definition.statements.statement.conditions.BgpConditions;
25 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.routing.policy.top.routing.policy.policy.definitions.policy.definition.statements.statement.Conditions;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.path.attributes.Attributes;
27 import org.opendaylight.yangtools.concepts.AbstractRegistration;
28 import org.opendaylight.yangtools.yang.binding.Augmentation;
29 import org.opendaylight.yangtools.yang.binding.ChildOf;
30 import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
31
32 @SuppressFBWarnings("NM_CONFUSING")
33 final class ConditionsRegistryImpl {
34     @GuardedBy("this")
35     private final Map<Class<? extends Augmentation<Conditions>>, ConditionsAugPolicy> conditionsRegistry
36             = new HashMap<>();
37     //TODO Implement match prefix
38     //private final GenericConditionPolicyHandler genericConditionHandler;
39     private BgpConditionsRegistry bgpConditionsRegistry = new BgpConditionsRegistry();
40
41     ConditionsRegistryImpl(final DataBroker databroker) {
42     //    this.genericConditionHandler = new GenericConditionPolicyHandler(databroker);
43     }
44
45     AbstractRegistration registerConditionPolicy(final Class<? extends Augmentation<Conditions>> conditionPolicyClass,
46             final ConditionsAugPolicy conditionPolicy) {
47         synchronized (this.conditionsRegistry) {
48             final ConditionsAugPolicy prev = this.conditionsRegistry.putIfAbsent(conditionPolicyClass, conditionPolicy);
49             Preconditions.checkState(prev == null, "Condition Policy %s already registered %s",
50                     conditionPolicyClass, prev);
51             return new AbstractRegistration() {
52                 @Override
53                 protected void removeRegistration() {
54                     synchronized (ConditionsRegistryImpl.this.conditionsRegistry) {
55                         ConditionsRegistryImpl.this.conditionsRegistry.remove(conditionPolicyClass);
56                     }
57                 }
58             };
59         }
60     }
61
62     public AbstractRegistration registerBgpConditionsAugmentationPolicy(
63             final Class<? extends Augmentation<BgpConditions>> conditionPolicyClass,
64             final BgpConditionsAugmentationPolicy conditionPolicy) {
65         return this.bgpConditionsRegistry
66                 .registerBgpConditionsAugmentationPolicy(conditionPolicyClass, conditionPolicy);
67     }
68
69     public <T extends ChildOf<BgpMatchConditions>, N> AbstractRegistration registerBgpConditionsPolicy(
70             final Class<T> conditionPolicyClass,
71             final BgpConditionsPolicy<T, N> conditionPolicy) {
72         return this.bgpConditionsRegistry
73                 .registerBgpConditionsPolicy(conditionPolicyClass, conditionPolicy);
74     }
75
76     @SuppressWarnings("unchecked")
77     boolean matchExportConditions(
78             final RouteEntryBaseAttributes entryInfo,
79             final BGPRouteEntryExportParameters routeEntryExportParameters,
80             final Attributes attributes,
81             final Conditions conditions) {
82       /*  if (!this.genericConditionHandler
83                 .matchExportCondition(routeEntryExportParameters, conditions)) {
84             return false;
85         }*/
86
87         if (!this.bgpConditionsRegistry
88                 .matchExportConditions(entryInfo, routeEntryExportParameters, attributes, conditions)) {
89             return false;
90         }
91
92         final Map<Class<? extends Augmentation<?>>, Augmentation<?>> conditionsAug = BindingReflections
93                 .getAugmentations(conditions);
94
95         if (conditionsAug != null) {
96             for (final Map.Entry<Class<? extends Augmentation<?>>, Augmentation<?>> entry : conditionsAug.entrySet()) {
97                 final ConditionsAugPolicy handler = this.conditionsRegistry.get(entry.getKey());
98                 if (handler == null) {
99                     continue;
100                 }
101                 if (!handler.matchExportCondition(entryInfo, routeEntryExportParameters,
102                         handler.getConditionParameter(attributes), entry.getValue())) {
103                     return false;
104                 }
105             }
106         }
107
108         return true;
109     }
110
111     @SuppressWarnings("unchecked")
112     boolean matchImportConditions(
113             final RouteEntryBaseAttributes entryInfo,
114             final BGPRouteEntryImportParameters routeEntryImportParameters,
115             final Attributes attributes,
116             final Conditions conditions) {
117         /*if (!this.genericConditionHandler
118                 .matchImportCondition(routeEntryImportParameters, conditions)) {
119             return false;
120         }*/
121
122         if (!this.bgpConditionsRegistry
123                 .matchImportConditions(entryInfo, routeEntryImportParameters, attributes, conditions)) {
124             return false;
125         }
126
127         final Map<Class<? extends Augmentation<?>>, Augmentation<?>> conditionsAug = BindingReflections
128                 .getAugmentations(conditions);
129
130         if (conditionsAug != null && attributes != null) {
131             for (final Map.Entry<Class<? extends Augmentation<?>>, Augmentation<?>> entry : conditionsAug.entrySet()) {
132                 final ConditionsAugPolicy handler = this.conditionsRegistry.get(entry.getKey());
133                 if (handler != null) {
134                     final Augmentation<Conditions> conditionConfig = (Augmentation<Conditions>) entry.getValue();
135                     if (!handler.matchImportCondition(entryInfo, routeEntryImportParameters,
136                             handler.getConditionParameter(attributes), conditionConfig)) {
137                         return false;
138                     }
139                 }
140             }
141         }
142         return true;
143     }
144 }