VOL-543:  Provision for specifying urls where subscriber id is not at the end

Change-Id: I3aa7030ebe34f6ecaa6a761db523e0c6df7a3eb7
diff --git a/README.md b/README.md
index 4383fa2..b83c394 100644
--- a/README.md
+++ b/README.md
@@ -47,3 +47,51 @@
 each instance of ONOS in a cluster might have a different set of objects in its
 cache. The thought behind this is that each instance in a cluster will be a
 master for a different set of devices and thus needs different information.
+
+
+### Configuration Paramters
+```
+"org.opencord.sadis" : {
+      "sadis" : {
+        "integration" : {
+          "url": "http://localhost/src/test/resources/%s",
+          "cache" : {
+            "maxsize" : 50,
+            "ttl" : "PT1m"
+          }
+        },
+        "entries" : [ {
+          "id" : "uni-1",
+          "cTag" : 2,
+          "sTag" : 2,
+          "nasPortId" : "PON 1",
+          "circuitId" : "VOLT-1",
+        }, {
+          "id" : "211702604597",
+          "hardwareIdentifier" : "00:1e:67:d2:ef:66",
+          "ipAddress" : "144.60.34.89",
+          "nasId" : "66"
+        }]
+      }
+    }
+```
+* __url__ - A url using which the subscriber and device data can be fetched. It is mandatory to have a `%s` in the url which will be substituted with the id for that subscriber/device to retrieve the data.
+* __maxsize__ - Maximum number of entries that the cache may contain
+* __ttl__ - Number of seconds after last access at which the cache entry expires
+
+Entries can be for Subscribers and OLT Devices; they are differentiated by the id.
+If the url is specified the data for the subscribers/devices are picked from there else the local data is used.
+
+##### For a subscriber
+* __id__ - Unique identifier for the subscriber. This should match the name of the logical port name for this subscriber as can be seen from the ONOS `ports` command
+* __cTag__ - C-Tag to be used for this subscriber
+* __sTag__ - S-Tag to be used for this subscriber
+* __nasPortId__ - NAS Port Id to be used for this subscriber; for example in RADIUS messages
+* __circuitId__ - Circuit Id to be used for this subscriber; for example in DHCP messages
+
+##### For an OLT Device
+* __id__ - Unique identifier for an OLT device. This should match the serial number of the device as can be seen from the ONOS `devices` command
+* __hardwareIdentifier__ - MAC address for this device
+* __ipAddress__ - IP address of this device
+* __nasId__ - NAS Id to be used for this device; for example in RADIUS messages
+
diff --git a/app/src/main/java/org/opencord/sadis/impl/SadisConfig.java b/app/src/main/java/org/opencord/sadis/impl/SadisConfig.java
index 42a11af..eb48fe0 100644
--- a/app/src/main/java/org/opencord/sadis/impl/SadisConfig.java
+++ b/app/src/main/java/org/opencord/sadis/impl/SadisConfig.java
@@ -81,6 +81,7 @@
     private static final String SADIS_URL = "url";
     private static final String SADIS_ENTRIES = "entries";
     private static final String DEFAULT_CACHE_TTL = "PT0S";
+    private static final String SUBSCRIBER_ID_SUB_PATTERN = "%s";
 
     /**
      * Returns SADIS integration URL.
@@ -99,7 +100,11 @@
         if (url.isMissingNode()) {
             return null;
         }
-
+        StringBuffer buf = new StringBuffer(SUBSCRIBER_ID_SUB_PATTERN);
+        if (!url.asText().contains(buf)) {
+            log.error("Error in url, missing {}", SUBSCRIBER_ID_SUB_PATTERN);
+            return null;
+        }
         return new URL(url.asText());
     }
 
diff --git a/app/src/main/java/org/opencord/sadis/impl/SubscriberAndDeviceInformationAdapter.java b/app/src/main/java/org/opencord/sadis/impl/SubscriberAndDeviceInformationAdapter.java
index 5085ae8..5026e66 100644
--- a/app/src/main/java/org/opencord/sadis/impl/SubscriberAndDeviceInformationAdapter.java
+++ b/app/src/main/java/org/opencord/sadis/impl/SubscriberAndDeviceInformationAdapter.java
@@ -192,14 +192,9 @@
             }
         } else {
             // Augment URL with query parameters
-            StringBuilder buf = new StringBuilder(this.url);
-            if (buf.charAt(buf.length() - 1) != '/') {
-                buf.append('/');
-            }
+            String urlWithSubId = this.url.replaceAll("%s", id);
 
-            buf.append(id);
-
-            try (InputStream io = new URL(buf.toString()).openStream()) {
+            try (InputStream io = new URL(urlWithSubId).openStream()) {
                 info = mapper.readValue(io, SubscriberAndDeviceInformation.class);
                 local.put(id, info);
                 return info;
diff --git a/app/src/test/resources/RemoteConfig.json b/app/src/test/resources/RemoteConfig.json
index b708fbc..e2c798f 100644
--- a/app/src/test/resources/RemoteConfig.json
+++ b/app/src/test/resources/RemoteConfig.json
@@ -1,6 +1,6 @@
 {
   "integration": {
-    "url": "file:src/test/resources",
+    "url": "file:src/test/resources/%s",
     "cache": {
       "maxsize": 50,
       "ttl": "PT1m"