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