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