import org.opendaylight.yangtools.yang.data.codec.gson.JsonWriterFactory;
import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.model.api.SchemaNode;
jsonWriter,
depth,
fields);
- jsonWriter.name("output");
+ final Module module = context.getSchemaContext().findModule(data.getNodeType().getModule()).get();
+ jsonWriter.name(module.getName() + ":output");
jsonWriter.beginObject();
writeChildren(nnWriter, (ContainerNode) data);
jsonWriter.endObject();
final SchemaNode schema = context.getSchemaNode();
final JSONCodecFactory codecs = getCodecFactory(context);
- final URI initialNs;
- if (schema instanceof DataSchemaNode
- && !((DataSchemaNode)schema).isAugmenting()
- && !(schema instanceof SchemaContext)) {
- initialNs = schema.getQName().getNamespace();
- } else if (schema instanceof RpcDefinition) {
- initialNs = schema.getQName().getNamespace();
- } else {
- initialNs = null;
- }
final NormalizedNodeStreamWriter streamWriter = JSONNormalizedNodeStreamWriter.createNestedWriter(
- codecs, path, initialNs, jsonWriter);
+ codecs, path, initialNamespaceFor(schema, depth), jsonWriter);
+
return ParameterAwareNormalizedNodeWriter.forStreamWriter(streamWriter, depth, fields);
}
+ private static URI initialNamespaceFor(final SchemaNode schema, final Integer depth) {
+ if (schema instanceof RpcDefinition) {
+ return schema.getQName().getNamespace();
+ }
+ // For top-level elements we always want to use namespace prefix, hence use a null initial namespace
+ if (depth == null || depth == 0 || schema instanceof SchemaContext) {
+ return null;
+ }
+ return schema instanceof DataSchemaNode && !((DataSchemaNode)schema).isAugmenting()
+ ? schema.getQName().getNamespace() : null;
+ }
+
private static JsonWriter createJsonWriter(final OutputStream entityStream, final boolean prettyPrint) {
if (prettyPrint) {
return JsonWriterFactory.createJsonWriter(
}
// merge data from config and state
- return mapNode(stateDataNode, configDataNode);
+ return mergeStateAndConfigData(stateDataNode, configDataNode);
}
/**
- * Map data by type of read node.
+ * Merge state and config data into a single NormalizedNode.
*
* @param stateDataNode
* data node of state data
* @return {@link NormalizedNode}
*/
@Nonnull
- private static NormalizedNode<?, ?> mapNode(@Nonnull final NormalizedNode<?, ?> stateDataNode,
- @Nonnull final NormalizedNode<?, ?> configDataNode) {
- validPossibilityOfMergeNodes(stateDataNode, configDataNode);
+ private static NormalizedNode<?, ?> mergeStateAndConfigData(@Nonnull final NormalizedNode<?, ?> stateDataNode,
+ @Nonnull final NormalizedNode<?, ?> configDataNode) {
+ validateNodeMerge(stateDataNode, configDataNode);
if (configDataNode instanceof RpcDefinition) {
return prepareRpcData(configDataNode, stateDataNode);
} else {
}
/**
- * Valid of can be data merged together.
+ * Validates whether the two NormalizedNodes can be merged.
*
* @param stateDataNode
* data node of state data
* @param configDataNode
* data node of config data
*/
- private static void validPossibilityOfMergeNodes(@Nonnull final NormalizedNode<?, ?> stateDataNode,
- @Nonnull final NormalizedNode<?, ?> configDataNode) {
+ private static void validateNodeMerge(@Nonnull final NormalizedNode<?, ?> stateDataNode,
+ @Nonnull final NormalizedNode<?, ?> configDataNode) {
final QNameModule moduleOfStateData = stateDataNode.getIdentifier().getNodeType().getModule();
final QNameModule moduleOfConfigData = configDataNode.getIdentifier().getNodeType().getModule();
- if (moduleOfStateData != moduleOfConfigData) {
- throw new RestconfDocumentedException("It is not possible to merge ");
+ if (!moduleOfStateData.equals(moduleOfConfigData)) {
+ throw new RestconfDocumentedException("Unable to merge data from different modules.");
}
}
assertEquals("Output present", true, output.isPresent());
assertNotNull("Returned null response", output.get());
+ assertThat("Output element is missing namespace", output.get(), containsString("\"toaster:output\""));
assertThat("Missing \"textOut\"", output.get(), containsString("\"textOut\":\"foo\""));
verify(mockRpcService).invokeRpc(eq(path), isNull(NormalizedNode.class));
final String jsonResp = optionalResp.get();
assertNotNull("Returned null response", jsonResp);
+ assertThat("Top level module has incorrect format", jsonResp, containsString("\"ietf-interfaces:interface\""));
+ assertThat("Missing \"name\"", jsonResp, containsString("\"name\":\"eth0\""));
assertThat("Missing \"name\"", jsonResp, containsString("\"name\":\"eth0\""));
assertThat("Missing \"type\"", jsonResp, containsString("\"type\":\"ethernetCsmacd\""));
assertThat("Missing \"enabled\"", jsonResp, containsString("\"enabled\":true"));