The implementation here is quite simple, convert it to a JPMS module.
Since we are breaking encapsulation the now-defunct YangTextTemplateTest
is removed. Also src/test/resources/ietf is renamed to ietf-models
to make it an unencapsulated resource.
JIRA: MDSAL-644
Change-Id: I9db57ed04b8188cefa91b644d434e2b1619e4d4b
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
<artifactId>mdsal-binding-runtime-api</artifactId>
</dependency>
<dependency>
- <groupId>javax.inject</groupId>
+ <groupId>com.guicedee.services</groupId>
<artifactId>javax.inject</artifactId>
<optional>true</optional>
</dependency>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
- <artifactId>osgi.cmpn</artifactId>
+ <artifactId>org.osgi.service.component.annotations</artifactId>
</dependency>
<dependency>
--- /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
+ */
+import org.opendaylight.mdsal.binding.generator.api.BindingGenerator;
+import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingGenerator;
+import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator;
+import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeGenerator;
+
+module org.opendaylight.mdsal.binding.generator.impl {
+ // FIXME: 8.0.0: do not export this package (move public stuff to .di)
+ exports org.opendaylight.mdsal.binding.generator.impl;
+ exports org.opendaylight.mdsal.binding.yang.types;
+
+ provides BindingGenerator with DefaultBindingGenerator;
+ provides BindingRuntimeGenerator with DefaultBindingRuntimeGenerator;
+
+ requires transitive org.opendaylight.mdsal.binding.generator.api;
+ requires transitive org.opendaylight.mdsal.binding.generator.util;
+ requires transitive org.opendaylight.mdsal.binding.runtime.api;
+ requires org.opendaylight.mdsal.binding.spec.util;
+ requires org.opendaylight.yangtools.yang.model.api;
+ requires org.opendaylight.yangtools.yang.model.util;
+ requires org.opendaylight.yangtools.util;
+ requires org.slf4j;
+
+ // Annotations
+ requires static transitive org.eclipse.jdt.annotation;
+ requires static javax.inject;
+ requires static metainf.services;
+ requires static org.osgi.service.component.annotations;
+}
import org.opendaylight.yangtools.yang.binding.Identifier;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.IdentifiableItem;
+// FIXME: 8.0.0: hide this class
public final class CodecTypeUtils {
private CodecTypeUtils() {
throw new UnsupportedOperationException("Utility class should not be instantiated");
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
+import javax.inject.Inject;
import javax.inject.Singleton;
import org.eclipse.jdt.annotation.NonNull;
import org.kohsuke.MetaInfServices;
@Singleton
// Note: not exposed in OSGi on purpose, as this should only be needed at compile-time
public final class DefaultBindingGenerator implements BindingGenerator {
+ @Inject
+ public DefaultBindingGenerator() {
+ // Exposed for DI
+ }
+
@Override
public List<Type> generateTypes(final EffectiveModelContext context, final Collection<? extends Module> modules) {
return generateFor(context, modules);
import com.google.common.annotations.Beta;
import java.util.IdentityHashMap;
import java.util.Map;
+import javax.inject.Inject;
import javax.inject.Singleton;
import org.kohsuke.MetaInfServices;
import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
public final class DefaultBindingRuntimeGenerator implements BindingRuntimeGenerator {
private static final Logger LOG = LoggerFactory.getLogger(DefaultBindingRuntimeGenerator.class);
+ @Inject
+ public DefaultBindingRuntimeGenerator() {
+ // exposed for DI
+ }
+
@Override
public BindingRuntimeTypes generateTypeMapping(final EffectiveModelContext context) {
GeneratorUtils.checkContext(context);
/**
* Utility class for building up Binding mapping information. This class is NOT thread-safe.
*/
+// FIXME: 8.0.0: hide this class
public final class ModuleContext implements Mutable {
private static final Logger LOG = LoggerFactory.getLogger(ModuleContext.class);
* considering using {@link RuntimeTypeProvider}.
*/
@Beta
-// FIXME: make this class final after TypeProviderImpl is gone
+// FIXME: 8.0.0: make this class final
public class CodegenTypeProvider extends AbstractTypeProvider {
private static final Logger LOG = LoggerFactory.getLogger(CodegenTypeProvider.class);
import org.opendaylight.yangtools.yang.model.api.NotificationNodeContainer;
import org.opendaylight.yangtools.yang.model.api.UsesNode;
+// FIXME: 8.0.0: this should be final
public class GroupingDefinitionDependencySort {
/**
* Sorts set {@code groupingDefinitions} according to the mutual dependencies.<br>
import org.opendaylight.yangtools.util.TopologicalSort.NodeImpl;
+// FIXME: 8.0.0: hide this class
public final class NodeWrappedType extends NodeImpl {
/**
* The payload which is saved inside Node.
final List<Type> genTypes = DefaultBindingGenerator.generateFor(YangParserTestUtils.parseYangResources(
ControllerTest.class,
"/controller-models/controller-network.yang", "/controller-models/controller-openflow.yang",
- "/ietf/ietf-inet-types.yang"));
+ "/ietf-models/ietf-inet-types.yang"));
assertNotNull(genTypes);
assertTrue(!genTypes.isEmpty());
public void constantGenerationTest() {
final List<Type> genTypes = DefaultBindingGenerator.generateFor(YangParserTestUtils.parseYangResources(
ExtendedTypedefTest.class,
- "/typedef-of-typedef/typedef_of_typedef.yang", "/ietf/ietf-inet-types.yang"));
+ "/typedef-of-typedef/typedef_of_typedef.yang", "/ietf-models/ietf-inet-types.yang"));
GeneratedTransferObject simpleTypedef4 = null;
GeneratedTransferObject extendedTypedefUnion = null;
public void testLeafEnumResolving() {
final List<Type> genTypes = DefaultBindingGenerator.generateFor(YangParserTestUtils.parseYangResources(
GenEnumResolvingTest.class,
- "/enum-test-models/ietf-interfaces@2012-11-15.yang", "/ietf/iana-if-type.yang"));
+ "/enum-test-models/ietf-interfaces@2012-11-15.yang", "/ietf-models/iana-if-type.yang"));
assertTrue(genTypes != null);
assertEquals("Expected count of all Generated Types", 6, genTypes.size());
@Test
public void testTypedefEnumResolving() {
final List<Type> genTypes = DefaultBindingGenerator.generateFor(YangParserTestUtils.parseYangResource(
- "/ietf/iana-if-type.yang"));
+ "/ietf-models/iana-if-type.yang"));
assertTrue(genTypes != null);
assertEquals(1, genTypes.size());
final List<Type> genTypes = DefaultBindingGenerator.generateFor(YangParserTestUtils.parseYangResources(
GenEnumResolvingTest.class,
"/enum-test-models/abstract-topology@2013-02-08.yang", "/enum-test-models/ietf-interfaces@2012-11-15.yang",
- "/ietf/iana-if-type.yang"));
+ "/ietf-models/iana-if-type.yang"));
assertNotNull(genTypes);
assertTrue(!genTypes.isEmpty());
@Test
public void genTypesFromSubsetOfTwoModulesTest() {
final EffectiveModelContext context = YangParserTestUtils.parseYangResources(GenTypesSubSetTest.class,
- "/leafref-test-models/abstract-topology@2013-02-08.yang", "/ietf/ietf-interfaces.yang",
- "/ietf/ietf-inet-types.yang", "/ietf/ietf-yang-types.yang");
+ "/leafref-test-models/abstract-topology@2013-02-08.yang", "/ietf-models/ietf-interfaces.yang",
+ "/ietf-models/ietf-inet-types.yang", "/ietf-models/ietf-yang-types.yang");
final Set<Module> toGenModules = new HashSet<>();
for (final Module module : context.getModules()) {
if (module.getName().equals("abstract-topology")) {
@Test
public void genTypesFromSubsetOfThreeModulesTest() {
final EffectiveModelContext context = YangParserTestUtils.parseYangResources(GenTypesSubSetTest.class,
- "/leafref-test-models/abstract-topology@2013-02-08.yang", "/ietf/ietf-interfaces.yang",
- "/ietf/ietf-inet-types.yang", "/ietf/ietf-yang-types.yang", "/ietf/iana-if-type.yang");
+ "/leafref-test-models/abstract-topology@2013-02-08.yang", "/ietf-models/ietf-interfaces.yang",
+ "/ietf-models/ietf-inet-types.yang", "/ietf-models/ietf-yang-types.yang",
+ "/ietf-models/iana-if-type.yang");
assertNotNull("Schema Context is null", context);
final Set<Module> toGenModules = new HashSet<>();
@Test
public void testLeafrefResolving() {
final EffectiveModelContext context = YangParserTestUtils.parseYangResources(GeneratedTypesLeafrefTest.class,
- "/leafref-test-models/abstract-topology@2013-02-08.yang", "/ietf/ietf-interfaces.yang",
- "/ietf/ietf-inet-types.yang", "/ietf/ietf-yang-types.yang");
+ "/leafref-test-models/abstract-topology@2013-02-08.yang", "/ietf-models/ietf-interfaces.yang",
+ "/ietf-models/ietf-inet-types.yang", "/ietf-models/ietf-yang-types.yang");
assertEquals(4, context.getModules().size());
final List<Type> genTypes = DefaultBindingGenerator.generateFor(context);
@Test
public void testMultipleModulesResolving() {
final List<Type> genTypes = DefaultBindingGenerator.generateFor(YangParserTestUtils.parseYangResources(
- GeneratedTypesTest.class, "/abstract-topology.yang", "/ietf/ietf-inet-types.yang"));
+ GeneratedTypesTest.class, "/abstract-topology.yang", "/ietf-models/ietf-inet-types.yang"));
assertNotNull(genTypes);
assertEquals(29, genTypes.size());
import static org.opendaylight.mdsal.binding.model.util.BindingTypes.TYPE_OBJECT;
import java.util.List;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
import org.junit.Test;
import org.opendaylight.mdsal.binding.model.api.GeneratedType;
import org.opendaylight.mdsal.binding.model.api.Type;
import org.opendaylight.mdsal.binding.model.util.BindingTypes;
import org.opendaylight.mdsal.binding.model.util.Types;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
public class Mdsal406TypeObjectTest {
+ private static EffectiveModelContext CONTEXT;
+
+ @BeforeClass
+ public static void beforeClass() {
+ CONTEXT = YangParserTestUtils.parseYangResources(ExtendedTypedefTest.class,
+ "/type-provider/test.yang", "/ietf-models/ietf-inet-types.yang");
+ }
+
+ @AfterClass
+ public static void afterClass() {
+ CONTEXT = null;
+ }
+
@Test
public void typeObjectTest() {
- final List<Type> generateTypes = DefaultBindingGenerator.generateFor(YangParserTestUtils.parseYangResources(
- ExtendedTypedefTest.class, "/type-provider/test.yang", "/ietf/ietf-inet-types.yang"));
+ final List<Type> generateTypes = DefaultBindingGenerator.generateFor(CONTEXT);
assertNotNull(generateTypes);
final Type typedefType = generateTypes.stream().filter(type -> type.getFullyQualifiedName()
@Test
public void typeObjectForBitsTypedefTest() {
- final List<Type> generateTypes = DefaultBindingGenerator.generateFor(YangParserTestUtils.parseYangResources(
- ExtendedTypedefTest.class, "/type-provider/test.yang", "/ietf/ietf-inet-types.yang"));
+ final List<Type> generateTypes = DefaultBindingGenerator.generateFor(CONTEXT);
assertNotNull(generateTypes);
final Type typedefType = generateTypes.stream().filter(type -> type.getFullyQualifiedName()
@Test
public void typeObjectForUnionTypedefTest() {
- final List<Type> generateTypes = DefaultBindingGenerator.generateFor(YangParserTestUtils.parseYangResources(
- ExtendedTypedefTest.class, "/type-provider/test.yang", "/ietf/ietf-inet-types.yang"));
+ final List<Type> generateTypes = DefaultBindingGenerator.generateFor(CONTEXT);
assertNotNull(generateTypes);
final Type typedefType = generateTypes.stream().filter(type -> type.getFullyQualifiedName()
@BeforeClass
public static void setup() {
CONTEXT = YangParserTestUtils.parseYangResources(TypeProviderIntegrationTest.class, "/type-provider/test.yang",
- "/ietf/ietf-inet-types.yang");
+ "/ietf-models/ietf-inet-types.yang");
assertNotNull(CONTEXT);
}
@Test
public void unionTypeResolvingTest() {
final List<Type> genTypes = DefaultBindingGenerator.generateFor(YangParserTestUtils.parseYangResources(
- UnionTypeDefTest.class, "/union-test-models/abstract-topology.yang", "/ietf/ietf-inet-types.yang"));
+ UnionTypeDefTest.class, "/union-test-models/abstract-topology.yang", "/ietf-models/ietf-inet-types.yang"));
assertNotNull("genTypes is null", genTypes);
assertFalse("genTypes is empty", genTypes.isEmpty());
+++ /dev/null
-/*
- * Copyright (c) 2016 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.generator.impl;
-
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import org.junit.Test;
-import org.opendaylight.mdsal.binding.model.util.FormattingUtils;
-
-public class YangTextTemplateTest {
- @Test
- public void privateConstructTest() throws ReflectiveOperationException {
- final Constructor<FormattingUtils> constructor = FormattingUtils.class.getDeclaredConstructor();
- constructor.setAccessible(true);
- try {
- constructor.newInstance();
- fail();
- } catch (InvocationTargetException e) {
- assertTrue(e.getCause() instanceof UnsupportedOperationException);
- }
- }
-}
\ No newline at end of file
@RunWith(MockitoJUnitRunner.class)
public class TypeProviderTest {
- private static SchemaContext SCHEMA_CONTEXT;
- private static Module TEST_TYPE_PROVIDER;
+ public static SchemaContext SCHEMA_CONTEXT;
+ public static Module TEST_TYPE_PROVIDER;
@Mock
- private SchemaPath schemaPath;
+ public SchemaPath schemaPath;
@Mock
- private SchemaNode schemaNode;
+ public SchemaNode schemaNode;
@BeforeClass
public static void beforeClass() {