From b682f93d5c322176f564dda076955ce8b7efd616 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 10 Sep 2014 22:32:49 +0200 Subject: [PATCH] BUG-1796: implement SourceIdentifier/PotentialSchemaSource caching Adds a global cache for both object types and uses it in the AbstractSchemaSourceRepository. Change-Id: I87ff4e5379a6d0f3b39f56d8d2197571cfa9325d Signed-off-by: Robert Varga --- yang/yang-model-api/pom.xml | 4 ++++ .../yang/model/repo/api/SourceIdentifier.java | 16 ++++++++++++---- .../model/repo/spi/PotentialSchemaSource.java | 12 ++++++++++++ .../repo/util/AbstractSchemaRepository.java | 8 +++++--- 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/yang/yang-model-api/pom.xml b/yang/yang-model-api/pom.xml index 4ad092e582..a993efa6cf 100644 --- a/yang/yang-model-api/pom.xml +++ b/yang/yang-model-api/pom.xml @@ -22,6 +22,10 @@ ${project.artifactId} + + ${project.groupId} + object-cache-api + ${project.groupId} util diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/repo/api/SourceIdentifier.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/repo/api/SourceIdentifier.java index 4e1fd00f20..44a8cceee7 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/repo/api/SourceIdentifier.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/repo/api/SourceIdentifier.java @@ -13,6 +13,8 @@ import com.google.common.base.Preconditions; import org.opendaylight.yangtools.concepts.Identifier; import org.opendaylight.yangtools.concepts.Immutable; +import org.opendaylight.yangtools.objcache.ObjectCache; +import org.opendaylight.yangtools.objcache.ObjectCacheFactory; /** * YANG Schema source identifier @@ -37,26 +39,24 @@ import org.opendaylight.yangtools.concepts.Immutable; */ @Beta public final class SourceIdentifier implements Identifier, Immutable { - /** * Default revision for sources without specified revision. * Marks the source as oldest. */ public static final String NOT_PRESENT_FORMATTED_REVISION = "0000-00-00"; + private static final ObjectCache CACHE = ObjectCacheFactory.getObjectCache(SourceIdentifier.class); private static final long serialVersionUID = 1L; private final String revision; private final String name; /** - * * Creates new YANG Schema source identifier. * * @param name Name of schema * @param formattedRevision Revision of source in format YYYY-mm-dd */ public SourceIdentifier(final String name, final String formattedRevision) { - super(); this.name = Preconditions.checkNotNull(name); this.revision = Preconditions.checkNotNull(formattedRevision); } @@ -72,6 +72,15 @@ public final class SourceIdentifier implements Identifier, Immutable { this(name, formattedRevision.or(NOT_PRESENT_FORMATTED_REVISION)); } + /** + * Return a cached reference to an object equal to this object. + * + * @return A potentially shared reference, not guaranteed to be unique. + */ + public SourceIdentifier cachedReference() { + return CACHE.getReference(this); + } + /** * * Creates new YANG Schema source identifier for sources without revision. @@ -83,7 +92,6 @@ public final class SourceIdentifier implements Identifier, Immutable { this(name, NOT_PRESENT_FORMATTED_REVISION); } - /** * Returns model name * diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/repo/spi/PotentialSchemaSource.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/repo/spi/PotentialSchemaSource.java index fae44679e2..fa2758f4e3 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/repo/spi/PotentialSchemaSource.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/repo/spi/PotentialSchemaSource.java @@ -10,6 +10,8 @@ package org.opendaylight.yangtools.yang.model.repo.spi; import com.google.common.annotations.Beta; import com.google.common.base.Preconditions; +import org.opendaylight.yangtools.objcache.ObjectCache; +import org.opendaylight.yangtools.objcache.ObjectCacheFactory; import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceRepresentation; import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; @@ -62,6 +64,7 @@ public final class PotentialSchemaSource { } } + private static final ObjectCache CACHE = ObjectCacheFactory.getObjectCache(PotentialSchemaSource.class); private final Class representation; private final SourceIdentifier sourceIdentifier; private final int cost; @@ -77,6 +80,15 @@ public final class PotentialSchemaSource { return new PotentialSchemaSource<>(sourceIdentifier, representation, cost); } + /** + * Return a cached reference to an object equal to this object. + * + * @return A potentially shared reference, not guaranteed to be unique. + */ + public PotentialSchemaSource cachedReference() { + return CACHE.getReference(this); + } + public SourceIdentifier getSourceIdentifier() { return sourceIdentifier; } diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/repo/util/AbstractSchemaRepository.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/repo/util/AbstractSchemaRepository.java index 722ac918e0..d6058292af 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/repo/util/AbstractSchemaRepository.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/repo/util/AbstractSchemaRepository.java @@ -153,14 +153,16 @@ public abstract class AbstractSchemaRepository implements SchemaRepository, Sche @Override public SchemaSourceRegistration registerSchemaSource(final SchemaSourceProvider provider, final PotentialSchemaSource source) { - final AbstractSchemaSourceRegistration ret = new AbstractSchemaSourceRegistration(provider, source) { + final PotentialSchemaSource src = source.cachedReference(); + + final AbstractSchemaSourceRegistration ret = new AbstractSchemaSourceRegistration(provider, src) { @Override protected void removeRegistration() { - removeSource(source, this); + removeSource(src, this); } }; - addSource(source, ret); + addSource(src, ret); return ret; } -- 2.36.6