ONOS-2692: Implement methods to unregister resources
Change-Id: Iae88207c5edecf6645aeff3c15875178b5266634
diff --git a/core/store/dist/src/main/java/org/onosproject/store/newresource/impl/ConsistentResourceStore.java b/core/store/dist/src/main/java/org/onosproject/store/newresource/impl/ConsistentResourceStore.java
index a20c2b7..8728c5d 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/newresource/impl/ConsistentResourceStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/newresource/impl/ConsistentResourceStore.java
@@ -121,6 +121,37 @@
}
@Override
+ public boolean unregister(ResourcePath resource, List<ResourcePath> children) {
+ checkNotNull(resource);
+ checkNotNull(children);
+
+ TransactionContext tx = service.transactionContextBuilder().build();
+ tx.begin();
+
+ try {
+ TransactionalMap<ResourcePath, List<ResourcePath>> childTxMap =
+ tx.getTransactionalMap(CHILD_MAP, SERIALIZER);
+ TransactionalMap<ResourcePath, ResourceConsumer> consumerTxMap =
+ tx.getTransactionalMap(CONSUMER_MAP, SERIALIZER);
+
+ // even if one of the resources is allocated to a consumer,
+ // all unregistrations are regarded as failure
+ if (children.stream().anyMatch(x -> consumerTxMap.get(x) != null)) {
+ return abortTransaction(tx);
+ }
+
+ if (!removeValues(childTxMap, resource, children)) {
+ return abortTransaction(tx);
+ }
+
+ return commitTransaction(tx);
+ } catch (TransactionException e) {
+ log.error("Exception thrown, abort the transaction", e);
+ return abortTransaction(tx);
+ }
+ }
+
+ @Override
public boolean allocate(List<ResourcePath> resources, ResourceConsumer consumer) {
checkNotNull(resources);
checkNotNull(consumer);
@@ -260,6 +291,30 @@
}
/**
+ * Removes teh values from the existing values associated with the specified key.
+ *
+ * @param map map holding multiple values for a key
+ * @param key key specifying values
+ * @param values values to be removed
+ * @param <K> type of the key
+ * @param <V> type of the element of the list
+ * @return true if the operation succeeds, false otherwise
+ */
+ private <K, V> boolean removeValues(TransactionalMap<K, List<V>> map, K key, List<V> values) {
+ List<V> oldValues = map.get(key);
+ List<V> newValues;
+ if (oldValues == null) {
+ newValues = new ArrayList<>();
+ } else {
+ LinkedHashSet<V> newSet = new LinkedHashSet<>(oldValues);
+ newSet.removeAll(values);
+ newValues = new ArrayList<>(newSet);
+ }
+
+ return map.replace(key, oldValues, newValues);
+ }
+
+ /**
* Checks if the specified resource is registered as a child of a resource in the map.
*
* @param map map storing parent - child relationship of resources