--- /dev/null
+/*
+ * 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);
+ }
+}
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;
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);
}
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);
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;
@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);