preparing QueueKeeper and message translation
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / MDController.java
index 26b3d87356a59de2bb119f3863f6a97efc29a657..0a9fcfe12b39ab8114a55e3d2ca34022801c6e74 100644 (file)
@@ -10,20 +10,28 @@ package org.opendaylight.openflowplugin.openflow.md.core;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 
 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionConfiguration;
 import org.opendaylight.openflowjava.protocol.api.connection.SwitchConnectionHandler;
 import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider;
 import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil;
+import org.opendaylight.openflowplugin.openflow.md.core.translator.ErrorTranslator;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.Collections2;
 import com.google.common.collect.Lists;
 
 /**
@@ -36,16 +44,26 @@ public class MDController implements IMDController {
 
     private SwitchConnectionProvider switchConnectionProvider;
 
-    private ConcurrentMap<Class<? extends DataObject>, Collection<IMDMessageListener>> messageListeners;
+    private ConcurrentMap<TranslatorKey, Collection<IMDMessageTranslator<OfHeader, DataObject>>> messageTranslators;
 
-    public Map<Class<? extends DataObject>, Collection<IMDMessageListener>> getMessageListeners() {
-        return messageListeners;
+    /**
+     * @return translator mapping
+     */
+    public Map<TranslatorKey, Collection<IMDMessageTranslator<OfHeader, DataObject>>> getMessageTranslators() {
+        return messageTranslators;
     }
 
-
+    /**
+     * provisioning of translator mapping
+     */
     public void init() {
         LOG.debug("Initializing!");
-        this.messageListeners = new ConcurrentHashMap<Class<? extends DataObject>, Collection<IMDMessageListener>>();
+        messageTranslators = new ConcurrentHashMap<>();
+        addMessageTranslator(ErrorMessage.class, 4, new ErrorTranslator());
+        addMessageTranslator(ErrorMessage.class, 1, new ErrorTranslator());
+        
+        // Push the updated Listeners to Session Manager which will be then picked up by ConnectionConductor eventually
+        OFSessionUtil.getSessionManager().setTranslatorMapping(messageTranslators);
     }
 
     /**
@@ -99,6 +117,12 @@ public class MDController implements IMDController {
      */
     public void stop() {
         LOG.debug("stopping");
+        Future<List<Boolean>> srvStopped = switchConnectionProvider.shutdown();
+        try {
+            srvStopped.get(5000, TimeUnit.MILLISECONDS);
+        } catch (InterruptedException | ExecutionException | TimeoutException e) {
+            LOG.error(e.getMessage(), e);
+        }
     }
 
     /**
@@ -112,34 +136,30 @@ public class MDController implements IMDController {
     }
 
     @Override
-    public void addMessageListener(Class<? extends DataObject> messageType, IMDMessageListener listener) {
-
-        Collection<IMDMessageListener> existingValues = messageListeners.get(messageType);
+    public void addMessageTranslator(Class<? extends DataObject> messageType, int version, IMDMessageTranslator<OfHeader, DataObject> translator) {
+        TranslatorKey tKey = new TranslatorKey(version, messageType.getName());
+        
+        Collection<IMDMessageTranslator<OfHeader, DataObject>> existingValues = messageTranslators.get(tKey);
         if (existingValues == null) {
-               existingValues = new ArrayList<IMDMessageListener>();
+            existingValues = new ArrayList<>();
+            messageTranslators.put(tKey, existingValues);
         }
-        existingValues.add(listener);
-        messageListeners.put(messageType, existingValues);
-        // Push the updated Listeners to Session Manager which will be then picked up by ConnectionConductor eventually
-        OFSessionUtil.getSessionManager().setListenerMapping(messageListeners);
-        LOG.debug("{} is now listened by {}", messageType, listener);
+        existingValues.add(translator);
+        LOG.debug("{} is now listened by {}", messageType, translator);
     }
 
     @Override
-    public void removeMessageListener(Class<? extends DataObject> messageType, IMDMessageListener listener) {
-
-        Collection<IMDMessageListener> values = messageListeners.get(messageType);
+    public void removeMessageTranslator(Class<? extends DataObject> messageType, int version, IMDMessageTranslator<OfHeader, DataObject> translator) {
+        TranslatorKey tKey = new TranslatorKey(version, messageType.getName());
+        Collection<IMDMessageTranslator<OfHeader, DataObject>> values = messageTranslators.get(tKey);
         if (values != null) {
-                    values.remove(listener);
-                    if (values.size() == 0) {
-                        messageListeners.remove(messageType);
-                    }
-                    //Push the updated Listeners to Session Manager which will be then picked up by ConnectionConductor eventually
-                    OFSessionUtil.getSessionManager().setListenerMapping(messageListeners);
-                    LOG.debug("{} is now removed", listener);
+            values.remove(translator);
+            if (values.isEmpty()) {
+                messageTranslators.remove(tKey);
+            }
+            LOG.debug("{} is now removed", translator);
          }
     }
 
 
-
 }