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
9 package org.opendaylight.protocol.bgp.evpn.spi.pojo;
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;
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<>();
37 private SimpleEsiTypeRegistry() {
40 public static SimpleEsiTypeRegistry getInstance() {
44 public AutoCloseable registerEsiParser(final EsiType esiType, final EsiParser parser) {
45 return this.handlers.registerParser(esiType.getIntValue(), parser);
48 public AutoCloseable registerEsiSerializer(final Class<? extends Esi> esiType, final EsiSerializer serializer) {
49 return this.handlers.registerSerializer(esiType, serializer);
52 public AutoCloseable registerEsiModelSerializer(final QName qname, final EsiSerializer serializer) {
53 return this.modelHandlers.register(new NodeIdentifier(qname), serializer);
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() + ";");
63 final EsiParser parser = this.handlers.getParser(EsiType.forValue(buffer.readByte()).getIntValue());
67 return parser.parseEsi(buffer.readSlice(ESI_LENGTH));
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);
80 LOG.warn("Unrecognized ESI {}", esiChoice);
85 public void serializeEsi(final Esi esi, final ByteBuf buffer) {
86 final EsiSerializer serializer = this.handlers.getSerializer(esi.getImplementedInterface());
87 if (serializer == null) {
90 serializer.serializeEsi(esi, buffer);