--- /dev/null
+/*
+ * 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<? extends TypeDefinition<?>> typeDefs) {
+ // No-op by default
+ }
+
+ protected void addGrouping(final GroupingDefinition grouping) {
+ // No-op by default
+ }
+}
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;
/**
*
* <p>
* 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<DataSchemaNode> {
-
+@Deprecated
+public class DataNodeIterator extends DataNodeAggregator implements Iterator<DataSchemaNode> {
private final List<ListSchemaNode> allLists = new ArrayList<>();
private final List<ContainerSchemaNode> allContainers = new ArrayList<>();
private final List<ChoiceSchemaNode> allChoices = new ArrayList<>();
private final List<DataSchemaNode> allChilds = new ArrayList<>();
private final List<GroupingDefinition> allGroupings = new ArrayList<>();
private final List<TypeDefinition<?>> allTypedefs = new ArrayList<>();
+
private final DataNodeContainer container;
public DataNodeIterator(final DataNodeContainer container) {
}
this.container = container;
- traverse(this.container);
+ SchemaNodeUtils.traverse(this, container);
}
/**
return allTypedefs;
}
- private void traverse(final DataNodeContainer dataNode) {
- if (dataNode == null) {
- return;
- }
-
- final Iterable<DataSchemaNode> 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<NotificationDefinition> notifications = module.getNotifications();
- for (NotificationDefinition notificationDefinition : notifications) {
- traverse(notificationDefinition);
- }
+ @Override
+ protected void addContainer(final ContainerSchemaNode containerNode) {
+ allContainers.add(containerNode);
+ }
- final Set<RpcDefinition> 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<GroupingDefinition> 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<? extends TypeDefinition<?>> typeDefs) {
+ allTypedefs.addAll(typeDefs);
}
@Override
- public DataSchemaNode next() {
- return allChilds.iterator().next();
+ protected void addGrouping(final GroupingDefinition grouping) {
+ allGroupings.add(grouping);
}
}
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() {
+ " does not represent rpc input or output.");
}
}
+
+ @Beta
+ public static @NonNull Collection<? extends TypeDefinition<?>> getAllTypeDefinitions(
+ final DataNodeContainer parent) {
+ final List<TypeDefinition<?>> typedefs = new ArrayList<>();
+ traverse(new DataNodeAggregator() {
+ @Override
+ protected void addTypedefs(final Collection<? extends TypeDefinition<?>> typeDefs) {
+ typedefs.addAll(typeDefs);
+ }
+ }, requireNonNull(parent));
+ return typedefs;
+ }
+
+ @Beta
+ public static @NonNull Collection<? extends ContainerSchemaNode> getAllContainers(final DataNodeContainer parent) {
+ final List<ContainerSchemaNode> 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<DataSchemaNode> 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<GroupingDefinition> groupings = dataNode.getGroupings();
+ if (groupings != null) {
+ for (GroupingDefinition grouping : groupings) {
+ aggregator.addGrouping(grouping);
+ traverse(aggregator, grouping);
+ }
+ }
+ }
}