From 914a36764f9cf59f376ad40e917e9f08d85a5829 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 14 Jan 2020 15:56:18 +0100 Subject: [PATCH] Deprecate DataNodeIterator This class is used in two places only, where each of the places only needs specific type of nodes. Expose utility methods for those two cases and a general tranverser method from SchemaNodeUtils and deprecate DataNodeIterator. Change-Id: I4fdc47e16fe2ea7e6f042bb80fe869657ee93fac Signed-off-by: Robert Varga (cherry picked from commit adf41b25c82b005f66a0de86a8e3c8a8a455cf76) --- .../yang/model/util/DataNodeAggregator.java | 44 +++++++ .../yang/model/util/DataNodeIterator.java | 110 ++++++----------- .../yang/model/util/SchemaNodeUtils.java | 111 ++++++++++++++++++ 3 files changed, 189 insertions(+), 76 deletions(-) create mode 100644 yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/DataNodeAggregator.java diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/DataNodeAggregator.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/DataNodeAggregator.java new file mode 100644 index 0000000000..a16975bd65 --- /dev/null +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/DataNodeAggregator.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.yangtools.yang.model.util; + +import com.google.common.annotations.Beta; +import java.util.Collection; +import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode; +import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; +import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; +import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; +import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; +import org.opendaylight.yangtools.yang.model.api.TypeDefinition; + +@Beta +public abstract class DataNodeAggregator { + protected void addChild(final DataSchemaNode childNode) { + // No-op by default + } + + protected void addContainer(final ContainerSchemaNode containerNode) { + // No-op by default + } + + protected void addList(final ListSchemaNode list) { + // No-op by default + } + + protected void addChoice(final ChoiceSchemaNode choiceNode) { + // No-op by default + } + + protected void addTypedefs(final Collection> typeDefs) { + // No-op by default + } + + protected void addGrouping(final GroupingDefinition grouping) { + // No-op by default + } +} diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/DataNodeIterator.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/DataNodeIterator.java index e168875b90..fdfee353c3 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/DataNodeIterator.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/DataNodeIterator.java @@ -8,19 +8,15 @@ package org.opendaylight.yangtools.yang.model.util; import java.util.ArrayList; +import java.util.Collection; import java.util.Iterator; import java.util.List; -import java.util.Set; -import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode; import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; -import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.model.api.NotificationDefinition; -import org.opendaylight.yangtools.yang.model.api.RpcDefinition; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; /** @@ -29,15 +25,20 @@ import org.opendaylight.yangtools.yang.model.api.TypeDefinition; * *

* Iterator instance is eagerly created, walking happens on initialization. Iteration is not ordered. + * + * @deprecated Use {@link SchemaNodeUtils#getAllContainers(DataNodeContainer)}, + * {@link SchemaNodeUtils#getAllTypeDefinitions(DataNodeContainer)} or + * {@link SchemaNodeUtils#traverse(DataNodeAggregator, DataNodeContainer)} instead. */ -public class DataNodeIterator implements Iterator { - +@Deprecated +public class DataNodeIterator extends DataNodeAggregator implements Iterator { private final List allLists = new ArrayList<>(); private final List allContainers = new ArrayList<>(); private final List allChoices = new ArrayList<>(); private final List allChilds = new ArrayList<>(); private final List allGroupings = new ArrayList<>(); private final List> allTypedefs = new ArrayList<>(); + private final DataNodeContainer container; public DataNodeIterator(final DataNodeContainer container) { @@ -46,7 +47,7 @@ public class DataNodeIterator implements Iterator { } this.container = container; - traverse(this.container); + SchemaNodeUtils.traverse(this, container); } /** @@ -94,86 +95,43 @@ public class DataNodeIterator implements Iterator { return allTypedefs; } - private void traverse(final DataNodeContainer dataNode) { - if (dataNode == null) { - return; - } - - final Iterable childNodes = dataNode.getChildNodes(); - if (childNodes != null) { - for (DataSchemaNode childNode : childNodes) { - if (childNode.isAugmenting()) { - continue; - } - allChilds.add(childNode); - if (childNode instanceof ContainerSchemaNode) { - final ContainerSchemaNode containerNode = (ContainerSchemaNode) childNode; - allContainers.add(containerNode); - traverse(containerNode); - } else if (childNode instanceof ListSchemaNode) { - final ListSchemaNode list = (ListSchemaNode) childNode; - allLists.add(list); - traverse(list); - } else if (childNode instanceof ChoiceSchemaNode) { - final ChoiceSchemaNode choiceNode = (ChoiceSchemaNode) childNode; - allChoices.add(choiceNode); - for (final CaseSchemaNode caseNode : choiceNode.getCases().values()) { - traverse(caseNode); - } - } - } - } - - this.allTypedefs.addAll(dataNode.getTypeDefinitions()); - traverseModule(dataNode); - traverseGroupings(dataNode); + @Override + public boolean hasNext() { + return !container.getChildNodes().isEmpty(); + } + @Override + public DataSchemaNode next() { + return allChilds.iterator().next(); } - private void traverseModule(final DataNodeContainer dataNode) { - final Module module; - if (dataNode instanceof Module) { - module = (Module) dataNode; - } else { - return; - } + @Override + protected void addChild(final DataSchemaNode childNode) { + allChilds.add(childNode); + } - final Set notifications = module.getNotifications(); - for (NotificationDefinition notificationDefinition : notifications) { - traverse(notificationDefinition); - } + @Override + protected void addContainer(final ContainerSchemaNode containerNode) { + allContainers.add(containerNode); + } - final Set rpcs = module.getRpcs(); - for (RpcDefinition rpcDefinition : rpcs) { - this.allTypedefs.addAll(rpcDefinition.getTypeDefinitions()); - ContainerSchemaNode input = rpcDefinition.getInput(); - if (input != null) { - traverse(input); - } - ContainerSchemaNode output = rpcDefinition.getOutput(); - if (output != null) { - traverse(output); - } - } + @Override + protected void addList(final ListSchemaNode list) { + allLists.add(list); } - private void traverseGroupings(final DataNodeContainer dataNode) { - final Set groupings = dataNode.getGroupings(); - if (groupings != null) { - for (GroupingDefinition grouping : groupings) { - allGroupings.add(grouping); - traverse(grouping); - } - } + @Override + protected void addChoice(final ChoiceSchemaNode choiceNode) { + allChoices.add(choiceNode); } @Override - public boolean hasNext() { - return !container.getChildNodes().isEmpty(); + protected void addTypedefs(final Collection> typeDefs) { + allTypedefs.addAll(typeDefs); } @Override - public DataSchemaNode next() { - return allChilds.iterator().next(); + protected void addGrouping(final GroupingDefinition grouping) { + allGroupings.add(grouping); } } diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaNodeUtils.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaNodeUtils.java index 134cc336ed..bfa70f76fe 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaNodeUtils.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaNodeUtils.java @@ -9,14 +9,28 @@ package org.opendaylight.yangtools.yang.model.util; import static java.util.Objects.requireNonNull; +import com.google.common.annotations.Beta; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import java.util.Optional; +import java.util.Set; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode; +import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; +import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; +import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode; +import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; +import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; +import org.opendaylight.yangtools.yang.model.api.Module; +import org.opendaylight.yangtools.yang.model.api.NotificationDefinition; import org.opendaylight.yangtools.yang.model.api.RpcDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaNode; +import org.opendaylight.yangtools.yang.model.api.TypeDefinition; public final class SchemaNodeUtils { private SchemaNodeUtils() { @@ -62,4 +76,101 @@ public final class SchemaNodeUtils { + " does not represent rpc input or output."); } } + + @Beta + public static @NonNull Collection> getAllTypeDefinitions( + final DataNodeContainer parent) { + final List> typedefs = new ArrayList<>(); + traverse(new DataNodeAggregator() { + @Override + protected void addTypedefs(final Collection> typeDefs) { + typedefs.addAll(typeDefs); + } + }, requireNonNull(parent)); + return typedefs; + } + + @Beta + public static @NonNull Collection getAllContainers(final DataNodeContainer parent) { + final List containers = new ArrayList<>(); + traverse(new DataNodeAggregator() { + @Override + protected void addContainer(final ContainerSchemaNode containerNode) { + containers.add(containerNode); + } + }, requireNonNull(parent)); + return containers; + } + + @Beta + public static void traverse(final @NonNull DataNodeAggregator aggregator, final DataNodeContainer dataNode) { + if (dataNode == null) { + return; + } + + final Iterable childNodes = dataNode.getChildNodes(); + if (childNodes != null) { + for (DataSchemaNode childNode : childNodes) { + if (childNode.isAugmenting()) { + continue; + } + aggregator.addChild(childNode); + if (childNode instanceof ContainerSchemaNode) { + final ContainerSchemaNode containerNode = (ContainerSchemaNode) childNode; + aggregator.addContainer(containerNode); + traverse(aggregator, containerNode); + } else if (childNode instanceof ListSchemaNode) { + final ListSchemaNode list = (ListSchemaNode) childNode; + aggregator.addList(list); + traverse(aggregator, list); + } else if (childNode instanceof ChoiceSchemaNode) { + final ChoiceSchemaNode choiceNode = (ChoiceSchemaNode) childNode; + aggregator.addChoice(choiceNode); + for (final CaseSchemaNode caseNode : choiceNode.getCases().values()) { + traverse(aggregator, caseNode); + } + } + } + } + + aggregator.addTypedefs(dataNode.getTypeDefinitions()); + + traverseModule(aggregator, dataNode); + traverseGroupings(aggregator, dataNode); + } + + private static void traverseModule(final DataNodeAggregator aggregator, final DataNodeContainer dataNode) { + final Module module; + if (dataNode instanceof Module) { + module = (Module) dataNode; + } else { + return; + } + + for (NotificationDefinition notificationDefinition : module.getNotifications()) { + traverse(aggregator, notificationDefinition); + } + + for (RpcDefinition rpcDefinition : module.getRpcs()) { + aggregator.addTypedefs(rpcDefinition.getTypeDefinitions()); + ContainerSchemaNode input = rpcDefinition.getInput(); + if (input != null) { + traverse(aggregator, input); + } + ContainerSchemaNode output = rpcDefinition.getOutput(); + if (output != null) { + traverse(aggregator, output); + } + } + } + + private static void traverseGroupings(final DataNodeAggregator aggregator, final DataNodeContainer dataNode) { + final Set groupings = dataNode.getGroupings(); + if (groupings != null) { + for (GroupingDefinition grouping : groupings) { + aggregator.addGrouping(grouping); + traverse(aggregator, grouping); + } + } + } } -- 2.36.6