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.evpn.spi.pojo;
10 import static com.google.common.base.Preconditions.checkArgument;
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;
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<>();
39 private SimpleEsiTypeRegistry() {
42 public static SimpleEsiTypeRegistry getInstance() {
46 public Registration registerEsiParser(final EsiType esiType, final EsiParser parser) {
47 return this.handlers.registerParser(esiType.getIntValue(), parser);
50 public Registration registerEsiSerializer(final Class<? extends Esi> esiType, final EsiSerializer serializer) {
51 return this.handlers.registerSerializer(esiType, serializer);
54 public Registration registerEsiModelSerializer(final QName qname, final EsiSerializer serializer) {
55 return this.modelHandlers.register(new NodeIdentifier(qname), serializer);
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());
64 final EsiParser parser = this.handlers.getParser(EsiType.forValue(buffer.readByte()).getIntValue());
68 return parser.parseEsi(buffer.readSlice(ESI_LENGTH));
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);
81 LOG.warn("Unrecognized ESI {}", esiChoice);
86 public void serializeEsi(final Esi esi, final ByteBuf buffer) {
87 final EsiSerializer serializer = this.handlers.getSerializer(esi.getImplementedInterface());
88 if (serializer == null) {
91 serializer.serializeEsi(esi, buffer);