2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.protocol.bgp.linkstate.spi.pojo;
10 import static com.google.common.base.Preconditions.checkArgument;
11 import static java.util.Objects.requireNonNull;
13 import io.netty.buffer.ByteBuf;
14 import io.netty.buffer.Unpooled;
15 import java.util.HashMap;
17 import org.opendaylight.protocol.bgp.linkstate.spi.LinkstateTlvParser;
18 import org.opendaylight.protocol.bgp.linkstate.spi.NlriTypeCaseParser;
19 import org.opendaylight.protocol.bgp.linkstate.spi.NlriTypeCaseSerializer;
20 import org.opendaylight.protocol.bgp.linkstate.spi.TlvUtil;
21 import org.opendaylight.protocol.concepts.HandlerRegistry;
22 import org.opendaylight.protocol.concepts.MultiRegistry;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.ObjectType;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.destination.CLinkstateDestination;
25 import org.opendaylight.yangtools.concepts.Registration;
26 import org.opendaylight.yangtools.yang.common.QName;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
30 public final class SimpleNlriTypeRegistry {
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 =
35 new HandlerRegistry<>();
36 private final MultiRegistry<QName, LinkstateTlvParser.LinkstateTlvSerializer<?>> tlvSerializers =
37 new MultiRegistry<>();
38 private final MultiRegistry<Integer, LinkstateTlvParser<?>> tlvParsers = new MultiRegistry<>();
40 private SimpleNlriTypeRegistry() {
43 public static SimpleNlriTypeRegistry getInstance() {
47 public Registration registerNlriParser(final int type, final NlriTypeCaseParser parser) {
48 return this.nlriRegistry.registerParser(type, parser);
51 public Registration registerNlriSerializer(final Class<? extends ObjectType> clazzType,
52 final NlriTypeCaseSerializer serializer) {
53 return this.nlriRegistry.registerSerializer(clazzType, serializer);
56 public <T> Registration registerTlvParser(final int tlvType, final LinkstateTlvParser<T> parser) {
57 return this.tlvParsers.register(tlvType, parser);
60 public <T> Registration registerTlvSerializer(final QName tlvQName,
61 final LinkstateTlvParser.LinkstateTlvSerializer<T> serializer) {
62 return this.tlvSerializers.register(tlvQName, serializer);
65 public CLinkstateDestination parseNlriType(final ByteBuf buffer) {
66 final int type = buffer.readUnsignedShort();
67 final int length = buffer.readUnsignedShort();
68 final NlriTypeCaseParser parser = this.nlriRegistry.getParser(type);
70 LOG.warn("Linkstate NLRI parser for Type: {} was not found.", type);
73 return parser.parseTypeNlri(buffer.readSlice(length));
76 public void serializeNlriType(final CLinkstateDestination nlri, final ByteBuf byteAggregator) {
80 requireNonNull(byteAggregator);
81 final ObjectType objectType = nlri.getObjectType();
82 final NlriTypeCaseSerializer serializer = this.nlriRegistry
83 .getSerializer((Class<? extends ObjectType>) objectType.getImplementedInterface());
84 if (serializer == null) {
85 LOG.warn("Linkstate NLRI serializer for Type: {} was not found.", objectType.getImplementedInterface());
88 final ByteBuf nlriType = Unpooled.buffer();
89 serializer.serializeTypeNlri(nlri, nlriType);
90 TlvUtil.writeTLV(serializer.getNlriType(), nlriType, byteAggregator);
93 public <T> T parseTlv(final ByteBuf buffer) {
94 return parseTlv(buffer, getParser(buffer));
97 public Map<QName, Object> parseSubTlvs(final ByteBuf buffer) {
98 final Map<QName, Object> tlvs = new HashMap<>();
99 while (buffer.isReadable()) {
100 final LinkstateTlvParser<?> tlvParser = getParser(buffer);
101 final Object tlvBody = parseTlv(buffer, tlvParser);
102 if (tlvBody != null) {
103 tlvs.put(tlvParser.getTlvQName(), tlvBody);
109 private <T> LinkstateTlvParser<T> getParser(final ByteBuf buffer) {
110 checkArgument(buffer != null && buffer.isReadable());
111 final int type = buffer.readUnsignedShort();
112 final LinkstateTlvParser<T> parser = (LinkstateTlvParser<T>) this.tlvParsers.get(type);
113 if (parser == null) {
114 LOG.warn("Linkstate TLV parser for Type: {} was not found.", type);
119 private static <T> T parseTlv(final ByteBuf buffer, final LinkstateTlvParser<T> parser) {
120 if (parser == null) {
123 checkArgument(buffer != null && buffer.isReadable());
124 final int length = buffer.readUnsignedShort();
125 return parser.parseTlvBody(buffer.readSlice(length));
129 public <T> void serializeTlv(final QName tlvQName, final T tlv, final ByteBuf buffer) {
133 requireNonNull(tlvQName);
134 requireNonNull(buffer);
135 final LinkstateTlvParser.LinkstateTlvSerializer<T> tlvSerializer
136 = (LinkstateTlvParser.LinkstateTlvSerializer<T>) this.tlvSerializers.get(tlvQName);
137 if (tlvSerializer == null) {
138 LOG.warn("Linkstate TLV serializer for QName: {} was not found.", tlvQName);
141 final ByteBuf body = Unpooled.buffer();
142 tlvSerializer.serializeTlvBody(tlv, body);
143 TlvUtil.writeTLV(tlvSerializer.getType(), body, buffer);