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;
@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));
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;
@BeforeClass
public static void beforeClass() {
- CODEC = new DefaultBindingCodecTreeFactory().create(BindingRuntimeHelpers.createRuntimeContext(
- new DefaultBindingRuntimeGenerator()));
+ CODEC = new DefaultBindingCodecTreeFactory().create(BindingRuntimeHelpers.createRuntimeContext());
}
@Test
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
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;
@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());
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;
}
private static BindingNormalizedNodeSerializer codec(final Class<?>... classes) {
- return new BindingCodecContext(BindingRuntimeHelpers.createRuntimeContext(
- new DefaultBindingRuntimeGenerator(), classes));
+ return new BindingCodecContext(BindingRuntimeHelpers.createRuntimeContext(classes));
}
}
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;
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
public static @NonNull EffectiveModelContext createEffectiveModel(
final Iterable<? extends YangModuleInfo> 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<? extends YangModuleInfo> 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<Class<?>> classes) {
+ final ModuleInfoBackedContext ctx = prepareContext(parserFactory, classes.stream()
.map(BindingRuntimeHelpers::extractYangModuleInfo)
.collect(Collectors.toList()));
return DefaultBindingRuntimeContext.create(
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<? extends YangModuleInfo> moduleInfos) {
- final ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create();
+ private static @NonNull ModuleInfoBackedContext prepareContext(final YangParserFactory parserFactory,
+ final Iterable<? extends YangModuleInfo> moduleInfos) {
+ final ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create("helper", parserFactory);
ctx.registerModuleInfos(moduleInfos);
return ctx;
}
--- /dev/null
+/*
+ * 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"));
+ }
+}