From 8014d193008a60ef3857f14d57d931973daa7cc4 Mon Sep 17 00:00:00 2001 From: Marek Gradzki Date: Sun, 5 Jun 2016 15:59:38 +0200 Subject: Fix CUD support for non-mandatory child nodes of list type Change-Id: Ic75221fe61a0bb35753dd6f3b4deec1b8c020974 Signed-off-by: Marek Gradzki --- .../translate/impl/write/CompositeListWriter.java | 38 ++++++++++++++-------- .../translate/spi/write/ListWriterCustomizer.java | 4 ++- .../v3po/interfaces/InterfaceCustomizer.java | 5 +-- .../v3po/interfaces/SubInterfaceCustomizer.java | 5 +-- .../translate/v3po/vpp/BridgeDomainCustomizer.java | 7 ++-- 5 files changed, 38 insertions(+), 21 deletions(-) diff --git a/v3po/translate-impl/src/main/java/io/fd/honeycomb/v3po/translate/impl/write/CompositeListWriter.java b/v3po/translate-impl/src/main/java/io/fd/honeycomb/v3po/translate/impl/write/CompositeListWriter.java index 1ac39b877..de1ac39d3 100644 --- a/v3po/translate-impl/src/main/java/io/fd/honeycomb/v3po/translate/impl/write/CompositeListWriter.java +++ b/v3po/translate-impl/src/main/java/io/fd/honeycomb/v3po/translate/impl/write/CompositeListWriter.java @@ -17,15 +17,16 @@ package io.fd.honeycomb.v3po.translate.impl.write; import com.google.common.base.Function; -import com.google.common.collect.ImmutableMap; +import com.google.common.base.Optional; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import io.fd.honeycomb.v3po.translate.impl.TraversalType; import io.fd.honeycomb.v3po.translate.spi.write.ListWriterCustomizer; +import io.fd.honeycomb.v3po.translate.util.RWUtils; import io.fd.honeycomb.v3po.translate.write.ChildWriter; import io.fd.honeycomb.v3po.translate.write.WriteContext; -import io.fd.honeycomb.v3po.translate.util.RWUtils; import io.fd.honeycomb.v3po.translate.write.WriteFailedException; +import java.util.Collections; import java.util.List; import java.util.Map; import javax.annotation.Nonnull; @@ -40,7 +41,7 @@ public class CompositeListWriter, K exten AbstractCompositeWriter implements ChildWriter { - public static final Function INDEX_FUNCTION = input -> input instanceof Identifiable + private static final Function INDEX_FUNCTION = input -> input instanceof Identifiable ? ((Identifiable) input).getKey() : input; @@ -99,9 +100,11 @@ public class CompositeListWriter, K exten @Nonnull final DataObject parentData, @Nonnull final WriteContext ctx) throws WriteFailedException { final InstanceIdentifier currentId = RWUtils.appendTypeToId(parentId, getManagedDataObjectType()); - final List currentData = customizer.extract(currentId, parentData); - for (D entry : currentData) { - writeCurrent(currentId, entry, ctx); + final Optional> currentData = customizer.extract(currentId, parentData); + if (currentData.isPresent()) { + for (D entry : currentData.get()) { + writeCurrent(currentId, entry, ctx); + } } } @@ -110,21 +113,30 @@ public class CompositeListWriter, K exten @Nonnull final DataObject parentDataBefore, @Nonnull final WriteContext ctx) throws WriteFailedException { final InstanceIdentifier currentId = RWUtils.appendTypeToId(parentId, getManagedDataObjectType()); - final List dataBefore = customizer.extract(currentId, parentDataBefore); - for (D entry : dataBefore) { - deleteCurrent(currentId, entry, ctx); + final Optional> dataBefore = customizer.extract(currentId, parentDataBefore); + if (dataBefore.isPresent()) { + for (D entry : dataBefore.get()) { + deleteCurrent(currentId, entry, ctx); + } } } + private Map listOfIdentifiableToMap(Optional> list) { + if (list.isPresent()) { + return Maps.uniqueIndex(list.get(), INDEX_FUNCTION); + } else { + return Collections.emptyMap(); + } + + } + @Override public void updateChild(@Nonnull final InstanceIdentifier parentId, @Nonnull final DataObject parentDataBefore, @Nonnull final DataObject parentDataAfter, @Nonnull final WriteContext ctx) throws WriteFailedException { final InstanceIdentifier currentId = RWUtils.appendTypeToId(parentId, getManagedDataObjectType()); - final ImmutableMap - dataBefore = Maps.uniqueIndex(customizer.extract(currentId, parentDataBefore), INDEX_FUNCTION); - final ImmutableMap - dataAfter = Maps.uniqueIndex(customizer.extract(currentId, parentDataAfter), INDEX_FUNCTION); + final Map dataBefore = listOfIdentifiableToMap(customizer.extract(currentId, parentDataBefore)); + final Map dataAfter = listOfIdentifiableToMap(customizer.extract(currentId, parentDataAfter)); for (Map.Entry after : dataAfter.entrySet()) { final D before = dataBefore.get(after.getKey()); diff --git a/v3po/translate-spi/src/main/java/io/fd/honeycomb/v3po/translate/spi/write/ListWriterCustomizer.java b/v3po/translate-spi/src/main/java/io/fd/honeycomb/v3po/translate/spi/write/ListWriterCustomizer.java index 1eb18a238..ecc591191 100644 --- a/v3po/translate-spi/src/main/java/io/fd/honeycomb/v3po/translate/spi/write/ListWriterCustomizer.java +++ b/v3po/translate-spi/src/main/java/io/fd/honeycomb/v3po/translate/spi/write/ListWriterCustomizer.java @@ -17,6 +17,7 @@ package io.fd.honeycomb.v3po.translate.spi.write; import com.google.common.annotations.Beta; +import com.google.common.base.Optional; import java.util.List; import javax.annotation.Nonnull; import org.opendaylight.yangtools.yang.binding.DataObject; @@ -41,6 +42,7 @@ public interface ListWriterCustomizer, K * @param parentData Parent data object from which managed data object must be extracted */ @Nonnull - List extract(@Nonnull final InstanceIdentifier currentId, @Nonnull final DataObject parentData); + Optional> extract(@Nonnull final InstanceIdentifier currentId, @Nonnull final DataObject parentData); + // TODO consider removing Optional and make extract return @Nullable (applies also to ChildWriterCustomizer) } \ No newline at end of file diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfaces/InterfaceCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfaces/InterfaceCustomizer.java index 4e81ca0f2..3a4638d90 100644 --- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfaces/InterfaceCustomizer.java +++ b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfaces/InterfaceCustomizer.java @@ -16,6 +16,7 @@ package io.fd.honeycomb.v3po.translate.v3po.interfaces; +import com.google.common.base.Optional; import io.fd.honeycomb.v3po.translate.spi.write.ListWriterCustomizer; import io.fd.honeycomb.v3po.translate.v3po.util.NamingContext; import io.fd.honeycomb.v3po.translate.v3po.util.FutureJVppCustomizer; @@ -89,9 +90,9 @@ public class InterfaceCustomizer extends FutureJVppCustomizer implements ListWri @Nonnull @Override - public List extract(@Nonnull final InstanceIdentifier currentId, + public Optional> extract(@Nonnull final InstanceIdentifier currentId, @Nonnull final DataObject parentData) { - return ((Interfaces) parentData).getInterface(); + return Optional.fromNullable(((Interfaces) parentData).getInterface()); } diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfaces/SubInterfaceCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfaces/SubInterfaceCustomizer.java index b6c8d9a59..cb0a2c3df 100644 --- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfaces/SubInterfaceCustomizer.java +++ b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfaces/SubInterfaceCustomizer.java @@ -20,6 +20,7 @@ import static com.google.common.base.Preconditions.checkState; import static io.fd.honeycomb.v3po.translate.v3po.util.SubInterfaceUtils.getSubInterfaceName; import static io.fd.honeycomb.v3po.translate.v3po.util.TranslateUtils.booleanToByte; +import com.google.common.base.Optional; import com.google.common.base.Preconditions; import io.fd.honeycomb.v3po.translate.spi.write.ListWriterCustomizer; import io.fd.honeycomb.v3po.translate.v3po.util.FutureJVppCustomizer; @@ -74,9 +75,9 @@ public class SubInterfaceCustomizer extends FutureJVppCustomizer @Nonnull @Override - public List extract(@Nonnull final InstanceIdentifier currentId, + public Optional> extract(@Nonnull final InstanceIdentifier currentId, @Nonnull final DataObject parentData) { - return ((SubInterfaces) parentData).getSubInterface(); + return Optional.fromNullable(((SubInterfaces) parentData).getSubInterface()); } diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/vpp/BridgeDomainCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/vpp/BridgeDomainCustomizer.java index 0b3545ddd..750ff575e 100644 --- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/vpp/BridgeDomainCustomizer.java +++ b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/vpp/BridgeDomainCustomizer.java @@ -19,12 +19,13 @@ package io.fd.honeycomb.v3po.translate.v3po.vpp; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.base.Optional; import com.google.common.base.Preconditions; import io.fd.honeycomb.v3po.translate.spi.write.ListWriterCustomizer; import io.fd.honeycomb.v3po.translate.v3po.util.FutureJVppCustomizer; import io.fd.honeycomb.v3po.translate.v3po.util.NamingContext; -import io.fd.honeycomb.v3po.translate.v3po.util.VppApiInvocationException; import io.fd.honeycomb.v3po.translate.v3po.util.TranslateUtils; +import io.fd.honeycomb.v3po.translate.v3po.util.VppApiInvocationException; import io.fd.honeycomb.v3po.translate.write.WriteContext; import io.fd.honeycomb.v3po.translate.write.WriteFailedException; import java.util.List; @@ -57,9 +58,9 @@ public class BridgeDomainCustomizer @Nonnull @Override - public List extract(@Nonnull final InstanceIdentifier currentId, + public Optional> extract(@Nonnull final InstanceIdentifier currentId, @Nonnull final DataObject parentData) { - return ((BridgeDomains) parentData).getBridgeDomain(); + return Optional.fromNullable(((BridgeDomains) parentData).getBridgeDomain()); } private BridgeDomainAddDelReply addOrUpdateBridgeDomain(final int bdId, @Nonnull final BridgeDomain bd) -- cgit 1.2.3-korg