Bump MDSAL to 4.0.0
[bgpcep.git] / bgp / extensions / evpn / src / main / java / org / opendaylight / protocol / bgp / evpn / spi / pojo / SimpleEsiTypeRegistry.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.base.Preconditions;
13 import com.google.common.collect.Iterables;
14 import io.netty.buffer.ByteBuf;
15 import org.opendaylight.protocol.bgp.evpn.spi.EsiParser;
16 import org.opendaylight.protocol.bgp.evpn.spi.EsiRegistry;
17 import org.opendaylight.protocol.bgp.evpn.spi.EsiSerializer;
18 import org.opendaylight.protocol.concepts.HandlerRegistry;
19 import org.opendaylight.protocol.concepts.MultiRegistry;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev180329.EsiType;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev180329.esi.Esi;
22 import org.opendaylight.yangtools.concepts.Registration;
23 import org.opendaylight.yangtools.yang.binding.DataContainer;
24 import org.opendaylight.yangtools.yang.common.QName;
25 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
26 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
27 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31 public final class SimpleEsiTypeRegistry implements EsiRegistry {
32     private static final Logger LOG = LoggerFactory.getLogger(SimpleEsiTypeRegistry.class);
33     private static final SimpleEsiTypeRegistry SINGLETON = new SimpleEsiTypeRegistry();
34     private static final int CONTENT_LENGTH = 10;
35     private static final int ESI_LENGTH = 9;
36     private final HandlerRegistry<DataContainer, EsiParser, EsiSerializer> handlers = new HandlerRegistry<>();
37     private final MultiRegistry<NodeIdentifier, EsiSerializer> modelHandlers = new MultiRegistry<>();
38
39     private SimpleEsiTypeRegistry() {
40     }
41
42     public static SimpleEsiTypeRegistry getInstance() {
43         return SINGLETON;
44     }
45
46     public Registration registerEsiParser(final EsiType esiType, final EsiParser parser) {
47         return this.handlers.registerParser(esiType.getIntValue(), parser);
48     }
49
50     public Registration registerEsiSerializer(final Class<? extends Esi> esiType, final EsiSerializer serializer) {
51         return this.handlers.registerSerializer(esiType, serializer);
52     }
53
54     public Registration registerEsiModelSerializer(final QName qname, final EsiSerializer serializer) {
55         return this.modelHandlers.register(new NodeIdentifier(qname), serializer);
56     }
57
58     @Override
59     public Esi parseEsi(final ByteBuf buffer) {
60         checkArgument(buffer != null && buffer.isReadable(), "Array of bytes is mandatory. Can't be null or empty.");
61         checkArgument(buffer.readableBytes() == CONTENT_LENGTH,
62                 "Wrong length of array of bytes. Passed: %s;", buffer.readableBytes());
63
64         final EsiParser parser = this.handlers.getParser(EsiType.forValue(buffer.readByte()).getIntValue());
65         if (parser == null) {
66             return null;
67         }
68         return parser.parseEsi(buffer.readSlice(ESI_LENGTH));
69     }
70
71     @Override
72     public Esi parseEsiModel(final ChoiceNode esiChoice) {
73         Preconditions.checkArgument(esiChoice != null && !esiChoice.getValue().isEmpty(),
74                 "ESI is mandatory. Can't be null or empty.");
75         final ContainerNode cont = (ContainerNode) Iterables.getOnlyElement(esiChoice.getValue());
76         final EsiSerializer serializer = this.modelHandlers.get(cont.getIdentifier());
77         if (serializer != null) {
78             return serializer.serializeEsi(cont);
79         }
80
81         LOG.warn("Unrecognized ESI {}", esiChoice);
82         return null;
83     }
84
85     @Override
86     public void serializeEsi(final Esi esi, final ByteBuf buffer) {
87         final EsiSerializer serializer = this.handlers.getSerializer(esi.implementedInterface());
88         if (serializer == null) {
89             return;
90         }
91         serializer.serializeEsi(esi, buffer);
92     }
93 }