Add AbstractBindingLoadingAdapter 27/73927/7
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 11 Jul 2018 11:47:56 +0000 (13:47 +0200)
committerRobert Varga <nite@hq.sk>
Wed, 11 Jul 2018 22:43:12 +0000 (22:43 +0000)
There are at least two adapters which are using a weak cache
to track child adapters. Introduce AbstractBindingLoadingAdapter
to host the common functionality.

Change-Id: I31d7ecf21d3174a3c30b22a0ed6b5a031c041314
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AbstractBindingLoadingAdapter.java [new file with mode: 0644]
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMMountPointServiceAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMRpcServiceAdapter.java

diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AbstractBindingLoadingAdapter.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AbstractBindingLoadingAdapter.java
new file mode 100644 (file)
index 0000000..97a2852
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * 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 com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import org.eclipse.jdt.annotation.NonNullByDefault;
+
+@NonNullByDefault
+abstract class AbstractBindingLoadingAdapter<D, K, V> extends AbstractBindingAdapter<D> {
+    private final LoadingCache<K, V> proxies = CacheBuilder.newBuilder().weakKeys().build(new CacheLoader<K, V>() {
+        @Override
+        public V load(final K key) {
+            return loadAdapter(key);
+        }
+    });
+
+    AbstractBindingLoadingAdapter(final BindingToNormalizedNodeCodec codec, final D delegate) {
+        super(codec, delegate);
+    }
+
+    final V getAdapter(final K key) {
+        return proxies.getUnchecked(key);
+    }
+
+    abstract V loadAdapter(K key);
+}
index 2a0d15ea1b4b3a3865f0144cae8e8d0e92f5ab3b..7a5bb2a3107b922c0b43dda74b2f415ae3624268 100644 (file)
@@ -8,9 +8,6 @@
 package org.opendaylight.mdsal.binding.dom.adapter;
 
 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 org.opendaylight.mdsal.binding.api.MountPoint;
 import org.opendaylight.mdsal.binding.api.MountPointService;
 import org.opendaylight.mdsal.dom.api.DOMMountPoint;
@@ -21,20 +18,12 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class BindingDOMMountPointServiceAdapter extends AbstractBindingAdapter<DOMMountPointService>
+public class BindingDOMMountPointServiceAdapter
+        extends AbstractBindingLoadingAdapter<DOMMountPointService, DOMMountPoint, BindingMountPointAdapter>
         implements MountPointService {
     // FIXME: this really should be hidden
     static final Logger LOG = LoggerFactory.getLogger(BindingDOMMountPointServiceAdapter.class);
 
-    private final LoadingCache<DOMMountPoint, BindingMountPointAdapter> bindingMountpoints = CacheBuilder.newBuilder()
-            .weakKeys().build(new CacheLoader<DOMMountPoint, BindingMountPointAdapter>() {
-
-                @Override
-                public BindingMountPointAdapter load(final DOMMountPoint key) {
-                    return new BindingMountPointAdapter(getCodec(), key);
-                }
-            });
-
     public BindingDOMMountPointServiceAdapter(final DOMMountPointService mountService,
             final BindingToNormalizedNodeCodec codec) {
         super(codec, mountService);
@@ -44,10 +33,7 @@ public class BindingDOMMountPointServiceAdapter extends AbstractBindingAdapter<D
     public Optional<MountPoint> getMountPoint(final InstanceIdentifier<?> mountPoint) {
         YangInstanceIdentifier domPath = getCodec().toYangInstanceIdentifierBlocking(mountPoint);
         Optional<DOMMountPoint> domMount = getDelegate().getMountPoint(domPath);
-        if (domMount.isPresent()) {
-            return Optional.fromNullable(bindingMountpoints.getUnchecked(domMount.get()));
-        }
-        return Optional.absent();
+        return domMount.transform(this::getAdapter);
     }
 
     @Override
@@ -55,4 +41,9 @@ public class BindingDOMMountPointServiceAdapter extends AbstractBindingAdapter<D
             final T listener) {
         return new BindingDOMMountPointListenerAdapter<>(listener, getCodec(), getDelegate());
     }
+
+    @Override
+    BindingMountPointAdapter loadAdapter(final DOMMountPoint key) {
+        return new BindingMountPointAdapter(getCodec(), key);
+    }
 }
index df4eb84b0b42cbf77f689d439e57828ee4511df6..33457c37767ecb54fa9c61d2ab0448ad2513970b 100644 (file)
@@ -7,10 +7,8 @@
  */
 package org.opendaylight.mdsal.binding.dom.adapter;
 
-import com.google.common.base.Preconditions;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
+import static com.google.common.base.Preconditions.checkArgument;
+
 import com.google.common.collect.ClassToInstanceMap;
 import com.google.common.collect.ImmutableSet;
 import java.util.Set;
@@ -21,21 +19,12 @@ import org.opendaylight.mdsal.dom.api.DOMService;
 import org.opendaylight.yangtools.yang.binding.RpcService;
 import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
 
-public class BindingDOMRpcServiceAdapter extends AbstractBindingAdapter<DOMRpcService> implements RpcConsumerRegistry {
+public class BindingDOMRpcServiceAdapter
+        extends AbstractBindingLoadingAdapter<DOMRpcService, Class<? extends RpcService>, RpcServiceAdapter>
+        implements RpcConsumerRegistry {
 
     protected static final Factory<RpcConsumerRegistry> BUILDER_FACTORY = Builder::new;
 
-    private final LoadingCache<Class<? extends RpcService>, RpcServiceAdapter> proxies = CacheBuilder.newBuilder()
-            .weakKeys()
-            .build(new CacheLoader<Class<? extends RpcService>, RpcServiceAdapter>() {
-                @Override
-                public RpcServiceAdapter load(final Class<? extends RpcService> key) throws Exception {
-                    Preconditions.checkArgument(BindingReflections.isBindingClass(key));
-                    Preconditions.checkArgument(key.isInterface(), "Supplied RPC service type must be interface.");
-                    return new RpcServiceAdapter(key, getCodec(), getDelegate());
-                }
-            });
-
     public BindingDOMRpcServiceAdapter(final DOMRpcService domService, final BindingToNormalizedNodeCodec codec) {
         super(codec, domService);
     }
@@ -43,15 +32,22 @@ public class BindingDOMRpcServiceAdapter extends AbstractBindingAdapter<DOMRpcSe
     @SuppressWarnings("unchecked")
     @Override
     public <T extends RpcService> T getRpcService(final Class<T> rpcService) {
-        Preconditions.checkArgument(rpcService != null, "Rpc Service needs to be specied.");
-        return (T) proxies.getUnchecked(rpcService).getProxy();
+        checkArgument(rpcService != null, "Rpc Service needs to be specied.");
+        return (T) getAdapter(rpcService).getProxy();
+    }
+
+    @Override
+    RpcServiceAdapter loadAdapter(final Class<? extends RpcService> key) {
+        checkArgument(BindingReflections.isBindingClass(key));
+        checkArgument(key.isInterface(), "Supplied RPC service type must be interface.");
+        return new RpcServiceAdapter(key, getCodec(), getDelegate());
     }
 
     private static final class Builder extends BindingDOMAdapterBuilder<RpcConsumerRegistry> {
         @Override
         protected RpcConsumerRegistry createInstance(final BindingToNormalizedNodeCodec codec,
                 final ClassToInstanceMap<DOMService> delegates) {
-            final DOMRpcService domRpc  = delegates.getInstance(DOMRpcService.class);
+            final DOMRpcService domRpc = delegates.getInstance(DOMRpcService.class);
             return new BindingDOMRpcServiceAdapter(domRpc  , codec);
         }