opendaylight : 在 MDSAL 中存储一个 sting
opendaylight : Storing a sting in MDSAL
我在 opendaylight 应用程序中使用了一个 YANG 模型(MDSAL 已知)。在我的应用程序中,我看到了一个 json 格式的字符串,我想将其存储在 MDSAL 数据库中。我可以使用我希望存储的对象的构建器,并用 json 格式的字符串中显示的字段一个一个地设置它,但这是费力且容易出错的。
或者,我可以 post 从应用程序内部到 Northbound API,最终将写入 MDSAL 数据存储。
有更简单的方法吗?
谢谢,
假设您传入的 JSON 与您的 YANG 模型的结构完全匹配(是吗?),我相信您真正想要的是将 JSON 转换为 "binding independant"(不是生成的 Java class 的设置器)内部模型 - NormalizedNode & Co. 在控制器或 mdsal 项目的某处有一个 "codec" class 可以做到这一点.
您可以在 ODL 控制器和 mdsal 项目源代码或其他执行类似操作的 ODL 项目中搜索此类代码及其用法(我发现查看测试总是有用的)- 我在想专门浏览 jsonrpc 和 daexim 项目源;具体来说,这看起来可能会激发您的灵感:https://github.com/opendaylight/daexim/blob/stable/nitrogen/impl/src/main/java/org/opendaylight/daexim/impl/ImportTask.java
祝你好运。
根据以上信息,我构建了以下内容(我将其发布在这里以帮助其他人)。我仍然不知道如何摆脱对 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());
}
}
}
}
我在 opendaylight 应用程序中使用了一个 YANG 模型(MDSAL 已知)。在我的应用程序中,我看到了一个 json 格式的字符串,我想将其存储在 MDSAL 数据库中。我可以使用我希望存储的对象的构建器,并用 json 格式的字符串中显示的字段一个一个地设置它,但这是费力且容易出错的。
或者,我可以 post 从应用程序内部到 Northbound API,最终将写入 MDSAL 数据存储。
有更简单的方法吗?
谢谢,
假设您传入的 JSON 与您的 YANG 模型的结构完全匹配(是吗?),我相信您真正想要的是将 JSON 转换为 "binding independant"(不是生成的 Java class 的设置器)内部模型 - NormalizedNode & Co. 在控制器或 mdsal 项目的某处有一个 "codec" class 可以做到这一点.
您可以在 ODL 控制器和 mdsal 项目源代码或其他执行类似操作的 ODL 项目中搜索此类代码及其用法(我发现查看测试总是有用的)- 我在想专门浏览 jsonrpc 和 daexim 项目源;具体来说,这看起来可能会激发您的灵感:https://github.com/opendaylight/daexim/blob/stable/nitrogen/impl/src/main/java/org/opendaylight/daexim/impl/ImportTask.java
祝你好运。
根据以上信息,我构建了以下内容(我将其发布在这里以帮助其他人)。我仍然不知道如何摆脱对 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());
}
}
}
}