Implementing net config subsystem and revising its interfaces.

Added a few basic configs for device, host and links.

Added initial REST API.

Added CLI.

Tests remain to be added.

Change-Id: Ic7bba4b5ad7d553c51d69f6459b3bff146970323
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/config/ConfigFactory.java b/incubator/api/src/main/java/org/onosproject/incubator/net/config/ConfigFactory.java
index 37b51fd..673c7f3 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/config/ConfigFactory.java
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/config/ConfigFactory.java
@@ -21,24 +21,31 @@
 /**
  * Base abstract factory for creating configurations for the specified subject type.
  *
- * @param <S> subject class
+ * @param <S> type of subject
+ * @param <C> type of configuration
  */
 @Beta
-public abstract class ConfigFactory<S> {
+public abstract class ConfigFactory<S, C extends Config<S>> {
 
-    private final Class<S> subjectClass;
-    private final String key;
+    private final SubjectFactory<S> subjectFactory;
+    private final Class<C> configClass;
+    private final String configKey;
 
     /**
      * Creates a new configuration factory for the specified class of subjects
-     * and bound to the given subject configuration key.
+     * capable of generating the configurations of the specified class. The
+     * subject and configuration class keys are used merely as keys for use in
+     * composite JSON trees.
      *
-     * @param subjectClass subject class
-     * @param key          subject configuration key
+     * @param subjectFactory subject factory
+     * @param configClass  configuration class
+     * @param configKey    configuration class key
      */
-    protected ConfigFactory(Class<S> subjectClass, String key) {
-        this.subjectClass = subjectClass;
-        this.key = key;
+    protected ConfigFactory(SubjectFactory<S> subjectFactory,
+                            Class<C> configClass, String configKey) {
+        this.subjectFactory = subjectFactory;
+        this.configClass = configClass;
+        this.configKey = configKey;
     }
 
     /**
@@ -46,17 +53,28 @@
      *
      * @return subject type
      */
-    public Class<S> subjectClass() {
-        return subjectClass;
+    public SubjectFactory<S> subjectFactory() {
+        return subjectFactory;
     }
 
     /**
-     * Returns the key to which produced configurations should be bound.
+     * Returns the class of the configuration which this factory generates.
      *
-     * @return subject configuration key
+     * @return configuration type
      */
-    public String key() {
-        return key;
+    public Class<C> configClass() {
+        return configClass;
+    }
+
+    /**
+     * Returns the unique key (within subject class) of this configuration.
+     * This is primarily aimed for use in composite JSON trees in external
+     * representations and has no bearing on the internal behaviours.
+     *
+     * @return configuration key
+     */
+    public String configKey() {
+        return configKey;
     }
 
     /**
@@ -65,6 +83,6 @@
      *
      * @return new uninitialized configuration
      */
-    public abstract Config<S> createConfig();
+    public abstract C createConfig();
 
 }