Corrected output of network configuration subjectKeys in JSON output; no longer relies on subject.toString.

Change-Id: If4e07bc27cfaf8feb59397a5f104e5f663504f6e
diff --git a/core/api/src/main/java/org/onosproject/net/config/NetworkConfigService.java b/core/api/src/main/java/org/onosproject/net/config/NetworkConfigService.java
index c1eed98..8eb69a45 100644
--- a/core/api/src/main/java/org/onosproject/net/config/NetworkConfigService.java
+++ b/core/api/src/main/java/org/onosproject/net/config/NetworkConfigService.java
@@ -41,27 +41,27 @@
     /**
      * Returns the subject factory with the specified key.
      *
-     * @param subjectKey subject class key
+     * @param subjectClassKey subject class key
      * @return subject class
      */
-    SubjectFactory getSubjectFactory(String subjectKey);
+    SubjectFactory getSubjectFactory(String subjectClassKey);
 
     /**
      * Returns the subject factory for the specified class.
      *
      * @param subjectClass subject class
-     * @return subject class key
+     * @return subject class factory
      */
     SubjectFactory getSubjectFactory(Class subjectClass);
 
     /**
      * Returns the configuration class with the specified key.
      *
-     * @param subjectKey subject class key
-     * @param configKey  subject class name
+     * @param subjectClassKey subject class key
+     * @param configKey       subject class name
      * @return subject class
      */
-    Class<? extends Config> getConfigClass(String subjectKey, String configKey);
+    Class<? extends Config> getConfigClass(String subjectClassKey, String configKey);
 
     /**
      * Returns the set of subjects for which some configuration is available.
diff --git a/core/api/src/main/java/org/onosproject/net/config/SubjectFactory.java b/core/api/src/main/java/org/onosproject/net/config/SubjectFactory.java
index cd2db34..f992d72 100644
--- a/core/api/src/main/java/org/onosproject/net/config/SubjectFactory.java
+++ b/core/api/src/main/java/org/onosproject/net/config/SubjectFactory.java
@@ -28,7 +28,7 @@
 public abstract class SubjectFactory<S> {
 
     private final Class<S> subjectClass;
-    private final String subjectKey;
+    private final String subjectClassKey;
 
     /**
      * Creates a new configuration factory for the specified class of subjects
@@ -36,12 +36,12 @@
      * subject and configuration class keys are used merely as keys for use in
      * composite JSON trees.
      *
-     * @param subjectClass subject class
-     * @param subjectKey   subject class key
+     * @param subjectClass    subject class
+     * @param subjectClassKey subject class key
      */
-    protected SubjectFactory(Class<S> subjectClass, String subjectKey) {
+    protected SubjectFactory(Class<S> subjectClass, String subjectClassKey) {
         this.subjectClass = subjectClass;
-        this.subjectKey = subjectKey;
+        this.subjectClassKey = subjectClassKey;
     }
 
     /**
@@ -60,8 +60,20 @@
      *
      * @return configuration key
      */
-    public String subjectKey() {
-        return subjectKey;
+    public String subjectClassKey() {
+        return subjectClassKey;
+    }
+
+    /**
+     * Returns the unique key of the specified configuration subject.
+     * This is primarily aimed for use in composite JSON trees in external
+     * representations and has no bearing on the internal behaviours.
+     *
+     * @param subject specific subject
+     * @return subject key
+     */
+    public String subjectKey(S subject) {
+        return subject.toString();
     }
 
     /**
diff --git a/core/api/src/main/java/org/onosproject/net/config/basics/SubjectFactories.java b/core/api/src/main/java/org/onosproject/net/config/basics/SubjectFactories.java
index 884f2e2..311566b 100644
--- a/core/api/src/main/java/org/onosproject/net/config/basics/SubjectFactories.java
+++ b/core/api/src/main/java/org/onosproject/net/config/basics/SubjectFactories.java
@@ -43,6 +43,10 @@
                 public ApplicationId createSubject(String key) {
                     return coreService.registerApplication(key);
                 }
+                @Override
+                public String subjectKey(ApplicationId subject) {
+                    return subject.name();
+                }
             };
 
     public static final SubjectFactory<DeviceId> DEVICE_SUBJECT_FACTORY =
@@ -59,6 +63,10 @@
                 public ConnectPoint createSubject(String key) {
                     return ConnectPoint.deviceConnectPoint(key);
                 }
+                @Override
+                public String subjectKey(ConnectPoint subject) {
+                    return key(subject);
+                }
             };
 
     public static final SubjectFactory<HostId> HOST_SUBJECT_FACTORY =
@@ -78,6 +86,10 @@
                     return LinkKey.linkKey(ConnectPoint.deviceConnectPoint(cps[0]),
                                            ConnectPoint.deviceConnectPoint(cps[1]));
                 }
+                @Override
+                public String subjectKey(LinkKey subject) {
+                    return key(subject.src()) + "-" + key(subject.dst());
+                }
             };
 
     /**
@@ -90,4 +102,8 @@
         coreService = service;
     }
 
+    private static String key(ConnectPoint subject) {
+        return subject.deviceId() + "/" + subject.port();
+    }
+
 }
diff --git a/core/api/src/test/java/org/onosproject/net/config/NetworkConfigServiceAdapter.java b/core/api/src/test/java/org/onosproject/net/config/NetworkConfigServiceAdapter.java
index b70d14e..7307258 100644
--- a/core/api/src/test/java/org/onosproject/net/config/NetworkConfigServiceAdapter.java
+++ b/core/api/src/test/java/org/onosproject/net/config/NetworkConfigServiceAdapter.java
@@ -29,7 +29,7 @@
     }
 
     @Override
-    public SubjectFactory getSubjectFactory(String subjectKey) {
+    public SubjectFactory getSubjectFactory(String subjectClassKey) {
         return null;
     }
 
@@ -39,7 +39,7 @@
     }
 
     @Override
-    public Class<? extends Config> getConfigClass(String subjectKey, String configKey) {
+    public Class<? extends Config> getConfigClass(String subjectClassKey, String configKey) {
         return null;
     }