Add DOM/Binding AdapterFactory 07/73407/2
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 25 Jun 2018 14:16:08 +0000 (16:16 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 25 Jun 2018 14:17:49 +0000 (16:17 +0200)
This class forms a single point of entry for all supported adapters,
so that activators can easily use it.

Change-Id: I9950026ade0f56351f09139585d7b69f0cf98465
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AdapterFactory.java [new file with mode: 0644]
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/osgi/AdaptingTracker.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/osgi/DynamicBindingAdapter.java

diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AdapterFactory.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AdapterFactory.java
new file mode 100644 (file)
index 0000000..84e08f5
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2018 Pantheon Technologies, 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.adapter;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.annotations.Beta;
+import javax.annotation.concurrent.ThreadSafe;
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.opendaylight.mdsal.binding.api.BindingService;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataTreeService;
+import org.opendaylight.mdsal.binding.api.MountPointService;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.mdsal.binding.api.NotificationService;
+import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeService;
+import org.opendaylight.mdsal.dom.api.DOMMountPointService;
+import org.opendaylight.mdsal.dom.api.DOMNotificationPublishService;
+import org.opendaylight.mdsal.dom.api.DOMNotificationService;
+import org.opendaylight.mdsal.dom.api.DOMRpcProviderService;
+import org.opendaylight.mdsal.dom.api.DOMRpcService;
+import org.opendaylight.mdsal.dom.api.DOMService;
+
+/**
+ * Factory to turn various {@link DOMService}s into {@link BindingService}s.
+ *
+ * @author Robert Varga
+ */
+@Beta
+@NonNullByDefault
+@ThreadSafe
+public final class AdapterFactory {
+    private final BindingToNormalizedNodeCodec codec;
+
+    public AdapterFactory(final BindingToNormalizedNodeCodec codec) {
+        this.codec = requireNonNull(codec);
+    }
+
+    /**
+     * Create a {@link DataBroker} backed by a {@link DOMDataBroker}.
+     *
+     * @param domService Backing DOMDataBroker
+     * @return A DataBroker
+     * @throws NullPointerException if {@code domService} is null
+     */
+    public DataBroker createDataBroker(final DOMDataBroker domService) {
+        return new BindingDOMDataBrokerAdapter(domService, codec);
+    }
+
+    /**
+     * Create a {@link DataTreeService} backed by a {@link DOMDataTreeService}.
+     *
+     * @param domService Backing DOMDataTreeService
+     * @return A DataTreeService
+     * @throws NullPointerException if {@code domService} is null
+     */
+    public DataTreeService createDataTreeService(final DOMDataTreeService domService) {
+        return BindingDOMDataTreeServiceAdapter.create(domService, codec);
+    }
+
+    /**
+     * Create a {@link MountPointService} backed by a {@link DOMMountPointService}.
+     *
+     * @param domService Backing DOMMountPointService
+     * @return A MountPointService
+     * @throws NullPointerException if {@code domService} is null
+     */
+    public MountPointService createMountPointService(final DOMMountPointService domService) {
+        return new BindingDOMMountPointServiceAdapter(domService, codec);
+    }
+
+    /**
+     * Create a {@link DataBroker} backed by a {@link DOMDataBroker}.
+     *
+     * @param domService Backing DOMDataBroker
+     * @return A DataBroker
+     * @throws NullPointerException if {@code domService} is null
+     */
+    public NotificationService createNotificationService(final DOMNotificationService domService) {
+        return new BindingDOMNotificationServiceAdapter(domService, codec);
+    }
+
+    /**
+     * Create a {@link NotificationPublishService} backed by a {@link DOMNotificationPublishService}.
+     *
+     * @param domService Backing DOMNotificationPublishService
+     * @return A NotificationPublishService
+     * @throws NullPointerException if {@code domService} is null
+     */
+    public NotificationPublishService createNotificationPublishService(final DOMNotificationPublishService domService) {
+        return new BindingDOMNotificationPublishServiceAdapter(domService, codec);
+    }
+
+    /**
+     * Create a {@link RpcConsumerRegistry} backed by a {@link DOMRpcService}.
+     *
+     * @param domService Backing DOMRpcService
+     * @return A RpcConsumerRegistry
+     * @throws NullPointerException if {@code domService} is null
+     */
+    public RpcConsumerRegistry createRpcConsumerRegistry(final DOMRpcService domService) {
+        return new BindingDOMRpcServiceAdapter(domService, codec);
+    }
+
+    /**
+     * Create a {@link RpcProviderService} backed by a {@link DOMRpcProviderService}.
+     *
+     * @param domService Backing DOMRpcProviderService
+     * @return A RpcProviderService
+     * @throws NullPointerException if {@code domService} is null
+     */
+    public RpcProviderService createRpcProviderService(final DOMRpcProviderService domService) {
+        return new BindingDOMRpcProviderServiceAdapter(domService, codec);
+    }
+}
index a6be2aa32f9fbabad4ba005d35467390067d10cb..4971b0eb6558c04d18082a08666a64a3322b0e33 100644 (file)
@@ -9,9 +9,8 @@ package org.opendaylight.mdsal.binding.dom.adapter.osgi;
 
 import static java.util.Objects.requireNonNull;
 
-import java.util.function.BiFunction;
+import java.util.function.Function;
 import org.opendaylight.mdsal.binding.api.BindingService;
-import org.opendaylight.mdsal.binding.dom.adapter.BindingToNormalizedNodeCodec;
 import org.opendaylight.mdsal.dom.api.DOMService;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
@@ -31,15 +30,13 @@ final class AdaptingTracker<D extends DOMService, B extends BindingService>
         extends ServiceTracker<D, ServiceRegistration<B>> {
     private static final Logger LOG = LoggerFactory.getLogger(AdaptingTracker.class);
 
-    private final BiFunction<D, BindingToNormalizedNodeCodec, B> bindingFactory;
-    private final BindingToNormalizedNodeCodec codec;
+    private final Function<D, B> bindingFactory;
     private final Class<B> bindingClass;
 
     AdaptingTracker(final BundleContext ctx, final Class<D> domClass, final Class<B> bindingClass,
-        final BindingToNormalizedNodeCodec codec, final BiFunction<D, BindingToNormalizedNodeCodec, B> bindingFactory) {
+        final Function<D, B> bindingFactory) {
         super(ctx, domClass, null);
         this.bindingClass = requireNonNull(bindingClass);
-        this.codec = requireNonNull(codec);
         this.bindingFactory = requireNonNull(bindingFactory);
     }
 
@@ -61,7 +58,7 @@ final class AdaptingTracker<D extends DOMService, B extends BindingService>
             LOG.debug("Could not get {} service from {}, ignoring it", bindingClass.getName(), reference);
             return null;
         }
-        final B binding = bindingFactory.apply(dom, codec);
+        final B binding = bindingFactory.apply(dom);
         final Dict props = Dict.fromReference(reference);
         final ServiceRegistration<B> reg = context.registerService(bindingClass, binding, props);
         LOG.debug("Registered {} adapter {} of {} with {} as {}", bindingClass.getName(), binding, dom, props, reg);
index aaaa6b7bf00a0f5e002a08e9d9a4e3d1ccee2b69..316796631e8346e4ff6485031214119bd86110e5 100644 (file)
@@ -18,14 +18,7 @@ import org.opendaylight.mdsal.binding.api.NotificationPublishService;
 import org.opendaylight.mdsal.binding.api.NotificationService;
 import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
 import org.opendaylight.mdsal.binding.api.RpcProviderService;
-import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMDataBrokerAdapter;
-import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMDataTreeServiceAdapter;
-import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMMountPointServiceAdapter;
-import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMNotificationPublishServiceAdapter;
-import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMNotificationServiceAdapter;
-import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMRpcProviderServiceAdapter;
-import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMRpcServiceAdapter;
-import org.opendaylight.mdsal.binding.dom.adapter.BindingToNormalizedNodeCodec;
+import org.opendaylight.mdsal.binding.dom.adapter.AdapterFactory;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeService;
 import org.opendaylight.mdsal.dom.api.DOMMountPointService;
@@ -51,22 +44,20 @@ public final class DynamicBindingAdapter implements AutoCloseable {
     @GuardedBy("this")
     private List<AdaptingTracker<?, ?>> trackers;
 
-    public DynamicBindingAdapter(final BindingToNormalizedNodeCodec codec, final BundleContext ctx) {
+    public DynamicBindingAdapter(final AdapterFactory factory, final BundleContext ctx) {
         trackers = ImmutableList.of(
-            new AdaptingTracker<>(ctx, DOMDataBroker.class, DataBroker.class, codec,
-                    BindingDOMDataBrokerAdapter::new),
-            new AdaptingTracker<>(ctx, DOMDataTreeService.class, DataTreeService.class, codec,
-                    BindingDOMDataTreeServiceAdapter::create),
-            new AdaptingTracker<>(ctx, DOMMountPointService.class, MountPointService.class, codec,
-                    BindingDOMMountPointServiceAdapter::new),
-            new AdaptingTracker<>(ctx, DOMNotificationService.class, NotificationService.class, codec,
-                    BindingDOMNotificationServiceAdapter::new),
-            new AdaptingTracker<>(ctx, DOMNotificationPublishService.class, NotificationPublishService.class, codec,
-                    BindingDOMNotificationPublishServiceAdapter::new),
-            new AdaptingTracker<>(ctx, DOMRpcService.class, RpcConsumerRegistry.class, codec,
-                    BindingDOMRpcServiceAdapter::new),
-            new AdaptingTracker<>(ctx, DOMRpcProviderService.class, RpcProviderService.class, codec,
-                    BindingDOMRpcProviderServiceAdapter::new));
+            new AdaptingTracker<>(ctx, DOMDataBroker.class, DataBroker.class, factory::createDataBroker),
+            new AdaptingTracker<>(ctx, DOMDataTreeService.class, DataTreeService.class, factory::createDataTreeService),
+            new AdaptingTracker<>(ctx, DOMMountPointService.class, MountPointService.class,
+                    factory::createMountPointService),
+            new AdaptingTracker<>(ctx, DOMNotificationService.class, NotificationService.class,
+                    factory::createNotificationService),
+            new AdaptingTracker<>(ctx, DOMNotificationPublishService.class, NotificationPublishService.class,
+                    factory::createNotificationPublishService),
+            new AdaptingTracker<>(ctx, DOMRpcService.class, RpcConsumerRegistry.class,
+                    factory::createRpcConsumerRegistry),
+            new AdaptingTracker<>(ctx, DOMRpcProviderService.class, RpcProviderService.class,
+                    factory::createRpcProviderService));
 
         LOG.debug("Starting {} DOMService trackers", trackers.size());
         trackers.forEach(ServiceTracker::open);