2 * Copyright (c) 2016 AT&T 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.linkstate.nlri;
10 import com.google.common.annotations.VisibleForTesting;
11 import com.google.common.base.Preconditions;
12 import io.netty.buffer.ByteBuf;
13 import java.util.concurrent.ConcurrentHashMap;
14 import java.util.concurrent.ConcurrentMap;
15 import org.opendaylight.protocol.bgp.parser.BGPParsingException;
16 import org.opendaylight.protocol.concepts.AbstractRegistration;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.NlriType;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.NodeIdentifier;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.ObjectType;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.destination.CLinkstateDestination;
21 import org.slf4j.Logger;
22 import org.slf4j.LoggerFactory;
24 public final class SimpleNlriTypeRegistry {
26 private static final Logger LOG = LoggerFactory.getLogger(SimpleNlriTypeRegistry.class);
28 private final ConcurrentMap<NlriType, NlriTypeCaseParser> parsers = new ConcurrentHashMap<>();
29 private final ConcurrentMap<Class<? extends ObjectType>, NlriTypeCaseSerializer> serializers = new ConcurrentHashMap<>();
30 private static final SimpleNlriTypeRegistry SINGLETON = new SimpleNlriTypeRegistry();
32 private SimpleNlriTypeRegistry () {
36 public static SimpleNlriTypeRegistry getInstance() {
40 public synchronized AutoCloseable registerNlriTypeSerializer(final Class<? extends ObjectType> classKey, final NlriTypeCaseSerializer serializer) {
41 this.serializers.put(classKey, serializer);
43 final Object lock = this;
44 return new AbstractRegistration() {
46 protected void removeRegistration() {
48 SimpleNlriTypeRegistry.this.serializers.remove(classKey);
55 public synchronized AutoCloseable registerNlriTypeParser(final NlriType key, final NlriTypeCaseParser parser) {
56 this.parsers.put(key, parser);
58 final Object lock = this;
59 return new AbstractRegistration() {
61 protected void removeRegistration() {
63 SimpleNlriTypeRegistry.this.parsers.remove(key);
71 public NlriTypeCaseSerializer getSerializer(Class<? extends ObjectType> objtyp) {
72 return this.serializers.get(objtyp);
76 public NlriTypeCaseParser getParser(NlriType nlrityp) {
77 return this.parsers.get(nlrityp);
81 public ObjectType parseNlriType (final ByteBuf buffer, final NlriType type, final NodeIdentifier localdescriptor, final ByteBuf restBuffer) throws BGPParsingException {
82 final NlriTypeCaseParser parser = this.parsers.get(type);
83 Preconditions.checkNotNull(parser, "Parser for Nlri type %s not found.", type);
84 ObjectType nlriObjectType = parser.parseTypeNlri(buffer, type, localdescriptor, restBuffer);
85 return nlriObjectType;
88 public NlriType serializeNlriType (final CLinkstateDestination destination, final ByteBuf localdesc, final ByteBuf byteAggregator) {
89 final NlriTypeCaseSerializer serializer = this.serializers.get(destination.getObjectType().getImplementedInterface());
90 Preconditions.checkNotNull(serializer, "Serializer for %s not found.", destination.getObjectType().getImplementedInterface().getSimpleName());
91 NlriType nlriTypeVal = serializer.serializeTypeNlri(destination, localdesc, byteAggregator);
92 if (nlriTypeVal == null) {
93 LOG.warn("NLRI Type value is null.");