[WIP] Upgrade ONOS to karaf version 4.2.1

Change-Id: I7cd40c995bdf1c80f94b1895fb3344e32404c7fa
diff --git a/core/net/src/main/java/org/onosproject/component/impl/ComponentManager.java b/core/net/src/main/java/org/onosproject/component/impl/ComponentManager.java
index abe8e0b..56486ec 100644
--- a/core/net/src/main/java/org/onosproject/component/impl/ComponentManager.java
+++ b/core/net/src/main/java/org/onosproject/component/impl/ComponentManager.java
@@ -16,42 +16,41 @@
 
 package org.onosproject.component.impl;
 
-import org.apache.felix.scr.ScrService;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
-import org.onosproject.core.ApplicationId;
 import org.onosproject.component.ComponentService;
+import org.onosproject.core.ApplicationId;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.runtime.ServiceComponentRuntime;
+import org.osgi.service.component.runtime.dto.ComponentDescriptionDTO;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.Collections;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
+import static java.util.concurrent.Executors.newScheduledThreadPool;
 import static org.onlab.util.Tools.groupedThreads;
 
 /**
  * Manages OSGi components.
  */
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = ComponentService.class)
 public class ComponentManager implements ComponentService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
+    private static final long TIMEOUT = 3000;
     private static final int POLLING_PERIOD_MS = 500;
-
     private static final int NUM_THREADS = 1;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected ScrService scrService;
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected ServiceComponentRuntime scrService;
 
     private Set<String> components;
 
@@ -61,19 +60,15 @@
     private void activate() {
         components = Collections.newSetFromMap(new ConcurrentHashMap<>());
 
-        executor = Executors.newScheduledThreadPool(NUM_THREADS,
-                groupedThreads("onos/component", "%d", log));
-
+        executor = newScheduledThreadPool(NUM_THREADS, groupedThreads("onos/component", "%d", log));
         executor.scheduleAtFixedRate(() -> components.forEach(this::enableComponent),
-                0, POLLING_PERIOD_MS, TimeUnit.MILLISECONDS);
-
+                                     0, POLLING_PERIOD_MS, TimeUnit.MILLISECONDS);
         log.info("Started");
     }
 
     @Deactivate
     private void deactivate() {
         executor.shutdownNow();
-
         log.info("Stopped");
     }
 
@@ -89,30 +84,36 @@
         disableComponent(name);
     }
 
-    private void enableComponent(String name) {
-        org.apache.felix.scr.Component[] components = scrService.getComponents(name);
-
-        if (components == null || components.length == 0) {
-            return;
+    private ComponentDescriptionDTO getComponent(String name) {
+        for (ComponentDescriptionDTO component : scrService.getComponentDescriptionDTOs()) {
+            if (component.name.equals(name)) {
+                return component;
+            }
         }
+        return null;
+    }
 
-        org.apache.felix.scr.Component component = components[0];
-
-        if (component.getState() == org.apache.felix.scr.Component.STATE_DISABLED) {
+    private void enableComponent(String name) {
+        ComponentDescriptionDTO component = getComponent(name);
+        if (component != null && !scrService.isComponentEnabled(component)) {
             log.info("Enabling component {}", name);
-            component.enable();
+            try {
+                scrService.enableComponent(component).timeout(TIMEOUT);
+            } catch (Exception e) {
+                throw new IllegalStateException("Unable to start component " + name, e);
+            }
         }
     }
 
     private void disableComponent(String name) {
-        org.apache.felix.scr.Component[] components = scrService.getComponents(name);
-
-        if (components == null || components.length == 0) {
-            return;
+        ComponentDescriptionDTO component = getComponent(name);
+        if (component != null && scrService.isComponentEnabled(component)) {
+            log.info("Disabling component {}", name);
+            try {
+                scrService.disableComponent(component).timeout(TIMEOUT);
+            } catch (Exception e) {
+                throw new IllegalStateException("Unable to start component " + name, e);
+            }
         }
-
-        log.info("Disabling component {}", name);
-
-        components[0].disable();
     }
 }