import org.opendaylight.yangtools.yang.data.util.LeafNodeDataWithSchema;
import org.opendaylight.yangtools.yang.data.util.ListNodeDataWithSchema;
import org.opendaylight.yangtools.yang.data.util.MultipleEntryDataWithSchema;
-import org.opendaylight.yangtools.yang.data.util.NotificationAsContainer;
-import org.opendaylight.yangtools.yang.data.util.OperationAsContainer;
import org.opendaylight.yangtools.yang.data.util.ParserStreamUtils;
import org.opendaylight.yangtools.yang.data.util.SimpleNodeDataWithSchema;
import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
if (parent instanceof DataSchemaNode data) {
parentNode = data;
} else if (parent instanceof OperationDefinition oper) {
- parentNode = OperationAsContainer.of(oper);
+ parentNode = oper.toContainerLike();
} else if (parent instanceof NotificationDefinition notif) {
- parentNode = NotificationAsContainer.of(notif);
+ parentNode = notif.toContainerLike();
} else {
throw new IllegalArgumentException("Illegal parent node " + parent);
}
import org.opendaylight.yangtools.yang.data.util.ListNodeDataWithSchema;
import org.opendaylight.yangtools.yang.data.util.MountPointData;
import org.opendaylight.yangtools.yang.data.util.MultipleEntryDataWithSchema;
-import org.opendaylight.yangtools.yang.data.util.NotificationAsContainer;
-import org.opendaylight.yangtools.yang.data.util.OperationAsContainer;
import org.opendaylight.yangtools.yang.data.util.ParserStreamUtils;
import org.opendaylight.yangtools.yang.data.util.SimpleNodeDataWithSchema;
import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode;
if (stmt instanceof DataSchemaNode data) {
parentNode = data;
} else if (stmt instanceof OperationDefinition oper) {
- parentNode = OperationAsContainer.of(oper);
+ parentNode = oper.toContainerLike();
} else if (stmt instanceof NotificationDefinition notif) {
- parentNode = NotificationAsContainer.of(notif);
+ parentNode = notif.toContainerLike();
} else {
throw new IllegalArgumentException("Illegal parent node " + stmt);
}
@Beta
public static @NonNull ContainerLike forRPC(final RpcDefinition rpc) {
- return new RpcContainerSchemaNode(rpc);
+ return rpc.toContainerLike();
}
private abstract static class AbstractContainerSchemaNode<T extends SchemaNode> implements ContainerLike {
}
}
- private static final class RpcContainerSchemaNode extends AbstractContainerSchemaNode<RpcDefinition> {
- RpcContainerSchemaNode(final RpcDefinition rpcDefinition) {
- super(rpcDefinition);
- }
-
- @Override
- public Collection<? extends GroupingDefinition> getGroupings() {
- return schemaNode.getGroupings();
- }
-
- @Override
- public Collection<? extends TypeDefinition<?>> getTypeDefinitions() {
- return schemaNode.getTypeDefinitions();
- }
-
- @Override
- public Collection<? extends AugmentationSchemaNode> getAvailableAugmentations() {
- return ImmutableSet.of();
- }
-
- @Override
- public Collection<? extends DataSchemaNode> getChildNodes() {
- return ImmutableList.of(schemaNode.getInput(), schemaNode.getOutput());
- }
-
- @Override
- public DataSchemaNode dataChildByName(final QName name) {
- // FIXME: also check namespace
- return switch (name.getLocalName()) {
- case "input" -> schemaNode.getInput();
- case "output" -> schemaNode.getOutput();
- default -> null;
- };
- }
-
- @Override
- public Collection<? extends NotificationDefinition> getNotifications() {
- return ImmutableSet.of();
- }
- }
-
private static final class NotificationContainerSchemaNode
extends AbstractContainerSchemaNode<NotificationDefinition> {
private final ImmutableMap<QName, ? extends DataSchemaNode> mapNodes;
+++ /dev/null
-/*
- * Copyright (c) 2016 Cisco Systems, Inc. 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.data.util;
-
-import static java.util.Objects.requireNonNull;
-
-import com.google.common.annotations.Beta;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import java.util.Collection;
-import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
-import org.opendaylight.yangtools.yang.model.api.OperationDefinition;
-import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
-
-@Beta
-public class OperationAsContainer extends AbstractAsContainer {
- private final @NonNull OperationDefinition delegate;
-
- OperationAsContainer(final OperationDefinition parentNode) {
- delegate = requireNonNull(parentNode);
- }
-
- public static @NonNull OperationAsContainer of(final OperationDefinition delegate) {
- return new OperationAsContainer(delegate);
- }
-
- @Override
- protected final @NonNull OperationDefinition delegate() {
- return delegate;
- }
-
- @Override
- public final Collection<? extends @NonNull TypeDefinition<?>> getTypeDefinitions() {
- return delegate.getTypeDefinitions();
- }
-
- @Override
- public final Collection<? extends @NonNull GroupingDefinition> getGroupings() {
- return delegate.getGroupings();
- }
-
- @Override
- public final DataSchemaNode dataChildByName(final QName name) {
- final var input = delegate.getInput();
- if (name.equals(input.getQName())) {
- return input;
- }
- final var output = delegate.getOutput();
- if (name.equals(output.getQName())) {
- return output;
- }
- return null;
- }
-
- @Override
- public final Collection<? extends AugmentationSchemaNode> getAvailableAugmentations() {
- return ImmutableSet.of();
- }
-
- @Override
- public final Collection<? extends DataSchemaNode> getChildNodes() {
- return ImmutableList.of(delegate.getInput(), delegate.getOutput());
- }
-}
* 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.data.util;
+package org.opendaylight.yangtools.yang.model.api;
import com.google.common.collect.ForwardingObject;
-import com.google.common.collect.ImmutableSet;
-import java.util.Collection;
import java.util.Optional;
+import java.util.Set;
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
-import org.opendaylight.yangtools.yang.model.api.ContainerLike;
-import org.opendaylight.yangtools.yang.model.api.MustDefinition;
-import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
-import org.opendaylight.yangtools.yang.model.api.SchemaNode;
-import org.opendaylight.yangtools.yang.model.api.Status;
-import org.opendaylight.yangtools.yang.model.api.UsesNode;
import org.opendaylight.yangtools.yang.xpath.api.YangXPathExpression.QualifiedBound;
-abstract class AbstractAsContainer extends ForwardingObject implements ContainerLike {
+/**
+ * Base class supporting {@link OperationDefinition#toContainerLike()} and
+ * {@link NotificationDefinition#toContainerLike()}. This class is exposed only for the unlikely need users of those
+ * methods need to do tricks when encountering those containers.
+ */
+public abstract sealed class ContainerLikeCompat extends ForwardingObject implements ContainerLike
+ permits NotificationAsContainer, OperationAsContainer {
+ ContainerLikeCompat() {
+ // Hidden on purpose
+ }
+
@Override
protected abstract @NonNull SchemaNode delegate();
}
@Override
- public final Collection<? extends ActionDefinition> getActions() {
- return ImmutableSet.of();
+ public final Set<ActionDefinition> getActions() {
+ return Set.of();
}
@Override
- public final Collection<? extends NotificationDefinition> getNotifications() {
- return ImmutableSet.of();
+ public final Set<NotificationDefinition> getNotifications() {
+ return Set.of();
}
@Override
- public final Collection<? extends UsesNode> getUses() {
- return ImmutableSet.of();
+ public final Set<UsesNode> getUses() {
+ return Set.of();
}
@Override
- public final Collection<? extends @NonNull MustDefinition> getMustConstraints() {
- return ImmutableSet.of();
+ public final Set<@NonNull MustDefinition> getMustConstraints() {
+ return Set.of();
}
@Override
* 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.data.util;
+package org.opendaylight.yangtools.yang.model.api;
import static java.util.Objects.requireNonNull;
-import com.google.common.annotations.Beta;
import java.util.Collection;
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
-import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
-import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.stmt.NotificationEffectiveStatement;
-@Beta
-public final class NotificationAsContainer extends AbstractAsContainer implements NotificationDefinition {
+final class NotificationAsContainer extends ContainerLikeCompat {
private final @NonNull NotificationDefinition delegate;
NotificationAsContainer(final NotificationDefinition delegate) {
this.delegate = requireNonNull(delegate);
}
- public static @NonNull NotificationAsContainer of(final NotificationDefinition delegate) {
- return new NotificationAsContainer(delegate);
- }
-
@Override
- protected @NonNull NotificationDefinition delegate() {
+ protected NotificationDefinition delegate() {
return delegate;
}
}
@Override
- public Collection<? extends @NonNull TypeDefinition<?>> getTypeDefinitions() {
+ public Collection<? extends TypeDefinition<?>> getTypeDefinitions() {
return delegate.getTypeDefinitions();
}
@Override
- public Collection<? extends @NonNull GroupingDefinition> getGroupings() {
+ public Collection<? extends GroupingDefinition> getGroupings() {
return delegate.getGroupings();
}
-
- @Override
- public NotificationEffectiveStatement asEffectiveStatement() {
- return delegate.asEffectiveStatement();
- }
}
*/
package org.opendaylight.yangtools.yang.model.api;
+import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.yangtools.yang.model.api.stmt.NotificationEffectiveStatement;
/**
- * Interface describing YANG 'notification' statement. The notification
- * statement is used to define a NETCONF notification.
+ * Interface describing YANG 'notification' statement. The notification statement is used to define a NETCONF
+ * notification. Note that this interface is not a {@link DataSchemaNode}, which renders compatibility problematic. Use
+ * {@link #toContainerLike()} to get a {@link ContainerLike}, which can serve as a bridge.
*/
public interface NotificationDefinition extends SchemaNode, DataNodeContainer, AugmentationTarget, CopyableNode,
MustConstraintAware, EffectiveStatementEquivalent<NotificationEffectiveStatement> {
-
+ /**
+ * Return a {@link ContainerLike} backed by this definition's {@link #getChildNodes()}.
+ *
+ * @return A compatibility {@link ContainerLike}
+ */
+ default @NonNull ContainerLikeCompat toContainerLike() {
+ return new NotificationAsContainer(this);
+ }
}
--- /dev/null
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. 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.api;
+
+import static java.util.Objects.requireNonNull;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yangtools.yang.common.QName;
+
+final class OperationAsContainer extends ContainerLikeCompat {
+ private final @NonNull OperationDefinition delegate;
+
+ OperationAsContainer(final OperationDefinition parentNode) {
+ delegate = requireNonNull(parentNode);
+ }
+
+ @Override
+ protected OperationDefinition delegate() {
+ return delegate;
+ }
+
+ @Override
+ public Collection<? extends TypeDefinition<?>> getTypeDefinitions() {
+ return delegate.getTypeDefinitions();
+ }
+
+ @Override
+ public Collection<? extends GroupingDefinition> getGroupings() {
+ return delegate.getGroupings();
+ }
+
+ @Override
+ public DataSchemaNode dataChildByName(final QName name) {
+ final var input = delegate.getInput();
+ if (name.equals(input.getQName())) {
+ return input;
+ }
+ final var output = delegate.getOutput();
+ if (name.equals(output.getQName())) {
+ return output;
+ }
+ return null;
+ }
+
+ @Override
+ public Set<AugmentationSchemaNode> getAvailableAugmentations() {
+ return Set.of();
+ }
+
+ @Override
+ public List<DataSchemaNode> getChildNodes() {
+ return List.of(delegate.getInput(), delegate.getOutput());
+ }
+}
import org.eclipse.jdt.annotation.NonNullByDefault;
/**
- * Common interface for an operation, such as an {@link RpcDefinition} or an {@link ActionDefinition}.
+ * Common interface for an operation, such as an {@link RpcDefinition} or an {@link ActionDefinition}. Note that this
+ * interface is not a {@link DataSchemaNode}, which renders compatibility problematic. Use {@link #toContainerLike()} to
+ * get a {@link ContainerLike}, which can serve as a bridge.
*/
@NonNullByDefault
public interface OperationDefinition extends SchemaNode {
* substatements of output define nodes under the operation's output node.
*/
OutputSchemaNode getOutput();
+
+ /**
+ * Return a {@link ContainerLike} backed by this definition's {@link #getInput()} and {@link #getOutput()}.
+ *
+ * @return A compatibility {@link ContainerLike}
+ */
+ default ContainerLikeCompat toContainerLike() {
+ return new OperationAsContainer(this);
+ }
}