From 4b97d4dfcf3e0eb9ffb8fff8b200b6a1f4886e11 Mon Sep 17 00:00:00 2001 From: Tony Tkacik Date: Fri, 16 May 2014 13:02:33 +0200 Subject: [PATCH 1/1] Bug 967: Do not translate leaf Instance Identifiers. Improved extraction of Instance Identifiers from DOM Data Change Event. Logs in console are poluted with DeserializationException, which fails to deserialize DOM Instance Identifier to Binding Instance Identifier. Added explicit check against schema context to see if Instance Identifier is representable in Binding Format, if not we will not report is as part of subtree Data Change event. Change-Id: Iaee2390fd089e0a2d66ec658aab4e7dab2a93a46 Signed-off-by: Tony Tkacik --- .../impl/BindingToNormalizedNodeCodec.java | 45 ++++++++++++++++--- .../compat/DataNormalizationOperation.java | 12 +++++ 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingToNormalizedNodeCodec.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingToNormalizedNodeCodec.java index 53615ad7de..846f949375 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingToNormalizedNodeCodec.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingToNormalizedNodeCodec.java @@ -142,6 +142,7 @@ public class BindingToNormalizedNodeCodec implements SchemaContextListener { return potential; } + int normalizedCount = getAugmentationCount(normalized); AugmentationIdentifier lastArgument = (AugmentationIdentifier) Iterables.getLast(normalized.getPath()); // Here we employ small trick - Binding-aware Codec injects an pointer @@ -153,16 +154,19 @@ public class BindingToNormalizedNodeCodec implements SchemaContextListener { ImmutableList. builder().addAll(normalized.getPath()).add(new NodeIdentifier(child)) .build()); try { - if (!isChoiceOrCasePath(childPath)) { + if (!isNotRepresentable(childPath)) { InstanceIdentifier potentialPath = shortenToLastAugment(toBindingImpl( childPath).get()); - return Optional.> of(potentialPath); + int potentialAugmentCount = getAugmentationCount(potentialPath); + if(potentialAugmentCount == normalizedCount) { + return Optional.> of(potentialPath); + } } } catch (Exception e) { LOG.trace("Unable to deserialize aug. child path for {}", childPath, e); } } - return toBindingImpl(normalized); + return Optional.absent(); } private Optional> toBindingImpl( @@ -171,7 +175,7 @@ public class BindingToNormalizedNodeCodec implements SchemaContextListener { org.opendaylight.yangtools.yang.data.api.InstanceIdentifier legacyPath; try { - if (isChoiceOrCasePath(normalized)) { + if (isNotRepresentable(normalized)) { return Optional.absent(); } legacyPath = legacyToNormalized.toLegacy(normalized); @@ -183,10 +187,16 @@ public class BindingToNormalizedNodeCodec implements SchemaContextListener { return Optional.> of(bindingToLegacy.fromDataDom(legacyPath)); } - private boolean isChoiceOrCasePath(final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier normalized) + private boolean isNotRepresentable(final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier normalized) throws DataNormalizationException { DataNormalizationOperation op = findNormalizationOperation(normalized); - return op.isMixin() && op.getIdentifier() instanceof NodeIdentifier; + if( op.isMixin() && op.getIdentifier() instanceof NodeIdentifier) { + return true; + } + if(op.isLeaf()) { + return true; + } + return false; } private DataNormalizationOperation findNormalizationOperation( @@ -256,7 +266,7 @@ public class BindingToNormalizedNodeCodec implements SchemaContextListener { if (isAugmentationIdentifier(processed)) { return processed; } - // Here we employ small trick - DataNormalizer injecst augmentation + // Here we employ small trick - DataNormalizer injects augmentation // identifier if child is // also part of the path (since using a child we can safely identify // augmentation) @@ -383,4 +393,25 @@ public class BindingToNormalizedNodeCodec implements SchemaContextListener { private boolean isAugmentationIdentifier(final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier processed) { return Iterables.getLast(processed.getPath()) instanceof AugmentationIdentifier; } + + private static int getAugmentationCount(final InstanceIdentifier potential) { + int count = 0; + for(org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument arg : potential.getPathArguments()) { + if(isAugmentation(arg.getType())) { + count++; + } + + } + return count; + } + + private static int getAugmentationCount(final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier potential) { + int count = 0; + for(PathArgument arg : potential.getPath()) { + if(arg instanceof AugmentationIdentifier) { + count++; + } + } + return count; + } } diff --git a/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/util/compat/DataNormalizationOperation.java b/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/util/compat/DataNormalizationOperation.java index 663493adcc..f869254dcf 100644 --- a/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/util/compat/DataNormalizationOperation.java +++ b/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/util/compat/DataNormalizationOperation.java @@ -83,6 +83,8 @@ public abstract class DataNormalizationOperation impleme public abstract NormalizedNode normalize(Node legacyData); + public abstract boolean isLeaf(); + private static abstract class SimpleTypeNormalization extends DataNormalizationOperation { protected SimpleTypeNormalization(final T identifier) { @@ -113,6 +115,11 @@ public abstract class DataNormalizationOperation impleme return null; } + @Override + public boolean isLeaf() { + return true; + } + } private static final class LeafNormalization extends SimpleTypeNormalization { @@ -199,6 +206,11 @@ public abstract class DataNormalizationOperation impleme return builder.build(); } + @Override + public boolean isLeaf() { + return false; + } + @SuppressWarnings("rawtypes") protected abstract NormalizedNodeContainerBuilder createBuilder(final CompositeNode compositeNode); -- 2.36.6