import javax.xml.transform.dom.DOMSource;
import org.checkerframework.checker.regex.qual.Regex;
import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.yangtools.rfc8528.data.api.MountPointContext;
import org.opendaylight.yangtools.rfc8528.data.api.MountPointIdentifier;
import org.opendaylight.yangtools.rfc8528.data.api.StreamWriterMountPointExtension;
import org.opendaylight.yangtools.yang.common.XMLNamespace;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointContext;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedAnydata;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriterExtension;
import javax.xml.stream.XMLStreamReader;
import javax.xml.transform.dom.DOMSource;
import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.opendaylight.yangtools.rfc8528.data.api.MountPointContext;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointContext;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.data.impl.schema.AbstractMountPointChild;
import com.google.common.annotations.Beta;
import java.util.List;
-import org.opendaylight.yangtools.rfc8528.data.api.MountPointContext;
import org.opendaylight.yangtools.rfc8528.data.util.EmptyMountPointContext;
import org.opendaylight.yangtools.yang.common.QNameModule;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointContext;
import org.opendaylight.yangtools.yang.data.impl.codec.AbstractIntegerStringCodec;
import org.opendaylight.yangtools.yang.data.impl.codec.BinaryStringCodec;
import org.opendaylight.yangtools.yang.data.impl.codec.BitsStringCodec;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stax.StAXSource;
import org.opendaylight.yangtools.rfc7952.model.api.AnnotationSchemaNode;
-import org.opendaylight.yangtools.rfc8528.data.api.MountPointContext;
import org.opendaylight.yangtools.rfc8528.data.api.MountPointIdentifier;
import org.opendaylight.yangtools.rfc8528.data.api.YangLibraryConstants;
-import org.opendaylight.yangtools.rfc8528.data.api.YangLibraryConstants.ContainerName;
import org.opendaylight.yangtools.rfc8528.model.api.MountPointSchemaNode;
import org.opendaylight.yangtools.rfc8528.model.api.SchemaMountConstants;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.QNameModule;
import org.opendaylight.yangtools.yang.common.XMLNamespace;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointContext;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointContextFactory.ContainerName;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.data.util.AbstractMountPointDataWithSchema;
import org.opendaylight.yangtools.yang.data.util.AbstractNodeDataWithSchema;
+++ /dev/null
-/*
- * Copyright (c) 2019 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.rfc8528.data.api;
-
-import com.google.common.annotations.Beta;
-import java.util.Map;
-import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.yangtools.rfc8528.data.api.YangLibraryConstants.ContainerName;
-import org.opendaylight.yangtools.yang.parser.api.YangParserException;
-
-/**
- * An entity able to resolve the SchemaContext for embedded mount points based on generic data provided by the current
- * interpretation context.
- */
-@Beta
-@NonNullByDefault
-public interface MountPointContextFactory {
- /**
- * Create a mount point context based on available information. Implementations are expected to attempt to interpret
- * provided data to their best of their ability.
- *
- * @param libraryContainers available YANG library containers in opaque format
- * @param schemaMounts the content of 'schema-mounts' container, if available
- * @return A {@link MountPointContext}
- * @throws YangParserException if the schema cannot be assembled
- */
- MountPointContext createContext(Map<ContainerName, MountPointChild> libraryContainers,
- @Nullable MountPointChild schemaMounts) throws YangParserException;
-}
import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
import org.opendaylight.yangtools.yang.data.api.schema.MixinNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointContext;
/**
* Common NormalizedNode representation of a YANG mount point.
import com.google.common.annotations.Beta;
import java.io.IOException;
import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointContext;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriterExtension;
*/
package org.opendaylight.yangtools.rfc8528.data.api;
-import static java.util.Objects.requireNonNull;
-
import com.google.common.annotations.Beta;
import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.eclipse.jdt.annotation.Nullable;
import org.opendaylight.yangtools.yang.common.XMLNamespace;
/**
*/
public static final String MODULE_NAME = "ietf-yang-library";
- /**
- * Top-level containers which hold YANG Library information, ordered by descending preference, with more modern
- * and/or preferred entries first.
- */
- public enum ContainerName {
- // Note: order this enum from most-preferred to least-preferred name
- /**
- * Container in RFC8525 (NMDA) YANG Library.
- */
- RFC8525("yang-library"),
- /**
- * Container in RFC7895 (pre-NMDA) YANG Library.
- */
- RFC7895("modules-state");
-
- private final String localName;
-
- ContainerName(final String localName) {
- this.localName = requireNonNull(localName);
- }
-
- public String getLocalName() {
- return localName;
- }
-
- public static ContainerName ofLocalName(final String localName) {
- final var ret = forLocalName(localName);
- if (ret == null) {
- throw new IllegalArgumentException("Unrecognized container name '" + localName + "'");
- }
- return ret;
- }
-
- public static @Nullable ContainerName forLocalName(final String localName) {
- return switch (localName) {
- case "yang-library" -> RFC8525;
- case "modules-state" -> RFC7895;
- default -> null;
- };
- }
- }
-
private YangLibraryConstants() {
// Hidden
}
import java.util.Optional;
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.yangtools.concepts.AbstractSimpleIdentifiable;
-import org.opendaylight.yangtools.rfc8528.data.api.MountPointChild;
-import org.opendaylight.yangtools.rfc8528.data.api.MountPointContext;
-import org.opendaylight.yangtools.rfc8528.data.api.MountPointContextFactory;
import org.opendaylight.yangtools.rfc8528.data.api.MountPointIdentifier;
-import org.opendaylight.yangtools.rfc8528.data.api.YangLibraryConstants.ContainerName;
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointChild;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointContext;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointContextFactory;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointException;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.parser.api.YangParserException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Override
public final MountPointContext createContext(final Map<ContainerName, MountPointChild> libraryContainers,
- final MountPointChild schemaMounts) throws YangParserException {
+ final MountPointChild schemaMounts) throws MountPointException {
for (Entry<ContainerName, MountPointChild> entry : libraryContainers.entrySet()) {
// Context for the specific code word
try {
libData = entry.getValue().normalizeTo(optLibContext.orElseThrow());
} catch (IOException e) {
- throw new YangParserException("Failed to interpret yang-library data", e);
+ throw new MountPointException("Failed to interpret yang-library data", e);
}
- if (!(libData instanceof ContainerNode)) {
- throw new YangParserException("Invalid yang-library non-container " + libData);
+ if (!(libData instanceof ContainerNode libContainer)) {
+ throw new MountPointException("Invalid yang-library non-container " + libData);
}
- final EffectiveModelContext schemaContext = bindLibrary(entry.getKey(), (ContainerNode) libData);
+ final EffectiveModelContext schemaContext = bindLibrary(entry.getKey(), libContainer);
if (schemaMounts == null) {
return new EmptyMountPointContext(schemaContext);
}
try {
mountData = schemaMounts.normalizeTo(schemaContext);
} catch (IOException e) {
- throw new YangParserException("Failed to interpret schema-mount data", e);
+ throw new MountPointException("Failed to interpret schema-mount data", e);
}
if (!(mountData instanceof ContainerNode)) {
- throw new YangParserException("Invalid schema-mount non-container " + mountData);
+ throw new MountPointException("Invalid schema-mount non-container " + mountData);
}
return createMountPointContext(schemaContext, (ContainerNode) mountData);
}
- throw new YangParserException("Failed to interpret " + libraryContainers);
+ throw new MountPointException("Failed to interpret " + libraryContainers);
}
protected abstract @NonNull MountPointContext createMountPointContext(@NonNull EffectiveModelContext schemaContext,
* @param libData Top-level YANG Library container data
* @return An assembled MountPointContext
* @throws NullPointerException if container is null
- * @throws YangParserException if the schema context cannot be assembled
+ * @throws MountPointException if the schema context cannot be assembled
*/
protected abstract @NonNull EffectiveModelContext bindLibrary(@NonNull ContainerName containerName,
- @NonNull ContainerNode libData) throws YangParserException;
+ @NonNull ContainerNode libData) throws MountPointException;
/**
* Return the schema in which YANG Library container content should be interpreted.
import java.util.stream.Collectors;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.opendaylight.yangtools.concepts.Immutable;
-import org.opendaylight.yangtools.rfc8528.data.api.MountPointContext;
-import org.opendaylight.yangtools.rfc8528.data.api.MountPointContextFactory;
import org.opendaylight.yangtools.rfc8528.data.api.MountPointIdentifier;
import org.opendaylight.yangtools.rfc8528.model.api.MountPointLabel;
import org.opendaylight.yangtools.rfc8528.model.api.SchemaMountConstants;
import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointContext;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointContextFactory;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.slf4j.Logger;
import com.google.common.annotations.Beta;
import java.util.Optional;
-import org.opendaylight.yangtools.rfc8528.data.api.MountPointContext;
-import org.opendaylight.yangtools.rfc8528.data.api.MountPointContextFactory;
import org.opendaylight.yangtools.rfc8528.model.api.MountPointLabel;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointContext;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointContextFactory;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
import org.opendaylight.yangtools.yang.model.spi.AbstractEffectiveModelContextProvider;
import java.util.Optional;
import java.util.function.Function;
import org.opendaylight.yangtools.concepts.Immutable;
-import org.opendaylight.yangtools.rfc8528.data.api.MountPointContext;
-import org.opendaylight.yangtools.rfc8528.data.api.MountPointContextFactory;
import org.opendaylight.yangtools.rfc8528.data.util.AbstractMountPointContextFactory.MountPointDefinition;
import org.opendaylight.yangtools.rfc8528.model.api.MountPointLabel;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointContext;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointContextFactory;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
import org.opendaylight.yangtools.yang.model.spi.AbstractEffectiveModelContextProvider;
import org.opendaylight.yangtools.concepts.AbstractIdentifiable;
import org.opendaylight.yangtools.concepts.Immutable;
import org.opendaylight.yangtools.concepts.PrettyTree;
-import org.opendaylight.yangtools.rfc8528.data.api.MountPointContext;
import org.opendaylight.yangtools.rfc8528.data.api.MountPointIdentifier;
import org.opendaylight.yangtools.rfc8528.data.api.MountPointNode;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointContext;
import org.opendaylight.yangtools.yang.data.spi.node.NormalizedNodePrettyTree;
@Beta
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.immutables</groupId>
+ <artifactId>value</artifactId>
+ <classifier>annotations</classifier>
+ </dependency>
<dependency>
<groupId>org.opendaylight.yangtools</groupId>
<artifactId>concepts</artifactId>
<artifactId>yang-model-util</artifactId>
</dependency>
<dependency>
- <groupId>org.immutables</groupId>
- <artifactId>value</artifactId>
- <classifier>annotations</classifier>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>rfc8528-model-api</artifactId>
</dependency>
<dependency>
requires transitive org.opendaylight.yangtools.util;
requires transitive org.opendaylight.yangtools.yang.common;
requires transitive org.opendaylight.yangtools.yang.model.api;
+ requires transitive org.opendaylight.yangtools.rfc8528.model.api;
requires org.opendaylight.yangtools.yang.model.util;
requires org.slf4j;
* 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.rfc8528.data.api;
+package org.opendaylight.yangtools.yang.data.api.schema;
import com.google.common.annotations.Beta;
import java.io.IOException;
import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizableAnydata;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
/**
* An unresolved child within a mount point. This is similar in functionality to {@link NormalizableAnydata}, but
- * rather than normalizing, the data is fed into a combination of a EffectiveModelContext and
+ * rather than normalizing, the data is fed into a combination of an EffectiveModelContext and a
* NormalizedNodeStreamWriter.
*/
@Beta
* 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.rfc8528.data.api;
+package org.opendaylight.yangtools.yang.data.api.schema;
import com.google.common.annotations.Beta;
import java.util.Optional;
--- /dev/null
+/*
+ * Copyright (c) 2019 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.data.api.schema;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.annotations.Beta;
+import java.util.Map;
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+
+/**
+ * An entity able to resolve the SchemaContext for embedded mount points based on generic data provided by the current
+ * interpretation context.
+ */
+@Beta
+@NonNullByDefault
+public interface MountPointContextFactory {
+ /**
+ * Top-level containers which hold YANG Library information, ordered by descending preference, with more modern
+ * and/or preferred entries first.
+ */
+ enum ContainerName {
+ // Note: order this enum from most-preferred to least-preferred name
+ /**
+ * Container in RFC8525 (NMDA) YANG Library.
+ */
+ RFC8525("yang-library"),
+ /**
+ * Container in RFC7895 (pre-NMDA) YANG Library.
+ */
+ RFC7895("modules-state");
+
+ private final String localName;
+
+ ContainerName(final String localName) {
+ this.localName = requireNonNull(localName);
+ }
+
+ public String getLocalName() {
+ return localName;
+ }
+
+ public static ContainerName ofLocalName(final String localName) {
+ final var ret = forLocalName(localName);
+ if (ret == null) {
+ throw new IllegalArgumentException("Unrecognized container name '" + localName + "'");
+ }
+ return ret;
+ }
+
+ public static @Nullable ContainerName forLocalName(final String localName) {
+ return switch (localName) {
+ case "yang-library" -> RFC8525;
+ case "modules-state" -> RFC7895;
+ default -> null;
+ };
+ }
+ }
+
+ /**
+ * Create a mount point context based on available information. Implementations are expected to attempt to interpret
+ * provided data to their best of their ability.
+ *
+ * @param libraryContainers available YANG library containers in opaque format
+ * @param schemaMounts the content of 'schema-mounts' container, if available
+ * @return A {@link MountPointContext}
+ * @throws MountPointException if the schema cannot be assembled
+ */
+ MountPointContext createContext(Map<ContainerName, MountPointChild> libraryContainers,
+ @Nullable MountPointChild schemaMounts) throws MountPointException;
+}
--- /dev/null
+/*
+ * Copyright (c) 2023 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.data.api.schema;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.annotations.Beta;
+
+/**
+ * Exception thrown when a mount-point-related operation cannot be performed.
+ */
+@Beta
+public class MountPointException extends Exception {
+ @java.io.Serial
+ private static final long serialVersionUID = 1L;
+
+ public MountPointException(final String message) {
+ super(requireNonNull(message));
+ }
+
+ public MountPointException(final String message, final Throwable cause) {
+ super(requireNonNull(message), cause);
+ }
+}
import com.google.common.annotations.Beta;
import java.io.IOException;
-import org.opendaylight.yangtools.rfc8528.data.api.MountPointChild;
import org.opendaylight.yangtools.rfc8528.data.util.EmptyMountPointContext;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointChild;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
import com.google.common.collect.ClassToInstanceMap;
import com.google.common.collect.ImmutableClassToInstanceMap;
import java.io.IOException;
-import org.opendaylight.yangtools.rfc8528.data.api.MountPointContext;
import org.opendaylight.yangtools.rfc8528.data.api.MountPointIdentifier;
import org.opendaylight.yangtools.rfc8528.data.api.StreamWriterMountPointExtension;
import org.opendaylight.yangtools.rfc8528.data.util.ImmutableMountPointNode;
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointContext;
import org.opendaylight.yangtools.yang.data.api.schema.stream.ForwardingNormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriterExtension;
import com.google.common.annotations.Beta;
import java.io.IOException;
-import org.opendaylight.yangtools.rfc8528.data.api.MountPointContextFactory;
import org.opendaylight.yangtools.rfc8528.data.api.MountPointIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointContextFactory;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.data.api.schema.stream.StreamWriterMetadataExtension;
import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
import java.util.Map;
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.yangtools.concepts.AbstractSimpleIdentifiable;
-import org.opendaylight.yangtools.rfc8528.data.api.MountPointChild;
-import org.opendaylight.yangtools.rfc8528.data.api.MountPointContext;
-import org.opendaylight.yangtools.rfc8528.data.api.MountPointContextFactory;
import org.opendaylight.yangtools.rfc8528.data.api.MountPointIdentifier;
import org.opendaylight.yangtools.rfc8528.data.api.StreamWriterMountPointExtension;
-import org.opendaylight.yangtools.rfc8528.data.api.YangLibraryConstants.ContainerName;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointChild;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointContext;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointContextFactory;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointContextFactory.ContainerName;
+import org.opendaylight.yangtools.yang.data.api.schema.MountPointException;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
-import org.opendaylight.yangtools.yang.parser.api.YangParserException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
final MountPointContext mountCtx;
try {
mountCtx = contextFactory.createContext(yangLib, schemaMounts);
- } catch (YangParserException e) {
+ } catch (MountPointException e) {
throw new IOException("Failed to resolve mount point " + getIdentifier(), e);
}
try (NormalizedNodeStreamWriter nestedWriter = mountWriter.startMountPoint(getIdentifier(), mountCtx)) {