Use moved BindingReflections
[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 package org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.registry;
9
10 import com.google.common.base.Preconditions;
11 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
12 import java.util.HashMap;
13 import java.util.Map;
14 import javax.annotation.concurrent.GuardedBy;
15 import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
16 import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.RouteEntryBaseAttributes;
17 import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.policy.condition.BgpConditionsAugmentationPolicy;
18 import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.policy.condition.BgpConditionsPolicy;
19 import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.policy.condition.ConditionsAugPolicy;
20 import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryExportParameters;
21 import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryImportParameters;
22 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.BgpMatchConditions;
23 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.routing.policy.policy.definitions.policy.definition.statements.statement.conditions.BgpConditions;
24 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType;
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.rev180329.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
31 @SuppressFBWarnings("NM_CONFUSING")
32 final class ConditionsRegistryImpl {
33     @GuardedBy("this")
34     private final Map<Class<? extends Augmentation<Conditions>>, ConditionsAugPolicy> conditionsRegistry
35             = new HashMap<>();
36     private final BgpConditionsRegistry bgpConditionsRegistry = new BgpConditionsRegistry();
37
38     ConditionsRegistryImpl() {
39     }
40
41     AbstractRegistration registerConditionPolicy(final Class<? extends Augmentation<Conditions>> conditionPolicyClass,
42             final ConditionsAugPolicy conditionPolicy) {
43         synchronized (this.conditionsRegistry) {
44             final ConditionsAugPolicy prev = this.conditionsRegistry.putIfAbsent(conditionPolicyClass, conditionPolicy);
45             Preconditions.checkState(prev == null, "Condition Policy %s already registered %s",
46                     conditionPolicyClass, prev);
47             return new AbstractRegistration() {
48                 @Override
49                 protected void removeRegistration() {
50                     synchronized (ConditionsRegistryImpl.this.conditionsRegistry) {
51                         ConditionsRegistryImpl.this.conditionsRegistry.remove(conditionPolicyClass);
52                     }
53                 }
54             };
55         }
56     }
57
58     public AbstractRegistration registerBgpConditionsAugmentationPolicy(
59             final Class<? extends Augmentation<BgpConditions>> conditionPolicyClass,
60             final BgpConditionsAugmentationPolicy conditionPolicy) {
61         return this.bgpConditionsRegistry
62                 .registerBgpConditionsAugmentationPolicy(conditionPolicyClass, conditionPolicy);
63     }
64
65     public <T extends ChildOf<BgpMatchConditions>, N> AbstractRegistration registerBgpConditionsPolicy(
66             final Class<T> conditionPolicyClass,
67             final BgpConditionsPolicy<T, N> conditionPolicy) {
68         return this.bgpConditionsRegistry
69                 .registerBgpConditionsPolicy(conditionPolicyClass, conditionPolicy);
70     }
71
72     @SuppressWarnings("unchecked")
73     boolean matchExportConditions(
74             final Class<? extends AfiSafiType> afiSafi,
75             final RouteEntryBaseAttributes entryInfo,
76             final BGPRouteEntryExportParameters routeEntryExportParameters,
77             final Attributes attributes,
78             final Conditions conditions) {
79
80         if (!this.bgpConditionsRegistry
81                 .matchExportConditions(afiSafi, entryInfo, routeEntryExportParameters, attributes, conditions)) {
82             return false;
83         }
84
85         final Map<Class<? extends Augmentation<?>>, Augmentation<?>> conditionsAug = BindingReflections
86                 .getAugmentations(conditions);
87
88         if (conditionsAug != null) {
89             for (final Map.Entry<Class<? extends Augmentation<?>>, Augmentation<?>> entry : conditionsAug.entrySet()) {
90                 final ConditionsAugPolicy handler = this.conditionsRegistry.get(entry.getKey());
91                 if (handler == null) {
92                     continue;
93                 }
94                 if (!handler.matchExportCondition(afiSafi, entryInfo, routeEntryExportParameters,
95                         handler.getConditionParameter(attributes), entry.getValue())) {
96                     return false;
97                 }
98             }
99         }
100
101         return true;
102     }
103
104     @SuppressWarnings("unchecked")
105     boolean matchImportConditions(
106             final Class<? extends AfiSafiType> afiSafi, final RouteEntryBaseAttributes entryInfo,
107             final BGPRouteEntryImportParameters routeEntryImportParameters,
108             final Attributes attributes,
109             final Conditions conditions) {
110         if (!this.bgpConditionsRegistry
111                 .matchImportConditions(afiSafi, entryInfo, routeEntryImportParameters, attributes, conditions)) {
112             return false;
113         }
114
115         final Map<Class<? extends Augmentation<?>>, Augmentation<?>> conditionsAug = BindingReflections
116                 .getAugmentations(conditions);
117
118         if (conditionsAug != null && attributes != null) {
119             for (final Map.Entry<Class<? extends Augmentation<?>>, Augmentation<?>> entry : conditionsAug.entrySet()) {
120                 final ConditionsAugPolicy handler = this.conditionsRegistry.get(entry.getKey());
121                 if (handler != null) {
122                     final Augmentation<Conditions> conditionConfig = (Augmentation<Conditions>) entry.getValue();
123                     if (!handler.matchImportCondition(afiSafi, entryInfo, routeEntryImportParameters,
124                             handler.getConditionParameter(attributes), conditionConfig)) {
125                         return false;
126                     }
127                 }
128             }
129         }
130         return true;
131     }
132 }