Do not populate SimpleNlriTypeRegistry from BGPActivator
[bgpcep.git] / bgp / extensions / evpn / src / main / java / org / opendaylight / protocol / bgp / evpn / spi / pojo / SimpleEvpnNlriRegistry.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.protocol.bgp.evpn.spi.pojo;
9
10 import static com.google.common.base.Preconditions.checkArgument;
11
12 import com.google.common.collect.Iterables;
13 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
14 import io.netty.buffer.ByteBuf;
15 import java.util.Collection;
16 import org.opendaylight.protocol.bgp.evpn.spi.EvpnParser;
17 import org.opendaylight.protocol.bgp.evpn.spi.EvpnRegistry;
18 import org.opendaylight.protocol.bgp.evpn.spi.EvpnSerializer;
19 import org.opendaylight.protocol.concepts.HandlerRegistry;
20 import org.opendaylight.protocol.concepts.MultiRegistry;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev200120.NlriType;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev200120.evpn.EvpnChoice;
23 import org.opendaylight.yangtools.concepts.Registration;
24 import org.opendaylight.yangtools.yang.binding.DataContainer;
25 import org.opendaylight.yangtools.yang.common.QName;
26 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
27 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
28 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
29 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
30 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
31
32 public final class SimpleEvpnNlriRegistry implements EvpnRegistry {
33     private static final SimpleEvpnNlriRegistry SINGLETON = new SimpleEvpnNlriRegistry();
34     private final HandlerRegistry<DataContainer, EvpnParser, EvpnSerializer> handlers = new HandlerRegistry<>();
35     private final MultiRegistry<NodeIdentifier, EvpnSerializer> modelHandlers = new MultiRegistry<>();
36
37     private SimpleEvpnNlriRegistry() {
38     }
39
40     @FunctionalInterface
41     private interface SerializerInterface {
42         EvpnChoice check(EvpnSerializer serializer, ContainerNode cont);
43     }
44
45     public static SimpleEvpnNlriRegistry getInstance() {
46         return SINGLETON;
47     }
48
49     public Registration registerNlriParser(final NlriType esiType, final EvpnParser parser) {
50         return this.handlers.registerParser(esiType.getIntValue(), parser);
51     }
52
53     public Registration registerNlriSerializer(final Class<? extends EvpnChoice> evpnClass,
54             final EvpnSerializer serializer) {
55         return this.handlers.registerSerializer(evpnClass, serializer);
56     }
57
58     public Registration registerNlriModelSerializer(final QName qname, final EvpnSerializer serializer) {
59         return this.modelHandlers.register(new NodeIdentifier(qname), serializer);
60     }
61
62     @Override
63     @SuppressFBWarnings(value = "NP_NONNULL_RETURN_VIOLATION", justification = "SB does not grok TYPE_USE")
64     public EvpnChoice parseEvpn(final NlriType type, final ByteBuf buffer) {
65         checkArgument(buffer != null && buffer.isReadable(), "Array of bytes is mandatory. Can't be null or empty.");
66         final EvpnParser parser = this.handlers.getParser(type.getIntValue());
67         return parser == null ? null : parser.parseEvpn(buffer);
68     }
69
70     @Override
71     public ByteBuf serializeEvpn(final EvpnChoice evpn, final ByteBuf common) {
72         final EvpnSerializer serializer = this.handlers.getSerializer(evpn.implementedInterface());
73         return serializer == null ? common : serializer.serializeEvpn(evpn, common);
74     }
75
76     @Override
77     public EvpnChoice serializeEvpnModel(final ChoiceNode evpnChoice) {
78         return getEvpnCase(evpnChoice, EvpnSerializer::serializeEvpnModel);
79     }
80
81     @Override
82     public EvpnChoice serializeEvpnRouteKey(final ChoiceNode evpnChoice) {
83         return getEvpnCase(evpnChoice, EvpnSerializer::createRouteKey);
84     }
85
86     private EvpnChoice getEvpnCase(final ChoiceNode evpnChoice, final SerializerInterface serializerInterface) {
87         checkArgument(evpnChoice != null, "Evpn case is mandatory, cannot be null");
88         final Collection<DataContainerChild<? extends PathArgument, ?>> value = evpnChoice.getValue();
89         checkArgument(!value.isEmpty(), "Evpn case is mandatyr, cannot be empty");
90         final ContainerNode cont = (ContainerNode) Iterables.getOnlyElement(value);
91         final EvpnSerializer serializer = this.modelHandlers.get(cont.getIdentifier());
92         return serializer == null ? null : serializerInterface.check(serializer, cont);
93     }
94 }