*/
package org.opendaylight.restconf.common.context;
+import org.eclipse.jdt.annotation.Nullable;
import org.opendaylight.mdsal.dom.api.DOMMountPoint;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
import org.opendaylight.yangtools.yang.model.api.SchemaNode;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
public class InstanceIdentifierContext<T extends SchemaNode> {
private final YangInstanceIdentifier instanceIdentifier;
+ private final @Nullable SchemaNodeIdentifier schemaNodeIdentifier;
private final T schemaNode;
private final DOMMountPoint mountPoint;
private final EffectiveModelContext schemaContext;
- public InstanceIdentifierContext(final YangInstanceIdentifier instanceIdentifier, final T schemaNode,
- final DOMMountPoint mountPoint, final EffectiveModelContext context) {
+ public InstanceIdentifierContext(final YangInstanceIdentifier instanceIdentifier,
+ final T schemaNode, final DOMMountPoint mountPoint,
+ final EffectiveModelContext context) {
+ this(instanceIdentifier, null, schemaNode, mountPoint, context);
+ }
+
+ public InstanceIdentifierContext(final YangInstanceIdentifier instanceIdentifier,
+ final SchemaNodeIdentifier schemaNodeIdentifier,
+ final T schemaNode, final DOMMountPoint mountPoint,
+ final EffectiveModelContext context) {
this.instanceIdentifier = instanceIdentifier;
+ this.schemaNodeIdentifier = schemaNodeIdentifier;
this.schemaNode = schemaNode;
this.mountPoint = mountPoint;
this.schemaContext = context;
return instanceIdentifier;
}
+ public SchemaNodeIdentifier getSchemaNodeIdentifier() {
+ return schemaNodeIdentifier;
+ }
+
public T getSchemaNode() {
return schemaNode;
}
import java.lang.reflect.Type;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
-import java.util.List;
import java.util.Map.Entry;
-import java.util.stream.Collectors;
import javanet.staxutils.IndentingXMLStreamWriter;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import org.opendaylight.netconf.util.NetconfUtil;
import org.opendaylight.restconf.common.context.InstanceIdentifierContext;
import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
import org.opendaylight.yangtools.yang.data.api.schema.DOMSourceAnyxmlNode;
import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
nnWriter = createNormalizedNodeWriter(xmlWriter, schemaCtx, path, depth);
writeElements(xmlWriter, nnWriter, (ContainerNode) data);
} else {
- final List<QName> qNames = pathContext.getInstanceIdentifier().getPathArguments().stream()
- .filter(arg -> !(arg instanceof YangInstanceIdentifier.NodeIdentifierWithPredicates))
- .filter(arg -> !(arg instanceof YangInstanceIdentifier.AugmentationIdentifier))
- .map(PathArgument::getNodeType)
- .collect(Collectors.toList());
- final SchemaPath path = SchemaPath.of(Absolute.of(qNames)).getParent();
+ final SchemaPath path;
+ if (pathContext.getSchemaNodeIdentifier() == null) {
+ path = SchemaPath.ROOT;
+ } else {
+ path = SchemaPath.of(pathContext.getSchemaNodeIdentifier()).getParent();
+ }
nnWriter = createNormalizedNodeWriter(xmlWriter, schemaCtx, path, depth);
if (data instanceof MapEntryNode) {
// Restconf allows returning one list item. We need to wrap it
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
checkPreconditions();
if (restconfInstance == null) {
- return new InstanceIdentifierContext<>(YangInstanceIdentifier.empty(), globalSchema, null,
+ return new InstanceIdentifierContext<>(YangInstanceIdentifier.empty(), null, globalSchema, null,
globalSchema);
}
}
final InstanceIdentifierContext<?> iiWithSchemaNode =
- collectPathArguments(builder, pathArgs, latestModule.iterator().next(), null, toMountPointIdentifier);
+ collectPathArguments(builder, pathArgs, new ArrayList<>(), latestModule.iterator().next(), null,
+ toMountPointIdentifier);
if (iiWithSchemaNode == null) {
throw new RestconfDocumentedException("URI has bad format", ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE);
return object == null ? "" : URLEncoder.encode(codec.serialize(object).toString(), StandardCharsets.UTF_8);
}
+ private SchemaNodeIdentifier schemaNodeIdentifierFromPath(final List<QName> qnames) {
+ return qnames.isEmpty() ? null : Absolute.of(qnames);
+ }
+
@SuppressFBWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE", justification = "Unrecognised NullableDecl")
private InstanceIdentifierContext<?> collectPathArguments(final InstanceIdentifierBuilder builder,
- final List<String> strings, final DataNodeContainer parentNode, final DOMMountPoint mountPoint,
- final boolean returnJustMountPoint) {
+ final List<String> strings, final List<QName> qnames, final DataNodeContainer parentNode,
+ final DOMMountPoint mountPoint, final boolean returnJustMountPoint) {
requireNonNull(strings);
if (parentNode == null) {
final EffectiveModelContext modelContext = mountPoint != null ? getModelContext(mountPoint) : globalSchema;
if (strings.isEmpty()) {
- return createContext(builder.build(), (DataSchemaNode) parentNode, mountPoint, modelContext);
+ return createContext(builder.build(), schemaNodeIdentifierFromPath(qnames), (DataSchemaNode) parentNode,
+ mountPoint, modelContext);
}
final String head = strings.iterator().next();
if (head.isEmpty()) {
final List<String> remaining = strings.subList(1, strings.size());
- return collectPathArguments(builder, remaining, parentNode, mountPoint, returnJustMountPoint);
+ return collectPathArguments(builder, remaining, qnames, parentNode, mountPoint, returnJustMountPoint);
}
final String nodeName = toNodeName(head);
}
if (returnJustMountPoint || strings.size() == 1) {
- return new InstanceIdentifierContext<>(YangInstanceIdentifier.empty(), mountPointSchema, mount,
+ return new InstanceIdentifierContext<>(YangInstanceIdentifier.empty(), null,
+ mountPointSchema, mount,
mountPointSchema);
}
}
final List<String> subList = strings.subList(1, strings.size());
- return collectPathArguments(YangInstanceIdentifier.builder(), subList, it.next(), mount,
- returnJustMountPoint);
+ return collectPathArguments(YangInstanceIdentifier.builder(), subList, new ArrayList<>(), it.next(),
+ mount, returnJustMountPoint);
}
Module module = null;
rpc = getRpcDefinition(module, rpcName);
}
if (rpc != null) {
- return new InstanceIdentifierContext<>(builder.build(), rpc, mountPoint, modelContext);
+ return new InstanceIdentifierContext<>(builder.build(), null, rpc, mountPoint, modelContext);
}
}
builder.node(targetNode.getQName());
}
+ qnames.add(targetNode.getQName());
+
if (targetNode instanceof DataNodeContainer) {
final List<String> remaining = strings.subList(consumed, strings.size());
- return collectPathArguments(builder, remaining, (DataNodeContainer) targetNode, mountPoint,
+ return collectPathArguments(builder, remaining, qnames, (DataNodeContainer) targetNode, mountPoint,
returnJustMountPoint);
}
- return createContext(builder.build(), targetNode, mountPoint, modelContext);
+ return createContext(builder.build(), Absolute.of(qnames), targetNode, mountPoint, modelContext);
}
private static InstanceIdentifierContext<?> createContext(final YangInstanceIdentifier instance,
- final DataSchemaNode dataSchemaNode, final DOMMountPoint mountPoint,
- final EffectiveModelContext schemaContext) {
+ final SchemaNodeIdentifier schemaNodeIdentifier, final DataSchemaNode dataSchemaNode,
+ final DOMMountPoint mountPoint, final EffectiveModelContext schemaContext) {
final YangInstanceIdentifier instanceIdentifier = new DataNormalizer(schemaContext).toNormalized(instance);
- return new InstanceIdentifierContext<>(instanceIdentifier, dataSchemaNode, mountPoint, schemaContext);
+ return new InstanceIdentifierContext<>(instanceIdentifier, schemaNodeIdentifier, dataSchemaNode, mountPoint,
+ schemaContext);
}
public static DataSchemaNode findInstanceDataChildByNameAndNamespace(final DataNodeContainer container,
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.model.api.SchemaNode;
import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
.appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true)
.appendOffset("+HH:MM", "Z").toFormatter();
+ private static final @NonNull QName RESTCONF = QName.create(RestConfModule.IETF_RESTCONF_QNAME, "restconf");
+
private static final YangInstanceIdentifier MODULES = YangInstanceIdentifier.builder()
- .node(QName.create(RestConfModule.IETF_RESTCONF_QNAME, "restconf"))
- .node(QName.create(RestConfModule.IETF_RESTCONF_QNAME, "restconf"))
+ .node(RESTCONF)
+ .node(RESTCONF)
.node(MODULES_CONTAINER_QNAME)
.build();
private static final YangInstanceIdentifier MODULE = YangInstanceIdentifier.builder()
- .node(QName.create(RestConfModule.IETF_RESTCONF_QNAME, "restconf"))
- .node(QName.create(RestConfModule.IETF_RESTCONF_QNAME, "restconf"))
+ .node(RESTCONF)
+ .node(RESTCONF)
.node(MODULES_CONTAINER_QNAME)
.node(MODULE_LIST_QNAME)
.build();
private static final YangInstanceIdentifier STREAMS = YangInstanceIdentifier.builder()
- .node(QName.create(RestConfModule.IETF_RESTCONF_QNAME, "restconf"))
- .node(QName.create(RestConfModule.IETF_RESTCONF_QNAME, "restconf"))
+ .node(RESTCONF)
+ .node(RESTCONF)
.node(STREAMS_CONTAINER_QNAME)
.build();
+ private static final SchemaNodeIdentifier MODULES_SCHEMA_IDENTIFIER =
+ Absolute.of(RESTCONF, RESTCONF, MODULES_CONTAINER_QNAME);
+ private static final SchemaNodeIdentifier MODULE_SCHEMA_IDENTIFIER =
+ Absolute.of(RESTCONF, RESTCONF, MODULES_CONTAINER_QNAME, MODULE_LIST_QNAME);
+ private static final SchemaNodeIdentifier STREAMS_SCHEMA_IDENTIFIER =
+ Absolute.of(RESTCONF, RESTCONF, STREAMS_CONTAINER_QNAME);
+
private final BrokerFacade broker;
private final ControllerContext controllerContext;
SchemaAwareBuilders.containerBuilder((ContainerSchemaNode) modulesSchemaNode);
moduleContainerBuilder.withChild(allModuleMap);
- return new NormalizedNodeContext(new InstanceIdentifierContext<>(MODULES, modulesSchemaNode, null,
- schemaContext), moduleContainerBuilder.build(), QueryParametersParser.parseWriterParameters(uriInfo));
+ return new NormalizedNodeContext(new InstanceIdentifierContext<>(MODULES, MODULES_SCHEMA_IDENTIFIER,
+ modulesSchemaNode, null, schemaContext), moduleContainerBuilder.build(),
+ QueryParametersParser.parseWriterParameters(uriInfo));
}
/**
moduleContainerBuilder.withChild(mountPointModulesMap);
return new NormalizedNodeContext(
- new InstanceIdentifierContext<>(MODULES, modulesSchemaNode, mountPoint,
+ new InstanceIdentifierContext<>(MODULES, MODULES_SCHEMA_IDENTIFIER, modulesSchemaNode, mountPoint,
controllerContext.getGlobalSchema()),
moduleContainerBuilder.build(), QueryParametersParser.parseWriterParameters(uriInfo));
}
checkState(moduleSchemaNode instanceof ListSchemaNode);
return new NormalizedNodeContext(
- new InstanceIdentifierContext<>(MODULE, moduleSchemaNode, mountPoint, schemaContext), moduleMap,
+ new InstanceIdentifierContext<>(MODULE, MODULE_SCHEMA_IDENTIFIER, moduleSchemaNode, mountPoint,
+ schemaContext), moduleMap,
QueryParametersParser.parseWriterParameters(uriInfo));
}
streamsContainerBuilder.withChild(listStreamsBuilder.build());
return new NormalizedNodeContext(
- new InstanceIdentifierContext<>(STREAMS, streamsContainerSchemaNode, null, schemaContext),
+ new InstanceIdentifierContext<>(STREAMS, STREAMS_SCHEMA_IDENTIFIER, streamsContainerSchemaNode,
+ null, schemaContext),
streamsContainerBuilder.build(), QueryParametersParser.parseWriterParameters(uriInfo));
}