2002f10985c46190644adb5bb8d73268d768a40c
[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 java.util.List;
11 import java.util.Set;
12
13 import org.opendaylight.protocol.bgp.parser.BGPSession;
14 import org.opendaylight.protocol.bgp.parser.BGPSessionListener;
15 import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl;
16 import org.opendaylight.protocol.concepts.ListenerRegistration;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.Keepalive;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.Open;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.BgpParameters;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.c.parameters.CMultiprotocol;
22 import org.opendaylight.yangtools.yang.binding.Notification;
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
25
26 import com.google.common.collect.Sets;
27 import com.google.common.eventbus.EventBus;
28 import com.google.common.eventbus.Subscribe;
29
30 /**
31  * This class has @Subscribe annotated methods which receive events from {@link EventBus} . Events are produced by
32  * {@link BGPMock}, and each instance notifies exactly one {@link BGPSessionListener}.
33  */
34 final class EventBusRegistration extends ListenerRegistration<BGPSessionListener> {
35
36         private static final Logger LOG = LoggerFactory.getLogger(EventBusRegistration.class);
37
38         private final EventBus eventBus;
39
40         public static EventBusRegistration createAndRegister(final EventBus eventBus, final BGPSessionListener listener,
41                         final List<Notification> allPreviousMessages) {
42                 final EventBusRegistration instance = new EventBusRegistration(eventBus, listener, allPreviousMessages);
43                 eventBus.register(instance);
44                 return instance;
45         }
46
47         private EventBusRegistration(final EventBus eventBus, final BGPSessionListener listener, final List<Notification> allPreviousMessages) {
48                 super(listener);
49                 this.eventBus = eventBus;
50                 for (final Notification message : allPreviousMessages) {
51                         sendMessage(listener, message);
52                 }
53         }
54
55         @Subscribe
56         public void onMessage(final Notification message) {
57                 sendMessage(this.listener, message);
58         }
59
60         @Override
61         public synchronized void removeRegistration() {
62                 this.eventBus.unregister(this);
63         }
64
65         private static void sendMessage(final BGPSessionListener listener, final Notification message) {
66                 if (BGPMock.CONNECTION_LOST_MAGIC_MSG.equals(message)) {
67                         listener.onSessionTerminated(null, null);
68                 } else if (message instanceof Open) {
69                         final Set<BgpTableType> tts = Sets.newHashSet();
70                         for (final BgpParameters param : ((Open) message).getBgpParameters()) {
71                                 if (param.getCParameters() instanceof CMultiprotocol) {
72                                         final CMultiprotocol p = (CMultiprotocol) param.getCParameters();
73                                         LOG.debug("Adding open parameter {}", p);
74                                         final BgpTableType type = new BgpTableTypeImpl(p.getMultiprotocolCapability().getAfi(), p.getMultiprotocolCapability().getSafi());
75                                         tts.add(type);
76                                 }
77                         }
78
79                         listener.onSessionUp(new BGPSession() {
80
81                                 @Override
82                                 public void close() {
83                                         LOG.debug("Session {} closed", this);
84                                 }
85
86                                 @Override
87                                 public Set<BgpTableType> getAdvertisedTableTypes() {
88                                         return tts;
89                                 }
90                         });
91                 } else if (!(message instanceof Keepalive)) {
92                         listener.onMessage(null, message);
93                 }
94         }
95 }