Binding v2 runtime - adapters - impl - mount point 85/59185/2
authorJakub Toth <jakub.toth@pantheon.tech>
Thu, 15 Jun 2017 13:02:40 +0000 (15:02 +0200)
committerMartin Ciglan <martin.ciglan@pantheon.tech>
Mon, 19 Jun 2017 19:47:05 +0000 (19:47 +0000)
Change-Id: Ie714a6d22f5fcf033b8ba157bd3fae9772846807
Signed-off-by: Jakub Toth <jakub.toth@pantheon.tech>
(cherry picked from commit 71547ce0d7acf0313228eee087acaf73d913e044)

binding2/mdsal-binding2-api/src/main/java/org/opendaylight/mdsal/binding/javav2/api/MountPoint.java
binding2/mdsal-binding2-api/src/main/java/org/opendaylight/mdsal/binding/javav2/api/MountPointService.java
binding2/mdsal-binding2-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/adapter/impl/mountpoint/BindingDOMMountPointListenerAdapter.java [new file with mode: 0644]
binding2/mdsal-binding2-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/adapter/impl/mountpoint/BindingDOMMountPointServiceAdapter.java [new file with mode: 0644]
binding2/mdsal-binding2-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/adapter/impl/mountpoint/BindingMountPointAdapter.java [new file with mode: 0644]

index b79986b8c0d0887b3e18ae938c1aeda2044321e6..922bb57d5d46f6a1562d975959d7be76d313ed70 100644 (file)
@@ -9,7 +9,7 @@
 package org.opendaylight.mdsal.binding.javav2.api;
 
 import com.google.common.annotations.Beta;
-import java.util.Optional;
+import com.google.common.base.Optional;
 import org.opendaylight.mdsal.binding.javav2.spec.base.InstanceIdentifier;
 import org.opendaylight.yangtools.concepts.Identifiable;
 
index 9056a51d2eb40b973b77cfb68989cf09d7995a63..d2b06a2e67ab4ef59feed7a45715c051c24120d3 100644 (file)
@@ -9,7 +9,7 @@
 package org.opendaylight.mdsal.binding.javav2.api;
 
 import com.google.common.annotations.Beta;
-import java.util.Optional;
+import com.google.common.base.Optional;
 import org.opendaylight.mdsal.binding.javav2.spec.base.InstanceIdentifier;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 
diff --git a/binding2/mdsal-binding2-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/adapter/impl/mountpoint/BindingDOMMountPointListenerAdapter.java b/binding2/mdsal-binding2-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/adapter/impl/mountpoint/BindingDOMMountPointListenerAdapter.java
new file mode 100644 (file)
index 0000000..c123ee0
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2017 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.javav2.dom.adapter.impl.mountpoint;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.Optional;
+import javax.annotation.Nonnull;
+import org.opendaylight.mdsal.binding.javav2.api.MountPointListener;
+import org.opendaylight.mdsal.binding.javav2.dom.codec.impl.BindingToNormalizedNodeCodec;
+import org.opendaylight.mdsal.binding.javav2.spec.base.InstanceIdentifier;
+import org.opendaylight.mdsal.binding.javav2.spec.base.TreeNode;
+import org.opendaylight.mdsal.dom.api.DOMMountPointListener;
+import org.opendaylight.mdsal.dom.api.DOMMountPointService;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.impl.codec.DeserializationException;
+
+/**
+ * Mount point listener adapter.
+ *
+ * @param <T>
+ *            - {@link MountPointListener} type
+ */
+@Beta
+public final class BindingDOMMountPointListenerAdapter<T extends MountPointListener>
+        implements ListenerRegistration<T>, DOMMountPointListener {
+
+    private final T listener;
+    private final ListenerRegistration<DOMMountPointListener> registration;
+    private final BindingToNormalizedNodeCodec codec;
+
+    public BindingDOMMountPointListenerAdapter(final T listener, final BindingToNormalizedNodeCodec codec,
+            final DOMMountPointService mountService) {
+        this.listener = listener;
+        this.codec = codec;
+        this.registration = mountService.registerProvisionListener(this);
+    }
+
+    @Nonnull
+    @Override
+    public T getInstance() {
+        return listener;
+    }
+
+    @Override
+    public void close() {
+        registration.close();
+    }
+
+    @Override
+    public void onMountPointCreated(final YangInstanceIdentifier path) {
+        try {
+            final InstanceIdentifier<? extends TreeNode> bindingPath = toBinding(path);
+            listener.onMountPointCreated(bindingPath);
+        } catch (final DeserializationException e) {
+            BindingDOMMountPointServiceAdapter.LOG.error("Unable to translate mountPoint path {}." + " Omitting event.",
+                    path, e);
+        }
+    }
+
+    private InstanceIdentifier<? extends TreeNode> toBinding(final YangInstanceIdentifier path)
+            throws DeserializationException {
+        final Optional<InstanceIdentifier<? extends TreeNode>> instanceIdentifierOptional = codec.toBinding(path);
+        if (instanceIdentifierOptional.isPresent()) {
+            return instanceIdentifierOptional.get();
+        } else {
+            throw new DeserializationException("Deserialization unsuccessful, " + instanceIdentifierOptional);
+        }
+    }
+
+    @Override
+    public void onMountPointRemoved(final YangInstanceIdentifier path) {
+        try {
+            final InstanceIdentifier<? extends TreeNode> bindingPath = toBinding(path);
+            listener.onMountPointRemoved(bindingPath);
+        } catch (final DeserializationException e) {
+            BindingDOMMountPointServiceAdapter.LOG.error("Unable to translate mountPoint path {}." + " Omitting event.",
+                    path, e);
+        }
+    }
+}
diff --git a/binding2/mdsal-binding2-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/adapter/impl/mountpoint/BindingDOMMountPointServiceAdapter.java b/binding2/mdsal-binding2-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/adapter/impl/mountpoint/BindingDOMMountPointServiceAdapter.java
new file mode 100644 (file)
index 0000000..d0f98a8
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2017 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.javav2.dom.adapter.impl.mountpoint;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.Optional;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import javax.annotation.Nonnull;
+import org.opendaylight.mdsal.binding.javav2.api.MountPoint;
+import org.opendaylight.mdsal.binding.javav2.api.MountPointListener;
+import org.opendaylight.mdsal.binding.javav2.api.MountPointService;
+import org.opendaylight.mdsal.binding.javav2.dom.codec.impl.BindingToNormalizedNodeCodec;
+import org.opendaylight.mdsal.binding.javav2.spec.base.InstanceIdentifier;
+import org.opendaylight.mdsal.dom.api.DOMMountPoint;
+import org.opendaylight.mdsal.dom.api.DOMMountPointService;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Mount point service adapter.
+ */
+@Beta
+public class BindingDOMMountPointServiceAdapter implements MountPointService {
+
+    public static final Logger LOG = LoggerFactory.getLogger(BindingDOMMountPointServiceAdapter.class);
+
+    private final BindingToNormalizedNodeCodec codec;
+    private final DOMMountPointService mountService;
+    private final LoadingCache<DOMMountPoint, BindingMountPointAdapter> bindingMountpoints =
+            CacheBuilder.newBuilder().weakKeys().build(new CacheLoader<DOMMountPoint, BindingMountPointAdapter>() {
+
+                @Nonnull
+                @Override
+                public BindingMountPointAdapter load(@Nonnull final DOMMountPoint key) throws Exception {
+                    return new BindingMountPointAdapter(codec, key);
+                }
+            });
+
+    public BindingDOMMountPointServiceAdapter(final DOMMountPointService mountService,
+            final BindingToNormalizedNodeCodec codec) {
+        this.codec = codec;
+        this.mountService = mountService;
+    }
+
+    @Override
+    public Optional<MountPoint> getMountPoint(final InstanceIdentifier<?> mountPoint) {
+
+        final YangInstanceIdentifier domPath = codec.toYangInstanceIdentifierBlocking(mountPoint);
+        final Optional<DOMMountPoint> domMount = mountService.getMountPoint(domPath);
+        if (domMount.isPresent()) {
+            return Optional.fromNullable(bindingMountpoints.getUnchecked(domMount.get()));
+        }
+        return Optional.absent();
+    }
+
+    @Override
+    public <T extends MountPointListener> ListenerRegistration<T> registerListener(final InstanceIdentifier<?> path,
+            final T listener) {
+        return new BindingDOMMountPointListenerAdapter<>(listener, codec, mountService);
+    }
+
+}
diff --git a/binding2/mdsal-binding2-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/adapter/impl/mountpoint/BindingMountPointAdapter.java b/binding2/mdsal-binding2-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/adapter/impl/mountpoint/BindingMountPointAdapter.java
new file mode 100644 (file)
index 0000000..e6f8ff3
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2017 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.javav2.dom.adapter.impl.mountpoint;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.Optional;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.LoadingCache;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import org.opendaylight.mdsal.binding.javav2.api.BindingService;
+import org.opendaylight.mdsal.binding.javav2.api.MountPoint;
+import org.opendaylight.mdsal.binding.javav2.dom.adapter.spi.loader.BindingDOMAdapterLoader;
+import org.opendaylight.mdsal.binding.javav2.dom.codec.impl.BindingToNormalizedNodeCodec;
+import org.opendaylight.mdsal.binding.javav2.spec.base.InstanceIdentifier;
+import org.opendaylight.mdsal.dom.api.DOMMountPoint;
+import org.opendaylight.mdsal.dom.api.DOMService;
+
+/**
+ * Binding mount point adapter.
+ */
+@Beta
+public class BindingMountPointAdapter implements MountPoint {
+
+    private final InstanceIdentifier<?> identifier;
+    private LoadingCache<Class<? extends BindingService>, Optional<BindingService>> services;
+
+    public BindingMountPointAdapter(final BindingToNormalizedNodeCodec codec, final DOMMountPoint domMountPoint) {
+        identifier = codec.getCodecRegistry().fromYangInstanceIdentifier(domMountPoint.getIdentifier());
+        services = CacheBuilder.newBuilder().build(new BindingDOMAdapterLoader(codec) {
+
+            @Nullable
+            @Override
+            protected DOMService getDelegate(final Class<? extends DOMService> reqDeleg) {
+                return domMountPoint.getService(reqDeleg).orNull();
+            }
+        });
+    }
+
+    @Nonnull
+    @Override
+    public InstanceIdentifier<?> getIdentifier() {
+        return identifier;
+    }
+
+    @Override
+    public <T extends BindingService> Optional<T> getService(final Class<T> service) {
+        final Optional<BindingService> potential = services.getUnchecked(service);
+        if (potential.isPresent()) {
+            return Optional.of(service.cast(potential.get()));
+        }
+        return Optional.absent();
+    }
+}
\ No newline at end of file