我有一个YANG模型(MDSAL已知),我在opendaylight应用程序中使用它。在我的应用程序中,我看到了一个json格式的String,我想将其存储在MDSAL数据库中。我可以使用我希望存储的对象的构建器,并使用json格式的String中的字段逐个设置它,但这很费力且容易出错。
或者,我可以从应用程序内部发布到最终将写入MDSAL数据存储区的Northbound API。
有更简单的方法吗?
谢谢,
答案 0 :(得分:0)
假设您传入的JSON与您的YANG模型的结构完全匹配(是吗?),我相信您真正想要的是将该JSON转换为"绑定独立的" (不是生成的Java类的setter)内部模型 - NormalizedNode&在控制器或mdsal项目的某个地方有一个"编解码器"可以做到这一点的课程。
您可以在ODL控制器和mdsal项目源代码中搜索此类代码及其用法(我发现测试总是很有用),或者在其他做类似事情的ODL项目中进行搜索 - 我在思考专门浏览jsonrpc和daexim项目源;具体来说,这可能会激发你的灵感:https://github.com/opendaylight/daexim/blob/stable/nitrogen/impl/src/main/java/org/opendaylight/daexim/impl/ImportTask.java
祝你好运。
答案 1 :(得分:0)
根据以上信息,我构建了以下内容(我在这里发帖以帮助其他人)。我仍然不知道如何摆脱对SchemaService的弃用引用(也许有人可以提供帮助)。
private void importFromNormalizedNode(final DOMDataReadWriteTransaction rwTrx, final LogicalDatastoreType type,
final NormalizedNode<?, ?> data) throws TransactionCommitFailedException, ReadFailedException {
if (data instanceof NormalizedNodeContainer) {
@SuppressWarnings("unchecked")
YangInstanceIdentifier yid = YangInstanceIdentifier.create(data.getIdentifier());
rwTrx.put(type, yid, data);
} else {
throw new IllegalStateException("Root node is not instance of NormalizedNodeContainer");
}
}
private void importDatastore(String jsonData, QName qname) throws TransactionCommitFailedException, IOException,
ReadFailedException, SchemaSourceException, YangSyntaxErrorException {
// create StringBuffer object
LOG.info("jsonData = " + jsonData);
byte bytes[] = jsonData.getBytes();
InputStream is = new ByteArrayInputStream(bytes);
final NormalizedNodeContainerBuilder<?, ?, ?, ?> builder = ImmutableContainerNodeBuilder.create()
.withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(qname));
try (NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(builder)) {
SchemaPath schemaPath = SchemaPath.create(true, qname);
LOG.info("SchemaPath " + schemaPath);
SchemaNode parentNode = SchemaContextUtil.findNodeInSchemaContext(schemaService.getGlobalContext(),
schemaPath.getPathFromRoot());
LOG.info("parentNode " + parentNode);
try (JsonParserStream jsonParser = JsonParserStream.create(writer, schemaService.getGlobalContext(),
parentNode)) {
try (JsonReader reader = new JsonReader(new InputStreamReader(is))) {
reader.setLenient(true);
jsonParser.parse(reader);
DOMDataReadWriteTransaction rwTrx = domDataBroker.newReadWriteTransaction();
importFromNormalizedNode(rwTrx, LogicalDatastoreType.CONFIGURATION, builder.build());
}
}
}
}