Replace Preconditions.CheckNotNull per RequireNonNull
[bgpcep.git] / bgp / linkstate / src / main / java / org / opendaylight / protocol / bgp / linkstate / spi / pojo / SimpleNlriTypeRegistry.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.linkstate.spi.pojo;
10
11 import static java.util.Objects.requireNonNull;
12
13 import com.google.common.base.Preconditions;
14 import io.netty.buffer.ByteBuf;
15 import io.netty.buffer.Unpooled;
16 import java.util.HashMap;
17 import java.util.Map;
18 import org.opendaylight.protocol.bgp.linkstate.spi.LinkstateTlvParser;
19 import org.opendaylight.protocol.bgp.linkstate.spi.NlriTypeCaseParser;
20 import org.opendaylight.protocol.bgp.linkstate.spi.NlriTypeCaseSerializer;
21 import org.opendaylight.protocol.bgp.linkstate.spi.TlvUtil;
22 import org.opendaylight.protocol.concepts.HandlerRegistry;
23 import org.opendaylight.protocol.concepts.MultiRegistry;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.ObjectType;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.destination.CLinkstateDestination;
26 import org.opendaylight.yangtools.yang.common.QName;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
29
30 public final class SimpleNlriTypeRegistry {
31
32     private static final Logger LOG = LoggerFactory.getLogger(SimpleNlriTypeRegistry.class);
33     private static final SimpleNlriTypeRegistry SINGLETON = new SimpleNlriTypeRegistry();
34     private final HandlerRegistry<ObjectType, NlriTypeCaseParser, NlriTypeCaseSerializer> nlriRegistry = new HandlerRegistry<>();
35     private final MultiRegistry<QName, LinkstateTlvParser.LinkstateTlvSerializer<?>> tlvSerializers = new MultiRegistry<>();
36     private final MultiRegistry<Integer, LinkstateTlvParser<?>> tlvParsers = new MultiRegistry<>();
37
38     private SimpleNlriTypeRegistry() {
39     }
40
41     public static SimpleNlriTypeRegistry getInstance() {
42         return SINGLETON;
43     }
44
45     public AutoCloseable registerNlriParser(final int type, final NlriTypeCaseParser parser) {
46         return this.nlriRegistry.registerParser(type, parser);
47     }
48
49     public AutoCloseable registerNlriSerializer(final Class<? extends ObjectType> clazzType, final NlriTypeCaseSerializer serializer) {
50         return this.nlriRegistry.registerSerializer(clazzType, serializer);
51     }
52
53     public <T> AutoCloseable registerTlvParser(final int tlvType, final LinkstateTlvParser<T> parser) {
54         return this.tlvParsers.register(tlvType, parser);
55     }
56
57     public <T> AutoCloseable registerTlvSerializer(final QName tlvQName, final LinkstateTlvParser.LinkstateTlvSerializer<T> serializer) {
58         return this.tlvSerializers.register(tlvQName, serializer);
59     }
60
61     public CLinkstateDestination parseNlriType(final ByteBuf buffer) {
62         final int type = buffer.readUnsignedShort();
63         final int length = buffer.readUnsignedShort();
64         final NlriTypeCaseParser parser = this.nlriRegistry.getParser(type);
65         if (parser == null) {
66             LOG.warn("Linkstate NLRI parser for Type: {} was not found.", type);
67             return null;
68         }
69         return parser.parseTypeNlri(buffer.readSlice(length));
70     }
71
72     public void serializeNlriType(final CLinkstateDestination nlri, final ByteBuf byteAggregator) {
73         if (nlri == null) {
74             return;
75         }
76         requireNonNull(byteAggregator);
77         final ObjectType objectType = nlri.getObjectType();
78         final NlriTypeCaseSerializer serializer = this.nlriRegistry.getSerializer((Class<? extends ObjectType>) objectType.getImplementedInterface());
79         if (serializer == null) {
80             LOG.warn("Linkstate NLRI serializer for Type: {} was not found.", objectType.getImplementedInterface());
81         }
82         final ByteBuf nlriType = Unpooled.buffer();
83         serializer.serializeTypeNlri(nlri, nlriType);
84         TlvUtil.writeTLV(serializer.getNlriType(), nlriType, byteAggregator);
85     }
86
87     public <T> T parseTlv(final ByteBuf buffer) {
88         return parseTlv(buffer, getParser(buffer));
89     }
90
91     public Map<QName, Object> parseSubTlvs(final ByteBuf buffer) {
92         final Map<QName, Object> tlvs = new HashMap<>();
93         while (buffer.isReadable()) {
94             final LinkstateTlvParser<?> tlvParser = getParser(buffer);
95             final Object tlvBody = parseTlv(buffer, tlvParser);
96             if (tlvBody != null) {
97                 tlvs.put(tlvParser.getTlvQName(), tlvBody);
98             }
99         }
100         return tlvs;
101     }
102
103     private <T> LinkstateTlvParser<T> getParser(final ByteBuf buffer) {
104         Preconditions.checkArgument(buffer != null && buffer.isReadable());
105         final int type = buffer.readUnsignedShort();
106         final LinkstateTlvParser<T> parser = (LinkstateTlvParser<T>) this.tlvParsers.get(type);
107         if (parser == null) {
108             LOG.warn("Linkstate TLV parser for Type: {} was not found.", type);
109         }
110         return parser;
111     }
112
113     private static <T> T parseTlv(final ByteBuf buffer, final LinkstateTlvParser<T> parser) {
114         if (parser == null) {
115             return null;
116         }
117         Preconditions.checkArgument(buffer != null && buffer.isReadable());
118         final int length = buffer.readUnsignedShort();
119         return parser.parseTlvBody(buffer.readSlice(length));
120     }
121
122
123     public <T> void serializeTlv(final QName tlvQName, final T tlv, final ByteBuf buffer) {
124         if (tlv == null) {
125             return;
126         }
127         requireNonNull(tlvQName);
128         requireNonNull(buffer);
129         final LinkstateTlvParser.LinkstateTlvSerializer<T> tlvSerializer = (LinkstateTlvParser.LinkstateTlvSerializer<T>) this.tlvSerializers.get(tlvQName);
130         if (tlvSerializer == null) {
131             LOG.warn("Linkstate TLV serializer for QName: {} was not found.", tlvQName);
132             return;
133         }
134         final ByteBuf body = Unpooled.buffer();
135         tlvSerializer.serializeTlvBody(tlv, body);
136         TlvUtil.writeTLV(tlvSerializer.getType(), body, buffer);
137     }
138 }