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