From: Robert Varga Date: Wed, 10 Apr 2019 18:09:36 +0000 (+0200) Subject: Split BindingNormalizedNodeCache X-Git-Tag: v4.0.0~6 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;ds=inline;h=refs%2Fchanges%2F57%2F81557%2F2;p=mdsal.git Split BindingNormalizedNodeCache We will end up caching various kinds of BindingObjects, this splits up BindingNormalizedNodeCache into an abstract base class and a concrete implementation for DataObjects. JIRA: MDSAL-407 Change-Id: I7ae0338fa29124cfe4a5f0234fe9dd55e8bc389e Signed-off-by: Jie Han Signed-off-by: Robert Varga --- diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractBindingNormalizedNodeCache.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractBindingNormalizedNodeCache.java new file mode 100644 index 0000000000..8b602c1056 --- /dev/null +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractBindingNormalizedNodeCache.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2019 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 + */ +package org.opendaylight.mdsal.binding.dom.codec.impl; + +import static java.util.Objects.requireNonNull; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.yangtools.yang.binding.BindingObject; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; + +/** + * An abstract cache mapping BindingObject instances to their NormalizedNode counterparts. Note that this mapping is + * not one-to-one, as NormalizedNodes work on instantiated trees while BindingObjects are generally reused across + * instantiations. + * + * @param BindingObject subtype + * @param Root codec context type + */ +abstract class AbstractBindingNormalizedNodeCache + extends CacheLoader> { + private final LoadingCache> cache = CacheBuilder.newBuilder().weakValues().build(this); + + private final @NonNull C rootContext; + + AbstractBindingNormalizedNodeCache(final C rootContext) { + this.rootContext = requireNonNull(rootContext); + } + + /** + * Returns the root codec context associated with this cache. + * + * @return Root codec context + */ + final @NonNull C rootContext() { + return rootContext; + } + + /** + * Returns cached NormalizedNode representation of DataObject. If the representation is not cached, serializes + * DataObject and updates cache with representation. + * + * @param obj Binding object to be deserialized + * @return NormalizedNode representation of binding object. + */ + final NormalizedNode get(final @NonNull T obj) { + return cache.getUnchecked(obj); + } +} diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractBindingNormalizedNodeCacheHolder.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractBindingNormalizedNodeCacheHolder.java index db7cbc693e..7dde038e07 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractBindingNormalizedNodeCacheHolder.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractBindingNormalizedNodeCacheHolder.java @@ -13,6 +13,7 @@ import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.google.common.collect.ImmutableSet; +import org.opendaylight.yangtools.yang.binding.BindingObject; import org.opendaylight.yangtools.yang.binding.DataObject; /** @@ -20,28 +21,27 @@ import org.opendaylight.yangtools.yang.binding.DataObject; * associated. */ abstract class AbstractBindingNormalizedNodeCacheHolder { - - private final ImmutableSet> cachedValues; - private final LoadingCache, BindingNormalizedNodeCache> caches = CacheBuilder - .newBuilder().build(new CacheLoader, BindingNormalizedNodeCache>() { + private final LoadingCache, DataObjectNormalizedNodeCache> caches = CacheBuilder + .newBuilder().build(new CacheLoader, DataObjectNormalizedNodeCache>() { @Override - public BindingNormalizedNodeCache load(final DataContainerCodecContext key) { - return new BindingNormalizedNodeCache(AbstractBindingNormalizedNodeCacheHolder.this, key); + public DataObjectNormalizedNodeCache load(final DataContainerCodecContext key) { + return new DataObjectNormalizedNodeCache(AbstractBindingNormalizedNodeCacheHolder.this, key); } }); + private final ImmutableSet> cacheSpec; AbstractBindingNormalizedNodeCacheHolder(final ImmutableSet> cacheSpec) { - cachedValues = requireNonNull(cacheSpec); + this.cacheSpec = requireNonNull(cacheSpec); } - BindingNormalizedNodeCache getCachingSerializer(final DataContainerCodecContext childCtx) { + DataObjectNormalizedNodeCache getCachingSerializer(final DataContainerCodecContext childCtx) { if (isCached(childCtx.getBindingClass())) { return caches.getUnchecked(childCtx); } return null; } - boolean isCached(final Class type) { - return cachedValues.contains(type); + final boolean isCached(final Class type) { + return cacheSpec.contains(type); } } diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingNormalizedNodeCache.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingNormalizedNodeCache.java deleted file mode 100644 index 7b594e92b3..0000000000 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingNormalizedNodeCache.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. 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.codec.impl; - -import static java.util.Objects.requireNonNull; - -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; -import org.opendaylight.yangtools.yang.binding.DataObject; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; - -final class BindingNormalizedNodeCache extends CacheLoader> { - - private final LoadingCache> cache = CacheBuilder.newBuilder().weakValues() - .build(this); - final DataContainerCodecContext subtreeRoot; - final AbstractBindingNormalizedNodeCacheHolder cacheHolder; - - BindingNormalizedNodeCache(final AbstractBindingNormalizedNodeCacheHolder cacheHolder, - final DataContainerCodecContext subtreeRoot) { - this.cacheHolder = requireNonNull(cacheHolder, "cacheHolder"); - this.subtreeRoot = requireNonNull(subtreeRoot, "subtreeRoot"); - } - - @Override - public NormalizedNode load(final DataObject key) throws Exception { - return CachingNormalizedNodeSerializer.serializeUsingStreamWriter(cacheHolder, subtreeRoot, key); - } - - /** - * Returns cached NormalizedNode representation of DataObject. If the representation is not cached, serializes - * DataObject and updates cache with representation. - * - * @param obj Binding object to be deserialized - * @return NormalizedNode representation of binding object. - */ - NormalizedNode get(final DataObject obj) { - return cache.getUnchecked(obj); - } -} diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CachingNormalizedNodeCodec.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CachingNormalizedNodeCodec.java index c8504d778f..30e4a458df 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CachingNormalizedNodeCodec.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CachingNormalizedNodeCodec.java @@ -16,7 +16,6 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; class CachingNormalizedNodeCodec extends AbstractBindingNormalizedNodeCacheHolder implements BindingNormalizedNodeCachingCodec { - private final DataContainerCodecContext context; CachingNormalizedNodeCodec(final DataContainerCodecContext subtreeRoot, @@ -32,12 +31,14 @@ class CachingNormalizedNodeCodec extends AbstractBindingNo @Override public NormalizedNode serialize(final D data) { - return CachingNormalizedNodeSerializer.serialize(this, context, data); + // Serialize data using stream writer with child cache enable or using the cache if it is available + final DataObjectNormalizedNodeCache cache = getCachingSerializer(context); + return cache == null ? CachingNormalizedNodeSerializer.serializeUsingStreamWriter(this, context, data) + : cache.get(data); } @Override public void close() { // NOOP as of now. } - } diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CachingNormalizedNodeSerializer.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CachingNormalizedNodeSerializer.java index 2e06363f69..658bc8939c 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CachingNormalizedNodeSerializer.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CachingNormalizedNodeSerializer.java @@ -15,7 +15,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult; /** - * Serializer of Binding objects to Normalized Node which uses {@link BindingNormalizedNodeCache} to + * Serializer of Binding objects to Normalized Node which uses {@link DataObjectNormalizedNodeCache} to * cache already serialized values. * *

@@ -66,7 +66,7 @@ final class CachingNormalizedNodeSerializer extends ForwardingBindingStreamEvent */ @Override public NormalizedNode serialize(final DataObject input) { - final BindingNormalizedNodeCache cachingSerializer = getCacheSerializer(input.implementedInterface()); + final DataObjectNormalizedNodeCache cachingSerializer = getCacheSerializer(input.implementedInterface()); if (cachingSerializer != null) { final NormalizedNode domData = cachingSerializer.get(input); domWriter.addChild(domData); @@ -75,25 +75,7 @@ final class CachingNormalizedNodeSerializer extends ForwardingBindingStreamEvent return null; } - /** - * Serializes supplied data using stream writer with child cache enabled or using cache directly - * if cache is avalaible also for supplied Codec node. - * - * @param cacheHolder Binding to Normalized Node Cache holder - * @param subtreeRoot Codec Node for provided data object - * @param data Data to be serialized - * @return Normalized Node representation of data. - */ - static NormalizedNode serialize(final AbstractBindingNormalizedNodeCacheHolder cacheHolder, - final DataContainerCodecContext subtreeRoot, final DataObject data) { - final BindingNormalizedNodeCache cache = cacheHolder.getCachingSerializer(subtreeRoot); - if (cache != null) { - return cache.get(data); - } - return serializeUsingStreamWriter(cacheHolder, subtreeRoot, data); - } - - private BindingNormalizedNodeCache getCacheSerializer(final Class type) { + private DataObjectNormalizedNodeCache getCacheSerializer(final Class type) { if (cacheHolder.isCached(type)) { final DataContainerCodecContext currentCtx = (DataContainerCodecContext) delegate.current(); if (type.equals(currentCtx.getBindingClass())) { diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectNormalizedNodeCache.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectNormalizedNodeCache.java new file mode 100644 index 0000000000..9f32f7be31 --- /dev/null +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectNormalizedNodeCache.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2015 Cisco Systems, Inc. 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.codec.impl; + +import static java.util.Objects.requireNonNull; + +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; + +/** + * A cache of NormalizedNodes corresponding to a particular DataObject instantiation. + */ +final class DataObjectNormalizedNodeCache + extends AbstractBindingNormalizedNodeCache> { + private final AbstractBindingNormalizedNodeCacheHolder cacheHolder; + + DataObjectNormalizedNodeCache(final AbstractBindingNormalizedNodeCacheHolder cacheHolder, + final DataContainerCodecContext rootContext) { + super(rootContext); + this.cacheHolder = requireNonNull(cacheHolder, "cacheHolder"); + } + + @Override + public NormalizedNode load(final DataObject key) { + return CachingNormalizedNodeSerializer.serializeUsingStreamWriter(cacheHolder, rootContext(), key); + } +}