add/remove DPN HTTP messages
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcManager.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcManager.java
index f9b7d36..85d3098 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcManager.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcManager.java
@@ -136,7 +136,7 @@
     private InternalDeviceListener listener = new InternalDeviceListener();
     private ConcurrentMap<ClientIdentifier, DefaultRegisterClientInput> clientInfo = Maps.newConcurrentMap();
     private ConcurrentMap<FpcIdentity, HashSet<ClientIdentifier>> tenantInfo = Maps.newConcurrentMap();
-    private HashMap<FpcDpnId, org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.tenants.tenant.fpctopology.Dpns> dpnInfo = Maps.newHashMap();
+    private HashSet<FpcDpnId> dpnInfo = Sets.newHashSet();
 
     // FIXME configurable
     private ExecutorService executorService = Executors.newFixedThreadPool(25);
@@ -734,7 +734,7 @@
                             .addModelObject(configureDpnOutput)
                             .build()
             );
-            log.info("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
+            log.debug("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
             return new RpcOutput(status, dataNode.dataNodes().get(0));
         }, executorService).join();
     }
@@ -793,7 +793,7 @@
                             .addModelObject(configureOutput)
                             .build()
             );
-            log.info("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
+            log.debug("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
             return new RpcOutput(status, dataNode.dataNodes().get(0));
         }, executorService).join();
     }
@@ -854,7 +854,7 @@
                             .addModelObject(configureBundlesOutput)
                             .build()
             );
-            log.info("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
+            log.debug("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
             return new RpcOutput(status, dataNode.dataNodes().get(0));
         }, executorService).join();
     }
@@ -866,7 +866,7 @@
             // TODO implement
             return null;
         }, executorService);
-        log.info("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
+        log.debug("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
         return null;
     }
 
@@ -877,7 +877,7 @@
             // TODO implement
             return null;
         }, executorService);
-        log.info("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
+        log.debug("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
         return null;
     }
 
@@ -888,7 +888,7 @@
             // TODO implement
             return null;
         }, executorService);
-        log.info("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
+        log.debug("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
         return null;
     }
 
@@ -939,7 +939,7 @@
                             .addModelObject(registerClientOutput)
                             .build()
             );
-            log.info("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
+            log.debug("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
             return new RpcOutput(status, dataNode.dataNodes().get(0));
         }).join();
     }
@@ -986,7 +986,7 @@
                             .addModelObject(deregisterClientOutput)
                             .build()
             );
-            log.info("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
+            log.debug("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
             return new RpcOutput(status, dataNode.dataNodes().get(0));
         }, executorService).join();
     }
@@ -1028,7 +1028,11 @@
                                         DefaultTenant tenant = defaultTenant.get();
                                         if (tenant.fpcTopology().dpns() != null) {
                                             tenant.fpcTopology().dpns().forEach(dpn -> {
-                                                        if (!dpnInfo.containsKey(dpn.dpnId())) {
+                                                        CacheManager.getInstance(tenantId).nodeNetworkCache.put(
+                                                                dpn.nodeId() + "/" + dpn.networkId(),
+                                                                Optional.of(dpn.dpnId())
+                                                        );
+                                                        if (!dpnInfo.contains(dpn.dpnId())) {
                                                             DefaultYangAutoPrefixNotify notify = new DefaultYangAutoPrefixNotify();
                                                             notify.notificationId(NotificationId.of(notificationIds.getNewId()));
 
@@ -1046,7 +1050,7 @@
                                                             notify.value(availability);
 
                                                             clients.forEach(client -> sendNotification(notify, client));
-                                                            dpnInfo.put(dpn.dpnId(), dpn);
+                                                            dpnInfo.add(dpn.dpnId());
                                                         }
                                                     }
                                             );
@@ -1058,38 +1062,37 @@
                     }
                     case DEVICE_AVAILABILITY_CHANGED:
                     case DEVICE_REMOVED: {
-                        String[] s = event.subject().id().toString().split(":")[1].split("/");
+                        String nodeNetwork = event.subject().id().toString().split(":")[1];
                         tenantInfo.forEach(
                                 (tenantId, clients) -> {
-                                    Optional<DefaultTenant> defaultTenant = getTenant(tenantId);
-                                    if (defaultTenant.isPresent()) {
-                                        DefaultTenant tenant = defaultTenant.get();
-                                        if (tenant.fpcTopology().dpns() != null) {
-                                            tenant.fpcTopology().dpns().forEach(dpn -> {
-                                                        if (dpn.networkId().equals(s[1]) && dpn.nodeId().equals(s[0]) &&
-                                                                dpnInfo.containsKey(dpn.dpnId())) {
-                                                            DefaultYangAutoPrefixNotify notify = new DefaultYangAutoPrefixNotify();
-                                                            notify.notificationId(NotificationId.of(notificationIds.getNewId()));
+                                    try {
+                                        FpcDpnId fpcDpnId = CacheManager.getInstance(tenantId).nodeNetworkCache.get(nodeNetwork).get();
 
-                                                            notify.timestamp(BigInteger.valueOf(System.currentTimeMillis()));
-                                                            DefaultDpnAvailability availability = new DefaultDpnAvailability();
-                                                            availability.availabilityMessageType("Dpn-Availability");
-                                                            availability.dpnId(dpn.dpnId());
-                                                            availability.dpnGroups(dpn.dpnGroups());
-                                                            availability.controlProtocol(dpn.controlProtocol());
-                                                            availability.networkId(dpn.networkId());
-                                                            availability.nodeId(dpn.nodeId());
-                                                            availability.dpnName(dpn.dpnName());
-                                                            availability.dpnStatus(DpnStatusEnum.UNAVAILABLE);
+                                        if (dpnInfo.contains(fpcDpnId)) {
+                                            DefaultDpns dpn = CacheManager.getInstance(tenantId).dpnsCache.get(fpcDpnId).get();
 
-                                                            notify.value(availability);
+                                            DefaultYangAutoPrefixNotify notify = new DefaultYangAutoPrefixNotify();
+                                            notify.notificationId(NotificationId.of(notificationIds.getNewId()));
 
-                                                            clients.forEach(client -> sendNotification(notify, client));
-                                                            dpnInfo.remove(dpn.dpnId());
-                                                        }
-                                                    }
-                                            );
+                                            notify.timestamp(BigInteger.valueOf(System.currentTimeMillis()));
+                                            DefaultDpnAvailability availability = new DefaultDpnAvailability();
+                                            availability.availabilityMessageType("Dpn-Availability");
+                                            availability.dpnId(dpn.dpnId());
+                                            availability.dpnGroups(dpn.dpnGroups());
+                                            availability.controlProtocol(dpn.controlProtocol());
+                                            availability.networkId(dpn.networkId());
+                                            availability.nodeId(dpn.nodeId());
+                                            availability.dpnName(dpn.dpnName());
+                                            availability.dpnStatus(DpnStatusEnum.UNAVAILABLE);
+
+                                            notify.value(availability);
+
+                                            clients.forEach(client -> sendNotification(notify, client));
+                                            dpnInfo.remove(fpcDpnId);
+
                                         }
+                                    } catch (Exception e) {
+                                        log.error(ExceptionUtils.getFullStackTrace(e));
                                     }
                                 }
                         );
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/CacheManager.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/CacheManager.java
index 1b0bae3..efac596 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/CacheManager.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/CacheManager.java
@@ -20,9 +20,11 @@
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
 import com.google.common.collect.Maps;
+import org.apache.commons.lang.exception.ExceptionUtils;
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.tenants.DefaultTenant;
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.tenants.tenant.fpcmobility.DefaultContexts;
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.tenants.tenant.fpctopology.DefaultDpns;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.tenants.tenant.fpctopology.Dpns;
 import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.FpcContextId;
 import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.FpcDpnId;
 import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.FpcIdentity;
@@ -44,6 +46,7 @@
     private final Logger log = LoggerFactory.getLogger(getClass());
     public LoadingCache<FpcContextId, Optional<DefaultContexts>> contextsCache;
     public LoadingCache<FpcDpnId, Optional<DefaultDpns>> dpnsCache;
+    public LoadingCache<String, Optional<FpcDpnId>> nodeNetworkCache;
 
     private CacheManager(FpcIdentity identity) {
         contextsCache = CacheBuilder.newBuilder()
@@ -101,6 +104,32 @@
                             }
                         }
                 );
+
+        nodeNetworkCache = CacheBuilder.newBuilder()
+                .maximumSize(100)
+                .build(
+                        new CacheLoader<String, Optional<FpcDpnId>>() {
+                            @Override
+                            public Optional<FpcDpnId> load(String s) throws Exception {
+                                try {
+                                    Optional<DefaultTenant> defaultTenant = getTenant(identity);
+                                    if (defaultTenant.isPresent()) {
+                                        DefaultTenant tenant = defaultTenant.get();
+                                        log.debug("tenant {}", tenant);
+                                        if (tenant.fpcTopology().dpns() != null) {
+                                            return tenant.fpcTopology().dpns().stream()
+                                                    .filter(dpns -> s.equals(dpns.nodeId()+"/"+dpns.networkId()))
+                                                    .findFirst()
+                                                    .map(Dpns::dpnId);
+                                        }
+                                    }
+                                } catch (Exception e) {
+                                    log.error(ExceptionUtils.getFullStackTrace(e));
+                                }
+                                return Optional.empty();
+                            }
+                        }
+                );
     }
 
     public static CacheManager getInstance(FpcIdentity identity) {
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/FpcUtil.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/FpcUtil.java
index 25c0312..9de92c8 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/FpcUtil.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/FpcUtil.java
@@ -109,7 +109,7 @@
 
         notification = ResourceId.builder()
                 .addBranchPointSchema("/", null)
-                .addBranchPointSchema("notify", "urn:onos:params:xml:ns:yang:fpcagent")
+                .addBranchPointSchema("notify", "urn:ietf:params:xml:ns:yang:fpcagent")
                 .build();
     }