From f05a95202bdbc97730a9538e8f2aa271e2c32655 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 29 Jun 2023 13:18:03 +0200 Subject: [PATCH] Fix YangDataRuntimeTypes not being available CompositeRuntimeType children are always indexed only through SchemaTree, which means we need to make another pass to get at YangDataRuntimeTypes. JIRA: MDSAL-805 Change-Id: I68cfc7fad2c1a7cb3333e48e9b435bc681992641 Signed-off-by: Robert Varga --- .../impl/reactor/ModuleGenerator.java | 12 +++++++++- .../impl/rt/DefaultModuleRuntimeType.java | 24 +++++++------------ 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/ModuleGenerator.java b/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/ModuleGenerator.java index 9769b74a99..69b526e602 100644 --- a/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/ModuleGenerator.java +++ b/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/ModuleGenerator.java @@ -10,6 +10,7 @@ package org.opendaylight.mdsal.binding.generator.impl.reactor; import static com.google.common.base.Verify.verify; import static com.google.common.base.Verify.verifyNotNull; +import java.util.ArrayList; import java.util.List; import java.util.Map; import org.eclipse.jdt.annotation.NonNull; @@ -23,6 +24,7 @@ import org.opendaylight.mdsal.binding.model.ri.BindingTypes; import org.opendaylight.mdsal.binding.runtime.api.AugmentRuntimeType; import org.opendaylight.mdsal.binding.runtime.api.ModuleRuntimeType; import org.opendaylight.mdsal.binding.runtime.api.RuntimeType; +import org.opendaylight.mdsal.binding.runtime.api.YangDataRuntimeType; import org.opendaylight.yangtools.yang.binding.contract.Naming; import org.opendaylight.yangtools.yang.common.AbstractQName; import org.opendaylight.yangtools.yang.common.QNameModule; @@ -128,7 +130,15 @@ public final class ModuleGenerator extends AbstractCompositeGenerator children, final List augments) { verify(augments.isEmpty(), "Unexpected augments %s", augments); - return new DefaultModuleRuntimeType(type, statement, children); + + final var yangDataChildren = new ArrayList(); + for (var child : ModuleGenerator.this) { + if (child instanceof YangDataGenerator yangDataGen) { + yangDataGen.runtimeType().ifPresent(yangDataChildren::add); + } + } + + return new DefaultModuleRuntimeType(type, statement, children, yangDataChildren); } }; } diff --git a/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/rt/DefaultModuleRuntimeType.java b/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/rt/DefaultModuleRuntimeType.java index 02bba8aa7d..92d8618322 100644 --- a/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/rt/DefaultModuleRuntimeType.java +++ b/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/rt/DefaultModuleRuntimeType.java @@ -7,8 +7,11 @@ */ package org.opendaylight.mdsal.binding.generator.impl.rt; +import static java.util.Objects.requireNonNull; + import com.google.common.annotations.Beta; -import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; import java.util.List; import org.opendaylight.mdsal.binding.model.api.GeneratedType; import org.opendaylight.mdsal.binding.runtime.api.ModuleRuntimeType; @@ -20,27 +23,16 @@ import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement; @Beta public final class DefaultModuleRuntimeType extends AbstractCompositeRuntimeType implements ModuleRuntimeType { - private final ImmutableList yangDataChildren; + private final ImmutableMap yangDataChildren; public DefaultModuleRuntimeType(final GeneratedType bindingType, final ModuleEffectiveStatement statement, - final List children) { + final List children, final List yangDataChildren) { super(bindingType, statement, children); - yangDataChildren = children.stream() - .filter(YangDataRuntimeType.class::isInstance) - .map(YangDataRuntimeType.class::cast) - .collect(ImmutableList.toImmutableList()); + this.yangDataChildren = Maps.uniqueIndex(yangDataChildren, type -> type.statement().argument()); } @Override public YangDataRuntimeType yangDataChild(final YangDataName templateName) { - if (statement().localQNameModule().equals(templateName.module())) { - final var name = templateName.name(); - for (var child : yangDataChildren) { - if (name.equals(child.statement().argument())) { - return child; - } - } - } - return null; + return yangDataChildren.get(requireNonNull(templateName)); } } -- 2.36.6