Fix raw type warnings in bgp/bmp
[bgpcep.git] / bgp / rib-mock / src / main / java / org / opendaylight / protocol / bgp / rib / mock / EventBusRegistration.java
1 /*
2  * Copyright (c) 2013 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 package org.opendaylight.protocol.bgp.rib.mock;
9
10 import com.google.common.eventbus.EventBus;
11 import com.google.common.eventbus.Subscribe;
12 import io.netty.channel.ChannelHandlerContext;
13 import io.netty.util.concurrent.ScheduledFuture;
14 import java.util.ArrayList;
15 import java.util.Collections;
16 import java.util.HashSet;
17 import java.util.List;
18 import java.util.Set;
19 import java.util.concurrent.TimeUnit;
20 import org.opendaylight.protocol.bgp.parser.BGPDocumentedException;
21 import org.opendaylight.protocol.bgp.parser.BGPError;
22 import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl;
23 import org.opendaylight.protocol.bgp.parser.spi.PeerConstraint;
24 import org.opendaylight.protocol.bgp.rib.spi.BGPSession;
25 import org.opendaylight.protocol.bgp.rib.spi.BGPSessionListener;
26 import org.opendaylight.protocol.bgp.rib.spi.BGPTerminationReason;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.Keepalive;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.Open;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.open.message.BgpParameters;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.open.message.bgp.parameters.OptionalCapabilities;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.open.message.bgp.parameters.optional.capabilities.CParameters;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.BgpTableType;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.CParameters1;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.AddPathCapability;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.MultiprotocolCapability;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.add.path.capability.AddressFamilies;
39 import org.opendaylight.yangtools.concepts.AbstractListenerRegistration;
40 import org.opendaylight.yangtools.yang.binding.Notification;
41 import org.opendaylight.yangtools.yang.common.Uint32;
42 import org.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
44
45 /**
46  * This class has @Subscribe annotated methods which receive events from {@link EventBus} . Events are produced by
47  * {@link BGPMock}, and each instance notifies exactly one {@link BGPSessionListener}.
48  */
49 final class EventBusRegistration extends AbstractListenerRegistration<BGPSessionListener> {
50
51     private static final Logger LOG = LoggerFactory.getLogger(EventBusRegistration.class);
52
53     private final EventBus eventBus;
54
55     public static EventBusRegistration createAndRegister(final EventBus eventBus, final BGPSessionListener listener,
56             final List<Notification<?>> allPreviousMessages) {
57         final EventBusRegistration instance = new EventBusRegistration(eventBus, listener, allPreviousMessages);
58         eventBus.register(instance);
59         return instance;
60     }
61
62     private EventBusRegistration(final EventBus eventBus, final BGPSessionListener listener,
63             final List<Notification<?>> allPreviousMessages) {
64         super(listener);
65         this.eventBus = eventBus;
66         for (final Notification<?> message : allPreviousMessages) {
67             sendMessage(listener, message);
68         }
69     }
70
71     @Subscribe
72     public void onMessage(final Notification<?> message) {
73         sendMessage(this.getInstance(), message);
74     }
75
76     @Override
77     public synchronized void removeRegistration() {
78         eventBus.unregister(this);
79     }
80
81     private static void sendMessage(final BGPSessionListener listener, final Notification<?> message) {
82         if (BGPMock.CONNECTION_LOST_MAGIC_MSG.equals(message)) {
83             listener.onSessionTerminated(null, new BGPTerminationReason(BGPError.CEASE));
84         } else if (message instanceof Open) {
85             final Set<BgpTableType> tts = new HashSet<>();
86             final List<AddressFamilies> addPathCapabilitiesList = new ArrayList<>();
87             for (final BgpParameters param : ((Open) message).getBgpParameters()) {
88                 for (final OptionalCapabilities capa : param.getOptionalCapabilities()) {
89                     final CParameters cParam = capa.getCParameters();
90                     final CParameters1 aug = cParam.augmentation(CParameters1.class);
91                     if (aug == null) {
92                         continue;
93                     }
94                     if (aug.getMultiprotocolCapability() != null) {
95                         final MultiprotocolCapability p = aug.getMultiprotocolCapability();
96                         LOG.debug("Adding open parameter {}", p);
97                         final BgpTableType type = new BgpTableTypeImpl(p.getAfi(), p.getSafi());
98                         tts.add(type);
99                     } else if (aug.getAddPathCapability() != null) {
100                         final AddPathCapability addPathCap = aug.getAddPathCapability();
101                         addPathCapabilitiesList.addAll(addPathCap.getAddressFamilies());
102                     }
103                 }
104             }
105             listener.onSessionUp(new MockBGPSession(tts, addPathCapabilitiesList));
106         } else if (!(message instanceof Keepalive)) {
107             try {
108                 listener.onMessage(new MockBGPSession(), message);
109             } catch (BGPDocumentedException e) {
110                 LOG.warn("Exception encountered while handling message", e);
111             }
112         }
113     }
114
115     private static class MockBGPSession implements BGPSession {
116         private static final Uint32 AS = Uint32.valueOf(30).intern();
117
118         private final List<AddressFamilies> addPathAfis;
119         private final Set<BgpTableType> tts;
120
121         MockBGPSession(final Set<BgpTableType> tts, final List<AddressFamilies> addPathAfis) {
122             this.tts = tts;
123             this.addPathAfis = addPathAfis;
124         }
125
126         MockBGPSession() {
127             this(Collections.emptySet(), Collections.emptyList());
128         }
129
130         @Override
131         public void channelRegistered(final ChannelHandlerContext channelHandlerContext) throws Exception {
132         }
133
134         @Override
135         public void channelUnregistered(final ChannelHandlerContext channelHandlerContext) throws Exception {
136         }
137
138         @Override
139         public void channelActive(final ChannelHandlerContext channelHandlerContext) throws Exception {
140         }
141
142         @Override
143         public void channelInactive(final ChannelHandlerContext channelHandlerContext) throws Exception {
144         }
145
146         @Override
147         public void channelRead(final ChannelHandlerContext channelHandlerContext, final Object obj)
148                 throws Exception {
149         }
150
151         @Override
152         public void channelReadComplete(final ChannelHandlerContext channelHandlerContext) throws Exception {
153         }
154
155         @Override
156         public void userEventTriggered(final ChannelHandlerContext channelHandlerContext, final Object obj)
157                 throws Exception {
158         }
159
160         @Override
161         public void channelWritabilityChanged(final ChannelHandlerContext channelHandlerContext) throws Exception {
162         }
163
164         @Override
165         public void handlerAdded(final ChannelHandlerContext channelHandlerContext) throws Exception {
166         }
167
168         @Override
169         public void handlerRemoved(final ChannelHandlerContext channelHandlerContext) throws Exception {
170         }
171
172         @Override
173         public void exceptionCaught(final ChannelHandlerContext channelHandlerContext, final Throwable throwable)
174                 throws Exception {
175         }
176
177         @Override
178         public void close() {
179             LOG.debug("Session {} closed", this);
180         }
181
182         @Override
183         public Set<BgpTableType> getAdvertisedTableTypes() {
184             return tts;
185         }
186
187         @Override
188         public Ipv4Address getBgpId() {
189             return new Ipv4Address("127.0.0.1");
190         }
191
192         @Override
193         public AsNumber getAsNumber() {
194             return new AsNumber(AS);
195         }
196
197         @Override
198         public List<AddressFamilies> getAdvertisedAddPathTableTypes() {
199             return addPathAfis;
200         }
201
202         @Override
203         public void closeWithoutMessage() {
204             close();
205         }
206
207         @Override
208         public <T extends PeerConstraint> void addDecoderConstraint(final Class<T> constraintClass,
209                 final T constraint) {
210             // No-op
211         }
212
213         @Override
214         public ScheduledFuture<?> schedule(final Runnable command, final long delay, final TimeUnit unit) {
215             return null;
216         }
217     }
218 }