Convert mdsal-binding-dom-codec to a JPMS module 78/97078/13
authortadei.bilan <tadei.bilan@pantheon.tech>
Mon, 19 Jul 2021 14:19:52 +0000 (17:19 +0300)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 20 Apr 2022 04:52:11 +0000 (06:52 +0200)
Convert mdsal-binding-dom-codec to a properly-injected JPMS module,
available through @Singleton, @Component and @MetaInfServices.

Also update NonCachingCodecTest to expose its mock fields and
UnionValueOptionContextTest to use test-model's classes.

This also necessitates relocating the loeader package, as otherwise
maven-javadoc-plugin ends up being confused passes down invalid
@packages to javadoc.

JIRA: MDSAL-641
Change-Id: I3cbe8da4fc4905a1246a5e94a7e208e1bccfa1d8
Signed-off-by: tadei.bilan <tadei.bilan@pantheon.tech>
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
24 files changed:
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/query/QueryBuilderTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/query/QueryPerformanceTest.java
binding/mdsal-binding-dom-codec/pom.xml
binding/mdsal-binding-dom-codec/src/main/java/module-info.java [new file with mode: 0644]
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ClassGeneratorBridge.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CodecDataObjectGenerator.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectStreamerGenerator.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/NodeCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/NotificationCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/OpaqueNodeCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/SimpleBindingCodecTreeFactory.java [moved from binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DefaultBindingCodecTreeFactory.java with 82% similarity]
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/SimpleBindingDOMCodecFactory.java [moved from binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DefaultBindingDOMCodecFactory.java with 83% similarity]
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/di/DefaultBindingCodecTreeFactory.java [new file with mode: 0644]
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/di/DefaultBindingDOMCodecFactory.java [new file with mode: 0644]
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/di/DefaultBindingDOMCodecServices.java [new file with mode: 0644]
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/di/package-info.java [new file with mode: 0644]
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/loader/CodecClassLoader.java [moved from binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/loader/CodecClassLoader.java with 99% similarity]
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/loader/LeafCodecClassLoader.java [moved from binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/loader/LeafCodecClassLoader.java with 98% similarity]
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/loader/RootCodecClassLoader.java [moved from binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/loader/RootCodecClassLoader.java with 98% similarity]
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/loader/package-info.java [moved from binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/loader/package-info.java with 63% similarity]
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/NonCachingCodecTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/UnionValueOptionContextTest.java
yanglib/mdsal-yanglib-rfc8525/src/test/java/org/opendaylight/mdsal/yanglib/rfc8525/AbstractYangLibraryTest.java

index f3b879d83e81eb8a61d4b4d35a0eb91599599e3a..7cf3be6c06db39a1e5bb8137f18a3ed37f8bf709 100644 (file)
@@ -12,6 +12,7 @@ import static org.junit.Assert.assertNotNull;
 
 import com.google.common.base.Stopwatch;
 import java.util.List;
+import java.util.ServiceLoader;
 import java.util.stream.Collectors;
 import org.eclipse.jdt.annotation.NonNull;
 import org.junit.AfterClass;
@@ -24,7 +25,7 @@ import org.opendaylight.mdsal.binding.api.query.QueryFactory;
 import org.opendaylight.mdsal.binding.api.query.QueryResult;
 import org.opendaylight.mdsal.binding.api.query.QueryResult.Item;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
-import org.opendaylight.mdsal.binding.dom.codec.impl.DefaultBindingCodecTreeFactory;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory;
 import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers;
 import org.opendaylight.yang.gen.v1.mdsal.query.norev.Foo;
 import org.opendaylight.yang.gen.v1.mdsal.query.norev.FooBuilder;
@@ -53,7 +54,8 @@ public class QueryBuilderTest {
 
     @BeforeClass
     public static final void beforeClass() {
-        CODEC = new DefaultBindingCodecTreeFactory().create(BindingRuntimeHelpers.createRuntimeContext());
+        CODEC = ServiceLoader.load(BindingCodecTreeFactory.class).findFirst().orElseThrow()
+            .create(BindingRuntimeHelpers.createRuntimeContext());
     }
 
     @AfterClass
index 13f20a852b6dfa12a1341fefb60b0a019c994a39..06b9595d1c74313332d7c6c1169584a37aeeeb36 100644 (file)
@@ -15,6 +15,7 @@ import static org.junit.Assert.assertTrue;
 import com.google.common.base.Stopwatch;
 import com.google.common.util.concurrent.FluentFuture;
 import java.util.Optional;
+import java.util.ServiceLoader;
 import java.util.concurrent.ExecutionException;
 import org.eclipse.jdt.annotation.NonNull;
 import org.junit.AfterClass;
@@ -28,7 +29,7 @@ import org.opendaylight.mdsal.binding.api.query.QueryExpression;
 import org.opendaylight.mdsal.binding.api.query.QueryFactory;
 import org.opendaylight.mdsal.binding.api.query.QueryResult;
 import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractDataBrokerTest;
-import org.opendaylight.mdsal.binding.dom.codec.impl.DefaultBindingCodecTreeFactory;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory;
 import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeContext;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.mdsal.query.norev.Foo;
@@ -69,7 +70,8 @@ public class QueryPerformanceTest extends AbstractDataBrokerTest {
     @Override
     protected void setupWithRuntimeContext(final BindingRuntimeContext runtimeContext) {
         super.setupWithRuntimeContext(runtimeContext);
-        factory = new DefaultQueryFactory(new DefaultBindingCodecTreeFactory().create(runtimeContext));
+        factory = new DefaultQueryFactory(ServiceLoader.load(BindingCodecTreeFactory.class).findFirst().orElseThrow()
+            .create(runtimeContext));
     }
 
     @Override
index 878c139532a4a2181258501de957f0c7a9c4e428..ac9068e10f0453f74df183e33bd4c8b3f54f9a00 100644 (file)
     <artifactId>mdsal-binding-dom-codec</artifactId>
     <packaging>bundle</packaging>
 
-    <properties>
-        <shade.source>net.bytebuddy</shade.source>
-        <shade.target>org.opendaylight.mdsal.binding.dom.codec.jar.bytebuddy</shade.target>
-    </properties>
-
     <dependencies>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
         <dependency>
             <groupId>net.bytebuddy</groupId>
             <artifactId>byte-buddy</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>concepts</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>util</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>yang-common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>yang-data-api</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.opendaylight.yangtools</groupId>
             <artifactId>yang-data-impl</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>yang-data-util</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>yang-model-api</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.opendaylight.mdsal</groupId>
             <artifactId>mdsal-binding-model-api</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-dom-codec-api</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.opendaylight.mdsal</groupId>
             <artifactId>mdsal-binding-dom-codec-spi</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-runtime-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-spec-util</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>yang-binding</artifactId>
+        </dependency>
         <dependency>
             <groupId>com.guicedee.services</groupId>
             <artifactId>javax.inject</artifactId>
             <scope>test</scope>
         </dependency>
     </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <extensions>true</extensions>
-                <configuration>
-                    <instructions>
-                        <Bundle-Name>${project.groupId}.${project.artifactId}</Bundle-Name>
-                        <Private-Package>
-                            org.opendaylight.mdsal.binding.dom.codec.impl,
-                            org.opendaylight.mdsal.binding.dom.codec.loader,
-                        </Private-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
 </project>
diff --git a/binding/mdsal-binding-dom-codec/src/main/java/module-info.java b/binding/mdsal-binding-dom-codec/src/main/java/module-info.java
new file mode 100644 (file)
index 0000000..1973901
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2021 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.dom.codec.api.BindingCodecTreeFactory;
+import org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext;
+import org.opendaylight.mdsal.binding.dom.codec.impl.SimpleBindingCodecTreeFactory;
+import org.opendaylight.mdsal.binding.dom.codec.impl.SimpleBindingDOMCodecFactory;
+import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecFactory;
+import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices;
+import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeContext;
+
+module org.opendaylight.mdsal.binding.dom.codec.impl {
+    exports org.opendaylight.mdsal.binding.dom.codec.impl.di;
+
+    uses BindingRuntimeContext;
+    provides BindingDOMCodecFactory with SimpleBindingDOMCodecFactory;
+    provides BindingDOMCodecServices with BindingCodecContext;
+    provides BindingCodecTreeFactory with SimpleBindingCodecTreeFactory;
+
+    requires transitive org.opendaylight.mdsal.binding.runtime.api;
+    requires transitive org.opendaylight.mdsal.binding.dom.codec.api;
+    requires transitive org.opendaylight.mdsal.binding.dom.codec.spi;
+    requires com.google.common;
+    requires net.bytebuddy;
+    requires org.opendaylight.mdsal.binding.model.api;
+    requires org.opendaylight.mdsal.binding.spec.util;
+    requires org.opendaylight.yangtools.concepts;
+    requires org.opendaylight.yangtools.util;
+    requires org.opendaylight.yangtools.yang.binding;
+    requires org.opendaylight.yangtools.yang.common;
+    requires org.opendaylight.yangtools.yang.data.api;
+    requires org.opendaylight.yangtools.yang.data.impl;
+    requires org.opendaylight.yangtools.yang.data.util;
+    requires org.opendaylight.yangtools.yang.model.api;
+    requires org.opendaylight.yangtools.yang.model.util;
+    requires org.slf4j;
+
+    // Annotations
+    requires static com.github.spotbugs.annotations;
+    requires static javax.inject;
+    requires static metainf.services;
+    requires static org.eclipse.jdt.annotation;
+    requires static org.osgi.service.component.annotations;
+}
index b85065ab39727587522423f68273e87966278b53..aa62a2192f3d0253770c23e16fb9c7991d18320d 100644 (file)
@@ -12,7 +12,6 @@ import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.base.Verify.verify;
 import static java.util.Objects.requireNonNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
@@ -35,8 +34,6 @@ import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.ServiceLoader;
 import java.util.concurrent.ExecutionException;
-import javax.inject.Inject;
-import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 import org.kohsuke.MetaInfServices;
@@ -46,7 +43,7 @@ import org.opendaylight.mdsal.binding.dom.codec.api.BindingInstanceIdentifierCod
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeWriterFactory;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingStreamEventWriter;
 import org.opendaylight.mdsal.binding.dom.codec.impl.NodeCodecContext.CodecContextFactory;
-import org.opendaylight.mdsal.binding.dom.codec.loader.CodecClassLoader;
+import org.opendaylight.mdsal.binding.dom.codec.impl.loader.CodecClassLoader;
 import org.opendaylight.mdsal.binding.dom.codec.spi.AbstractBindingNormalizedNodeSerializer;
 import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices;
 import org.opendaylight.mdsal.binding.dom.codec.spi.BindingSchemaMapping;
@@ -100,9 +97,7 @@ import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Beta
 @MetaInfServices(value = BindingDOMCodecServices.class)
-@Singleton
 public final class BindingCodecContext extends AbstractBindingNormalizedNodeSerializer
         implements BindingDOMCodecServices, Immutable, CodecContextFactory, DataObjectSerializerRegistry {
     private final class DataObjectSerializerProxy implements DataObjectSerializer, Delegator<DataObjectStreamer<?>> {
@@ -154,7 +149,6 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri
             .orElseThrow(() -> new IllegalStateException("Failed to load BindingRuntimeContext")));
     }
 
-    @Inject
     public BindingCodecContext(final BindingRuntimeContext context) {
         this.context = requireNonNull(context, "Binding Runtime Context is required.");
         root = SchemaRootCodecContext.create(this);
index d5791d7534981b063cd9b970d180105d9ae89835..7b2c313f9e1cb67a2c9cd0214f0f71493b324bf8 100644 (file)
@@ -13,7 +13,7 @@ import com.google.common.annotations.Beta;
 import com.google.common.base.Supplier;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.mdsal.binding.dom.codec.loader.CodecClassLoader.ClassGenerator;
+import org.opendaylight.mdsal.binding.dom.codec.impl.loader.CodecClassLoader.ClassGenerator;
 
 /**
  * Bridge for initializing generated instance constants during class loading time. This class is public only due to
index 2603faec760789129900be2d6d9e560947b5b2aa..1c4021ca66ac2dda4b83eb6a470b88d68ca4dde0 100644 (file)
@@ -43,9 +43,9 @@ import net.bytebuddy.jar.asm.Opcodes;
 import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.mdsal.binding.dom.codec.impl.ClassGeneratorBridge.LocalNameProvider;
 import org.opendaylight.mdsal.binding.dom.codec.impl.ClassGeneratorBridge.NodeContextSupplierProvider;
-import org.opendaylight.mdsal.binding.dom.codec.loader.CodecClassLoader;
-import org.opendaylight.mdsal.binding.dom.codec.loader.CodecClassLoader.ClassGenerator;
-import org.opendaylight.mdsal.binding.dom.codec.loader.CodecClassLoader.GeneratorResult;
+import org.opendaylight.mdsal.binding.dom.codec.impl.loader.CodecClassLoader;
+import org.opendaylight.mdsal.binding.dom.codec.impl.loader.CodecClassLoader.ClassGenerator;
+import org.opendaylight.mdsal.binding.dom.codec.impl.loader.CodecClassLoader.GeneratorResult;
 import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.slf4j.Logger;
index c8b4b3e2541a724cf3af9a104dd7c9916934371e..b0da58398506299300e7e0c6db24b79a642e85f0 100644 (file)
@@ -50,9 +50,9 @@ import net.bytebuddy.matcher.ElementMatchers;
 import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingStreamEventWriter;
 import org.opendaylight.mdsal.binding.dom.codec.impl.NodeCodecContext.CodecContextFactory;
-import org.opendaylight.mdsal.binding.dom.codec.loader.CodecClassLoader;
-import org.opendaylight.mdsal.binding.dom.codec.loader.CodecClassLoader.ClassGenerator;
-import org.opendaylight.mdsal.binding.dom.codec.loader.CodecClassLoader.GeneratorResult;
+import org.opendaylight.mdsal.binding.dom.codec.impl.loader.CodecClassLoader;
+import org.opendaylight.mdsal.binding.dom.codec.impl.loader.CodecClassLoader.ClassGenerator;
+import org.opendaylight.mdsal.binding.dom.codec.impl.loader.CodecClassLoader.GeneratorResult;
 import org.opendaylight.mdsal.binding.dom.codec.spi.BindingSchemaMapping;
 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
 import org.opendaylight.mdsal.binding.model.api.MethodSignature;
index 8ce77a21608b198c23e6bd2375b0c742353a6806..f4ac5d8c63d4fffcb7cabe30055fa6f658f553a1 100644 (file)
@@ -13,7 +13,7 @@ import java.util.List;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode;
-import org.opendaylight.mdsal.binding.dom.codec.loader.CodecClassLoader;
+import org.opendaylight.mdsal.binding.dom.codec.impl.loader.CodecClassLoader;
 import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeContext;
 import org.opendaylight.mdsal.binding.runtime.api.ListRuntimeType;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
index 87da154d3393a6437a1e1d0bf20cda371cccc05c..332707334c9cbc54bbb0e53298ab74428002f6f3 100644 (file)
@@ -35,7 +35,7 @@ import net.bytebuddy.implementation.bytecode.member.MethodVariableAccess;
 import net.bytebuddy.jar.asm.Opcodes;
 import net.bytebuddy.matcher.ElementMatchers;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.mdsal.binding.dom.codec.loader.CodecClassLoader.GeneratorResult;
+import org.opendaylight.mdsal.binding.dom.codec.impl.loader.CodecClassLoader.GeneratorResult;
 import org.opendaylight.mdsal.binding.runtime.api.NotificationRuntimeType;
 import org.opendaylight.yangtools.yang.binding.BaseNotification;
 import org.opendaylight.yangtools.yang.binding.DataObject;
index f26fb25bd0011fded232834f4c5dd8d1e945e076..cf932f27e52207bbe66a9731af9823b597fb74ba 100644 (file)
@@ -21,8 +21,8 @@ import net.bytebuddy.dynamic.DynamicType.Builder;
 import net.bytebuddy.jar.asm.Opcodes;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingOpaqueObjectCodecTreeNode;
-import org.opendaylight.mdsal.binding.dom.codec.loader.CodecClassLoader;
-import org.opendaylight.mdsal.binding.dom.codec.loader.CodecClassLoader.GeneratorResult;
+import org.opendaylight.mdsal.binding.dom.codec.impl.loader.CodecClassLoader;
+import org.opendaylight.mdsal.binding.dom.codec.impl.loader.CodecClassLoader.GeneratorResult;
 import org.opendaylight.yangtools.concepts.AbstractIllegalArgumentCodec;
 import org.opendaylight.yangtools.concepts.IllegalArgumentCodec;
 import org.opendaylight.yangtools.yang.binding.OpaqueData;
@@ -7,8 +7,6 @@
  */
 package org.opendaylight.mdsal.binding.dom.codec.impl;
 
-import com.google.common.annotations.Beta;
-import javax.inject.Singleton;
 import org.kohsuke.MetaInfServices;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory;
@@ -19,12 +17,10 @@ import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Beta
 @MetaInfServices
-@Singleton
 @Component(immediate = true)
-public final class DefaultBindingCodecTreeFactory implements BindingCodecTreeFactory {
-    private static final Logger LOG = LoggerFactory.getLogger(DefaultBindingCodecTreeFactory.class);
+public final class SimpleBindingCodecTreeFactory implements BindingCodecTreeFactory {
+    private static final Logger LOG = LoggerFactory.getLogger(SimpleBindingCodecTreeFactory.class);
 
     @Override
     public BindingCodecTree create(final BindingRuntimeContext context) {
@@ -37,7 +33,6 @@ public final class DefaultBindingCodecTreeFactory implements BindingCodecTreeFac
         LOG.info("Binding-DOM Codec enabled");
     }
 
-
     @Deactivate
     @SuppressWarnings("static-method")
     void deactivate() {
@@ -7,8 +7,6 @@
  */
 package org.opendaylight.mdsal.binding.dom.codec.impl;
 
-import com.google.common.annotations.Beta;
-import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.kohsuke.MetaInfServices;
 import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecFactory;
@@ -20,13 +18,11 @@ import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Beta
 @NonNullByDefault
 @MetaInfServices
-@Singleton
 @Component(immediate = true)
-public final class DefaultBindingDOMCodecFactory implements BindingDOMCodecFactory {
-    private static final Logger LOG = LoggerFactory.getLogger(DefaultBindingDOMCodecFactory.class);
+public final class SimpleBindingDOMCodecFactory implements BindingDOMCodecFactory {
+    private static final Logger LOG = LoggerFactory.getLogger(SimpleBindingDOMCodecFactory.class);
 
     @Override
     public BindingDOMCodecServices createBindingDOMCodec(final BindingRuntimeContext context) {
diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/di/DefaultBindingCodecTreeFactory.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/di/DefaultBindingCodecTreeFactory.java
new file mode 100644 (file)
index 0000000..66491c1
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2022 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.codec.impl.di;
+
+import com.google.common.annotations.Beta;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory;
+import org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext;
+import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeContext;
+
+/**
+ * Default implementation of {@link BindingCodecTreeFactory}.
+ */
+@Beta
+@Singleton
+public final class DefaultBindingCodecTreeFactory implements BindingCodecTreeFactory {
+    @Inject
+    public DefaultBindingCodecTreeFactory() {
+        // Exposed for DI
+    }
+
+    @Override
+    public BindingCodecTree create(final BindingRuntimeContext context) {
+        return new BindingCodecContext(context);
+    }
+}
diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/di/DefaultBindingDOMCodecFactory.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/di/DefaultBindingDOMCodecFactory.java
new file mode 100644 (file)
index 0000000..23c8285
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2022 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.codec.impl.di;
+
+import com.google.common.annotations.Beta;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext;
+import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecFactory;
+import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices;
+import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeContext;
+
+/**
+ * Default implementation of {@link BindingDOMCodecFactory}.
+ */
+@Beta
+@Singleton
+public final class DefaultBindingDOMCodecFactory implements BindingDOMCodecFactory {
+    @Inject
+    public DefaultBindingDOMCodecFactory() {
+        // Exposed for DI
+    }
+
+    @Override
+    public BindingDOMCodecServices createBindingDOMCodec(final BindingRuntimeContext context) {
+        return new BindingCodecContext(context);
+    }
+}
diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/di/DefaultBindingDOMCodecServices.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/di/DefaultBindingDOMCodecServices.java
new file mode 100644 (file)
index 0000000..0db05b9
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2022 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.codec.impl.di;
+
+import com.google.common.annotations.Beta;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext;
+import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices;
+import org.opendaylight.mdsal.binding.dom.codec.spi.ForwardingBindingDOMCodecServices;
+import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeContext;
+
+/**
+ * Default implementation of {@link BindingDOMCodecServices}.
+ */
+@Beta
+@Singleton
+public final class DefaultBindingDOMCodecServices extends ForwardingBindingDOMCodecServices {
+    private final @NonNull BindingDOMCodecServices delegate;
+
+    @Inject
+    public DefaultBindingDOMCodecServices(final BindingRuntimeContext context) {
+        delegate = new BindingCodecContext(context);
+    }
+
+    @Override
+    protected BindingDOMCodecServices delegate() {
+        return delegate;
+    }
+}
diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/di/package-info.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/di/package-info.java
new file mode 100644 (file)
index 0000000..5fdce96
--- /dev/null
@@ -0,0 +1,12 @@
+/*
+ * Copyright (c) 2022 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 exposing components to various dependency injection frameworks, so they can locate them. This package is not
+ * exposed to OSGi runtime.
+ */
+package org.opendaylight.mdsal.binding.dom.codec.impl.di;
\ No newline at end of file
@@ -5,7 +5,7 @@
  * 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.loader;
+package org.opendaylight.mdsal.binding.dom.codec.impl.loader;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Verify.verify;
@@ -5,7 +5,7 @@
  * 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.loader;
+package org.opendaylight.mdsal.binding.dom.codec.impl.loader;
 
 import static com.google.common.base.Verify.verify;
 import static java.util.Objects.requireNonNull;
@@ -5,7 +5,7 @@
  * 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.loader;
+package org.opendaylight.mdsal.binding.dom.codec.impl.loader;
 
 import static com.google.common.base.Verify.verify;
 import static com.google.common.base.Verify.verifyNotNull;
@@ -7,12 +7,11 @@
  */
 /**
  * {@link java.lang.ClassLoader} support for Binding/DOM codec translation code generators. This package provides one
- * core class, {@link org.opendaylight.mdsal.binding.dom.codec.loader.CodecClassLoader}, which allows lookup of
- * compile-time-generated Binding classes for the purpose of referencing them within code generators and which
- * serves as the ClassLoader holding runtime-generated codecs.
+ * core class, {@link CodecClassLoader}, which allows lookup of compile-time-generated Binding classes for the purpose
+ * of referencing them within code generators and which serves as the ClassLoader holding runtime-generated codecs.
  *
  * <p>
  * While the interfaces and classes in this package may be publicly accessible, they are an implementation detail and
  * may change incompatibly at any time.
  */
-package org.opendaylight.mdsal.binding.dom.codec.loader;
\ No newline at end of file
+package org.opendaylight.mdsal.binding.dom.codec.impl.loader;
\ No newline at end of file
index 1f517042de78ea6a588489fb60701ab9a46e0196..8cf69a473ceefad3a56b918d8303e1dffe67383d 100644 (file)
@@ -22,11 +22,11 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 @RunWith(MockitoJUnitRunner.StrictStubs.class)
 public class NonCachingCodecTest {
     @Mock
-    private BindingNormalizedNodeCodec<DataObject> codec;
+    public BindingNormalizedNodeCodec<DataObject> codec;
     @Mock
-    private NormalizedNode node;
+    public NormalizedNode node;
     @Mock
-    private DataObject object;
+    public DataObject object;
 
     @Before
     public void before() {
index a71dbd1313095f0186fe803b2303ab5f01b71288..27c89b82c3e272bf1d14ef3278a338e570625e63 100644 (file)
@@ -8,33 +8,30 @@
 package org.opendaylight.mdsal.binding.dom.codec.impl;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertTrue;
 
-import java.lang.reflect.Method;
-import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.yangtools.test.union.rev150121.LowestLevel1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.yangtools.test.union.rev150121.LowestLevel2;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.yangtools.test.union.rev150121.UnionTestType;
 
 public class UnionValueOptionContextTest {
     private static UnionValueOptionContext TEST_UVOC_1;
     private static UnionValueOptionContext TEST_UVOC_2;
 
-    @Before
-    public void setUp() throws Exception {
-        final Method methodFoo1 = TestDataObject1.class.getMethod("foo");
-        final Method methodFoo2 = TestDataObject2.class.getMethod("foo");
-        TEST_UVOC_1 = new UnionValueOptionContext(TestUnion.class, TestDataObject1.class, methodFoo1,
-            SchemaUnawareCodec.NOOP_CODEC);
-        TEST_UVOC_2 = new UnionValueOptionContext(TestUnion.class, TestDataObject2.class, methodFoo2,
-            SchemaUnawareCodec.NOOP_CODEC);
+    @BeforeClass
+    public static void beforeClass() throws Exception {
+        TEST_UVOC_1 = new UnionValueOptionContext(UnionTestType.class, LowestLevel1.class,
+            UnionTestType.class.getMethod("getLowestLevel1"), SchemaUnawareCodec.NOOP_CODEC);
+        TEST_UVOC_2 = new UnionValueOptionContext(UnionTestType.class, LowestLevel2.class,
+            UnionTestType.class.getMethod("getLowestLevel2"), SchemaUnawareCodec.NOOP_CODEC);
     }
 
     @Test
     public void hashCodeTest() throws Exception {
-        final Method methodFoo1 = TestDataObject1.class.getMethod("foo");
-        final UnionValueOptionContext test_uvoc = new UnionValueOptionContext(TestUnion.class, TestDataObject1.class,
-            methodFoo1, SchemaUnawareCodec.NOOP_CODEC);
+        final UnionValueOptionContext test_uvoc = new UnionValueOptionContext(UnionTestType.class, LowestLevel1.class,
+            UnionTestType.class.getMethod("getLowestLevel1"), SchemaUnawareCodec.NOOP_CODEC);
 
         assertEquals("HashCode", test_uvoc.hashCode(), TEST_UVOC_1.hashCode());
         assertNotEquals("HashCode", TEST_UVOC_1.hashCode(), TEST_UVOC_2.hashCode());
@@ -42,33 +39,10 @@ public class UnionValueOptionContextTest {
 
     @Test
     public void equalsTest() throws Exception {
-        final Method methodFoo1 = TestDataObject1.class.getMethod("foo");
-        final UnionValueOptionContext test_uvoc = new UnionValueOptionContext(TestUnion.class, TestDataObject1.class,
-            methodFoo1, SchemaUnawareCodec.NOOP_CODEC);
+        final UnionValueOptionContext test_uvoc = new UnionValueOptionContext(UnionTestType.class, LowestLevel1.class,
+            UnionTestType.class.getMethod("getLowestLevel1"), SchemaUnawareCodec.NOOP_CODEC);
 
-        assertTrue("Equals", TEST_UVOC_1.equals(test_uvoc));
-        assertFalse("Not equals", TEST_UVOC_1.equals(TEST_UVOC_2));
-    }
-
-    protected static final class TestDataObject1 {
-        public void foo() {
-
-        }
-    }
-
-    protected static final class TestDataObject2 {
-        public void foo() {
-
-        }
-    }
-
-    public static final class TestUnion {
-        public TestUnion(final TestDataObject1 arg) {
-
-        }
-
-        public TestUnion(final TestDataObject2 arg) {
-
-        }
+        assertEquals(TEST_UVOC_1, test_uvoc);
+        assertNotEquals(TEST_UVOC_1, TEST_UVOC_2);
     }
 }
index 26c932b3198500d11bdd2bb408c85edd4a379bd6..3a0fff17c6aeed44aeb3fc45f1a0f25a9a272993 100644 (file)
@@ -7,23 +7,24 @@
  */
 package org.opendaylight.mdsal.yanglib.rfc8525;
 
+import java.util.ServiceLoader;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory;
-import org.opendaylight.mdsal.binding.dom.codec.impl.DefaultBindingCodecTreeFactory;
-import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator;
 import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeContext;
 import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeGenerator;
 import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers;
 import org.opendaylight.yangtools.yang.parser.api.YangParserException;
 import org.opendaylight.yangtools.yang.parser.api.YangParserFactory;
-import org.opendaylight.yangtools.yang.parser.impl.DefaultYangParserFactory;
 
 abstract class AbstractYangLibraryTest {
-    private static final BindingRuntimeGenerator BINDING_RUNTIME_GENERATOR = new DefaultBindingRuntimeGenerator();
-    private static final YangParserFactory YANG_PARSER_FACTORY = new DefaultYangParserFactory();
-    private static final BindingCodecTreeFactory CODEC_FACTORY = new DefaultBindingCodecTreeFactory();
+    private static final BindingRuntimeGenerator BINDING_RUNTIME_GENERATOR =
+        ServiceLoader.load(BindingRuntimeGenerator.class).findFirst().orElseThrow();
+    private static final YangParserFactory YANG_PARSER_FACTORY = ServiceLoader.load(YangParserFactory.class).findFirst()
+        .orElseThrow();
+    private static final BindingCodecTreeFactory CODEC_FACTORY = ServiceLoader.load(BindingCodecTreeFactory.class)
+        .findFirst().orElseThrow();
 
     static BindingRuntimeContext runtimeContext;
     static BindingCodecTree codecTree;