Refactor Region gRPC NB service to use static registry binding

Change-Id: Ifa0666caffb659a5e40e1888150a947b07fc4d88
diff --git a/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbRegionService.java b/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbRegionService.java
index 744941f..e697a7a 100644
--- a/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbRegionService.java
+++ b/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbRegionService.java
@@ -15,11 +15,9 @@
 */
 
 package org.onosproject.incubator.protobuf.services.nb;
-import org.onosproject.incubator.protobuf.models.net.RegionProtoTranslator;
 
 import com.google.common.annotations.Beta;
-import io.grpc.Server;
-import io.grpc.ServerBuilder;
+import io.grpc.BindableService;
 import io.grpc.stub.StreamObserver;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
@@ -27,28 +25,22 @@
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.onosproject.grpc.nb.net.region.RegionServiceGrpc.RegionServiceImplBase;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.region.RegionId;
-import org.onosproject.net.region.Region;
-import org.onosproject.net.region.RegionService;
-
-
-import java.io.IOException;
-
-import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionsRequest;
-import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionsReply;
-
-import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionRequest;
-import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionReply;
-
-import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionForDeviceRequest;
-import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionForDeviceReply;
-
-import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionDevicesRequest;
 import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionDevicesReply;
-
-import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionHostsRequest;
+import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionDevicesRequest;
+import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionForDeviceReply;
+import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionForDeviceRequest;
 import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionHostsReply;
+import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionHostsRequest;
+import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionReply;
+import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionRequest;
+import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionsReply;
+import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionsRequest;
+import org.onosproject.incubator.protobuf.models.net.RegionProtoTranslator;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.region.Region;
+import org.onosproject.net.region.RegionId;
+import org.onosproject.net.region.RegionService;
+import org.onosproject.protobuf.api.GrpcServiceRegistry;
 import org.slf4j.Logger;
 
 import static org.slf4j.LoggerFactory.getLogger;
@@ -60,30 +52,44 @@
 @Component(immediate = true)
 public class GrpcNbRegionService {
 
-    private Server server;
     private final Logger log = getLogger(getClass());
-    private RegionServiceNBServerInternal innerClassInstance = null;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected GrpcServiceRegistry registry;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected RegionService regionService;
 
+    private RegionServiceNbServerInternal innerClassInstance = null;
+
     @Activate
     public void activate() {
-        server = ServerBuilder.forPort(64000).addService(new RegionServiceNBServerInternal()).build();
-        try {
-            server.start();
-        } catch (IOException e) {
-            log.error("Failed to start server", e);
-            throw new RuntimeException("Failed to start server", e);
-        }
+
+        registry.register(getInnerClassInstance());
+        log.info("Started.");
     }
 
     @Deactivate
     public void deactivate() {
-        server.shutdown();
+
+        registry.unregister(getInnerClassInstance());
+        log.info("Stopped.");
     }
 
-    public class RegionServiceNBServerInternal extends RegionServiceImplBase {
+    /**
+     * Register Region Service, used for unit testing purposes.
+     *
+     * @return An instance of binding Region service
+     */
+    public InProcessServer<BindableService> registerInProcessServer() {
+        InProcessServer<BindableService> inprocessServer =
+                new InProcessServer(GrpcNbRegionService.RegionServiceNbServerInternal.class);
+        inprocessServer.addServiceToBind(getInnerClassInstance());
+
+        return inprocessServer;
+    }
+
+    private final class RegionServiceNbServerInternal extends RegionServiceImplBase {
         /**
          * Service for interacting with inventory of network control regions.
          */
@@ -153,9 +159,9 @@
         }
     }
 
-    public RegionServiceNBServerInternal getInnerClassInstance() {
+    private RegionServiceNbServerInternal getInnerClassInstance() {
         if (innerClassInstance == null) {
-            innerClassInstance = new RegionServiceNBServerInternal();
+            innerClassInstance = new RegionServiceNbServerInternal();
         }
         return innerClassInstance;
     }
diff --git a/incubator/protobuf/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbRegionServiceTest.java b/incubator/protobuf/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbRegionServiceTest.java
index 7b93d8e..7e03dce 100644
--- a/incubator/protobuf/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbRegionServiceTest.java
+++ b/incubator/protobuf/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbRegionServiceTest.java
@@ -16,29 +16,29 @@
 
 package org.onosproject.incubator.protobuf.services.nb;
 
-import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ImmutableList;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.onosproject.cluster.NodeId;
-import org.onosproject.grpc.net.models.RegionProtoOuterClass;
-
-import static org.junit.Assert.assertTrue;
-import static org.onosproject.cluster.NodeId.nodeId;
-import static org.onosproject.net.DeviceId.deviceId;
-import static org.onosproject.net.HostId.hostId;
-
+import com.google.common.collect.ImmutableSet;
+import io.grpc.BindableService;
 import io.grpc.ManagedChannel;
 import io.grpc.inprocess.InProcessChannelBuilder;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onosproject.cluster.NodeId;
+import org.onosproject.grpc.nb.net.region.RegionServiceGrpc;
+import org.onosproject.grpc.nb.net.region.RegionServiceGrpc.RegionServiceBlockingStub;
+import org.onosproject.grpc.nb.net.region.RegionServiceNb;
+import org.onosproject.grpc.net.models.RegionProtoOuterClass;
+import org.onosproject.incubator.protobuf.models.net.RegionProtoTranslator;
 import org.onosproject.net.DefaultAnnotations;
-
 import org.onosproject.net.DefaultDevice;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
-
 import org.onosproject.net.HostId;
 import org.onosproject.net.provider.ProviderId;
 import org.onosproject.net.region.DefaultRegion;
+import org.onosproject.net.region.Region;
+import org.onosproject.net.region.RegionId;
 import org.onosproject.net.region.RegionListener;
 import org.onosproject.net.region.RegionService;
 
@@ -50,20 +50,16 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.junit.Test;
-
-import org.onosproject.incubator.protobuf.models.net.RegionProtoTranslator;
-import org.onosproject.grpc.nb.net.region.RegionServiceGrpc;
-import org.onosproject.grpc.nb.net.region.RegionServiceGrpc.RegionServiceBlockingStub;
-import org.onosproject.grpc.nb.net.region.RegionServiceNb;
-import org.onosproject.incubator.protobuf.services.nb.GrpcNbRegionService.RegionServiceNBServerInternal;
-import org.onosproject.net.region.Region;
-import org.onosproject.net.region.RegionId;
+import static org.junit.Assert.assertTrue;
+import static org.onosproject.cluster.NodeId.nodeId;
+import static org.onosproject.net.DeviceId.deviceId;
+import static org.onosproject.net.HostId.hostId;
 
 public class GrpcNbRegionServiceTest {
-    private static InProcessServer<GrpcNbRegionService.RegionServiceNBServerInternal> inprocessServer;
-    private static ManagedChannel channel;
+
+    private static InProcessServer<BindableService> inprocessServer;
     private static RegionServiceBlockingStub blockingStub;
+    private static ManagedChannel channel;
 
     private static final String C1 = "C1";
     private static final String C2 = "C2";
@@ -287,14 +283,11 @@
 
     @BeforeClass
     public static void beforeClass() throws InstantiationException, IllegalAccessException, IOException {
-        inprocessServer = new InProcessServer<RegionServiceNBServerInternal>(RegionServiceNBServerInternal.class);
-
-        GrpcNbRegionService outer = new GrpcNbRegionService();
-        GrpcNbRegionService.RegionServiceNBServerInternal inner = outer.getInnerClassInstance();
-        outer.regionService = MOCK_REGION;
-        inprocessServer.addServiceToBind(inner);
-
+        GrpcNbRegionService regionService = new GrpcNbRegionService();
+        regionService.regionService = MOCK_REGION;
+        inprocessServer = regionService.registerInProcessServer();
         inprocessServer.start();
+
         channel = InProcessChannelBuilder.forName("test").directExecutor()
                 // Channels are secure by default (via SSL/TLS). For the example we disable TLS to avoid
                 // needing certificates.