Populate SimpleBindingSubTlvsRegistry statically
[bgpcep.git] / bgp / extensions / linkstate / src / main / java / org / opendaylight / protocol / bgp / linkstate / spi / pojo / SimpleBindingSubTlvsRegistry.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.linkstate.spi.pojo;
9
10 import io.netty.buffer.ByteBuf;
11 import java.util.ArrayList;
12 import java.util.List;
13 import org.eclipse.jdt.annotation.NonNull;
14 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.BackupUnnumberedParser;
15 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.EroMetricParser;
16 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv4BackupEro;
17 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv4EroParser;
18 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv4PrefixSidParser;
19 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv6BackupEro;
20 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv6EroParser;
21 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv6PrefixSidParser;
22 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.SIDParser;
23 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.UnnumberedEroParser;
24 import org.opendaylight.protocol.bgp.linkstate.spi.BindingSubTlvsParser;
25 import org.opendaylight.protocol.bgp.linkstate.spi.BindingSubTlvsSerializer;
26 import org.opendaylight.protocol.concepts.HandlerRegistry;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.ProtocolId;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sid.tlv.BindingSubTlvs;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sid.tlv.BindingSubTlvsBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.BindingSubTlv;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.EroMetricCase;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.Ipv4EroBackupCase;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.Ipv4EroCase;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.Ipv6EroBackupCase;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.Ipv6EroCase;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.Ipv6PrefixSidCase;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.PrefixSidCase;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.SidLabelCase;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.UnnumberedInterfaceIdBackupEroCase;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.UnnumberedInterfaceIdEroCase;
41 import org.opendaylight.yangtools.yang.binding.DataContainer;
42 import org.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
44
45 public final class SimpleBindingSubTlvsRegistry {
46     private static final Logger LOG = LoggerFactory.getLogger(SimpleBindingSubTlvsRegistry.class);
47     private static final @NonNull SimpleBindingSubTlvsRegistry INSTANCE = new SimpleBindingSubTlvsRegistry();
48
49     private final HandlerRegistry<DataContainer, BindingSubTlvsParser, BindingSubTlvsSerializer> handlers =
50             new HandlerRegistry<>();
51
52     private SimpleBindingSubTlvsRegistry() {
53         final SIDParser sidParser = new SIDParser();
54         handlers.registerParser(sidParser.getType(), sidParser);
55         handlers.registerSerializer(SidLabelCase.class, sidParser);
56
57         final Ipv4PrefixSidParser prefixSidParser = new Ipv4PrefixSidParser();
58         handlers.registerParser(prefixSidParser.getType(), prefixSidParser);
59         handlers.registerSerializer(PrefixSidCase.class, prefixSidParser);
60
61         final Ipv6PrefixSidParser ipv6PrefixSidParser = new Ipv6PrefixSidParser();
62         handlers.registerParser(ipv6PrefixSidParser.getType(), ipv6PrefixSidParser);
63         handlers.registerSerializer(Ipv6PrefixSidCase.class, ipv6PrefixSidParser);
64
65         final EroMetricParser eroMetricParser = new EroMetricParser();
66         handlers.registerParser(eroMetricParser.getType(), eroMetricParser);
67         handlers.registerSerializer(EroMetricCase.class, eroMetricParser);
68
69         final Ipv4EroParser ipv4EroParser = new Ipv4EroParser();
70         handlers.registerParser(ipv4EroParser.getType(), ipv4EroParser);
71         handlers.registerSerializer(Ipv4EroCase.class, ipv4EroParser);
72
73         final Ipv4BackupEro ipv4BackupEro = new Ipv4BackupEro();
74         handlers.registerParser(ipv4BackupEro.getType(), ipv4BackupEro);
75         handlers.registerSerializer(Ipv4EroBackupCase.class, ipv4BackupEro);
76
77         final Ipv6EroParser ipv6EroParser = new Ipv6EroParser();
78         handlers.registerParser(ipv6EroParser.getType(), ipv6EroParser);
79         handlers.registerSerializer(Ipv6EroCase.class, ipv6EroParser);
80
81         final Ipv6BackupEro ipv6BackupEro = new Ipv6BackupEro();
82         handlers.registerParser(ipv6BackupEro.getType(), ipv6BackupEro);
83         handlers.registerSerializer(Ipv6EroBackupCase.class, ipv6BackupEro);
84
85         final UnnumberedEroParser unnumberedEroParser = new UnnumberedEroParser();
86         handlers.registerParser(unnumberedEroParser.getType(), unnumberedEroParser);
87         handlers.registerSerializer(UnnumberedInterfaceIdEroCase.class, unnumberedEroParser);
88
89         final BackupUnnumberedParser backupUnnumberedParser = new BackupUnnumberedParser();
90         handlers.registerParser(backupUnnumberedParser.getType(), backupUnnumberedParser);
91         handlers.registerSerializer(UnnumberedInterfaceIdBackupEroCase.class, backupUnnumberedParser);
92     }
93
94     public static @NonNull SimpleBindingSubTlvsRegistry getInstance() {
95         return INSTANCE;
96     }
97
98     public void serializeBindingSubTlvs(final List<BindingSubTlvs> bindingSubTlvs, final ByteBuf aggregator) {
99         if (bindingSubTlvs != null) {
100             for (final BindingSubTlvs subTlv : bindingSubTlvs) {
101                 final BindingSubTlv bindingSubTlv = subTlv.getBindingSubTlv();
102                 final BindingSubTlvsSerializer serializer = handlers.getSerializer(
103                     bindingSubTlv.implementedInterface());
104                 if (serializer == null) {
105                     LOG.info("Unknown binding sub Tlv type {}", subTlv);
106                     return;
107                 }
108                 serializer.serializeSubTlv(bindingSubTlv, aggregator);
109             }
110         }
111     }
112
113     public List<BindingSubTlvs> parseBindingSubTlvs(final ByteBuf buffer, final ProtocolId protocolId) {
114         final List<BindingSubTlvs> subTlvs = new ArrayList<>();
115         if (buffer != null) {
116             while (buffer.isReadable()) {
117                 final int type = buffer.readUnsignedShort();
118                 final int length = buffer.readUnsignedShort();
119                 final ByteBuf slice = buffer.readSlice(length);
120                 final BindingSubTlvsParser parser = this.handlers.getParser(type);
121                 if (parser == null) {
122                     return null;
123                 }
124                 subTlvs.add(new BindingSubTlvsBuilder().setBindingSubTlv(parser.parseSubTlv(slice, protocolId))
125                     .build());
126             }
127         }
128         return subTlvs;
129     }
130 }