From: Robert Varga Date: Thu, 23 Apr 2020 11:38:04 +0000 (+0200) Subject: Cleanup BindingRuntimeHelpers X-Git-Tag: v6.0.0~8 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=3419de1e71159aa289b9663cb24f09fc0fd8e968;p=mdsal.git Cleanup BindingRuntimeHelpers We need to differentiate between testing (static context) and dynamic contexts. This makes it possible to use these helpers in OSGi if we inject the right set of services. Change-Id: Ibc22b1597320956408217b98d44c9ea3fdd98c32 Signed-off-by: Robert Varga --- diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/ActionLookupTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/ActionLookupTest.java index 04c0f6aa99..aacfa951fd 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/ActionLookupTest.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/ActionLookupTest.java @@ -12,7 +12,6 @@ import static org.junit.Assert.assertEquals; import org.junit.Test; import org.opendaylight.binding.runtime.spi.BindingRuntimeHelpers; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext; -import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.Cont; import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.Grpcont; import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.Othercont; @@ -24,7 +23,7 @@ public class ActionLookupTest { @Test public void testActionSchemaPath() { CurrentAdapterSerializer codec = new CurrentAdapterSerializer(new BindingCodecContext( - BindingRuntimeHelpers.createRuntimeContext(new DefaultBindingRuntimeGenerator()))); + BindingRuntimeHelpers.createRuntimeContext())); assertEquals(SchemaPath.create(true, Cont.QNAME, Foo.QNAME), codec.getActionPath(Foo.class)); assertEquals(SchemaPath.create(true, Grpcont.QNAME, Bar.QNAME), codec.getActionPath(Bar.class)); diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/query/binding/adapter/QueryBuilderTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/query/binding/adapter/QueryBuilderTest.java index 23d9b0c3d9..67f8c8b4e6 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/query/binding/adapter/QueryBuilderTest.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/query/binding/adapter/QueryBuilderTest.java @@ -15,7 +15,6 @@ import org.opendaylight.mdsal.binding.api.query.QueryFactory; import org.opendaylight.mdsal.binding.api.query.QueryStructureException; import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree; import org.opendaylight.mdsal.binding.dom.codec.impl.DefaultBindingCodecTreeFactory; -import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; 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.top.level.list.NestedList; @@ -28,8 +27,7 @@ public class QueryBuilderTest { @BeforeClass public static void beforeClass() { - CODEC = new DefaultBindingCodecTreeFactory().create(BindingRuntimeHelpers.createRuntimeContext( - new DefaultBindingRuntimeGenerator())); + CODEC = new DefaultBindingCodecTreeFactory().create(BindingRuntimeHelpers.createRuntimeContext()); } @Test diff --git a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractBindingRuntimeTest.java b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractBindingRuntimeTest.java index 9401a19135..3340fec8a2 100644 --- a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractBindingRuntimeTest.java +++ b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractBindingRuntimeTest.java @@ -11,14 +11,13 @@ import org.junit.AfterClass; import org.junit.BeforeClass; import org.opendaylight.binding.runtime.api.BindingRuntimeContext; import org.opendaylight.binding.runtime.spi.BindingRuntimeHelpers; -import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; public abstract class AbstractBindingRuntimeTest { private static BindingRuntimeContext runtimeContext; @BeforeClass public static void beforeClass() { - runtimeContext = BindingRuntimeHelpers.createRuntimeContext(new DefaultBindingRuntimeGenerator()); + runtimeContext = BindingRuntimeHelpers.createRuntimeContext(); } @AfterClass 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 index b3586c124f..f854662cca 100644 --- 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 @@ -21,7 +21,6 @@ import org.opendaylight.binding.runtime.api.DefaultBindingRuntimeContext; import org.opendaylight.binding.runtime.spi.BindingRuntimeHelpers; import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer; import org.opendaylight.mdsal.binding.dom.codec.api.MissingClassInLoadingStrategyException; -import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; 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; @@ -47,8 +46,7 @@ public class AugmentationClassDiscoveredAfterCodecTest { @Before public void setup() { // Baseline state: strategy is cognizant of the classes - final BindingRuntimeContext delegate = BindingRuntimeHelpers.createRuntimeContext( - new DefaultBindingRuntimeGenerator()); + final BindingRuntimeContext delegate = BindingRuntimeHelpers.createRuntimeContext(); // Class loading filter, manipulated by tests filter = new FilteringClassLoadingStrategy(delegate.getStrategy()); diff --git a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/ExceptionReportingTest.java b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/ExceptionReportingTest.java index 831eccb20e..ae09d5ac57 100644 --- a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/ExceptionReportingTest.java +++ b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/ExceptionReportingTest.java @@ -13,7 +13,6 @@ import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSeriali import org.opendaylight.mdsal.binding.dom.codec.api.IncorrectNestingException; import org.opendaylight.mdsal.binding.dom.codec.api.MissingSchemaException; import org.opendaylight.mdsal.binding.dom.codec.api.MissingSchemaForClassException; -import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; 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.binding.rev140701.Top; @@ -73,7 +72,6 @@ public class ExceptionReportingTest { } private static BindingNormalizedNodeSerializer codec(final Class... classes) { - return new BindingCodecContext(BindingRuntimeHelpers.createRuntimeContext( - new DefaultBindingRuntimeGenerator(), classes)); + return new BindingCodecContext(BindingRuntimeHelpers.createRuntimeContext(classes)); } } diff --git a/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/binding/runtime/spi/BindingRuntimeHelpers.java b/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/binding/runtime/spi/BindingRuntimeHelpers.java index c5ccd74835..2c0b0a9fe7 100644 --- a/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/binding/runtime/spi/BindingRuntimeHelpers.java +++ b/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/binding/runtime/spi/BindingRuntimeHelpers.java @@ -8,7 +8,9 @@ package org.opendaylight.binding.runtime.spi; import com.google.common.annotations.Beta; +import com.google.common.base.Throwables; import java.util.Arrays; +import java.util.Collection; import java.util.stream.Collectors; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.binding.runtime.api.BindingRuntimeContext; @@ -17,6 +19,7 @@ import org.opendaylight.binding.runtime.api.DefaultBindingRuntimeContext; import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yangtools.yang.binding.YangModuleInfo; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; +import org.opendaylight.yangtools.yang.model.parser.api.YangParserFactory; /** * Simple helpers to help with reconstruction of BindingRuntimeContext from generated binding classes. These involve @@ -37,18 +40,34 @@ public final class BindingRuntimeHelpers { public static @NonNull EffectiveModelContext createEffectiveModel( final Iterable moduleInfos) { - return prepareContext(moduleInfos).tryToCreateModelContext().orElseThrow(); + return createEffectiveModel(ServiceLoaderState.ParserFactory.INSTANCE, moduleInfos); } - public static @NonNull BindingRuntimeContext createRuntimeContext(final BindingRuntimeGenerator generator) { - final ModuleInfoBackedContext ctx = prepareContext(BindingReflections.loadModuleInfos()); - return DefaultBindingRuntimeContext.create(generator.generateTypeMapping( + public static @NonNull EffectiveModelContext createEffectiveModel(final YangParserFactory parserFactory, + final Iterable moduleInfos) { + return prepareContext(parserFactory, moduleInfos).tryToCreateModelContext().orElseThrow(); + } + + public static @NonNull BindingRuntimeContext createRuntimeContext() { + final ModuleInfoBackedContext ctx = prepareContext(ServiceLoaderState.ParserFactory.INSTANCE, + BindingReflections.loadModuleInfos()); + return DefaultBindingRuntimeContext.create(ServiceLoaderState.Generator.INSTANCE.generateTypeMapping( ctx.tryToCreateModelContext().orElseThrow()), ctx); } - public static @NonNull BindingRuntimeContext createRuntimeContext(final BindingRuntimeGenerator generator, - final Class... classes) { - final ModuleInfoBackedContext ctx = prepareContext(Arrays.stream(classes) + public static @NonNull BindingRuntimeContext createRuntimeContext(final Class... classes) { + return createRuntimeContext(ServiceLoaderState.ParserFactory.INSTANCE, ServiceLoaderState.Generator.INSTANCE, + classes); + } + + public static @NonNull BindingRuntimeContext createRuntimeContext(final YangParserFactory parserFactory, + final BindingRuntimeGenerator generator, final Class... classes) { + return createRuntimeContext(parserFactory, generator, Arrays.asList(classes)); + } + + public static @NonNull BindingRuntimeContext createRuntimeContext(final YangParserFactory parserFactory, + final BindingRuntimeGenerator generator, final Collection> classes) { + final ModuleInfoBackedContext ctx = prepareContext(parserFactory, classes.stream() .map(BindingRuntimeHelpers::extractYangModuleInfo) .collect(Collectors.toList())); return DefaultBindingRuntimeContext.create( @@ -60,12 +79,14 @@ public final class BindingRuntimeHelpers { try { return BindingReflections.getModuleInfo(clazz); } catch (Exception e) { + Throwables.throwIfUnchecked(e); throw new IllegalStateException("Failed to extract module info from " + clazz, e); } } - private static ModuleInfoBackedContext prepareContext(final Iterable moduleInfos) { - final ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create(); + private static @NonNull ModuleInfoBackedContext prepareContext(final YangParserFactory parserFactory, + final Iterable moduleInfos) { + final ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create("helper", parserFactory); ctx.registerModuleInfos(moduleInfos); return ctx; } diff --git a/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/binding/runtime/spi/ServiceLoaderState.java b/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/binding/runtime/spi/ServiceLoaderState.java new file mode 100644 index 0000000000..10f62b621e --- /dev/null +++ b/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/binding/runtime/spi/ServiceLoaderState.java @@ -0,0 +1,30 @@ +/* + * 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.binding.runtime.spi; + +import java.util.ServiceLoader; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.opendaylight.binding.runtime.api.BindingRuntimeGenerator; +import org.opendaylight.yangtools.yang.model.parser.api.YangParserFactory; + +/** + * State derived from ServiceLoader. We statically bind to this state. If you need more dynamics, you should not be + * showing up here at all. + */ +@NonNullByDefault +final class ServiceLoaderState { + static final class Generator { + static final BindingRuntimeGenerator INSTANCE = ServiceLoader.load(BindingRuntimeGenerator.class).findFirst() + .orElseThrow(() -> new ExceptionInInitializerError("No BindingRuntimeGenerator found")); + } + + static final class ParserFactory { + static final YangParserFactory INSTANCE = ServiceLoader.load(YangParserFactory.class).findFirst() + .orElseThrow(() -> new ExceptionInInitializerError("No YangParserFactory found")); + } +}