provisioning of messageListener - messageType - conductor mapping 68/1968/2
authorMichal Rehak <mirehak@cisco.com>
Thu, 17 Oct 2013 14:08:29 +0000 (16:08 +0200)
committerMichal Rehak <mirehak@cisco.com>
Thu, 17 Oct 2013 14:11:48 +0000 (16:11 +0200)
Change-Id: Ic1f33894fc27f741131c66734af96414f1d0f671
Signed-off-by: Michal Rehak <mirehak@cisco.com>
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/ConnectionConductorImpl.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/session/OFSessionUtil.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/session/SessionManagerOFImpl.java

index 5e92a111c2c762b43cecaa991372e7b6914a3c8e..a25aec23e2cd20e3573142a7cb02ee8018c479d4 100644 (file)
@@ -8,15 +8,18 @@
 
 package org.opendaylight.openflowplugin.openflow.md.core;
 
+import java.util.Collection;
 import java.util.List;
 import java.util.concurrent.Future;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
 
 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
+import org.opendaylight.openflowplugin.openflow.core.IMessageListener;
 import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil;
 import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext;
 import org.opendaylight.openflowplugin.openflow.md.core.session.SessionManager;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.HelloElementType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoReplyInputBuilder;
@@ -33,14 +36,17 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessage;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessage;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.hello.ElementsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.DisconnectEvent;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SwitchIdleEvent;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
+import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.common.RpcError;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 
 /**
@@ -63,6 +69,8 @@ public class ConnectionConductorImpl implements OpenflowProtocolListener,
 
     private SessionContext sessionContext;
 
+    private ImmutableMap<Class<? extends DataObject>, Collection<IMessageListener>> listenerMapping;
+
     /**
      * @param connectionAdapter
      */
@@ -193,8 +201,8 @@ public class ConnectionConductorImpl implements OpenflowProtocolListener,
     }
 
     @Override
-    public void onPacketInMessage(PacketInMessage arg0) {
-        // TODO Auto-generated method stub
+    public void onPacketInMessage(PacketInMessage message) {
+        notifyListeners(PacketInMessage.class, message);
     }
 
     @Override
@@ -206,9 +214,8 @@ public class ConnectionConductorImpl implements OpenflowProtocolListener,
     public void onSwitchIdleEvent(SwitchIdleEvent notification) {
         if (!CONDUCTOR_STATE.WORKING.equals(conductorState)) {
             // idle state in any other conductorState than WORKING means real
-            // problem and wont
-            // be handled by echoReply
-            // TODO: invalidate this connection + notify
+            // problem and wont be handled by echoReply, but disconnection
+            OFSessionUtil.getSessionManager().invalidateOnDisconnect(this);
         } else {
             LOG.debug("first idle state occured");
             EchoInputBuilder builder = new EchoInputBuilder();
@@ -314,4 +321,27 @@ public class ConnectionConductorImpl implements OpenflowProtocolListener,
     public SessionContext getSessionContext() {
         return sessionContext;
     }
+
+    /**
+     * @param listenerMapping the listenerMapping to set
+     */
+    public void setListenerMapping(
+            ImmutableMap<Class<? extends DataObject>, Collection<IMessageListener>> listenerMapping) {
+        //TODO: adjust the listener interface
+        this.listenerMapping = listenerMapping;
+    }
+
+    /**
+     * @param messageType
+     * @param message
+     */
+    private void notifyListeners(Class<? extends DataObject> messageType, DataObject message) {
+        Collection<IMessageListener> listeners = listenerMapping.get(messageType);
+        if (listeners != null) {
+            for (IMessageListener listener : listeners) {
+                //TODO: use some iface (message, conductor (connection+session id)
+                //listener.receive(someId, message);
+            }
+        }
+    }
 }
index 9a7eebba2e306b7ef3190475081c27e3947c0972..ee5af9c2223031cd433f6835915733fba63dc472 100644 (file)
@@ -50,6 +50,7 @@ public abstract class OFSessionUtil {
             context.setSessionKey(sessionKey);
             connectionConductor.setSessionContext(context);
             context.setValid(true);
+            //TODO: retrieve listenerMapping from sessionManager and push it to conductor
             getSessionManager().addSessionContext(sessionKey, context);
         } else {
             // handle auxiliary
@@ -68,6 +69,7 @@ public abstract class OFSessionUtil {
                             auxiliaryKey);
                 }
 
+                //TODO: retrieve listenerMapping from sessionManager and push it to conductor
                 sessionContext.addAuxiliaryConductor(auxiliaryKey,
                         connectionConductor);
                 connectionConductor.setSessionContext(sessionContext);
index 3e9bb32fbaff0ed254e08e5e4e1678e5294196c9..01b87ff4203bbd8e192476a3f673127e03f7889d 100644 (file)
@@ -90,7 +90,6 @@ public class SessionManagerOFImpl implements SessionManager {
             SwitchConnectionDistinguisher connectionCookie) {
         SessionContext context = getSessionContext(sessionKey);
         invalidateAuxiliary(context, connectionCookie, true);
-
     }
 
     /**
@@ -120,11 +119,10 @@ public class SessionManagerOFImpl implements SessionManager {
     public void invalidateOnDisconnect(ConnectionConductor conductor) {
         if (conductor.getAuxiliaryKey() == null) {
             invalidateDeadSessionContext(conductor.getSessionContext());
+            // TODO:: notify listeners
         } else {
             invalidateAuxiliary(conductor.getSessionContext(),
                     conductor.getAuxiliaryKey(), false);
         }
-
     }
-
 }