X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-data-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fdata%2Fimpl%2Fschema%2Ftree%2FChoiceModificationStrategy.java;h=b79371f48dbc71150cbfe1f21099c92a3805d038;hb=35fed4fb3caf6a7462f680de806389701d78bd6c;hp=a03c21e7e8b5917e6f18503b365fbc41bf0d56ab;hpb=39d6912a0df959abf070bcec53d2157f938eb7fc;p=yangtools.git diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ChoiceModificationStrategy.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ChoiceModificationStrategy.java index a03c21e7e8..b79371f48d 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ChoiceModificationStrategy.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ChoiceModificationStrategy.java @@ -19,6 +19,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Optional; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; @@ -27,17 +28,17 @@ import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodes; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration; -import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException; import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNode; import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.Version; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableChoiceNodeBuilder; +import org.opendaylight.yangtools.yang.data.impl.schema.tree.AbstractNodeContainerModificationStrategy.Visible; import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode; import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode; import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -final class ChoiceModificationStrategy extends AbstractNodeContainerModificationStrategy { +final class ChoiceModificationStrategy extends Visible { private static final NormalizedNodeContainerSupport SUPPORT = new NormalizedNodeContainerSupport<>(ChoiceNode.class, ImmutableChoiceNodeBuilder::create, ImmutableChoiceNodeBuilder::create); @@ -46,19 +47,27 @@ final class ChoiceModificationStrategy extends AbstractNodeContainerModification // FIXME: enforce leaves not coming from two case statements at the same time private final ImmutableMap> exclusions; private final ImmutableMap caseEnforcers; - private final ChoiceNode emptyNode; + private final @NonNull ChoiceNode emptyNode; ChoiceModificationStrategy(final ChoiceSchemaNode schema, final DataTreeConfiguration treeConfig) { - super(SUPPORT, treeConfig); + super(SUPPORT, treeConfig, schema); final Builder childBuilder = ImmutableMap.builder(); final Builder enforcerBuilder = ImmutableMap.builder(); - for (final CaseSchemaNode caze : schema.getCases().values()) { + for (final CaseSchemaNode caze : schema.getCases()) { final CaseEnforcer enforcer = CaseEnforcer.forTree(caze, treeConfig); if (enforcer != null) { - for (final Entry e : enforcer.getChildEntries()) { - childBuilder.put(e.getKey(), SchemaAwareApplyOperation.from(e.getValue(), treeConfig)); - enforcerBuilder.put(e.getKey(), enforcer); + for (final Entry entry : enforcer.getChildEntries()) { + final ModificationApplyOperation childOper; + try { + childOper = SchemaAwareApplyOperation.from(entry.getValue(), treeConfig); + } catch (ExcludedDataSchemaNodeException e) { + // This should never happen as enforcer performs filtering + throw new IllegalStateException("Enforcer references out-of-tree child " + entry, e); + } + + childBuilder.put(entry.getKey(), childOper); + enforcerBuilder.put(entry.getKey(), enforcer); } for (final Entry e : enforcer.getAugmentationEntries()) { @@ -80,17 +89,15 @@ final class ChoiceModificationStrategy extends AbstractNodeContainerModification } @Override - Optional apply(final ModifiedNode modification, final Optional storeMeta, + Optional apply(final ModifiedNode modification, final Optional storeMeta, final Version version) { return AutomaticLifecycleMixin.apply(super::apply, this::applyWrite, emptyNode, modification, storeMeta, version); } @Override - void checkApplicable(final ModificationPath path, final NodeModification modification, - final Optional current, final Version version) throws DataValidationFailedException { - AutomaticLifecycleMixin.checkApplicable(super::checkApplicable, emptyNode, path, modification, current, - version); + TreeNode defaultTreeNode() { + return defaultTreeNode(emptyNode); } @Override @@ -99,7 +106,7 @@ final class ChoiceModificationStrategy extends AbstractNodeContainerModification } @Override - void additionalVerifyValueChildren(final NormalizedNode writtenValue) { + void optionalVerifyValueChildren(final NormalizedNode writtenValue) { enforceCases(writtenValue); } @@ -141,7 +148,7 @@ final class ChoiceModificationStrategy extends AbstractNodeContainerModification @Override protected TreeNode applyWrite(final ModifiedNode modification, final NormalizedNode newValue, - final Optional currentMeta, final Version version) { + final Optional currentMeta, final Version version) { final TreeNode ret = super.applyWrite(modification, newValue, currentMeta, version); enforceCases(ret); return ret;