From 130c716105017c7b20b4779973b915968b3dc322 Mon Sep 17 00:00:00 2001 From: Jan Srnicek Date: Wed, 16 Aug 2017 09:21:24 +0200 Subject: HONEYCOMB-386 - Make update optional If customizer does not support update directly, updates for its handled nodes are broken up to delete + create pairs. Change-Id: I2929109e8c9a1db0bef108367cf7d839135ce173 Signed-off-by: Jan Srnicek --- .../data/impl/ModifiableDataTreeDelegator.java | 24 +++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'infra/data-impl/src/main/java/io/fd/honeycomb/data/impl/ModifiableDataTreeDelegator.java') diff --git a/infra/data-impl/src/main/java/io/fd/honeycomb/data/impl/ModifiableDataTreeDelegator.java b/infra/data-impl/src/main/java/io/fd/honeycomb/data/impl/ModifiableDataTreeDelegator.java index ccc40576a..66dcbe5d9 100644 --- a/infra/data-impl/src/main/java/io/fd/honeycomb/data/impl/ModifiableDataTreeDelegator.java +++ b/infra/data-impl/src/main/java/io/fd/honeycomb/data/impl/ModifiableDataTreeDelegator.java @@ -124,12 +124,13 @@ public final class ModifiableDataTreeDelegator extends ModifiableDataTreeManager LOG.debug("ConfigDataTree.modify() diff: {}", modificationDiff); // Distinguish between updates (create + update) and deletes - final WriterRegistry.DataObjectUpdates baUpdates = toBindingAware(modificationDiff.getUpdates()); + final WriterRegistry.DataObjectUpdates baUpdates = + toBindingAware(writerRegistry, modificationDiff.getUpdates()); LOG.debug("ConfigDataTree.modify() extracted updates={}", baUpdates); WriteContext ctx = getTransactionWriteContext(); try { - writerRegistry.update(baUpdates, ctx); + writerRegistry.processModifications(baUpdates, ctx); final CheckedFuture contextUpdateResult = ((TransactionMappingContext) ctx.getMappingContext()).submit(); @@ -193,14 +194,15 @@ public final class ModifiableDataTreeDelegator extends ModifiableDataTreeManager return new TransactionWriteContext(serializer, beforeTx, afterTx, mappingContext); } - private WriterRegistry.DataObjectUpdates toBindingAware( + private WriterRegistry.DataObjectUpdates toBindingAware(final WriterRegistry registry, final Map biNodes) { - return ModifiableDataTreeDelegator.toBindingAware(biNodes, serializer); + return ModifiableDataTreeDelegator.toBindingAware(registry, biNodes, serializer); } } @VisibleForTesting static WriterRegistry.DataObjectUpdates toBindingAware( + final WriterRegistry registry, final Map biNodes, final BindingNormalizedNodeSerializer serializer) { @@ -209,15 +211,27 @@ public final class ModifiableDataTreeDelegator extends ModifiableDataTreeManager HashMultimap.create(); for (Map.Entry biEntry : biNodes.entrySet()) { + final InstanceIdentifier keyedId = serializer.fromYangInstanceIdentifier(biEntry.getKey()); final InstanceIdentifier unkeyedIid = - RWUtils.makeIidWildcarded(serializer.fromYangInstanceIdentifier(biEntry.getKey())); + RWUtils.makeIidWildcarded(keyedId); NormalizedNodeUpdate normalizedNodeUpdate = biEntry.getValue(); final DataObjectUpdate dataObjectUpdate = toDataObjectUpdate(normalizedNodeUpdate, serializer); if (dataObjectUpdate != null) { if (dataObjectUpdate instanceof DataObjectUpdate.DataObjectDelete) { + // is delete dataObjectDeletes.put(unkeyedIid, (DataObjectUpdate.DataObjectDelete) dataObjectUpdate); + } else if (dataObjectUpdate.getDataBefore() != null && !registry.writerSupportsUpdate(unkeyedIid)) { + // is update and direct update operation is not supported + // breaks update to delete + create pair + + dataObjectDeletes.put(unkeyedIid, + (DataObjectUpdate.DataObjectDelete) DataObjectUpdate.DataObjectDelete + .create(keyedId, dataObjectUpdate.getDataBefore(), null)); + dataObjectUpdates + .put(unkeyedIid, DataObjectUpdate.create(keyedId, null, dataObjectUpdate.getDataAfter())); } else { + // is create dataObjectUpdates.put(unkeyedIid, dataObjectUpdate); } } -- cgit 1.2.3-korg