Fix various small warnings
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / OpenFlowPluginProviderImpl.java
index ae193ad80a23facdc8cbd59b69be964e82c5b052..0195380626605b01e045f6f08cc46ad43e8121e0 100644 (file)
 package org.opendaylight.openflowplugin.impl;
 
 
+import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import java.lang.management.ManagementFactory;
+import java.util.ArrayList;
 import java.util.Collection;
-import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
+import java.util.List;
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.MBeanRegistrationException;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.NotCompliantMBeanException;
+import javax.management.ObjectName;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
+import org.opendaylight.controller.md.sal.binding.api.NotificationService;
+import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
 import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider;
 import org.opendaylight.openflowplugin.api.openflow.OpenFlowPluginProvider;
+import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionManager;
 import org.opendaylight.openflowplugin.api.openflow.device.DeviceManager;
 import org.opendaylight.openflowplugin.api.openflow.rpc.RpcManager;
 import org.opendaylight.openflowplugin.api.openflow.statistics.StatisticsManager;
+import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageIntelligenceAgency;
+import org.opendaylight.openflowplugin.extension.api.ExtensionConverterRegistrator;
+import org.opendaylight.openflowplugin.extension.api.OpenFlowPluginExtensionRegistratorProvider;
+import org.opendaylight.openflowplugin.impl.connection.ConnectionManagerImpl;
 import org.opendaylight.openflowplugin.impl.device.DeviceManagerImpl;
 import org.opendaylight.openflowplugin.impl.rpc.RpcManagerImpl;
+import org.opendaylight.openflowplugin.impl.statistics.StatisticsManagerImpl;
+import org.opendaylight.openflowplugin.impl.statistics.ofpspecific.MessageIntelligenceAgencyImpl;
+import org.opendaylight.openflowplugin.impl.statistics.ofpspecific.MessageIntelligenceAgencyMXBean;
+import org.opendaylight.openflowplugin.impl.util.TranslatorLibraryUtil;
+import org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionConverterManager;
+import org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionConverterManagerImpl;
+import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.api.types.rev150327.OfpRole;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Created by Martin Bobak <mbobak@cisco.com> on 27.3.2015.
  */
-public class OpenFlowPluginProviderImpl implements OpenFlowPluginProvider {
+public class OpenFlowPluginProviderImpl implements OpenFlowPluginProvider, OpenFlowPluginExtensionRegistratorProvider {
+
+    private static final Logger LOG = LoggerFactory.getLogger(OpenFlowPluginProviderImpl.class);
 
     private DeviceManager deviceManager;
     private RpcManager rpcManager;
-    private BindingAwareBroker.ProviderContext providerContext;
+    private RpcProviderRegistry rpcProviderRegistry;
     private StatisticsManager statisticsManager;
+    private ConnectionManager connectionManager;
+    private NotificationService notificationProviderService;
+    private NotificationPublishService notificationPublishService;
+
+    private ExtensionConverterManager extensionConverterManager;
+
+    private DataBroker dataBroker;
+    private OfpRole role;
+    private Collection<SwitchConnectionProvider> switchConnectionProviders;
+    private final Long rpcRequestsQuota;
+
+    public OpenFlowPluginProviderImpl(final Long rpcRequestsQuota) {
+        this.rpcRequestsQuota = rpcRequestsQuota;
+    }
+
+
+    private void startSwitchConnections() {
+        final List<ListenableFuture<Boolean>> starterChain = new ArrayList<>(switchConnectionProviders.size());
+        for (final SwitchConnectionProvider switchConnectionPrv : switchConnectionProviders) {
+            switchConnectionPrv.setSwitchConnectionHandler(connectionManager);
+            final ListenableFuture<Boolean> isOnlineFuture = switchConnectionPrv.startup();
+            starterChain.add(isOnlineFuture);
+        }
+
+        final ListenableFuture<List<Boolean>> srvStarted = Futures.allAsList(starterChain);
+        Futures.addCallback(srvStarted, new FutureCallback<List<Boolean>>() {
+            @Override
+            public void onSuccess(final List<Boolean> result) {
+                LOG.info("All switchConnectionProviders are up and running ({}).",
+                        result.size());
+            }
+
+            @Override
+            public void onFailure(final Throwable t) {
+                LOG.warn("Some switchConnectionProviders failed to start.", t);
+            }
+        });
+    }
 
     @Override
-    public void onSessionInitiated(final BindingAwareBroker.ProviderContext session) {
-        providerContext = session;
+    public void setSwitchConnectionProviders(final Collection<SwitchConnectionProvider> switchConnectionProviders) {
+        this.switchConnectionProviders = switchConnectionProviders;
     }
 
     @Override
-    public void setSwitchConnectionProviders(final Collection<SwitchConnectionProvider> switchConnectionProvider) {
+    public void setDataBroker(final DataBroker dataBroker) {
+        this.dataBroker = dataBroker;
+    }
 
+    @Override
+    public void setRpcProviderRegistry(final RpcProviderRegistry rpcProviderRegistry) {
+        this.rpcProviderRegistry = rpcProviderRegistry;
     }
 
     @Override
     public void setRole(final OfpRole role) {
-
+        this.role = role;
     }
 
+
     @Override
     public void initialize() {
-        deviceManager = new DeviceManagerImpl(providerContext);
-        rpcManager = new RpcManagerImpl(providerContext);
-        //TODO : initialize statistics manager
-        //TODO : initialize translatorLibrary + inject into deviceMngr
+
+        Preconditions.checkNotNull(dataBroker, "missing data broker");
+        Preconditions.checkNotNull(rpcProviderRegistry, "missing RPC provider registry");
+        Preconditions.checkNotNull(notificationProviderService, "missing notification provider service");
+
+        extensionConverterManager = new ExtensionConverterManagerImpl();
+        // TODO: copied from OpenFlowPluginProvider (Helium) misusesing the old way of distributing extension converters
+        // TODO: rewrite later!
+        OFSessionUtil.getSessionManager().setExtensionConverterProvider(extensionConverterManager);
+
+        connectionManager = new ConnectionManagerImpl();
+        MessageIntelligenceAgency messageIntelligenceAgency = new MessageIntelligenceAgencyImpl();
+
+        registerMXBean(messageIntelligenceAgency);
+
+        deviceManager = new DeviceManagerImpl(dataBroker, messageIntelligenceAgency);
+        statisticsManager = new StatisticsManagerImpl();
+        rpcManager = new RpcManagerImpl(rpcProviderRegistry, rpcRequestsQuota);
+
+        connectionManager.setDeviceConnectedHandler(deviceManager);
+        deviceManager.setDeviceInitializationPhaseHandler(statisticsManager);
+        deviceManager.setNotificationService(this.notificationProviderService);
+        deviceManager.setNotificationPublishService(this.notificationPublishService);
+        statisticsManager.setDeviceInitializationPhaseHandler(rpcManager);
+        rpcManager.setDeviceInitializationPhaseHandler(deviceManager);
+
+        TranslatorLibraryUtil.setBasicTranslatorLibrary(deviceManager);
+        deviceManager.initialize();
+
+        startSwitchConnections();
+    }
+
+    private static void registerMXBean(final MessageIntelligenceAgency messageIntelligenceAgency) {
+        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+        try {
+            String pathToMxBean = String.format("%s:type=%s",
+                    MessageIntelligenceAgencyMXBean.class.getPackage().getName(),
+                    MessageIntelligenceAgencyMXBean.class.getSimpleName());
+            ObjectName name = new ObjectName(pathToMxBean);
+            mbs.registerMBean(messageIntelligenceAgency, name);
+        } catch (MalformedObjectNameException
+                | NotCompliantMBeanException
+                | MBeanRegistrationException
+                | InstanceAlreadyExistsException e) {
+            LOG.warn("Error registering MBean {}", e);
+        }
     }
 
     @Override
-    public void close() throws Exception {
+    public void setNotificationProviderService(final NotificationService notificationProviderService) {
+        this.notificationProviderService = notificationProviderService;
+    }
 
+    @Override
+    public void setNotificationPublishService(final NotificationPublishService notificationPublishProviderService) {
+        this.notificationPublishService = notificationPublishProviderService;
+    }
+
+    @Override
+    public ExtensionConverterRegistrator getExtensionConverterRegistrator() {
+        return extensionConverterManager;
+    }
+
+    @Override
+    public void close() throws Exception {
+        //TODO: close all contexts, switchConnections (, managers)
     }
 }