REST/CLI Implementations and Fix for remote url data

Change-Id: I0daeebdd40864179c6b923bed3da0c38f259829e
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 8842490..fbd77aa 100644
--- a/app/src/main/java/org/opencord/sadis/impl/SubscriberAndDeviceInformationAdapter.java
+++ b/app/src/main/java/org/opencord/sadis/impl/SubscriberAndDeviceInformationAdapter.java
@@ -26,9 +26,12 @@
 import org.opencord.sadis.SubscriberAndDeviceInformationService;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
 import com.google.common.cache.Cache;
 import com.google.common.cache.CacheBuilder;
 import com.google.common.collect.Maps;
+import org.onlab.packet.VlanId;
+import org.onlab.packet.Ip4Address;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -42,6 +45,7 @@
     private static final long DEFAULT_TTL = 0;
 
     private String url;
+    private ObjectMapper mapper;
     private Cache<String, SubscriberAndDeviceInformation> cache;
     private int maxiumCacheSize = DEFAULT_MAXIMUM_CACHE_SIZE;
     private long cacheEntryTtl = DEFAULT_TTL;
@@ -51,6 +55,14 @@
     public SubscriberAndDeviceInformationAdapter() {
         cache = CacheBuilder.newBuilder().maximumSize(maxiumCacheSize)
                 .expireAfterAccess(cacheEntryTtl, TimeUnit.SECONDS).build();
+        mapper = new ObjectMapper();
+        SimpleModule module = new SimpleModule();
+        SadisConfig config = new SadisConfig();
+        SadisConfig.VlanIdDeserializer vlanID = config.new VlanIdDeserializer();
+        SadisConfig.Ip4AddressDeserializer ip4Address = config.new Ip4AddressDeserializer();
+        module.addDeserializer(VlanId.class, vlanID);
+        module.addDeserializer(Ip4Address.class, ip4Address);
+        mapper.registerModule(module);
     }
 
     /**
@@ -114,6 +126,37 @@
      * (non-Javadoc)
      *
      * @see
+     * org.opencord.sadis.SubscriberAndDeviceInformationService#invalidateId()
+     */
+    @Override
+    public void invalidateId(String id) {
+        cache.invalidate(id);
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see
+     * org.opencord.sadis.SubscriberAndDeviceInformationService#getfromCache(java.lang.
+     * String)
+     */
+     @Override
+     public SubscriberAndDeviceInformation getfromCache(String id) {
+         Cache<String, SubscriberAndDeviceInformation> local;
+         synchronized (this) {
+           local = cache;
+         }
+         SubscriberAndDeviceInformation info = local.getIfPresent(id);
+         if (info != null) {
+            return info;
+         }
+         return null;
+     }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see
      * org.opencord.sadis.SubscriberAndDeviceInformationService#get(java.lang.
      * String)
      */
@@ -134,7 +177,7 @@
          * from there, else check for it in the locally configured data
          */
         if (this.url == null) {
-            info = localCfgData.get(id);
+            info = (localCfgData == null) ? null : localCfgData.get(id);
 
             if (info != null) {
                 local.put(id, info);
@@ -150,13 +193,12 @@
             buf.append(id);
 
             try (InputStream io = new URL(buf.toString()).openStream()) {
-                ObjectMapper mapper = new ObjectMapper();
                 info = mapper.readValue(io, SubscriberAndDeviceInformation.class);
                 local.put(id, info);
                 return info;
             } catch (IOException e) {
                 // TODO Auto-generated catch block
-                e.printStackTrace();
+                log.warn("Exception while reading remote data " + e.getMessage());
             }
         }
         log.error("Data not found for id {}", id);