Turned netconf providers into an app and made NetconfDeviceProvider register its configs with ComponentConfigService.
More cleanup needs to be done to avoid log messages with "+" and some other stylistic issues.

Change-Id: Ic1be1ce6d3340f5a6284ba5514d0052e01bdaaed
diff --git a/features/features.xml b/features/features.xml
index 7d23fb5..594dc69 100644
--- a/features/features.xml
+++ b/features/features.xml
@@ -130,10 +130,4 @@
         <bundle>mvn:org.onosproject/onos-core-trivial/@ONOS-VERSION</bundle>
     </feature>
     
-    <feature name="onos-netconf" version="@FEATURE-VERSION"
-             description="ONOS Netconf providers">
-        <feature>onos-api</feature>        
-        <bundle>mvn:org.onosproject/onos-netconf-provider-device/@ONOS-VERSION</bundle>        
-    </feature>
-
 </features>
diff --git a/providers/netconf/app/app.xml b/providers/netconf/app/app.xml
new file mode 100644
index 0000000..f2d4762
--- /dev/null
+++ b/providers/netconf/app/app.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2015 Open Networking Laboratory
+  ~
+  ~ 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.
+  -->
+<app name="org.onosproject.netconf" origin="ON.Lab" version="${project.version}"
+     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
+     features="${project.artifactId}">
+    <description>${project.description}</description>
+
+    <artifact>mvn:${project.groupId}/onos-netconf-provider-device/${project.version}</artifact>
+    <!-- Question: should there be the jnc stuff here? Or is it just for testing -->
+</app>
diff --git a/providers/netconf/app/features.xml b/providers/netconf/app/features.xml
new file mode 100644
index 0000000..6a3d1a2
--- /dev/null
+++ b/providers/netconf/app/features.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+  ~ Copyright 2015 Open Networking Laboratory                                
+  ~                                                                          
+  ~ 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.
+  -->
+<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
+    <repository>mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features</repository>
+    <feature name="${project.artifactId}" version="${project.version}"
+             description="${project.description}">
+        <feature>onos-api</feature>
+        <bundle>mvn:io.netty/netty/3.9.2.Final</bundle>
+        <bundle>mvn:${project.groupId}/onos-netconf-provider-device/${project.version}</bundle>
+        <!-- Question: should there be the jnc stuff here? Or is it just for testing -->
+    </feature>
+</features>
+
diff --git a/providers/netconf/app/pom.xml b/providers/netconf/app/pom.xml
new file mode 100644
index 0000000..cd307b2
--- /dev/null
+++ b/providers/netconf/app/pom.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2015 Open Networking Laboratory
+  ~
+  ~ 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.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.onosproject</groupId>
+        <artifactId>onos-netconf-providers</artifactId>
+        <version>1.2.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>onos-netconf</artifactId>
+    <packaging>pom</packaging>
+
+    <description>NetConf protocol southbound providers</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-netconf-provider-device</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <!-- TODO: add other dependencies here as more bundles are added to the app -->
+    </dependencies>
+
+</project>
diff --git a/providers/netconf/device/pom.xml b/providers/netconf/device/pom.xml
index 192d8e3..0ebe079 100644
--- a/providers/netconf/device/pom.xml
+++ b/providers/netconf/device/pom.xml
@@ -14,134 +14,138 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
  -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-        <modelVersion>4.0.0</modelVersion>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
 
-        <parent>
+    <parent>
+        <groupId>org.onosproject</groupId>
+        <artifactId>onos-netconf-providers</artifactId>
+        <version>1.2.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>onos-netconf-provider-device</artifactId>
+    <packaging>bundle</packaging>
+
+    <description>ONOS Netconf protocol device provider</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>ch.ethz.ganymed</groupId>
+            <artifactId>ganymed-ssh2</artifactId>
+            <version>262</version>
+        </dependency>
+        <dependency>
+            <!-- TODO: change this appropriately when the official TailF JNC is available -->
             <groupId>org.onosproject</groupId>
-            <artifactId>onos-netconf-providers</artifactId>
-            <version>1.2.0-SNAPSHOT</version>
-            <relativePath>../pom.xml</relativePath>
-        </parent>
+            <artifactId>jnc</artifactId>
+            <version>1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jdom</groupId>
+            <artifactId>jdom2</artifactId>
+            <version>2.0.5</version>
+        </dependency>
+        <dependency>
+            <groupId>jaxen</groupId>
+            <artifactId>jaxen</artifactId>
+            <version>1.1.4</version>
+            <optional>true</optional>
+        </dependency>
+    </dependencies>
 
-        <artifactId>onos-netconf-provider-device</artifactId>
-        <packaging>bundle</packaging>
-
-        <description>ONOS Netconf protocol device provider</description>
-        <build>
-           <plugins>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-shade-plugin</artifactId>
-                    <version>2.3</version>
-                    <configuration>
-                        <filters>
-                            <filter>
-                                <artifact>com.tailf:JNC</artifact>
-                                <includes>
-                                    <include>com/tailf/jnc/**</include>
-                                </includes>
-                            </filter>
-                            <filter>
-                                <artifact>ch.ethz.ganymed:ganymed-ssh2</artifact>
-                                <includes>
-                                    <include>ch/ethz/ssh2/**</include>
-                                </includes>
-                            </filter>
-                            <filter>
-                                <artifact>org.jdom:jdom2</artifact>
-                                <includes>
-                                    <include>org/jdom2/**</include>
-                                </includes>
-                            </filter>
-                        </filters>
-                    </configuration>
-                    <executions>
-                        <execution>
-                            <phase>package</phase>
-                            <goals>
-                                <goal>shade</goal>
-                            </goals>
-                        </execution>
-                    </executions>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.felix</groupId>
-                    <artifactId>maven-scr-plugin</artifactId>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.felix</groupId>
-                    <artifactId>maven-bundle-plugin</artifactId>
-                    <configuration>
-                        <instructions>
-                            <Export-Package>
-                                com.tailf.jnc,
-                                ch.ethz.ssh2,
-                                ch.ethz.ssh2.auth,
-                                ch.ethz.ssh2.channel,
-                                ch.ethz.ssh2.crypto,
-                                ch.ethz.ssh2.crypto.cipher,
-                                ch.ethz.ssh2.crypto.dh,
-                                ch.ethz.ssh2.crypto.digest,
-                                ch.ethz.ssh2.log,
-                                ch.ethz.ssh2.packets,
-                                ch.ethz.ssh2.server,
-                                ch.ethz.ssh2.sftp,
-                                ch.ethz.ssh2.signature,
-                                ch.ethz.ssh2.transport,
-                                ch.ethz.ssh2.util,
-                                org.jdom2,
-                                org.jdom2.input,
-                                org.jdom2.output,
-                                org.jdom2.adapters,
-                                org.jdom2.filter,
-                                org.jdom2.internal,
-                                org.jdom2.located,
-                                org.jdom2.transform,
-                                org.jdom2.util,
-                                org.jdom2.xpath,
-                                org.jdom2.input.sax,
-                                org.jdom2.input.stax,
-                                org.jdom2.output.support,
-                                org.jdom2.xpath.jaxen,
-                                org.jdom2.xpath.util
-                            </Export-Package>
-                        </instructions>
-                    </configuration>
-                </plugin>
-                <plugin>
-                    <groupId>org.onosproject</groupId>
-                    <artifactId>onos-maven-plugin</artifactId>
-                </plugin>
-            </plugins>
-        </build>
-        <dependencies>
-            <dependency>
-                <groupId>org.osgi</groupId>
-                <artifactId>org.osgi.compendium</artifactId>
-            </dependency>
-            <dependency>
-                <groupId>ch.ethz.ganymed</groupId>
-                <artifactId>ganymed-ssh2</artifactId>
-                <version>262</version>
-            </dependency>
-            <dependency>
-                <!-- TODO: change this appropriately when the official TailF JNC is available -->
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <version>2.3</version>
+                <configuration>
+                    <filters>
+                        <filter>
+                            <artifact>com.tailf:JNC</artifact>
+                            <includes>
+                                <include>com/tailf/jnc/**</include>
+                            </includes>
+                        </filter>
+                        <filter>
+                            <artifact>ch.ethz.ganymed:ganymed-ssh2</artifact>
+                            <includes>
+                                <include>ch/ethz/ssh2/**</include>
+                            </includes>
+                        </filter>
+                        <filter>
+                            <artifact>org.jdom:jdom2</artifact>
+                            <includes>
+                                <include>org/jdom2/**</include>
+                            </includes>
+                        </filter>
+                    </filters>
+                </configuration>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>shade</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-scr-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Export-Package>
+                            com.tailf.jnc,
+                            ch.ethz.ssh2,
+                            ch.ethz.ssh2.auth,
+                            ch.ethz.ssh2.channel,
+                            ch.ethz.ssh2.crypto,
+                            ch.ethz.ssh2.crypto.cipher,
+                            ch.ethz.ssh2.crypto.dh,
+                            ch.ethz.ssh2.crypto.digest,
+                            ch.ethz.ssh2.log,
+                            ch.ethz.ssh2.packets,
+                            ch.ethz.ssh2.server,
+                            ch.ethz.ssh2.sftp,
+                            ch.ethz.ssh2.signature,
+                            ch.ethz.ssh2.transport,
+                            ch.ethz.ssh2.util,
+                            org.jdom2,
+                            org.jdom2.input,
+                            org.jdom2.output,
+                            org.jdom2.adapters,
+                            org.jdom2.filter,
+                            org.jdom2.internal,
+                            org.jdom2.located,
+                            org.jdom2.transform,
+                            org.jdom2.util,
+                            org.jdom2.xpath,
+                            org.jdom2.input.sax,
+                            org.jdom2.input.stax,
+                            org.jdom2.output.support,
+                            org.jdom2.xpath.jaxen,
+                            org.jdom2.xpath.util
+                        </Export-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+            <plugin>
                 <groupId>org.onosproject</groupId>
-                <artifactId>jnc</artifactId>
-                <version>1.0</version>
-            </dependency>
-            <dependency>
-                <groupId>org.jdom</groupId>
-                <artifactId>jdom2</artifactId>
-                <version>2.0.5</version>
-            </dependency>
-            <dependency>
-                <groupId>jaxen</groupId>
-                <artifactId>jaxen</artifactId>
-                <version>1.1.4</version>
-                <optional>true</optional>
-            </dependency>
-        </dependencies>
+                <artifactId>onos-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
 </project>
diff --git a/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java b/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java
index 9336adb..5fb6ead 100644
--- a/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java
+++ b/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java
@@ -39,6 +39,7 @@
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.onlab.packet.ChassisId;
+import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
@@ -78,9 +79,11 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected ClusterService clusterService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected ComponentConfigService cfgService;
+
     private ExecutorService deviceBuilder = Executors
-            .newFixedThreadPool(1,
-                                groupedThreads("onos/netconf", "device-creator"));
+            .newFixedThreadPool(1, groupedThreads("onos/netconf", "device-creator"));
 
     // Delay between events in ms.
     private static final int EVENTINTERVAL = 5;
@@ -90,7 +93,7 @@
     @Property(name = "devConfigs", value = "", label = "Instance-specific configurations")
     private String devConfigs = null;
 
-    @Property(name = "devPasswords", value = "", label = "Instace-specific password")
+    @Property(name = "devPasswords", value = "", label = "Instance-specific password")
     private String devPasswords = null;
 
     /**
@@ -102,13 +105,15 @@
 
     @Activate
     public void activate(ComponentContext context) {
-        log.info("Netconf Device Provider Started");
+        cfgService.registerProperties(getClass());
         providerService = providerRegistry.register(this);
         modified(context);
+        log.info("Started");
     }
 
     @Deactivate
     public void deactivate(ComponentContext context) {
+        cfgService.unregisterProperties(getClass(), false);
         try {
             for (Entry<DeviceId, NetconfDevice> deviceEntry : netconfDeviceMap
                     .entrySet()) {
@@ -134,13 +139,9 @@
         }
         Dictionary<?, ?> properties = context.getProperties();
         String deviceCfgValue = get(properties, "devConfigs");
-        log.info("Getting Device configuration from cfg file: "
-                + deviceCfgValue);
+        log.info("Settings: devConfigs={}", deviceCfgValue);
         if (!isNullOrEmpty(deviceCfgValue)) {
             addOrRemoveDevicesConfig(deviceCfgValue);
-        } else {
-            log.info("Device Configuration value receiviced from the property 'devConfigs': "
-                    + deviceCfgValue + ", is not valid");
         }
     }
 
@@ -148,11 +149,9 @@
         for (String deviceEntry : deviceConfig.split(",")) {
             NetconfDevice device = processDeviceEntry(deviceEntry);
             if (device != null) {
-                log.info("Device Detail: " + "username: "
-                        + device.getUsername() + ", host: "
-                        + device.getSshHost() + ", port: "
-                        + device.getSshPort() + " device state: "
-                        + device.getDeviceState().name());
+                log.info("Device Detail: username: {}, host={}, port={}, state={}",
+                        device.getUsername(), device.getSshHost(),
+                         device.getSshPort(), device.getDeviceState().name());
                 if (device.isActive()) {
                     deviceBuilder.submit(new DeviceCreator(device, true));
                 } else {
diff --git a/providers/netconf/pom.xml b/providers/netconf/pom.xml
index b351d46..511fe04 100644
--- a/providers/netconf/pom.xml
+++ b/providers/netconf/pom.xml
@@ -33,6 +33,7 @@
 
     <modules>
         <module>device</module>
+        <module>app</module>
     </modules>
 
     <dependencies>