Move MountPoint{Child,Context,ContextFactory} 94/105994/6
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 16 May 2023 16:27:43 +0000 (18:27 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 16 May 2023 21:40:05 +0000 (23:40 +0200)
This makes a step towards re-integrating mount points by explicitly
making them know in yang-data-api. Also removes the dependency on
yang-parser-api by adding a dedicated checked exception.

JIRA: YANGTOOLS-1172
Change-Id: I5c6fa5b86d76e7fe4d3e13e1a76e70eb2f1b6177
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
23 files changed:
codec/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java
codec/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/DOMSourceMountPointChild.java
codec/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlCodecFactory.java
codec/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java
data/rfc8528-data-api/src/main/java/org/opendaylight/yangtools/rfc8528/data/api/MountPointContextFactory.java [deleted file]
data/rfc8528-data-api/src/main/java/org/opendaylight/yangtools/rfc8528/data/api/MountPointNode.java
data/rfc8528-data-api/src/main/java/org/opendaylight/yangtools/rfc8528/data/api/StreamWriterMountPointExtension.java
data/rfc8528-data-api/src/main/java/org/opendaylight/yangtools/rfc8528/data/api/YangLibraryConstants.java
data/rfc8528-data-util/src/main/java/org/opendaylight/yangtools/rfc8528/data/util/AbstractDynamicMountPointContextFactory.java
data/rfc8528-data-util/src/main/java/org/opendaylight/yangtools/rfc8528/data/util/AbstractMountPointContextFactory.java
data/rfc8528-data-util/src/main/java/org/opendaylight/yangtools/rfc8528/data/util/EmptyMountPointContext.java
data/rfc8528-data-util/src/main/java/org/opendaylight/yangtools/rfc8528/data/util/ImmutableMountPointContext.java
data/rfc8528-data-util/src/main/java/org/opendaylight/yangtools/rfc8528/data/util/ImmutableMountPointNode.java
data/yang-data-api/pom.xml
data/yang-data-api/src/main/java/module-info.java
data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/MountPointChild.java [moved from data/rfc8528-data-api/src/main/java/org/opendaylight/yangtools/rfc8528/data/api/MountPointChild.java with 88% similarity]
data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/MountPointContext.java [moved from data/rfc8528-data-api/src/main/java/org/opendaylight/yangtools/rfc8528/data/api/MountPointContext.java with 98% similarity]
data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/MountPointContextFactory.java [new file with mode: 0644]
data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/MountPointException.java [new file with mode: 0644]
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/AbstractMountPointChild.java
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ImmutableMountPointNormalizedNodeStreamWriter.java
data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AbstractMountPointDataWithSchema.java
data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/MountPointData.java

index 811e5adfda15a9ddea01a6094932ed4adf0b2418..d8d2b51d5910f6102d71071277a5eb9949135f7b 100644 (file)
@@ -20,7 +20,6 @@ import java.util.regex.Pattern;
 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;
@@ -28,6 +27,7 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.Augmentat
 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;
index 637658b23122f5088b320e4d29666c0f5abf4663..ae7263e7c9e5a642b126e1ac7e171c216dfb6e6f 100644 (file)
@@ -14,7 +14,7 @@ import javax.xml.stream.XMLStreamException;
 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;
 
index 95a9262623b5ddfc024d400923c4966edb237a6b..4f3dbab6e64bd5ff24f0f6b5bff829cf780d2568 100644 (file)
@@ -12,10 +12,10 @@ import static java.util.Objects.requireNonNull;
 
 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;
index 4ce7eeab09464b8dcc48013343d46451ed6c4d45..252ab32a722c2500692a80dc58771204671eaeb3 100644 (file)
@@ -42,16 +42,16 @@ import javax.xml.transform.dom.DOMResult;
 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;
diff --git a/data/rfc8528-data-api/src/main/java/org/opendaylight/yangtools/rfc8528/data/api/MountPointContextFactory.java b/data/rfc8528-data-api/src/main/java/org/opendaylight/yangtools/rfc8528/data/api/MountPointContextFactory.java
deleted file mode 100644 (file)
index 0823e0c..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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;
-}
index 946a68445c7cc057124e01741394972b6fa40d74..1defc2c19323a14ce0e296db96d486f5bf53c602 100644 (file)
@@ -12,6 +12,7 @@ import org.eclipse.jdt.annotation.NonNull;
 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.
index 946035cbdd7010e247ee4f2c3235df25f6519721..c6712b2ff0128e3ab642780b7f808af99500e09a 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.yangtools.rfc8528.data.api;
 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;
 
index 40d505332485c2d4a3a603f50bb2d65a2f7a7b1e..9448abb5b040222b01b9644e2373b256bd266e0c 100644 (file)
@@ -7,11 +7,8 @@
  */
 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;
 
 /**
@@ -43,48 +40,6 @@ public final class YangLibraryConstants {
      */
     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
     }
index 31ad72e2f9784c112ede224c79c172f42dd936fc..f65dd1dd83ff5035d1cbf2c31df5a9984019b863 100644 (file)
@@ -14,15 +14,14 @@ import java.util.Map.Entry;
 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;
 
@@ -41,7 +40,7 @@ public abstract class AbstractDynamicMountPointContextFactory extends AbstractSi
 
     @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
@@ -56,13 +55,13 @@ public abstract class AbstractDynamicMountPointContextFactory extends AbstractSi
             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);
             }
@@ -71,16 +70,16 @@ public abstract class AbstractDynamicMountPointContextFactory extends AbstractSi
             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,
@@ -93,10 +92,10 @@ public abstract class AbstractDynamicMountPointContextFactory extends AbstractSi
      * @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.
index 5376e9069450ef444f22de63b556e477cfc13b40..3c10711336156a123b621dd79a1a56d3ad21ef2a 100644 (file)
@@ -16,8 +16,6 @@ import java.util.Iterator;
 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;
@@ -29,6 +27,8 @@ 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.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;
index a7a3170caafff2741c496bb067e7fb435ee71d18..7959c1c50847676569a675d077c2cc2cdfcb6ae1 100644 (file)
@@ -9,9 +9,9 @@ package org.opendaylight.yangtools.rfc8528.data.util;
 
 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;
 
index 776039824513d3be39647c1ddedee3aaadab9935..c8d593428c391e7acee486fc8543d7814650f6c1 100644 (file)
@@ -15,10 +15,10 @@ import com.google.common.collect.Maps;
 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;
 
index 3b937644d37e865e4df3c2b4a86cf773f409363a..4b6d79d91855b3d1cee42e04567c8cffc8bf7653 100644 (file)
@@ -16,12 +16,12 @@ import org.eclipse.jdt.annotation.NonNull;
 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
index 578711e6416ea5fb92220da68e9ad3cb188ecccb..605f9a2bfa877d1158c021995ceb0a4b71ac8764 100644 (file)
             <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>
@@ -47,9 +52,8 @@
             <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>
index 1c8c7cd8b57303a0b9f1afb795adae3c6a78454e..e1ded32976de187a5a4af28897975926c410045f 100644 (file)
@@ -19,6 +19,7 @@ module org.opendaylight.yangtools.yang.data.api {
     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;
 
similarity index 88%
rename from data/rfc8528-data-api/src/main/java/org/opendaylight/yangtools/rfc8528/data/api/MountPointChild.java
rename to data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/MountPointChild.java
index 277482d60af7fe97578a9203bd9088f00e907607..32e1c5af6817105504150ca29ee598cf5b19fa26 100644 (file)
@@ -5,19 +5,17 @@
  * 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
similarity index 98%
rename from data/rfc8528-data-api/src/main/java/org/opendaylight/yangtools/rfc8528/data/api/MountPointContext.java
rename to data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/MountPointContext.java
index d8ab87d8502c9f2045bdb75e462620145cfe0f18..304d8a0f82e85279257f10723bc8d97010f5ceec 100644 (file)
@@ -5,7 +5,7 @@
  * 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;
diff --git a/data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/MountPointContextFactory.java b/data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/MountPointContextFactory.java
new file mode 100644 (file)
index 0000000..dcd007a
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * 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;
+}
diff --git a/data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/MountPointException.java b/data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/MountPointException.java
new file mode 100644 (file)
index 0000000..136357f
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * 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);
+    }
+}
index e9e29d50843c2877dd45e8a09cefd348e31393fd..e61f7ac547d15c42d44b7e1481ce272ce29323dd 100644 (file)
@@ -9,8 +9,8 @@ package org.opendaylight.yangtools.yang.data.impl.schema;
 
 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;
index 78fc599b1cd141b72b042976244ed0f37d9b8f93..53f90ed9175ba31ee9815986393019db021b6ac7 100644 (file)
@@ -11,11 +11,11 @@ import com.google.common.annotations.Beta;
 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;
index 7f73ef74f6387e3cf6e3ee294b2713977d112f7f..213ccb27d32144a6bf977aa55eda2f84a6801cd2 100644 (file)
@@ -11,8 +11,8 @@ import static com.google.common.base.Preconditions.checkState;
 
 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;
index be04e0719007e660ab0f1128a014ee9eab7c4e5e..a77c0ee2e47626f860a3118d2683e4053c851675 100644 (file)
@@ -18,14 +18,14 @@ import java.util.List;
 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;
 
@@ -74,7 +74,7 @@ public final class MountPointData extends AbstractSimpleIdentifiable<MountPointI
         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)) {