2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.openflowplugin.openflow.md.core.session;
11 import java.util.Collection;
13 import java.util.Map.Entry;
14 import java.util.concurrent.ConcurrentHashMap;
16 import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor;
17 import org.opendaylight.openflowplugin.openflow.md.core.IMDMessageListener;
18 import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
19 import org.opendaylight.yangtools.concepts.ListenerRegistration;
20 import org.opendaylight.yangtools.concepts.util.ListenerRegistry;
21 import org.opendaylight.yangtools.yang.binding.DataObject;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
28 public class SessionManagerOFImpl implements SessionManager {
30 private static final Logger LOG = LoggerFactory.getLogger(SessionManagerOFImpl.class);
31 private static SessionManagerOFImpl instance;
32 private ConcurrentHashMap<SwitchConnectionDistinguisher, SessionContext> sessionLot;
33 private Map<Class<? extends DataObject>, Collection<IMDMessageListener>> listenerMapping;
35 private final ListenerRegistry<SessionListener> sessionListeners = new ListenerRegistry<>();
38 * @return singleton instance
40 public static synchronized SessionManager getInstance() {
41 if (instance == null) {
42 instance = new SessionManagerOFImpl();
47 private SessionManagerOFImpl() {
48 sessionLot = new ConcurrentHashMap<>();
52 public SessionContext getSessionContext(SwitchConnectionDistinguisher sessionKey) {
53 return sessionLot.get(sessionKey);
57 public void invalidateSessionContext(SwitchConnectionDistinguisher sessionKey) {
58 SessionContext context = getSessionContext(sessionKey);
59 if (context == null) {
60 LOG.warn("context for invalidation not found");
62 for (Entry<SwitchConnectionDistinguisher, ConnectionConductor> auxEntry : context.getAuxiliaryConductors()) {
63 invalidateAuxiliary(sessionKey, auxEntry.getKey());
65 context.getPrimaryConductor().disconnect();
66 context.setValid(false);
67 removeSessionContext(context);
68 // TODO:: notify listeners
72 private void invalidateDeadSessionContext(SessionContext sessionContext) {
73 if (sessionContext == null) {
74 LOG.warn("context for invalidation not found");
76 for (Entry<SwitchConnectionDistinguisher, ConnectionConductor> auxEntry : sessionContext
77 .getAuxiliaryConductors()) {
78 invalidateAuxiliary(sessionContext, auxEntry.getKey(), true);
80 sessionContext.setValid(false);
81 removeSessionContext(sessionContext);
82 // TODO:: notify listeners
86 private void removeSessionContext(SessionContext sessionContext) {
87 sessionLot.remove(sessionContext.getSessionKey(), sessionContext);
88 sessionNotifier.onSessionRemoved(sessionContext);
92 public void addSessionContext(SwitchConnectionDistinguisher sessionKey, SessionContext context) {
93 sessionLot.put(sessionKey, context);
95 sessionNotifier.onSessionAdded(sessionKey, context);
100 public void invalidateAuxiliary(SwitchConnectionDistinguisher sessionKey,
101 SwitchConnectionDistinguisher connectionCookie) {
102 SessionContext context = getSessionContext(sessionKey);
103 invalidateAuxiliary(context, connectionCookie, true);
108 * @param connectionCookie
110 * true if auxiliary connection is to be disconnected
112 private static void invalidateAuxiliary(SessionContext context, SwitchConnectionDistinguisher connectionCookie,
113 boolean disconnect) {
114 if (context == null) {
115 LOG.warn("context for invalidation not found");
117 ConnectionConductor auxiliaryConductor = context.removeAuxiliaryConductor(connectionCookie);
118 if (auxiliaryConductor == null) {
119 LOG.warn("auxiliary conductor not found");
122 auxiliaryConductor.disconnect();
129 public void invalidateOnDisconnect(ConnectionConductor conductor) {
130 if (conductor.getAuxiliaryKey() == null) {
131 invalidateDeadSessionContext(conductor.getSessionContext());
132 // TODO:: notify listeners
134 invalidateAuxiliary(conductor.getSessionContext(), conductor.getAuxiliaryKey(), false);
139 * @param listenerMapping
140 * the listenerMapping to set
142 public void setListenerMapping(Map<Class<? extends DataObject>, Collection<IMDMessageListener>> listenerMapping) {
143 this.listenerMapping = listenerMapping;
147 public ListenerRegistration<SessionListener> registerSessionListener(SessionListener listener) {
148 return sessionListeners.register(listener);
151 private final SessionListener sessionNotifier = new SessionListener() {
154 public void onSessionAdded(SwitchConnectionDistinguisher sessionKey, SessionContext context) {
155 for (ListenerRegistration<SessionListener> listener : sessionListeners) {
157 listener.getInstance().onSessionAdded(sessionKey, context);
158 } catch (Exception e) {
159 LOG.error("Unhandled exeption occured while invoking onSessionAdded on listener", e);
164 public void onSessionRemoved(SessionContext context) {
165 for (ListenerRegistration<SessionListener> listener : sessionListeners) {
167 listener.getInstance().onSessionRemoved(context);
168 } catch (Exception e) {
169 LOG.error("Unhandled exeption occured while invoking onSessionRemoved on listener", e);
176 public Map<Class<? extends DataObject>, Collection<IMDMessageListener>> getListenerMapping() {
177 return this.listenerMapping;