From d3fcf5ed18efa48efff27b77b3e2a06cbb004626 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Mon, 7 Jun 2021 11:13:36 +0200 Subject: [PATCH] Add SchemaInferenceStack.ofSchemaPath() RESTCONF models are using groupings to communicate serialized data, for which we need an alternative instantiation, which uses the legacy SchemaPath interpretation. Change-Id: I4dec567ade0705a9af7497d53689a286858c411e Signed-off-by: Robert Varga --- .../SchemaOrderedNormalizedNodeWriter.java | 4 +-- .../util/NormalizedNodeStreamWriterStack.java | 2 +- .../yang/model/util/SchemaInferenceStack.java | 35 ++++++++++++++++++- 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/SchemaOrderedNormalizedNodeWriter.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/SchemaOrderedNormalizedNodeWriter.java index 5a364ee6b8..eb7c77f67a 100644 --- a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/SchemaOrderedNormalizedNodeWriter.java +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/SchemaOrderedNormalizedNodeWriter.java @@ -65,7 +65,7 @@ public class SchemaOrderedNormalizedNodeWriter extends NormalizedNodeWriter { super(writer); this.schemaContext = requireNonNull(schemaContext); - final SchemaInferenceStack stack = SchemaInferenceStack.ofInstantiatedPath(schemaContext, path); + final SchemaInferenceStack stack = SchemaInferenceStack.ofSchemaPath(schemaContext, path); if (!stack.isEmpty()) { final EffectiveStatement current = stack.currentStatement(); // FIXME: this should be one of NormalizedNodeContainer/NotificationDefinition/OperationDefinition @@ -208,4 +208,4 @@ public class SchemaOrderedNormalizedNodeWriter extends NormalizedNodeWriter { SchemaOrderedNormalizedNodeWriter.this.currentSchemaNode = previousSchemaNode; } } -} \ No newline at end of file +} diff --git a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/NormalizedNodeStreamWriterStack.java b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/NormalizedNodeStreamWriterStack.java index 89052d8f92..6eb0e7750b 100644 --- a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/NormalizedNodeStreamWriterStack.java +++ b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/NormalizedNodeStreamWriterStack.java @@ -148,7 +148,7 @@ public final class NormalizedNodeStreamWriterStack implements LeafrefResolver { @Deprecated public static @NonNull NormalizedNodeStreamWriterStack of(final EffectiveModelContext context, final SchemaPath path) { - return new NormalizedNodeStreamWriterStack(SchemaInferenceStack.ofInstantiatedPath(context, path)); + return new NormalizedNodeStreamWriterStack(SchemaInferenceStack.ofSchemaPath(context, path)); } /** diff --git a/model/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaInferenceStack.java b/model/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaInferenceStack.java index 4a6c97a211..91610e6788 100644 --- a/model/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaInferenceStack.java +++ b/model/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaInferenceStack.java @@ -245,7 +245,7 @@ public final class SchemaInferenceStack implements Mutable, EffectiveModelContex /** * Create a new stack backed by an effective model, pointing to specified schema node identified by an absolute - * {@link SchemaPath} and its {@link SchemaPath#getPathFromRoot()}. + * {@link SchemaPath} and its {@link SchemaPath#getPathFromRoot()} interpreted as a schema node identifier. * * @param effectiveModel EffectiveModelContext to which this stack is attached * @return A new stack @@ -262,6 +262,39 @@ public final class SchemaInferenceStack implements Mutable, EffectiveModelContex return ret; } + /** + * Create a new stack backed by an effective model, pointing to specified schema node identified by an absolute + * {@link SchemaPath} and its {@link SchemaPath#getPathFromRoot()}, interpreted as a series of steps along primarily + * schema tree, with grouping namespace being the alternative lookup. + * + * @param effectiveModel EffectiveModelContext to which this stack is attached + * @return A new stack + * @throws NullPointerException {@code effectiveModel} is null + * @throws IllegalArgumentException if {@code path} cannot be resolved in the effective model or if it is not an + * absolute path. + */ + @Deprecated + public static @NonNull SchemaInferenceStack ofSchemaPath(final EffectiveModelContext effectiveModel, + final SchemaPath path) { + checkArgument(path.isAbsolute(), "Cannot operate on relative path %s", path); + final SchemaInferenceStack ret = new SchemaInferenceStack(effectiveModel); + + for (QName step : path.getPathFromRoot()) { + try { + ret.enterSchemaTree(step); + } catch (IllegalArgumentException schemaEx) { + try { + ret.enterGrouping(step); + } catch (IllegalArgumentException ex) { + ex.addSuppressed(schemaEx); + throw ex; + } + } + } + + return ret; + } + @Override public EffectiveModelContext getEffectiveModelContext() { return effectiveModel; -- 2.36.6