opendaylight: сохранение укуса в MDSAL
У меня есть модель YANG (известная MDSAL), которую я использую в приложении opendaylight. В моем приложении мне предоставляется строка в формате json, которую я хочу сохранить в базе данных MDSAL. Я мог бы использовать конструктор объекта, который я хочу сохранить, и установить его с полями, представленными в формате String в формате json, один за другим, но это трудоемко и подвержено ошибкам.
В качестве альтернативы я мог бы отправлять сообщения из приложения в Northbound API, который в конечном итоге будет писать в хранилище данных MDSAL.
Есть ли более простой способ сделать это?
Спасибо,
2 ответа
Предполагая, что ваш входящий JSON точно соответствует структуре вашей модели YANG (не так ли?), Я считаю, что вы действительно ищете, чтобы преобразовать этот JSON во внутреннюю модель "независимую от привязки" (не с установщиками сгенерированного класса Java) - NormalizedNode & Co. Где-то в проекте контроллера или mdsal есть класс "кодека", который может сделать это.
Вы можете либо искать такой код, и его использование (я считаю, что тестирование всегда полезно) в исходном коде контроллера 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());
}
}
}
}