BUG-353: add remote-as awareness
[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.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
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.MultiprotocolCase;
22 import org.opendaylight.yangtools.concepts.AbstractListenerRegistration;
23 import org.opendaylight.yangtools.yang.binding.Notification;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
26
27 import com.google.common.collect.Sets;
28 import com.google.common.eventbus.EventBus;
29 import com.google.common.eventbus.Subscribe;
30
31 /**
32  * This class has @Subscribe annotated methods which receive events from {@link EventBus} . Events are produced by
33  * {@link BGPMock}, and each instance notifies exactly one {@link BGPSessionListener}.
34  */
35 final class EventBusRegistration extends AbstractListenerRegistration<BGPSessionListener> {
36
37         private static final Logger LOG = LoggerFactory.getLogger(EventBusRegistration.class);
38
39         private final EventBus eventBus;
40
41         public static EventBusRegistration createAndRegister(final EventBus eventBus, final BGPSessionListener listener,
42                         final List<Notification> allPreviousMessages) {
43                 final EventBusRegistration instance = new EventBusRegistration(eventBus, listener, allPreviousMessages);
44                 eventBus.register(instance);
45                 return instance;
46         }
47
48         private EventBusRegistration(final EventBus eventBus, final BGPSessionListener listener, final List<Notification> allPreviousMessages) {
49                 super(listener);
50                 this.eventBus = eventBus;
51                 for (final Notification message : allPreviousMessages) {
52                         sendMessage(listener, message);
53                 }
54         }
55
56         @Subscribe
57         public void onMessage(final Notification message) {
58                 sendMessage(this.getInstance(), message);
59         }
60
61         @Override
62         public synchronized void removeRegistration() {
63                 this.eventBus.unregister(this);
64         }
65
66         private static void sendMessage(final BGPSessionListener listener, final Notification message) {
67                 if (BGPMock.CONNECTION_LOST_MAGIC_MSG.equals(message)) {
68                         listener.onSessionTerminated(null, null);
69                 } else if (message instanceof Open) {
70                         final Set<BgpTableType> tts = Sets.newHashSet();
71                         for (final BgpParameters param : ((Open) message).getBgpParameters()) {
72                                 if (param.getCParameters() instanceof MultiprotocolCase) {
73                                         final MultiprotocolCase p = (MultiprotocolCase) param.getCParameters();
74                                         LOG.debug("Adding open parameter {}", p);
75                                         final BgpTableType type = new BgpTableTypeImpl(p.getMultiprotocolCapability().getAfi(), p.getMultiprotocolCapability().getSafi());
76                                         tts.add(type);
77                                 }
78                         }
79
80                         listener.onSessionUp(new BGPSession() {
81
82                                 @Override
83                                 public void close() {
84                                         LOG.debug("Session {} closed", this);
85                                 }
86
87                                 @Override
88                                 public Set<BgpTableType> getAdvertisedTableTypes() {
89                                         return tts;
90                                 }
91
92                                 @Override
93                                 public byte[] getBgpId() {
94                                         return new byte[] { (byte) 127, 0, 0, 1 };
95                                 }
96
97                                 @Override
98                                 public AsNumber getAsNumber() {
99                                         return new AsNumber(30L);
100                                 }
101                         });
102                 } else if (!(message instanceof Keepalive)) {
103                         listener.onMessage(null, message);
104                 }
105         }
106 }