Use DatabindContext in InstanceIdentifierContext 78/109078/4
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 27 Nov 2023 21:31:13 +0000 (22:31 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 27 Nov 2023 23:50:28 +0000 (00:50 +0100)
We are moving towards elimination of InstanceIdentifierContext, but
before we do that we need to make sure surrounding code passes around
DatabindContext instead of EffectiveModelContext.

This brings immediate an immediate benefit to YANG Patch body parsing,
as it can pick up the DataSchemaContextTree from DatabindContext.

JIRA: NETCONF-1157
Change-Id: I240cc150a7feab6e7344beefc863eb761d8e30d1
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
19 files changed:
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/databind/JsonPatchBody.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/databind/PatchBody.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/databind/XmlPatchBody.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/legacy/InstanceIdentifierContext.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/MdsalRestconfStrategy.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/NetconfRestconfStrategy.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/RestconfStrategy.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/utils/parser/ParserIdentifier.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/MdsalRestconfServer.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/AbstractInstanceIdentifierTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/AbstractJukeboxTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/databind/AbstractPatchBodyTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/databind/AbstractResourceBodyTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/databind/ResourceBodyTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/databind/jaxrs/QueryParamsTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/MdsalRestconfStrategyTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/NetconfRestconfStrategyTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/utils/parser/AbstractFieldsTranslatorTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/server/mdsal/MdsalRestconfServerTest.java

index bfe18c803657d2cf945c3f35157568b96226fd9d..e0797ef9a6c20243d52be272d8a861fa95805184 100644 (file)
@@ -36,10 +36,8 @@ import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
 import org.opendaylight.yangtools.yang.data.codec.gson.JsonParserStream;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizationResultHolder;
-import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
-import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference;
 
 public final class JsonPatchBody extends PatchBody {
@@ -48,19 +46,18 @@ public final class JsonPatchBody extends PatchBody {
     }
 
     @Override
-    PatchContext toPatchContext(final EffectiveModelContext context, final YangInstanceIdentifier urlPath,
+    PatchContext toPatchContext(final DatabindContext databind, final YangInstanceIdentifier urlPath,
             final InputStream inputStream) throws IOException {
         try (var jsonReader = new JsonReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {
             final var patchId = new AtomicReference<String>();
-            final var resultList = read(jsonReader, context, urlPath, patchId);
+            final var resultList = read(jsonReader, databind, urlPath, patchId);
             // Note: patchId side-effect of above
             return new PatchContext(patchId.get(), resultList);
         }
     }
 
-    private static ImmutableList<PatchEntity> read(final JsonReader in, final EffectiveModelContext context,
+    private static ImmutableList<PatchEntity> read(final JsonReader in, final DatabindContext databind,
             final YangInstanceIdentifier urlPath, final AtomicReference<String> patchId) throws IOException {
-        final var schemaTree = DataSchemaContextTree.from(context);
         final var edits = ImmutableList.<PatchEntity>builder();
         final var edit = new PatchEdit();
 
@@ -85,7 +82,7 @@ public final class JsonPatchBody extends PatchBody {
                 case END_DOCUMENT:
                     break;
                 case NAME:
-                    parseByName(in.nextName(), edit, in, urlPath, schemaTree, edits, patchId);
+                    parseByName(in.nextName(), edit, in, urlPath, databind, edits, patchId);
                     break;
                 case END_OBJECT:
                     in.endObject();
@@ -105,7 +102,7 @@ public final class JsonPatchBody extends PatchBody {
     // Switch value of parsed JsonToken.NAME and read edit definition or patch id
     private static void parseByName(final @NonNull String name, final @NonNull PatchEdit edit,
             final @NonNull JsonReader in, final @NonNull YangInstanceIdentifier urlPath,
-            final @NonNull DataSchemaContextTree schemaTree, final @NonNull Builder<PatchEntity> resultCollection,
+            final @NonNull DatabindContext databind, final @NonNull Builder<PatchEntity> resultCollection,
             final @NonNull AtomicReference<String> patchId) throws IOException {
         switch (name) {
             case "edit":
@@ -113,14 +110,14 @@ public final class JsonPatchBody extends PatchBody {
                     in.beginArray();
 
                     while (in.hasNext()) {
-                        readEditDefinition(edit, in, urlPath, schemaTree);
+                        readEditDefinition(edit, in, urlPath, databind);
                         resultCollection.add(prepareEditOperation(edit));
                         edit.clear();
                     }
 
                     in.endArray();
                 } else {
-                    readEditDefinition(edit, in, urlPath, schemaTree);
+                    readEditDefinition(edit, in, urlPath, databind);
                     resultCollection.add(prepareEditOperation(edit));
                     edit.clear();
                 }
@@ -136,7 +133,7 @@ public final class JsonPatchBody extends PatchBody {
 
     // Read one patch edit object from JSON input
     private static void readEditDefinition(final @NonNull PatchEdit edit, final @NonNull JsonReader in,
-            final @NonNull YangInstanceIdentifier urlPath, final @NonNull DataSchemaContextTree schemaTree)
+            final @NonNull YangInstanceIdentifier urlPath, final @NonNull DatabindContext databind)
                 throws IOException {
         String deferredValue = null;
         in.beginObject();
@@ -152,14 +149,14 @@ public final class JsonPatchBody extends PatchBody {
                     break;
                 case "target":
                     // target can be specified completely in request URI
-                    edit.setTarget(parsePatchTarget(schemaTree.getEffectiveModelContext(), urlPath, in.nextString()));
-                    final var stack = schemaTree.enterPath(edit.getTarget()).orElseThrow().stack();
+                    edit.setTarget(parsePatchTarget(databind, urlPath, in.nextString()));
+                    final var stack = databind.schemaTree().enterPath(edit.getTarget()).orElseThrow().stack();
                     if (!stack.isEmpty()) {
                         stack.exit();
                     }
 
                     if (!stack.isEmpty()) {
-                        final EffectiveStatement<?, ?> parentStmt = stack.currentStatement();
+                        final var parentStmt = stack.currentStatement();
                         verify(parentStmt instanceof SchemaNode, "Unexpected parent %s", parentStmt);
                     }
                     edit.setTargetSchemaNode(stack.toInference());
@@ -174,8 +171,7 @@ public final class JsonPatchBody extends PatchBody {
                         deferredValue = readValueNode(in);
                     } else {
                         // We have a target schema node, reuse this reader without buffering the value.
-                        edit.setData(readEditData(in, edit.getTargetSchemaNode(),
-                            schemaTree.getEffectiveModelContext()));
+                        edit.setData(readEditData(in, edit.getTargetSchemaNode(), databind.modelContext()));
                     }
                     break;
                 default:
@@ -189,7 +185,7 @@ public final class JsonPatchBody extends PatchBody {
         if (deferredValue != null) {
             // read saved data to normalized node when target schema is already known
             edit.setData(readEditData(new JsonReader(new StringReader(deferredValue)), edit.getTargetSchemaNode(),
-                schemaTree.getEffectiveModelContext()));
+                databind.modelContext()));
         }
     }
 
index e00bb0165434965fad6cccef1732785461835613..151dba80b66dc34e3832288995cc4521c5b3558a 100644 (file)
@@ -22,7 +22,6 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.patch.
 import org.opendaylight.yangtools.yang.common.ErrorTag;
 import org.opendaylight.yangtools.yang.common.ErrorType;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 
 /**
  * A YANG Patch body.
@@ -32,17 +31,17 @@ public abstract sealed class PatchBody extends AbstractBody permits JsonPatchBod
         super(inputStream);
     }
 
-    public final @NonNull PatchContext toPatchContext(final @NonNull EffectiveModelContext context,
+    public final @NonNull PatchContext toPatchContext(final @NonNull DatabindContext databind,
             final @NonNull YangInstanceIdentifier urlPath) throws IOException {
         try (var is = acquireStream()) {
-            return toPatchContext(context, urlPath, is);
+            return toPatchContext(databind, urlPath, is);
         }
     }
 
-    abstract @NonNull PatchContext toPatchContext(@NonNull EffectiveModelContext context,
+    abstract @NonNull PatchContext toPatchContext(@NonNull DatabindContext databind,
         @NonNull YangInstanceIdentifier urlPath, @NonNull InputStream inputStream) throws IOException;
 
-    static final YangInstanceIdentifier parsePatchTarget(final EffectiveModelContext context,
+    static final YangInstanceIdentifier parsePatchTarget(final DatabindContext databind,
             final YangInstanceIdentifier urlPath, final String target) {
         if (target.equals("/")) {
             verify(!urlPath.isEmpty(),
@@ -54,11 +53,12 @@ public abstract sealed class PatchBody extends AbstractBody permits JsonPatchBod
         if (urlPath.isEmpty()) {
             targetUrl = target.startsWith("/") ? target.substring(1) : target;
         } else {
-            targetUrl = IdentifierCodec.serialize(urlPath, context) + target;
+            targetUrl = IdentifierCodec.serialize(urlPath, databind.modelContext()) + target;
         }
 
         try {
-            return InstanceIdentifierContext.ofApiPath(ApiPath.parse(targetUrl), context, null).getInstanceIdentifier();
+            return InstanceIdentifierContext.ofApiPath(ApiPath.parse(targetUrl), databind, null)
+                .getInstanceIdentifier();
         } catch (ParseException | RestconfDocumentedException e) {
             throw new RestconfDocumentedException("Failed to parse target " + target,
                 ErrorType.RPC, ErrorTag.MALFORMED_MESSAGE, e);
index 9befa366348f9bdfa2ae4de5649ecb366459d078..a6f7c17ab7ae5056c2a1f777d563039a4f7d0dbb 100644 (file)
@@ -26,12 +26,9 @@ import org.opendaylight.yangtools.yang.common.ErrorTag;
 import org.opendaylight.yangtools.yang.common.ErrorType;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
-import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.data.codec.xml.XmlParserStream;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizationResultHolder;
-import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.w3c.dom.Document;
@@ -47,10 +44,10 @@ public final class XmlPatchBody extends PatchBody {
     }
 
     @Override
-    PatchContext toPatchContext(final EffectiveModelContext context, final YangInstanceIdentifier urlPath,
+    PatchContext toPatchContext(final DatabindContext databind, final YangInstanceIdentifier urlPath,
             final InputStream inputStream) throws IOException {
         try {
-            return parse(context, urlPath, UntrustedXML.newDocumentBuilder().parse(inputStream));
+            return parse(databind, urlPath, UntrustedXML.newDocumentBuilder().parse(inputStream));
         } catch (XMLStreamException | SAXException | URISyntaxException e) {
             LOG.debug("Failed to parse YANG Patch XML", e);
             throw new RestconfDocumentedException("Error parsing YANG Patch XML: " + e.getMessage(), ErrorType.PROTOCOL,
@@ -58,13 +55,11 @@ public final class XmlPatchBody extends PatchBody {
         }
     }
 
-    private static @NonNull PatchContext parse(final EffectiveModelContext context,
-            final YangInstanceIdentifier urlPath, final Document doc)
-                throws XMLStreamException, IOException, SAXException, URISyntaxException {
+    private static @NonNull PatchContext parse(final DatabindContext databind, final YangInstanceIdentifier urlPath,
+            final Document doc) throws XMLStreamException, IOException, SAXException, URISyntaxException {
         final var entities = ImmutableList.<PatchEntity>builder();
         final var patchId = doc.getElementsByTagName("patch-id").item(0).getFirstChild().getNodeValue();
         final var editNodes = doc.getElementsByTagName("edit");
-        final var schemaTree = DataSchemaContextTree.from(context);
 
         for (int i = 0; i < editNodes.getLength(); i++) {
             final Element element = (Element) editNodes.item(i);
@@ -76,9 +71,9 @@ public final class XmlPatchBody extends PatchBody {
             final Element firstValueElement = values != null ? values.get(0) : null;
 
             // find complete path to target, it can be also empty (only slash)
-            final var targetII = parsePatchTarget(context, urlPath, target);
+            final var targetII = parsePatchTarget(databind, urlPath, target);
             // move schema node
-            final var lookup = schemaTree.enterPath(targetII).orElseThrow();
+            final var lookup = databind.schemaTree().enterPath(targetII).orElseThrow();
 
             final var stack = lookup.stack();
             final var inference = stack.toInference();
@@ -87,9 +82,9 @@ public final class XmlPatchBody extends PatchBody {
             }
 
             if (requiresValue(oper)) {
-                final NormalizationResultHolder resultHolder = new NormalizationResultHolder();
-                final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder);
-                final XmlParserStream xmlParser = XmlParserStream.create(writer, inference);
+                final var resultHolder = new NormalizationResultHolder();
+                final var writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder);
+                final var xmlParser = XmlParserStream.create(writer, inference);
                 xmlParser.traverse(new DOMSource(firstValueElement));
 
                 final var result = resultHolder.getResult().data();
index ea61a33f74c4ec1d9ad9e3884a3cc391cfe5294b..4df6d9b8aeba84c1361a9db2a8a87a03574119c6 100644 (file)
@@ -20,12 +20,12 @@ import org.opendaylight.mdsal.dom.api.DOMSchemaService;
 import org.opendaylight.restconf.api.ApiPath;
 import org.opendaylight.restconf.api.ApiPath.Step;
 import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
+import org.opendaylight.restconf.nb.rfc8040.databind.DatabindContext;
 import org.opendaylight.restconf.nb.rfc8040.utils.parser.IdentifierCodec;
 import org.opendaylight.restconf.nb.rfc8040.utils.parser.YangInstanceIdentifierDeserializer;
 import org.opendaylight.yangtools.yang.common.ErrorTag;
 import org.opendaylight.yangtools.yang.common.ErrorType;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
@@ -33,16 +33,8 @@ import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference
 
 public abstract class InstanceIdentifierContext {
     private static final class Root extends InstanceIdentifierContext {
-        private final @NonNull EffectiveModelContext context;
-
-        Root(final EffectiveModelContext context, final DOMMountPoint mountPoint) {
-            super(context, mountPoint);
-            this.context = requireNonNull(context);
-        }
-
-        @Override
-        public EffectiveModelContext getSchemaContext() {
-            return context;
+        Root(final DatabindContext databind, final DOMMountPoint mountPoint) {
+            super(databind, databind.modelContext(), mountPoint);
         }
 
         @Override
@@ -52,7 +44,7 @@ public abstract class InstanceIdentifierContext {
 
         @Override
         public Inference inference() {
-            return SchemaInferenceStack.of(context).toInference();
+            return SchemaInferenceStack.of(getSchemaContext()).toInference();
         }
     }
 
@@ -60,17 +52,17 @@ public abstract class InstanceIdentifierContext {
         private final @NonNull YangInstanceIdentifier path;
         private final @NonNull SchemaInferenceStack stack;
 
-        private DataPath(final SchemaNode schemaNode, final DOMMountPoint mountPoint,
+        private DataPath(final DatabindContext databind, final SchemaNode schemaNode, final DOMMountPoint mountPoint,
                 final SchemaInferenceStack stack, final YangInstanceIdentifier path) {
-            super(schemaNode, mountPoint);
+            super(databind, schemaNode, mountPoint);
             this.stack = requireNonNull(stack);
             this.path = requireNonNull(path);
         }
 
-        static @NonNull DataPath of(final EffectiveModelContext context, final YangInstanceIdentifier path,
+        static @NonNull DataPath of(final DatabindContext databind, final YangInstanceIdentifier path,
                 final DOMMountPoint mountPoint) {
-            final var nodeAndStack = DataSchemaContextTree.from(context).enterPath(path).orElseThrow();
-            return new DataPath(nodeAndStack.node().dataSchemaNode(), mountPoint, nodeAndStack.stack(), path);
+            final var nodeAndStack = databind.schemaTree().enterPath(path).orElseThrow();
+            return new DataPath(databind, nodeAndStack.node().dataSchemaNode(), mountPoint, nodeAndStack.stack(), path);
         }
 
         @Override
@@ -87,9 +79,9 @@ public abstract class InstanceIdentifierContext {
     private static final class WithoutDataPath extends InstanceIdentifierContext {
         private final @NonNull SchemaInferenceStack stack;
 
-        private WithoutDataPath(final SchemaNode schemaNode, final DOMMountPoint mountPoint,
-                final SchemaInferenceStack stack) {
-            super(schemaNode, mountPoint);
+        private WithoutDataPath(final DatabindContext databind, final SchemaNode schemaNode,
+                final DOMMountPoint mountPoint, final SchemaInferenceStack stack) {
+            super(databind, schemaNode, mountPoint);
             this.stack = requireNonNull(stack);
         }
 
@@ -104,23 +96,26 @@ public abstract class InstanceIdentifierContext {
         }
     }
 
+    private final @NonNull DatabindContext databind;
     private final @NonNull SchemaNode schemaNode;
     private final @Nullable DOMMountPoint mountPoint;
 
-    InstanceIdentifierContext(final SchemaNode schemaNode, final DOMMountPoint mountPoint) {
+    InstanceIdentifierContext(final DatabindContext databind, final SchemaNode schemaNode,
+            final DOMMountPoint mountPoint) {
+        this.databind = requireNonNull(databind);
         this.schemaNode = requireNonNull(schemaNode);
         this.mountPoint = mountPoint;
     }
 
     // FIXME: NETCONF-773: this recursion should really live in MdsalRestconfServer
-    public static @NonNull InstanceIdentifierContext ofApiPath(final ApiPath path,
-            final EffectiveModelContext modelContext, final DOMMountPointService mountPointService) {
+    public static @NonNull InstanceIdentifierContext ofApiPath(final ApiPath path, final DatabindContext databind,
+            final DOMMountPointService mountPointService) {
         final var steps = path.steps();
         final var limit = steps.size() - 1;
 
         var prefix = 0;
         DOMMountPoint currentMountPoint = null;
-        var currentModelContext = modelContext;
+        var currentDatabind = databind;
         while (prefix <= limit) {
             final var mount = indexOfMount(steps, prefix, limit);
             if (mount == -1) {
@@ -134,7 +129,7 @@ public abstract class InstanceIdentifierContext {
                     ErrorType.APPLICATION, ErrorTag.OPERATION_FAILED);
             }
 
-            final var mountPath = IdentifierCodec.deserialize(path.subPath(prefix, mount), modelContext);
+            final var mountPath = IdentifierCodec.deserialize(path.subPath(prefix, mount), databind.modelContext());
             final var userPath = path.subPath(0, mount);
             final var nextMountPoint = mountService.getMountPoint(mountPath)
                 .orElseThrow(() -> new RestconfDocumentedException("Mount point '" + userPath + "' does not exist",
@@ -150,12 +145,14 @@ public abstract class InstanceIdentifierContext {
             }
 
             prefix = mount + 1;
-            currentModelContext = nextModelContext;
+            currentDatabind = DatabindContext.ofModel(nextModelContext);
             currentMountPoint = nextMountPoint;
         }
 
-        final var result = YangInstanceIdentifierDeserializer.create(currentModelContext, path.subPath(prefix));
-        return InstanceIdentifierContext.ofPath(result.stack, result.node, result.path, currentMountPoint);
+        final var result = YangInstanceIdentifierDeserializer.create(currentDatabind.modelContext(),
+            path.subPath(prefix));
+        return InstanceIdentifierContext.ofPath(currentDatabind, result.stack, result.node, result.path,
+            currentMountPoint);
     }
 
     private static int indexOfMount(final ImmutableList<Step> steps, final int fromIndex, final int limit) {
@@ -168,24 +165,25 @@ public abstract class InstanceIdentifierContext {
         return -1;
     }
 
-    public static @NonNull InstanceIdentifierContext ofLocalRoot(final EffectiveModelContext context) {
-        return new Root(context, null);
+    public static @NonNull InstanceIdentifierContext ofLocalRoot(final DatabindContext databind) {
+        return new Root(databind, null);
     }
 
     @VisibleForTesting
-    public static @NonNull InstanceIdentifierContext ofLocalPath(final EffectiveModelContext context,
+    public static @NonNull InstanceIdentifierContext ofLocalPath(final DatabindContext databind,
             final YangInstanceIdentifier path) {
-        return DataPath.of(context, path, null);
+        return DataPath.of(databind, path, null);
     }
 
     // Invocations of various identifier-less details
-    public static @NonNull InstanceIdentifierContext ofStack(final SchemaInferenceStack stack) {
-        return ofStack(stack, null);
+    public static @NonNull InstanceIdentifierContext ofStack(final DatabindContext databind,
+            final SchemaInferenceStack stack) {
+        return ofStack(databind, stack, null);
     }
 
     // Invocations of various identifier-less details, potentially having a mount point
-    public static @NonNull InstanceIdentifierContext ofStack(final SchemaInferenceStack stack,
-            final @Nullable DOMMountPoint mountPoint) {
+    public static @NonNull InstanceIdentifierContext ofStack(final DatabindContext databind,
+            final SchemaInferenceStack stack, final @Nullable DOMMountPoint mountPoint) {
         final SchemaNode schemaNode;
         if (!stack.isEmpty()) {
             final var stmt = stack.currentStatement();
@@ -195,24 +193,28 @@ public abstract class InstanceIdentifierContext {
             schemaNode = stack.getEffectiveModelContext();
         }
 
-        return new WithoutDataPath(schemaNode, mountPoint, stack);
+        return new WithoutDataPath(databind, schemaNode, mountPoint, stack);
     }
 
-    public static @NonNull InstanceIdentifierContext ofPath(final SchemaInferenceStack stack,
-            final SchemaNode schemaNode, final YangInstanceIdentifier path,
+    public static @NonNull InstanceIdentifierContext ofPath(final DatabindContext databind,
+            final SchemaInferenceStack stack, final SchemaNode schemaNode, final YangInstanceIdentifier path,
             final @Nullable DOMMountPoint mountPoint) {
-        return new DataPath(schemaNode, mountPoint, stack, path);
+        return new DataPath(databind, schemaNode, mountPoint, stack, path);
     }
 
-    public static @NonNull InstanceIdentifierContext ofMountPointRoot(final DOMMountPoint mountPoint,
-            final EffectiveModelContext mountContext) {
-        return new Root(mountContext, requireNonNull(mountPoint));
+    public static @NonNull InstanceIdentifierContext ofMountPointRoot(final DatabindContext databind,
+            final DOMMountPoint mountPoint) {
+        return new Root(databind, requireNonNull(mountPoint));
     }
 
     @VisibleForTesting
-    public static @NonNull InstanceIdentifierContext ofMountPointPath(final DOMMountPoint mountPoint,
-            final EffectiveModelContext context, final YangInstanceIdentifier path) {
-        return DataPath.of(context, path, requireNonNull(mountPoint));
+    public static @NonNull InstanceIdentifierContext ofMountPointPath(final DatabindContext databind,
+            final DOMMountPoint mountPoint, final YangInstanceIdentifier path) {
+        return DataPath.of(databind, path, requireNonNull(mountPoint));
+    }
+
+    public final @NonNull DatabindContext databind() {
+        return databind;
     }
 
     public final @NonNull SchemaNode getSchemaNode() {
@@ -223,8 +225,9 @@ public abstract class InstanceIdentifierContext {
         return mountPoint;
     }
 
-    public @NonNull EffectiveModelContext getSchemaContext() {
-        return inference().getEffectiveModelContext();
+    @Deprecated(forRemoval = true)
+    public final @NonNull EffectiveModelContext getSchemaContext() {
+        return databind.modelContext();
     }
 
     public abstract @NonNull Inference inference();
index ef685dc441b25ec6d7770d24940dc022aace8872..b5429ebae7293d65b3180c6110bf35d1be2638ec 100644 (file)
@@ -27,6 +27,7 @@ import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
 import org.opendaylight.mdsal.dom.api.DOMYangTextSourceProvider;
 import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
 import org.opendaylight.restconf.common.errors.SettableRestconfFuture;
+import org.opendaylight.restconf.nb.rfc8040.databind.DatabindContext;
 import org.opendaylight.restconf.server.spi.RpcImplementation;
 import org.opendaylight.yangtools.yang.common.Empty;
 import org.opendaylight.yangtools.yang.common.ErrorTag;
@@ -34,7 +35,6 @@ import org.opendaylight.yangtools.yang.common.ErrorType;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 
 /**
  * Implementation of RESTCONF operations using {@link DOMTransactionChain} and related concepts.
@@ -45,16 +45,16 @@ import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 public final class MdsalRestconfStrategy extends RestconfStrategy {
     private final DOMDataBroker dataBroker;
 
-    public MdsalRestconfStrategy(final EffectiveModelContext modelContext, final DOMDataBroker dataBroker,
+    public MdsalRestconfStrategy(final DatabindContext databind, final DOMDataBroker dataBroker,
             final @Nullable DOMRpcService rpcService, final @Nullable DOMYangTextSourceProvider sourceProvider,
             final ImmutableMap<QName, RpcImplementation> localRpcs) {
-        super(modelContext, localRpcs, rpcService, sourceProvider);
+        super(databind, localRpcs, rpcService, sourceProvider);
         this.dataBroker = requireNonNull(dataBroker);
     }
 
-    public MdsalRestconfStrategy(final EffectiveModelContext modelContext, final DOMDataBroker dataBroker,
+    public MdsalRestconfStrategy(final DatabindContext databind, final DOMDataBroker dataBroker,
             final @Nullable DOMRpcService rpcService, final @Nullable  DOMYangTextSourceProvider sourceProvider) {
-        this(modelContext, dataBroker, rpcService, sourceProvider, ImmutableMap.of());
+        this(databind, dataBroker, rpcService, sourceProvider, ImmutableMap.of());
     }
 
     @Override
index 270a2b17a32d0155a77ad9afa40d0b131f86ffa2..5cb153844dd81a772f60ce3d1f0b30e20a960fd2 100644 (file)
@@ -25,10 +25,10 @@ import org.opendaylight.mdsal.dom.api.DOMRpcService;
 import org.opendaylight.mdsal.dom.api.DOMYangTextSourceProvider;
 import org.opendaylight.netconf.dom.api.NetconfDataTreeService;
 import org.opendaylight.restconf.common.errors.SettableRestconfFuture;
+import org.opendaylight.restconf.nb.rfc8040.databind.DatabindContext;
 import org.opendaylight.yangtools.yang.common.Empty;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 
 /**
  * Implementation of RESTCONF operations on top of a raw NETCONF backend.
@@ -38,10 +38,9 @@ import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 public final class NetconfRestconfStrategy extends RestconfStrategy {
     private final NetconfDataTreeService netconfService;
 
-    public NetconfRestconfStrategy(final EffectiveModelContext modelContext,
-            final NetconfDataTreeService netconfService, final @Nullable DOMRpcService rpcService,
-            final @Nullable DOMYangTextSourceProvider sourceProvider) {
-        super(modelContext, ImmutableMap.of(), rpcService, sourceProvider);
+    public NetconfRestconfStrategy(final DatabindContext databind, final NetconfDataTreeService netconfService,
+            final @Nullable DOMRpcService rpcService, final @Nullable DOMYangTextSourceProvider sourceProvider) {
+        super(databind, ImmutableMap.of(), rpcService, sourceProvider);
         this.netconfService = requireNonNull(netconfService);
     }
 
index dd981e857013ca4a7f275fd7599540be2c8ce8c4..03036b3316e48fa454bc59d48507b47bc56265be 100644 (file)
@@ -117,10 +117,9 @@ public abstract class RestconfStrategy {
     private final DOMYangTextSourceProvider sourceProvider;
     private final DOMRpcService rpcService;
 
-    RestconfStrategy(final EffectiveModelContext modelContext, final ImmutableMap<QName, RpcImplementation> localRpcs,
+    RestconfStrategy(final DatabindContext databind, final ImmutableMap<QName, RpcImplementation> localRpcs,
             final @Nullable DOMRpcService rpcService, final DOMYangTextSourceProvider sourceProvider) {
-        // FIXME: pass this down
-        databind = DatabindContext.ofModel(modelContext);
+        this.databind = requireNonNull(databind);
         this.localRpcs = requireNonNull(localRpcs);
         this.rpcService = rpcService;
         this.sourceProvider = sourceProvider;
@@ -129,12 +128,12 @@ public abstract class RestconfStrategy {
     /**
      * Look up the appropriate strategy for a particular mount point.
      *
-     * @param modelContext {@link EffectiveModelContext} of target mount point
+     * @param databind {@link DatabindContext} of target mount point
      * @param mountPoint Target mount point
      * @return A strategy, or null if the mount point does not expose a supported interface
      * @throws NullPointerException if any argument is {@code null}
      */
-    public static @Nullable RestconfStrategy forMountPoint(final EffectiveModelContext modelContext,
+    public static @Nullable RestconfStrategy forMountPoint(final DatabindContext databind,
             final DOMMountPoint mountPoint) {
         final var rpcService = mountPoint.getService(DOMRpcService.class).orElse(null);
         final var sourceProvider = mountPoint.getService(DOMSchemaService.class)
@@ -143,11 +142,11 @@ public abstract class RestconfStrategy {
 
         final var netconfService = mountPoint.getService(NetconfDataTreeService.class);
         if (netconfService.isPresent()) {
-            return new NetconfRestconfStrategy(modelContext, netconfService.orElseThrow(), rpcService, sourceProvider);
+            return new NetconfRestconfStrategy(databind, netconfService.orElseThrow(), rpcService, sourceProvider);
         }
         final var dataBroker = mountPoint.getService(DOMDataBroker.class);
         if (dataBroker.isPresent()) {
-            return new MdsalRestconfStrategy(modelContext, dataBroker.orElseThrow(), rpcService, sourceProvider);
+            return new MdsalRestconfStrategy(databind, dataBroker.orElseThrow(), rpcService, sourceProvider);
         }
         return null;
     }
index 6dfc80737cf10ba4a3cc3dfd4c83d4535ba8ea2d..aa53a98fa0e3ae17e4dc206d51eee10c10ba7751 100644 (file)
@@ -13,6 +13,7 @@ import org.opendaylight.mdsal.dom.api.DOMMountPoint;
 import org.opendaylight.mdsal.dom.api.DOMMountPointService;
 import org.opendaylight.restconf.api.ApiPath;
 import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
+import org.opendaylight.restconf.nb.rfc8040.databind.DatabindContext;
 import org.opendaylight.restconf.nb.rfc8040.legacy.InstanceIdentifierContext;
 import org.opendaylight.yangtools.yang.common.ErrorTag;
 import org.opendaylight.yangtools.yang.common.ErrorType;
@@ -53,6 +54,6 @@ final class ParserIdentifier {
             throw new RestconfDocumentedException(e.getMessage(), ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE, e);
         }
 
-        return InstanceIdentifierContext.ofApiPath(apiPath, schemaContext, mountPointService);
+        return InstanceIdentifierContext.ofApiPath(apiPath, DatabindContext.ofModel(schemaContext), mountPointService);
     }
 }
index ba5c0de83bc9ced0a98109cd774b5ee275a61e16..9b63d2388bad25155790bddbd9ed4a4f2ae10db7 100644 (file)
@@ -171,8 +171,7 @@ public final class MdsalRestconfServer
         this.localRpcs = Maps.uniqueIndex(localRpcs, RpcImplementation::qname);
         sourceProvider = schemaService.getExtensions().getInstance(DOMYangTextSourceProvider.class);
 
-        localStrategy = new MdsalRestconfStrategy(schemaService.getGlobalContext(), dataBroker, rpcService,
-            sourceProvider, this.localRpcs);
+        localStrategy = createLocalStrategy(schemaService.getGlobalContext());
         reg = schemaService.registerSchemaContextListener(this);
     }
 
@@ -191,22 +190,24 @@ public final class MdsalRestconfServer
     public void onModelContextUpdated(final EffectiveModelContext newModelContext) {
         final var local = localStrategy();
         if (!newModelContext.equals(local.modelContext())) {
-            LOCAL_STRATEGY.setRelease(this,
-                new MdsalRestconfStrategy(newModelContext, dataBroker, rpcService, sourceProvider, localRpcs));
+            LOCAL_STRATEGY.setRelease(this, createLocalStrategy(newModelContext));
         }
     }
 
+    private @NonNull MdsalRestconfStrategy createLocalStrategy(final EffectiveModelContext modelContext) {
+        return new MdsalRestconfStrategy(DatabindContext.ofModel(modelContext), dataBroker, rpcService, sourceProvider,
+            localRpcs);
+    }
+
     private @NonNull MdsalRestconfStrategy localStrategy() {
         return verifyNotNull((MdsalRestconfStrategy) LOCAL_STRATEGY.getAcquire(this));
     }
 
     @Deprecated(forRemoval = true)
-    private @NonNull MdsalRestconfStrategy localStrategy(final EffectiveModelContext modelContext) {
+    private @NonNull MdsalRestconfStrategy localStrategy(final DatabindContext databind) {
         final var local = localStrategy();
-        if (local.modelContext().equals(modelContext)) {
-            return local;
-        }
-        return new MdsalRestconfStrategy(modelContext, dataBroker, rpcService, sourceProvider, localRpcs);
+        return local.databind().equals(databind) ? local
+            : new MdsalRestconfStrategy(databind, dataBroker, rpcService, sourceProvider, localRpcs);
     }
 
     @PreDestroy
@@ -220,7 +221,7 @@ public final class MdsalRestconfServer
     @Override
     public RestconfFuture<Empty> dataDELETE(final ApiPath identifier) {
         final var reqPath = bindRequestPath(identifier);
-        final var strategy = getRestconfStrategy(reqPath.getSchemaContext(), reqPath.getMountPoint());
+        final var strategy = getRestconfStrategy(reqPath.databind(), reqPath.getMountPoint());
         return strategy.delete(reqPath.getInstanceIdentifier());
     }
 
@@ -253,7 +254,7 @@ public final class MdsalRestconfServer
         }
 
         final var fieldPaths = queryParams.fieldPaths();
-        final var strategy = getRestconfStrategy(reqPath.getSchemaContext(), reqPath.getMountPoint());
+        final var strategy = getRestconfStrategy(reqPath.databind(), reqPath.getMountPoint());
         final NormalizedNode node;
         if (fieldPaths != null && !fieldPaths.isEmpty()) {
             node = strategy.readData(readParams.content(), reqPath.getInstanceIdentifier(), readParams.withDefaults(),
@@ -297,16 +298,15 @@ public final class MdsalRestconfServer
 
     private @NonNull RestconfFuture<PatchStatusContext> dataPATCH(final InstanceIdentifierContext reqPath,
             final PatchBody body) {
-        final var modelContext = reqPath.getSchemaContext();
         final PatchContext patch;
         try {
-            patch = body.toPatchContext(modelContext, reqPath.getInstanceIdentifier());
+            patch = body.toPatchContext(reqPath.databind(), reqPath.getInstanceIdentifier());
         } catch (IOException e) {
             LOG.debug("Error parsing YANG Patch input", e);
             return RestconfFuture.failed(new RestconfDocumentedException("Error parsing input: " + e.getMessage(),
                 ErrorType.PROTOCOL, ErrorTag.MALFORMED_MESSAGE, e));
         }
-        return getRestconfStrategy(modelContext, reqPath.getMountPoint()).patchData(patch);
+        return getRestconfStrategy(reqPath.databind(), reqPath.getMountPoint()).patchData(patch);
     }
 
     @Override
@@ -332,11 +332,10 @@ public final class MdsalRestconfServer
     private @NonNull RestconfFuture<CreateResource> dataCreatePOST(final InstanceIdentifierContext reqPath,
             final ChildBody body, final Map<String, String> queryParameters) {
         final var inference = reqPath.inference();
-        final var modelContext = inference.getEffectiveModelContext();
 
         final Insert insert;
         try {
-            insert = Insert.ofQueryParameters(modelContext, queryParameters);
+            insert = Insert.ofQueryParameters(inference.getEffectiveModelContext(), queryParameters);
         } catch (IllegalArgumentException e) {
             return RestconfFuture.failed(new RestconfDocumentedException(e.getMessage(),
                 ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE, e));
@@ -344,7 +343,7 @@ public final class MdsalRestconfServer
 
         final var parentPath = reqPath.getInstanceIdentifier();
         final var payload = body.toPayload(parentPath, inference);
-        return getRestconfStrategy(modelContext, reqPath.getMountPoint())
+        return getRestconfStrategy(reqPath.databind(), reqPath.getMountPoint())
             .postData(concat(parentPath, payload.prefix()), payload.body(), insert);
     }
 
@@ -501,16 +500,14 @@ public final class MdsalRestconfServer
 
         final InstanceIdentifierContext point;
         try {
-            point = InstanceIdentifierContext.ofApiPath(mountPath, localStrategy().modelContext(), mountPointService);
+            point = InstanceIdentifierContext.ofApiPath(mountPath, localStrategy().databind(), mountPointService);
         } catch (RestconfDocumentedException e) {
             return RestconfFuture.failed(e);
         }
 
-        final var mountPoint = point.getMountPoint();
-        final var modelContext = point.getSchemaContext();
         final RestconfStrategy strategy;
         try {
-            strategy = forMountPoint(modelContext, mountPoint);
+            strategy = forMountPoint(point.databind(), point.getMountPoint());
         } catch (RestconfDocumentedException e) {
             return RestconfFuture.failed(e);
         }
@@ -620,7 +617,7 @@ public final class MdsalRestconfServer
                 ErrorType.PROTOCOL, ErrorTag.MALFORMED_MESSAGE, e));
         }
 
-        final var strategy = getRestconfStrategy(reqPath.getSchemaContext(), reqPath.getMountPoint());
+        final var strategy = getRestconfStrategy(reqPath.databind(), reqPath.getMountPoint());
         return strategy.invokeRpc(restconfURI, reqPath.getSchemaNode().getQName(),
                 new OperationInput(strategy.databind(), inference, input));
     }
@@ -648,35 +645,33 @@ public final class MdsalRestconfServer
     private @NonNull InstanceIdentifierContext bindRequestPath(final @NonNull MdsalRestconfStrategy strategy,
             final @NonNull ApiPath identifier) {
         // FIXME: DatabindContext looks like it should be internal
-        return InstanceIdentifierContext.ofApiPath(identifier, strategy.modelContext(), mountPointService);
+        return InstanceIdentifierContext.ofApiPath(identifier, strategy.databind(), mountPointService);
     }
 
     private @NonNull InstanceIdentifierContext bindRequestRoot() {
-        return InstanceIdentifierContext.ofLocalRoot(localStrategy().modelContext());
+        return InstanceIdentifierContext.ofLocalRoot(localStrategy().databind());
     }
 
     private @NonNull ResourceRequest bindResourceRequest(final InstanceIdentifierContext reqPath,
             final ResourceBody body) {
-        final var inference = reqPath.inference();
         final var path = reqPath.getInstanceIdentifier();
-        final var data = body.toNormalizedNode(path, inference, reqPath.getSchemaNode());
+        final var data = body.toNormalizedNode(path, reqPath.inference(), reqPath.getSchemaNode());
 
-        return new ResourceRequest(
-            getRestconfStrategy(inference.getEffectiveModelContext(), reqPath.getMountPoint()), path, data);
+        return new ResourceRequest(getRestconfStrategy(reqPath.databind(), reqPath.getMountPoint()), path, data);
     }
 
     @VisibleForTesting
-    @NonNull RestconfStrategy getRestconfStrategy(final EffectiveModelContext modelContext,
+    @NonNull RestconfStrategy getRestconfStrategy(final DatabindContext databind,
             final @Nullable DOMMountPoint mountPoint) {
         if (mountPoint == null) {
-            return localStrategy(modelContext);
+            return localStrategy(databind);
         }
-        return forMountPoint(modelContext, mountPoint);
+        return forMountPoint(databind, mountPoint);
     }
 
-    private static @NonNull RestconfStrategy forMountPoint(final EffectiveModelContext modelContext,
+    private static @NonNull RestconfStrategy forMountPoint(final DatabindContext databind,
             final DOMMountPoint mountPoint) {
-        final var ret = RestconfStrategy.forMountPoint(modelContext, mountPoint);
+        final var ret = RestconfStrategy.forMountPoint(databind, mountPoint);
         if (ret == null) {
             final var mountId = mountPoint.getIdentifier();
             LOG.warn("Mount point {} does not expose a suitable access interface", mountId);
index 324acbdb1ccb9b526e45571744603dd4bf9e3e13..b30f29b52465b40b75fe8e47e3256033b37878cc 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.restconf.nb.rfc8040;
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
+import org.opendaylight.restconf.nb.rfc8040.databind.DatabindContext;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.common.Revision;
@@ -51,6 +52,7 @@ public abstract class AbstractInstanceIdentifierTest {
 
     protected static final EffectiveModelContext IID_SCHEMA =
         YangParserTestUtils.parseYangResourceDirectory("/instanceidentifier/yang");
+    protected static final DatabindContext IID_DATABIND = DatabindContext.ofModel(IID_SCHEMA);
 
     protected static final InputStream stringInputStream(final String str) {
         return new ByteArrayInputStream(str.getBytes(StandardCharsets.UTF_8));
index 6de8f9022240e7b7c67d902837a1e4cde79cd416..909a8e952231c0dac1b2723b8c72b1daaa784618 100644 (file)
@@ -11,6 +11,7 @@ import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.restconf.nb.rfc8040.databind.DatabindContext;
 import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
@@ -99,6 +100,7 @@ public abstract class AbstractJukeboxTest {
 
     protected static final @NonNull EffectiveModelContext JUKEBOX_SCHEMA =
         YangParserTestUtils.parseYangResourceDirectory("/jukebox");
+    protected static final @NonNull DatabindContext JUKEBOX_DATABIND = DatabindContext.ofModel(JUKEBOX_SCHEMA);
 
     protected static final InputStream stringInputStream(final String str) {
         return new ByteArrayInputStream(str.getBytes(StandardCharsets.UTF_8));
index 38fcead5de3a552558b27ade64b310e3b7aba078..56477be957641a686f6da127f9acf70d7aa92f09 100644 (file)
@@ -82,10 +82,10 @@ abstract class AbstractPatchBodyTest extends AbstractInstanceIdentifierTest {
             throw new AssertionError(e);
         }
 
-        final var iid = InstanceIdentifierContext.ofApiPath(apiPath, IID_SCHEMA, mountPointService);
+        final var iid = InstanceIdentifierContext.ofApiPath(apiPath, IID_DATABIND, mountPointService);
 
         try (var body = bodyConstructor.apply(stringInputStream(patchBody))) {
-            return body.toPatchContext(iid.getSchemaContext(), iid.getInstanceIdentifier());
+            return body.toPatchContext(iid.databind(), iid.getInstanceIdentifier());
         }
     }
 }
index 1568e8e18bf3312be9f7f2db78e4f993faa45356..40935c4d1fe0fe34444f660217755511a0139acb 100644 (file)
@@ -35,7 +35,6 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
 
 abstract class AbstractResourceBodyTest extends AbstractBodyTest {
@@ -52,7 +51,7 @@ abstract class AbstractResourceBodyTest extends AbstractBodyTest {
     static final QName LF11 = QName.create("augment:module:leaf:list", "2014-01-27", "lf11");
     static final QName LFLST11 = QName.create(LF11, "lflst11");
 
-    static EffectiveModelContext MODEL_CONTEXT;
+    private static DatabindContext DATABIND;
 
     private final Function<InputStream, ResourceBody> bodyConstructor;
     private final DOMMountPointService mountPointService;
@@ -74,7 +73,7 @@ abstract class AbstractResourceBodyTest extends AbstractBodyTest {
         final var testFiles = loadFiles("/instanceidentifier/yang");
         testFiles.addAll(loadFiles("/modules"));
         testFiles.addAll(loadFiles("/foo-xml-test/yang"));
-        MODEL_CONTEXT = YangParserTestUtils.parseYangFiles(testFiles);
+        DATABIND = DatabindContext.ofModel(YangParserTestUtils.parseYangFiles(testFiles));
     }
 
     // FIXME: migrate callers to use string literals
@@ -96,7 +95,7 @@ abstract class AbstractResourceBodyTest extends AbstractBodyTest {
         }
 
         try (var body = bodyConstructor.apply(patchBody)) {
-            final var context = InstanceIdentifierContext.ofApiPath(apiPath, MODEL_CONTEXT, mountPointService);
+            final var context = InstanceIdentifierContext.ofApiPath(apiPath, DATABIND, mountPointService);
             return body.toNormalizedNode(context.getInstanceIdentifier(), context.inference(), context.getSchemaNode());
         }
     }
index fe75282bb7a90b8b769436b99df29271c4344efd..17d81686cbb3ec7720023a657b0128837d061ffe 100644 (file)
@@ -35,7 +35,7 @@ public class ResourceBodyTest extends AbstractJukeboxTest {
             .node(PLAYLIST_QNAME)
             .nodeWithKey(PLAYLIST_QNAME, NAME_QNAME, "name of band")
             .build();
-        final var iidContext = InstanceIdentifierContext.ofLocalPath(JUKEBOX_SCHEMA, path);
+        final var iidContext = InstanceIdentifierContext.ofLocalPath(JUKEBOX_DATABIND, path);
         ResourceBody.validateListKeysEqualityInPayloadAndUri(iidContext.getSchemaNode(), path, BAND_ENTRY);
     }
 }
index fc344521f0fedb6b428c5bc0876757e3a45de5c5..c38371f0be633380d9367551b26b8de7d1c9b28d 100644 (file)
@@ -34,6 +34,7 @@ import org.opendaylight.restconf.api.query.WithDefaultsParam;
 import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
 import org.opendaylight.restconf.nb.rfc8040.Insert;
 import org.opendaylight.restconf.nb.rfc8040.ReceiveEventsParams;
+import org.opendaylight.restconf.nb.rfc8040.databind.DatabindContext;
 import org.opendaylight.restconf.nb.rfc8040.legacy.InstanceIdentifierContext;
 import org.opendaylight.restconf.nb.rfc8040.legacy.QueryParameters;
 import org.opendaylight.restconf.nb.rfc8040.utils.parser.WriterFieldsTranslator;
@@ -181,7 +182,7 @@ public class QueryParamsTest {
 
         final var stack = SchemaInferenceStack.of(context);
         stack.enterSchemaTree(containerQName);
-        final var iid = InstanceIdentifierContext.ofStack(stack);
+        final var iid = InstanceIdentifierContext.ofStack(DatabindContext.ofModel(context), stack);
 
         final var queryParameters = QueryParameters.ofFields(params, WriterFieldsTranslator.translate(
             iid.getSchemaContext(), (DataSchemaNode) iid.getSchemaNode(), paramsFields));
index 5421057c9d958c33031fd0edf4c42c02aef09c67..d5b8cd3cb90dcc3976ac4126522239fedeec71ef 100644 (file)
@@ -18,9 +18,7 @@ import static org.opendaylight.yangtools.util.concurrent.FluentFutures.immediate
 import static org.opendaylight.yangtools.util.concurrent.FluentFutures.immediateTrueFluentFuture;
 
 import java.util.Optional;
-import org.junit.AfterClass;
 import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -34,6 +32,7 @@ import org.opendaylight.mdsal.dom.api.DOMRpcService;
 import org.opendaylight.restconf.api.query.ContentParam;
 import org.opendaylight.restconf.api.query.WithDefaultsParam;
 import org.opendaylight.restconf.common.patch.PatchStatusContext;
+import org.opendaylight.restconf.nb.rfc8040.databind.DatabindContext;
 import org.opendaylight.yangtools.yang.common.ErrorTag;
 import org.opendaylight.yangtools.yang.common.ErrorType;
 import org.opendaylight.yangtools.yang.common.QName;
@@ -42,13 +41,13 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
 import org.w3c.dom.DOMException;
 
 @RunWith(MockitoJUnitRunner.StrictStubs.class)
 public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTest {
-    private static EffectiveModelContext MODULES_SCHEMA;
+    private static final DatabindContext MODULES_DATABIND = DatabindContext.ofModel(
+        YangParserTestUtils.parseYangResourceDirectory("/modules"));
 
     @Mock
     private DOMDataTreeReadWriteTransaction readWrite;
@@ -59,20 +58,13 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
     @Mock
     private DOMRpcService rpcService;
 
-    @BeforeClass
-    public static void setupModulesSchema() {
-        MODULES_SCHEMA = YangParserTestUtils.parseYangResourceDirectory("/modules");
-    }
-
-    @AfterClass
-    public static void dropModulesSchema() {
-        MODULES_SCHEMA = null;
-    }
+    private DatabindContext mockDatabind;
 
     @Before
     public void before() {
         doReturn(CommitInfo.emptyFluentFuture()).when(readWrite).commit();
         doReturn(readWrite).when(mockDataBroker).newReadWriteTransaction();
+        mockDatabind = DatabindContext.ofModel(mockSchemaContext);
     }
 
     @Override
@@ -80,7 +72,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
         // assert that data to delete exists
         when(readWrite.exists(LogicalDatastoreType.CONFIGURATION, YangInstanceIdentifier.of()))
             .thenReturn(immediateTrueFluentFuture());
-        return new MdsalRestconfStrategy(JUKEBOX_SCHEMA, mockDataBroker, null, null);
+        return new MdsalRestconfStrategy(JUKEBOX_DATABIND, mockDataBroker, null, null);
     }
 
     @Override
@@ -88,7 +80,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
         // assert that data to delete does NOT exist
         when(readWrite.exists(LogicalDatastoreType.CONFIGURATION, YangInstanceIdentifier.of()))
             .thenReturn(immediateFalseFluentFuture());
-        return new MdsalRestconfStrategy(JUKEBOX_SCHEMA, mockDataBroker, null, null);
+        return new MdsalRestconfStrategy(JUKEBOX_DATABIND, mockDataBroker, null, null);
     }
 
     @Override
@@ -96,7 +88,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
         doReturn(immediateFalseFluentFuture()).when(readWrite).exists(LogicalDatastoreType.CONFIGURATION, node);
         doNothing().when(readWrite).put(LogicalDatastoreType.CONFIGURATION, node, entryNode);
         doReturn(CommitInfo.emptyFluentFuture()).when(readWrite).commit();
-        return new MdsalRestconfStrategy(JUKEBOX_SCHEMA, mockDataBroker, null, null);
+        return new MdsalRestconfStrategy(JUKEBOX_DATABIND, mockDataBroker, null, null);
     }
 
     @Override
@@ -104,7 +96,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
         doReturn(immediateFalseFluentFuture()).when(readWrite).exists(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID);
         doReturn(immediateFailedFluentFuture(domException)).when(readWrite).commit();
         doNothing().when(readWrite).put(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX);
-        return new MdsalRestconfStrategy(JUKEBOX_SCHEMA, mockDataBroker, null, null);
+        return new MdsalRestconfStrategy(JUKEBOX_DATABIND, mockDataBroker, null, null);
     }
 
     @Test
@@ -115,7 +107,8 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
         doNothing().when(readWrite).put(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX);
         doReturn(CommitInfo.emptyFluentFuture()).when(readWrite).commit();
 
-        new MdsalRestconfStrategy(JUKEBOX_SCHEMA, mockDataBroker, null, null).putData(JUKEBOX_IID, EMPTY_JUKEBOX, null);
+        new MdsalRestconfStrategy(JUKEBOX_DATABIND, mockDataBroker, null, null)
+            .putData(JUKEBOX_IID, EMPTY_JUKEBOX, null);
         verify(read).exists(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID);
         verify(readWrite).put(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX);
     }
@@ -128,7 +121,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
         doNothing().when(readWrite).put(LogicalDatastoreType.CONFIGURATION, GAP_IID, GAP_LEAF);
         doReturn(CommitInfo.emptyFluentFuture()).when(readWrite).commit();
 
-        new MdsalRestconfStrategy(JUKEBOX_SCHEMA, mockDataBroker, null, null).putData(GAP_IID, GAP_LEAF, null);
+        new MdsalRestconfStrategy(JUKEBOX_DATABIND, mockDataBroker, null, null).putData(GAP_IID, GAP_LEAF, null);
         verify(read).exists(LogicalDatastoreType.CONFIGURATION, GAP_IID);
         verify(readWrite).put(LogicalDatastoreType.CONFIGURATION, GAP_IID, GAP_LEAF);
     }
@@ -143,7 +136,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
         doNothing().when(readWrite).put(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, JUKEBOX_WITH_BANDS);
         doReturn(CommitInfo.emptyFluentFuture()).when(readWrite).commit();
 
-        new MdsalRestconfStrategy(JUKEBOX_SCHEMA, mockDataBroker, null, null)
+        new MdsalRestconfStrategy(JUKEBOX_DATABIND, mockDataBroker, null, null)
             .putData(JUKEBOX_IID, JUKEBOX_WITH_BANDS, null);
         verify(read).exists(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID);
         verify(readWrite).put(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, JUKEBOX_WITH_BANDS);
@@ -154,33 +147,33 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
         doReturn(immediateFalseFluentFuture()).when(readWrite).exists(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID);
         doNothing().when(readWrite).put(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX);
         doReturn(CommitInfo.emptyFluentFuture()).when(readWrite).commit();
-        return new MdsalRestconfStrategy(JUKEBOX_SCHEMA, mockDataBroker, null, null);
+        return new MdsalRestconfStrategy(JUKEBOX_DATABIND, mockDataBroker, null, null);
     }
 
     @Override
     RestconfStrategy testPatchContainerDataStrategy() {
         doReturn(readWrite).when(mockDataBroker).newReadWriteTransaction();
         doReturn(CommitInfo.emptyFluentFuture()).when(readWrite).commit();
-        return new MdsalRestconfStrategy(JUKEBOX_SCHEMA, mockDataBroker, null, null);
+        return new MdsalRestconfStrategy(JUKEBOX_DATABIND, mockDataBroker, null, null);
     }
 
     @Override
     RestconfStrategy testPatchLeafDataStrategy() {
         doReturn(readWrite).when(mockDataBroker).newReadWriteTransaction();
         doReturn(CommitInfo.emptyFluentFuture()).when(readWrite).commit();
-        return new MdsalRestconfStrategy(JUKEBOX_SCHEMA, mockDataBroker, null, null);
+        return new MdsalRestconfStrategy(JUKEBOX_DATABIND, mockDataBroker, null, null);
     }
 
     @Override
     RestconfStrategy testPatchListDataStrategy() {
         doReturn(readWrite).when(mockDataBroker).newReadWriteTransaction();
         doReturn(CommitInfo.emptyFluentFuture()).when(readWrite).commit();
-        return new MdsalRestconfStrategy(JUKEBOX_SCHEMA, mockDataBroker, null, null);
+        return new MdsalRestconfStrategy(JUKEBOX_DATABIND, mockDataBroker, null, null);
     }
 
     @Override
     RestconfStrategy testPatchDataReplaceMergeAndRemoveStrategy() {
-        return new MdsalRestconfStrategy(JUKEBOX_SCHEMA, mockDataBroker, null, null);
+        return new MdsalRestconfStrategy(JUKEBOX_DATABIND, mockDataBroker, null, null);
     }
 
     @Override
@@ -188,19 +181,19 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
         doReturn(immediateFalseFluentFuture()).when(readWrite).exists(LogicalDatastoreType.CONFIGURATION, PLAYER_IID);
         doReturn(immediateTrueFluentFuture()).when(readWrite).exists(LogicalDatastoreType.CONFIGURATION,
             CREATE_AND_DELETE_TARGET);
-        return new MdsalRestconfStrategy(JUKEBOX_SCHEMA, mockDataBroker, null, null);
+        return new MdsalRestconfStrategy(JUKEBOX_DATABIND, mockDataBroker, null, null);
     }
 
     @Override
     RestconfStrategy testPatchMergePutContainerStrategy() {
-        return new MdsalRestconfStrategy(JUKEBOX_SCHEMA, mockDataBroker, null, null);
+        return new MdsalRestconfStrategy(JUKEBOX_DATABIND, mockDataBroker, null, null);
     }
 
     @Override
     RestconfStrategy deleteNonexistentDataTestStrategy() {
         doReturn(immediateFalseFluentFuture()).when(readWrite).exists(LogicalDatastoreType.CONFIGURATION,
             CREATE_AND_DELETE_TARGET);
-        return new MdsalRestconfStrategy(JUKEBOX_SCHEMA, mockDataBroker, null, null);
+        return new MdsalRestconfStrategy(JUKEBOX_DATABIND, mockDataBroker, null, null);
     }
 
     @Override
@@ -219,7 +212,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
         doReturn(read).when(mockDataBroker).newReadOnlyTransaction();
         doReturn(immediateFluentFuture(Optional.of(DATA_3))).when(read)
             .read(LogicalDatastoreType.CONFIGURATION, PATH);
-        return new MdsalRestconfStrategy(mockSchemaContext, mockDataBroker, null, null);
+        return new MdsalRestconfStrategy(mockDatabind, mockDataBroker, null, null);
     }
 
     @Override
@@ -229,7 +222,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
             .read(LogicalDatastoreType.CONFIGURATION, PATH);
         doReturn(immediateFluentFuture(Optional.empty())).when(read)
             .read(LogicalDatastoreType.OPERATIONAL, PATH);
-        return new MdsalRestconfStrategy(mockSchemaContext, mockDataBroker, null, null);
+        return new MdsalRestconfStrategy(mockDatabind, mockDataBroker, null, null);
     }
 
     @Override
@@ -239,7 +232,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
             .read(LogicalDatastoreType.OPERATIONAL, PATH_2);
         doReturn(immediateFluentFuture(Optional.empty())).when(read)
             .read(LogicalDatastoreType.CONFIGURATION, PATH_2);
-        return new MdsalRestconfStrategy(mockSchemaContext, mockDataBroker, null, null);
+        return new MdsalRestconfStrategy(mockDatabind, mockDataBroker, null, null);
     }
 
     @Override
@@ -247,7 +240,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
         doReturn(read).when(mockDataBroker).newReadOnlyTransaction();
         doReturn(immediateFluentFuture(Optional.of(DATA_2))).when(read)
             .read(LogicalDatastoreType.OPERATIONAL, PATH_2);
-        return new MdsalRestconfStrategy(mockSchemaContext, mockDataBroker, null, null);
+        return new MdsalRestconfStrategy(mockDatabind, mockDataBroker, null, null);
     }
 
     @Override
@@ -257,7 +250,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
             .read(LogicalDatastoreType.CONFIGURATION, PATH);
         doReturn(immediateFluentFuture(Optional.of(DATA_4))).when(read)
             .read(LogicalDatastoreType.OPERATIONAL, PATH);
-        return new MdsalRestconfStrategy(mockSchemaContext, mockDataBroker, null, null);
+        return new MdsalRestconfStrategy(mockDatabind, mockDataBroker, null, null);
     }
 
     @Override
@@ -267,7 +260,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
             .read(LogicalDatastoreType.CONFIGURATION, PATH);
         doReturn(immediateFluentFuture(Optional.of(DATA_4))).when(read)
             .read(LogicalDatastoreType.OPERATIONAL, PATH);
-        return new MdsalRestconfStrategy(mockSchemaContext, mockDataBroker, null, null);
+        return new MdsalRestconfStrategy(mockDatabind, mockDataBroker, null, null);
     }
 
     @Override
@@ -277,7 +270,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
             .read(LogicalDatastoreType.OPERATIONAL, PATH_3);
         doReturn(immediateFluentFuture(Optional.of(LIST_DATA_2))).when(read)
             .read(LogicalDatastoreType.CONFIGURATION, PATH_3);
-        return new MdsalRestconfStrategy(mockSchemaContext, mockDataBroker, null, null);
+        return new MdsalRestconfStrategy(mockDatabind, mockDataBroker, null, null);
     }
 
     @Override
@@ -287,7 +280,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
             .read(LogicalDatastoreType.OPERATIONAL, PATH_3);
         doReturn(immediateFluentFuture(Optional.of(ORDERED_MAP_NODE_2))).when(read)
             .read(LogicalDatastoreType.CONFIGURATION, PATH_3);
-        return new MdsalRestconfStrategy(mockSchemaContext, mockDataBroker, null, null);
+        return new MdsalRestconfStrategy(mockDatabind, mockDataBroker, null, null);
     }
 
     @Override
@@ -297,7 +290,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
             .read(LogicalDatastoreType.OPERATIONAL, PATH_3);
         doReturn(immediateFluentFuture(Optional.of(UNKEYED_LIST_NODE_2))).when(read)
             .read(LogicalDatastoreType.CONFIGURATION, PATH_3);
-        return new MdsalRestconfStrategy(mockSchemaContext, mockDataBroker, null, null);
+        return new MdsalRestconfStrategy(mockDatabind, mockDataBroker, null, null);
     }
 
     @Override
@@ -307,7 +300,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
             .read(LogicalDatastoreType.OPERATIONAL, LEAF_SET_NODE_PATH);
         doReturn(immediateFluentFuture(Optional.of(LEAF_SET_NODE_2))).when(read)
             .read(LogicalDatastoreType.CONFIGURATION, LEAF_SET_NODE_PATH);
-        return new MdsalRestconfStrategy(mockSchemaContext, mockDataBroker, null, null);
+        return new MdsalRestconfStrategy(mockDatabind, mockDataBroker, null, null);
     }
 
     @Override
@@ -317,14 +310,14 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
             .read(LogicalDatastoreType.OPERATIONAL, LEAF_SET_NODE_PATH);
         doReturn(immediateFluentFuture(Optional.of(ORDERED_LEAF_SET_NODE_2))).when(read)
             .read(LogicalDatastoreType.CONFIGURATION, LEAF_SET_NODE_PATH);
-        return new MdsalRestconfStrategy(mockSchemaContext, mockDataBroker, null, null);
+        return new MdsalRestconfStrategy(mockDatabind, mockDataBroker, null, null);
     }
 
     @Override
     RestconfStrategy readDataWrongPathOrNoContentTestStrategy() {
         doReturn(read).when(mockDataBroker).newReadOnlyTransaction();
         doReturn(immediateFluentFuture(Optional.empty())).when(read).read(LogicalDatastoreType.CONFIGURATION, PATH_2);
-        return new MdsalRestconfStrategy(mockSchemaContext, mockDataBroker, null, null);
+        return new MdsalRestconfStrategy(mockDatabind, mockDataBroker, null, null);
     }
 
     @Test
@@ -340,7 +333,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
         doReturn(immediateFluentFuture(Optional.of(data))).when(read)
                 .read(LogicalDatastoreType.OPERATIONAL, path);
 
-        assertEquals(data, new MdsalRestconfStrategy(MODULES_SCHEMA, mockDataBroker, null, null)
+        assertEquals(data, new MdsalRestconfStrategy(MODULES_DATABIND, mockDataBroker, null, null)
             .readData(ContentParam.ALL, path, WithDefaultsParam.TRIM));
     }
 
@@ -371,7 +364,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
         doReturn(immediateFluentFuture(Optional.of(data))).when(read)
                 .read(LogicalDatastoreType.OPERATIONAL, path);
 
-        assertEquals(data, new MdsalRestconfStrategy(MODULES_SCHEMA, mockDataBroker, null, null)
+        assertEquals(data, new MdsalRestconfStrategy(MODULES_DATABIND, mockDataBroker, null, null)
             .readData(ContentParam.ALL, path, WithDefaultsParam.TRIM));
     }
 
@@ -395,7 +388,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
         doReturn(immediateFluentFuture(Optional.of(content))).when(read)
                 .read(LogicalDatastoreType.OPERATIONAL, path);
 
-        assertEquals(content, new MdsalRestconfStrategy(MODULES_SCHEMA, mockDataBroker, null, null)
+        assertEquals(content, new MdsalRestconfStrategy(MODULES_DATABIND, mockDataBroker, null, null)
             .readData(ContentParam.ALL, path, WithDefaultsParam.TRIM));
     }
 }
index 1e9e2e468a7cb742732ab26a28993ba02660e94c..45be9c16d1427e96555ef67661a1b83f02a7ba8f 100644 (file)
@@ -29,6 +29,7 @@ import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult;
 import org.opendaylight.netconf.api.NetconfDocumentedException;
 import org.opendaylight.netconf.dom.api.NetconfDataTreeService;
 import org.opendaylight.restconf.common.patch.PatchStatusContext;
+import org.opendaylight.restconf.nb.rfc8040.databind.DatabindContext;
 import org.opendaylight.yangtools.yang.common.ErrorSeverity;
 import org.opendaylight.yangtools.yang.common.ErrorTag;
 import org.opendaylight.yangtools.yang.common.ErrorType;
@@ -42,6 +43,8 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
     @Mock
     private NetconfDataTreeService netconfService;
 
+    private DatabindContext mockDatabind;
+
     @Before
     public void before() {
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
@@ -52,11 +55,12 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
             .delete(LogicalDatastoreType.CONFIGURATION, YangInstanceIdentifier.of());
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).merge(any(), any(),
             any(), any());
+        mockDatabind = DatabindContext.ofModel(mockSchemaContext);
     }
 
     @Override
     RestconfStrategy testDeleteDataStrategy() {
-        return new NetconfRestconfStrategy(JUKEBOX_SCHEMA, netconfService, null, null);
+        return new NetconfRestconfStrategy(JUKEBOX_DATABIND, netconfService, null, null);
     }
 
     @Override
@@ -64,7 +68,7 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
         doReturn(Futures.immediateFailedFuture(new TransactionCommitFailedException(
             "Commit of transaction " + this + " failed", new NetconfDocumentedException("id",
                 ErrorType.RPC, ErrorTag.DATA_MISSING, ErrorSeverity.ERROR)))).when(netconfService).commit();
-        return new NetconfRestconfStrategy(JUKEBOX_SCHEMA, netconfService, null, null);
+        return new NetconfRestconfStrategy(JUKEBOX_DATABIND, netconfService, null, null);
     }
 
     @Override
@@ -72,7 +76,7 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
             .create(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX, Optional.empty());
-        return new NetconfRestconfStrategy(JUKEBOX_SCHEMA, netconfService, null, null);
+        return new NetconfRestconfStrategy(JUKEBOX_DATABIND, netconfService, null, null);
     }
 
     @Override
@@ -83,7 +87,7 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).create(
             LogicalDatastoreType.CONFIGURATION, node, entryNode, Optional.empty());
-        return new NetconfRestconfStrategy(JUKEBOX_SCHEMA, netconfService, null, null);
+        return new NetconfRestconfStrategy(JUKEBOX_DATABIND, netconfService, null, null);
     }
 
     @Override
@@ -93,14 +97,14 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
             .create(any(), any(), any(), any());
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).discardChanges();
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).unlock();
-        return new NetconfRestconfStrategy(JUKEBOX_SCHEMA, netconfService, null, null);
+        return new NetconfRestconfStrategy(JUKEBOX_DATABIND, netconfService, null, null);
     }
 
     @Override
     RestconfStrategy testPatchContainerDataStrategy() {
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).merge(any(), any(),any(),
             any());
-        return new NetconfRestconfStrategy(JUKEBOX_SCHEMA, netconfService, null, null);
+        return new NetconfRestconfStrategy(JUKEBOX_DATABIND, netconfService, null, null);
     }
 
     @Override
@@ -108,7 +112,7 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
             .merge(any(), any(), any(), any());
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
-        return new NetconfRestconfStrategy(JUKEBOX_SCHEMA, netconfService, null, null);
+        return new NetconfRestconfStrategy(JUKEBOX_DATABIND, netconfService, null, null);
     }
 
     @Override
@@ -116,7 +120,7 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
             .merge(any(), any(),any(),any());
-        return new NetconfRestconfStrategy(JUKEBOX_SCHEMA, netconfService, null, null);
+        return new NetconfRestconfStrategy(JUKEBOX_DATABIND, netconfService, null, null);
     }
 
     @Test
@@ -126,7 +130,7 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
             .replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX, Optional.empty());
 
-        new NetconfRestconfStrategy(JUKEBOX_SCHEMA, netconfService, null, null)
+        new NetconfRestconfStrategy(JUKEBOX_DATABIND, netconfService, null, null)
             .putData(JUKEBOX_IID, EMPTY_JUKEBOX, null);
         verify(netconfService).lock();
         verify(netconfService).getConfig(JUKEBOX_IID);
@@ -142,7 +146,7 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
             .replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX, Optional.empty());
 
-        new NetconfRestconfStrategy(JUKEBOX_SCHEMA, netconfService, null, null)
+        new NetconfRestconfStrategy(JUKEBOX_DATABIND, netconfService, null, null)
             .putData(JUKEBOX_IID, EMPTY_JUKEBOX, null);
         verify(netconfService).getConfig(JUKEBOX_IID);
         verify(netconfService).replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX,
@@ -156,7 +160,7 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
             .replace(LogicalDatastoreType.CONFIGURATION, GAP_IID, GAP_LEAF, Optional.empty());
 
-        new NetconfRestconfStrategy(JUKEBOX_SCHEMA, netconfService, null, null).putData(GAP_IID, GAP_LEAF, null);
+        new NetconfRestconfStrategy(JUKEBOX_DATABIND, netconfService, null, null).putData(GAP_IID, GAP_LEAF, null);
         verify(netconfService).getConfig(GAP_IID);
         verify(netconfService).replace(LogicalDatastoreType.CONFIGURATION, GAP_IID, GAP_LEAF, Optional.empty());
     }
@@ -169,7 +173,7 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
             .replace(LogicalDatastoreType.CONFIGURATION, GAP_IID, GAP_LEAF, Optional.empty());
 
-        new NetconfRestconfStrategy(JUKEBOX_SCHEMA, netconfService, null, null).putData(GAP_IID, GAP_LEAF, null);
+        new NetconfRestconfStrategy(JUKEBOX_DATABIND, netconfService, null, null).putData(GAP_IID, GAP_LEAF, null);
         verify(netconfService).getConfig(GAP_IID);
         verify(netconfService).replace(LogicalDatastoreType.CONFIGURATION, GAP_IID, GAP_LEAF, Optional.empty());
     }
@@ -181,7 +185,7 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
             .replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, JUKEBOX_WITH_BANDS, Optional.empty());
 
-        new NetconfRestconfStrategy(JUKEBOX_SCHEMA, netconfService, null, null)
+        new NetconfRestconfStrategy(JUKEBOX_DATABIND, netconfService, null, null)
             .putData(JUKEBOX_IID, JUKEBOX_WITH_BANDS, null);
         verify(netconfService).getConfig(JUKEBOX_IID);
         verify(netconfService).replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, JUKEBOX_WITH_BANDS,
@@ -196,7 +200,7 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
             .replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, JUKEBOX_WITH_BANDS, Optional.empty());
 
-        new NetconfRestconfStrategy(JUKEBOX_SCHEMA, netconfService, null, null)
+        new NetconfRestconfStrategy(JUKEBOX_DATABIND, netconfService, null, null)
             .putData(JUKEBOX_IID, JUKEBOX_WITH_BANDS, null);
         verify(netconfService).getConfig(JUKEBOX_IID);
         verify(netconfService).replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, JUKEBOX_WITH_BANDS,
@@ -210,7 +214,7 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
             // FIXME: exact match
             .replace(any(), any(), any(), any());
-        return new NetconfRestconfStrategy(JUKEBOX_SCHEMA, netconfService, null, null);
+        return new NetconfRestconfStrategy(JUKEBOX_DATABIND, netconfService, null, null);
     }
 
     @Override
@@ -219,12 +223,12 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
             .create(LogicalDatastoreType.CONFIGURATION, PLAYER_IID, EMPTY_JUKEBOX, Optional.empty());
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
             .delete(LogicalDatastoreType.CONFIGURATION, CREATE_AND_DELETE_TARGET);
-        return new NetconfRestconfStrategy(JUKEBOX_SCHEMA, netconfService, null, null);
+        return new NetconfRestconfStrategy(JUKEBOX_DATABIND, netconfService, null, null);
     }
 
     @Override
     RestconfStrategy testPatchMergePutContainerStrategy() {
-        return new NetconfRestconfStrategy(JUKEBOX_SCHEMA, netconfService, null, null);
+        return new NetconfRestconfStrategy(JUKEBOX_DATABIND, netconfService, null, null);
     }
 
     @Override
@@ -235,7 +239,7 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
             .when(netconfService).commit();
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
             .delete(LogicalDatastoreType.CONFIGURATION, CREATE_AND_DELETE_TARGET);
-        return new NetconfRestconfStrategy(JUKEBOX_SCHEMA, netconfService, null, null);
+        return new NetconfRestconfStrategy(JUKEBOX_DATABIND, netconfService, null, null);
     }
 
     @Override
@@ -251,62 +255,62 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
     @Override
     RestconfStrategy readDataConfigTestStrategy() {
         doReturn(immediateFluentFuture(Optional.of(DATA_3))).when(netconfService).getConfig(PATH);
-        return new NetconfRestconfStrategy(mockSchemaContext, netconfService, null, null);
+        return new NetconfRestconfStrategy(mockDatabind, netconfService, null, null);
     }
 
     @Override
     RestconfStrategy readAllHavingOnlyConfigTestStrategy() {
         doReturn(immediateFluentFuture(Optional.of(DATA_3))).when(netconfService).getConfig(PATH);
         doReturn(immediateFluentFuture(Optional.empty())).when(netconfService).get(PATH);
-        return new NetconfRestconfStrategy(mockSchemaContext, netconfService, null, null);
+        return new NetconfRestconfStrategy(mockDatabind, netconfService, null, null);
     }
 
     @Override
     RestconfStrategy readAllHavingOnlyNonConfigTestStrategy() {
         doReturn(immediateFluentFuture(Optional.of(DATA_2))).when(netconfService).get(PATH_2);
         doReturn(immediateFluentFuture(Optional.empty())).when(netconfService).getConfig(PATH_2);
-        return new NetconfRestconfStrategy(mockSchemaContext, netconfService, null, null);
+        return new NetconfRestconfStrategy(mockDatabind, netconfService, null, null);
     }
 
     @Override
     RestconfStrategy readDataNonConfigTestStrategy() {
         doReturn(immediateFluentFuture(Optional.of(DATA_2))).when(netconfService).get(PATH_2);
-        return new NetconfRestconfStrategy(mockSchemaContext, netconfService, null, null);
+        return new NetconfRestconfStrategy(mockDatabind, netconfService, null, null);
     }
 
     @Override
     RestconfStrategy readContainerDataAllTestStrategy() {
         doReturn(immediateFluentFuture(Optional.of(DATA_3))).when(netconfService).getConfig(PATH);
         doReturn(immediateFluentFuture(Optional.of(DATA_4))).when(netconfService).get(PATH);
-        return new NetconfRestconfStrategy(mockSchemaContext, netconfService, null, null);
+        return new NetconfRestconfStrategy(mockDatabind, netconfService, null, null);
     }
 
     @Override
     RestconfStrategy readContainerDataConfigNoValueOfContentTestStrategy() {
         doReturn(immediateFluentFuture(Optional.of(DATA_3))).when(netconfService).getConfig(PATH);
         doReturn(immediateFluentFuture(Optional.of(DATA_4))).when(netconfService).get(PATH);
-        return new NetconfRestconfStrategy(mockSchemaContext, netconfService, null, null);
+        return new NetconfRestconfStrategy(mockDatabind, netconfService, null, null);
     }
 
     @Override
     RestconfStrategy readListDataAllTestStrategy() {
         doReturn(immediateFluentFuture(Optional.of(LIST_DATA))).when(netconfService).get(PATH_3);
         doReturn(immediateFluentFuture(Optional.of(LIST_DATA_2))).when(netconfService).getConfig(PATH_3);
-        return new NetconfRestconfStrategy(mockSchemaContext, netconfService, null, null);
+        return new NetconfRestconfStrategy(mockDatabind, netconfService, null, null);
     }
 
     @Override
     RestconfStrategy readOrderedListDataAllTestStrategy() {
         doReturn(immediateFluentFuture(Optional.of(ORDERED_MAP_NODE_1))).when(netconfService).get(PATH_3);
         doReturn(immediateFluentFuture(Optional.of(ORDERED_MAP_NODE_2))).when(netconfService).getConfig(PATH_3);
-        return new NetconfRestconfStrategy(mockSchemaContext, netconfService, null, null);
+        return new NetconfRestconfStrategy(mockDatabind, netconfService, null, null);
     }
 
     @Override
     RestconfStrategy readUnkeyedListDataAllTestStrategy() {
         doReturn(immediateFluentFuture(Optional.of(UNKEYED_LIST_NODE_1))).when(netconfService).get(PATH_3);
         doReturn(immediateFluentFuture(Optional.of(UNKEYED_LIST_NODE_2))).when(netconfService).getConfig(PATH_3);
-        return new NetconfRestconfStrategy(mockSchemaContext, netconfService, null, null);
+        return new NetconfRestconfStrategy(mockDatabind, netconfService, null, null);
     }
 
     @Override
@@ -315,7 +319,7 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
             .get(LEAF_SET_NODE_PATH);
         doReturn(immediateFluentFuture(Optional.of(LEAF_SET_NODE_2))).when(netconfService)
             .getConfig(LEAF_SET_NODE_PATH);
-        return new NetconfRestconfStrategy(mockSchemaContext, netconfService, null, null);
+        return new NetconfRestconfStrategy(mockDatabind, netconfService, null, null);
     }
 
     @Override
@@ -324,12 +328,12 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
             .get(LEAF_SET_NODE_PATH);
         doReturn(immediateFluentFuture(Optional.of(ORDERED_LEAF_SET_NODE_2))).when(netconfService)
             .getConfig(LEAF_SET_NODE_PATH);
-        return new NetconfRestconfStrategy(mockSchemaContext, netconfService, null, null);
+        return new NetconfRestconfStrategy(mockDatabind, netconfService, null, null);
     }
 
     @Override
     RestconfStrategy readDataWrongPathOrNoContentTestStrategy() {
         doReturn(immediateFluentFuture(Optional.empty())).when(netconfService).getConfig(PATH_2);
-        return new NetconfRestconfStrategy(mockSchemaContext, netconfService, null, null);
+        return new NetconfRestconfStrategy(mockDatabind, netconfService, null, null);
     }
 }
index 64648b14eff6a5499f91690256875c539a287395..49ffb69173b49dd28e6d14998fd57d8dab74ef89 100644 (file)
@@ -20,6 +20,7 @@ import org.junit.Test;
 import org.opendaylight.restconf.api.query.FieldsParam;
 import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
 import org.opendaylight.restconf.nb.rfc8040.AbstractJukeboxTest;
+import org.opendaylight.restconf.nb.rfc8040.databind.DatabindContext;
 import org.opendaylight.restconf.nb.rfc8040.legacy.InstanceIdentifierContext;
 import org.opendaylight.yangtools.yang.common.ErrorTag;
 import org.opendaylight.yangtools.yang.common.ErrorType;
@@ -42,8 +43,10 @@ public abstract class AbstractFieldsTranslatorTest<T> extends AbstractJukeboxTes
 
     private static final EffectiveModelContext TEST_SERVICES_SCHEMA =
         YangParserTestUtils.parseYangResourceDirectory("/test-services");
+    private static final DatabindContext TEST_SERVICES_DATABIND = DatabindContext.ofModel(TEST_SERVICES_SCHEMA);
     private static final EffectiveModelContext FOO_SCHEMA =
         YangParserTestUtils.parseYangResourceDirectory("/same-qname-nodes");
+    private static final DatabindContext FOO_DATABIND = DatabindContext.ofModel(FOO_SCHEMA);
 
     private DataSchemaNode jukeboxSchemaNode;
     private DataSchemaNode testServices;
@@ -109,11 +112,11 @@ public abstract class AbstractFieldsTranslatorTest<T> extends AbstractJukeboxTes
 
     @Before
     public void setUp() {
-        jukeboxSchemaNode = assertInstanceOf(DataSchemaNode.class, InstanceIdentifierContext.ofStack(
+        jukeboxSchemaNode = assertInstanceOf(DataSchemaNode.class, InstanceIdentifierContext.ofStack(JUKEBOX_DATABIND,
             SchemaInferenceStack.ofDataTreePath(JUKEBOX_SCHEMA, JUKEBOX_QNAME)).getSchemaNode());
-        testServices = assertInstanceOf(DataSchemaNode.class, InstanceIdentifierContext.ofStack(
+        testServices = assertInstanceOf(DataSchemaNode.class, InstanceIdentifierContext.ofStack(TEST_SERVICES_DATABIND,
             SchemaInferenceStack.ofDataTreePath(TEST_SERVICES_SCHEMA, TEST_DATA_Q_NAME)).getSchemaNode());
-        foo = assertInstanceOf(DataSchemaNode.class, InstanceIdentifierContext.ofStack(
+        foo = assertInstanceOf(DataSchemaNode.class, InstanceIdentifierContext.ofStack(FOO_DATABIND,
             SchemaInferenceStack.ofDataTreePath(FOO_SCHEMA, FOO_Q_NAME)).getSchemaNode());
     }
 
index 966a515a15e4991617cd4495e946d5e702e850f9..7962a987200d6e51196438e3379243585e502f04 100644 (file)
@@ -61,7 +61,7 @@ class MdsalRestconfServerTest extends AbstractJukeboxTest {
 
     @Test
     void testGetRestconfStrategyLocal() {
-        assertInstanceOf(MdsalRestconfStrategy.class, server.getRestconfStrategy(JUKEBOX_SCHEMA, null));
+        assertInstanceOf(MdsalRestconfStrategy.class, server.getRestconfStrategy(JUKEBOX_DATABIND, null));
     }
 
     @Test
@@ -71,7 +71,7 @@ class MdsalRestconfServerTest extends AbstractJukeboxTest {
         doReturn(Optional.of(rpcService)).when(mountPoint).getService(DOMRpcService.class);
         doReturn(Optional.of(schemaService)).when(mountPoint).getService(DOMSchemaService.class);
         doReturn(ImmutableClassToInstanceMap.of()).when(schemaService).getExtensions();
-        assertInstanceOf(MdsalRestconfStrategy.class, server.getRestconfStrategy(JUKEBOX_SCHEMA, mountPoint));
+        assertInstanceOf(MdsalRestconfStrategy.class, server.getRestconfStrategy(JUKEBOX_DATABIND, mountPoint));
     }
 
     @Test
@@ -80,7 +80,7 @@ class MdsalRestconfServerTest extends AbstractJukeboxTest {
         doReturn(Optional.of(rpcService)).when(mountPoint).getService(DOMRpcService.class);
         doReturn(Optional.of(schemaService)).when(mountPoint).getService(DOMSchemaService.class);
         doReturn(ImmutableClassToInstanceMap.of()).when(schemaService).getExtensions();
-        assertInstanceOf(NetconfRestconfStrategy.class, server.getRestconfStrategy(JUKEBOX_SCHEMA, mountPoint));
+        assertInstanceOf(NetconfRestconfStrategy.class, server.getRestconfStrategy(JUKEBOX_DATABIND, mountPoint));
     }
 
     @Test
@@ -92,7 +92,7 @@ class MdsalRestconfServerTest extends AbstractJukeboxTest {
         doReturn(Optional.of(schemaService)).when(mountPoint).getService(DOMSchemaService.class);
         doReturn(ImmutableClassToInstanceMap.of()).when(schemaService).getExtensions();
         final var ex = assertThrows(RestconfDocumentedException.class,
-            () -> server.getRestconfStrategy(JUKEBOX_SCHEMA, mountPoint));
+            () -> server.getRestconfStrategy(JUKEBOX_DATABIND, mountPoint));
         final var errors = ex.getErrors();
         assertEquals(1, errors.size());
         final var error = errors.get(0);