From 11db4e7ea702ac79a4320e42fccb6d0175ef524a Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 30 Sep 2020 12:43:56 +0200 Subject: [PATCH] Eliminate ClassLoadingStrategy ClassLoadingStrategy as a separate concept is very confusing. The reality is that ModuleInfoSnapshot needs to be able to load classes based on their FQCN and BindingRuntimeContext needs to do the same based on they binding.model.api.Type. Split ClassLoadingStrategy's two methods appropriately and remove it. Also adjust all users to not rely on it. JIRA: MDSAL-578 Change-Id: Id4606efcd67d8ea7c42e78c48c48aa915cb11a52 Signed-off-by: Robert Varga --- ...ngDOMDataTreeChangeServiceAdapterTest.java | 4 - .../adapter/CurrentAdapterSerializerTest.java | 6 +- .../adapter/test/util/MockAdapterContext.java | 5 +- .../test/util/TestingModuleInfoSnapshot.java | 39 ++++++ .../codec/impl/DataContainerCodecContext.java | 7 +- .../codec/impl/DataObjectCodecContext.java | 16 +-- ...entationClassDiscoveredAfterCodecTest.java | 121 ------------------ .../api/AbstractBindingRuntimeContext.java | 6 +- .../runtime/api/BindingRuntimeContext.java | 10 +- .../runtime/api/ClassLoadingStrategy.java | 19 --- .../api/DefaultBindingRuntimeContext.java | 33 ++--- .../runtime/api/ModuleInfoSnapshot.java | 3 +- .../runtime/osgi/impl/OSGiBindingRuntime.java | 2 +- .../runtime/spi/BindingRuntimeHelpers.java | 5 +- .../spi/DefaultModuleInfoSnapshot.java | 6 +- .../spi/ForwardingBindingRuntimeContext.java | 11 +- .../spi/ForwardingModuleInfoSnapshot.java | 2 +- yanglib/mdsal-yanglib-rfc7895/pom.xml | 4 + .../mdsal/yanglib/rfc7895/SimpleStrategy.java | 19 --- .../rfc7895/YangModuleLibrarySupport.java | 28 ++-- yanglib/mdsal-yanglib-rfc8525/pom.xml | 4 + .../mdsal/yanglib/rfc8525/SimpleStrategy.java | 19 --- .../yanglib/rfc8525/YangLibrarySupport.java | 28 ++-- 23 files changed, 109 insertions(+), 288 deletions(-) create mode 100644 binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/TestingModuleInfoSnapshot.java delete mode 100644 binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentationClassDiscoveredAfterCodecTest.java delete mode 100644 binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/ClassLoadingStrategy.java delete mode 100644 yanglib/mdsal-yanglib-rfc7895/src/main/java/org/opendaylight/mdsal/yanglib/rfc7895/SimpleStrategy.java delete mode 100644 yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/SimpleStrategy.java diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeChangeServiceAdapterTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeChangeServiceAdapterTest.java index f7e9422b5f..ad11273358 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeChangeServiceAdapterTest.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeChangeServiceAdapterTest.java @@ -27,7 +27,6 @@ import org.opendaylight.mdsal.binding.api.DataTreeChangeService; import org.opendaylight.mdsal.binding.api.DataTreeIdentifier; import org.opendaylight.mdsal.binding.api.DataTreeModification; import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices; -import org.opendaylight.mdsal.binding.runtime.api.ClassLoadingStrategy; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.ClusteredDOMDataTreeChangeListener; import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener; @@ -50,9 +49,6 @@ public class BindingDOMDataTreeChangeServiceAdapterTest { @Mock private DOMDataTreeChangeService mockDOMService; - @Mock - private ClassLoadingStrategy classLoadingStrategy; - @Mock private BindingDOMCodecServices services; diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/CurrentAdapterSerializerTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/CurrentAdapterSerializerTest.java index 86e2982f69..e0cd4a0ad7 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/CurrentAdapterSerializerTest.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/CurrentAdapterSerializerTest.java @@ -18,10 +18,10 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Map.Entry; import org.junit.Test; +import org.opendaylight.mdsal.binding.dom.adapter.test.util.TestingModuleInfoSnapshot; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext; import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; import org.opendaylight.mdsal.binding.runtime.api.DefaultBindingRuntimeContext; -import org.opendaylight.yangtools.util.ClassLoaderUtils; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.QName; @@ -111,8 +111,8 @@ public class CurrentAdapterSerializerTest { private static Entry, DataObject> fromNormalizedNode(final NormalizedNode data, final EffectiveModelContext schemaCtx) { final CurrentAdapterSerializer codec = new CurrentAdapterSerializer(new BindingCodecContext( - DefaultBindingRuntimeContext.create(new DefaultBindingRuntimeGenerator().generateTypeMapping(schemaCtx), - ClassLoaderUtils::loadClassWithTCCL))); + new DefaultBindingRuntimeContext(new DefaultBindingRuntimeGenerator().generateTypeMapping(schemaCtx), + TestingModuleInfoSnapshot.INSTANCE))); final YangInstanceIdentifier path = YangInstanceIdentifier.create(NodeIdentifier.create(QName.create( "urn:test", "2017-01-01", "cont"))); diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/MockAdapterContext.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/MockAdapterContext.java index bfa1fb61fb..c0152aeb21 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/MockAdapterContext.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/MockAdapterContext.java @@ -14,7 +14,6 @@ import org.opendaylight.mdsal.binding.dom.adapter.CurrentAdapterSerializer; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext; import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; import org.opendaylight.mdsal.binding.runtime.api.DefaultBindingRuntimeContext; -import org.opendaylight.yangtools.util.ClassLoaderUtils; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener; @@ -28,8 +27,8 @@ public final class MockAdapterContext implements AdapterContext, EffectiveModelC @Override public void onModelContextUpdated(final EffectiveModelContext newModelContext) { - serializer = new CurrentAdapterSerializer(new BindingCodecContext(DefaultBindingRuntimeContext.create( + serializer = new CurrentAdapterSerializer(new BindingCodecContext(new DefaultBindingRuntimeContext( new DefaultBindingRuntimeGenerator().generateTypeMapping(newModelContext), - ClassLoaderUtils::loadClassWithTCCL))); + TestingModuleInfoSnapshot.INSTANCE))); } } diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/TestingModuleInfoSnapshot.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/TestingModuleInfoSnapshot.java new file mode 100644 index 0000000000..159f350899 --- /dev/null +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/TestingModuleInfoSnapshot.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.mdsal.binding.dom.adapter.test.util; + +import com.google.common.util.concurrent.ListenableFuture; +import org.opendaylight.mdsal.binding.runtime.api.ModuleInfoSnapshot; +import org.opendaylight.yangtools.util.ClassLoaderUtils; +import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; +import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; + +public final class TestingModuleInfoSnapshot implements ModuleInfoSnapshot { + public static final TestingModuleInfoSnapshot INSTANCE = new TestingModuleInfoSnapshot(); + + private TestingModuleInfoSnapshot() { + // Hidden on purpose + } + + @Override + public EffectiveModelContext getEffectiveModelContext() { + throw new UnsupportedOperationException(); + } + + @Override + public ListenableFuture getSource(SourceIdentifier sourceIdentifier) { + throw new UnsupportedOperationException(); + } + + @Override + @SuppressWarnings("unchecked") + public Class loadClass(String fullyQualifiedName) throws ClassNotFoundException { + return (Class) ClassLoaderUtils.loadClassWithTCCL(fullyQualifiedName); + } +} diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerCodecContext.java index 5814671b0f..e8bca5d0d1 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerCodecContext.java @@ -27,8 +27,8 @@ import org.opendaylight.mdsal.binding.dom.codec.api.IncorrectNestingException; import org.opendaylight.mdsal.binding.dom.codec.api.MissingClassInLoadingStrategyException; import org.opendaylight.mdsal.binding.dom.codec.api.MissingSchemaException; import org.opendaylight.mdsal.binding.dom.codec.api.MissingSchemaForClassException; +import org.opendaylight.mdsal.binding.model.api.DefaultType; import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeContext; -import org.opendaylight.mdsal.binding.runtime.api.ClassLoadingStrategy; import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.BindingObject; import org.opendaylight.yangtools.yang.binding.DataObject; @@ -211,12 +211,11 @@ abstract class DataContainerCodecContext getAugmentationPrototype(final Type value) { - final ClassLoadingStrategy loader = factory().getRuntimeContext().getStrategy(); - @SuppressWarnings("rawtypes") - final Class augClass; + final BindingRuntimeContext ctx = factory().getRuntimeContext(); + + final Class> augClass; try { - augClass = loader.loadClass(value); + augClass = ctx.loadClass(value); } catch (final ClassNotFoundException e) { + // FIXME: MDSAL-578: this is disallowed LOG.debug("Failed to load augmentation prototype for {}. Will be retried when needed.", value, e); return null; } - @SuppressWarnings("unchecked") - final Entry augSchema = factory().getRuntimeContext() - .getResolvedAugmentationSchema(getSchema(), augClass); + final Entry augSchema = + ctx.getResolvedAugmentationSchema(getSchema(), augClass); return DataContainerCodecPrototype.from(augClass, augSchema.getKey(), augSchema.getValue(), factory()); } diff --git a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentationClassDiscoveredAfterCodecTest.java b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentationClassDiscoveredAfterCodecTest.java deleted file mode 100644 index fe94136b39..0000000000 --- a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentationClassDiscoveredAfterCodecTest.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.mdsal.binding.dom.codec.impl; - -import static java.util.Objects.requireNonNull; -import static org.junit.Assert.assertNotNull; - -import java.util.HashSet; -import java.util.Map.Entry; -import java.util.Set; -import org.junit.Before; -import org.junit.Test; -import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer; -import org.opendaylight.mdsal.binding.dom.codec.api.MissingClassInLoadingStrategyException; -import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeContext; -import org.opendaylight.mdsal.binding.runtime.api.ClassLoadingStrategy; -import org.opendaylight.mdsal.binding.runtime.api.DefaultBindingRuntimeContext; -import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.TreeComplexUsesAugment; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.TreeLeafOnlyAugment; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.TreeLeafOnlyAugmentBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.Top; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelList; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelListBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelListKey; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; - -/** - * This sets of tests are designed in way, that schema context contains models for all augmentations, but backing class - * loading strategy is not aware of some of the classes, and becames aware of them after codec was used. - * - *

- * The idea of this suite is to test that codecs will work even if situation like this happens. - */ -public class AugmentationClassDiscoveredAfterCodecTest { - private BindingNormalizedNodeSerializer serializer; - private FilteringClassLoadingStrategy filter; - - @Before - public void setup() { - // Baseline state: strategy is cognizant of the classes - final BindingRuntimeContext delegate = BindingRuntimeHelpers.createRuntimeContext(); - - // Class loading filter, manipulated by tests - filter = new FilteringClassLoadingStrategy(delegate.getStrategy()); - serializer = new BindingCodecContext(DefaultBindingRuntimeContext.create(delegate.getTypes(), filter)); - } - - private static final TopLevelListKey TOP_FOO_KEY = new TopLevelListKey("foo"); - private static final InstanceIdentifier BA_TOP_LEVEL_LIST = InstanceIdentifier.builder(Top.class) - .child(TopLevelList.class, TOP_FOO_KEY).build(); - private static final InstanceIdentifier BA_TREE_LEAF_ONLY = BA_TOP_LEVEL_LIST - .augmentation(TreeLeafOnlyAugment.class); - - @Test(expected = MissingClassInLoadingStrategyException.class) - public void testCorrectExceptionThrown() { - materializeWithExclusions(TreeLeafOnlyAugment.class, TreeComplexUsesAugment.class); - serializer.toYangInstanceIdentifier(BA_TREE_LEAF_ONLY); - } - - @Test - public void testUsingBindingInstanceIdentifier() { - materializeWithExclusions(TreeLeafOnlyAugment.class, TreeComplexUsesAugment.class); - filter.includeClass(TreeLeafOnlyAugment.class); - final YangInstanceIdentifier domYY = serializer.toYangInstanceIdentifier(BA_TREE_LEAF_ONLY); - assertNotNull(domYY); - } - - @Test - public void testUsingBindingData() { - materializeWithExclusions(TreeLeafOnlyAugment.class, TreeComplexUsesAugment.class); - filter.includeClass(TreeLeafOnlyAugment.class); - final TopLevelList data = new TopLevelListBuilder() - .withKey(TOP_FOO_KEY) - .addAugmentation(new TreeLeafOnlyAugmentBuilder().setSimpleValue("foo").build()) - .build(); - final Entry> domData = - serializer.toNormalizedNode(BA_TOP_LEVEL_LIST, data); - assertNotNull(domData); - } - - private void materializeWithExclusions(final Class... clzToExclude) { - for (final Class clz : clzToExclude) { - filter.excludeClass(clz); - } - serializer.toYangInstanceIdentifier(BA_TOP_LEVEL_LIST); - } - - private static final class FilteringClassLoadingStrategy implements ClassLoadingStrategy { - private final Set exclusions = new HashSet<>(); - private final ClassLoadingStrategy delegate; - - FilteringClassLoadingStrategy(final ClassLoadingStrategy delegate) { - this.delegate = requireNonNull(delegate); - } - - void excludeClass(final Class clz) { - exclusions.add(clz.getName()); - } - - void includeClass(final Class clz) { - exclusions.remove(clz.getName()); - } - - @Override - public Class loadClass(final String fullyQualifiedName) throws ClassNotFoundException { - if (exclusions.contains(fullyQualifiedName)) { - throw new ClassNotFoundException(String.format("Class %s is not available for test reasons.", - fullyQualifiedName)); - } - return delegate.loadClass(fullyQualifiedName); - } - } -} diff --git a/binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/AbstractBindingRuntimeContext.java b/binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/AbstractBindingRuntimeContext.java index 33a0a1ba6c..920d11546b 100644 --- a/binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/AbstractBindingRuntimeContext.java +++ b/binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/AbstractBindingRuntimeContext.java @@ -72,7 +72,7 @@ public abstract class AbstractBindingRuntimeContext implements BindingRuntimeCon final Optional identityType = getTypes().findIdentity(key); checkArgument(identityType.isPresent(), "Supplied QName %s is not a valid identity", key); try { - return getStrategy().loadClass(identityType.get()); + return loadClass(identityType.get()); } catch (final ClassNotFoundException e) { throw new IllegalArgumentException("Required class " + identityType + "was not found.", e); } @@ -268,7 +268,7 @@ public abstract class AbstractBindingRuntimeContext implements BindingRuntimeCon final Set> ret = new HashSet<>(cazes.size()); for (final Type caze : cazes) { try { - ret.add(getStrategy().loadClass(caze)); + ret.add(loadClass(caze)); } catch (final ClassNotFoundException e) { LOG.warn("Failed to load class for case {}, ignoring it", caze, e); } @@ -284,7 +284,7 @@ public abstract class AbstractBindingRuntimeContext implements BindingRuntimeCon childSchema, origSchema); try { - return getStrategy().loadClass(clazzType.get()); + return loadClass(clazzType.get()); } catch (final ClassNotFoundException e) { throw new IllegalStateException(e); } diff --git a/binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/BindingRuntimeContext.java b/binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/BindingRuntimeContext.java index f375c13426..99b98d1c33 100644 --- a/binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/BindingRuntimeContext.java +++ b/binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/BindingRuntimeContext.java @@ -45,16 +45,10 @@ import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absol */ @Beta public interface BindingRuntimeContext extends EffectiveModelContextProvider, Immutable { - /** - * Returns a class loading strategy associated with this binding runtime context - * which is used to load classes. - * - * @return Class loading strategy. - */ - @NonNull ClassLoadingStrategy getStrategy(); - @NonNull BindingRuntimeTypes getTypes(); + @NonNull Class loadClass(Type type) throws ClassNotFoundException; + @Override default EffectiveModelContext getEffectiveModelContext() { return getTypes().getEffectiveModelContext(); diff --git a/binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/ClassLoadingStrategy.java b/binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/ClassLoadingStrategy.java deleted file mode 100644 index dc47d33a5a..0000000000 --- a/binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/ClassLoadingStrategy.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.mdsal.binding.runtime.api; - -import org.opendaylight.mdsal.binding.model.api.Type; - -public interface ClassLoadingStrategy { - - default Class loadClass(final Type type) throws ClassNotFoundException { - return loadClass(type.getFullyQualifiedName()); - } - - Class loadClass(String fullyQualifiedName) throws ClassNotFoundException; -} diff --git a/binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/DefaultBindingRuntimeContext.java b/binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/DefaultBindingRuntimeContext.java index 0e658e884b..a4c1da1e2b 100644 --- a/binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/DefaultBindingRuntimeContext.java +++ b/binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/DefaultBindingRuntimeContext.java @@ -11,6 +11,7 @@ import static java.util.Objects.requireNonNull; import com.google.common.annotations.Beta; import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.mdsal.binding.model.api.Type; import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; /** @@ -24,38 +25,20 @@ import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; @Beta public final class DefaultBindingRuntimeContext extends AbstractBindingRuntimeContext { private final @NonNull BindingRuntimeTypes runtimeTypes; - private final @NonNull ClassLoadingStrategy strategy; + private final @NonNull ModuleInfoSnapshot moduleInfos; - private DefaultBindingRuntimeContext(final BindingRuntimeTypes runtimeTypes, final ClassLoadingStrategy strategy) { + public DefaultBindingRuntimeContext(final BindingRuntimeTypes runtimeTypes, final ModuleInfoSnapshot moduleInfos) { this.runtimeTypes = requireNonNull(runtimeTypes); - this.strategy = requireNonNull(strategy); + this.moduleInfos = requireNonNull(moduleInfos); } - /** - * Creates Binding Runtime Context from supplied class loading strategy and schema context. - * - * @param strategy Class loading strategy to retrieve generated Binding classes - * @param runtimeTypes Binding classes to YANG schema mapping - * @return A new instance - */ - public static @NonNull DefaultBindingRuntimeContext create(final BindingRuntimeTypes runtimeTypes, - final ClassLoadingStrategy strategy) { - return new DefaultBindingRuntimeContext(runtimeTypes, strategy); - } - - /** - * Returns a class loading strategy associated with this binding runtime context - * which is used to load classes. - * - * @return Class loading strategy. - */ @Override - public @NonNull ClassLoadingStrategy getStrategy() { - return strategy; + public BindingRuntimeTypes getTypes() { + return runtimeTypes; } @Override - public @NonNull BindingRuntimeTypes getTypes() { - return runtimeTypes; + public Class loadClass(Type type) throws ClassNotFoundException { + return moduleInfos.loadClass(type.getFullyQualifiedName()); } } diff --git a/binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/ModuleInfoSnapshot.java b/binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/ModuleInfoSnapshot.java index ffdbe7f8f4..733511d477 100644 --- a/binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/ModuleInfoSnapshot.java +++ b/binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/ModuleInfoSnapshot.java @@ -14,7 +14,8 @@ import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider; @Beta -public interface ModuleInfoSnapshot extends Immutable, ClassLoadingStrategy, EffectiveModelContextProvider, +public interface ModuleInfoSnapshot extends Immutable, EffectiveModelContextProvider, SchemaSourceProvider { + Class loadClass(String fullyQualifiedName) throws ClassNotFoundException; } diff --git a/binding/mdsal-binding-runtime-osgi/src/main/java/org/opendaylight/mdsal/binding/runtime/osgi/impl/OSGiBindingRuntime.java b/binding/mdsal-binding-runtime-osgi/src/main/java/org/opendaylight/mdsal/binding/runtime/osgi/impl/OSGiBindingRuntime.java index e331142701..bce0e0a24b 100644 --- a/binding/mdsal-binding-runtime-osgi/src/main/java/org/opendaylight/mdsal/binding/runtime/osgi/impl/OSGiBindingRuntime.java +++ b/binding/mdsal-binding-runtime-osgi/src/main/java/org/opendaylight/mdsal/binding/runtime/osgi/impl/OSGiBindingRuntime.java @@ -102,7 +102,7 @@ public final class OSGiBindingRuntime { instances.put(snapshot, factory.newInstance(OSGiBindingRuntimeContextImpl.props( snapshot.getGeneration(), snapshot.getServiceRanking(), - DefaultBindingRuntimeContext.create(types, context)))); + new DefaultBindingRuntimeContext(types, context)))); } @Override diff --git a/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/BindingRuntimeHelpers.java b/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/BindingRuntimeHelpers.java index eb6c0ab6a0..a2e0294cce 100644 --- a/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/BindingRuntimeHelpers.java +++ b/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/BindingRuntimeHelpers.java @@ -52,7 +52,7 @@ public final class BindingRuntimeHelpers { public static @NonNull BindingRuntimeContext createRuntimeContext() { final ModuleInfoSnapshot infos = prepareContext(ServiceLoaderState.ParserFactory.INSTANCE, BindingReflections.loadModuleInfos()); - return DefaultBindingRuntimeContext.create(ServiceLoaderState.Generator.INSTANCE.generateTypeMapping( + return new DefaultBindingRuntimeContext(ServiceLoaderState.Generator.INSTANCE.generateTypeMapping( infos.getEffectiveModelContext()), infos); } @@ -71,8 +71,7 @@ public final class BindingRuntimeHelpers { final ModuleInfoSnapshot infos = prepareContext(parserFactory, classes.stream() .map(BindingRuntimeHelpers::extractYangModuleInfo) .collect(Collectors.toList())); - return DefaultBindingRuntimeContext.create( - generator.generateTypeMapping(infos.getEffectiveModelContext()), infos); + return new DefaultBindingRuntimeContext(generator.generateTypeMapping(infos.getEffectiveModelContext()), infos); } @SuppressWarnings("checkstyle:IllegalCatch") diff --git a/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/DefaultModuleInfoSnapshot.java b/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/DefaultModuleInfoSnapshot.java index 4047969e8c..8178c439ab 100644 --- a/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/DefaultModuleInfoSnapshot.java +++ b/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/DefaultModuleInfoSnapshot.java @@ -51,12 +51,14 @@ final class DefaultModuleInfoSnapshot implements ModuleInfoSnapshot { } @Override - public Class loadClass(final String fullyQualifiedName) throws ClassNotFoundException { + public Class loadClass(final String fullyQualifiedName) throws ClassNotFoundException { final String packageName = BindingReflections.getModelRootPackageName(fullyQualifiedName); final ClassLoader loader = classLoaders.get(packageName); if (loader == null) { throw new ClassNotFoundException("Package " + packageName + " not found"); } - return loader.loadClass(fullyQualifiedName); + @SuppressWarnings("unchecked") + final Class loaded = (Class) loader.loadClass(fullyQualifiedName); + return loaded; } } diff --git a/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/ForwardingBindingRuntimeContext.java b/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/ForwardingBindingRuntimeContext.java index fd90b05864..a48d44f0ca 100644 --- a/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/ForwardingBindingRuntimeContext.java +++ b/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/ForwardingBindingRuntimeContext.java @@ -18,7 +18,6 @@ import org.opendaylight.mdsal.binding.model.api.GeneratedType; import org.opendaylight.mdsal.binding.model.api.Type; import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeContext; import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeTypes; -import org.opendaylight.mdsal.binding.runtime.api.ClassLoadingStrategy; import org.opendaylight.yangtools.yang.binding.Action; import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.common.QName; @@ -38,11 +37,6 @@ public abstract class ForwardingBindingRuntimeContext extends ForwardingObject i @Override protected abstract BindingRuntimeContext delegate(); - @Override - public ClassLoadingStrategy getStrategy() { - return delegate().getStrategy(); - } - @Override public BindingRuntimeTypes getTypes() { return delegate().getTypes(); @@ -108,4 +102,9 @@ public abstract class ForwardingBindingRuntimeContext extends ForwardingObject i public Class getIdentityClass(final QName input) { return delegate().getIdentityClass(input); } + + @Override + public Class loadClass(final Type type) throws ClassNotFoundException { + return delegate().loadClass(type); + } } diff --git a/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/ForwardingModuleInfoSnapshot.java b/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/ForwardingModuleInfoSnapshot.java index 4b3a037756..90454856ee 100644 --- a/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/ForwardingModuleInfoSnapshot.java +++ b/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/ForwardingModuleInfoSnapshot.java @@ -22,7 +22,7 @@ public abstract class ForwardingModuleInfoSnapshot extends ForwardingObject impl protected abstract ModuleInfoSnapshot delegate(); @Override - public Class loadClass(final String fullyQualifiedName) throws ClassNotFoundException { + public Class loadClass(final String fullyQualifiedName) throws ClassNotFoundException { return delegate().loadClass(fullyQualifiedName); } diff --git a/yanglib/mdsal-yanglib-rfc7895/pom.xml b/yanglib/mdsal-yanglib-rfc7895/pom.xml index 9dd3ca48e1..9bcfff78ba 100644 --- a/yanglib/mdsal-yanglib-rfc7895/pom.xml +++ b/yanglib/mdsal-yanglib-rfc7895/pom.xml @@ -38,6 +38,10 @@ org.opendaylight.mdsal mdsal-binding-runtime-api + + org.opendaylight.mdsal + mdsal-binding-runtime-spi + org.opendaylight.mdsal mdsal-binding-dom-codec-api diff --git a/yanglib/mdsal-yanglib-rfc7895/src/main/java/org/opendaylight/mdsal/yanglib/rfc7895/SimpleStrategy.java b/yanglib/mdsal-yanglib-rfc7895/src/main/java/org/opendaylight/mdsal/yanglib/rfc7895/SimpleStrategy.java deleted file mode 100644 index 97a2deb103..0000000000 --- a/yanglib/mdsal-yanglib-rfc7895/src/main/java/org/opendaylight/mdsal/yanglib/rfc7895/SimpleStrategy.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (c) 2019 PANTHEON.tech s.r.o. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.mdsal.yanglib.rfc7895; - -import org.opendaylight.mdsal.binding.runtime.api.ClassLoadingStrategy; - -final class SimpleStrategy implements ClassLoadingStrategy { - static final SimpleStrategy INSTANCE = new SimpleStrategy(); - - @Override - public Class loadClass(final String fullyQualifiedName) throws ClassNotFoundException { - return SimpleStrategy.class.getClassLoader().loadClass(fullyQualifiedName); - } -} diff --git a/yanglib/mdsal-yanglib-rfc7895/src/main/java/org/opendaylight/mdsal/yanglib/rfc7895/YangModuleLibrarySupport.java b/yanglib/mdsal-yanglib-rfc7895/src/main/java/org/opendaylight/mdsal/yanglib/rfc7895/YangModuleLibrarySupport.java index 8aa3402cdd..0e92b6ec17 100644 --- a/yanglib/mdsal-yanglib-rfc7895/src/main/java/org/opendaylight/mdsal/yanglib/rfc7895/YangModuleLibrarySupport.java +++ b/yanglib/mdsal-yanglib-rfc7895/src/main/java/org/opendaylight/mdsal/yanglib/rfc7895/YangModuleLibrarySupport.java @@ -10,8 +10,8 @@ package org.opendaylight.mdsal.yanglib.rfc7895; import static com.google.common.base.Verify.verifyNotNull; import com.google.common.annotations.Beta; -import com.google.common.collect.Collections2; import java.io.IOException; +import java.util.List; import javax.inject.Inject; import javax.inject.Singleton; import org.eclipse.jdt.annotation.NonNullByDefault; @@ -20,6 +20,8 @@ import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory; import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode; import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeGenerator; import org.opendaylight.mdsal.binding.runtime.api.DefaultBindingRuntimeContext; +import org.opendaylight.mdsal.binding.runtime.api.ModuleInfoSnapshot; +import org.opendaylight.mdsal.binding.runtime.spi.ModuleInfoSnapshotBuilder; import org.opendaylight.mdsal.yanglib.api.SchemaContextResolver; import org.opendaylight.mdsal.yanglib.api.YangLibSupport; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev160621.$YangModuleInfoImpl; @@ -27,13 +29,9 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.librar import org.opendaylight.yangtools.rfc8528.data.api.MountPointContextFactory; import org.opendaylight.yangtools.rfc8528.data.api.MountPointIdentifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.YangModuleInfo; -import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; import org.opendaylight.yangtools.yang.model.parser.api.YangParserException; import org.opendaylight.yangtools.yang.model.parser.api.YangParserFactory; -import org.opendaylight.yangtools.yang.model.repo.api.RevisionSourceIdentifier; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; @Beta @NonNullByDefault @@ -45,15 +43,13 @@ public final class YangModuleLibrarySupport implements YangLibSupport { @Inject public YangModuleLibrarySupport(final YangParserFactory parserFactory, final BindingRuntimeGenerator generator, final BindingCodecTreeFactory codecFactory) throws YangParserException, IOException { - final YangModuleInfo yangLibModule = $YangModuleInfoImpl.getInstance(); + final ModuleInfoSnapshotBuilder builder = new ModuleInfoSnapshotBuilder("yanglib", parserFactory); + builder.registerModuleInfos(List.of($YangModuleInfoImpl.getInstance())); + final ModuleInfoSnapshot snapshot = builder.build(); + context = snapshot.getEffectiveModelContext(); - context = parserFactory.createParser() - .addLibSources(Collections2.transform(yangLibModule.getImportedModules(), - YangModuleLibrarySupport::createSource)) - .addSource(createSource(yangLibModule)) - .buildEffectiveModel(); - final BindingCodecTree codecTree = codecFactory.create(DefaultBindingRuntimeContext.create( - generator.generateTypeMapping(context), SimpleStrategy.INSTANCE)); + final BindingCodecTree codecTree = codecFactory.create(new DefaultBindingRuntimeContext( + generator.generateTypeMapping(context), snapshot)); this.codec = verifyNotNull(codecTree.getSubtreeCodec(InstanceIdentifier.create(ModulesState.class))); } @@ -63,10 +59,4 @@ public final class YangModuleLibrarySupport implements YangLibSupport { final SchemaContextResolver resolver) { return new MountPointContextFactoryImpl(mountId, resolver, context, codec); } - - private static YangTextSchemaSource createSource(final YangModuleInfo info) { - final QName name = info.getName(); - return YangTextSchemaSource.delegateForByteSource( - RevisionSourceIdentifier.create(name.getLocalName(), name.getRevision()), info.getYangTextByteSource()); - } } diff --git a/yanglib/mdsal-yanglib-rfc8525/pom.xml b/yanglib/mdsal-yanglib-rfc8525/pom.xml index 354b2b5340..5e8d07850a 100644 --- a/yanglib/mdsal-yanglib-rfc8525/pom.xml +++ b/yanglib/mdsal-yanglib-rfc8525/pom.xml @@ -38,6 +38,10 @@ org.opendaylight.mdsal mdsal-binding-runtime-api + + org.opendaylight.mdsal + mdsal-binding-runtime-spi + org.opendaylight.mdsal mdsal-binding-dom-codec-api diff --git a/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/SimpleStrategy.java b/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/SimpleStrategy.java deleted file mode 100644 index 9e8cedc941..0000000000 --- a/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/SimpleStrategy.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (c) 2019 PANTHEON.tech s.r.o. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.mdsal.yanglib.rfc8525; - -import org.opendaylight.mdsal.binding.runtime.api.ClassLoadingStrategy; - -final class SimpleStrategy implements ClassLoadingStrategy { - static final SimpleStrategy INSTANCE = new SimpleStrategy(); - - @Override - public Class loadClass(final String fullyQualifiedName) throws ClassNotFoundException { - return SimpleStrategy.class.getClassLoader().loadClass(fullyQualifiedName); - } -} diff --git a/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibrarySupport.java b/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibrarySupport.java index 78654c78d5..4da1e6b377 100644 --- a/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibrarySupport.java +++ b/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibrarySupport.java @@ -10,8 +10,8 @@ package org.opendaylight.mdsal.yanglib.rfc8525; import static com.google.common.base.Verify.verifyNotNull; import com.google.common.annotations.Beta; -import com.google.common.collect.Collections2; import java.io.IOException; +import java.util.List; import javax.inject.Inject; import javax.inject.Singleton; import org.eclipse.jdt.annotation.NonNullByDefault; @@ -21,6 +21,8 @@ import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNo import org.opendaylight.mdsal.binding.dom.codec.api.BindingIdentityCodec; import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeGenerator; import org.opendaylight.mdsal.binding.runtime.api.DefaultBindingRuntimeContext; +import org.opendaylight.mdsal.binding.runtime.api.ModuleInfoSnapshot; +import org.opendaylight.mdsal.binding.runtime.spi.ModuleInfoSnapshotBuilder; import org.opendaylight.mdsal.yanglib.api.SchemaContextResolver; import org.opendaylight.mdsal.yanglib.api.YangLibSupport; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.$YangModuleInfoImpl; @@ -29,13 +31,9 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.librar import org.opendaylight.yangtools.rfc8528.data.api.MountPointContextFactory; import org.opendaylight.yangtools.rfc8528.data.api.MountPointIdentifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.YangModuleInfo; -import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; import org.opendaylight.yangtools.yang.model.parser.api.YangParserException; import org.opendaylight.yangtools.yang.model.parser.api.YangParserFactory; -import org.opendaylight.yangtools.yang.model.repo.api.RevisionSourceIdentifier; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; @Beta @NonNullByDefault @@ -50,15 +48,13 @@ public final class YangLibrarySupport implements YangLibSupport { @Inject public YangLibrarySupport(final YangParserFactory parserFactory, final BindingRuntimeGenerator generator, final BindingCodecTreeFactory codecFactory) throws YangParserException, IOException { - final YangModuleInfo yangLibModule = $YangModuleInfoImpl.getInstance(); + final ModuleInfoSnapshotBuilder builder = new ModuleInfoSnapshotBuilder("yanglib", parserFactory); + builder.registerModuleInfos(List.of($YangModuleInfoImpl.getInstance())); + final ModuleInfoSnapshot snapshot = builder.build(); + context = snapshot.getEffectiveModelContext(); - context = parserFactory.createParser() - .addLibSources(Collections2.transform(yangLibModule.getImportedModules(), - YangLibrarySupport::createSource)) - .addSource(createSource(yangLibModule)) - .buildEffectiveModel(); - final BindingCodecTree codecTree = codecFactory.create(DefaultBindingRuntimeContext.create( - generator.generateTypeMapping(context), SimpleStrategy.INSTANCE)); + final BindingCodecTree codecTree = codecFactory.create(new DefaultBindingRuntimeContext( + generator.generateTypeMapping(context), snapshot)); this.identityCodec = codecTree.getIdentityCodec(); this.codec = verifyNotNull(codecTree.getSubtreeCodec(InstanceIdentifier.create(YangLibrary.class))); @@ -70,10 +66,4 @@ public final class YangLibrarySupport implements YangLibSupport { final SchemaContextResolver resolver) { return new MountPointContextFactoryImpl(mountId, resolver, context, identityCodec, codec, legacyCodec); } - - private static YangTextSchemaSource createSource(final YangModuleInfo info) { - final QName name = info.getName(); - return YangTextSchemaSource.delegateForByteSource( - RevisionSourceIdentifier.create(name.getLocalName(), name.getRevision()), info.getYangTextByteSource()); - } } -- 2.36.6