package org.opendaylight.restconf.nb.rfc8040.handlers;
import static java.util.Objects.requireNonNull;
+import static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.monitoring.rev170126.$YangModuleInfoImpl.qnameOf;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Throwables;
import javax.annotation.PreDestroy;
import javax.inject.Inject;
import javax.inject.Singleton;
+import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
import org.opendaylight.mdsal.dom.api.DOMDataBroker;
import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
import org.opendaylight.mdsal.dom.api.DOMSchemaService;
import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
+import org.opendaylight.restconf.nb.rfc8040.AbstractReplayParameter;
+import org.opendaylight.restconf.nb.rfc8040.DepthParameter;
+import org.opendaylight.restconf.nb.rfc8040.FieldsParameter;
+import org.opendaylight.restconf.nb.rfc8040.FilterParameter;
import org.opendaylight.restconf.nb.rfc8040.Rfc8040.IetfYangLibrary;
-import org.opendaylight.restconf.nb.rfc8040.utils.mapping.RestconfMappingNodeUtil;
+import org.opendaylight.restconf.nb.rfc8040.WithDefaultsParameter;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.monitoring.rev170126.RestconfState;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.monitoring.rev170126.restconf.state.Capabilities;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.ModulesState;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.list.Module.ConformanceType;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.list.module.Deviation;
@Singleton
public class SchemaContextHandler implements EffectiveModelContextListener, AutoCloseable {
private static final Logger LOG = LoggerFactory.getLogger(SchemaContextHandler.class);
+
+ @VisibleForTesting
+ static final @NonNull QName CAPABILITY_QNAME = qnameOf("capability");
+
private static final NodeIdentifier MODULE_CONFORMANCE_NODEID =
NodeIdentifier.create(QName.create(IetfYangLibrary.MODULE_QNAME, "conformance-type").intern());
private static final NodeIdentifier MODULE_FEATURE_NODEID =
public void onModelContextUpdated(final EffectiveModelContext context) {
schemaContext = requireNonNull(context);
- if (context.findModule(IetfYangLibrary.MODULE_QNAME).isPresent()) {
+ if (context.findModuleStatement(IetfYangLibrary.MODULE_QNAME).isPresent()) {
putData(mapModulesByIetfYangLibraryYang(context.getModules(), context,
- String.valueOf(this.moduleSetId.incrementAndGet())));
+ String.valueOf(moduleSetId.incrementAndGet())));
}
- final Module monitoringModule = schemaContext.findModule(RestconfState.QNAME.getModule()).orElse(null);
- if (monitoringModule != null) {
- putData(RestconfMappingNodeUtil.mapCapabilites(monitoringModule));
+ if (schemaContext.findModuleStatement(RestconfState.QNAME.getModule()).isPresent()) {
+ putData(mapCapabilites());
}
}
}
}
+ /**
+ * Map capabilites by ietf-restconf-monitoring.
+ *
+ * @param monitoringModule ietf-restconf-monitoring module
+ * @return mapped capabilites
+ */
+ @VisibleForTesting
+ static ContainerNode mapCapabilites() {
+ return Builders.containerBuilder()
+ .withNodeIdentifier(new NodeIdentifier(RestconfState.QNAME))
+ .withChild(Builders.containerBuilder()
+ .withNodeIdentifier(new NodeIdentifier(Capabilities.QNAME))
+ .withChild(Builders.<String>orderedLeafSetBuilder()
+ .withNodeIdentifier(new NodeIdentifier(CAPABILITY_QNAME))
+ .withChildValue(DepthParameter.capabilityUri().toString())
+ .withChildValue(FieldsParameter.capabilityUri().toString())
+ .withChildValue(FilterParameter.capabilityUri().toString())
+ .withChildValue(AbstractReplayParameter.capabilityUri().toString())
+ .withChildValue(WithDefaultsParameter.capabilityUri().toString())
+ .build())
+ .build())
+ .build();
+ }
/**
* Map data from modules to {@link NormalizedNode}.
.withChild(mapBuilder.build()).build();
}
-
/**
* Map data by the specific module or submodule.
*
import java.util.Collection;
import java.util.Optional;
import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
-import org.opendaylight.restconf.nb.rfc8040.AbstractReplayParameter;
-import org.opendaylight.restconf.nb.rfc8040.DepthParameter;
-import org.opendaylight.restconf.nb.rfc8040.FieldsParameter;
-import org.opendaylight.restconf.nb.rfc8040.FilterParameter;
-import org.opendaylight.restconf.nb.rfc8040.WithDefaultsParameter;
import org.opendaylight.restconf.nb.rfc8040.utils.parser.IdentifierCodec;
import org.opendaylight.restconf.nb.rfc8040.utils.parser.ParserIdentifier;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.monitoring.rev170126.RestconfState;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.monitoring.rev170126.restconf.state.Capabilities;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.monitoring.rev170126.restconf.state.streams.Stream;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.monitoring.rev170126.restconf.state.streams.stream.Access;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
-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.MapNode;
import org.opendaylight.yangtools.yang.data.api.schema.builder.DataContainerNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
import org.opendaylight.yangtools.yang.model.api.SchemaNode;
* Util class for mapping nodes.
*/
public final class RestconfMappingNodeUtil {
- private static final QName CAPABILITY_QNAME = qnameOf("capability");
@VisibleForTesting
static final QName DESCRIPTION_QNAME = qnameOf("description");
@VisibleForTesting
// Hidden on purpose
}
- /**
- * Map capabilites by ietf-restconf-monitoring.
- *
- * @param monitoringModule ietf-restconf-monitoring module
- * @return mapped capabilites
- */
- public static ContainerNode mapCapabilites(final Module monitoringModule) {
- return Builders.containerBuilder()
- .withNodeIdentifier(new NodeIdentifier(RestconfState.QNAME))
- .withChild(Builders.containerBuilder()
- .withNodeIdentifier(new NodeIdentifier(Capabilities.QNAME))
- .withChild(Builders.<String>orderedLeafSetBuilder()
- .withNodeIdentifier(new NodeIdentifier(CAPABILITY_QNAME))
- .withChildValue(DepthParameter.capabilityUri().toString())
- .withChildValue(FieldsParameter.capabilityUri().toString())
- .withChildValue(FilterParameter.capabilityUri().toString())
- .withChildValue(AbstractReplayParameter.capabilityUri().toString())
- .withChildValue(WithDefaultsParameter.capabilityUri().toString())
- .build())
- .build())
- .build();
- }
-
/**
* Map data of yang notification to normalized node according to ietf-restconf-monitoring.
*
*/
package org.opendaylight.restconf.nb.rfc8040.handlers;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;
import java.io.FileNotFoundException;
+import java.util.stream.Collectors;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
import org.opendaylight.mdsal.dom.api.DOMSchemaService;
import org.opendaylight.restconf.nb.rfc8040.TestRestconfUtils;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.monitoring.rev170126.restconf.state.Capabilities;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
doReturn(wTx).when(dataBroker).newWriteOnlyTransaction();
doReturn(CommitInfo.emptyFluentFuture()).when(wTx).commit();
- this.schemaContextHandler = new SchemaContextHandler(dataBroker, mockDOMSchemaService);
+ schemaContextHandler = new SchemaContextHandler(dataBroker, mockDOMSchemaService);
- this.schemaContextHandler.onModelContextUpdated(SchemaContextHandlerTest.SCHEMA_CONTEXT);
+ schemaContextHandler.onModelContextUpdated(SCHEMA_CONTEXT);
}
/**
@Test
public void getSchemaContextTest() {
assertEquals("SchemaContextHandler should has reference to actual SchemaContext",
- SCHEMA_CONTEXT, this.schemaContextHandler.get());
+ SCHEMA_CONTEXT, schemaContextHandler.get());
}
/**
// create new SchemaContext and update SchemaContextHandler
final EffectiveModelContext newSchemaContext =
YangParserTestUtils.parseYangFiles(TestRestconfUtils.loadFiles(PATH_FOR_NEW_SCHEMA_CONTEXT));
- this.schemaContextHandler.onModelContextUpdated(newSchemaContext);
+ schemaContextHandler.onModelContextUpdated(newSchemaContext);
assertNotEquals("SchemaContextHandler should not has reference to old SchemaContext",
- SCHEMA_CONTEXT, this.schemaContextHandler.get());
+ SCHEMA_CONTEXT, schemaContextHandler.get());
assertEquals("SchemaContextHandler should has reference to new SchemaContext",
- newSchemaContext, this.schemaContextHandler.get());
+ newSchemaContext, schemaContextHandler.get());
}
+
+ @Test
+ public void restconfStateCapabilitesTest() {
+ final ContainerNode normNode = SchemaContextHandler.mapCapabilites();
+
+ @SuppressWarnings("unchecked")
+ final LeafSetNode<String> capability = (LeafSetNode<String>) normNode.body().stream()
+ // Find 'capabilities' container
+ .filter(child -> Capabilities.QNAME.equals(child.getIdentifier().getNodeType()))
+ .findFirst()
+ .map(ContainerNode.class::cast)
+ .orElseThrow()
+ // Find 'capability' leaf-list
+ .body().stream()
+ .filter(child -> SchemaContextHandler.CAPABILITY_QNAME.equals(child.getIdentifier().getNodeType()))
+ .findFirst()
+ .orElseThrow();
+
+ assertThat(
+ capability.body().stream().map(entry -> ((LeafSetEntryNode<?>) entry).body()).collect(Collectors.toList()),
+ containsInAnyOrder(
+ equalTo("urn:ietf:params:restconf:capability:depth:1.0"),
+ equalTo("urn:ietf:params:restconf:capability:fields:1.0"),
+ equalTo("urn:ietf:params:restconf:capability:filter:1.0"),
+ equalTo("urn:ietf:params:restconf:capability:replay:1.0"),
+ equalTo("urn:ietf:params:restconf:capability:with-defaults:1.0")));
+ }
+
}
*/
package org.opendaylight.restconf.nb.rfc8040.utils.mapping;
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
import org.junit.BeforeClass;
import org.junit.Test;
import org.opendaylight.restconf.nb.rfc8040.TestRestconfUtils;
import org.opendaylight.restconf.nb.rfc8040.handlers.SchemaContextHandler;
import org.opendaylight.restconf.nb.rfc8040.utils.parser.ParserIdentifier;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.monitoring.rev170126.RestconfState;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.monitoring.rev170126.restconf.state.Capabilities;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.list.module.Deviation;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.Revision;
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
-import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
-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.model.api.EffectiveModelContext;
verifyDeviations(mods);
}
- @Test
- public void restconfStateCapabilitesTest() {
- final Module monitoringModule = schemaContextMonitoring.findModule(RestconfState.QNAME.getModule()).get();
- final ContainerNode normNode = RestconfMappingNodeUtil.mapCapabilites(monitoringModule);
- assertNotNull(normNode);
- final List<Object> listOfValues = new ArrayList<>();
-
- for (final DataContainerChild child : normNode.body()) {
- if (child.getIdentifier().getNodeType().equals(Capabilities.QNAME)) {
- for (final DataContainerChild dataContainerChild : ((ContainerNode) child).body()) {
- for (final Object entry : ((LeafSetNode<?>) dataContainerChild).body()) {
- listOfValues.add(((LeafSetEntryNode<?>) entry).body());
- }
- }
- }
- }
-
- assertThat(listOfValues, containsInAnyOrder(
- equalTo("urn:ietf:params:restconf:capability:depth:1.0"),
- equalTo("urn:ietf:params:restconf:capability:fields:1.0"),
- equalTo("urn:ietf:params:restconf:capability:filter:1.0"),
- equalTo("urn:ietf:params:restconf:capability:replay:1.0"),
- equalTo("urn:ietf:params:restconf:capability:with-defaults:1.0")));
- }
-
@Test
public void toStreamEntryNodeTest() throws Exception {
final YangInstanceIdentifier path = ParserIdentifier.toInstanceIdentifier(