Remove groovy to reduce footprint 95/2495/4
authorMaros Marsalek <mmarsale@cisco.com>
Thu, 25 Aug 2016 08:46:02 +0000 (10:46 +0200)
committerMaros Marsalek <mmarsale@cisco.com>
Thu, 25 Aug 2016 10:35:11 +0000 (10:35 +0000)
Change-Id: I798558e52329c26aa5481d702745c4d46e290615
Signed-off-by: Maros Marsalek <mmarsale@cisco.com>
87 files changed:
common/minimal-distribution-parent/pom.xml
infra/minimal-distribution/pom.xml
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/Main.java
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/ProviderTrait.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/ProviderTrait.groovy with 57% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/cfgattrs/CfgAttrsModule.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/cfgattrs/CfgAttrsModule.groovy with 71% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/cfgattrs/HoneycombConfiguration.groovy [deleted file]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/cfgattrs/HoneycombConfiguration.java [new file with mode: 0644]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/BindingDataBrokerProvider.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/BindingDataBrokerProvider.groovy with 60% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/ConfigAndOperationalPipelineModule.groovy [deleted file]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/ConfigAndOperationalPipelineModule.java [new file with mode: 0644]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/DOMNotificationServiceProvider.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/DOMNotificationServiceProvider.groovy with 63% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/DataStoreProvider.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/DataStoreProvider.groovy with 56% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/DataTreeProvider.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/DataTreeProvider.groovy with 52% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/HoneycombDOMBrokerProvider.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/HoneycombDOMBrokerProvider.groovy with 51% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/HoneycombDOMDataBrokerProvider.groovy [deleted file]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/HoneycombDOMDataBrokerProvider.java [new file with mode: 0644]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/HoneycombNotificationManagerProvider.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/HoneycombNotificationManagerProvider.groovy with 60% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/InmemoryDOMDataBrokerProvider.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/InmemoryDOMDataBrokerProvider.groovy with 51% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/ModifiableDTDelegProvider.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/ModifiableDTDelegProvider.groovy with 56% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/PersistingDataTreeProvider.groovy [deleted file]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/PersistingDataTreeProvider.java [new file with mode: 0644]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/config/WriterRegistryProvider.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/config/WriterRegistryProvider.groovy with 52% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/context/ContextPipelineModule.groovy [deleted file]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/context/ContextPipelineModule.java [new file with mode: 0644]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/context/HoneycombContextDOMDataBrokerProvider.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/context/HoneycombContextDOMDataBrokerProvider.groovy with 53% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/context/ModifiableDTMgrProvider.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/context/ModifiableDTMgrProvider.groovy with 59% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/context/RealtimeMappingContextProvider.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/context/RealtimeMappingContextProvider.groovy with 58% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/oper/ReadableDTDelegProvider.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/oper/ReadableDTDelegProvider.groovy with 53% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/oper/ReaderRegistryProvider.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/oper/ReaderRegistryProvider.groovy with 52% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/InitializerPipelineModule.groovy [deleted file]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/InitializerPipelineModule.java [new file with mode: 0644]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/InitializerRegistryAdapter.java [new file with mode: 0644]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/InitializerRegistryProvider.groovy [deleted file]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/InitializerRegistryProvider.java [new file with mode: 0644]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/ModifiableDTDelegInitProvider.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/ModifiableDTDelegInitProvider.groovy with 58% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/PersistedFileInitializerProvider.groovy [deleted file]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/PersistedFileInitializerProvider.java [new file with mode: 0644]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/HoneycombNotification2NetconfProvider.groovy [deleted file]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/HoneycombNotification2NetconfProvider.java [new file with mode: 0644]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfBindingBrokerProvider.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfBindingBrokerProvider.groovy with 63% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMdsalMapperProvider.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMdsalMapperProvider.groovy with 62% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfModule.groovy [deleted file]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfModule.java [new file with mode: 0644]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMonitoringMapperProvider.groovy [deleted file]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMonitoringMapperProvider.java [new file with mode: 0644]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMonitoringReaderFactoryProvider.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMonitoringReaderFactoryProvider.groovy with 56% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMonitoringServiceProvider.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMonitoringServiceProvider.groovy with 65% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfNotificationMapperProvider.groovy [deleted file]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfNotificationMapperProvider.java [new file with mode: 0644]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfNotificationsReaderFactoryProvider.groovy [deleted file]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfNotificationsReaderFactoryProvider.java [new file with mode: 0644]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfReadersModule.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfReadersModule.groovy with 59% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfServerDispatcherProvider.groovy [deleted file]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfServerDispatcherProvider.java [new file with mode: 0644]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfSshServerProvider.groovy [deleted file]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfSshServerProvider.java [new file with mode: 0644]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfTcpServerProvider.groovy [deleted file]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfTcpServerProvider.java [new file with mode: 0644]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NettyThreadGroupProvider.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NettyThreadGroupProvider.groovy with 54% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NettyTimerProvider.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NettyTimerProvider.groovy with 64% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/HttpConnectorProvider.groovy [deleted file]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/HttpConnectorProvider.java [new file with mode: 0644]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/HttpsConnectorProvider.groovy [deleted file]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/HttpsConnectorProvider.java [new file with mode: 0644]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/JettyServerProvider.groovy [deleted file]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/JettyServerProvider.java [new file with mode: 0644]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/RestconfModule.groovy [deleted file]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/RestconfModule.java [new file with mode: 0644]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/RestconfProvider.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/RestconfProvider.groovy with 57% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/ModuleInfoBackedCtxProvider.groovy [deleted file]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/ModuleInfoBackedCtxProvider.java [new file with mode: 0644]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/SchemaModule.java [moved from infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/SchemaModule.groovy with 61% similarity]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/SchemaServiceProvider.groovy [deleted file]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/SchemaServiceProvider.java [new file with mode: 0644]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/SerializerProvider.groovy [deleted file]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/SerializerProvider.java [new file with mode: 0644]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/YangBindingProviderModule.groovy [deleted file]
infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/YangBindingProviderModule.java [new file with mode: 0644]
vpp-common/minimal-distribution/pom.xml
vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/ContextsReaderFactoryProvider.java [moved from vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/ContextsReaderFactoryProvider.groovy with 63% similarity]
vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/JVppCoreProvider.groovy [deleted file]
vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/JVppCoreProvider.java [new file with mode: 0644]
vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/JVppRegistryProvider.groovy [deleted file]
vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/JVppRegistryProvider.java [new file with mode: 0644]
vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/VppCommonModule.groovy [deleted file]
vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/VppCommonModule.java [new file with mode: 0644]
vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/VppConfigAttributes.java [moved from vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/VppConfigAttributes.groovy with 71% similarity]

index 36514df..0bfd2de 100644 (file)
@@ -20,8 +20,8 @@
     <properties>
         <nexusproxy>http://nexus.fd.io/content</nexusproxy>
         <!--<main.class>Main</main.class>-->
-        <exec.parameters>-Xms64m -Xmx128m -XX:MaxMetaspaceSize=128m</exec.parameters>
-        <exec.parameters.minimal>-client -Xms64m -Xmx64m -XX:MaxMetaspaceSize=64m -Xss512k -XX:+UseSerialGC -Djava.compiler=NONE -Xverify:none -noverify</exec.parameters.minimal>
+        <exec.parameters>-Xms32m -Xmx128m -XX:MetaspaceSize=32m -XX:MaxMetaspaceSize=128m</exec.parameters>
+        <exec.parameters.minimal>-client -Xms20m -Xmx32m -XX:MetaspaceSize=5m -XX:MaxMetaspaceSize=32m -XX:MaxMetaspaceExpansion=1m -Xss512k -XX:+UseSerialGC -Djava.compiler=NONE -Xverify:none -noverify</exec.parameters.minimal>
 
         <guice.version>4.1.0</guice.version>
         <guice.config.version>1.2.0</guice.config.version>
@@ -30,7 +30,6 @@
         <jersey.version>1.19.1</jersey.version>
         <jetty.version>9.3.11.v20160721</jetty.version>
         <servlet.version>3.1.0</servlet.version>
-        <groovy.version>2.4.7</groovy.version>
         <yangtools.version>0.8.2-Beryllium-SR2</yangtools.version>
         <mdsal.version>1.3.2-Beryllium-SR2</mdsal.version>
         <!-- Used by mdsal as provided/runtime dependency-->
                             </goals>
                             <configuration>
                                 <!-- TODO add remote debug option -->
+                                <!-- TODO add clean option -->
+                                <!-- TODO add shutdown script -->
+                                <!-- TODO add restart script -->
+                                <!-- TODO pass options to JVM? -->
                                 <source>
                                     import java.nio.file.Paths
 
index 2fa9367..397b480 100644 (file)
 
     <build>
         <plugins>
-            <plugin>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <!-- 2.8.0-01 and later require maven-compiler-plugin 3.1 or higher -->
-                <configuration>
-                    <compilerId>groovy-eclipse-compiler</compilerId>
-                </configuration>
-                <dependencies>
-                    <dependency>
-                        <groupId>org.codehaus.groovy</groupId>
-                        <artifactId>groovy-eclipse-compiler</artifactId>
-                        <version>2.9.2-01</version>
-                    </dependency>
-                    <!-- for 2.8.0-01 and later you must have an explicit dependency on groovy-eclipse-batch -->
-                    <dependency>
-                        <groupId>org.codehaus.groovy</groupId>
-                        <artifactId>groovy-eclipse-batch</artifactId>
-                        <version>2.4.3-01</version>
-                    </dependency>
-                </dependencies>
-            </plugin>
             <plugin>
                 <groupId>org.codehaus.gmaven</groupId>
                 <artifactId>groovy-maven-plugin</artifactId>
 
     <dependencies>
         <!-- DI-->
-        <dependency>
-            <groupId>org.codehaus.groovy</groupId>
-            <artifactId>groovy</artifactId>
-            <version>${groovy.version}</version>
-        </dependency>
         <dependency>
             <groupId>com.google.inject</groupId>
             <artifactId>guice</artifactId>
index d749062..44b6cd3 100644 (file)
@@ -26,7 +26,6 @@ import com.google.inject.Key;
 import com.google.inject.Module;
 import com.google.inject.ProvisionException;
 import com.google.inject.name.Names;
-import groovy.util.logging.Slf4j;
 import io.fd.honeycomb.data.init.DataTreeInitializer;
 import io.fd.honeycomb.data.init.InitializerRegistry;
 import io.fd.honeycomb.infra.distro.cfgattrs.CfgAttrsModule;
@@ -50,7 +49,6 @@ import org.opendaylight.netconf.sal.rest.api.RestConnector;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Slf4j
 public final class Main {
 
     private static final Logger LOG = LoggerFactory.getLogger(Main.class);
@@ -79,7 +77,6 @@ public final class Main {
     public static Injector init(final List<? extends Module> modules) {
         try {
             LOG.info("Starting honeycomb");
-
             Injector injector = Guice.createInjector(modules);
             LOG.info("Honeycomb configuration: " + injector.getInstance(HoneycombConfiguration.class));
 
@@ -98,9 +95,11 @@ public final class Main {
                 final RestConnector instance = injector.getInstance(RestConnector.class);
 
                 if (cfgAttributes.isRestconfHttpEnabled()) {
+                    LOG.info("Starting Restconf on http");
                     injector.getInstance(Key.get(ServerConnector.class, Names.named(RestconfModule.RESTCONF_HTTP)));
                 }
                 if (cfgAttributes.isRestconfHttpsEnabled()) {
+                    LOG.info("Starting Restconf on https");
                     injector.getInstance(Key.get(ServerConnector.class, Names.named(RestconfModule.RESTCONF_HTTPS)));
                 }
 
@@ -153,6 +152,9 @@ public final class Main {
         } catch (RuntimeException e) {
             LOG.error("Unexpected initialization failure", e);
             throw e;
+        } finally {
+            // Trigger gc to force collect initial garbage + dedicated classloader
+            System.gc();
         }
     }
 }
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro
+package io.fd.honeycomb.infra.distro;
 
-import com.google.inject.Provider
-import groovy.util.logging.Slf4j
+import com.google.inject.Provider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
-// TODO this should be a trait, but groovy compilation/stub generation sometimes fails (only) in Intellij if using trait
+public abstract class ProviderTrait<T> implements Provider<T> {
 
-@Slf4j
-abstract class ProviderTrait<T> implements Provider<T> {
+    private static final Logger LOG = LoggerFactory.getLogger(ProviderTrait.class);
 
     @Override
-    T get() {
-        log.info "Providing: {}", this
-        T create = create() as T
-        log.debug "Provided: {}", create
-        create
+    public T get() {
+        LOG.info("Providing: {}", this);
+        T create = create();
+        LOG.debug("Provided: {}", create);
+        return create;
     }
 
-    abstract def create()
+    protected abstract T create();
 }
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro.cfgattrs
+package io.fd.honeycomb.infra.distro.cfgattrs;
 
-import com.google.inject.AbstractModule
-import groovy.util.logging.Slf4j
-import net.jmob.guice.conf.core.ConfigurationModule
+import com.google.inject.AbstractModule;
+import net.jmob.guice.conf.core.ConfigurationModule;
 
 /**
  * Load the configuration from json into HoneycombConfiguration and make it available.
  */
-@Slf4j
-class CfgAttrsModule extends AbstractModule {
+public class CfgAttrsModule extends AbstractModule {
 
     protected void configure() {
-        install(ConfigurationModule.create())
+        install(ConfigurationModule.create());
         // Inject non-dependency configuration
-        requestInjection(HoneycombConfiguration)
+        requestInjection(HoneycombConfiguration.class);
     }
+
 }
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/cfgattrs/HoneycombConfiguration.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/cfgattrs/HoneycombConfiguration.groovy
deleted file mode 100644 (file)
index 15f907f..0000000
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.infra.distro.cfgattrs
-
-import groovy.transform.ToString
-import net.jmob.guice.conf.core.BindConfig
-import net.jmob.guice.conf.core.InjectConfig
-import net.jmob.guice.conf.core.Syntax
-
-/**
- * This is the Java equivalent for honeyconb.json file.
- * We use guice-config library to load all the config attributes into this class instance.
- *
- * The BindConfig annotation tells that honeycomb.json file should be looked up on classpath root.
- */
-@ToString(includeNames = true)
-@BindConfig(value = "honeycomb", syntax = Syntax.JSON)
-class HoneycombConfiguration {
-
-    // TODO break into smaller pieces, config, context, rest, netconf etc.
-
-    @InjectConfig("persisted-context-path")
-    String peristContextPath
-    @InjectConfig("persisted-context-restoration-type")
-    String persistedContextRestorationType
-
-    @InjectConfig("persisted-config-path")
-    String peristConfigPath
-    @InjectConfig("persisted-config-restoration-type")
-    String persistedConfigRestorationType
-
-    @InjectConfig("notification-service-queue-depth")
-    int notificationServiceQueueDepth
-
-    // RESTCONF
-    // HTTP
-    @InjectConfig("restconf-http-enabled")
-    String restconfHttp
-
-    @InjectConfig("restconf-binding-address")
-    Optional<String> restconfBindingAddress
-    @InjectConfig("restconf-port")
-    Optional<Integer> restconfPort
-    // HTTPS
-    @InjectConfig("restconf-https-enabled")
-    String restconfHttps
-    @InjectConfig("restconf-https-binding-address")
-    Optional<String> restconfHttpsBindingAddress
-    @InjectConfig("restconf-https-port")
-    Optional<Integer> restconfHttpsPort
-    /**
-     * Restconf keystore file name.
-     * It will be loaded from the classpath so must be present in one of the folders packaged with the distribution e.g. cert/
-     */
-    @InjectConfig("restconf-keystore")
-    Optional<String> restconfKeystore = Optional.of("/honeycomb-keystore")
-    @InjectConfig("restconf-keystore-password")
-    Optional<String> keystorePassword
-    @InjectConfig("restconf-keystore-manager-password")
-    Optional<String> keystoreManagerPassword
-    /**
-     * Restconf truststore file name.
-     * It will be loaded from the classpath so must be present in one of the folders packaged with the distribution e.g. cert/
-     */
-    @InjectConfig("restconf-truststore")
-    Optional<String> restconfTruststore
-    @InjectConfig("restconf-truststore-password")
-    Optional<String> truststorePassword
-
-    // This is the way for optional attributes with default values to work
-    @InjectConfig("restconf-websocket-port")
-    Optional<Integer> restconfWebsocketPort = Optional.of(7779)
-
-    @InjectConfig("restconf-root-path")
-    Optional<String> restconfRootPath = Optional.of("/restconf")
-    @InjectConfig("restconf-pool-max-size")
-    Optional<Integer> restPoolMaxSize = Optional.of(10)
-    @InjectConfig("restconf-pool-min-size")
-    Optional<Integer> restPoolMinSize = Optional.of(1)
-
-    @InjectConfig("restconf-acceptors-size")
-    Optional<Integer> acceptorsSize = Optional.of(1)
-    @InjectConfig("restconf-selectors-size")
-    Optional<Integer> selectorsSize = Optional.of(1)
-    @InjectConfig("restconf-https-acceptors-size")
-    Optional<Integer> httpsAcceptorsSize = Optional.of(1)
-    @InjectConfig("restconf-https-selectors-size")
-    Optional<Integer> httpsSelectorsSize = Optional.of(1)
-
-    // Booleans not supported
-    boolean isRestconfHttpEnabled() { Boolean.valueOf(restconfHttp) }
-    boolean isRestconfHttpsEnabled() { Boolean.valueOf(restconfHttps) }
-    boolean isRestconfEnabled() { isRestconfHttpEnabled() || isRestconfHttpsEnabled() }
-
-    // HONEYCOMB_NETCONF
-    @InjectConfig("netconf-netty-threads")
-    Integer netconfNettyThreads
-
-    // HONEYCOMB_NETCONF TCP
-    @InjectConfig("netconf-tcp-enabled")
-    String netconfTcp
-    @InjectConfig("netconf-tcp-binding-address")
-    Optional<String> netconfTcpBindingAddress
-    @InjectConfig("netconf-tcp-binding-port")
-    Optional<Integer> netconfTcpBindingPort
-
-    // HONEYCOMB_NETCONF SSH
-    @InjectConfig("netconf-ssh-enabled")
-    String netconfSsh
-    @InjectConfig("netconf-ssh-binding-address")
-    Optional<String> netconfSshBindingAddress
-    @InjectConfig("netconf-ssh-binding-port")
-    Optional<Integer> netconfSshBindingPort
-
-    @InjectConfig("netconf-notification-stream-name")
-    Optional<String> netconfNotificationStreamName = Optional.of("honeycomb")
-
-    boolean isNetconfTcpEnabled() { Boolean.valueOf(netconfTcp) }
-    boolean isNetconfSshEnabled() { Boolean.valueOf(netconfSsh) }
-    boolean isNetconfEnabled() { isNetconfTcpEnabled() || isNetconfSshEnabled() }
-
-    @InjectConfig("username")
-    String username
-    @InjectConfig("password")
-    String password
-}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/cfgattrs/HoneycombConfiguration.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/cfgattrs/HoneycombConfiguration.java
new file mode 100644 (file)
index 0000000..8c09c7b
--- /dev/null
@@ -0,0 +1,174 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.infra.distro.cfgattrs;
+
+import com.google.common.base.MoreObjects;
+import java.util.Optional;
+import net.jmob.guice.conf.core.BindConfig;
+import net.jmob.guice.conf.core.InjectConfig;
+import net.jmob.guice.conf.core.Syntax;
+
+/**
+ * This is the Java equivalent for honeyconb.json file. We use guice-config library to load all the config attributes
+ * into this class instance.
+ *
+ * The BindConfig annotation tells that honeycomb.json file should be looked up on classpath root.
+ */
+@BindConfig(value = "honeycomb", syntax = Syntax.JSON)
+public class HoneycombConfiguration {
+
+    public boolean isRestconfHttpEnabled() {
+        return Boolean.valueOf(restconfHttp);
+    }
+
+    public boolean isRestconfHttpsEnabled() {
+        return Boolean.valueOf(restconfHttps);
+    }
+
+    public boolean isRestconfEnabled() {
+        return isRestconfHttpEnabled() || isRestconfHttpsEnabled();
+    }
+
+    public boolean isNetconfTcpEnabled() {
+        return Boolean.valueOf(netconfTcp);
+    }
+
+    public boolean isNetconfSshEnabled() {
+        return Boolean.valueOf(netconfSsh);
+    }
+
+    public boolean isNetconfEnabled() {
+        return isNetconfTcpEnabled() || isNetconfSshEnabled();
+    }
+
+    @InjectConfig("persisted-context-path")
+    public String peristContextPath;
+    @InjectConfig("persisted-context-restoration-type")
+    public String persistedContextRestorationType;
+    @InjectConfig("persisted-config-path")
+    public String peristConfigPath;
+    @InjectConfig("persisted-config-restoration-type")
+    public String persistedConfigRestorationType;
+    @InjectConfig("notification-service-queue-depth")
+    public int notificationServiceQueueDepth;
+    @InjectConfig("restconf-http-enabled")
+    public String restconfHttp;
+    @InjectConfig("restconf-binding-address")
+    public Optional<String> restconfBindingAddress;
+    @InjectConfig("restconf-port")
+    public Optional<Integer> restconfPort;
+    @InjectConfig("restconf-https-enabled")
+    public String restconfHttps;
+    @InjectConfig("restconf-https-binding-address")
+    public Optional<String> restconfHttpsBindingAddress;
+    @InjectConfig("restconf-https-port")
+    public Optional<Integer> restconfHttpsPort;
+    /**
+     * Restconf keystore file name. It will be loaded from the classpath so must be present in one of the folders
+     * packaged with the distribution e.g. cert/
+     */
+    @InjectConfig("restconf-keystore")
+    public Optional<String> restconfKeystore = Optional.of("/honeycomb-keystore");
+    @InjectConfig("restconf-keystore-password")
+    public Optional<String> keystorePassword;
+    @InjectConfig("restconf-keystore-manager-password")
+    public Optional<String> keystoreManagerPassword;
+    /**
+     * Restconf truststore file name. It will be loaded from the classpath so must be present in one of the folders
+     * packaged with the distribution e.g. cert/
+     */
+    @InjectConfig("restconf-truststore")
+    public Optional<String> restconfTruststore;
+    @InjectConfig("restconf-truststore-password")
+    public Optional<String> truststorePassword;
+    @InjectConfig("restconf-websocket-port")
+    public Optional<Integer> restconfWebsocketPort = Optional.of(7779);
+    @InjectConfig("restconf-root-path")
+    public Optional<String> restconfRootPath = Optional.of("/restconf");
+    @InjectConfig("restconf-pool-max-size")
+    public Optional<Integer> restPoolMaxSize = Optional.of(10);
+    @InjectConfig("restconf-pool-min-size")
+    public Optional<Integer> restPoolMinSize = Optional.of(1);
+    @InjectConfig("restconf-acceptors-size")
+    public Optional<Integer> acceptorsSize = Optional.of(1);
+    @InjectConfig("restconf-selectors-size")
+    public Optional<Integer> selectorsSize = Optional.of(1);
+    @InjectConfig("restconf-https-acceptors-size")
+    public Optional<Integer> httpsAcceptorsSize = Optional.of(1);
+    @InjectConfig("restconf-https-selectors-size")
+    public Optional<Integer> httpsSelectorsSize = Optional.of(1);
+    @InjectConfig("netconf-netty-threads")
+    public Integer netconfNettyThreads;
+    @InjectConfig("netconf-tcp-enabled")
+    public String netconfTcp;
+    @InjectConfig("netconf-tcp-binding-address")
+    public Optional<String> netconfTcpBindingAddress;
+    @InjectConfig("netconf-tcp-binding-port")
+    public Optional<Integer> netconfTcpBindingPort;
+    @InjectConfig("netconf-ssh-enabled")
+    public String netconfSsh;
+    @InjectConfig("netconf-ssh-binding-address")
+    public Optional<String> netconfSshBindingAddress;
+    @InjectConfig("netconf-ssh-binding-port")
+    public Optional<Integer> netconfSshBindingPort;
+    @InjectConfig("netconf-notification-stream-name")
+    public Optional<String> netconfNotificationStreamName = Optional.of("honeycomb");
+    @InjectConfig("username")
+    public String username;
+    @InjectConfig("password")
+    public String password;
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("peristContextPath", peristContextPath)
+                .add("persistedContextRestorationType", persistedContextRestorationType)
+                .add("peristConfigPath", peristConfigPath)
+                .add("persistedConfigRestorationType", persistedConfigRestorationType)
+                .add("notificationServiceQueueDepth", notificationServiceQueueDepth)
+                .add("restconfHttp", restconfHttp)
+                .add("restconfBindingAddress", restconfBindingAddress)
+                .add("restconfPort", restconfPort)
+                .add("restconfHttps", restconfHttps)
+                .add("restconfHttpsBindingAddress", restconfHttpsBindingAddress)
+                .add("restconfHttpsPort", restconfHttpsPort)
+                .add("restconfKeystore", restconfKeystore)
+                .add("keystorePassword", keystorePassword)
+                .add("keystoreManagerPassword", keystoreManagerPassword)
+                .add("restconfTruststore", restconfTruststore)
+                .add("truststorePassword", truststorePassword)
+                .add("restconfWebsocketPort", restconfWebsocketPort)
+                .add("restconfRootPath", restconfRootPath)
+                .add("restPoolMaxSize", restPoolMaxSize)
+                .add("restPoolMinSize", restPoolMinSize)
+                .add("acceptorsSize", acceptorsSize)
+                .add("selectorsSize", selectorsSize)
+                .add("httpsAcceptorsSize", httpsAcceptorsSize)
+                .add("httpsSelectorsSize", httpsSelectorsSize)
+                .add("netconfNettyThreads", netconfNettyThreads)
+                .add("netconfTcp", netconfTcp)
+                .add("netconfTcpBindingAddress", netconfTcpBindingAddress)
+                .add("netconfTcpBindingPort", netconfTcpBindingPort)
+                .add("netconfSsh", netconfSsh)
+                .add("netconfSshBindingAddress", netconfSshBindingAddress)
+                .add("netconfSshBindingPort", netconfSshBindingPort)
+                .add("netconfNotificationStreamName", netconfNotificationStreamName)
+                .add("username", username)
+                .add("password", password)
+                .toString();
+    }
+}
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro.data
+package io.fd.honeycomb.infra.distro.data;
 
-import com.google.inject.Inject
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import org.opendaylight.controller.md.sal.binding.api.DataBroker
-import org.opendaylight.controller.md.sal.binding.impl.BindingDOMDataBrokerAdapter
-import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec
-import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker
+import com.google.inject.Inject;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.impl.BindingDOMDataBrokerAdapter;
+import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
 
-@Slf4j
-@ToString
-class BindingDataBrokerProvider extends ProviderTrait<DataBroker> {
+public final class BindingDataBrokerProvider extends ProviderTrait<DataBroker> {
 
     @Inject
-    DOMDataBroker domDataBroker
+    private DOMDataBroker domDataBroker;
     @Inject
-    BindingToNormalizedNodeCodec mappingService
+    private BindingToNormalizedNodeCodec mappingService;
 
     @Override
-    def create() { new BindingDOMDataBrokerAdapter(domDataBroker, mappingService) }
+    protected BindingDOMDataBrokerAdapter create() {
+        return new BindingDOMDataBrokerAdapter(domDataBroker, mappingService);
+    }
 }
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/ConfigAndOperationalPipelineModule.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/ConfigAndOperationalPipelineModule.groovy
deleted file mode 100644 (file)
index eb17cf3..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.infra.distro.data
-
-import com.google.inject.PrivateModule
-import com.google.inject.Singleton
-import com.google.inject.name.Names
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.data.ModifiableDataManager
-import io.fd.honeycomb.data.ReadableDataManager
-import io.fd.honeycomb.data.init.DataTreeInitializer
-import io.fd.honeycomb.infra.distro.data.config.WriterRegistryProvider
-import io.fd.honeycomb.infra.distro.data.oper.ReadableDTDelegProvider
-import io.fd.honeycomb.infra.distro.data.oper.ReaderRegistryProvider
-import io.fd.honeycomb.infra.distro.initializer.PersistedFileInitializerProvider
-import io.fd.honeycomb.translate.read.registry.ModifiableReaderRegistryBuilder
-import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder
-import org.opendaylight.controller.md.sal.binding.api.DataBroker
-import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker
-import org.opendaylight.controller.md.sal.dom.broker.impl.DOMNotificationRouter
-import org.opendaylight.controller.sal.core.api.Broker
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree
-
-@Slf4j
-class ConfigAndOperationalPipelineModule extends PrivateModule {
-
-    public static final String HONEYCOMB_CONFIG_NONPERSIST = "honeycomb-config-nopersist"
-    public static final String HONEYCOMB_CONFIG = "honeycomb-config"
-
-    protected void configure() {
-        // Expose registries for plugin reader/writer factories
-        bind(ModifiableWriterRegistryBuilder).toProvider(WriterRegistryProvider).in(Singleton)
-        expose(ModifiableWriterRegistryBuilder)
-        bind(ModifiableReaderRegistryBuilder).toProvider(ReaderRegistryProvider).in(Singleton)
-        expose(ModifiableReaderRegistryBuilder)
-
-        // Non persisting data tree for config
-        bind(DataTree)
-                .annotatedWith(Names.named(HONEYCOMB_CONFIG_NONPERSIST))
-                .toProvider(DataTreeProvider.ConfigDataTreeProvider)
-                .in(Singleton)
-        expose(DataTree).annotatedWith(Names.named(HONEYCOMB_CONFIG_NONPERSIST))
-        // Persisting data tree wrapper for config
-        bind(DataTree)
-                .annotatedWith(Names.named(HONEYCOMB_CONFIG))
-                .toProvider(PersistingDataTreeProvider.ConfigPersistingDataTreeProvider)
-                .in(Singleton)
-        expose(DataTree).annotatedWith(Names.named(HONEYCOMB_CONFIG))
-
-        // Config Data Tree manager working on top of config data tree + writer registry
-        bind(ModifiableDataManager).toProvider(ModifiableDTDelegProvider).in(Singleton)
-        // Operational Data Tree manager working on top of reader registry
-        bind(ReadableDataManager).toProvider(ReadableDTDelegProvider).in(Singleton)
-        expose(ReadableDataManager)
-
-        // DOMDataBroker wrapper on top of data tree managers
-        def domBrokerProvider = new HoneycombDOMDataBrokerProvider()
-        bind(DOMDataBroker).toProvider(domBrokerProvider).in(Singleton)
-
-        // BA version of data broker
-        bind(DataBroker).annotatedWith(Names.named(HONEYCOMB_CONFIG)).toProvider(BindingDataBrokerProvider).in(Singleton)
-        expose(DataBroker).annotatedWith(Names.named(HONEYCOMB_CONFIG))
-
-        // Create initializer to init persisted config data
-        bind(DataTreeInitializer)
-                .annotatedWith(Names.named(HONEYCOMB_CONFIG))
-                .toProvider(PersistedFileInitializerProvider.PersistedConfigInitializerProvider)
-                .in(Singleton)
-        expose(DataTreeInitializer).annotatedWith(Names.named(HONEYCOMB_CONFIG))
-
-        configureNotifications()
-    }
-
-    protected void configureNotifications() {
-        // Create notification service
-        bind(DOMNotificationRouter).toProvider(DOMNotificationServiceProvider).in(Singleton)
-        expose(DOMNotificationRouter)
-        // Wrap notification service, data broker and schema service in a Broker MD-SAL API
-        bind(Broker).toProvider(HoneycombDOMBrokerProvider).in(Singleton)
-        expose(Broker)
-    }
-}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/ConfigAndOperationalPipelineModule.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/ConfigAndOperationalPipelineModule.java
new file mode 100644 (file)
index 0000000..bac1b3c
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.infra.distro.data;
+
+import com.google.inject.PrivateModule;
+import com.google.inject.Singleton;
+import com.google.inject.name.Names;
+import io.fd.honeycomb.data.ModifiableDataManager;
+import io.fd.honeycomb.data.ReadableDataManager;
+import io.fd.honeycomb.data.init.DataTreeInitializer;
+import io.fd.honeycomb.infra.distro.data.config.WriterRegistryProvider;
+import io.fd.honeycomb.infra.distro.data.oper.ReadableDTDelegProvider;
+import io.fd.honeycomb.infra.distro.data.oper.ReaderRegistryProvider;
+import io.fd.honeycomb.infra.distro.initializer.PersistedFileInitializerProvider;
+import io.fd.honeycomb.translate.read.registry.ModifiableReaderRegistryBuilder;
+import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
+import org.opendaylight.controller.md.sal.dom.broker.impl.DOMNotificationRouter;
+import org.opendaylight.controller.sal.core.api.Broker;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree;
+
+public class ConfigAndOperationalPipelineModule extends PrivateModule {
+
+    public static final String HONEYCOMB_CONFIG_NONPERSIST = "honeycomb-config-nopersist";
+    public static final String HONEYCOMB_CONFIG = "honeycomb-config";
+
+    protected void configure() {
+        // Expose registries for plugin reader/writer factories
+        bind(ModifiableWriterRegistryBuilder.class).toProvider(WriterRegistryProvider.class).in(Singleton.class);
+        expose(ModifiableWriterRegistryBuilder.class);
+        bind(ModifiableReaderRegistryBuilder.class).toProvider(ReaderRegistryProvider.class).in(Singleton.class);
+        expose(ModifiableReaderRegistryBuilder.class);
+
+        // Non persisting data tree for config
+        bind(DataTree.class).annotatedWith(Names.named(HONEYCOMB_CONFIG_NONPERSIST))
+                .toProvider(DataTreeProvider.ConfigDataTreeProvider.class).in(Singleton.class);
+        expose(DataTree.class).annotatedWith(Names.named(HONEYCOMB_CONFIG_NONPERSIST));
+        // Persisting data tree wrapper for config
+        bind(DataTree.class).annotatedWith(Names.named(HONEYCOMB_CONFIG))
+                .toProvider(PersistingDataTreeProvider.ConfigPersistingDataTreeProvider.class).in(Singleton.class);
+        expose(DataTree.class).annotatedWith(Names.named(HONEYCOMB_CONFIG));
+
+        // Config Data Tree manager working on top of config data tree + writer registry
+        bind(ModifiableDataManager.class).toProvider(ModifiableDTDelegProvider.class).in(Singleton.class);
+        // Operational Data Tree manager working on top of reader registry
+        bind(ReadableDataManager.class).toProvider(ReadableDTDelegProvider.class).in(Singleton.class);
+        expose(ReadableDataManager.class);
+
+        // DOMDataBroker wrapper on top of data tree managers
+        HoneycombDOMDataBrokerProvider domBrokerProvider = new HoneycombDOMDataBrokerProvider();
+        bind(DOMDataBroker.class).toProvider(domBrokerProvider).in(Singleton.class);
+
+        // BA version of data broker
+        bind(DataBroker.class).annotatedWith(Names.named(HONEYCOMB_CONFIG)).toProvider(BindingDataBrokerProvider.class)
+                .in(Singleton.class);
+        expose(DataBroker.class).annotatedWith(Names.named(HONEYCOMB_CONFIG));
+
+        // Create initializer to init persisted config data
+        bind(DataTreeInitializer.class).annotatedWith(Names.named(HONEYCOMB_CONFIG))
+                .toProvider(PersistedFileInitializerProvider.PersistedConfigInitializerProvider.class)
+                .in(Singleton.class);
+        expose(DataTreeInitializer.class).annotatedWith(Names.named(HONEYCOMB_CONFIG));
+
+        configureNotifications();
+    }
+
+    private void configureNotifications() {
+        // Create notification service
+        bind(DOMNotificationRouter.class).toProvider(DOMNotificationServiceProvider.class).in(Singleton.class);
+        expose(DOMNotificationRouter.class);
+        // Wrap notification service, data broker and schema service in a Broker MD-SAL API
+        bind(Broker.class).toProvider(HoneycombDOMBrokerProvider.class).in(Singleton.class);
+        expose(Broker.class);
+    }
+}
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro.data
+package io.fd.honeycomb.infra.distro.data;
 
-import com.google.inject.Inject
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import org.opendaylight.controller.md.sal.dom.broker.impl.DOMNotificationRouter
+import com.google.inject.Inject;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration;
+import org.opendaylight.controller.md.sal.dom.broker.impl.DOMNotificationRouter;
 
-@Slf4j
-@ToString
-class DOMNotificationServiceProvider extends ProviderTrait<DOMNotificationRouter> {
+public final class DOMNotificationServiceProvider extends ProviderTrait<DOMNotificationRouter> {
 
     @Inject
-    HoneycombConfiguration cfg
+    private HoneycombConfiguration cfg;
 
-    def create() { DOMNotificationRouter.create(cfg.notificationServiceQueueDepth) }
+    @Override
+    protected DOMNotificationRouter create() {
+        return DOMNotificationRouter.create(cfg.notificationServiceQueueDepth);
+    }
 }
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro.data
+package io.fd.honeycomb.infra.distro.data;
 
-import com.google.inject.Inject
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType
-import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStore
-import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStoreFactory
-import org.opendaylight.controller.sal.core.api.model.SchemaService
+import com.google.inject.Inject;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStore;
+import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStoreFactory;
+import org.opendaylight.controller.sal.core.api.model.SchemaService;
 
-@Slf4j
-@ToString
-class DataStoreProvider extends ProviderTrait<InMemoryDOMDataStore> {
+public final class DataStoreProvider extends ProviderTrait<InMemoryDOMDataStore> {
 
     @Inject
-    SchemaService schemaService
+    private SchemaService schemaService;
+    private String name;
+    private LogicalDatastoreType type;
 
-    String name
-    LogicalDatastoreType type
+    public DataStoreProvider(final String name,
+                             final LogicalDatastoreType type) {
+        this.name = name;
+        this.type = type;
+    }
 
     @Override
-    def create() { InMemoryDOMDataStoreFactory.create(name, type, schemaService, false, null) }
+    protected InMemoryDOMDataStore create() {
+        return InMemoryDOMDataStoreFactory.create(name, type, schemaService, false, null);
+    }
 }
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro.data
-
-import com.google.inject.Inject
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration
-import org.opendaylight.controller.sal.core.api.model.SchemaService
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree
-import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType
-import org.opendaylight.yangtools.yang.data.impl.schema.tree.InMemoryDataTreeFactory
-
-@Slf4j
-@ToString
-abstract class DataTreeProvider extends ProviderTrait<DataTree> {
+package io.fd.honeycomb.infra.distro.data;
+
+import com.google.inject.Inject;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration;
+import org.opendaylight.controller.sal.core.api.model.SchemaService;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.TipProducingDataTree;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
+import org.opendaylight.yangtools.yang.data.impl.schema.tree.InMemoryDataTreeFactory;
+
+public abstract class DataTreeProvider extends ProviderTrait<DataTree> {
 
     @Inject
-    SchemaService schemaService
+    private SchemaService schemaService;
     @Inject
-    HoneycombConfiguration config
+    private HoneycombConfiguration config;
 
-    def create() {
-        def delegate = InMemoryDataTreeFactory.getInstance().create(getType())
-        delegate.setSchemaContext(schemaService.getGlobalContext())
-        delegate
+    public TipProducingDataTree create() {
+        TipProducingDataTree delegate = InMemoryDataTreeFactory.getInstance().create(getType());
+        delegate.setSchemaContext(schemaService.getGlobalContext());
+        return delegate;
     }
 
-    abstract TreeType getType()
+    public abstract TreeType getType();
+
+    public static class ConfigDataTreeProvider extends DataTreeProvider {
+        public TreeType getType() {
+            return TreeType.CONFIGURATION;
+        }
 
-    @Slf4j
-    @ToString
-    static class ConfigDataTreeProvider extends DataTreeProvider {
-        TreeType getType() { TreeType.CONFIGURATION }
     }
 
-    @Slf4j
-    @ToString
-    static class ContextDataTreeProvider extends DataTreeProvider {
-        TreeType getType() { TreeType.OPERATIONAL }
+    public static class ContextDataTreeProvider extends DataTreeProvider {
+        public TreeType getType() {
+            return TreeType.OPERATIONAL;
+        }
+
     }
 }
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro.data
+package io.fd.honeycomb.infra.distro.data;
 
-import com.google.inject.Inject
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.impl.NorthboundFacadeHoneycombDOMBroker
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker
-import org.opendaylight.controller.md.sal.dom.broker.impl.DOMNotificationRouter
-import org.opendaylight.controller.sal.core.api.Broker
-import org.opendaylight.controller.sal.core.api.model.SchemaService
+import com.google.inject.Inject;
+import io.fd.honeycomb.impl.NorthboundFacadeHoneycombDOMBroker;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
+import org.opendaylight.controller.md.sal.dom.broker.impl.DOMNotificationRouter;
+import org.opendaylight.controller.sal.core.api.Broker;
+import org.opendaylight.controller.sal.core.api.model.SchemaService;
 
-@Slf4j
-@ToString
-class HoneycombDOMBrokerProvider extends ProviderTrait<Broker> {
+public final class HoneycombDOMBrokerProvider extends ProviderTrait<Broker> {
 
     @Inject
-    DOMDataBroker domDataBroker
+    private DOMDataBroker domDataBroker;
     @Inject
-    SchemaService schemaService
+    private SchemaService schemaService;
     @Inject
-    DOMNotificationRouter domNotificationService
+    private DOMNotificationRouter domNotificationService;
 
-    def create() { new NorthboundFacadeHoneycombDOMBroker(domDataBroker, schemaService, domNotificationService) }
+    @Override
+    protected NorthboundFacadeHoneycombDOMBroker create() {
+        return new NorthboundFacadeHoneycombDOMBroker(domDataBroker, schemaService, domNotificationService);
+    }
 }
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/HoneycombDOMDataBrokerProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/HoneycombDOMDataBrokerProvider.groovy
deleted file mode 100644 (file)
index a2fec2a..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.infra.distro.data
-
-import com.google.inject.Inject
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.data.ModifiableDataManager
-import io.fd.honeycomb.data.ReadableDataManager
-import io.fd.honeycomb.data.impl.DataBroker
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker
-
-@Slf4j
-@ToString
-class HoneycombDOMDataBrokerProvider extends ProviderTrait<DOMDataBroker> {
-
-    @Inject
-    ModifiableDataManager modDataManager
-
-    @Inject
-    ReadableDataManager readDataManager
-
-    def create() {
-        readDataManager ? DataBroker.create(modDataManager, readDataManager) : DataBroker.create(modDataManager)
-    }
-}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/HoneycombDOMDataBrokerProvider.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/HoneycombDOMDataBrokerProvider.java
new file mode 100644 (file)
index 0000000..92bbc51
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.infra.distro.data;
+
+import com.google.inject.Inject;
+import io.fd.honeycomb.data.ModifiableDataManager;
+import io.fd.honeycomb.data.ReadableDataManager;
+import io.fd.honeycomb.data.impl.DataBroker;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
+
+public final class HoneycombDOMDataBrokerProvider extends ProviderTrait<DOMDataBroker> {
+
+    @Inject
+    private ModifiableDataManager modDataManager;
+    @Inject(optional = true)
+    private ReadableDataManager readDataManager;
+
+    protected DataBroker create() {
+        return readDataManager != null
+                ? DataBroker.create(modDataManager, readDataManager)
+                : DataBroker.create(modDataManager);
+    }
+}
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro.data
+package io.fd.honeycomb.infra.distro.data;
 
-import com.google.inject.Inject
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import io.fd.honeycomb.notification.ManagedNotificationProducer
-import io.fd.honeycomb.notification.NotificationCollector
-import io.fd.honeycomb.notification.impl.HoneycombNotificationCollector
-import io.fd.honeycomb.notification.impl.NotificationProducerRegistry
-import io.fd.honeycomb.notification.impl.NotificationProducerTracker
-import org.opendaylight.controller.md.sal.binding.impl.BindingDOMNotificationPublishServiceAdapter
-import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec
-import org.opendaylight.controller.md.sal.dom.broker.impl.DOMNotificationRouter
+import com.google.common.collect.Lists;
+import com.google.inject.Inject;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import io.fd.honeycomb.notification.ManagedNotificationProducer;
+import io.fd.honeycomb.notification.NotificationCollector;
+import io.fd.honeycomb.notification.impl.HoneycombNotificationCollector;
+import io.fd.honeycomb.notification.impl.NotificationProducerRegistry;
+import io.fd.honeycomb.notification.impl.NotificationProducerTracker;
+import java.util.HashSet;
+import java.util.Set;
+import org.opendaylight.controller.md.sal.binding.impl.BindingDOMNotificationPublishServiceAdapter;
+import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec;
+import org.opendaylight.controller.md.sal.dom.broker.impl.DOMNotificationRouter;
 
-@Slf4j
-@ToString
-class HoneycombNotificationManagerProvider extends ProviderTrait<NotificationCollector> {
+public final class HoneycombNotificationManagerProvider extends ProviderTrait<NotificationCollector> {
 
     @Inject
-    DOMNotificationRouter notificationRouter
+    private DOMNotificationRouter notificationRouter;
     @Inject(optional = true)
-    Set<ManagedNotificationProducer> notificationProducers = []
+    private Set<ManagedNotificationProducer> notificationProducers = new HashSet<>();
     @Inject
-    BindingToNormalizedNodeCodec codec
+    private BindingToNormalizedNodeCodec codec;
 
     @Override
-    def create() {
+    protected HoneycombNotificationCollector create() {
         // Create the registry to keep track of what'OPERATIONAL registered
-        def notificationProducerRegistry = new NotificationProducerRegistry(notificationProducers as List);
+        NotificationProducerRegistry notificationProducerRegistry =
+                new NotificationProducerRegistry(Lists.newArrayList(notificationProducers));
 
         // Create BA version of notification service (implementation is free from ODL)
-        def bindingDOMNotificationPublishServiceAdapter =
+        BindingDOMNotificationPublishServiceAdapter bindingDOMNotificationPublishServiceAdapter =
                 new BindingDOMNotificationPublishServiceAdapter(codec, notificationRouter);
 
         // Create Collector on top of BA notification service and registry
-        def honeycombNotificationCollector =
-                new HoneycombNotificationCollector(bindingDOMNotificationPublishServiceAdapter, notificationProducerRegistry);
+        HoneycombNotificationCollector honeycombNotificationCollector =
+                new HoneycombNotificationCollector(bindingDOMNotificationPublishServiceAdapter,
+                        notificationProducerRegistry);
 
         // Create tracker, responsible for starting and stopping registered notification producers whenever necessary
-        def notificationProducerTracker =
+        NotificationProducerTracker notificationProducerTracker =
                 new NotificationProducerTracker(notificationProducerRegistry, honeycombNotificationCollector,
                         notificationRouter);
 
@@ -62,6 +63,6 @@ class HoneycombNotificationManagerProvider extends ProviderTrait<NotificationCol
         // DOMNotificationService is already provided by DOMBroker injected into RESTCONF, however RESTCONF
         // only supports data-change notification, nothing else. So currently its impossible.
 
-        honeycombNotificationCollector
+        return honeycombNotificationCollector;
     }
 }
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro.data
-
-import com.google.inject.Inject
-import com.google.inject.name.Named
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitDeadlockException
-import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker
-import org.opendaylight.controller.md.sal.dom.broker.impl.SerializedDOMDataBroker
-import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStore
-import org.opendaylight.yangtools.util.concurrent.DeadlockDetectingListeningExecutorService
-import org.opendaylight.yangtools.util.concurrent.SpecialExecutors
-
-@Slf4j
-@ToString
-class InmemoryDOMDataBrokerProvider extends ProviderTrait<DOMDataBroker> {
-
-    public static final String CONFIG = "config"
-    public static final String OPERATIONAL = "operational"
+package io.fd.honeycomb.infra.distro.data;
+
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitDeadlockException;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
+import org.opendaylight.controller.md.sal.dom.broker.impl.SerializedDOMDataBroker;
+import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStore;
+import org.opendaylight.controller.sal.core.spi.data.DOMStore;
+import org.opendaylight.yangtools.util.concurrent.DeadlockDetectingListeningExecutorService;
+import org.opendaylight.yangtools.util.concurrent.SpecialExecutors;
+
+public final class InmemoryDOMDataBrokerProvider extends ProviderTrait<DOMDataBroker> {
+
+    public static final String CONFIG = "config";
+    public static final String OPERATIONAL = "operational";
 
     @Inject
     @Named(InmemoryDOMDataBrokerProvider.CONFIG)
-    InMemoryDOMDataStore cfgDataStore
-
+    private InMemoryDOMDataStore cfgDataStore;
     @Inject
     @Named(InmemoryDOMDataBrokerProvider.OPERATIONAL)
-    InMemoryDOMDataStore operDataStore
+    private InMemoryDOMDataStore operDataStore;
 
     @Override
-    def create() {
+    protected SerializedDOMDataBroker create() {
         // This Databroker is dedicated for netconf metadata, not expected to be under heavy load
-        def listenableFutureExecutor = SpecialExecutors.newBlockingBoundedCachedThreadPool(1, 100, "commits")
-        def commitExecutor = SpecialExecutors.newBoundedSingleThreadExecutor(100, "WriteTxCommit")
+        ExecutorService listenableFutureExecutor =
+                SpecialExecutors.newBlockingBoundedCachedThreadPool(1, 100, "commits");
+        ExecutorService commitExecutor = SpecialExecutors.newBoundedSingleThreadExecutor(100, "WriteTxCommit");
         // TODO try to provide more lightweight implementation of DataBroker, maybe a single executor would be enough
 
-        def map = [:]
-        map.put(LogicalDatastoreType.CONFIGURATION, cfgDataStore)
-        map.put(LogicalDatastoreType.OPERATIONAL, operDataStore)
+        Map<LogicalDatastoreType, DOMStore> map = new LinkedHashMap<>();
+        map.put(LogicalDatastoreType.CONFIGURATION, cfgDataStore);
+        map.put(LogicalDatastoreType.OPERATIONAL, operDataStore);
 
-        new SerializedDOMDataBroker(map,
-                new DeadlockDetectingListeningExecutorService(commitExecutor,
-                        TransactionCommitDeadlockException.DEADLOCK_EXCEPTION_SUPPLIER,
-                        listenableFutureExecutor))
+        return new SerializedDOMDataBroker(map, new DeadlockDetectingListeningExecutorService(commitExecutor,
+                TransactionCommitDeadlockException.DEADLOCK_EXCEPTION_SUPPLIER, listenableFutureExecutor));
     }
 }
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro.data
+package io.fd.honeycomb.infra.distro.data;
 
-import com.google.inject.Inject
-import com.google.inject.name.Named
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.data.ModifiableDataManager
-import io.fd.honeycomb.data.impl.ModifiableDataTreeDelegator
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import io.fd.honeycomb.infra.distro.data.context.ContextPipelineModule
-import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder
-import org.opendaylight.controller.md.sal.binding.api.DataBroker
-import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import io.fd.honeycomb.data.ModifiableDataManager;
+import io.fd.honeycomb.data.impl.ModifiableDataTreeDelegator;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import io.fd.honeycomb.infra.distro.data.context.ContextPipelineModule;
+import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder;
+import io.fd.honeycomb.translate.write.registry.WriterRegistryBuilder;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree;
 
-@Slf4j
-@ToString
-class ModifiableDTDelegProvider extends ProviderTrait<ModifiableDataManager> {
+public final class ModifiableDTDelegProvider extends ProviderTrait<ModifiableDataManager> {
 
     @Inject
-    BindingToNormalizedNodeCodec serializer
+    private BindingToNormalizedNodeCodec serializer;
     @Inject
     @Named(ConfigAndOperationalPipelineModule.HONEYCOMB_CONFIG)
-    DataTree dataTree
+    private DataTree dataTree;
     @Inject
-    ModifiableWriterRegistryBuilder registry
+    private ModifiableWriterRegistryBuilder registry;
     @Inject
     @Named(ContextPipelineModule.HONEYCOMB_CONTEXT)
-    DataBroker contextBroker
+    private DataBroker contextBroker;
 
     @Override
-    def create() { new ModifiableDataTreeDelegator(serializer, dataTree, registry.build(), contextBroker) }
+    protected ModifiableDataTreeDelegator create() {
+        return new ModifiableDataTreeDelegator(serializer, dataTree,
+                ((WriterRegistryBuilder) registry).build(), contextBroker);
+    }
 }
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/PersistingDataTreeProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/PersistingDataTreeProvider.groovy
deleted file mode 100644 (file)
index 6c41ad6..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.infra.distro.data
-
-import com.google.inject.Inject
-import com.google.inject.name.Named
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.data.impl.PersistingDataTreeAdapter
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration
-import io.fd.honeycomb.infra.distro.data.context.ContextPipelineModule
-import org.opendaylight.controller.sal.core.api.model.SchemaService
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree
-import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType
-
-import java.nio.file.Paths
-
-@Slf4j
-@ToString
-abstract class PersistingDataTreeProvider extends ProviderTrait<DataTree> {
-
-    @Inject
-    SchemaService schemaService
-    @Inject
-    HoneycombConfiguration config
-
-    def create() {
-        new PersistingDataTreeAdapter(delegate, schemaService, Paths.get(path))
-    }
-
-    abstract String getPath()
-    abstract TreeType getType()
-    abstract DataTree getDelegate()
-
-    static class ConfigPersistingDataTreeProvider extends PersistingDataTreeProvider {
-
-        @Inject
-        @Named(ConfigAndOperationalPipelineModule.HONEYCOMB_CONFIG_NONPERSIST)
-        DataTree delegate
-
-        String getPath() { config.peristConfigPath }
-        TreeType getType() { TreeType.CONFIGURATION }
-        DataTree getDelegate() { return delegate }
-    }
-
-    static class ContextPersistingDataTreeProvider extends PersistingDataTreeProvider {
-
-        @Inject
-        @Named(ContextPipelineModule.HONEYCOMB_CONTEXT_NOPERSIST)
-        DataTree delegate
-
-        String getPath() { config.peristContextPath }
-        TreeType getType() { TreeType.OPERATIONAL }
-        DataTree getDelegate() { return delegate }
-    }
-}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/PersistingDataTreeProvider.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/PersistingDataTreeProvider.java
new file mode 100644 (file)
index 0000000..fb4ebc6
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.infra.distro.data;
+
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import io.fd.honeycomb.data.impl.PersistingDataTreeAdapter;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration;
+import io.fd.honeycomb.infra.distro.data.context.ContextPipelineModule;
+import java.nio.file.Paths;
+import org.opendaylight.controller.sal.core.api.model.SchemaService;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
+
+public abstract class PersistingDataTreeProvider extends ProviderTrait<DataTree> {
+
+    @Inject
+    private SchemaService schemaService;
+    @Inject
+    protected HoneycombConfiguration config;
+
+    public PersistingDataTreeAdapter create() {
+        return new PersistingDataTreeAdapter(getDelegate(), schemaService, Paths.get(getPath()));
+    }
+
+    public abstract String getPath();
+
+    public abstract TreeType getType();
+
+    public abstract DataTree getDelegate();
+
+    public static final class ConfigPersistingDataTreeProvider extends PersistingDataTreeProvider {
+
+        @Inject
+        @Named(ConfigAndOperationalPipelineModule.HONEYCOMB_CONFIG_NONPERSIST)
+        private DataTree delegate;
+
+        public String getPath() {
+            return config.peristConfigPath;
+        }
+
+        public TreeType getType() {
+            return TreeType.CONFIGURATION;
+        }
+
+        public DataTree getDelegate() {
+            return delegate;
+        }
+    }
+
+    public static final class ContextPersistingDataTreeProvider extends PersistingDataTreeProvider {
+
+        @Inject
+        @Named(ContextPipelineModule.HONEYCOMB_CONTEXT_NOPERSIST)
+        private DataTree delegate;
+
+        public String getPath() {
+            return config.peristContextPath;
+        }
+
+        public TreeType getType() {
+            return TreeType.OPERATIONAL;
+        }
+
+        public DataTree getDelegate() {
+            return delegate;
+        }
+    }
+}
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro.data.config
+package io.fd.honeycomb.infra.distro.data.config;
 
-import com.google.inject.Inject
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import io.fd.honeycomb.translate.util.write.registry.FlatWriterRegistryBuilder
-import io.fd.honeycomb.translate.write.WriterFactory
-import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder
+import com.google.inject.Inject;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import io.fd.honeycomb.translate.util.write.registry.FlatWriterRegistryBuilder;
+import io.fd.honeycomb.translate.write.WriterFactory;
+import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder;
+import java.util.HashSet;
+import java.util.Set;
 
-@Slf4j
-@ToString
-class WriterRegistryProvider extends ProviderTrait<ModifiableWriterRegistryBuilder> {
+public final class WriterRegistryProvider extends ProviderTrait<ModifiableWriterRegistryBuilder> {
 
     @Inject(optional = true)
-    Set<WriterFactory> writerFactories = []
+    private Set<WriterFactory> writerFactories = new HashSet<>();
 
-    def create() {
-        def builder = new FlatWriterRegistryBuilder()
-        writerFactories.forEach { it.init(builder) }
-        builder
+    @Override
+    protected FlatWriterRegistryBuilder create() {
+        final FlatWriterRegistryBuilder builder = new FlatWriterRegistryBuilder();
+        writerFactories
+                .stream()
+                .forEach(it -> it.init(builder));
+        return builder;
     }
 }
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/context/ContextPipelineModule.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/context/ContextPipelineModule.groovy
deleted file mode 100644 (file)
index a4cf731..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.infra.distro.data.context
-
-import com.google.inject.PrivateModule
-import com.google.inject.Singleton
-import com.google.inject.name.Names
-import io.fd.honeycomb.data.ModifiableDataManager
-import io.fd.honeycomb.data.init.DataTreeInitializer
-import io.fd.honeycomb.infra.distro.data.BindingDataBrokerProvider
-import io.fd.honeycomb.infra.distro.data.DataTreeProvider
-import io.fd.honeycomb.infra.distro.data.PersistingDataTreeProvider
-import io.fd.honeycomb.infra.distro.initializer.PersistedFileInitializerProvider
-import io.fd.honeycomb.translate.MappingContext
-import org.opendaylight.controller.md.sal.binding.api.DataBroker
-import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree
-
-class ContextPipelineModule extends PrivateModule {
-
-    public static final String HONEYCOMB_CONTEXT_NOPERSIST = "honeycomb-context-nopersist"
-    public static final String HONEYCOMB_CONTEXT = "honeycomb-context"
-
-    protected void configure() {
-        // Non persisting data tree for context
-        def noPersistDataTreeProvider = new DataTreeProvider.ContextDataTreeProvider()
-        bind(DataTree)
-                .annotatedWith(Names.named(HONEYCOMB_CONTEXT_NOPERSIST))
-                .toProvider(noPersistDataTreeProvider)
-                .in(Singleton)
-        expose(DataTree).annotatedWith(Names.named(HONEYCOMB_CONTEXT_NOPERSIST))
-        // Persisting data tree wrapper for context
-        def dataTreeProvider = new PersistingDataTreeProvider.ContextPersistingDataTreeProvider()
-        bind(DataTree).toProvider(dataTreeProvider).in(Singleton)
-
-        // Data Tree manager (without any delegation) on top of context data tree
-        bind(ModifiableDataManager).toProvider(ModifiableDTMgrProvider).in(Singleton)
-
-        // DOMDataBroker interface on top of data tree manager
-        def domBrokerProvider = new HoneycombContextDOMDataBrokerProvider()
-        bind(DOMDataBroker).toProvider(domBrokerProvider).in(Singleton)
-
-        // BA version of data broker for context
-        bind(DataBroker).annotatedWith(Names.named(HONEYCOMB_CONTEXT)).toProvider(BindingDataBrokerProvider).in(Singleton)
-        expose(DataBroker).annotatedWith(Names.named(HONEYCOMB_CONTEXT))
-
-        // Create initializer to init persisted config data
-        bind(DataTreeInitializer)
-                .annotatedWith(Names.named(HONEYCOMB_CONTEXT))
-                .toProvider(PersistedFileInitializerProvider.PersistedContextInitializerProvider)
-                .in(Singleton)
-        expose(DataTreeInitializer).annotatedWith(Names.named(HONEYCOMB_CONTEXT))
-
-        // Mapping context is just a small adapter on top of BA data broker to simplify CRUD of context data
-        bind(MappingContext)
-                .annotatedWith(Names.named(HONEYCOMB_CONTEXT))
-                .toProvider(RealtimeMappingContextProvider)
-                .in(Singleton.class)
-        expose(MappingContext).annotatedWith(Names.named(HONEYCOMB_CONTEXT))
-    }
-
-}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/context/ContextPipelineModule.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/context/ContextPipelineModule.java
new file mode 100644 (file)
index 0000000..b0ded35
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.infra.distro.data.context;
+
+import com.google.inject.PrivateModule;
+import com.google.inject.Singleton;
+import com.google.inject.name.Names;
+import io.fd.honeycomb.data.ModifiableDataManager;
+import io.fd.honeycomb.data.init.DataTreeInitializer;
+import io.fd.honeycomb.infra.distro.data.BindingDataBrokerProvider;
+import io.fd.honeycomb.infra.distro.data.DataTreeProvider;
+import io.fd.honeycomb.infra.distro.data.PersistingDataTreeProvider;
+import io.fd.honeycomb.infra.distro.initializer.PersistedFileInitializerProvider;
+import io.fd.honeycomb.translate.MappingContext;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree;
+
+public class ContextPipelineModule extends PrivateModule {
+
+    public static final String HONEYCOMB_CONTEXT_NOPERSIST = "honeycomb-context-nopersist";
+    public static final String HONEYCOMB_CONTEXT = "honeycomb-context";
+
+    @Override
+    protected void configure() {
+        // Non persisting data tree for context
+        DataTreeProvider.ContextDataTreeProvider noPersistDataTreeProvider =
+                new DataTreeProvider.ContextDataTreeProvider();
+        bind(DataTree.class).annotatedWith(Names.named(HONEYCOMB_CONTEXT_NOPERSIST))
+                .toProvider(noPersistDataTreeProvider).in(Singleton.class);
+        expose(DataTree.class).annotatedWith(Names.named(HONEYCOMB_CONTEXT_NOPERSIST));
+        // Persisting data tree wrapper for context
+        PersistingDataTreeProvider.ContextPersistingDataTreeProvider dataTreeProvider =
+                new PersistingDataTreeProvider.ContextPersistingDataTreeProvider();
+        bind(DataTree.class).toProvider(dataTreeProvider).in(Singleton.class);
+
+        // Data Tree manager (without any delegation) on top of context data tree
+        bind(ModifiableDataManager.class).toProvider(ModifiableDTMgrProvider.class).in(Singleton.class);
+
+        // DOMDataBroker interface on top of data tree manager
+        HoneycombContextDOMDataBrokerProvider domBrokerProvider = new HoneycombContextDOMDataBrokerProvider();
+        bind(DOMDataBroker.class).toProvider(domBrokerProvider).in(Singleton.class);
+
+        // BA version of data broker for context
+        bind(DataBroker.class).annotatedWith(Names.named(HONEYCOMB_CONTEXT)).toProvider(BindingDataBrokerProvider.class)
+                .in(Singleton.class);
+        expose(DataBroker.class).annotatedWith(Names.named(HONEYCOMB_CONTEXT));
+
+        // Create initializer to init persisted config data
+        bind(DataTreeInitializer.class).annotatedWith(Names.named(HONEYCOMB_CONTEXT))
+                .toProvider(PersistedFileInitializerProvider.PersistedContextInitializerProvider.class)
+                .in(Singleton.class);
+        expose(DataTreeInitializer.class).annotatedWith(Names.named(HONEYCOMB_CONTEXT));
+
+        // Mapping context is just a small adapter on top of BA data broker to simplify CRUD of context data
+        bind(MappingContext.class).annotatedWith(Names.named(HONEYCOMB_CONTEXT))
+                .toProvider(RealtimeMappingContextProvider.class).in(Singleton.class);
+        expose(MappingContext.class).annotatedWith(Names.named(HONEYCOMB_CONTEXT));
+    }
+}
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro.data.context
+package io.fd.honeycomb.infra.distro.data.context;
 
-import com.google.inject.Inject
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.data.ModifiableDataManager
-import io.fd.honeycomb.data.impl.DataBroker
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker
+import com.google.inject.Inject;
+import io.fd.honeycomb.data.ModifiableDataManager;
+import io.fd.honeycomb.data.impl.DataBroker;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
 
-@Slf4j
-@ToString
-class HoneycombContextDOMDataBrokerProvider extends ProviderTrait<DOMDataBroker> {
+public final class HoneycombContextDOMDataBrokerProvider extends ProviderTrait<DOMDataBroker> {
 
     @Inject
-    ModifiableDataManager modDataManager
-
-    def create() { DataBroker.create(modDataManager) }
+    private ModifiableDataManager modDataManager;
 
+    public DataBroker create() {
+        return DataBroker.create(modDataManager);
+    }
 }
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro.data.context
+package io.fd.honeycomb.infra.distro.data.context;
 
-import com.google.inject.Inject
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.data.ModifiableDataManager
-import io.fd.honeycomb.data.impl.ModifiableDataTreeManager
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree
+import com.google.inject.Inject;
+import io.fd.honeycomb.data.ModifiableDataManager;
+import io.fd.honeycomb.data.impl.ModifiableDataTreeManager;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree;
 
-@Slf4j
-@ToString
-class ModifiableDTMgrProvider extends ProviderTrait<ModifiableDataManager> {
+public final class ModifiableDTMgrProvider extends ProviderTrait<ModifiableDataManager> {
 
     @Inject
-    DataTree dataTree
+    private DataTree dataTree;
 
     @Override
-    def create() { new ModifiableDataTreeManager(dataTree) }
+    public ModifiableDataTreeManager create() {
+        return new ModifiableDataTreeManager(dataTree);
+    }
 }
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro.data.context
+package io.fd.honeycomb.infra.distro.data.context;
 
-import com.google.inject.Inject
-import com.google.inject.name.Named
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import io.fd.honeycomb.translate.MappingContext
-import io.fd.honeycomb.translate.util.RealtimeMappingContext
-import org.opendaylight.controller.md.sal.binding.api.DataBroker
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import io.fd.honeycomb.translate.MappingContext;
+import io.fd.honeycomb.translate.util.RealtimeMappingContext;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 
-@Slf4j
-@ToString
-class RealtimeMappingContextProvider extends ProviderTrait<MappingContext> {
+public final class RealtimeMappingContextProvider extends ProviderTrait<MappingContext> {
 
     @Inject
     @Named(ContextPipelineModule.HONEYCOMB_CONTEXT)
-    DataBroker contextDataBroker
+    private DataBroker contextDataBroker;
 
     @Override
-    def create() {
-        new RealtimeMappingContext(contextDataBroker)
+    public RealtimeMappingContext create() {
+        return new RealtimeMappingContext(contextDataBroker);
     }
+
 }
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro.data.oper
+package io.fd.honeycomb.infra.distro.data.oper;
 
-import com.google.inject.Inject
-import com.google.inject.name.Named
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.data.ReadableDataManager
-import io.fd.honeycomb.data.impl.ReadableDataTreeDelegator
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import io.fd.honeycomb.infra.distro.data.context.ContextPipelineModule
-import io.fd.honeycomb.translate.read.registry.ModifiableReaderRegistryBuilder
-import org.opendaylight.controller.md.sal.binding.api.DataBroker
-import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec
-import org.opendaylight.controller.sal.core.api.model.SchemaService
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import io.fd.honeycomb.data.ReadableDataManager;
+import io.fd.honeycomb.data.impl.ReadableDataTreeDelegator;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import io.fd.honeycomb.infra.distro.data.context.ContextPipelineModule;
+import io.fd.honeycomb.translate.read.registry.ModifiableReaderRegistryBuilder;
+import io.fd.honeycomb.translate.read.registry.ReaderRegistryBuilder;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec;
+import org.opendaylight.controller.sal.core.api.model.SchemaService;
 
-@Slf4j
-@ToString
-class ReadableDTDelegProvider extends ProviderTrait<ReadableDataManager> {
+public final class ReadableDTDelegProvider extends ProviderTrait<ReadableDataManager> {
 
     @Inject
-    BindingToNormalizedNodeCodec serializer
+    private BindingToNormalizedNodeCodec serializer;
     @Inject
-    SchemaService schemaService
+    private SchemaService schemaService;
     @Inject
-    ModifiableReaderRegistryBuilder registry
+    private ModifiableReaderRegistryBuilder registry;
     @Inject
     @Named(ContextPipelineModule.HONEYCOMB_CONTEXT)
-    DataBroker contextBroker
+    private DataBroker contextBroker;
 
-    def create() {
-        new ReadableDataTreeDelegator(serializer, schemaService.getGlobalContext(), registry.build(), contextBroker)
+    @Override
+    protected ReadableDataTreeDelegator create() {
+        return new ReadableDataTreeDelegator(serializer, schemaService.getGlobalContext(),
+                ((ReaderRegistryBuilder) registry).build(), contextBroker);
     }
 }
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro.data.oper
+package io.fd.honeycomb.infra.distro.data.oper;
 
-import com.google.inject.Inject
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import io.fd.honeycomb.translate.read.ReaderFactory
-import io.fd.honeycomb.translate.read.registry.ModifiableReaderRegistryBuilder
-import io.fd.honeycomb.translate.util.read.registry.CompositeReaderRegistryBuilder
+import com.google.inject.Inject;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import io.fd.honeycomb.translate.read.ReaderFactory;
+import io.fd.honeycomb.translate.read.registry.ModifiableReaderRegistryBuilder;
+import io.fd.honeycomb.translate.util.read.registry.CompositeReaderRegistryBuilder;
+import java.util.HashSet;
+import java.util.Set;
 
-@Slf4j
-@ToString
-class ReaderRegistryProvider extends ProviderTrait<ModifiableReaderRegistryBuilder> {
+public final class ReaderRegistryProvider extends ProviderTrait<ModifiableReaderRegistryBuilder> {
 
     @Inject(optional = true)
-    Set<ReaderFactory> readerFactories = []
+    private Set<ReaderFactory> readerFactories = new HashSet<>();
 
-    def create() {
-        def builder = new CompositeReaderRegistryBuilder()
-        readerFactories.forEach { it.init(builder) }
-        builder
+    @Override
+    protected CompositeReaderRegistryBuilder create() {
+        final CompositeReaderRegistryBuilder builder = new CompositeReaderRegistryBuilder();
+        readerFactories.stream()
+                .forEach(it -> it.init(builder));
+        return builder;
     }
+
 }
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/InitializerPipelineModule.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/InitializerPipelineModule.groovy
deleted file mode 100644 (file)
index 4bd1973..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.infra.distro.initializer
-
-import com.google.inject.PrivateModule
-import com.google.inject.Singleton
-import com.google.inject.name.Names
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.data.ModifiableDataManager
-import io.fd.honeycomb.data.init.InitializerRegistry
-import io.fd.honeycomb.infra.distro.data.BindingDataBrokerProvider
-import io.fd.honeycomb.infra.distro.data.HoneycombDOMDataBrokerProvider
-import org.opendaylight.controller.md.sal.binding.api.DataBroker
-import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker
-
-@Slf4j
-class InitializerPipelineModule extends PrivateModule {
-
-
-    public static final String HONEYCOMB_INITIALIZER = "honeycomb-initializer"
-
-    protected void configure() {
-        // Create data tree manager on top of non-persisting config data tree
-        bind(ModifiableDataManager).toProvider(ModifiableDTDelegInitProvider).in(Singleton)
-        // Wrap as DOMDataBroker
-        bind(DOMDataBroker).toProvider(HoneycombDOMDataBrokerProvider).in(Singleton)
-        // Wrap as BA data broker
-        bind(DataBroker).annotatedWith(Names.named(HONEYCOMB_INITIALIZER)).toProvider(BindingDataBrokerProvider).in(Singleton)
-        expose(DataBroker).annotatedWith(Names.named(HONEYCOMB_INITIALIZER))
-
-        // Create initializer registry so that plugins can provide their initializers
-        bind(InitializerRegistry)
-                .annotatedWith(Names.named(HONEYCOMB_INITIALIZER))
-                .toProvider(InitializerRegistryProvider)
-                .in(Singleton)
-        expose(InitializerRegistry)
-                .annotatedWith(Names.named(HONEYCOMB_INITIALIZER))
-    }
-}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/InitializerPipelineModule.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/InitializerPipelineModule.java
new file mode 100644 (file)
index 0000000..f524009
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.infra.distro.initializer;
+
+import com.google.inject.PrivateModule;
+import com.google.inject.Singleton;
+import com.google.inject.name.Names;
+import io.fd.honeycomb.data.ModifiableDataManager;
+import io.fd.honeycomb.data.init.InitializerRegistry;
+import io.fd.honeycomb.infra.distro.data.BindingDataBrokerProvider;
+import io.fd.honeycomb.infra.distro.data.HoneycombDOMDataBrokerProvider;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
+
+public final class InitializerPipelineModule extends PrivateModule {
+
+    public static final String HONEYCOMB_INITIALIZER = "honeycomb-initializer";
+
+    protected void configure() {
+        // Create data tree manager on top of non-persisting config data tree
+        bind(ModifiableDataManager.class).toProvider(ModifiableDTDelegInitProvider.class).in(Singleton.class);
+        // Wrap as DOMDataBroker
+        bind(DOMDataBroker.class).toProvider(HoneycombDOMDataBrokerProvider.class).in(Singleton.class);
+        // Wrap as BA data broker
+        bind(DataBroker.class).annotatedWith(Names.named(HONEYCOMB_INITIALIZER))
+                .toProvider(BindingDataBrokerProvider.class).in(Singleton.class);
+        expose(DataBroker.class).annotatedWith(Names.named(HONEYCOMB_INITIALIZER));
+
+        // Create initializer registry so that plugins can provide their initializers
+        bind(InitializerRegistry.class).annotatedWith(Names.named(HONEYCOMB_INITIALIZER))
+                .toProvider(InitializerRegistryProvider.class).in(Singleton.class);
+        expose(InitializerRegistry.class).annotatedWith(Names.named(HONEYCOMB_INITIALIZER));
+    }
+}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/InitializerRegistryAdapter.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/InitializerRegistryAdapter.java
new file mode 100644 (file)
index 0000000..4d488cf
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.infra.distro.initializer;
+
+import com.google.common.collect.Lists;
+import io.fd.honeycomb.data.init.DataTreeInitializer;
+import io.fd.honeycomb.data.init.InitializerRegistry;
+import io.fd.honeycomb.data.init.InitializerRegistryImpl;
+import java.util.List;
+import java.util.Set;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+final class InitializerRegistryAdapter implements InitializerRegistry {
+
+    private static final Logger LOG = LoggerFactory.getLogger(InitializerRegistryAdapter.class);
+
+    private final DataTreeInitializer configInitializer;
+    private final DataTreeInitializer contextInitializer;
+    private final List<DataTreeInitializer> pluginInitializers;
+
+    InitializerRegistryAdapter(final DataTreeInitializer configInitializer, final DataTreeInitializer contextInitializer,
+                               final Set<DataTreeInitializer> pluginInitializers) {
+        this.configInitializer = configInitializer;
+        this.contextInitializer = contextInitializer;
+        this.pluginInitializers = Lists.newArrayList(pluginInitializers);
+    }
+
+    @Override
+    public void initialize() throws DataTreeInitializer.InitializeException {
+        LOG.info("Config initialization started");
+
+        final InitializerRegistry initializer = new InitializerRegistryImpl(pluginInitializers);
+
+        try {
+            // Initialize contexts first so that other initializers can find any relevant mapping before initializing
+            // configuration to what is already in VPP
+            contextInitializer.initialize();
+            LOG.info("Persisted context restored successfully");
+            // Initialize all registered initializers
+            initializer.initialize();
+            LOG.info("Configuration initialized successfully");
+            // Initialize stored configuration on top
+            configInitializer.initialize();
+            LOG.info("Persisted configuration restored successfully");
+        } catch (Exception e) {
+            LOG.warn("Failed to initialize config", e);
+        }
+
+        LOG.info("Honeycomb initialized");
+    }
+
+    @Override
+    public void close() throws Exception {}
+}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/InitializerRegistryProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/InitializerRegistryProvider.groovy
deleted file mode 100644 (file)
index 6c90291..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.infra.distro.initializer
-
-import com.google.inject.Inject
-import com.google.inject.name.Named
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.data.init.DataTreeInitializer
-import io.fd.honeycomb.data.init.InitializerRegistry
-import io.fd.honeycomb.data.init.InitializerRegistryImpl
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import io.fd.honeycomb.infra.distro.data.ConfigAndOperationalPipelineModule
-import io.fd.honeycomb.infra.distro.data.context.ContextPipelineModule
-
-@Slf4j
-@ToString
-class InitializerRegistryProvider extends ProviderTrait<InitializerRegistry> {
-
-    @Inject
-    @Named(ContextPipelineModule.HONEYCOMB_CONTEXT)
-    DataTreeInitializer contextInitializer
-    @Inject
-    @Named(ConfigAndOperationalPipelineModule.HONEYCOMB_CONFIG)
-    DataTreeInitializer configInitializer
-    @Inject(optional = true)
-    Set<DataTreeInitializer> pluginInitializers = []
-
-    @Override
-    def create() {
-        return new InitializerRegistry() {
-
-            @Override
-            void initialize() throws DataTreeInitializer.InitializeException {
-                log.info("Config initialization started");
-
-                final InitializerRegistry initializer = new InitializerRegistryImpl(new ArrayList<>(pluginInitializers))
-
-                try {
-                    // Initialize contexts first so that other initializers can find any relevant mapping before initializing
-                    // configuration to what is already in VPP
-                    contextInitializer.initialize();
-                    log.info("Persisted context restored successfully");
-                    // Initialize all registered initializers
-                    initializer.initialize();
-                    log.info("Configuration initialized successfully");
-                    // Initialize stored configuration on top
-                    configInitializer.initialize();
-                    log.info("Persisted configuration restored successfully");
-                } catch (Exception e) {
-                    log.warn("Failed to initialize config", e);
-                }
-
-                log.info("Honeycomb initialized");
-            }
-
-            @Override
-            void close() throws Exception {}
-        }
-    }
-}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/InitializerRegistryProvider.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/InitializerRegistryProvider.java
new file mode 100644 (file)
index 0000000..e984b01
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.infra.distro.initializer;
+
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import io.fd.honeycomb.data.init.DataTreeInitializer;
+import io.fd.honeycomb.data.init.InitializerRegistry;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import io.fd.honeycomb.infra.distro.data.ConfigAndOperationalPipelineModule;
+import io.fd.honeycomb.infra.distro.data.context.ContextPipelineModule;
+import java.util.HashSet;
+import java.util.Set;
+
+public final class InitializerRegistryProvider extends ProviderTrait<InitializerRegistry> {
+
+    @Inject
+    @Named(ContextPipelineModule.HONEYCOMB_CONTEXT)
+    private DataTreeInitializer contextInitializer;
+    @Inject
+    @Named(ConfigAndOperationalPipelineModule.HONEYCOMB_CONFIG)
+    private DataTreeInitializer configInitializer;
+    @Inject(optional = true)
+    private Set<DataTreeInitializer> pluginInitializers = new HashSet<>();
+
+    @Override
+    protected InitializerRegistryAdapter create() {
+        return new InitializerRegistryAdapter(contextInitializer, configInitializer, pluginInitializers);
+    }
+}
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro.initializer
+package io.fd.honeycomb.infra.distro.initializer;
 
-import com.google.inject.Inject
-import com.google.inject.name.Named
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.data.ModifiableDataManager
-import io.fd.honeycomb.data.impl.ModifiableDataTreeDelegator
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import io.fd.honeycomb.infra.distro.data.ConfigAndOperationalPipelineModule
-import io.fd.honeycomb.infra.distro.data.context.ContextPipelineModule
-import io.fd.honeycomb.translate.util.write.NoopWriterRegistry
-import org.opendaylight.controller.md.sal.binding.api.DataBroker
-import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import io.fd.honeycomb.data.ModifiableDataManager;
+import io.fd.honeycomb.data.impl.ModifiableDataTreeDelegator;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import io.fd.honeycomb.infra.distro.data.ConfigAndOperationalPipelineModule;
+import io.fd.honeycomb.infra.distro.data.context.ContextPipelineModule;
+import io.fd.honeycomb.translate.util.write.NoopWriterRegistry;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree;
 
-@Slf4j
-@ToString
-class ModifiableDTDelegInitProvider extends ProviderTrait<ModifiableDataManager> {
+public final class ModifiableDTDelegInitProvider extends ProviderTrait<ModifiableDataManager> {
 
     @Inject
-    BindingToNormalizedNodeCodec serializer
+    private BindingToNormalizedNodeCodec serializer;
     @Inject
     @Named(ConfigAndOperationalPipelineModule.HONEYCOMB_CONFIG_NONPERSIST)
-    DataTree dataTree
+    private DataTree dataTree;
     @Inject
     @Named(ContextPipelineModule.HONEYCOMB_CONTEXT)
-    DataBroker contextBroker
+    private DataBroker contextBroker;
 
     @Override
-    def create() { new ModifiableDataTreeDelegator(serializer, dataTree, new NoopWriterRegistry(), contextBroker) }
+    public ModifiableDataTreeDelegator create() {
+        return new ModifiableDataTreeDelegator(serializer, dataTree, new NoopWriterRegistry(), contextBroker);
+    }
 }
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/PersistedFileInitializerProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/PersistedFileInitializerProvider.groovy
deleted file mode 100644 (file)
index bb7015e..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.infra.distro.initializer
-
-import com.google.inject.Inject
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-
-import io.fd.honeycomb.data.init.RestoringInitializer
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType
-import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker
-import org.opendaylight.controller.sal.core.api.model.SchemaService
-
-import java.nio.file.Paths
-
-@Slf4j
-@ToString
-abstract class PersistedFileInitializerProvider extends ProviderTrait<RestoringInitializer> {
-
-    @Inject
-    SchemaService schemaService
-    @Inject
-    HoneycombConfiguration cfgAttributes
-
-    @Inject
-    DOMDataBroker domDataBroker
-
-    @Override
-    def create() {
-        new RestoringInitializer(schemaService, Paths.get(getPersistPath()),
-                domDataBroker, RestoringInitializer.RestorationType.valueOf(restorationType), getDataStoreType())
-    }
-
-    abstract String getPersistPath()
-    abstract LogicalDatastoreType getDataStoreType()
-    abstract String getRestorationType()
-
-    static class PersistedContextInitializerProvider extends PersistedFileInitializerProvider {
-        String getPersistPath() { cfgAttributes.peristContextPath }
-        LogicalDatastoreType getDataStoreType() { LogicalDatastoreType.OPERATIONAL }
-        String getRestorationType() { cfgAttributes.persistedContextRestorationType }
-    }
-
-    static class PersistedConfigInitializerProvider extends PersistedFileInitializerProvider {
-        String getPersistPath() { cfgAttributes.peristConfigPath }
-        LogicalDatastoreType getDataStoreType() { LogicalDatastoreType.CONFIGURATION }
-        String getRestorationType() { cfgAttributes.persistedConfigRestorationType }
-    }
-}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/PersistedFileInitializerProvider.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/PersistedFileInitializerProvider.java
new file mode 100644 (file)
index 0000000..58d63cf
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.infra.distro.initializer;
+
+import com.google.inject.Inject;
+import io.fd.honeycomb.data.init.RestoringInitializer;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration;
+import java.nio.file.Paths;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
+import org.opendaylight.controller.sal.core.api.model.SchemaService;
+
+public abstract class PersistedFileInitializerProvider extends ProviderTrait<RestoringInitializer> {
+
+    @Inject
+    private SchemaService schemaService;
+    @Inject
+    protected HoneycombConfiguration cfgAttributes;
+    @Inject
+    private DOMDataBroker domDataBroker;
+
+    @Override
+    public RestoringInitializer create() {
+        return new RestoringInitializer(schemaService, Paths.get(getPersistPath()), domDataBroker,
+                RestoringInitializer.RestorationType.valueOf(getRestorationType()), getDataStoreType());
+    }
+
+    public abstract String getPersistPath();
+
+    public abstract LogicalDatastoreType getDataStoreType();
+
+    public abstract String getRestorationType();
+
+    public static class PersistedContextInitializerProvider extends PersistedFileInitializerProvider {
+        public String getPersistPath() {
+            return cfgAttributes.peristContextPath;
+        }
+
+        public LogicalDatastoreType getDataStoreType() {
+            return LogicalDatastoreType.OPERATIONAL;
+        }
+
+        public String getRestorationType() {
+            return cfgAttributes.persistedContextRestorationType;
+        }
+
+    }
+
+    public static class PersistedConfigInitializerProvider extends PersistedFileInitializerProvider {
+        public String getPersistPath() {
+            return cfgAttributes.peristConfigPath;
+        }
+
+        public LogicalDatastoreType getDataStoreType() {
+            return LogicalDatastoreType.CONFIGURATION;
+        }
+
+        public String getRestorationType() {
+            return cfgAttributes.persistedConfigRestorationType;
+        }
+
+    }
+}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/HoneycombNotification2NetconfProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/HoneycombNotification2NetconfProvider.groovy
deleted file mode 100644 (file)
index f3ced2e..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.infra.distro.netconf
-
-import com.google.inject.Inject
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration
-import io.fd.honeycomb.notification.NotificationCollector
-import io.fd.honeycomb.notification.impl.NotificationProducerRegistry
-import org.opendaylight.controller.md.sal.dom.broker.impl.DOMNotificationRouter
-import org.opendaylight.controller.sal.core.api.model.SchemaService
-import org.opendaylight.netconf.notifications.NetconfNotificationCollector
-import io.fd.honeycomb.notification.impl.TranslationUtil
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.StreamNameType
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netmod.notification.rev080714.netconf.streams.StreamBuilder
-import org.opendaylight.yangtools.yang.model.api.SchemaPath
-
-@Slf4j
-@ToString
-class HoneycombNotification2NetconfProvider extends ProviderTrait<HoneycombNotification2Netconf> {
-
-    @Inject
-    DOMNotificationRouter notificationRouter
-    @Inject
-    SchemaService schemaService
-    @Inject
-    HoneycombConfiguration cfgAttributes
-    @Inject
-    NotificationCollector hcNotificationCollector
-    @Inject
-    NetconfNotificationCollector netconfNotificationCollector
-
-    @Override
-    def create() {
-        def streamType = new StreamNameType(cfgAttributes.netconfNotificationStreamName.get());
-
-        // Register as HONEYCOMB_NETCONF notification publisher under configured name
-        def netconfNotifReg = netconfNotificationCollector.registerNotificationPublisher(new StreamBuilder()
-                        .setName(streamType)
-                        .setReplaySupport(false)
-                        .setDescription(cfgAttributes.netconfNotificationStreamName.get()).build());
-
-        // Notification Translator, get notification from HC producers and put into HONEYCOMB_NETCONF notification collector
-        def domNotificationListener = { notif ->
-                log.debug "Propagating notification: {} into HONEYCOMB_NETCONF", notif.type
-                netconfNotifReg.onNotification(streamType, TranslationUtil.notificationToXml(notif, schemaService.globalContext))
-        }
-
-        // NotificationManager is used to provide list of available notifications (which are all of the notifications registered)
-        // TODO make available notifications configurable here so that any number of notification streams for HONEYCOMB_NETCONF
-        // can be configured on top of a single notification manager
-        log.debug "Current notifications to be exposed over HONEYCOMB_NETCONF: {}", hcNotificationCollector.notificationTypes
-        def currentNotificationSchemaPaths = hcNotificationCollector.notificationTypes
-                .collect {SchemaPath.create(true, NotificationProducerRegistry.getQName(it))}
-
-        // Register as listener to HC'OPERATIONAL DOM notification service
-        // TODO This should only be triggered when HONEYCOMB_NETCONF notifications are activated
-        // Because this way we actually start all notification producers
-        // final Collection<QName> notificationQNames =
-        def domNotifListenerReg = notificationRouter
-                .registerNotificationListener(domNotificationListener, currentNotificationSchemaPaths);
-
-        log.info "Exposing HONEYCOMB_NETCONF notification stream: {}", streamType.value
-
-        new HoneycombNotification2Netconf(domNotifListenerReg: domNotifListenerReg, netconfNotifReg: netconfNotifReg)
-    }
-
-    static class HoneycombNotification2Netconf {
-        def domNotifListenerReg
-        def netconfNotifReg
-    }
-}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/HoneycombNotification2NetconfProvider.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/HoneycombNotification2NetconfProvider.java
new file mode 100644 (file)
index 0000000..3954af8
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.infra.distro.netconf;
+
+import com.google.inject.Inject;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration;
+import io.fd.honeycomb.notification.NotificationCollector;
+import io.fd.honeycomb.notification.impl.NotificationProducerRegistry;
+import io.fd.honeycomb.notification.impl.TranslationUtil;
+import java.util.List;
+import java.util.stream.Collectors;
+import javax.annotation.Nonnull;
+import org.opendaylight.controller.md.sal.dom.api.DOMNotification;
+import org.opendaylight.controller.md.sal.dom.api.DOMNotificationListener;
+import org.opendaylight.controller.md.sal.dom.broker.impl.DOMNotificationRouter;
+import org.opendaylight.controller.sal.core.api.model.SchemaService;
+import org.opendaylight.netconf.notifications.NetconfNotificationCollector;
+import org.opendaylight.netconf.notifications.NotificationPublisherRegistration;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.StreamNameType;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netmod.notification.rev080714.netconf.streams.StreamBuilder;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class HoneycombNotification2NetconfProvider
+        extends ProviderTrait<HoneycombNotification2NetconfProvider.HoneycombNotification2Netconf> {
+
+    private static final Logger LOG = LoggerFactory.getLogger(HoneycombNotification2NetconfProvider.class);
+
+    @Inject
+    private DOMNotificationRouter notificationRouter;
+    @Inject
+    private SchemaService schemaService;
+    @Inject
+    private HoneycombConfiguration cfgAttributes;
+    @Inject
+    private NotificationCollector hcNotificationCollector;
+    @Inject
+    private NetconfNotificationCollector netconfNotificationCollector;
+
+    @Override
+    protected HoneycombNotification2Netconf create() {
+        final StreamNameType streamType = new StreamNameType(cfgAttributes.netconfNotificationStreamName.get());
+
+        // Register as HONEYCOMB_NETCONF notification publisher under configured name
+        final NotificationPublisherRegistration netconfNotifReg = netconfNotificationCollector
+                .registerNotificationPublisher(new StreamBuilder().setName(streamType).setReplaySupport(false)
+                        .setDescription(cfgAttributes.netconfNotificationStreamName.get()).build());
+
+        // Notification Translator, get notification from HC producers and put into HONEYCOMB_NETCONF notification collector
+        final DOMNotificationListener domNotificationListener =
+                new TranslatingNotificationListener(netconfNotifReg, streamType, schemaService);
+
+        // NotificationManager is used to provide list of available notifications (which are all of the notifications registered)
+        // TODO make available notifications configurable here so that any number of notification streams for HONEYCOMB_NETCONF
+        // can be configured on top of a single notification manager
+        LOG.debug("Current notifications to be exposed over HONEYCOMB_NETCONF: {}",
+                hcNotificationCollector.getNotificationTypes());
+        List<SchemaPath> currentNotificationSchemaPaths = hcNotificationCollector.getNotificationTypes().stream()
+                .map(notifType -> SchemaPath.create(true, NotificationProducerRegistry.getQName(notifType)))
+                .collect(Collectors.toList());
+
+        // Register as listener to HC'OPERATIONAL DOM notification service
+        // TODO This should only be triggered when HONEYCOMB_NETCONF notifications are activated
+        // Because this way we actually start all notification producers
+        // final Collection<QName> notificationQNames =
+        ListenerRegistration<DOMNotificationListener> domNotifListenerReg = notificationRouter
+                .registerNotificationListener(domNotificationListener, currentNotificationSchemaPaths);
+
+        LOG.info("Exposing HONEYCOMB_NETCONF notification stream: {}", streamType.getValue());
+        return new HoneycombNotification2Netconf(domNotifListenerReg, netconfNotifReg);
+    }
+
+    public static final class HoneycombNotification2Netconf {
+        private final ListenerRegistration<DOMNotificationListener> domNotifListenerReg;
+        private final NotificationPublisherRegistration netconfNotifReg;
+
+        public HoneycombNotification2Netconf(final ListenerRegistration<DOMNotificationListener> domNotifListenerReg,
+                                             final NotificationPublisherRegistration netconfNotifReg) {
+            this.domNotifListenerReg = domNotifListenerReg;
+            this.netconfNotifReg = netconfNotifReg;
+        }
+
+        public ListenerRegistration<DOMNotificationListener> getDomNotifListenerReg() {
+            return domNotifListenerReg;
+        }
+
+        public NotificationPublisherRegistration getNetconfNotifReg() {
+            return netconfNotifReg;
+        }
+    }
+
+    private static final class TranslatingNotificationListener implements DOMNotificationListener {
+
+        private static final Logger LOG = LoggerFactory.getLogger(TranslatingNotificationListener.class);
+
+        private final NotificationPublisherRegistration netconfNotifReg;
+        private final StreamNameType streamType;
+        private final SchemaService schemaService;
+
+        TranslatingNotificationListener(final NotificationPublisherRegistration netconfNotifReg,
+                                               final StreamNameType streamType, final SchemaService schemaService) {
+            this.netconfNotifReg = netconfNotifReg;
+            this.streamType = streamType;
+            this.schemaService = schemaService;
+        }
+
+        @Override
+        public void onNotification(@Nonnull final DOMNotification notif) {
+            LOG.debug("Propagating notification: {} into HONEYCOMB_NETCONF", notif.getType());
+            netconfNotifReg.onNotification(streamType, TranslationUtil.notificationToXml(notif, schemaService.getGlobalContext()));
+        }
+    }
+}
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro.netconf
+package io.fd.honeycomb.infra.distro.netconf;
 
-import com.google.inject.Inject
-import com.google.inject.name.Named
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import org.opendaylight.controller.md.sal.binding.api.DataBroker
-import org.opendaylight.controller.sal.binding.api.BindingAwareBroker
-import io.fd.honeycomb.impl.FakeBindingAwareBroker
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import io.fd.honeycomb.impl.FakeBindingAwareBroker;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
 
-@Slf4j
-@ToString
-class NetconfBindingBrokerProvider extends ProviderTrait<BindingAwareBroker> {
+public final class NetconfBindingBrokerProvider extends ProviderTrait<BindingAwareBroker> {
 
     @Inject
     @Named(NetconfModule.HONEYCOMB_NETCONF)
-    DataBroker dataBroker
+    private DataBroker dataBroker;
 
     @Override
-    def create() { new FakeBindingAwareBroker(dataBroker) }
+    protected FakeBindingAwareBroker create() {
+        return new FakeBindingAwareBroker(dataBroker);
+    }
 }
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro.netconf
+package io.fd.honeycomb.infra.distro.netconf;
 
-import com.google.inject.Inject
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import org.opendaylight.controller.sal.core.api.Broker
-import org.opendaylight.controller.sal.core.api.model.SchemaService
-import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory
-import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactoryListener
-import org.opendaylight.netconf.mdsal.connector.MdsalNetconfOperationServiceFactory
-import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext
+import com.google.inject.Inject;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import org.opendaylight.controller.sal.core.api.Broker;
+import org.opendaylight.controller.sal.core.api.model.SchemaService;
+import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory;
+import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactoryListener;
+import org.opendaylight.netconf.mdsal.connector.MdsalNetconfOperationServiceFactory;
+import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext;
 
-@Slf4j
-@ToString
-class NetconfMdsalMapperProvider extends ProviderTrait<NetconfOperationServiceFactory> {
+public final class NetconfMdsalMapperProvider extends ProviderTrait<NetconfOperationServiceFactory> {
 
     @Inject
-    SchemaService schemaService
+    private SchemaService schemaService;
     @Inject
-    NetconfOperationServiceFactoryListener aggregator
+    private NetconfOperationServiceFactoryListener aggregator;
     @Inject
-    ModuleInfoBackedContext moduleInfoBackedContext
-
+    private ModuleInfoBackedContext moduleInfoBackedContext;
     @Inject
-    Broker domBroker
+    private Broker domBroker;
 
-    def create() {
-        def mdsalNetconfOperationServiceFactory =
-                new MdsalNetconfOperationServiceFactory(schemaService, moduleInfoBackedContext)
+    @Override
+    protected MdsalNetconfOperationServiceFactory create() {
+        MdsalNetconfOperationServiceFactory mdsalNetconfOperationServiceFactory =
+                new MdsalNetconfOperationServiceFactory(schemaService, moduleInfoBackedContext);
         domBroker.registerConsumer(mdsalNetconfOperationServiceFactory);
         aggregator.onAddNetconfOperationServiceFactory(mdsalNetconfOperationServiceFactory);
         return mdsalNetconfOperationServiceFactory;
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfModule.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfModule.groovy
deleted file mode 100644 (file)
index 29eeae3..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.infra.distro.netconf
-
-import com.google.inject.PrivateModule
-import com.google.inject.Singleton
-import com.google.inject.name.Names
-import io.fd.honeycomb.infra.distro.data.BindingDataBrokerProvider
-import io.fd.honeycomb.infra.distro.data.DataStoreProvider
-import io.fd.honeycomb.infra.distro.data.HoneycombNotificationManagerProvider
-import io.fd.honeycomb.infra.distro.data.InmemoryDOMDataBrokerProvider
-import io.fd.honeycomb.notification.NotificationCollector
-import io.netty.channel.nio.NioEventLoopGroup
-import io.netty.util.Timer
-import org.opendaylight.controller.md.sal.binding.api.DataBroker
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType
-import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker
-import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStore
-import org.opendaylight.controller.sal.binding.api.BindingAwareBroker
-import org.opendaylight.netconf.api.NetconfServerDispatcher
-import org.opendaylight.netconf.api.monitoring.NetconfMonitoringService
-import org.opendaylight.netconf.impl.osgi.AggregatedNetconfOperationServiceFactory
-import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory
-import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactoryListener
-import org.opendaylight.netconf.notifications.NetconfNotificationCollector
-import org.opendaylight.netconf.notifications.NetconfNotificationListener
-import org.opendaylight.netconf.notifications.NetconfNotificationRegistry
-import org.opendaylight.netconf.notifications.impl.NetconfNotificationManager
-
-import static InmemoryDOMDataBrokerProvider.CONFIG
-import static InmemoryDOMDataBrokerProvider.OPERATIONAL
-
-class NetconfModule extends PrivateModule {
-
-
-    public static final String HONEYCOMB_NETCONF = "honeycomb-netconf"
-    public static final String HONEYCOMB_NETCONF_MAPPER_AGGR = "netconf-mapper-aggregator"
-    public static final String HONEYCOMB_NETCONF_MAPPER_NOTIF = "netconf-mapper-notification"
-    public static final String HONEYCOMB_NETCONF_MAPPER_CORE = "netconf-mapper-honeycomb"
-    public static final String HONEYCOMB_NETCONF_MAPPER_OPER = "netconf-mapper-monitoring"
-
-    @Override
-    protected void configure() {
-        // Create inmemory data store for HONEYCOMB_NETCONF config metadata
-        bind(InMemoryDOMDataStore)
-                .annotatedWith(Names.named(CONFIG))
-                .toProvider(new DataStoreProvider(type: LogicalDatastoreType.CONFIGURATION, name: CONFIG))
-                .in(Singleton)
-        // Create inmemory data store for HONEYCOMB_NETCONF operational metadata
-        bind(InMemoryDOMDataStore)
-                .annotatedWith(Names.named(OPERATIONAL))
-                .toProvider(new DataStoreProvider(type: LogicalDatastoreType.OPERATIONAL, name: OPERATIONAL))
-                .in(Singleton)
-        // Wrap datastores as DOMDataBroker
-        bind(DOMDataBroker).toProvider(InmemoryDOMDataBrokerProvider).in(Singleton)
-
-        // Wrap DOMDataBroker as BA data broker
-        bind(DataBroker)
-                .annotatedWith(Names.named(HONEYCOMB_NETCONF))
-                .toProvider(BindingDataBrokerProvider)
-                .in(Singleton)
-        expose(DataBroker).annotatedWith(Names.named(HONEYCOMB_NETCONF))
-
-        // Wrap BA data broker as BindingAwareBroker (requied by HONEYCOMB_NETCONF)
-        bind(BindingAwareBroker)
-                .annotatedWith(Names.named(HONEYCOMB_NETCONF))
-                .toProvider(NetconfBindingBrokerProvider)
-                .in(Singleton)
-
-        // Create netconf operation service factory aggregator to aggregate different services
-        def factory = new AggregatedNetconfOperationServiceFactory()
-        bind(NetconfOperationServiceFactory)
-                .annotatedWith(Names.named(HONEYCOMB_NETCONF_MAPPER_AGGR))
-                .toInstance(factory)
-        bind(NetconfOperationServiceFactoryListener).toInstance(factory)
-
-        // Create netconf notification manager
-        def manager = new NetconfNotificationManager()
-        bind(NetconfNotificationCollector).toInstance(manager)
-        bind(NetconfNotificationRegistry).toInstance(manager)
-        bind(NetconfNotificationListener).toInstance(manager)
-
-        // Netconf notification service factory
-        bind(NetconfOperationServiceFactory)
-                .annotatedWith(Names.named(HONEYCOMB_NETCONF_MAPPER_NOTIF))
-                .toProvider(NetconfNotificationMapperProvider)
-                .in(Singleton)
-        expose(NetconfOperationServiceFactory).annotatedWith(Names.named(HONEYCOMB_NETCONF_MAPPER_NOTIF))
-
-        // Netconf core part - mapping between Honeycomb and Netconf
-        bind(NetconfOperationServiceFactory)
-                .annotatedWith(Names.named(HONEYCOMB_NETCONF_MAPPER_CORE))
-                .toProvider(NetconfMdsalMapperProvider)
-                .in(Singleton)
-        expose(NetconfOperationServiceFactory).annotatedWith(Names.named(HONEYCOMB_NETCONF_MAPPER_CORE))
-
-        // Netconf monitoring service factory
-        bind(NetconfMonitoringService).toProvider(NetconfMonitoringServiceProvider).in(Singleton)
-        bind(NetconfOperationServiceFactory)
-                .annotatedWith(Names.named(HONEYCOMB_NETCONF_MAPPER_OPER))
-                .toProvider(NetconfMonitoringMapperProvider)
-                .in(Singleton)
-        expose(NetconfOperationServiceFactory).annotatedWith(Names.named(HONEYCOMB_NETCONF_MAPPER_OPER))
-
-        // Create HC notification manager + HC2Netconf translator
-        bind(NotificationCollector).toProvider(HoneycombNotificationManagerProvider).in(Singleton)
-        bind(HoneycombNotification2NetconfProvider.HoneycombNotification2Netconf)
-                .toProvider(HoneycombNotification2NetconfProvider)
-                .in(Singleton)
-        expose(HoneycombNotification2NetconfProvider.HoneycombNotification2Netconf)
-
-        configureServer()
-    }
-
-    /**
-     * Provide HONEYCOMB_NETCONF TCP and SSH servers
-     */
-    def configureServer() {
-        bind(NioEventLoopGroup).toProvider(NettyThreadGroupProvider).in(Singleton)
-        bind(Timer).toProvider(NettyTimerProvider).in(Singleton)
-        bind(NetconfServerDispatcher).toProvider(NetconfServerDispatcherProvider).in(Singleton)
-        bind(NetconfTcpServerProvider.NetconfTcpServer).toProvider(NetconfTcpServerProvider).in(Singleton)
-        expose(NetconfTcpServerProvider.NetconfTcpServer)
-        bind(NetconfSshServerProvider.NetconfSshServer).toProvider(NetconfSshServerProvider).in(Singleton)
-        expose(NetconfSshServerProvider.NetconfSshServer)
-    }
-}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfModule.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfModule.java
new file mode 100644 (file)
index 0000000..9beb10d
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.infra.distro.netconf;
+
+import static io.fd.honeycomb.infra.distro.data.InmemoryDOMDataBrokerProvider.CONFIG;
+import static io.fd.honeycomb.infra.distro.data.InmemoryDOMDataBrokerProvider.OPERATIONAL;
+
+import com.google.inject.PrivateModule;
+import com.google.inject.Singleton;
+import com.google.inject.binder.AnnotatedElementBuilder;
+import com.google.inject.name.Names;
+import io.fd.honeycomb.infra.distro.data.BindingDataBrokerProvider;
+import io.fd.honeycomb.infra.distro.data.DataStoreProvider;
+import io.fd.honeycomb.infra.distro.data.HoneycombNotificationManagerProvider;
+import io.fd.honeycomb.infra.distro.data.InmemoryDOMDataBrokerProvider;
+import io.fd.honeycomb.notification.NotificationCollector;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.util.Timer;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
+import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStore;
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
+import org.opendaylight.netconf.api.NetconfServerDispatcher;
+import org.opendaylight.netconf.api.monitoring.NetconfMonitoringService;
+import org.opendaylight.netconf.impl.osgi.AggregatedNetconfOperationServiceFactory;
+import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory;
+import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactoryListener;
+import org.opendaylight.netconf.notifications.NetconfNotificationCollector;
+import org.opendaylight.netconf.notifications.NetconfNotificationListener;
+import org.opendaylight.netconf.notifications.NetconfNotificationRegistry;
+import org.opendaylight.netconf.notifications.impl.NetconfNotificationManager;
+
+public class NetconfModule extends PrivateModule {
+
+    public static final String HONEYCOMB_NETCONF = "honeycomb-netconf";
+    public static final String HONEYCOMB_NETCONF_MAPPER_AGGR = "netconf-mapper-aggregator";
+    public static final String HONEYCOMB_NETCONF_MAPPER_NOTIF = "netconf-mapper-notification";
+    public static final String HONEYCOMB_NETCONF_MAPPER_CORE = "netconf-mapper-honeycomb";
+    public static final String HONEYCOMB_NETCONF_MAPPER_OPER = "netconf-mapper-monitoring";
+
+    @Override
+    protected void configure() {
+        // Create inmemory data store for HONEYCOMB_NETCONF config metadata
+        bind(InMemoryDOMDataStore.class).annotatedWith(Names.named(CONFIG))
+                .toProvider(new DataStoreProvider(CONFIG, LogicalDatastoreType.CONFIGURATION))
+                .in(Singleton.class);
+
+        // Create inmemory data store for HONEYCOMB_NETCONF operational metadata
+        bind(InMemoryDOMDataStore.class).annotatedWith(Names.named(OPERATIONAL))
+                .toProvider(new DataStoreProvider(OPERATIONAL, LogicalDatastoreType.OPERATIONAL))
+                .in(Singleton.class);
+        // Wrap datastores as DOMDataBroker
+        bind(DOMDataBroker.class).toProvider(InmemoryDOMDataBrokerProvider.class).in(Singleton.class);
+
+        // Wrap DOMDataBroker as BA data broker
+        bind(DataBroker.class).annotatedWith(Names.named(HONEYCOMB_NETCONF)).toProvider(BindingDataBrokerProvider.class)
+                .in(Singleton.class);
+        expose(DataBroker.class).annotatedWith(Names.named(HONEYCOMB_NETCONF));
+
+        // Wrap BA data broker as BindingAwareBroker (requied by HONEYCOMB_NETCONF)
+        bind(BindingAwareBroker.class).annotatedWith(Names.named(HONEYCOMB_NETCONF))
+                .toProvider(NetconfBindingBrokerProvider.class).in(Singleton.class);
+
+        // Create netconf operation service factory aggregator to aggregate different services
+        AggregatedNetconfOperationServiceFactory factory = new AggregatedNetconfOperationServiceFactory();
+        bind(NetconfOperationServiceFactory.class).annotatedWith(Names.named(HONEYCOMB_NETCONF_MAPPER_AGGR))
+                .toInstance(factory);
+        bind(NetconfOperationServiceFactoryListener.class).toInstance(factory);
+
+        // Create netconf notification manager
+        NetconfNotificationManager manager = new NetconfNotificationManager();
+        bind(NetconfNotificationCollector.class).toInstance(manager);
+        bind(NetconfNotificationRegistry.class).toInstance(manager);
+        bind(NetconfNotificationListener.class).toInstance(manager);
+
+        // Netconf notification service factory
+        bind(NetconfOperationServiceFactory.class).annotatedWith(Names.named(HONEYCOMB_NETCONF_MAPPER_NOTIF))
+                .toProvider(NetconfNotificationMapperProvider.class).in(Singleton.class);
+        expose(NetconfOperationServiceFactory.class).annotatedWith(Names.named(HONEYCOMB_NETCONF_MAPPER_NOTIF));
+
+        // Netconf core part - mapping between Honeycomb and Netconf
+        bind(NetconfOperationServiceFactory.class).annotatedWith(Names.named(HONEYCOMB_NETCONF_MAPPER_CORE))
+                .toProvider(NetconfMdsalMapperProvider.class).in(Singleton.class);
+        expose(NetconfOperationServiceFactory.class).annotatedWith(Names.named(HONEYCOMB_NETCONF_MAPPER_CORE));
+
+        // Netconf monitoring service factory
+        bind(NetconfMonitoringService.class).toProvider(NetconfMonitoringServiceProvider.class).in(Singleton.class);
+        bind(NetconfOperationServiceFactory.class).annotatedWith(Names.named(HONEYCOMB_NETCONF_MAPPER_OPER))
+                .toProvider(NetconfMonitoringMapperProvider.class).in(Singleton.class);
+        expose(NetconfOperationServiceFactory.class).annotatedWith(Names.named(HONEYCOMB_NETCONF_MAPPER_OPER));
+
+        // Create HC notification manager + HC2Netconf translator
+        bind(NotificationCollector.class).toProvider(HoneycombNotificationManagerProvider.class).in(Singleton.class);
+        bind(HoneycombNotification2NetconfProvider.HoneycombNotification2Netconf.class)
+                .toProvider(HoneycombNotification2NetconfProvider.class).in(Singleton.class);
+        expose(HoneycombNotification2NetconfProvider.HoneycombNotification2Netconf.class);
+
+        configureServer();
+    }
+
+    /**
+     * Provide HONEYCOMB_NETCONF TCP and SSH servers.
+     */
+    private AnnotatedElementBuilder configureServer() {
+        bind(NioEventLoopGroup.class).toProvider(NettyThreadGroupProvider.class).in(Singleton.class);
+        bind(Timer.class).toProvider(NettyTimerProvider.class).in(Singleton.class);
+        bind(NetconfServerDispatcher.class).toProvider(NetconfServerDispatcherProvider.class).in(Singleton.class);
+        bind(NetconfTcpServerProvider.NetconfTcpServer.class).toProvider(NetconfTcpServerProvider.class)
+                .in(Singleton.class);
+        expose(NetconfTcpServerProvider.NetconfTcpServer.class);
+        bind(NetconfSshServerProvider.NetconfSshServer.class).toProvider(NetconfSshServerProvider.class)
+                .in(Singleton.class);
+        return expose(NetconfSshServerProvider.NetconfSshServer.class);
+    }
+}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMonitoringMapperProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMonitoringMapperProvider.groovy
deleted file mode 100644 (file)
index c35a973..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.infra.distro.netconf
-
-import com.google.inject.Inject
-import com.google.inject.name.Named
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import org.opendaylight.controller.config.yang.netconf.mdsal.monitoring.MonitoringToMdsalWriter
-import org.opendaylight.controller.config.yang.netconf.mdsal.monitoring.NetconfMdsalMonitoringMapperModule
-import org.opendaylight.controller.sal.binding.api.BindingAwareBroker
-import org.opendaylight.netconf.api.monitoring.NetconfMonitoringService
-import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory
-import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactoryListener
-
-@Slf4j
-@ToString
-class NetconfMonitoringMapperProvider extends ProviderTrait<NetconfOperationServiceFactory> {
-
-    @Inject
-    @Named(NetconfModule.HONEYCOMB_NETCONF)
-    BindingAwareBroker bindingAwareBroker
-    @Inject
-    NetconfOperationServiceFactoryListener aggregator
-    @Inject
-    NetconfMonitoringService monitoringService
-
-    def create() {
-        def monitoringToMdsalWriter = new MonitoringToMdsalWriter(monitoringService)
-        bindingAwareBroker.registerProvider(monitoringToMdsalWriter)
-
-        def mdSalMonitoringMapperFactory = new NetconfMdsalMonitoringMapperModule.MdSalMonitoringMapperFactory(
-                new NetconfMdsalMonitoringMapperModule.MdsalMonitoringMapper(monitoringService))
-
-        aggregator.onAddNetconfOperationServiceFactory(mdSalMonitoringMapperFactory)
-        return mdSalMonitoringMapperFactory
-    }
-}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMonitoringMapperProvider.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMonitoringMapperProvider.java
new file mode 100644 (file)
index 0000000..46a46ba
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.infra.distro.netconf;
+
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import java.lang.reflect.Constructor;
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
+import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
+import org.opendaylight.netconf.api.monitoring.NetconfMonitoringService;
+import org.opendaylight.netconf.mapping.api.NetconfOperationService;
+import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory;
+import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactoryListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public final class NetconfMonitoringMapperProvider extends ProviderTrait<NetconfOperationServiceFactory> {
+
+    private static final Logger LOG = LoggerFactory.getLogger(NetconfMonitoringMapperProvider.class);
+
+    @Inject
+    @Named(NetconfModule.HONEYCOMB_NETCONF)
+    private BindingAwareBroker bindingAwareBroker;
+    @Inject
+    private NetconfOperationServiceFactoryListener aggregator;
+    @Inject
+    private NetconfMonitoringService monitoringService;
+
+    @Override
+    protected NetconfOperationServiceFactory create() {
+        try {
+            final Class<?> monitoringWriterCls = Class.forName(
+                    "org.opendaylight.controller.config.yang.netconf.mdsal.monitoring.MonitoringToMdsalWriter");
+            Constructor<?> declaredConstructor =
+                    monitoringWriterCls.getDeclaredConstructor(NetconfMonitoringService.class);
+            declaredConstructor.setAccessible(true);
+            final BindingAwareProvider o = (BindingAwareProvider) declaredConstructor.newInstance(monitoringService);
+            bindingAwareBroker.registerProvider(o);
+
+            final Class<?> monitoringMapperCls = Class.forName(
+                    "org.opendaylight.controller.config.yang.netconf.mdsal.monitoring.NetconfMdsalMonitoringMapperModule$MdsalMonitoringMapper");
+            declaredConstructor =
+                    monitoringMapperCls.getDeclaredConstructor(NetconfMonitoringService.class);
+            declaredConstructor.setAccessible(true);
+            final NetconfOperationService mdSalMonitoringMapper =
+                    (NetconfOperationService) declaredConstructor.newInstance(monitoringService);
+
+            final Class<?> monitoringMpperFactory = Class.forName(
+                    "org.opendaylight.controller.config.yang.netconf.mdsal.monitoring.NetconfMdsalMonitoringMapperModule$MdSalMonitoringMapperFactory");
+            declaredConstructor =
+                    monitoringMpperFactory.getDeclaredConstructor(NetconfOperationService.class);
+            declaredConstructor.setAccessible(true);
+            final NetconfOperationServiceFactory mdSalMonitoringMapperFactory =
+                    (NetconfOperationServiceFactory) declaredConstructor.newInstance(mdSalMonitoringMapper);
+            aggregator.onAddNetconfOperationServiceFactory(mdSalMonitoringMapperFactory);
+            return mdSalMonitoringMapperFactory;
+        } catch (final ReflectiveOperationException e) {
+            final String msg = "Unable to instantiate operation service factory using reflection";
+            LOG.error(msg, e);
+            throw new IllegalStateException(msg, e);
+        }
+    }
+}
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro.netconf
+package io.fd.honeycomb.infra.distro.netconf;
 
-import com.google.inject.Inject
-import com.google.inject.name.Named
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import io.fd.honeycomb.translate.read.ReaderFactory
-import org.opendaylight.controller.md.sal.binding.api.DataBroker
-import io.fd.honeycomb.impl.NetconfMonitoringReaderFactory
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import io.fd.honeycomb.impl.NetconfMonitoringReaderFactory;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import io.fd.honeycomb.translate.read.ReaderFactory;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 
-@Slf4j
-@ToString
-class NetconfMonitoringReaderFactoryProvider extends ProviderTrait<ReaderFactory> {
+
+public final class NetconfMonitoringReaderFactoryProvider extends ProviderTrait<ReaderFactory> {
 
     @Inject
     @Named(NetconfModule.HONEYCOMB_NETCONF)
-    DataBroker netconfDataBroker
+    private DataBroker netconfDataBroker;
 
-    def create() { new NetconfMonitoringReaderFactory(netconfDataBroker) }
+    @Override
+    protected NetconfMonitoringReaderFactory create() {
+        return new NetconfMonitoringReaderFactory(netconfDataBroker);
+    }
 }
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro.netconf
+package io.fd.honeycomb.infra.distro.netconf;
 
-import com.google.inject.Inject
-import com.google.inject.name.Named
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import org.opendaylight.netconf.api.monitoring.NetconfMonitoringService
-import org.opendaylight.netconf.impl.osgi.NetconfMonitoringServiceImpl
-import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import org.opendaylight.netconf.api.monitoring.NetconfMonitoringService;
+import org.opendaylight.netconf.impl.osgi.NetconfMonitoringServiceImpl;
+import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory;
 
-@Slf4j
-@ToString
-class NetconfMonitoringServiceProvider extends ProviderTrait<NetconfMonitoringService> {
+
+public class NetconfMonitoringServiceProvider extends ProviderTrait<NetconfMonitoringService> {
 
     @Inject
     @Named(NetconfModule.HONEYCOMB_NETCONF_MAPPER_AGGR)
-    NetconfOperationServiceFactory aggregator
+    private NetconfOperationServiceFactory aggregator;
 
     @Override
-    def create() {
-        new NetconfMonitoringServiceImpl(aggregator)
+    protected NetconfMonitoringServiceImpl create() {
+        return new NetconfMonitoringServiceImpl(aggregator);
     }
 }
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfNotificationMapperProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfNotificationMapperProvider.groovy
deleted file mode 100644 (file)
index 74b3843..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.infra.distro.netconf
-
-import com.google.inject.Inject
-import com.google.inject.name.Named
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import org.opendaylight.controller.config.yang.netconf.mdsal.notification.BaseCapabilityChangeNotificationPublisher
-import org.opendaylight.controller.config.yang.netconf.mdsal.notification.NotificationToMdsalWriter
-import org.opendaylight.controller.md.sal.binding.api.DataBroker
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType
-import org.opendaylight.controller.sal.binding.api.BindingAwareBroker
-import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory
-import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactoryListener
-import org.opendaylight.netconf.mdsal.notification.NetconfNotificationOperationServiceFactory
-import org.opendaylight.netconf.notifications.NetconfNotificationCollector
-import org.opendaylight.netconf.notifications.NetconfNotificationRegistry
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.NetconfState
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Capabilities
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier
-
-@Slf4j
-@ToString
-class NetconfNotificationMapperProvider extends ProviderTrait<NetconfOperationServiceFactory> {
-
-    public static final capabilitiesIdentifier =
-            InstanceIdentifier.create(NetconfState.class).child(Capabilities.class).builder().build()
-
-    @Inject
-    NetconfNotificationCollector notificationCollector
-    @Inject
-    NetconfNotificationRegistry notificationRegistry
-    @Inject
-    @Named(NetconfModule.HONEYCOMB_NETCONF)
-    BindingAwareBroker bindingAwareBroker
-    @Inject
-    @Named(NetconfModule.HONEYCOMB_NETCONF)
-    DataBroker dataBroker
-    @Inject
-    NetconfOperationServiceFactoryListener aggregator
-
-    def create() {
-        def notificationToMdsalWriter = new NotificationToMdsalWriter(notificationCollector)
-        bindingAwareBroker.registerProvider(notificationToMdsalWriter)
-
-        def capabilityChangeListenerRegistration = dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL, capabilitiesIdentifier,
-                new BaseCapabilityChangeNotificationPublisher(notificationCollector.registerBaseNotificationPublisher()), AsyncDataBroker.DataChangeScope.SUBTREE)
-
-        def netconfNotificationOperationServiceFactory = new NetconfNotificationOperationServiceFactory(notificationRegistry)
-        aggregator.onAddNetconfOperationServiceFactory(netconfNotificationOperationServiceFactory)
-        netconfNotificationOperationServiceFactory
-    }
-}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfNotificationMapperProvider.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfNotificationMapperProvider.java
new file mode 100644 (file)
index 0000000..2c2631b
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.infra.distro.netconf;
+
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import java.lang.reflect.Constructor;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
+import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
+import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory;
+import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactoryListener;
+import org.opendaylight.netconf.mdsal.notification.NetconfNotificationOperationServiceFactory;
+import org.opendaylight.netconf.notifications.BaseNotificationPublisherRegistration;
+import org.opendaylight.netconf.notifications.NetconfNotificationCollector;
+import org.opendaylight.netconf.notifications.NetconfNotificationRegistry;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.NetconfState;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Capabilities;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class NetconfNotificationMapperProvider extends ProviderTrait<NetconfOperationServiceFactory> {
+
+    private static final Logger LOG = LoggerFactory.getLogger(NetconfNotificationMapperProvider.class);
+
+    public static final InstanceIdentifier<Capabilities> capabilitiesIdentifier =
+            InstanceIdentifier.create(NetconfState.class).child(Capabilities.class).builder().build();
+    @Inject
+    private NetconfNotificationCollector notificationCollector;
+    @Inject
+    private NetconfNotificationRegistry notificationRegistry;
+    @Inject
+    @Named(NetconfModule.HONEYCOMB_NETCONF)
+    private BindingAwareBroker bindingAwareBroker;
+    @Inject
+    @Named(NetconfModule.HONEYCOMB_NETCONF)
+    private DataBroker dataBroker;
+    @Inject
+    private NetconfOperationServiceFactoryListener aggregator;
+
+    @Override
+    protected NetconfNotificationOperationServiceFactory create() {
+        try {
+            final Class<?> notificationWriter = Class.forName(
+                    "org.opendaylight.controller.config.yang.netconf.mdsal.notification.NotificationToMdsalWriter");
+            Constructor<?> declaredConstructor =
+                    notificationWriter.getDeclaredConstructor(NetconfNotificationCollector.class);
+            declaredConstructor.setAccessible(true);
+            final BindingAwareProvider writer =
+                    (BindingAwareProvider) declaredConstructor.newInstance(notificationCollector);
+            bindingAwareBroker.registerProvider(writer);
+
+            final Class<?> notifPublisherCls = Class.forName(
+                    "org.opendaylight.controller.config.yang.netconf.mdsal.notification.BaseCapabilityChangeNotificationPublisher");
+            declaredConstructor =
+                    notifPublisherCls.getDeclaredConstructor(BaseNotificationPublisherRegistration.class);
+            declaredConstructor.setAccessible(true);
+            final DataChangeListener publisher = (DataChangeListener) declaredConstructor.newInstance(
+                    notificationCollector.registerBaseNotificationPublisher());
+
+            ListenerRegistration<DataChangeListener> capabilityChangeListenerRegistration = dataBroker
+                    .registerDataChangeListener(LogicalDatastoreType.OPERATIONAL, capabilitiesIdentifier,
+                            publisher, AsyncDataBroker.DataChangeScope.SUBTREE);
+            NetconfNotificationOperationServiceFactory netconfNotificationOperationServiceFactory =
+                    new NetconfNotificationOperationServiceFactory(notificationRegistry);
+            aggregator.onAddNetconfOperationServiceFactory(netconfNotificationOperationServiceFactory);
+
+            return netconfNotificationOperationServiceFactory;
+        } catch (final ReflectiveOperationException e) {
+            final String msg = "Unable to instantiate notification mapper using reflection";
+            LOG.error(msg, e);
+            throw new IllegalStateException(msg, e);
+        }
+    }
+}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfNotificationsReaderFactoryProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfNotificationsReaderFactoryProvider.groovy
deleted file mode 100644 (file)
index c714cdd..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.infra.distro.netconf
-
-import com.google.inject.Inject
-import com.google.inject.name.Named
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import io.fd.honeycomb.translate.read.ReaderFactory
-import io.fd.honeycomb.translate.read.registry.ModifiableReaderRegistryBuilder
-import io.fd.honeycomb.translate.util.read.BindingBrokerReader
-import org.opendaylight.controller.md.sal.binding.api.DataBroker
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netmod.notification.rev080714.Netconf
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netmod.notification.rev080714.NetconfBuilder
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier
-
-import javax.annotation.Nonnull
-
-@Slf4j
-@ToString
-class NetconfNotificationsReaderFactoryProvider extends ProviderTrait<ReaderFactory> {
-
-    @Inject
-    @Named(NetconfModule.HONEYCOMB_NETCONF)
-    DataBroker netconfDataBroker
-
-    def create() {
-        new ReaderFactory() {
-            @Override
-            void init(@Nonnull final ModifiableReaderRegistryBuilder registry) {
-                registry.add(new BindingBrokerReader<>(InstanceIdentifier.create(Netconf.class),
-                        netconfDataBroker, LogicalDatastoreType.OPERATIONAL, NetconfBuilder.class));
-            }
-        }
-    }
-}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfNotificationsReaderFactoryProvider.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfNotificationsReaderFactoryProvider.java
new file mode 100644 (file)
index 0000000..b699439
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.infra.distro.netconf;
+
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import io.fd.honeycomb.translate.read.ReaderFactory;
+import io.fd.honeycomb.translate.read.registry.ModifiableReaderRegistryBuilder;
+import io.fd.honeycomb.translate.util.read.BindingBrokerReader;
+import javax.annotation.Nonnull;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netmod.notification.rev080714.Netconf;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netmod.notification.rev080714.NetconfBuilder;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+public final class NetconfNotificationsReaderFactoryProvider extends ProviderTrait<ReaderFactory> {
+
+    @Inject
+    @Named(NetconfModule.HONEYCOMB_NETCONF)
+    private DataBroker netconfDataBroker;
+
+    @Override
+    protected ReaderFactory create() {
+        return new NotificationReaderFactory(netconfDataBroker);
+    }
+
+    private static final class NotificationReaderFactory implements ReaderFactory {
+        private final DataBroker netconfDataBroker;
+
+        NotificationReaderFactory(final DataBroker netconfDataBroker) {
+            this.netconfDataBroker = netconfDataBroker;
+        }
+
+        @Override
+        public void init(@Nonnull final ModifiableReaderRegistryBuilder registry) {
+            registry.add(new BindingBrokerReader<>(InstanceIdentifier.create(Netconf.class), netconfDataBroker,
+                    LogicalDatastoreType.OPERATIONAL, NetconfBuilder.class));
+        }
+
+    }
+}
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro.netconf
+package io.fd.honeycomb.infra.distro.netconf;
 
-import com.google.inject.AbstractModule
-import com.google.inject.Singleton
-import com.google.inject.multibindings.Multibinder
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.translate.read.ReaderFactory
+import com.google.inject.AbstractModule;
+import com.google.inject.Singleton;
+import com.google.inject.multibindings.Multibinder;
+import io.fd.honeycomb.translate.read.ReaderFactory;
 
-@Slf4j
-class NetconfReadersModule extends AbstractModule {
+public class NetconfReadersModule extends AbstractModule {
 
     protected void configure() {
         // This should be part of NetconfModule, but that one is Private and Multibinders + private BASE_MODULES
         // do not work together, that's why there's a dedicated module here
         // https://github.com/google/guice/issues/906
-        Multibinder.newSetBinder(binder(), ReaderFactory.class).with {
-            addBinding().toProvider(NetconfMonitoringReaderFactoryProvider).in(Singleton)
-            addBinding().toProvider(NetconfNotificationsReaderFactoryProvider).in(Singleton)
-        }
+        final Multibinder<ReaderFactory> binder = Multibinder.newSetBinder(binder(), ReaderFactory.class);
+        binder.addBinding().toProvider(NetconfMonitoringReaderFactoryProvider.class).in(Singleton.class);
+        binder.addBinding().toProvider(NetconfNotificationsReaderFactoryProvider.class).in(Singleton.class);
     }
 }
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfServerDispatcherProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfServerDispatcherProvider.groovy
deleted file mode 100644 (file)
index 10388f9..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.infra.distro.netconf
-
-import com.google.inject.Inject
-import com.google.inject.name.Named
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import io.netty.channel.nio.NioEventLoopGroup
-import io.netty.util.Timer
-import org.opendaylight.netconf.api.NetconfServerDispatcher
-import org.opendaylight.netconf.api.monitoring.NetconfMonitoringService
-import org.opendaylight.netconf.impl.NetconfServerDispatcherImpl
-import org.opendaylight.netconf.impl.NetconfServerSessionNegotiatorFactory
-import org.opendaylight.netconf.impl.SessionIdProvider
-import org.opendaylight.netconf.impl.osgi.AggregatedNetconfOperationServiceFactory
-import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory
-
-import java.util.concurrent.TimeUnit
-
-@Slf4j
-@ToString
-class NetconfServerDispatcherProvider extends ProviderTrait<NetconfServerDispatcher> {
-
-    // TODO make configurable
-    private static final long CONNECTION_TIMEOUT_MILLIS = TimeUnit.SECONDS.toMillis(20)
-
-    @Inject
-    @Named(NetconfModule.HONEYCOMB_NETCONF_MAPPER_AGGR)
-    NetconfOperationServiceFactory aggregator
-    @Inject
-    NetconfMonitoringService monitoringService
-    @Inject
-    Timer timer
-    @Inject
-    NioEventLoopGroup nettyThreadgroup
-
-
-    def create() {
-        def netconfOperationProvider = new AggregatedNetconfOperationServiceFactory()
-        netconfOperationProvider.onAddNetconfOperationServiceFactory(aggregator)
-
-        def serverNegotiatorFactory = new NetconfServerSessionNegotiatorFactory(
-                timer, netconfOperationProvider, new SessionIdProvider(), CONNECTION_TIMEOUT_MILLIS, monitoringService);
-        def serverChannelInitializer = new NetconfServerDispatcherImpl.ServerChannelInitializer(
-                serverNegotiatorFactory);
-
-        new NetconfServerDispatcherImpl(serverChannelInitializer, nettyThreadgroup, nettyThreadgroup)
-    }
-
-}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfServerDispatcherProvider.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfServerDispatcherProvider.java
new file mode 100644 (file)
index 0000000..1f3caaf
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.infra.distro.netconf;
+
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.util.Timer;
+import java.util.concurrent.TimeUnit;
+import org.opendaylight.netconf.api.NetconfServerDispatcher;
+import org.opendaylight.netconf.api.monitoring.NetconfMonitoringService;
+import org.opendaylight.netconf.impl.NetconfServerDispatcherImpl;
+import org.opendaylight.netconf.impl.NetconfServerSessionNegotiatorFactory;
+import org.opendaylight.netconf.impl.SessionIdProvider;
+import org.opendaylight.netconf.impl.osgi.AggregatedNetconfOperationServiceFactory;
+import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory;
+
+public final class NetconfServerDispatcherProvider extends ProviderTrait<NetconfServerDispatcher> {
+    private static final long CONNECTION_TIMEOUT_MILLIS = TimeUnit.SECONDS.toMillis(20);
+
+    @Inject
+    @Named(NetconfModule.HONEYCOMB_NETCONF_MAPPER_AGGR)
+    private NetconfOperationServiceFactory aggregator;
+    @Inject
+    private NetconfMonitoringService monitoringService;
+    @Inject
+    private Timer timer;
+    @Inject
+    private NioEventLoopGroup nettyThreadgroup;
+
+    @Override
+    protected NetconfServerDispatcherImpl create() {
+        AggregatedNetconfOperationServiceFactory netconfOperationProvider =
+                new AggregatedNetconfOperationServiceFactory();
+        netconfOperationProvider.onAddNetconfOperationServiceFactory(aggregator);
+
+        NetconfServerSessionNegotiatorFactory serverNegotiatorFactory =
+                new NetconfServerSessionNegotiatorFactory(timer, netconfOperationProvider, new SessionIdProvider(),
+                        CONNECTION_TIMEOUT_MILLIS, monitoringService);
+        NetconfServerDispatcherImpl.ServerChannelInitializer serverChannelInitializer =
+                new NetconfServerDispatcherImpl.ServerChannelInitializer(serverNegotiatorFactory);
+
+        return new NetconfServerDispatcherImpl(serverChannelInitializer, nettyThreadgroup, nettyThreadgroup);
+    }
+}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfSshServerProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfSshServerProvider.groovy
deleted file mode 100644 (file)
index 55daca2..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.infra.distro.netconf
-
-import com.google.common.util.concurrent.ThreadFactoryBuilder
-import com.google.inject.Inject
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import io.netty.channel.ChannelFuture
-import io.netty.channel.local.LocalAddress
-import io.netty.channel.nio.NioEventLoopGroup
-import io.netty.util.concurrent.GenericFutureListener
-import io.netty.util.concurrent.GlobalEventExecutor
-import org.apache.sshd.server.keyprovider.PEMGeneratorHostKeyProvider
-import org.opendaylight.netconf.api.NetconfServerDispatcher
-import org.opendaylight.netconf.ssh.SshProxyServer
-import org.opendaylight.netconf.ssh.SshProxyServerConfigurationBuilder
-
-import java.util.concurrent.Executors
-import java.util.concurrent.ScheduledExecutorService
-
-@Slf4j
-@ToString
-class NetconfSshServerProvider extends ProviderTrait<NetconfSshServer> {
-
-    @Inject
-    NetconfServerDispatcher dispatcher
-    @Inject
-    HoneycombConfiguration cfgAttributes
-    @Inject
-    NioEventLoopGroup nettyThreadgroup
-
-    private ScheduledExecutorService pool =
-            Executors.newScheduledThreadPool(1, new ThreadFactoryBuilder().setNameFormat("netconf-ssh-%d").build())
-
-    @Override
-    def create() {
-        def name = InetAddress.getByName(cfgAttributes.netconfSshBindingAddress.get())
-        def bindingAddress = new InetSocketAddress(name, cfgAttributes.netconfSshBindingPort.get())
-
-        def localAddress = new LocalAddress(cfgAttributes.netconfSshBindingPort.toString())
-        def localServer = dispatcher.createLocalServer(localAddress)
-
-        def sshProxyServer = new SshProxyServer(pool, nettyThreadgroup, GlobalEventExecutor.INSTANCE)
-
-        def sshConfigBuilder = new SshProxyServerConfigurationBuilder()
-        sshConfigBuilder.bindingAddress = bindingAddress
-        sshConfigBuilder.localAddress = localAddress
-        // TODO only simple authProvider checking ConfigAttributes
-        sshConfigBuilder.authenticator = { String uname, String passwd ->
-            cfgAttributes.username == uname && cfgAttributes.password == passwd
-        }
-        sshConfigBuilder.idleTimeout = Integer.MAX_VALUE
-        sshConfigBuilder.keyPairProvider = new PEMGeneratorHostKeyProvider()
-
-        localServer.addListener(new GenericFutureListener<ChannelFuture>() {
-
-            @Override
-            public void operationComplete(final ChannelFuture future) {
-                if(future.isDone() && !future.isCancelled()) {
-                    try {
-                        sshProxyServer.bind(sshConfigBuilder.createSshProxyServerConfiguration())
-                        log.info "Netconf SSH endpoint started successfully at {}", bindingAddress
-                    } catch (final IOException e) {
-                        throw new RuntimeException("Unable to start SSH netconf server", e)
-                    }
-                } else {
-                    log.warn "Unable to start SSH netconf server at {}", bindingAddress, future.cause()
-                    throw new RuntimeException("Unable to start SSH netconf server", future.cause())
-                }
-            }
-        })
-
-        return new NetconfSshServer(localServer: localServer, sshProxyServer: sshProxyServer)
-    }
-
-    static class NetconfSshServer {
-        def localServer
-        def sshProxyServer
-    }
-}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfSshServerProvider.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfSshServerProvider.java
new file mode 100644 (file)
index 0000000..53be6b5
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.infra.distro.netconf;
+
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import com.google.inject.Inject;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration;
+import io.netty.channel.ChannelFuture;
+import io.netty.channel.local.LocalAddress;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.util.concurrent.GenericFutureListener;
+import io.netty.util.concurrent.GlobalEventExecutor;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import org.apache.sshd.server.keyprovider.PEMGeneratorHostKeyProvider;
+import org.opendaylight.netconf.api.NetconfServerDispatcher;
+import org.opendaylight.netconf.auth.AuthProvider;
+import org.opendaylight.netconf.ssh.SshProxyServer;
+import org.opendaylight.netconf.ssh.SshProxyServerConfigurationBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public final class NetconfSshServerProvider extends ProviderTrait<NetconfSshServerProvider.NetconfSshServer> {
+
+    private static final Logger LOG = LoggerFactory.getLogger(NetconfSshServerProvider.class);
+
+    @Inject
+    private NetconfServerDispatcher dispatcher;
+    @Inject
+    private HoneycombConfiguration cfgAttributes;
+    @Inject
+    private NioEventLoopGroup nettyThreadgroup;
+
+    private ScheduledExecutorService pool =
+            Executors.newScheduledThreadPool(1, new ThreadFactoryBuilder().setNameFormat("netconf-ssh-%d").build());
+
+    @Override
+    protected NetconfSshServer create() {
+        InetAddress sshBindingAddress = null;
+        try {
+            sshBindingAddress = InetAddress.getByName(cfgAttributes.netconfSshBindingAddress.get());
+        } catch (UnknownHostException e) {
+            throw new IllegalArgumentException("Illegal binding address", e);
+        }
+
+        final InetSocketAddress bindingAddress =
+                new InetSocketAddress(sshBindingAddress, cfgAttributes.netconfSshBindingPort.get());
+
+        LocalAddress localAddress = new LocalAddress(cfgAttributes.netconfSshBindingPort.toString());
+        ChannelFuture localServer = dispatcher.createLocalServer(localAddress);
+
+        final SshProxyServer sshProxyServer = new SshProxyServer(pool, nettyThreadgroup, GlobalEventExecutor.INSTANCE);
+
+        final SshProxyServerConfigurationBuilder sshConfigBuilder = new SshProxyServerConfigurationBuilder();
+        sshConfigBuilder.setBindingAddress(bindingAddress);
+        sshConfigBuilder.setLocalAddress(localAddress);
+        // TODO only simple authProvider checking ConfigAttributes
+        sshConfigBuilder.setAuthenticator(new SimplelAuthProvider(cfgAttributes));
+        sshConfigBuilder.setIdleTimeout(Integer.MAX_VALUE);
+        sshConfigBuilder.setKeyPairProvider(new PEMGeneratorHostKeyProvider());
+
+        localServer.addListener(new SshServerBinder(sshProxyServer, sshConfigBuilder, bindingAddress));
+
+        return new NetconfSshServer(localServer, sshProxyServer);
+    }
+
+    public static final class NetconfSshServer {
+        private ChannelFuture localServer;
+        private SshProxyServer sshProxyServer;
+
+        NetconfSshServer(final ChannelFuture localServer,
+                         final SshProxyServer sshProxyServer) {
+            this.localServer = localServer;
+            this.sshProxyServer = sshProxyServer;
+        }
+
+        public Object getLocalServer() {
+            return localServer;
+        }
+
+        public Object getSshProxyServer() {
+            return sshProxyServer;
+        }
+    }
+
+    private static final class SimplelAuthProvider implements AuthProvider {
+
+        private final HoneycombConfiguration cfgAttributes;
+
+        SimplelAuthProvider(final HoneycombConfiguration cfgAttributes) {
+            this.cfgAttributes = cfgAttributes;
+        }
+
+        @Override
+        public boolean authenticated(final String uname, final String passwd) {
+            return cfgAttributes.username.equals(uname) && cfgAttributes.password.equals(passwd);
+        }
+    }
+
+    private static final class SshServerBinder implements GenericFutureListener<ChannelFuture> {
+        private final SshProxyServer sshProxyServer;
+        private final SshProxyServerConfigurationBuilder sshConfigBuilder;
+        private final InetSocketAddress bindingAddress;
+
+        SshServerBinder(final SshProxyServer sshProxyServer,
+                        final SshProxyServerConfigurationBuilder sshConfigBuilder,
+                        final InetSocketAddress bindingAddress) {
+            this.sshProxyServer = sshProxyServer;
+            this.sshConfigBuilder = sshConfigBuilder;
+            this.bindingAddress = bindingAddress;
+        }
+
+        @Override
+        public void operationComplete(final ChannelFuture future) {
+            if (future.isDone() && !future.isCancelled()) {
+                try {
+                    sshProxyServer.bind(sshConfigBuilder.createSshProxyServerConfiguration());
+                    LOG.info("Netconf SSH endpoint started successfully at {}", bindingAddress);
+                } catch (final IOException e) {
+                    throw new RuntimeException("Unable to start SSH netconf server", e);
+                }
+
+            } else {
+                LOG.warn("Unable to start SSH netconf server at {}", bindingAddress, future.cause());
+                throw new RuntimeException("Unable to start SSH netconf server", future.cause());
+            }
+
+        }
+
+    }
+}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfTcpServerProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfTcpServerProvider.groovy
deleted file mode 100644 (file)
index 1b08002..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.infra.distro.netconf
-
-import com.google.inject.Inject
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import io.netty.channel.ChannelFuture
-import io.netty.util.concurrent.GenericFutureListener
-import org.opendaylight.netconf.api.NetconfServerDispatcher
-
-@Slf4j
-@ToString
-class NetconfTcpServerProvider extends ProviderTrait<NetconfTcpServer> {
-
-    @Inject
-    NetconfServerDispatcher dispatcher
-    @Inject
-    HoneycombConfiguration cfgAttributes
-
-    @Override
-    def create() {
-
-        def name = InetAddress.getByName(cfgAttributes.netconfTcpBindingAddress.get())
-        def unresolved = new InetSocketAddress(name, cfgAttributes.netconfTcpBindingPort.get())
-
-        def tcpServer = dispatcher.createServer(unresolved)
-
-        tcpServer.addListener(new GenericFutureListener<ChannelFuture>() {
-            @Override
-            public void operationComplete(ChannelFuture future) throws Exception {
-                if (future.isDone() && future.isSuccess()) {
-                    log.info("Netconf TCP endpoint started successfully at {}", unresolved)
-                } else {
-                    log.warn("Unable to start TCP netconf server at {}", unresolved, future.cause())
-                    throw new RuntimeException("Unable to start TCP netconf server", future.cause())
-                }
-            }
-        })
-
-        new NetconfTcpServer(tcpServer: tcpServer)
-    }
-
-    static class NetconfTcpServer {
-        def tcpServer
-    }
-}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfTcpServerProvider.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfTcpServerProvider.java
new file mode 100644 (file)
index 0000000..d6ab474
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.infra.distro.netconf;
+
+import com.google.inject.Inject;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration;
+import io.netty.channel.ChannelFuture;
+import io.netty.util.concurrent.GenericFutureListener;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
+import org.opendaylight.netconf.api.NetconfServerDispatcher;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class NetconfTcpServerProvider extends ProviderTrait<NetconfTcpServerProvider.NetconfTcpServer> {
+
+    private static final Logger LOG = LoggerFactory.getLogger(NetconfTcpServerProvider.class);
+
+    @Inject
+    private NetconfServerDispatcher dispatcher;
+    @Inject
+    private HoneycombConfiguration cfgAttributes;
+
+    @Override
+    protected NetconfTcpServer create() {
+        InetAddress name = null;
+        try {
+            name = InetAddress.getByName(cfgAttributes.netconfTcpBindingAddress.get());
+        } catch (UnknownHostException e) {
+            throw new IllegalArgumentException("Illegal binding address", e);
+        }
+
+        final InetSocketAddress unresolved = new InetSocketAddress(name, cfgAttributes.netconfTcpBindingPort.get());
+
+        ChannelFuture tcpServer = dispatcher.createServer(unresolved);
+        tcpServer.addListener(new TcpLoggingListener(unresolved));
+        return new NetconfTcpServer(tcpServer);
+    }
+
+    public static final class NetconfTcpServer {
+        private Object tcpServer;
+
+        NetconfTcpServer(final ChannelFuture tcpServer) {
+            this.tcpServer = tcpServer;
+        }
+
+        public Object getTcpServer() {
+            return tcpServer;
+        }
+    }
+
+    private static final class TcpLoggingListener implements GenericFutureListener<ChannelFuture> {
+        private final InetSocketAddress unresolved;
+
+        TcpLoggingListener(final InetSocketAddress unresolved) {
+            this.unresolved = unresolved;
+        }
+
+        @Override
+        public void operationComplete(ChannelFuture future) throws Exception {
+            if (future.isDone() && future.isSuccess()) {
+                LOG.info("Netconf TCP endpoint started successfully at {}", unresolved);
+            } else {
+                LOG.warn("Unable to start TCP netconf server at {}", unresolved, future.cause());
+                throw new RuntimeException("Unable to start TCP netconf server", future.cause());
+            }
+        }
+    }
+}
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro.netconf
+package io.fd.honeycomb.infra.distro.netconf;
 
-import com.google.common.util.concurrent.ThreadFactoryBuilder
-import com.google.inject.Inject
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration
-import io.netty.channel.nio.NioEventLoopGroup
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import com.google.inject.Inject;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration;
+import io.netty.channel.nio.NioEventLoopGroup;
 
-@Slf4j
-@ToString
-class NettyThreadGroupProvider extends ProviderTrait<NioEventLoopGroup> {
+public final class NettyThreadGroupProvider extends ProviderTrait<NioEventLoopGroup> {
 
     @Inject
-    HoneycombConfiguration cfgAttributes
+    private HoneycombConfiguration cfgAttributes;
 
     @Override
-    def create() {
-        new NioEventLoopGroup(cfgAttributes.netconfNettyThreads,
-            new ThreadFactoryBuilder().setNameFormat("netconf-netty-%d").build())
+    protected NioEventLoopGroup create() {
+        return new NioEventLoopGroup(cfgAttributes.netconfNettyThreads,
+                new ThreadFactoryBuilder().setNameFormat("netconf-netty-%d").build());
     }
 }
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro.netconf
+package io.fd.honeycomb.infra.distro.netconf;
 
-import com.google.inject.Inject
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import io.netty.util.HashedWheelTimer
-import io.netty.util.Timer
+import com.google.inject.Inject;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration;
+import io.netty.util.HashedWheelTimer;
+import io.netty.util.Timer;
 
-@Slf4j
-@ToString
-class NettyTimerProvider extends ProviderTrait<Timer> {
+public final class NettyTimerProvider extends ProviderTrait<Timer> {
 
     @Inject
-    HoneycombConfiguration cfgAttributes
+    private HoneycombConfiguration cfgAttributes;
 
     @Override
-    def create() {
+    protected HashedWheelTimer create() {
         // TODO expose configuration,
-        new HashedWheelTimer()
+        return new HashedWheelTimer();
     }
 }
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/HttpConnectorProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/HttpConnectorProvider.groovy
deleted file mode 100644 (file)
index 0be4a32..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-package io.fd.honeycomb.infra.distro.restconf
-
-import com.google.inject.Inject
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration
-import org.eclipse.jetty.server.Server
-import org.eclipse.jetty.server.ServerConnector
-
-class HttpConnectorProvider extends ProviderTrait<ServerConnector> {
-
-    @Inject
-    HoneycombConfiguration cfg
-    @Inject
-    Server server
-
-    @Override
-    def create() {
-        def httpConnector = new ServerConnector(server, cfg.acceptorsSize.get(), cfg.selectorsSize.get())
-        httpConnector.setHost(cfg.restconfBindingAddress.get())
-        httpConnector.setPort(cfg.restconfPort.get())
-        server.addConnector(httpConnector)
-        httpConnector
-    }
-}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/HttpConnectorProvider.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/HttpConnectorProvider.java
new file mode 100644 (file)
index 0000000..e3c9577
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.infra.distro.restconf;
+
+import com.google.inject.Inject;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+
+public final class HttpConnectorProvider extends ProviderTrait<ServerConnector> {
+
+    @Inject
+    private HoneycombConfiguration cfg;
+    @Inject
+    private Server server;
+
+    @Override
+    protected ServerConnector create() {
+        ServerConnector httpConnector =
+                new ServerConnector(server, cfg.acceptorsSize.get(), cfg.selectorsSize.get());
+        httpConnector.setHost(cfg.restconfBindingAddress.get());
+        httpConnector.setPort(cfg.restconfPort.get());
+        server.addConnector(httpConnector);
+        return httpConnector;
+    }
+}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/HttpsConnectorProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/HttpsConnectorProvider.groovy
deleted file mode 100644 (file)
index 388aa2b..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-package io.fd.honeycomb.infra.distro.restconf
-
-import com.google.inject.Inject
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration
-import org.eclipse.jetty.http.HttpVersion
-import org.eclipse.jetty.server.Server
-import org.eclipse.jetty.server.ServerConnector
-import org.eclipse.jetty.server.SslConnectionFactory
-import org.eclipse.jetty.util.ssl.SslContextFactory
-
-class HttpsConnectorProvider extends ProviderTrait<ServerConnector> {
-
-    @Inject
-    HoneycombConfiguration cfg
-    @Inject
-    Server server
-
-    @Override
-    def create() {
-
-        // SSL Context Factory
-        // Based on:
-        // https://github.com/eclipse/jetty.project/blob/jetty-9.3.x/examples/embedded/src/main/java/org/eclipse/jetty/embedded/LikeJettyXml.java
-        // https://wiki.eclipse.org/Jetty/Howto/Configure_SSL#Loading_Keys_and_Certificates_via_PKCS12
-        // Keystore created with:
-        // openssl genrsa -des3 -out honeycomb.key
-        // openssl req -new -x509 -key honeycomb.key -out honeycomb.crt
-        // openssl pkcs12 -inkey honeycomb.key -in honeycomb.crt -export -out honeycomb.pkcs12
-        // keytool -importkeystore -srckeystore honeycomb.pkcs12 -srcstoretype PKCS12 -destkeystore honeycomb-keystore
-        def sslContextFactory = new SslContextFactory()
-        def keystoreURL = getClass().getResource(cfg.restconfKeystore.get())
-        sslContextFactory.setKeyStorePath(keystoreURL.path)
-        sslContextFactory.setKeyStorePassword(cfg.keystorePassword.get())
-        sslContextFactory.setKeyManagerPassword((cfg.keystoreManagerPassword.get()))
-        def truststoreURL = getClass().getResource(cfg.restconfTruststore.get())
-        sslContextFactory.setTrustStorePath(truststoreURL.path)
-        sslContextFactory.setTrustStorePassword((cfg.truststorePassword.get()))
-        // TODO make this more configurable
-        sslContextFactory.setExcludeCipherSuites(
-                "SSL_RSA_WITH_DES_CBC_SHA",
-                "SSL_DHE_RSA_WITH_DES_CBC_SHA",
-                "SSL_DHE_DSS_WITH_DES_CBC_SHA",
-                "SSL_RSA_EXPORT_WITH_RC4_40_MD5",
-                "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA",
-                "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
-                "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA")
-
-        // SSL Connector
-        def sslConnector = new ServerConnector(server, cfg.httpsAcceptorsSize.get(), cfg.httpsSelectorsSize.get(),
-                new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()))
-        sslConnector.setHost(cfg.restconfHttpsBindingAddress.get())
-        sslConnector.setPort(cfg.restconfHttpsPort.get())
-        server.addConnector(sslConnector)
-        return sslConnector
-    }
-}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/HttpsConnectorProvider.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/HttpsConnectorProvider.java
new file mode 100644 (file)
index 0000000..76fc72f
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.infra.distro.restconf;
+
+import com.google.inject.Inject;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration;
+import java.net.URL;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.server.HttpConnectionFactory;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.SslConnectionFactory;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+
+public final class HttpsConnectorProvider extends ProviderTrait<ServerConnector> {
+
+    @Inject
+    private HoneycombConfiguration cfg;
+    @Inject
+    private Server server;
+
+    @Override
+    protected ServerConnector create() {
+        // SSL Context Factory
+        // Based on:
+        // https://github.com/eclipse/jetty.project/blob/jetty-9.3.x/examples/embedded/src/main/java/org/eclipse/jetty/embedded/LikeJettyXml.java
+        // https://wiki.eclipse.org/Jetty/Howto/Configure_SSL#Loading_Keys_and_Certificates_via_PKCS12
+        // Keystore created with:
+        // openssl genrsa -des3 -out honeycomb.key
+        // openssl req -new -x509 -key honeycomb.key -out honeycomb.crt
+        // openssl pkcs12 -inkey honeycomb.key -in honeycomb.crt -export -out honeycomb.pkcs12
+        // keytool -importkeystore -srckeystore honeycomb.pkcs12 -srcstoretype PKCS12 -destkeystore honeycomb-keystore
+        SslContextFactory sslContextFactory = new SslContextFactory();
+        URL keystoreURL = getClass().getResource(cfg.restconfKeystore.get());
+        sslContextFactory.setKeyStorePath(keystoreURL.getPath());
+        sslContextFactory.setKeyStorePassword(cfg.keystorePassword.get());
+        sslContextFactory.setKeyManagerPassword((cfg.keystoreManagerPassword.get()));
+        URL truststoreURL = getClass().getResource(cfg.restconfTruststore.get());
+        sslContextFactory.setTrustStorePath(truststoreURL.getPath());
+        sslContextFactory.setTrustStorePassword((cfg.truststorePassword.get()));
+        // TODO make this more configurable
+        sslContextFactory.setExcludeCipherSuites("SSL_RSA_WITH_DES_CBC_SHA", "SSL_DHE_RSA_WITH_DES_CBC_SHA",
+                "SSL_DHE_DSS_WITH_DES_CBC_SHA", "SSL_RSA_EXPORT_WITH_RC4_40_MD5", "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA",
+                "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA");
+
+        // SSL Connector
+        ServerConnector sslConnector =
+                new ServerConnector(server, cfg.httpsAcceptorsSize.get(), cfg.httpsSelectorsSize.get(),
+                        // The ssl connection factory delegates the real processing to http connection factory
+                        new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
+                        // That's why http connection factory is also required here
+                        // Order is IMPORTANT here
+                        new HttpConnectionFactory()
+                );
+        sslConnector.setHost(cfg.restconfHttpsBindingAddress.get());
+        sslConnector.setPort(cfg.restconfHttpsPort.get());
+        server.addConnector(sslConnector);
+        return sslConnector;
+    }
+}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/JettyServerProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/JettyServerProvider.groovy
deleted file mode 100644 (file)
index 14e6ae6..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License")
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.infra.distro.restconf
-
-import com.google.inject.Inject
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration
-import org.eclipse.jetty.security.ConstraintMapping
-import org.eclipse.jetty.security.ConstraintSecurityHandler
-import org.eclipse.jetty.security.HashLoginService
-import org.eclipse.jetty.security.authentication.BasicAuthenticator
-import org.eclipse.jetty.server.Server
-import org.eclipse.jetty.util.security.Constraint
-import org.eclipse.jetty.util.security.Password
-import org.eclipse.jetty.util.thread.QueuedThreadPool
-import org.eclipse.jetty.webapp.WebAppContext
-
-@Slf4j
-@ToString
-class JettyServerProvider extends ProviderTrait<Server> {
-
-    public static final String REALM = "HCRealm"
-
-    @Inject
-    HoneycombConfiguration cfg
-
-    def create() {
-        def server = new Server(new QueuedThreadPool(cfg.restPoolMaxSize.get(), cfg.restPoolMinSize.get()))
-
-        // Load Realm for basic auth
-        def service = new HashLoginService(REALM)
-        // Reusing the name as role
-        service.putUser(cfg.username, new Password(cfg.password), cfg.username)
-        server.addBean(service)
-
-        final URL resource = getClass().getResource("/")
-        WebAppContext webapp = new WebAppContext(resource.getPath(), cfg.restconfRootPath.get())
-
-        ConstraintSecurityHandler security = getBaseAuth(service, webapp)
-        server.setHandler(security)
-
-        return server
-    }
-
-    private ConstraintSecurityHandler getBaseAuth(HashLoginService service, WebAppContext webapp) {
-        ConstraintSecurityHandler security = new ConstraintSecurityHandler()
-
-        Constraint constraint = new Constraint()
-        constraint.setName("auth")
-        constraint.setAuthenticate(true)
-        constraint.setRoles(cfg.username)
-
-        ConstraintMapping mapping = new ConstraintMapping()
-        mapping.setPathSpec("/*")
-        mapping.setConstraint(constraint)
-
-        security.setConstraintMappings(Collections.singletonList(mapping))
-        security.setAuthenticator(new BasicAuthenticator())
-        security.setLoginService(service)
-
-        security.setHandler(webapp)
-        security
-    }
-}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/JettyServerProvider.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/JettyServerProvider.java
new file mode 100644 (file)
index 0000000..6d055bf
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.infra.distro.restconf;
+
+import com.google.inject.Inject;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration;
+import java.net.URL;
+import java.util.Collections;
+import org.eclipse.jetty.security.ConstraintMapping;
+import org.eclipse.jetty.security.ConstraintSecurityHandler;
+import org.eclipse.jetty.security.HashLoginService;
+import org.eclipse.jetty.security.authentication.BasicAuthenticator;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.util.security.Constraint;
+import org.eclipse.jetty.util.security.Password;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
+import org.eclipse.jetty.webapp.WebAppContext;
+
+public final class JettyServerProvider extends ProviderTrait<Server> {
+
+    public static final String REALM = "HCRealm";
+
+    @Inject
+    private HoneycombConfiguration cfg;
+
+    @Override
+    protected Server create() {
+        Server server = new Server(new QueuedThreadPool(cfg.restPoolMaxSize.get(), cfg.restPoolMinSize.get()));
+
+
+        // Load Realm for basic auth
+        HashLoginService service = new HashLoginService(REALM);
+        // Reusing the name as role
+        service.putUser(cfg.username, new Password(cfg.password), new String[]{cfg.username});
+        server.addBean(service);
+
+        final URL resource = getClass().getResource("/");
+        WebAppContext webapp = new WebAppContext(resource.getPath(), cfg.restconfRootPath.get());
+
+        ConstraintSecurityHandler security = getBaseAuth(service, webapp);
+        server.setHandler(security);
+
+        return server;
+    }
+
+    private ConstraintSecurityHandler getBaseAuth(HashLoginService service, WebAppContext webapp) {
+        ConstraintSecurityHandler security = new ConstraintSecurityHandler();
+
+        Constraint constraint = new Constraint();
+        constraint.setName("auth");
+        constraint.setAuthenticate(true);
+        constraint.setRoles(new String[]{cfg.username});
+
+        ConstraintMapping mapping = new ConstraintMapping();
+        mapping.setPathSpec("/*");
+        mapping.setConstraint(constraint);
+
+        security.setConstraintMappings(Collections.singletonList(mapping));
+        security.setAuthenticator(new BasicAuthenticator());
+        security.setLoginService(service);
+
+        security.setHandler(webapp);
+        return security;
+    }
+}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/RestconfModule.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/RestconfModule.groovy
deleted file mode 100644 (file)
index e8594a8..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.infra.distro.restconf
-
-import com.google.inject.AbstractModule
-import com.google.inject.Singleton
-import com.google.inject.name.Names
-import groovy.util.logging.Slf4j
-import org.eclipse.jetty.server.Server
-import org.eclipse.jetty.server.ServerConnector
-import org.opendaylight.netconf.sal.rest.api.RestConnector
-
-@Slf4j
-class RestconfModule extends AbstractModule {
-
-    public static final String RESTCONF_HTTP = "restconf-http"
-    public static final String RESTCONF_HTTPS = "restconf-https"
-
-    protected void configure() {
-        bind(Server).toProvider(JettyServerProvider).in(Singleton)
-        bind(ServerConnector).annotatedWith(Names.named(RESTCONF_HTTP)).toProvider(HttpConnectorProvider).in(Singleton)
-        bind(ServerConnector).annotatedWith(Names.named(RESTCONF_HTTPS)).toProvider(HttpsConnectorProvider).in(Singleton)
-        bind(RestConnector).toProvider(RestconfProvider).in(Singleton)
-    }
-}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/RestconfModule.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/RestconfModule.java
new file mode 100644 (file)
index 0000000..846ed1b
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.infra.distro.restconf;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Singleton;
+import com.google.inject.name.Names;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.opendaylight.netconf.sal.rest.api.RestConnector;
+
+
+public class RestconfModule extends AbstractModule {
+
+    public static final String RESTCONF_HTTP = "restconf-http";
+    public static final String RESTCONF_HTTPS = "restconf-https";
+
+    protected void configure() {
+        bind(Server.class).toProvider(JettyServerProvider.class).in(Singleton.class);
+        bind(ServerConnector.class).annotatedWith(Names.named(RESTCONF_HTTP)).toProvider(HttpConnectorProvider.class)
+                .in(Singleton.class);
+        bind(ServerConnector.class).annotatedWith(Names.named(RESTCONF_HTTPS)).toProvider(HttpsConnectorProvider.class)
+                .in(Singleton.class);
+        bind(RestConnector.class).toProvider(RestconfProvider.class).in(Singleton.class);
+    }
+}
@@ -1,7 +1,7 @@
 /*
  * Copyright (c) 2016 Cisco and/or its affiliates.
  *
- * Licensed under the Apache License, Version 2.0 (the "License")
+ * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at:
  *
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro.restconf
+package io.fd.honeycomb.infra.distro.restconf;
 
-import com.google.inject.Inject
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration
-import org.opendaylight.controller.sal.core.api.Broker
-import org.opendaylight.netconf.sal.rest.api.RestConnector
-import org.opendaylight.netconf.sal.restconf.impl.RestconfProviderImpl
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber
+import com.google.inject.Inject;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration;
+import org.opendaylight.controller.sal.core.api.Broker;
+import org.opendaylight.netconf.sal.rest.api.RestConnector;
+import org.opendaylight.netconf.sal.restconf.impl.RestconfProviderImpl;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
 
-@Slf4j
-@ToString
-class RestconfProvider extends ProviderTrait<RestConnector> {
 
-    @Inject
-    HoneycombConfiguration cfg
 
+public class RestconfProvider extends ProviderTrait<RestConnector> {
+
+    @Inject
+    private HoneycombConfiguration cfg;
     @Inject
-    Broker domBroker
+    private Broker domBroker;
 
-    def create() {
-        def instance = new RestconfProviderImpl()
-        instance.setWebsocketPort(new PortNumber(cfg.restconfWebsocketPort.get()))
-        domBroker.registerProvider(instance)
-        instance
+    @Override
+    protected RestconfProviderImpl create() {
+        RestconfProviderImpl instance = new RestconfProviderImpl();
+        instance.setWebsocketPort(new PortNumber(cfg.restconfWebsocketPort.get()));
+        domBroker.registerProvider(instance);
+        return instance;
     }
 }
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/ModuleInfoBackedCtxProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/ModuleInfoBackedCtxProvider.groovy
deleted file mode 100644 (file)
index a319bb8..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.infra.distro.schema
-
-import com.google.common.base.MoreObjects
-import com.google.inject.Inject
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext
-import org.opendaylight.yangtools.yang.binding.YangModelBindingProvider
-
-@Slf4j
-@ToString
-class ModuleInfoBackedCtxProvider extends ProviderTrait<ModuleInfoBackedContext> {
-
-    @Inject(optional = true)
-    Set<YangModelBindingProvider> moduleInfos = []
-
-    def create() {
-        def create = ModuleInfoBackedContext.create()
-        create.addModuleInfos(moduleInfos.collect {it.getModuleInfo()})
-        log.debug "ModuleInfoBackedContext created from {}", moduleInfos
-        create
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this)
-                .add("writerFactories", moduleInfos)
-                .toString();
-    }
-}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/ModuleInfoBackedCtxProvider.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/ModuleInfoBackedCtxProvider.java
new file mode 100644 (file)
index 0000000..f82cdd0
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.infra.distro.schema;
+
+import com.google.common.base.MoreObjects;
+import com.google.inject.Inject;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext;
+import org.opendaylight.yangtools.yang.binding.YangModelBindingProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class ModuleInfoBackedCtxProvider extends ProviderTrait<ModuleInfoBackedContext> {
+    private static final Logger LOG = LoggerFactory.getLogger(ModuleInfoBackedCtxProvider.class);
+
+    @Inject(optional = true)
+    private Set<YangModelBindingProvider> moduleInfos = new HashSet<>();
+
+    @Override
+    protected ModuleInfoBackedContext create() {
+        ModuleInfoBackedContext create = ModuleInfoBackedContext.create();
+        create.addModuleInfos(moduleInfos.stream()
+                .map(YangModelBindingProvider::getModuleInfo)
+                .collect(Collectors.toList()));
+        LOG.debug("ModuleInfoBackedContext created from {}", moduleInfos);
+        return create;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this).add("writerFactories", moduleInfos).toString();
+    }
+}
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.distro.schema
+package io.fd.honeycomb.infra.distro.schema;
 
-import com.google.inject.AbstractModule
-import com.google.inject.Singleton
-import groovy.util.logging.Slf4j
-import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec
-import org.opendaylight.controller.sal.core.api.model.SchemaService
-import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext
+import com.google.inject.AbstractModule;
+import com.google.inject.Singleton;
+import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec;
+import org.opendaylight.controller.sal.core.api.model.SchemaService;
+import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext;
 
-@Slf4j
-class SchemaModule extends AbstractModule {
+public class SchemaModule extends AbstractModule {
 
     protected void configure() {
-        bind(ModuleInfoBackedContext).toProvider(ModuleInfoBackedCtxProvider).in(Singleton)
-        bind(SchemaService).toProvider(SchemaServiceProvider).in(Singleton)
-        bind(BindingToNormalizedNodeCodec).toProvider(SerializerProvider).in(Singleton)
+        bind(ModuleInfoBackedContext.class).toProvider(ModuleInfoBackedCtxProvider.class).in(Singleton.class);
+        bind(SchemaService.class).toProvider(SchemaServiceProvider.class).in(Singleton.class);
+        bind(BindingToNormalizedNodeCodec.class).toProvider(SerializerProvider.class).in(Singleton.class);
     }
 
 }
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/SchemaServiceProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/SchemaServiceProvider.groovy
deleted file mode 100644 (file)
index c020d39..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.infra.distro.schema
-
-import com.google.inject.Inject
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import org.opendaylight.controller.sal.core.api.model.SchemaService
-import org.opendaylight.yangtools.concepts.ListenerRegistration
-import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext
-import org.opendaylight.yangtools.yang.model.api.Module
-import org.opendaylight.yangtools.yang.model.api.SchemaContext
-import org.opendaylight.yangtools.yang.model.api.SchemaContextListener
-
-@Slf4j
-@ToString
-class SchemaServiceProvider extends ProviderTrait<SchemaService> {
-
-    @Inject
-    ModuleInfoBackedContext mibCtx;
-
-    def create() { new StaticSchemaService(mibCtx.getSchemaContext()) }
-
-    /**
-     * Static schema context provider service.
-     */
-    static class StaticSchemaService implements SchemaService {
-
-        private final SchemaContext schemaContext
-
-        StaticSchemaService(SchemaContext schemaContext) {
-            this.schemaContext = schemaContext
-        }
-
-        @Override
-        void addModule(final Module module) {
-            throw new UnsupportedOperationException("Static service")
-        }
-
-        @Override
-        void removeModule(final Module module) {
-            throw new UnsupportedOperationException("Static service")
-        }
-
-        @Override
-        SchemaContext getSessionContext() {
-            schemaContext
-        }
-
-        @Override
-        SchemaContext getGlobalContext() {
-            schemaContext
-        }
-
-        @Override
-        ListenerRegistration<SchemaContextListener> registerSchemaContextListener(final SchemaContextListener listener) {
-            listener.onGlobalContextUpdated schemaContext
-            return new ListenerRegistration<SchemaContextListener>() {
-                void close() {}
-                SchemaContextListener getInstance() { listener }
-            }
-        }
-    }
-}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/SchemaServiceProvider.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/SchemaServiceProvider.java
new file mode 100644 (file)
index 0000000..eb3552c
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.infra.distro.schema;
+
+import com.google.inject.Inject;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import org.opendaylight.controller.sal.core.api.model.SchemaService;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext;
+import org.opendaylight.yangtools.yang.model.api.Module;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.api.SchemaContextListener;
+
+public final class SchemaServiceProvider extends ProviderTrait<SchemaService> {
+
+    @Inject
+    private ModuleInfoBackedContext mibCtx;
+
+    public StaticSchemaService create() {
+        return new StaticSchemaService(mibCtx.getSchemaContext());
+    }
+
+    /**
+     * Static schema context provider service.
+     */
+    private static final class StaticSchemaService implements SchemaService {
+        private final SchemaContext schemaContext;
+
+        StaticSchemaService(SchemaContext schemaContext) {
+            this.schemaContext = schemaContext;
+        }
+
+        @Override
+        public void addModule(final Module module) {
+            throw new UnsupportedOperationException("Static service");
+        }
+
+        @Override
+        public void removeModule(final Module module) {
+            throw new UnsupportedOperationException("Static service");
+        }
+
+        @Override
+        public SchemaContext getSessionContext() {
+            return schemaContext;
+        }
+
+        @Override
+        public SchemaContext getGlobalContext() {
+            return schemaContext;
+        }
+
+        @Override
+        public ListenerRegistration<SchemaContextListener> registerSchemaContextListener(
+                final SchemaContextListener listener) {
+            listener.onGlobalContextUpdated(schemaContext);
+            return new ListenerRegistration<SchemaContextListener>() {
+                public void close() {}
+
+                public SchemaContextListener getInstance() {
+                    return listener;
+                }
+
+            };
+        }
+    }
+}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/SerializerProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/SerializerProvider.groovy
deleted file mode 100644 (file)
index 01ea006..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.infra.distro.schema
-
-import com.google.inject.Inject
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import javassist.ClassPool
-import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec
-import org.opendaylight.yangtools.binding.data.codec.gen.impl.StreamWriterGenerator
-import org.opendaylight.yangtools.binding.data.codec.impl.BindingNormalizedNodeCodecRegistry
-import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext
-import org.opendaylight.yangtools.sal.binding.generator.util.BindingRuntimeContext
-import org.opendaylight.yangtools.sal.binding.generator.util.JavassistUtils
-
-@Slf4j
-@ToString
-class SerializerProvider extends ProviderTrait<BindingToNormalizedNodeCodec> {
-
-    @Inject
-    ModuleInfoBackedContext mibCtx;
-
-    def create() {
-        def serializerGenerator = new StreamWriterGenerator(JavassistUtils.forClassPool(ClassPool.getDefault()))
-        def codecRegistry = new BindingNormalizedNodeCodecRegistry(serializerGenerator)
-        def ctx = BindingRuntimeContext.create(mibCtx, mibCtx.getSchemaContext())
-        codecRegistry.onBindingRuntimeContextUpdated(ctx)
-        def codec = new BindingToNormalizedNodeCodec(mibCtx, codecRegistry)
-        codec.onGlobalContextUpdated(mibCtx.getSchemaContext())
-        codec
-    }
-}
\ No newline at end of file
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/SerializerProvider.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/SerializerProvider.java
new file mode 100644 (file)
index 0000000..e61b884
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.infra.distro.schema;
+
+import com.google.inject.Inject;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import javassist.ClassPool;
+import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec;
+import org.opendaylight.yangtools.binding.data.codec.gen.impl.StreamWriterGenerator;
+import org.opendaylight.yangtools.binding.data.codec.impl.BindingNormalizedNodeCodecRegistry;
+import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext;
+import org.opendaylight.yangtools.sal.binding.generator.util.BindingRuntimeContext;
+import org.opendaylight.yangtools.sal.binding.generator.util.JavassistUtils;
+
+public class SerializerProvider extends ProviderTrait<BindingToNormalizedNodeCodec> {
+
+    @Inject
+    private ModuleInfoBackedContext mibCtx;
+
+    @Override
+    protected BindingToNormalizedNodeCodec create() {
+        StreamWriterGenerator serializerGenerator =
+                new StreamWriterGenerator(JavassistUtils.forClassPool(ClassPool.getDefault()));
+        BindingNormalizedNodeCodecRegistry codecRegistry = new BindingNormalizedNodeCodecRegistry(serializerGenerator);
+        BindingRuntimeContext ctx = BindingRuntimeContext.create(mibCtx, mibCtx.getSchemaContext());
+        codecRegistry.onBindingRuntimeContextUpdated(ctx);
+        BindingToNormalizedNodeCodec codec = new BindingToNormalizedNodeCodec(mibCtx, codecRegistry);
+        codec.onGlobalContextUpdated(mibCtx.getSchemaContext());
+        return codec;
+    }
+}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/YangBindingProviderModule.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/YangBindingProviderModule.groovy
deleted file mode 100644 (file)
index d8c4e39..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.infra.distro.schema
-
-import com.google.common.base.Charsets
-import com.google.inject.AbstractModule
-import com.google.inject.Singleton
-import com.google.inject.multibindings.Multibinder
-import groovy.util.logging.Slf4j
-import org.opendaylight.yangtools.yang.binding.YangModelBindingProvider
-
-/**
- * Load all YangModelBindingProvider classes from classpath.
- * <p/>
- * Relying on /META-INF/services/ metadata.
- */
-@Slf4j
-class YangBindingProviderModule extends AbstractModule {
-
-    static final String YANG_BA_PROVIDER_PATH = "META-INF/services/" + YangModelBindingProvider.class.getName();
-
-    void configure() {
-        Multibinder.newSetBinder(binder(), YangModelBindingProvider.class).with {
-            def resources = Collections.list(getClass().getClassLoader().getResources(YANG_BA_PROVIDER_PATH))
-            log.debug "ModuleProviders found at {}", resources
-            resources.forEach {
-                it.getText(Charsets.UTF_8.displayName()).split("\n")
-                        .findAll { it != null && !it.isEmpty() && !it.isAllWhitespace()}
-                        .collect { this.getClass().forName(it) }
-                        .forEach {
-                    log.debug "ModuleProvider found for {}", it
-                    addBinding().to(it).in(Singleton)
-                }
-            }
-        }
-    }
-}
diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/YangBindingProviderModule.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/YangBindingProviderModule.java
new file mode 100644 (file)
index 0000000..4348333
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.infra.distro.schema;
+
+import com.google.common.base.Charsets;
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import com.google.common.io.Resources;
+import com.google.inject.AbstractModule;
+import com.google.inject.Singleton;
+import com.google.inject.multibindings.Multibinder;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Collections;
+import java.util.List;
+import javax.annotation.Nonnull;
+import org.opendaylight.yangtools.yang.binding.YangModelBindingProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Load all YangModelBindingProvider classes from classpath.
+ * <p/>
+ * Relying on /META-INF/services/ metadata.
+ */
+public class YangBindingProviderModule extends AbstractModule {
+    private static final Logger LOG = LoggerFactory.getLogger(YangBindingProviderModule.class);
+
+    private static final String YANG_BA_PROVIDER_PATH = "META-INF/services/" + YangModelBindingProvider.class.getName();
+
+    protected void configure() {
+        final Multibinder<YangModelBindingProvider> binder =
+                Multibinder.newSetBinder(binder(), YangModelBindingProvider.class);
+        final List<URL> resources;
+        try {
+            resources = Collections.list(getClass().getClassLoader().getResources(YANG_BA_PROVIDER_PATH));
+        } catch (IOException e) {
+            throw new IllegalStateException("Unable to load binding providers from path: " + YANG_BA_PROVIDER_PATH, e);
+        }
+        LOG.debug("ModuleProviders found at {}", resources);
+        resources.stream()
+                .map(YangBindingProviderModule::urlToString)
+                .flatMap(content -> Lists.newArrayList(content.split("\n")).stream())
+                .filter(line -> !Strings.isNullOrEmpty(line.trim()))
+                .map(YangBindingProviderModule::loadClass)
+                .forEach(providerClass -> {
+                    LOG.debug("ModuleProvider found for {}", providerClass);
+                    binder.addBinding().to((Class<? extends YangModelBindingProvider>) providerClass)
+                            .in(Singleton.class);
+                });
+    }
+
+    private static Class<?> loadClass(@Nonnull final String className) {
+        try {
+            return Class.forName(className);
+        } catch (ClassNotFoundException e) {
+            throw new IllegalArgumentException("Unable to load class: " + className, e);
+        }
+    }
+
+    private static String urlToString(@Nonnull final URL url) {
+        try {
+            return Resources.toString(url, Charsets.UTF_8);
+        } catch (IOException e) {
+            throw new IllegalArgumentException("Unable to read resource from: " + url, e);
+        }
+    }
+}
index e80f0eb..ad0a1be 100644 (file)
     <plugins>
       <plugin>
         <artifactId>maven-compiler-plugin</artifactId>
-        <!-- 2.8.0-01 and later require maven-compiler-plugin 3.1 or higher -->
-        <configuration>
-          <compilerId>groovy-eclipse-compiler</compilerId>
-        </configuration>
-        <dependencies>
-          <dependency>
-            <groupId>org.codehaus.groovy</groupId>
-            <artifactId>groovy-eclipse-compiler</artifactId>
-            <version>2.9.2-01</version>
-          </dependency>
-          <!-- for 2.8.0-01 and later you must have an explicit dependency on groovy-eclipse-batch -->
-          <dependency>
-            <groupId>org.codehaus.groovy</groupId>
-            <artifactId>groovy-eclipse-batch</artifactId>
-            <version>2.4.3-01</version>
-          </dependency>
-        </dependencies>
       </plugin>
       <plugin>
         <groupId>org.codehaus.gmaven</groupId>
  * limitations under the License.
  */
 
-package io.fd.honeycomb.vpp.distro
+package io.fd.honeycomb.vpp.distro;
 
-import com.google.inject.Inject
-import com.google.inject.name.Named
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import io.fd.honeycomb.infra.distro.data.context.ContextPipelineModule
-import io.fd.honeycomb.translate.read.ReaderFactory
-import org.opendaylight.controller.md.sal.binding.api.DataBroker
-import io.fd.honeycomb.vpp.context.ContextsReaderFactory
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import io.fd.honeycomb.infra.distro.data.context.ContextPipelineModule;
+import io.fd.honeycomb.translate.read.ReaderFactory;
+import io.fd.honeycomb.vpp.context.ContextsReaderFactory;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 
 /**
  * Mirror of org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.context.impl.rev141210.ContextReaderModule
  */
-@Slf4j
-@ToString
-class ContextsReaderFactoryProvider extends ProviderTrait<ReaderFactory> {
+public final class ContextsReaderFactoryProvider extends ProviderTrait<ReaderFactory> {
 
     @Inject
     @Named(ContextPipelineModule.HONEYCOMB_CONTEXT)
-    DataBroker contextDataBroker
+    private DataBroker contextDataBroker;
 
-    def create() { new ContextsReaderFactory(contextDataBroker) }
+    @Override
+    protected ContextsReaderFactory create() {
+        return new ContextsReaderFactory(contextDataBroker);
+    }
 }
diff --git a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/JVppCoreProvider.groovy b/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/JVppCoreProvider.groovy
deleted file mode 100644 (file)
index 1d4fd1a..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.vpp.distro
-
-import com.google.inject.Inject
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import org.openvpp.jvpp.JVppRegistry
-import org.openvpp.jvpp.core.JVppCoreImpl
-import org.openvpp.jvpp.core.future.FutureJVppCore
-import org.openvpp.jvpp.core.future.FutureJVppCoreFacade
-
-/**
- * Provides future API for jvpp-core plugin. Must be a singleton due to shutdown hook usage.
- * Registers shutdown hook to free plugin's resources on shutdown.
- */
-@Slf4j
-@ToString
-class JVppCoreProvider extends ProviderTrait<FutureJVppCore> {
-
-    @Inject
-    JVppRegistry registry
-
-    def create() {
-        try {
-            def jVpp = new JVppCoreImpl()
-            // Free jvpp-core plugin's resources on shutdown
-            Runtime.addShutdownHook {
-                log.info("Unloading jvpp-core plugin")
-                jVpp.close()
-                log.info("Successfully unloaded jvpp-core plugin")
-            }
-            log.info("Successfully loaded jvpp-core plugin")
-            new FutureJVppCoreFacade(registry, jVpp)
-        } catch (IOException e) {
-            throw new IllegalStateException("Unable to open VPP management connection", e)
-        }
-    }
-}
diff --git a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/JVppCoreProvider.java b/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/JVppCoreProvider.java
new file mode 100644 (file)
index 0000000..41f7b13
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.vpp.distro;
+
+import com.google.inject.Inject;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import java.io.IOException;
+import org.openvpp.jvpp.JVppRegistry;
+import org.openvpp.jvpp.core.JVppCoreImpl;
+import org.openvpp.jvpp.core.future.FutureJVppCore;
+import org.openvpp.jvpp.core.future.FutureJVppCoreFacade;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Provides future API for jvpp-core plugin. Must be a singleton due to shutdown hook usage. Registers shutdown hook to
+ * free plugin's resources on shutdown.
+ */
+public final class JVppCoreProvider extends ProviderTrait<FutureJVppCore> {
+
+    private static final Logger LOG = LoggerFactory.getLogger(JVppCoreProvider.class);
+
+    @Inject
+    private JVppRegistry registry;
+
+    @Override
+    protected FutureJVppCoreFacade create() {
+        try {
+            final JVppCoreImpl jVpp = new JVppCoreImpl();
+            // Free jvpp-core plugin's resources on shutdown
+            Runtime.getRuntime().addShutdownHook(new Thread() {
+
+                @Override
+                public void run() {
+                    LOG.info("Unloading jvpp-core plugin");
+                    jVpp.close();
+                    LOG.info("Successfully unloaded jvpp-core plugin");
+                }
+            });
+
+            LOG.info("Successfully loaded jvpp-core plugin");
+            return new FutureJVppCoreFacade(registry, jVpp);
+        } catch (IOException e) {
+            throw new IllegalStateException("Unable to open VPP management connection", e);
+        }
+    }
+}
diff --git a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/JVppRegistryProvider.groovy b/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/JVppRegistryProvider.groovy
deleted file mode 100644 (file)
index 125f766..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.vpp.distro
-
-import com.google.inject.Inject
-import groovy.transform.ToString
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.infra.distro.ProviderTrait
-import org.openvpp.jvpp.JVppRegistry
-import org.openvpp.jvpp.JVppRegistryImpl
-
-/**
- * Provides JVppRegistry. Must be a singleton due to shutdown hook usage.
- * Registers shutdown hook to disconnect from VPP.
- */
-@Slf4j
-@ToString
-class JVppRegistryProvider extends ProviderTrait<JVppRegistry> {
-
-    @Inject
-    VppConfigAttributes config
-
-    def create() {
-        try {
-            def registry = new JVppRegistryImpl(config.jvppConnectionName);
-
-            // Closing JVpp connection with shutdown hook to erase the connection from VPP so HC will be able
-            // to connect next time. If JVM is force closed, this will not be executed and VPP connection
-            // with name from config will stay open and prevent next startup of HC to success
-            Runtime.addShutdownHook {
-                log.info("Disconnecting from VPP")
-                registry.close()
-                log.info("Successfully disconnected from VPP as {}", config.jvppConnectionName)
-            }
-            log.info("JVpp connection opened successfully as: {}", config.jvppConnectionName)
-            registry
-        } catch (IOException e) {
-            throw new IllegalStateException("Unable to open VPP management connection", e)
-        }
-    }
-}
diff --git a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/JVppRegistryProvider.java b/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/JVppRegistryProvider.java
new file mode 100644 (file)
index 0000000..8605fa0
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.vpp.distro;
+
+import com.google.inject.Inject;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import java.io.IOException;
+import org.openvpp.jvpp.JVppRegistry;
+import org.openvpp.jvpp.JVppRegistryImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Provides JVppRegistry. Must be a singleton due to shutdown hook usage. Registers shutdown hook to disconnect from
+ * VPP.
+ */
+public final class JVppRegistryProvider extends ProviderTrait<JVppRegistry> {
+
+    private static final Logger LOG = LoggerFactory.getLogger(JVppRegistryProvider.class);
+
+    @Inject
+    private VppConfigAttributes config;
+
+    @Override
+    protected JVppRegistryImpl create() {
+        try {
+            final JVppRegistryImpl registry = new JVppRegistryImpl(config.jvppConnectionName);
+
+            // Closing JVpp connection with shutdown hook to erase the connection from VPP so HC will be able
+            // to connect next time. If JVM is force closed, this will not be executed and VPP connection
+            // with name from config will stay open and prevent next startup of HC to success
+            Runtime.getRuntime().addShutdownHook(new Thread() {
+                @Override
+                public void run() {
+                    LOG.info("Disconnecting from VPP");
+                    try {
+                        registry.close();
+                        LOG.info("Successfully disconnected from VPP as {}", config.jvppConnectionName);
+                    } catch (Exception e) {
+                        LOG.warn("Unable to properly close jvpp registry", e);
+                    }
+                }
+            });
+
+            LOG.info("JVpp connection opened successfully as: {}", config.jvppConnectionName);
+            return registry;
+        } catch (IOException e) {
+            throw new IllegalStateException("Unable to open VPP management connection", e);
+        }
+    }
+}
diff --git a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/VppCommonModule.groovy b/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/VppCommonModule.groovy
deleted file mode 100644 (file)
index cd5816f..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.vpp.distro
-
-import com.google.inject.AbstractModule
-import com.google.inject.Singleton
-import com.google.inject.multibindings.Multibinder
-import groovy.util.logging.Slf4j
-import io.fd.honeycomb.translate.read.ReaderFactory
-import net.jmob.guice.conf.core.ConfigurationModule
-import org.openvpp.jvpp.JVppRegistry
-import org.openvpp.jvpp.core.future.FutureJVppCore
-
-@Slf4j
-public final class VppCommonModule extends AbstractModule {
-
-    protected void configure() {
-        install(ConfigurationModule.create())
-        // Inject non-dependency configuration
-        requestInjection(VppConfigAttributes)
-
-        bind(JVppRegistry).toProvider(JVppRegistryProvider).in(Singleton)
-        bind(FutureJVppCore).toProvider(JVppCoreProvider).in(Singleton)
-
-        // Naming contexts reader exposing context storage over REST/HONEYCOMB_NETCONF
-        Multibinder.newSetBinder(binder(), ReaderFactory.class).with {
-            addBinding().toProvider(ContextsReaderFactoryProvider).in(Singleton)
-        }
-    }
-}
diff --git a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/VppCommonModule.java b/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/VppCommonModule.java
new file mode 100644 (file)
index 0000000..8735235
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.vpp.distro;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Singleton;
+import com.google.inject.multibindings.Multibinder;
+import io.fd.honeycomb.translate.read.ReaderFactory;
+import net.jmob.guice.conf.core.ConfigurationModule;
+import org.openvpp.jvpp.JVppRegistry;
+import org.openvpp.jvpp.core.future.FutureJVppCore;
+
+public final class VppCommonModule extends AbstractModule {
+    protected void configure() {
+
+        install(ConfigurationModule.create());
+        // Inject non-dependency configuration
+        requestInjection(VppConfigAttributes.class);
+
+        bind(JVppRegistry.class).toProvider(JVppRegistryProvider.class).in(Singleton.class);
+        bind(FutureJVppCore.class).toProvider(JVppCoreProvider.class).in(Singleton.class);
+
+        // Naming contexts reader exposing context storage over REST/HONEYCOMB_NETCONF
+        final Multibinder<ReaderFactory> readerBinder = Multibinder.newSetBinder(binder(), ReaderFactory.class);
+        readerBinder.addBinding().toProvider(ContextsReaderFactoryProvider.class).in(Singleton.class);
+    }
+
+}
  * limitations under the License.
  */
 
-package io.fd.honeycomb.vpp.distro
+package io.fd.honeycomb.vpp.distro;
 
-import groovy.transform.ToString
-import net.jmob.guice.conf.core.BindConfig
-import net.jmob.guice.conf.core.InjectConfig
-import net.jmob.guice.conf.core.Syntax
+import net.jmob.guice.conf.core.BindConfig;
+import net.jmob.guice.conf.core.InjectConfig;
+import net.jmob.guice.conf.core.Syntax;
 
-@ToString(includeNames = true)
 @BindConfig(value = "jvpp", syntax = Syntax.JSON)
-class VppConfigAttributes {
+public class VppConfigAttributes {
 
     @InjectConfig("jvpp-connection-name")
-    String jvppConnectionName
-
+    public String jvppConnectionName;
 }