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