opendaylight:在MDSAL中存储刺痛

时间:2018-05-27 15:48:37

标签: opendaylight

我有一个YANG模型(MDSAL已知),我在opendaylight应用程序中使用它。在我的应用程序中,我看到了一个json格式的String,我想将其存储在MDSAL数据库中。我可以使用我希望存储的对象的构建器,并使用json格式的String中的字段逐个设置它,但这很费力且容易出错。

或者,我可以从应用程序内部发布到最终将写入MDSAL数据存储区的Northbound API。

有更简单的方法吗?

谢谢,

2 个答案:

答案 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());
            }
        }
    }

}