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.Arrays;
12 import java.util.Collection;
14 import java.util.Map.Entry;
15 import java.util.concurrent.ConcurrentHashMap;
17 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
18 import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
19 import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor;
20 import org.opendaylight.openflowplugin.openflow.md.core.IMDMessageTranslator;
21 import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
22 import org.opendaylight.openflowplugin.openflow.md.core.TranslatorKey;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
24 import org.opendaylight.yangtools.concepts.ListenerRegistration;
25 import org.opendaylight.yangtools.concepts.util.ListenerRegistry;
26 import org.opendaylight.yangtools.yang.binding.DataObject;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
33 public class SessionManagerOFImpl implements SessionManager {
35 protected static final Logger LOG = LoggerFactory.getLogger(SessionManagerOFImpl.class);
36 private static SessionManagerOFImpl instance;
37 private ConcurrentHashMap<SwitchConnectionDistinguisher, SessionContext> sessionLot;
38 private Map<TranslatorKey, Collection<IMDMessageTranslator<OfHeader, DataObject>>> translatorMapping;
40 protected final ListenerRegistry<SessionListener> sessionListeners = new ListenerRegistry<>();
41 private NotificationProviderService notificationProviderService;
43 private DataProviderService dataProviderService;
46 * @return singleton instance
48 public static synchronized SessionManager getInstance() {
49 if (instance == null) {
50 instance = new SessionManagerOFImpl();
55 private SessionManagerOFImpl() {
56 sessionLot = new ConcurrentHashMap<>();
60 public SessionContext getSessionContext(SwitchConnectionDistinguisher sessionKey) {
61 return sessionLot.get(sessionKey);
65 public void invalidateSessionContext(SwitchConnectionDistinguisher sessionKey) {
66 SessionContext context = getSessionContext(sessionKey);
67 if (context == null) {
68 LOG.warn("context for invalidation not found");
70 for (Entry<SwitchConnectionDistinguisher, ConnectionConductor> auxEntry : context.getAuxiliaryConductors()) {
71 invalidateAuxiliary(sessionKey, auxEntry.getKey());
73 context.getPrimaryConductor().disconnect();
74 context.setValid(false);
75 removeSessionContext(context);
76 // TODO:: notify listeners
80 private void invalidateDeadSessionContext(SessionContext sessionContext) {
81 if (sessionContext == null) {
82 LOG.warn("context for invalidation not found");
84 for (Entry<SwitchConnectionDistinguisher, ConnectionConductor> auxEntry : sessionContext
85 .getAuxiliaryConductors()) {
86 invalidateAuxiliary(sessionContext, auxEntry.getKey(), true);
88 sessionContext.setValid(false);
89 removeSessionContext(sessionContext);
90 // TODO:: notify listeners
94 private void removeSessionContext(SessionContext sessionContext) {
95 if (LOG.isDebugEnabled()) {
96 LOG.debug("removing session: {}", Arrays.toString(sessionContext.getSessionKey().getId()));
98 sessionLot.remove(sessionContext.getSessionKey(), sessionContext);
99 sessionNotifier.onSessionRemoved(sessionContext);
103 public void addSessionContext(SwitchConnectionDistinguisher sessionKey, SessionContext context) {
104 sessionLot.put(sessionKey, context);
106 sessionNotifier.onSessionAdded(sessionKey, context);
111 public void invalidateAuxiliary(SwitchConnectionDistinguisher sessionKey,
112 SwitchConnectionDistinguisher connectionCookie) {
113 SessionContext context = getSessionContext(sessionKey);
114 invalidateAuxiliary(context, connectionCookie, true);
119 * @param connectionCookie
121 * true if auxiliary connection is to be disconnected
123 private static void invalidateAuxiliary(SessionContext context, SwitchConnectionDistinguisher connectionCookie,
124 boolean disconnect) {
125 if (context == null) {
126 LOG.warn("context for invalidation not found");
128 ConnectionConductor auxiliaryConductor = context.removeAuxiliaryConductor(connectionCookie);
129 if (auxiliaryConductor == null) {
130 LOG.warn("auxiliary conductor not found");
133 auxiliaryConductor.disconnect();
140 public void invalidateOnDisconnect(ConnectionConductor conductor) {
141 if (conductor.getAuxiliaryKey() == null) {
142 invalidateDeadSessionContext(conductor.getSessionContext());
143 // TODO:: notify listeners
145 invalidateAuxiliary(conductor.getSessionContext(), conductor.getAuxiliaryKey(), false);
150 public void setTranslatorMapping(Map<TranslatorKey, Collection<IMDMessageTranslator<OfHeader, DataObject>>> translatorMapping) {
151 this.translatorMapping = translatorMapping;
155 public ListenerRegistration<SessionListener> registerSessionListener(SessionListener listener) {
156 return sessionListeners.register(listener);
159 private final SessionListener sessionNotifier = new SessionListener() {
162 public void onSessionAdded(SwitchConnectionDistinguisher sessionKey, SessionContext context) {
163 for (ListenerRegistration<SessionListener> listener : sessionListeners) {
165 listener.getInstance().onSessionAdded(sessionKey, context);
166 } catch (Exception e) {
167 LOG.error("Unhandled exeption occured while invoking onSessionAdded on listener", e);
172 public void onSessionRemoved(SessionContext context) {
173 for (ListenerRegistration<SessionListener> listener : sessionListeners) {
175 listener.getInstance().onSessionRemoved(context);
176 } catch (Exception e) {
177 LOG.error("Unhandled exeption occured while invoking onSessionRemoved on listener", e);
184 public Map<TranslatorKey, Collection<IMDMessageTranslator<OfHeader, DataObject>>> getTranslatorMapping() {
185 return this.translatorMapping;
189 public void setNotificationProviderService(
190 NotificationProviderService notificationProviderService) {
191 this.notificationProviderService = notificationProviderService;
196 public DataProviderService getDataProviderService() {
197 return dataProviderService;
201 public void setDataProviderService(DataProviderService dataServiceProvider) {
202 this.dataProviderService = dataServiceProvider;
207 public NotificationProviderService getNotificationProviderService() {
208 return notificationProviderService;