BUG-4692: Migrate TCP-MD5 support in bgp package to netty's native-epoll
[bgpcep.git] / bgp / linkstate / src / main / java / org / opendaylight / protocol / bgp / linkstate / nlri / SimpleNlriTypeRegistry.java
1 /*
2  * Copyright (c) 2016 AT&T 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.linkstate.nlri;
9
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;
23
24 public final class SimpleNlriTypeRegistry {
25
26     private static final Logger LOG = LoggerFactory.getLogger(SimpleNlriTypeRegistry.class);
27
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();
31
32     private SimpleNlriTypeRegistry () {
33
34     }
35
36     public static SimpleNlriTypeRegistry getInstance() {
37         return SINGLETON;
38     }
39
40     public synchronized AutoCloseable registerNlriTypeSerializer(final Class<? extends ObjectType> classKey, final NlriTypeCaseSerializer serializer) {
41         this.serializers.put(classKey, serializer);
42
43         final Object lock = this;
44         return new AbstractRegistration() {
45             @Override
46             protected void removeRegistration() {
47                 synchronized (lock) {
48                     SimpleNlriTypeRegistry.this.serializers.remove(classKey);
49                 }
50             }
51         };
52
53     }
54
55     public synchronized AutoCloseable registerNlriTypeParser(final NlriType key, final NlriTypeCaseParser parser) {
56         this.parsers.put(key, parser);
57
58         final Object lock = this;
59         return new AbstractRegistration() {
60             @Override
61             protected void removeRegistration() {
62                 synchronized (lock) {
63                     SimpleNlriTypeRegistry.this.parsers.remove(key);
64                 }
65             }
66         };
67
68     }
69
70     @VisibleForTesting
71     public NlriTypeCaseSerializer getSerializer(Class<? extends ObjectType> objtyp) {
72         return this.serializers.get(objtyp);
73     }
74
75     @VisibleForTesting
76     public NlriTypeCaseParser getParser(NlriType nlrityp) {
77         return this.parsers.get(nlrityp);
78     }
79
80
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;
86     }
87
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.");
94         }
95         return nlriTypeVal;
96     }
97 }