From 1a7b74050e6ded0b6447011676e6c98979e6a39d Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 24 Mar 2022 14:31:42 +0100 Subject: [PATCH] Integrate DataNormalizationOperation with SchemaInferenceStack This is a backport of changes made for YANGTOOLS-1412, adjusted to the legacy code in bierman02. These will allow us to use a proper inference. JIRA: NETCONF-818 Change-Id: Ia3234443e26ff985b823e92d942262dfdeeef29e Signed-off-by: Robert Varga --- .../impl/DataNormalizationOperation.java | 119 +++++++++++++++++- 1 file changed, 116 insertions(+), 3 deletions(-) diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/restconf/impl/DataNormalizationOperation.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/restconf/impl/DataNormalizationOperation.java index 8a38c842bd..28e933bc30 100644 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/restconf/impl/DataNormalizationOperation.java +++ b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/restconf/impl/DataNormalizationOperation.java @@ -7,6 +7,8 @@ */ package org.opendaylight.netconf.sal.restconf.impl; +import static com.google.common.base.Verify.verifyNotNull; + import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; @@ -38,6 +40,7 @@ import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; import org.opendaylight.yangtools.yang.model.util.EffectiveAugmentationSchema; +import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack; abstract class DataNormalizationOperation implements Identifiable { private final T identifier; @@ -67,6 +70,17 @@ abstract class DataNormalizationOperation implements Ide abstract DataNormalizationOperation getChild(QName child) throws DataNormalizationException; + abstract DataNormalizationOperation enterChild(QName child, SchemaInferenceStack stack) + throws DataNormalizationException; + + abstract DataNormalizationOperation enterChild(PathArgument child, SchemaInferenceStack stack) + throws DataNormalizationException; + + void pushToStack(final SchemaInferenceStack stack) { + // Accurate for most subclasses + stack.enterSchemaTree(getIdentifier().getNodeType()); + } + private abstract static class SimpleTypeNormalization extends DataNormalizationOperation { SimpleTypeNormalization(final T identifier) { @@ -82,6 +96,16 @@ abstract class DataNormalizationOperation implements Ide final DataNormalizationOperation getChild(final QName child) { return null; } + + @Override + final DataNormalizationOperation enterChild(final QName child, final SchemaInferenceStack stack) { + return null; + } + + @Override + final DataNormalizationOperation enterChild(final PathArgument child, final SchemaInferenceStack stack) { + return null; + } } private static final class LeafNormalization extends SimpleTypeNormalization { @@ -94,6 +118,11 @@ abstract class DataNormalizationOperation implements Ide LeafListEntryNormalization(final LeafListSchemaNode potential) { super(new NodeWithValue<>(potential.getQName(), Empty.value())); } + + @Override + protected void pushToStack(final SchemaInferenceStack stack) { + // No-op + } } private abstract static class DataContainerNormalizationOperation @@ -127,6 +156,26 @@ abstract class DataNormalizationOperation implements Ide return register(potential); } + @Override + final DataNormalizationOperation enterChild(final QName child, final SchemaInferenceStack stack) + throws DataNormalizationException { + return pushToStack(getChild(child), stack); + } + + @Override + final DataNormalizationOperation enterChild(final PathArgument child, final SchemaInferenceStack stack) + throws DataNormalizationException { + return pushToStack(getChild(child), stack); + } + + private static DataNormalizationOperation pushToStack(final DataNormalizationOperation child, + final SchemaInferenceStack stack) { + if (child != null) { + child.pushToStack(stack); + } + return child; + } + private DataNormalizationOperation fromLocalSchema(final PathArgument child) throws DataNormalizationException { if (child instanceof AugmentationIdentifier) { @@ -174,6 +223,11 @@ abstract class DataNormalizationOperation implements Ide ListItemNormalization(final NodeIdentifierWithPredicates identifier, final ListSchemaNode schema) { super(identifier, schema); } + + @Override + protected void pushToStack(final SchemaInferenceStack stack) { + // No-op + } } private static final class UnkeyedListItemNormalization @@ -181,6 +235,11 @@ abstract class DataNormalizationOperation implements Ide UnkeyedListItemNormalization(final ListSchemaNode schema) { super(new NodeIdentifier(schema.getQName()), schema); } + + @Override + protected void pushToStack(final SchemaInferenceStack stack) { + // No-op + } } private static final class ContainerNormalization extends DataContainerNormalizationOperation { @@ -200,7 +259,26 @@ abstract class DataNormalizationOperation implements Ide } } - private static final class LeafListMixinNormalization extends MixinNormalizationOp { + private abstract static class ListLikeNormalizationOp extends MixinNormalizationOp { + ListLikeNormalizationOp(final T identifier) { + super(identifier); + } + + @Override + protected final DataNormalizationOperation enterChild(final QName child, final SchemaInferenceStack stack) + throws DataNormalizationException { + // Stack is already pointing to the corresponding statement, now we are just working with the child + return getChild(child); + } + + @Override + protected final DataNormalizationOperation enterChild(final PathArgument child, + final SchemaInferenceStack stack) throws DataNormalizationException { + return getChild(child); + } + } + + private static final class LeafListMixinNormalization extends ListLikeNormalizationOp { private final DataNormalizationOperation innerOp; LeafListMixinNormalization(final LeafListSchemaNode potential) { @@ -265,6 +343,11 @@ abstract class DataNormalizationOperation implements Ide return getIdentifier().getPossibleChildNames(); } + @Override + void pushToStack(final SchemaInferenceStack stack) { + // No-op + } + private static AugmentationIdentifier augmentationIdentifierFrom(final AugmentationSchemaNode augmentation) { final ImmutableSet.Builder potentialChildren = ImmutableSet.builder(); for (final DataSchemaNode child : augmentation.getChildNodes()) { @@ -274,7 +357,7 @@ abstract class DataNormalizationOperation implements Ide } } - private static final class MapMixinNormalization extends MixinNormalizationOp { + private static final class MapMixinNormalization extends ListLikeNormalizationOp { private final ListItemNormalization innerNode; MapMixinNormalization(final ListSchemaNode list) { @@ -299,7 +382,7 @@ abstract class DataNormalizationOperation implements Ide } } - private static final class UnkeyedListMixinNormalization extends MixinNormalizationOp { + private static final class UnkeyedListMixinNormalization extends ListLikeNormalizationOp { private final UnkeyedListItemNormalization innerNode; UnkeyedListMixinNormalization(final ListSchemaNode list) { @@ -327,9 +410,11 @@ abstract class DataNormalizationOperation implements Ide private static final class ChoiceNodeNormalization extends MixinNormalizationOp { private final ImmutableMap> byQName; private final ImmutableMap> byArg; + private final ImmutableMap, QName> childToCase; ChoiceNodeNormalization(final ChoiceSchemaNode schema) { super(new NodeIdentifier(schema.getQName())); + ImmutableMap.Builder, QName> childToCaseBuilder = ImmutableMap.builder(); final ImmutableMap.Builder> byQNameBuilder = ImmutableMap.builder(); final ImmutableMap.Builder> byArgBuilder = ImmutableMap.builder(); @@ -338,11 +423,13 @@ abstract class DataNormalizationOperation implements Ide for (final DataSchemaNode cazeChild : caze.getChildNodes()) { final DataNormalizationOperation childOp = fromDataSchemaNode(cazeChild); byArgBuilder.put(childOp.getIdentifier(), childOp); + childToCaseBuilder.put(childOp, caze.getQName()); for (final QName qname : childOp.getQNameIdentifiers()) { byQNameBuilder.put(qname, childOp); } } } + childToCase = childToCaseBuilder.build(); byQName = byQNameBuilder.build(); byArg = byArgBuilder.build(); } @@ -361,6 +448,32 @@ abstract class DataNormalizationOperation implements Ide Set getQNameIdentifiers() { return byQName.keySet(); } + + @Override + DataNormalizationOperation enterChild(final QName child, final SchemaInferenceStack stack) { + return pushToStack(getChild(child), stack); + } + + @Override + DataNormalizationOperation enterChild(final PathArgument child, final SchemaInferenceStack stack) { + return pushToStack(getChild(child), stack); + } + + @Override + void pushToStack(final SchemaInferenceStack stack) { + stack.enterChoice(getIdentifier().getNodeType()); + } + + private DataNormalizationOperation pushToStack(final DataNormalizationOperation child, + final SchemaInferenceStack stack) { + if (child != null) { + final var caseName = verifyNotNull(childToCase.get(child), "No case statement for %s in %s", child, + this); + stack.enterSchemaTree(caseName); + child.pushToStack(stack); + } + return child; + } } private static final class AnyxmlNormalization extends SimpleTypeNormalization { -- 2.36.6