import org.opendaylight.yangtools.yang.common.Revision;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
final UriInfo uriInfo, final RestconfTransaction transaction, final boolean exist,
final NotificationListenerAdapter listener) {
final URI uri = streamUtils.prepareUriByStreamName(uriInfo, listener.getStreamName());
- final NormalizedNode<?, ?> mapToStreams =
- RestconfMappingNodeUtil.mapYangNotificationStreamByIetfRestconfMonitoring(
+ final MapEntryNode mapToStreams = RestconfMappingNodeUtil.mapYangNotificationStreamByIetfRestconfMonitoring(
listener.getSchemaPath().lastNodeIdentifier(), schemaContext.getNotifications(), null,
- listener.getOutputType(), uri, SubscribeToStreamUtil.getMonitoringModule(schemaContext), exist);
- writeDataToDS(schemaContext,
- listener.getSchemaPath().lastNodeIdentifier().getLocalName(), transaction, exist, mapToStreams);
- }
-
- private static boolean checkExist(final EffectiveModelContext schemaContext, final RestconfStrategy strategy) {
- try {
- return strategy.exists(LogicalDatastoreType.OPERATIONAL,
- IdentifierCodec.deserialize(Rfc8040.MonitoringModule.PATH_TO_STREAMS, schemaContext)).get();
- } catch (final InterruptedException | ExecutionException exception) {
- throw new RestconfDocumentedException("Problem while checking data if exists", exception);
- }
- }
+ listener.getOutputType(), uri, SubscribeToStreamUtil.getMonitoringModule(schemaContext));
- private static void writeDataToDS(final EffectiveModelContext schemaContext, final String name,
- final RestconfTransaction transaction, final boolean exist,
- final NormalizedNode<?, ?> mapToStreams) {
+ final String name = listener.getSchemaPath().lastNodeIdentifier().getLocalName();
final String pathId;
if (exist) {
pathId = Rfc8040.MonitoringModule.PATH_TO_STREAM_WITHOUT_KEY + name;
mapToStreams);
}
+ private static boolean checkExist(final EffectiveModelContext schemaContext, final RestconfStrategy strategy) {
+ try {
+ return strategy.exists(LogicalDatastoreType.OPERATIONAL,
+ IdentifierCodec.deserialize(Rfc8040.MonitoringModule.PATH_TO_STREAMS, schemaContext)).get();
+ } catch (final InterruptedException | ExecutionException exception) {
+ throw new RestconfDocumentedException("Problem while checking data if exists", exception);
+ }
+ }
+
@Override
public Response putData(final String identifier, final NormalizedNodeContext payload, final UriInfo uriInfo) {
requireNonNull(payload);
import org.opendaylight.mdsal.dom.api.DOMDataBroker;
import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeReadOperations;
import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction;
import org.opendaylight.mdsal.dom.api.DOMNotificationListener;
import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
import org.opendaylight.restconf.nb.rfc8040.utils.mapping.RestconfMappingNodeUtil;
import org.opendaylight.restconf.nb.rfc8040.utils.parser.IdentifierCodec;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
final DOMTransactionChain transactionChain = handlersHolder.getTransactionChainHandler().get();
final DOMDataTreeReadWriteTransaction writeTransaction = transactionChain.newReadWriteTransaction();
final EffectiveModelContext schemaContext = handlersHolder.getSchemaHandler().get();
- final boolean exist = checkExist(schemaContext, writeTransaction);
final URI uri = prepareUriByStreamName(uriInfo, streamName);
registerToListenNotification(
false, notificationQueryParams.isSkipNotificationData());
notificationListenerAdapter.get().setCloseVars(
handlersHolder.getTransactionChainHandler(), handlersHolder.getSchemaHandler());
- final NormalizedNode<?, ?> mapToStreams =
- RestconfMappingNodeUtil.mapYangNotificationStreamByIetfRestconfMonitoring(
+ final MapEntryNode mapToStreams = RestconfMappingNodeUtil.mapYangNotificationStreamByIetfRestconfMonitoring(
notificationListenerAdapter.get().getSchemaPath().lastNodeIdentifier(),
schemaContext.getNotifications(), notificationQueryParams.getStart(),
- notificationListenerAdapter.get().getOutputType(), uri, getMonitoringModule(schemaContext), exist);
+ notificationListenerAdapter.get().getOutputType(), uri, getMonitoringModule(schemaContext));
writeDataToDS(schemaContext,
- notificationListenerAdapter.get().getSchemaPath().lastNodeIdentifier().getLocalName(), writeTransaction,
- exist, mapToStreams);
+ notificationListenerAdapter.get().getSchemaPath().lastNodeIdentifier().getLocalName(), writeTransaction,
+ mapToStreams);
submitData(writeTransaction);
transactionChain.close();
return uri;
final DOMTransactionChain transactionChain = handlersHolder.getTransactionChainHandler().get();
final DOMDataTreeReadWriteTransaction writeTransaction = transactionChain.newReadWriteTransaction();
final EffectiveModelContext schemaContext = handlersHolder.getSchemaHandler().get();
- final boolean exist = checkExist(schemaContext, writeTransaction);
- final NormalizedNode<?, ?> mapToStreams = RestconfMappingNodeUtil
- .mapDataChangeNotificationStreamByIetfRestconfMonitoring(listener.get().getPath(),
- notificationQueryParams.getStart(), listener.get().getOutputType(), uri,
- getMonitoringModule(schemaContext), exist, schemaContext);
+ final MapEntryNode mapToStreams =
+ RestconfMappingNodeUtil.mapDataChangeNotificationStreamByIetfRestconfMonitoring(listener.get().getPath(),
+ notificationQueryParams.getStart(), listener.get().getOutputType(), uri,
+ getMonitoringModule(schemaContext), schemaContext);
writeDataToDS(schemaContext, listener.get().getPath().getLastPathArgument().getNodeType().getLocalName(),
- writeTransaction, exist, mapToStreams);
+ writeTransaction, mapToStreams);
submitData(writeTransaction);
transactionChain.close();
return uri;
}
private static void writeDataToDS(final EffectiveModelContext schemaContext, final String name,
- final DOMDataTreeReadWriteTransaction readWriteTransaction, final boolean exist,
- final NormalizedNode<?, ?> mapToStreams) {
- String pathId;
- if (exist) {
- pathId = MonitoringModule.PATH_TO_STREAM_WITHOUT_KEY + name;
- } else {
- pathId = MonitoringModule.PATH_TO_STREAMS;
- }
+ final DOMDataTreeReadWriteTransaction readWriteTransaction, final MapEntryNode mapToStreams) {
readWriteTransaction.merge(LogicalDatastoreType.OPERATIONAL,
- IdentifierCodec.deserialize(pathId, schemaContext), mapToStreams);
+ // FIXME: do not use IdentifierCodec here
+ IdentifierCodec.deserialize(MonitoringModule.PATH_TO_STREAM_WITHOUT_KEY + name, schemaContext),
+ mapToStreams);
}
private static void submitData(final DOMDataTreeReadWriteTransaction readWriteTransaction) {
listener.setRegistration(registration);
}
- private static boolean checkExist(final EffectiveModelContext schemaContext,
- final DOMDataTreeReadOperations readWriteTransaction) {
- try {
- return readWriteTransaction.exists(LogicalDatastoreType.OPERATIONAL,
- IdentifierCodec.deserialize(MonitoringModule.PATH_TO_STREAMS, schemaContext)).get();
- } catch (final InterruptedException | ExecutionException exception) {
- throw new RestconfDocumentedException("Problem while checking data if exists", exception);
- }
- }
-
private static void registerToListenNotification(final NotificationListenerAdapter listener,
final NotificationServiceHandler notificationServiceHandler) {
if (listener.isListening()) {
* notification
* @param monitoringModule
* ietf-restconf-monitoring module
- * @param existParent
- * true if data of parent -
- * ietf-restconf-monitoring:restconf-state/streams - exist in DS
* @return mapped data of notification - map entry node if parent exists,
* container streams with list and map entry node if not
*/
- public static NormalizedNode<?, ?> mapYangNotificationStreamByIetfRestconfMonitoring(final QName notifiQName,
+ public static MapEntryNode mapYangNotificationStreamByIetfRestconfMonitoring(final QName notifiQName,
final Collection<? extends NotificationDefinition> notifications, final Instant start,
- final String outputType, final URI uri, final Module monitoringModule, final boolean existParent) {
+ final String outputType, final URI uri, final Module monitoringModule) {
for (final NotificationDefinition notificationDefinition : notifications) {
if (notificationDefinition.getQName().equals(notifiQName)) {
final DataSchemaNode streamListSchema = ((ContainerSchemaNode) ((ContainerSchemaNode) monitoringModule
(ListSchemaNode) listSchema.getDataChildByName(MonitoringModule.LIST_ACCESS_STREAM_QNAME),
outputType, uri);
- if (!existParent) {
- final DataSchemaNode contStreamsSchema = ((ContainerSchemaNode) monitoringModule
- .getDataChildByName(MonitoringModule.CONT_RESTCONF_STATE_QNAME))
- .getDataChildByName(MonitoringModule.CONT_STREAMS_QNAME);
- return Builders.containerBuilder((ContainerSchemaNode) contStreamsSchema).withChild(Builders
- .mapBuilder((ListSchemaNode) streamListSchema).withChild(streamEntry.build()).build())
- .build();
- }
return streamEntry.build();
}
}
* notification
* @param monitoringModule
* ietf-restconf-monitoring module
- * @param existParent
- * true if data of parent -
- * ietf-restconf-monitoring:restconf-state/streams - exist in DS
* @param schemaContext
* schemaContext for parsing instance identifier to get schema
* node of data
* @return mapped data of notification - map entry node if parent exists,
* container streams with list and map entry node if not
*/
- public static NormalizedNode<?, ?> mapDataChangeNotificationStreamByIetfRestconfMonitoring(
+ public static MapEntryNode mapDataChangeNotificationStreamByIetfRestconfMonitoring(
final YangInstanceIdentifier path, final Instant start, final String outputType, final URI uri,
- final Module monitoringModule, final boolean existParent, final EffectiveModelContext schemaContext) {
+ final Module monitoringModule, final EffectiveModelContext schemaContext) {
final SchemaNode schemaNode = ParserIdentifier
.toInstanceIdentifier(ParserIdentifier.stringFromYangInstanceIdentifier(path, schemaContext),
schemaContext, Optional.empty())
(ListSchemaNode) listSchema.getDataChildByName(MonitoringModule.LIST_ACCESS_STREAM_QNAME), outputType,
uri);
- if (!existParent) {
- final DataSchemaNode contStreamsSchema = ((ContainerSchemaNode) monitoringModule
- .getDataChildByName(MonitoringModule.CONT_RESTCONF_STATE_QNAME))
- .getDataChildByName(MonitoringModule.CONT_STREAMS_QNAME);
- return Builders
- .containerBuilder((ContainerSchemaNode) contStreamsSchema).withChild(Builders
- .mapBuilder((ListSchemaNode) streamListSchema).withChild(streamEntry.build()).build())
- .build();
- }
return streamEntry.build();
}
}
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
-import static org.opendaylight.yangtools.util.concurrent.FluentFutures.immediateTrueFluentFuture;
import com.google.common.collect.ImmutableClassToInstanceMap;
import java.io.FileNotFoundException;
final DOMDataTreeWriteTransaction wTx = mock(DOMDataTreeWriteTransaction.class);
when(domTx.newWriteOnlyTransaction()).thenReturn(wTx);
final DOMDataTreeReadWriteTransaction rwTx = mock(DOMDataTreeReadWriteTransaction.class);
- when(rwTx.exists(any(), any())).thenReturn(immediateTrueFluentFuture());
doReturn(CommitInfo.emptyFluentFuture()).when(rwTx).commit();
when(domTx.newReadWriteTransaction()).thenReturn(rwTx);
doReturn(CommitInfo.emptyFluentFuture()).when(wTx).commit();
import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
@Test
public void restconfMappingNodeTest() {
// write modules into list module in Restconf
- final Module ietfYangLibMod = schemaContext.findModule(IetfYangLibrary.MODULE_QNAME).get();
final ContainerNode mods = RestconfMappingNodeUtil.mapModulesByIetfYangLibraryYang(
RestconfMappingNodeUtilTest.modules, schemaContext, "1");
final String outputType = "XML";
final URI uri = new URI("uri");
final Module monitoringModule = schemaContextMonitoring.findModule(MonitoringModule.MODULE_QNAME).orElse(null);
- final boolean exist = true;
- final Map<QName, Object> map =
- prepareMap(path.getLastPathArgument().getNodeType().getLocalName(), uri, start, outputType);
+ final Map<QName, Object> map = prepareMap(path.getLastPathArgument().getNodeType().getLocalName(), uri, start,
+ outputType);
- final NormalizedNode<?, ?> mappedData =
- RestconfMappingNodeUtil.mapDataChangeNotificationStreamByIetfRestconfMonitoring(
- path, start, outputType, uri, monitoringModule, exist, schemaContextMonitoring);
- assertNotNull(mappedData);
- testData(map, mappedData);
+ final MapEntryNode mappedData = RestconfMappingNodeUtil.mapDataChangeNotificationStreamByIetfRestconfMonitoring(
+ path, start, outputType, uri, monitoringModule, schemaContextMonitoring);
+ assertMappedData(map, mappedData);
}
@Test
final String outputType = "JSON";
final URI uri = new URI("uri");
final Module monitoringModule = schemaContextMonitoring.findModule(MonitoringModule.MODULE_QNAME).orElse(null);
- final boolean exist = true;
final Map<QName, Object> map = prepareMap("notifi", uri, start, outputType);
map.put(MonitoringModule.LEAF_DESCR_STREAM_QNAME, "Notifi");
final QName notifiQName = QName.create("urn:nested:module", "2014-06-03", "notifi");
- final NormalizedNode<?, ?> mappedData =
- RestconfMappingNodeUtil.mapYangNotificationStreamByIetfRestconfMonitoring(notifiQName,
- schemaContextMonitoring.getNotifications(), start, outputType, uri, monitoringModule, exist);
- assertNotNull(mappedData);
- testData(map, mappedData);
+ final MapEntryNode mappedData = RestconfMappingNodeUtil.mapYangNotificationStreamByIetfRestconfMonitoring(
+ notifiQName, schemaContextMonitoring.getNotifications(), start, outputType, uri, monitoringModule);
+ assertMappedData(map, mappedData);
}
private static Map<QName, Object> prepareMap(final String name, final URI uri, final Instant start,
return map;
}
- private static void testData(final Map<QName, Object> map, final NormalizedNode<?, ?> mappedData) {
- for (final DataContainerChild<? extends PathArgument, ?> child : ((MapEntryNode) mappedData).getValue()) {
+ private static void assertMappedData(final Map<QName, Object> map, final MapEntryNode mappedData) {
+ assertNotNull(mappedData);
+ for (final DataContainerChild<?, ?> child : mappedData.getValue()) {
if (child instanceof LeafNode) {
final LeafNode<?> leaf = (LeafNode<?>) child;
assertTrue(map.containsKey(leaf.getNodeType()));