import java.io.Reader;
import java.net.URL;
import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.NonNullByDefault;
import org.opendaylight.yangtools.concepts.Delegator;
import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
/**
- * A resource-backed {@link YangTextSource}.
+ * A {@link YangTextSource} backed by a {@link URL}.
*/
-final class ResourceYangTextSource extends YangTextSource implements Delegator<URL> {
- private final @NonNull URL url;
- private final @NonNull Charset charset;
+@NonNullByDefault
+public class URLYangTextSource extends YangTextSource implements Delegator<URL> {
+ private final URL url;
+ private final Charset charset;
- ResourceYangTextSource(final SourceIdentifier sourceId, final URL url, final Charset charset) {
+ public URLYangTextSource(final SourceIdentifier sourceId, final URL url, final Charset charset) {
super(sourceId);
this.url = requireNonNull(url);
this.charset = requireNonNull(charset);
}
+ /**
+ * Utility constructor. The {@link SourceIdentifier} is derived from {@link URL#getPath()} and the character set is
+ * assumed to be UTF-8.
+ *
+ * @param url backing {@link URL}
+ */
+ public URLYangTextSource(final URL url) {
+ this(SourceIdentifier.ofYangFileName(extractFileName(url.getPath())), url, StandardCharsets.UTF_8);
+ }
+
@Override
- public URL getDelegate() {
- return url;
+ public final Reader openStream() throws IOException {
+ return new InputStreamReader(url.openStream(), charset);
}
@Override
- protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
- return super.addToStringAttributes(toStringHelper).add("url", url);
+ public final @NonNull String symbolicName() {
+ return url.toString();
}
@Override
- public Reader openStream() throws IOException {
- return new InputStreamReader(url.openStream(), charset);
+ public final URL getDelegate() {
+ return url;
}
@Override
- public String symbolicName() {
- return url.toString();
+ protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
+ return super.addToStringAttributes(toStringHelper).add("url", url);
+ }
+
+ private static String extractFileName(final String path) {
+ return path.substring(path.lastIndexOf('/') + 1);
}
}
import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper;
import com.google.common.io.CharSource;
-import com.google.common.io.Resources;
import java.io.File;
import java.io.InputStream;
-import java.net.URL;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
throw new IllegalArgumentException("Supplied path " + path + " is not a regular file");
}
- /**
- * Create a new {@link YangTextSource} backed by a resource available in the ClassLoader where this
- * class resides.
- *
- * @param resourceName Resource name
- * @return A new instance.
- * @throws IllegalArgumentException if the resource does not exist or if the name has invalid format
- */
- public static @NonNull YangTextSource forResource(final String resourceName) {
- return forResource(YangTextSource.class, resourceName);
- }
-
- /**
- * Create a new {@link YangTextSource} backed by a resource by a resource available on the ClassLoader
- * which loaded the specified class.
- *
- * @param clazz Class reference
- * @param resourceName Resource name
- * @return A new instance.
- * @throws IllegalArgumentException if the resource does not exist or if the name has invalid format
- */
- public static @NonNull YangTextSource forResource(final Class<?> clazz, final String resourceName) {
- return forResource(clazz, resourceName, StandardCharsets.UTF_8);
- }
-
- /**
- * Create a new {@link YangTextSource} backed by a resource by a resource available on the ClassLoader
- * which loaded the specified class.
- *
- * @param clazz Class reference
- * @param resourceName Resource name
- * @param charset Expected character set
- * @return A new instance.
- * @throws IllegalArgumentException if the resource does not exist or if the name has invalid format
- */
- public static @NonNull YangTextSource forResource(final Class<?> clazz, final String resourceName,
- final Charset charset) {
- final var fileName = resourceName.substring(resourceName.lastIndexOf('/') + 1);
- final var identifier = SourceIdentifier.ofYangFileName(fileName);
- final var url = Resources.getResource(clazz, resourceName);
- return new ResourceYangTextSource(identifier, url, charset);
- }
-
-
- /**
- * Create a new {@link YangTextSource} backed by a URL.
- *
- * @param url Backing URL
- * @param identifier Source identifier
- * @return A new instance.
- * @throws NullPointerException if any argument is {@code null}
- */
- public static @NonNull YangTextSource forURL(final URL url, final SourceIdentifier identifier) {
- return forURL(url, identifier, StandardCharsets.UTF_8);
- }
-
- /**
- * Create a new {@link YangTextSource} backed by a URL.
- *
- * @param url Backing URL
- * @param identifier Source identifier
- * @param charset Expected character set
- * @return A new instance.
- * @throws NullPointerException if any argument is {@code null}
- */
- public static @NonNull YangTextSource forURL(final URL url, final SourceIdentifier identifier,
- final Charset charset) {
- return new ResourceYangTextSource(identifier, url, charset);
- }
-
@Override
public final Class<YangTextSource> getType() {
return YangTextSource.class;
import org.opendaylight.yangtools.yang.model.api.stmt.LeafEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.LeafListEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ListEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.spi.source.YangTextSource;
+import org.opendaylight.yangtools.yang.model.spi.source.URLYangTextSource;
import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration;
import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors;
import org.opendaylight.yangtools.yang.parser.rfc7950.repo.YangStatementStreamSource;
.build();
final var foo = reactor.newBuild()
- .addSource(YangStatementStreamSource.create(YangTextSource.forResource(
- ContextReferenceTest.class, "/yang-ext.yang")))
- .addSource(YangStatementStreamSource.create(YangTextSource.forResource(
- ContextReferenceTest.class, "/ctxref.yang")))
+ .addSource(YangStatementStreamSource.create(new URLYangTextSource(
+ ContextReferenceTest.class.getResource("/yang-ext.yang"))))
+ .addSource(YangStatementStreamSource.create(new URLYangTextSource(
+ ContextReferenceTest.class.getResource("/ctxref.yang"))))
.buildEffective()
.getModuleStatements()
.get(FOO);
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.QNameModule;
import org.opendaylight.yangtools.yang.common.XMLNamespace;
-import org.opendaylight.yangtools.yang.model.spi.source.YangTextSource;
+import org.opendaylight.yangtools.yang.model.spi.source.URLYangTextSource;
import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration;
import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors;
import org.opendaylight.yangtools.yang.parser.rfc7950.repo.YangStatementStreamSource;
new MountStatementSupport(YangParserConfiguration.DEFAULT))
.build();
final var foo = reactor.newBuild()
- .addSource(YangStatementStreamSource.create(YangTextSource.forResource(MountTest.class, "/yang-ext.yang")))
- .addSource(YangStatementStreamSource.create(YangTextSource.forResource(MountTest.class, "/mount.yang")))
+ .addSource(YangStatementStreamSource.create(new URLYangTextSource(
+ MountTest.class.getResource("/yang-ext.yang"))))
+ .addSource(YangStatementStreamSource.create(new URLYangTextSource(
+ MountTest.class.getResource("/mount.yang"))))
.buildEffective()
.getModuleStatements()
.get(FOO);
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
-import org.opendaylight.yangtools.yang.model.spi.source.YangTextSource;
+import org.opendaylight.yangtools.yang.model.spi.source.URLYangTextSource;
import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration;
import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors;
import org.opendaylight.yangtools.yang.parser.rfc7950.repo.YangStatementStreamSource;
.build();
final var context = reactor.newBuild()
.addLibSources(YangStatementStreamSource.create(
- YangTextSource.forResource(NetconfTest.class, "/ietf-inet-types@2013-07-15.yang")))
+ new URLYangTextSource(NetconfTest.class.getResource("/ietf-inet-types@2013-07-15.yang"))))
.addSource(YangStatementStreamSource.create(
- YangTextSource.forResource(NetconfTest.class, "/ietf-netconf@2011-06-01.yang")))
+ new URLYangTextSource(NetconfTest.class.getResource("/ietf-netconf@2011-06-01.yang"))))
.buildEffective();
final var module = context.findModule(NetconfConstants.RFC6241_MODULE).orElseThrow();
import org.opendaylight.yangtools.rfc6536.model.api.DefaultDenyWriteSchemaNode;
import org.opendaylight.yangtools.rfc6536.model.api.NACMConstants;
import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.spi.source.YangTextSource;
+import org.opendaylight.yangtools.yang.model.spi.source.URLYangTextSource;
import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration;
import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors;
import org.opendaylight.yangtools.yang.parser.rfc7950.repo.YangStatementStreamSource;
final var context = reactor.newBuild()
.addSources(
YangStatementStreamSource.create(
- YangTextSource.forResource(NACMTest.class, "/ietf-netconf-acm@2012-02-22.yang")),
+ new URLYangTextSource(NACMTest.class.getResource("/ietf-netconf-acm@2012-02-22.yang"))),
YangStatementStreamSource.create(
- YangTextSource.forResource(NACMTest.class, "/ietf-yang-types@2013-07-15.yang")))
+ new URLYangTextSource(NACMTest.class.getResource("/ietf-yang-types@2013-07-15.yang"))))
.buildEffective();
final var module = context.findModule(NACMConstants.RFC6536_MODULE).orElseThrow();
import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
-import org.opendaylight.yangtools.yang.model.spi.source.YangTextSource;
+import org.opendaylight.yangtools.yang.model.spi.source.URLYangTextSource;
import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration;
import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors;
import org.opendaylight.yangtools.yang.parser.rfc7950.repo.YangStatementStreamSource;
.build();
final var schema = reactor.newBuild()
.addSources(
- YangStatementStreamSource.create(YangTextSource.forResource(
- IetfYangSmiv2ExtensionPluginTest.class, "/foo.yang")),
- YangStatementStreamSource.create(YangTextSource.forResource(
- IetfYangSmiv2ExtensionPluginTest.class, "/ietf-yang-smiv2.yang")))
+ YangStatementStreamSource.create(new URLYangTextSource(
+ IetfYangSmiv2ExtensionPluginTest.class.getResource("/foo.yang"))),
+ YangStatementStreamSource.create(new URLYangTextSource(
+ IetfYangSmiv2ExtensionPluginTest.class.getResource("/ietf-yang-smiv2.yang"))))
.buildEffective();
assertEquals(1, schema.getUnknownSchemaNodes().size());
import org.opendaylight.yangtools.yang.common.AnnotationName;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.model.ri.type.BaseTypes;
-import org.opendaylight.yangtools.yang.model.spi.source.YangTextSource;
+import org.opendaylight.yangtools.yang.model.spi.source.URLYangTextSource;
import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration;
import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors;
import org.opendaylight.yangtools.yang.parser.rfc7950.repo.YangStatementStreamSource;
final var context = reactor.newBuild()
.addSources(
YangStatementStreamSource.create(
- YangTextSource.forResource(AnnotationTest.class, "/ietf-yang-metadata@2016-08-05.yang")),
+ new URLYangTextSource(AnnotationTest.class.getResource("/ietf-yang-metadata@2016-08-05.yang"))),
YangStatementStreamSource.create(
- YangTextSource.forResource(AnnotationTest.class, "/example-last-modified.yang")))
+ new URLYangTextSource(AnnotationTest.class.getResource("/example-last-modified.yang"))))
.buildEffective();
final var annotations = AnnotationSchemaNode.findAll(context);
import java.io.IOException;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
-import org.opendaylight.yangtools.yang.model.spi.source.YangTextSource;
+import org.opendaylight.yangtools.yang.model.spi.source.URLYangTextSource;
import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration;
import org.opendaylight.yangtools.yang.parser.api.YangSyntaxErrorException;
import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors;
static StatementStreamSource sourceForResource(final String resourceName) {
try {
return YangStatementStreamSource.create(
- YangTextSource.forResource(AbstractYangDataTest.class, resourceName));
+ new URLYangTextSource(AbstractYangDataTest.class.getResource(resourceName)));
} catch (IOException | YangSyntaxErrorException e) {
throw new IllegalArgumentException("Failed to create source", e);
}
import org.opendaylight.yangtools.yang.common.XMLNamespace;
import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
-import org.opendaylight.yangtools.yang.model.spi.source.YangTextSource;
+import org.opendaylight.yangtools.yang.model.spi.source.URLYangTextSource;
import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration;
import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors;
import org.opendaylight.yangtools.yang.parser.rfc7950.repo.YangStatementStreamSource;
final var context = reactor.newBuild()
.addLibSources(
YangStatementStreamSource.create(
- YangTextSource.forResource(MountPointTest.class, "/ietf-inet-types@2013-07-15.yang")),
+ new URLYangTextSource(MountPointTest.class.getResource("/ietf-inet-types@2013-07-15.yang"))),
YangStatementStreamSource.create(
- YangTextSource.forResource(MountPointTest.class, "/ietf-yang-schema-mount@2019-01-14.yang")),
+ new URLYangTextSource(MountPointTest.class.getResource("/ietf-yang-schema-mount@2019-01-14.yang"))),
YangStatementStreamSource.create(
- YangTextSource.forResource(MountPointTest.class, "/ietf-yang-types@2013-07-15.yang")))
+ new URLYangTextSource(MountPointTest.class.getResource("/ietf-yang-types@2013-07-15.yang"))))
.addSources(
- YangStatementStreamSource.create(YangTextSource.forResource(MountPointTest.class, "/example-grp.yang")),
YangStatementStreamSource.create(
- YangTextSource.forResource(MountPointTest.class, "/example-uses.yang")))
+ new URLYangTextSource(MountPointTest.class.getResource("/example-grp.yang"))),
+ YangStatementStreamSource.create(
+ new URLYangTextSource(MountPointTest.class.getResource("/example-uses.yang"))))
.buildEffective();
assertEquals(5, context.getModules().size());
import org.opendaylight.yangtools.rfc8639.model.api.SubscribedNotificationsConstants;
import org.opendaylight.yangtools.rfc8639.model.api.SubscriptionStateNotificationEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.NotificationEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.spi.source.YangTextSource;
+import org.opendaylight.yangtools.yang.model.spi.source.URLYangTextSource;
import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration;
import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors;
import org.opendaylight.yangtools.yang.parser.rfc7950.repo.YangStatementStreamSource;
final var context = reactor.newBuild()
.addLibSources(
- YangStatementStreamSource.create(YangTextSource.forResource(
- SubscribedNotificationsTest.class, "/ietf-inet-types@2013-07-15.yang")),
- YangStatementStreamSource.create(YangTextSource.forResource(
- SubscribedNotificationsTest.class, "/ietf-interfaces@2018-02-20.yang")),
- YangStatementStreamSource.create(YangTextSource.forResource(
- SubscribedNotificationsTest.class, "/ietf-ip@2018-02-22.yang")),
- YangStatementStreamSource.create(YangTextSource.forResource(
- SubscribedNotificationsTest.class, "/ietf-netconf-acm@2018-02-14.yang")),
- YangStatementStreamSource.create(YangTextSource.forResource(
- SubscribedNotificationsTest.class, "/ietf-network-instance@2019-01-21.yang")),
- YangStatementStreamSource.create(YangTextSource.forResource(
- SubscribedNotificationsTest.class, "/ietf-restconf@2017-01-26.yang")),
- YangStatementStreamSource.create(YangTextSource.forResource(
- SubscribedNotificationsTest.class, "/ietf-yang-schema-mount@2019-01-14.yang")),
- YangStatementStreamSource.create(YangTextSource.forResource(
- SubscribedNotificationsTest.class, "/ietf-yang-types@2013-07-15.yang")))
+ YangStatementStreamSource.create(new URLYangTextSource(
+ SubscribedNotificationsTest.class.getResource("/ietf-inet-types@2013-07-15.yang"))),
+ YangStatementStreamSource.create(new URLYangTextSource(
+ SubscribedNotificationsTest.class.getResource("/ietf-interfaces@2018-02-20.yang"))),
+ YangStatementStreamSource.create(new URLYangTextSource(
+ SubscribedNotificationsTest.class.getResource("/ietf-ip@2018-02-22.yang"))),
+ YangStatementStreamSource.create(new URLYangTextSource(
+ SubscribedNotificationsTest.class.getResource("/ietf-netconf-acm@2018-02-14.yang"))),
+ YangStatementStreamSource.create(new URLYangTextSource(
+ SubscribedNotificationsTest.class.getResource("/ietf-network-instance@2019-01-21.yang"))),
+ YangStatementStreamSource.create(new URLYangTextSource(
+ SubscribedNotificationsTest.class.getResource("/ietf-restconf@2017-01-26.yang"))),
+ YangStatementStreamSource.create(new URLYangTextSource(
+ SubscribedNotificationsTest.class.getResource("/ietf-yang-schema-mount@2019-01-14.yang"))),
+ YangStatementStreamSource.create(new URLYangTextSource(
+ SubscribedNotificationsTest.class.getResource("/ietf-yang-types@2013-07-15.yang"))))
.addSources(
- YangStatementStreamSource.create(YangTextSource.forResource(
- SubscribedNotificationsTest.class, "/ietf-subscribed-notifications@2019-09-09.yang")))
+ YangStatementStreamSource.create(new URLYangTextSource(
+ SubscribedNotificationsTest.class.getResource("/ietf-subscribed-notifications@2019-09-09.yang"))))
.buildEffective();
final var notifications = context.getModuleStatement(SubscribedNotificationsConstants.RFC8639_MODULE)
import org.junit.jupiter.api.Test;
import org.opendaylight.yangtools.rfc8819.model.api.ModuleTagEffectiveStatement;
import org.opendaylight.yangtools.rfc8819.model.api.Tag;
-import org.opendaylight.yangtools.yang.model.spi.source.YangTextSource;
+import org.opendaylight.yangtools.yang.model.spi.source.URLYangTextSource;
import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration;
import org.opendaylight.yangtools.yang.parser.api.YangSyntaxErrorException;
import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors;
private static YangStatementStreamSource moduleFromResources(final String resourceName) {
try {
- return YangStatementStreamSource.create(YangTextSource.forResource(ModuleTagTest.class, resourceName));
+ return YangStatementStreamSource.create(new URLYangTextSource(
+ ModuleTagTest.class.getResource(resourceName)));
} catch (final YangSyntaxErrorException | IOException e) {
throw new IllegalStateException("Failed to find resource " + resourceName, e);
}
import com.google.common.util.concurrent.FluentFuture;
import java.io.IOException;
import java.net.URL;
+import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Collection;
import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider;
import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistry;
import org.opendaylight.yangtools.yang.model.spi.source.DelegatedYangTextSource;
+import org.opendaylight.yangtools.yang.model.spi.source.URLYangTextSource;
import org.opendaylight.yangtools.yang.model.spi.source.YangIRSchemaSource;
import org.opendaylight.yangtools.yang.model.spi.source.YangTextSource;
import org.opendaylight.yangtools.yang.parser.api.YangParserFactory;
throws SchemaSourceException, IOException, YangSyntaxErrorException {
final String path = url.getPath();
final String fileName = path.substring(path.lastIndexOf('/') + 1);
- return registerSource(YangTextSource.forURL(url, guessSourceIdentifier(fileName)));
+ return registerSource(new URLYangTextSource(guessSourceIdentifier(fileName), url, StandardCharsets.UTF_8));
}
/**
import org.opendaylight.yangtools.yang.model.api.meta.DeclarationInText;
import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
-import org.opendaylight.yangtools.yang.model.spi.source.YangTextSource;
+import org.opendaylight.yangtools.yang.model.spi.source.URLYangTextSource;
import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration;
-public class YT1193Test {
+class YT1193Test {
@Test
void testDeclarationReference() throws Exception {
final var declaredRoots = new DefaultYangParserFactory()
.createParser(YangParserConfiguration.builder().retainDeclarationReferences(true).build())
- .addSource(YangTextSource.forResource(getClass(), "/yt1193/foo.yang"))
- .addSource(YangTextSource.forResource(getClass(), "/yt1193/bar.yang"))
- .addSource(YangTextSource.forResource(getClass(), "/yt1193/baz.yang"))
+ .addSource(new URLYangTextSource(YT1193Test.class.getResource("/yt1193/foo.yang")))
+ .addSource(new URLYangTextSource(YT1193Test.class.getResource("/yt1193/bar.yang")))
+ .addSource(new URLYangTextSource(YT1193Test.class.getResource("/yt1193/baz.yang")))
.buildDeclaredModel();
assertEquals(3, declaredRoots.size());
*/
package org.opendaylight.yangtools.yang.parser.repo;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import com.google.common.collect.SetMultimap;
import org.opendaylight.yangtools.yang.common.QNameModule;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
import org.opendaylight.yangtools.yang.model.repo.api.SchemaContextFactoryConfiguration;
+import org.opendaylight.yangtools.yang.model.spi.source.URLYangTextSource;
import org.opendaylight.yangtools.yang.model.spi.source.YangIRSchemaSource;
-import org.opendaylight.yangtools.yang.model.spi.source.YangTextSource;
import org.opendaylight.yangtools.yang.parser.api.YangSyntaxErrorException;
import org.opendaylight.yangtools.yang.parser.rfc7950.repo.TextToIRTransformer;
.createEffectiveModelContext(requiredSources);
}
- private static SettableSchemaProvider<YangIRSchemaSource> assertYangTextResource(final String resourceName) {
+ static final SettableSchemaProvider<YangIRSchemaSource> assertYangTextResource(final String resourceName) {
final YangIRSchemaSource yangSource;
try {
- yangSource = TextToIRTransformer.transformText(YangTextSource.forResource(resourceName));
+ yangSource = TextToIRTransformer.transformText(
+ new URLYangTextSource(AbstractSchemaRepositoryTest.class.getResource(resourceName)));
} catch (YangSyntaxErrorException | IOException e) {
throw new AssertionError("Failed to parse " + resourceName, e);
}
return SettableSchemaProvider.createImmediate(yangSource, YangIRSchemaSource.class);
}
+
+ static final void assertSchemaContext(final EffectiveModelContext schemaContext, final int moduleSize) {
+ assertNotNull(schemaContext);
+ assertEquals(moduleSize, schemaContext.getModuleStatements().size());
+ }
}
import org.opendaylight.yangtools.yang.model.api.source.SourceDependency.BelongsTo;
import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
import org.opendaylight.yangtools.yang.model.spi.source.SourceInfo;
-import org.opendaylight.yangtools.yang.model.spi.source.YangTextSource;
+import org.opendaylight.yangtools.yang.model.spi.source.URLYangTextSource;
import org.opendaylight.yangtools.yang.parser.rfc7950.repo.YangIRSourceInfoExtractor;
class DependencyResolverTest {
final var map = new HashMap<SourceIdentifier, SourceInfo>();
for (var resourceName : resourceNames) {
final var info = YangIRSourceInfoExtractor.forYangText(
- YangTextSource.forResource(DependencyResolverTest.class, resourceName));
+ new URLYangTextSource(DependencyResolverTest.class.getResource(resourceName)));
map.put(info.sourceId(), info);
}
return new RevisionDependencyResolver(map);
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
import org.opendaylight.yangtools.yang.model.spi.source.YangIRSchemaSource;
-import org.opendaylight.yangtools.yang.model.spi.source.YangTextSource;
-import org.opendaylight.yangtools.yang.parser.rfc7950.repo.TextToIRTransformer;
-public class MultipleRevImportBug6875Test {
+class MultipleRevImportBug6875Test extends AbstractSchemaRepositoryTest {
private static final String BAR_NS = "bar";
private static final String BAR_REV_1 = "2017-02-06";
private static final String BAR_REV_2 = "1999-01-01";
private static final String FOO_NS = "foo";
@Test
- public void testYang11() throws Exception {
+ void testYang11() throws Exception {
final var sharedSchemaRepository = new SharedSchemaRepository("shared-schema-repo-multiple-rev-import-test");
- final var foo = getSourceProvider("/rfc7950/bug6875/yang1-1/foo.yang");
- final var bar1 = getSourceProvider("/rfc7950/bug6875/yang1-1/bar@1999-01-01.yang");
- final var bar2 = getSourceProvider("/rfc7950/bug6875/yang1-1/bar@2017-02-06.yang");
- final var bar3 = getSourceProvider("/rfc7950/bug6875/yang1-1/bar@1970-01-01.yang");
+ final var foo = assertYangTextResource("/rfc7950/bug6875/yang1-1/foo.yang");
+ final var bar1 = assertYangTextResource("/rfc7950/bug6875/yang1-1/bar@1999-01-01.yang");
+ final var bar2 = assertYangTextResource("/rfc7950/bug6875/yang1-1/bar@2017-02-06.yang");
+ final var bar3 = assertYangTextResource("/rfc7950/bug6875/yang1-1/bar@1970-01-01.yang");
setAndRegister(sharedSchemaRepository, foo);
setAndRegister(sharedSchemaRepository, bar1);
}
@Test
- public void testYang10() throws Exception {
+ void testYang10() throws Exception {
final var sharedSchemaRepository = new SharedSchemaRepository("shared-schema-repo-multiple-rev-import-test");
- final var foo = getSourceProvider("/rfc7950/bug6875/yang1-0/foo.yang");
- final var bar1 = getSourceProvider("/rfc7950/bug6875/yang1-0/bar@1999-01-01.yang");
- final var bar2 = getSourceProvider("/rfc7950/bug6875/yang1-0/bar@2017-02-06.yang");
+ final var foo = assertYangTextResource("/rfc7950/bug6875/yang1-0/foo.yang");
+ final var bar1 = assertYangTextResource("/rfc7950/bug6875/yang1-0/bar@1999-01-01.yang");
+ final var bar2 = assertYangTextResource("/rfc7950/bug6875/yang1-0/bar@2017-02-06.yang");
setAndRegister(sharedSchemaRepository, foo);
setAndRegister(sharedSchemaRepository, bar1);
source.setResult();
}
- private static SettableSchemaProvider<YangIRSchemaSource> getSourceProvider(final String resourceName)
- throws Exception {
- return SettableSchemaProvider.createImmediate(
- TextToIRTransformer.transformText(YangTextSource.forResource(resourceName)),
- YangIRSchemaSource.class);
- }
-
private static QName foo(final String localName) {
return QName.create(FOO_NS, localName);
}
*/
package org.opendaylight.yangtools.yang.parser.repo;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
+import com.google.common.util.concurrent.Futures;
import org.junit.jupiter.api.Test;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.spi.source.YangIRSchemaSource;
-import org.opendaylight.yangtools.yang.model.spi.source.YangTextSource;
-import org.opendaylight.yangtools.yang.parser.rfc7950.repo.TextToIRTransformer;
-public class OpenconfigVerSharedSchemaRepositoryTest {
+class OpenconfigVerSharedSchemaRepositoryTest extends AbstractSchemaRepositoryTest {
@Test
- public void testSharedSchemaRepository() throws Exception {
+ void testSharedSchemaRepository() throws Exception {
final var sharedSchemaRepository = new SharedSchemaRepository("shared-schema-repo-test");
- final var bar = getImmediateYangSourceProviderFromResource(
- "/openconfig-version/shared-schema-repository/bar@2016-01-01.yang");
+ final var bar = assertYangTextResource("/openconfig-version/shared-schema-repository/bar@2016-01-01.yang");
bar.register(sharedSchemaRepository);
bar.setResult();
- final var foo = getImmediateYangSourceProviderFromResource(
- "/openconfig-version/shared-schema-repository/foo.yang");
+ final var foo = assertYangTextResource("/openconfig-version/shared-schema-repository/foo.yang");
foo.register(sharedSchemaRepository);
foo.setResult();
- final var semVer = getImmediateYangSourceProviderFromResource(
- "/openconfig-version/shared-schema-repository/openconfig-extensions.yang");
+ final var semVer = assertYangTextResource(
+ "/openconfig-version/shared-schema-repository/openconfig-extensions.yang");
semVer.register(sharedSchemaRepository);
semVer.setResult();
final var fact = sharedSchemaRepository.createEffectiveModelContextFactory();
final var inetAndTopologySchemaContextFuture =
fact.createEffectiveModelContext(bar.getId(), foo.getId(), semVer.getId());
- assertTrue(inetAndTopologySchemaContextFuture.isDone());
- assertSchemaContext(inetAndTopologySchemaContextFuture.get(), 3);
+ assertSchemaContext(Futures.getDone(inetAndTopologySchemaContextFuture), 3);
final var barSchemaContextFuture = fact.createEffectiveModelContext(bar.getId(), semVer.getId());
- assertTrue(barSchemaContextFuture.isDone());
- assertSchemaContext(barSchemaContextFuture.get(), 2);
- }
-
- private static void assertSchemaContext(final EffectiveModelContext schemaContext, final int moduleSize) {
- assertNotNull(schemaContext);
- assertEquals(moduleSize, schemaContext.getModules().size());
- }
-
- static SettableSchemaProvider<YangIRSchemaSource> getImmediateYangSourceProviderFromResource(
- final String resourceName) throws Exception {
- return SettableSchemaProvider.createImmediate(
- TextToIRTransformer.transformText(YangTextSource.forResource(resourceName)), YangIRSchemaSource.class);
+ assertSchemaContext(Futures.getDone(barSchemaContextFuture), 2);
}
}
import org.opendaylight.yangtools.yang.model.repo.api.SchemaContextFactoryConfiguration;
import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource;
import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider;
+import org.opendaylight.yangtools.yang.model.spi.source.URLYangTextSource;
import org.opendaylight.yangtools.yang.model.spi.source.YangIRSchemaSource;
import org.opendaylight.yangtools.yang.model.spi.source.YangTextSource;
import org.opendaylight.yangtools.yang.parser.rfc7950.repo.TextToIRTransformer;
-public class SharedEffectiveModelContextFactoryTest {
+class SharedEffectiveModelContextFactoryTest {
private final SharedSchemaRepository repository = new SharedSchemaRepository("test");
private final SchemaContextFactoryConfiguration config = SchemaContextFactoryConfiguration.getDefault();
private SourceIdentifier s2;
@BeforeEach
- public void setUp() {
- final var source1 = YangTextSource.forResource("/ietf/ietf-inet-types@2010-09-24.yang");
- final var source2 = YangTextSource.forResource("/ietf/iana-timezones@2012-07-09.yang");
+ void setUp() {
+ final var source1 = assertYangText("/ietf/ietf-inet-types@2010-09-24.yang");
+ final var source2 = assertYangText("/ietf/iana-timezones@2012-07-09.yang");
s1 = new SourceIdentifier("ietf-inet-types", "2010-09-24");
s2 = new SourceIdentifier("iana-timezones", "2012-07-09");
}
@Test
- public void testCreateSchemaContextWithDuplicateRequiredSources() throws Exception {
+ void testCreateSchemaContextWithDuplicateRequiredSources() throws Exception {
final var sharedSchemaContextFactory = new SharedEffectiveModelContextFactory(repository, config);
final var schemaContext = sharedSchemaContextFactory.createEffectiveModelContext(s1, s1, s2);
assertNotNull(schemaContext.get());
}
@Test
- public void testSourceRegisteredWithDifferentSI() throws Exception {
- final var source1 = YangTextSource.forResource("/ietf/ietf-inet-types@2010-09-24.yang");
- final var source2 = YangTextSource.forResource("/ietf/iana-timezones@2012-07-09.yang");
+ void testSourceRegisteredWithDifferentSI() throws Exception {
+ final var source1 = assertYangText("/ietf/ietf-inet-types@2010-09-24.yang");
+ final var source2 = assertYangText("/ietf/iana-timezones@2012-07-09.yang");
s1 = source1.sourceId();
s2 = source2.sourceId();
- final var provider = SharedSchemaRepositoryTest.getImmediateYangSourceProviderFromResource(
+ final var provider = AbstractSchemaRepositoryTest.assertYangTextResource(
"/no-revision/imported@2012-12-12.yang");
provider.setResult();
provider.register(repository);
}
@Test
- public void testTransientFailureWhilreRetrievingSchemaSource() throws Exception {
+ void testTransientFailureWhilreRetrievingSchemaSource() throws Exception {
final SourceIdentifier s3 = new SourceIdentifier("network-topology", "2013-10-21");
repository.registerSchemaSource(new TransientFailureProvider(
- YangTextSource.forResource("/ietf/network-topology@2013-10-21.yang")),
+ assertYangText("/ietf/network-topology@2013-10-21.yang")),
PotentialSchemaSource.create(s3, YangTextSource.class, 1));
final var sharedSchemaContextFactory = new SharedEffectiveModelContextFactory(repository, config);
assertNotNull(schemaContext.get());
}
+ private static URLYangTextSource assertYangText(final String resourceName) {
+ return new URLYangTextSource(AbstractSchemaRepositoryTest.class.getResource(resourceName));
+ }
+
/**
* Schema source provider that fails on first attempt of getSource() and succeeds on every subsequent call
* to simulate transient failures of source retrieval.
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.concurrent.ExecutionException;
import org.junit.jupiter.api.Test;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
import org.opendaylight.yangtools.yang.model.repo.api.MissingSchemaSourceException;
+import org.opendaylight.yangtools.yang.model.spi.source.URLYangTextSource;
import org.opendaylight.yangtools.yang.model.spi.source.YangIRSchemaSource;
-import org.opendaylight.yangtools.yang.model.spi.source.YangTextSource;
import org.opendaylight.yangtools.yang.parser.rfc7950.repo.TextToIRTransformer;
-public class SharedSchemaRepositoryTest {
+class SharedSchemaRepositoryTest extends AbstractSchemaRepositoryTest {
@Test
- public void testSourceWithAndWithoutRevision() throws Exception {
+ void testSourceWithAndWithoutRevision() throws Exception {
final var sharedSchemaRepository = new SharedSchemaRepository("netconf-mounts");
final var idNoRevision = loadAndRegisterSource(sharedSchemaRepository, "/no-revision/imported.yang");
private static SourceIdentifier loadAndRegisterSource(final SharedSchemaRepository sharedSchemaRepository,
final String resourceName) throws Exception {
- final var sourceProvider = getImmediateYangSourceProviderFromResource(resourceName);
+ final var sourceProvider = assertYangTextResource(resourceName);
sourceProvider.setResult();
final var idNoRevision = sourceProvider.getId();
sourceProvider.register(sharedSchemaRepository);
}
@Test
- public void testSimpleSchemaContext() throws Exception {
+ void testSimpleSchemaContext() throws Exception {
final var sharedSchemaRepository = new SharedSchemaRepository("netconf-mounts");
- final var remoteInetTypesYang =
- getImmediateYangSourceProviderFromResource("/ietf/ietf-inet-types@2010-09-24.yang");
+ final var remoteInetTypesYang = assertYangTextResource("/ietf/ietf-inet-types@2010-09-24.yang");
remoteInetTypesYang.register(sharedSchemaRepository);
final var registeredSourceFuture = sharedSchemaRepository.getSchemaSource(
remoteInetTypesYang.getId(), YangIRSchemaSource.class);
}
@Test
- public void testTwoSchemaContextsSharingSource() throws Exception {
+ void testTwoSchemaContextsSharingSource() throws Exception {
final var sharedSchemaRepository = new SharedSchemaRepository("netconf-mounts");
- final var remoteInetTypesYang =
- getImmediateYangSourceProviderFromResource("/ietf/ietf-inet-types@2010-09-24.yang");
+ final var remoteInetTypesYang = assertYangTextResource("/ietf/ietf-inet-types@2010-09-24.yang");
remoteInetTypesYang.register(sharedSchemaRepository);
remoteInetTypesYang.setResult();
- final var remoteTopologyYang =
- getImmediateYangSourceProviderFromResource("/ietf/network-topology@2013-10-21.yang");
+ final var remoteTopologyYang = assertYangTextResource("/ietf/network-topology@2013-10-21.yang");
remoteTopologyYang.register(sharedSchemaRepository);
remoteTopologyYang.setResult();
- final var remoteModuleNoRevYang =
- getImmediateYangSourceProviderFromResource("/no-revision/module-without-revision.yang");
+ final var remoteModuleNoRevYang = assertYangTextResource("/no-revision/module-without-revision.yang");
remoteModuleNoRevYang.register(sharedSchemaRepository);
final var fact = sharedSchemaRepository.createEffectiveModelContextFactory();
}
@Test
- public void testFailedSchemaContext() throws Exception {
+ void testFailedSchemaContext() throws Exception {
final var sharedSchemaRepository = new SharedSchemaRepository("netconf-mounts");
- final var remoteInetTypesYang =
- getImmediateYangSourceProviderFromResource("/ietf/ietf-inet-types@2010-09-24.yang");
+ final var remoteInetTypesYang = assertYangTextResource("/ietf/ietf-inet-types@2010-09-24.yang");
remoteInetTypesYang.register(sharedSchemaRepository);
final var fact = sharedSchemaRepository.createEffectiveModelContextFactory();
}
@Test
- public void testDifferentCosts() throws Exception {
+ void testDifferentCosts() throws Exception {
final var sharedSchemaRepository = new SharedSchemaRepository("netconf-mounts");
- final var immediateInetTypesYang = spy(
- getImmediateYangSourceProviderFromResource("/ietf/ietf-inet-types@2010-09-24.yang"));
+ final var immediateInetTypesYang = spy(assertYangTextResource("/ietf/ietf-inet-types@2010-09-24.yang"));
immediateInetTypesYang.register(sharedSchemaRepository);
immediateInetTypesYang.setResult();
verify(immediateInetTypesYang).getSource(id);
}
- private static void assertSchemaContext(final EffectiveModelContext schemaContext, final int moduleSize) {
- assertNotNull(schemaContext);
- assertEquals(moduleSize, schemaContext.getModules().size());
- }
-
static SettableSchemaProvider<YangIRSchemaSource> getRemoteYangSourceProviderFromResource(final String resourceName)
throws Exception {
- return SettableSchemaProvider.createRemote(
- TextToIRTransformer.transformText(YangTextSource.forResource(resourceName)), YangIRSchemaSource.class);
- }
-
- static SettableSchemaProvider<YangIRSchemaSource> getImmediateYangSourceProviderFromResource(
- final String resourceName) throws Exception {
- return SettableSchemaProvider.createImmediate(
- TextToIRTransformer.transformText(YangTextSource.forResource(resourceName)), YangIRSchemaSource.class);
+ return SettableSchemaProvider.createRemote(TextToIRTransformer.transformText(
+ new URLYangTextSource(SharedSchemaRepositoryTest.class.getResource(resourceName))),
+ YangIRSchemaSource.class);
}
}
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.model.api.stmt.FeatureSet;
import org.opendaylight.yangtools.yang.model.repo.api.SchemaContextFactoryConfiguration;
-import org.opendaylight.yangtools.yang.model.spi.source.YangIRSchemaSource;
-import org.opendaylight.yangtools.yang.model.spi.source.YangTextSource;
-import org.opendaylight.yangtools.yang.parser.rfc7950.repo.TextToIRTransformer;
-public class SharedSchemaRepositoryWithFeaturesTest {
+class SharedSchemaRepositoryWithFeaturesTest extends AbstractSchemaRepositoryTest {
@Test
- public void testSharedSchemaRepositoryWithSomeFeaturesSupported() throws Exception {
+ void testSharedSchemaRepositoryWithSomeFeaturesSupported() throws Exception {
final var supportedFeatures = FeatureSet.of(QName.create("foobar-namespace", "test-feature-1"));
final var sharedSchemaRepository = new SharedSchemaRepository("shared-schema-repo-with-features-test");
- final var foobar = getImmediateYangSourceProviderFromResource(
- "/if-feature-resolution-test/shared-schema-repository/foobar.yang");
+ final var foobar = assertYangTextResource("/if-feature-resolution-test/shared-schema-repository/foobar.yang");
foobar.register(sharedSchemaRepository);
foobar.setResult();
}
@Test
- public void testSharedSchemaRepositoryWithAllFeaturesSupported() throws Exception {
+ void testSharedSchemaRepositoryWithAllFeaturesSupported() throws Exception {
final var sharedSchemaRepository = new SharedSchemaRepository("shared-schema-repo-with-features-test");
- final var foobar = getImmediateYangSourceProviderFromResource(
- "/if-feature-resolution-test/shared-schema-repository/foobar.yang");
+ final var foobar = assertYangTextResource("/if-feature-resolution-test/shared-schema-repository/foobar.yang");
foobar.register(sharedSchemaRepository);
foobar.setResult();
}
@Test
- public void testSharedSchemaRepositoryWithNoFeaturesSupported() throws Exception {
+ void testSharedSchemaRepositoryWithNoFeaturesSupported() throws Exception {
final var sharedSchemaRepository = new SharedSchemaRepository("shared-schema-repo-with-features-test");
- final var foobar = getImmediateYangSourceProviderFromResource(
- "/if-feature-resolution-test/shared-schema-repository/foobar.yang");
+ final var foobar = assertYangTextResource("/if-feature-resolution-test/shared-schema-repository/foobar.yang");
foobar.register(sharedSchemaRepository);
foobar.setResult();
assertInstanceOf(LeafSchemaNode.class,
testContainerC.dataChildByName(QName.create(module.getQNameModule(), "test-leaf-c")));
}
-
- private static SettableSchemaProvider<YangIRSchemaSource> getImmediateYangSourceProviderFromResource(
- final String resourceName) throws Exception {
- return SettableSchemaProvider.createImmediate(
- TextToIRTransformer.transformText(YangTextSource.forResource(resourceName)), YangIRSchemaSource.class);
- }
-
- private static void assertSchemaContext(final SchemaContext schemaContext, final int moduleSize) {
- assertNotNull(schemaContext);
- assertEquals(moduleSize, schemaContext.getModules().size());
- }
}
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
import org.opendaylight.yangtools.yang.model.api.source.SourceRepresentation;
import org.opendaylight.yangtools.yang.model.api.stmt.FeatureSet;
+import org.opendaylight.yangtools.yang.model.spi.source.URLYangTextSource;
import org.opendaylight.yangtools.yang.model.spi.source.YangTextSource;
import org.opendaylight.yangtools.yang.parser.api.YangParser;
import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration;
public static EffectiveModelContext parseYangResource(final String resource, final YangParserConfiguration config,
final Set<QName> supportedFeatures) {
return parseYangSources(config, supportedFeatures,
- YangTextSource.forResource(YangParserTestUtils.class, resource));
+ new URLYangTextSource(YangParserTestUtils.class.getResource(resource)));
}
/**
}
public static EffectiveModelContext parseYangResources(final Class<?> clazz, final Collection<String> resources) {
- final var sources = new ArrayList<YangTextSource>(resources.size());
- for (final String r : resources) {
- sources.add(YangTextSource.forResource(clazz, r));
- }
- return parseSources(YangParserConfiguration.DEFAULT, null, sources);
+ return parseSources(YangParserConfiguration.DEFAULT, null, resources.stream()
+ .map(resource -> new URLYangTextSource(clazz.getResource(resource)))
+ .toList());
}
/**