Convert mdsal-binding-dom-adapter to a JPMS module 86/105886/14
authorSamuel Schneider <samuel.schneider@pantheon.tech>
Wed, 10 May 2023 15:25:26 +0000 (17:25 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 15 Jun 2023 12:24:18 +0000 (14:24 +0200)
Convert to a JPMS module to hide internals from the outside world.

JIRA: MDSAL-750
Change-Id: Ibdc5ff8cd6ad4512865d3ffc58ebcc5ecd428aac
Signed-off-by: Samuel Schneider <samuel.schneider@pantheon.tech>
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-adapter/pom.xml
binding/mdsal-binding-dom-adapter/src/main/java/module-info.java [new file with mode: 0644]
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/ActionLookupTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingNormalizedCodecTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/CurrentAdapterSerializerTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/invoke/NotificationListenerInvokerTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/MockSchemaService.java

index cf1bce35e8b68de918d2bac76180a8b78eb4caf5..cac4a185b516a8bbebc7ba2253bf5e87b0ceb223 100644 (file)
             <groupId>org.opendaylight.mdsal</groupId>
             <artifactId>mdsal-binding-test-model</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-subclass</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
         <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <extensions>true</extensions>
-                <configuration>
-                    <Automatic-Module-Name>org.opendaylight.mdsal.binding.dom.adapter</Automatic-Module-Name>
-                </configuration>
-            </plugin>
             <plugin>
                 <artifactId>maven-jar-plugin</artifactId>
                 <executions>
diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/module-info.java b/binding/mdsal-binding-dom-adapter/src/main/java/module-info.java
new file mode 100644 (file)
index 0000000..e12bfd7
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2023 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.adapter.AdapterContext;
+import org.opendaylight.mdsal.binding.dom.adapter.BindingAdapterFactory;
+import org.opendaylight.mdsal.binding.dom.adapter.ConstantAdapterContext;
+import org.opendaylight.mdsal.binding.dom.adapter.query.DefaultQueryFactory;
+import org.opendaylight.mdsal.binding.dom.adapter.spi.AdapterFactory;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory;
+import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecFactory;
+import org.opendaylight.mdsal.binding.api.query.QueryFactory;
+
+module org.opendaylight.mdsal.binding.dom.adapter {
+    exports org.opendaylight.mdsal.binding.dom.adapter;
+    exports org.opendaylight.mdsal.binding.dom.adapter.spi;
+
+    provides AdapterFactory with BindingAdapterFactory;
+    provides AdapterContext with ConstantAdapterContext;
+    provides QueryFactory with DefaultQueryFactory;
+
+    uses BindingCodecTreeFactory;
+    uses BindingDOMCodecFactory;
+
+    requires transitive com.google.common;
+    requires transitive org.opendaylight.mdsal.binding.api;
+    requires transitive org.opendaylight.mdsal.binding.dom.codec.spi;
+    requires transitive org.opendaylight.mdsal.dom.api;
+    requires transitive org.opendaylight.yangtools.yang.data.impl;
+    requires org.opendaylight.mdsal.binding.dom.codec.api;
+    requires org.opendaylight.mdsal.binding.spec.util;
+    requires org.opendaylight.mdsal.dom.spi;
+    requires org.slf4j;
+
+    // OSGi is optional
+    requires static org.osgi.framework;
+    requires static org.osgi.service.component;
+    requires static org.osgi.util.tracker;
+
+    // Annotations
+    requires static javax.inject;
+    requires static org.kohsuke.metainf_services;
+    requires static org.eclipse.jdt.annotation;
+    requires static org.gaul.modernizer_maven_annotations;
+    requires static org.osgi.service.component.annotations;
+}
index 97840294c6eb599ebf1c901a4675f51d572cb178..2b08b4046d89a3371f37ce5acbd2db01cb1d625f 100644 (file)
@@ -9,9 +9,10 @@ package org.opendaylight.mdsal.binding.dom.adapter;
 
 import static org.junit.Assert.assertEquals;
 
+import java.util.ServiceLoader;
 import org.junit.Test;
 import org.opendaylight.mdsal.binding.api.ActionSpec;
-import org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext;
+import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecFactory;
 import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers;
 import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.Cont;
 import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.Grpcont;
@@ -28,8 +29,8 @@ import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absol
 public class ActionLookupTest {
     @Test
     public void testActionPath() {
-        CurrentAdapterSerializer codec = new CurrentAdapterSerializer(new BindingCodecContext(
-            BindingRuntimeHelpers.createRuntimeContext()));
+        CurrentAdapterSerializer codec = new CurrentAdapterSerializer(ServiceLoader.load(BindingDOMCodecFactory.class)
+                .findFirst().orElseThrow().createBindingDOMCodec(BindingRuntimeHelpers.createRuntimeContext()));
 
         assertEquals(Absolute.of(Cont.QNAME, Foo.QNAME), codec.getActionPath(
             ActionSpec.builder(Cont.class).build(Foo.class)));
index cf739f471fba2b0acb9955729bc875311341f5f3..82808c2a83e9ebe5a0a1d2562ba0602b85c7f988 100644 (file)
@@ -15,10 +15,11 @@ import com.google.common.collect.ImmutableSetMultimap;
 import com.google.common.collect.SetMultimap;
 import java.lang.reflect.Method;
 import java.util.Map;
+import java.util.ServiceLoader;
 import java.util.Set;
 import org.junit.Test;
 import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractSchemaAwareTest;
-import org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext;
+import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecFactory;
 import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeContext;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.bi.ba.rpcservice.rev140701.OpendaylightTestRpcServiceService;
 import org.opendaylight.yangtools.yang.common.QNameModule;
@@ -34,7 +35,8 @@ public class BindingNormalizedCodecTest extends AbstractSchemaAwareTest {
 
     @Override
     protected void setupWithRuntimeContext(final BindingRuntimeContext runtimeContext) {
-        serializer = new CurrentAdapterSerializer(new BindingCodecContext(runtimeContext));
+        serializer = new CurrentAdapterSerializer(ServiceLoader.load(BindingDOMCodecFactory.class)
+                .findFirst().orElseThrow().createBindingDOMCodec(runtimeContext));
     }
 
     @Test
index 7b9eafcc14f56c14cd90e7a61a4572de7d99dca0..a2e8e9b8a8f9b9347b28494e048411355a5dfd96 100644 (file)
@@ -18,8 +18,9 @@ import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.Map.Entry;
+import java.util.ServiceLoader;
 import org.junit.Test;
-import org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext;
+import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecFactory;
 import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator;
 import org.opendaylight.mdsal.binding.runtime.api.DefaultBindingRuntimeContext;
 import org.opendaylight.mdsal.binding.runtime.api.ModuleInfoSnapshot;
@@ -107,9 +108,10 @@ public class CurrentAdapterSerializerTest {
 
     private static Entry<InstanceIdentifier<?>, DataObject> fromNormalizedNode(final NormalizedNode data,
             final EffectiveModelContext schemaCtx) {
-        final CurrentAdapterSerializer codec = new CurrentAdapterSerializer(new BindingCodecContext(
-            new DefaultBindingRuntimeContext(new DefaultBindingRuntimeGenerator().generateTypeMapping(schemaCtx),
-                    TestingModuleInfoSnapshot.INSTANCE)));
+        final CurrentAdapterSerializer codec = new CurrentAdapterSerializer(
+                ServiceLoader.load(BindingDOMCodecFactory.class).findFirst().orElseThrow().createBindingDOMCodec(
+                        new DefaultBindingRuntimeContext(new DefaultBindingRuntimeGenerator()
+                                .generateTypeMapping(schemaCtx), TestingModuleInfoSnapshot.INSTANCE)));
 
         final YangInstanceIdentifier path = YangInstanceIdentifier.of(NodeIdentifier.create(QName.create(
             "urn:test", "2017-01-01", "cont")));
index bd3a0e2fb6d4726620c038af73327e5b3d56384e..4d11ed0388ad8948f011052b01778f6e61c2e5fc 100644 (file)
@@ -19,6 +19,7 @@ import com.google.common.util.concurrent.UncheckedExecutionException;
 import java.lang.invoke.MethodHandle;
 import java.lang.invoke.WrongMethodTypeException;
 import org.junit.Test;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.bi.ba.notification.rev150205.OpendaylightTestNotificationListener;
 import org.opendaylight.yangtools.yang.binding.Augmentation;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.Notification;
@@ -28,7 +29,7 @@ import org.opendaylight.yangtools.yang.common.QName;
 public class NotificationListenerInvokerTest {
     @Test
     public void fromTest() throws Exception {
-        assertNotNull(NotificationListenerInvoker.from(TestInterface.class));
+        assertNotNull(NotificationListenerInvoker.from(OpendaylightTestNotificationListener.class));
     }
 
     @Test
@@ -53,12 +54,6 @@ public class NotificationListenerInvokerTest {
         assertEquals("expected null but found (NotificationListener,DataContainer)void", ex.getMessage());
     }
 
-    public interface TestInterface extends NotificationListener, Augmentation {
-        QName QNAME = QName.create("test", "test");
-
-        void onTestNotificationInterface(TestNotificationInterface notif);
-    }
-
     private interface TestPrivateInterface extends NotificationListener, Augmentation {
         QName QNAME = QName.create("test", "test");
 
index eda1dc56fee1d7a19e696cde1cff3d13984a3b66..33a054a8cc93cc815329c8b6ced15cce9e5abe29 100644 (file)
@@ -14,9 +14,10 @@ import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
 import com.google.common.collect.ClassToInstanceMap;
 import com.google.common.collect.ImmutableClassToInstanceMap;
+import java.util.ServiceLoader;
 import org.opendaylight.mdsal.binding.dom.adapter.AdapterContext;
 import org.opendaylight.mdsal.binding.dom.adapter.CurrentAdapterSerializer;
-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;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
@@ -35,7 +36,8 @@ public final class MockSchemaService implements DOMSchemaService, EffectiveModel
             new CacheLoader<BindingRuntimeContext, BindingDOMCodecServices>() {
                 @Override
                 public BindingDOMCodecServices load(final BindingRuntimeContext key) {
-                    return new BindingCodecContext(key);
+                    return ServiceLoader.load(BindingDOMCodecFactory.class)
+                            .findFirst().orElseThrow().createBindingDOMCodec(key);
                 }
             });