It’s been experimental for four years and isn’t used anywhere in ODL.
Change-Id: Icc9778ef5ab777ae217b3ccd02e54de680460c73
Signed-off-by: Stephen Kitt <skitt@redhat.com>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- vi: set et smarttab sw=4 tabstop=4: -->
-<!--
- Copyright (c) 2014 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
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
-
- <parent>
- <groupId>org.opendaylight.odlparent</groupId>
- <artifactId>bundle-parent</artifactId>
- <version>4.0.0</version>
- <relativePath/>
- </parent>
- <packaging>bundle</packaging>
- <modelVersion>4.0.0</modelVersion>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>object-cache-api</artifactId>
- <version>2.1.0-SNAPSHOT</version>
-
- <properties>
- <sonar.jacoco.reportPath>${project.basedir}/../../target/jacoco.exec</sonar.jacoco.reportPath>
- </properties>
-
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>yangtools-artifacts</artifactId>
- <version>2.1.0-SNAPSHOT</version>
- <scope>import</scope>
- <type>pom</type>
- </dependency>
- </dependencies>
- </dependencyManagement>
-
- <dependencies>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>concepts</artifactId>
- </dependency>
- <dependency>
- <groupId>com.google.guava</groupId>
- <artifactId>guava</artifactId>
- </dependency>
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-bundle-plugin</artifactId>
- <extensions>true</extensions>
- <configuration>
- <instructions>
- <Import-Package>
- org.opendaylight.yangtools.objcache.impl;resolution:=optional,
- *
- </Import-Package>
- </instructions>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-antrun-plugin</artifactId>
- <executions>
- <execution>
- <phase>process-classes</phase>
- <goals>
- <goal>run</goal>
- </goals>
- <configuration>
- <tasks>
- <!-- This is necessary to remove the impl package and
- make static binding work with the implementation -->
- <delete dir="${project.build.outputDirectory}/org/opendaylight/yangtools/objcache/impl"/>
- </tasks>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-checkstyle-plugin</artifactId>
- <configuration>
- <propertyExpansion>checkstyle.violationSeverity=error</propertyExpansion>
- </configuration>
- </plugin>
- </plugins>
- </build>
-
-</project>
+++ /dev/null
-/*
- * Copyright (c) 2014 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.yangtools.objcache;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import org.opendaylight.yangtools.concepts.Immutable;
-import org.opendaylight.yangtools.concepts.ProductAwareBuilder;
-
-/**
- * A cache of objects. Caches are useful for reducing memory overhead
- * stemming from multiple copies of identical objects -- by putting
- * a cache in the instantiation path, one can expend some memory on
- * indexes and spend some CPU cycles on walking the index to potentially
- * end up with a reused object.
- *
- * <p>
- * Note that the cached objects should really be semantically {@link Immutable}.
- * This interface does not enforce that interface contract simply because
- * there are third-party objects which fulfill this contract.
- */
-public interface ObjectCache {
- /**
- * Get a reference for an object which is equal to specified object.
- * The cache is free return either a cached instance, or retain the
- * object and return it back.
- *
- * @param <T> object type
- * @param object Requested object, may be null
- * @return Reference to an object which is equal to the one passed in.
- * If @object was @null, this method returns @null.
- */
- <T> T getReference(@Nullable T object);
-
- /**
- * Get a reference to an object equal to the product of a builder.
- * The builder is expected to remain constant while this method
- * executes. Unlike {@link #getReference(Object)}, this method has
- * the potential of completely eliding the product instantiation.
- *
- * @param <P> produced object type
- * @param <B> builder type
- * @param builder Builder instance, may not be null
- * @return Result of builder's toInstance() product, or an equal
- * object.
- */
- <B extends ProductAwareBuilder<P>, P> P getProduct(@Nonnull B builder);
-}
+++ /dev/null
-/*
- * Copyright (c) 2014 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.yangtools.objcache;
-
-import static java.util.Objects.requireNonNull;
-
-import javax.annotation.Nonnull;
-import javax.annotation.concurrent.GuardedBy;
-import org.opendaylight.yangtools.objcache.impl.StaticObjectCacheBinder;
-import org.opendaylight.yangtools.objcache.spi.IObjectCacheFactory;
-import org.opendaylight.yangtools.objcache.spi.NoopObjectCacheBinder;
-
-/**
- * Point of entry for acquiring an {@link ObjectCache} instance.
- */
-public final class ObjectCacheFactory {
- private static volatile IObjectCacheFactory factory;
-
- private ObjectCacheFactory() {
- throw new UnsupportedOperationException("Utility class should not be instantiated");
- }
-
- @GuardedBy("this")
- private static synchronized IObjectCacheFactory initialize() {
- // Double-check under lock
- IObjectCacheFactory fa = factory;
- if (fa != null) {
- return fa;
- }
-
- try {
- fa = StaticObjectCacheBinder.getInstance().getProductCacheFactory();
- factory = fa;
- } catch (NoClassDefFoundError e) {
- fa = NoopObjectCacheBinder.INSTANCE.getProductCacheFactory();
- }
-
- return fa;
- }
-
- public static synchronized void reset() {
- factory = null;
- }
-
- /**
- * Get an ObjectCache for caching a particular object class. Note
- * that it may be shared for multiple classes.
- *
- * @param objClass Class of objects which are to be cached
- * @return Object cache instance.
- */
- public static ObjectCache getObjectCache(@Nonnull final Class<?> objClass) {
- IObjectCacheFactory fa = factory;
- if (fa == null) {
- fa = initialize();
- }
-
- return fa.getObjectCache(requireNonNull(objClass));
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2014 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.yangtools.objcache.impl;
-
-import org.opendaylight.yangtools.objcache.spi.AbstractObjectCacheBinder;
-
-/*
- * This is a dummy placeholder implementation. The API package is bound to
- * it at compile-time, but it is not packaged and thus not present at run-time.
- */
-public final class StaticObjectCacheBinder extends AbstractObjectCacheBinder {
- private StaticObjectCacheBinder() {
- super(null);
- }
-
- public static StaticObjectCacheBinder getInstance() {
- throw new IllegalStateException("This class should have been replaced");
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2014 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
- */
-/**
- * Static binding implementation package. The API package is bound at compile-time
- * to this package. Implementations are expected to supply this package.
- */
-package org.opendaylight.yangtools.objcache.impl;
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) 2014 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.yangtools.objcache;
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) 2014 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.yangtools.objcache.spi;
-
-import static java.util.Objects.requireNonNull;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.FinalizableReferenceQueue;
-import com.google.common.base.FinalizableSoftReference;
-import com.google.common.cache.Cache;
-import java.util.concurrent.ExecutionException;
-import javax.annotation.Nonnull;
-import org.opendaylight.yangtools.concepts.ProductAwareBuilder;
-import org.opendaylight.yangtools.objcache.ObjectCache;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Abstract object cache implementation. This implementation takes care
- * of interacting with the user and manages interaction with the Garbage
- * Collector (via soft references). Subclasses are expected to provide
- * a backing {@link Cache} instance and provide the
- */
-public abstract class AbstractObjectCache implements ObjectCache {
- /**
- * Key used when looking up a ProductAwareBuilder product. We assume
- * the builder is not being modified for the duration of the lookup,
- * anything else is the user's fault.
- */
- @VisibleForTesting
- static final class BuilderKey {
- private final ProductAwareBuilder<?> builder;
-
- private BuilderKey(final ProductAwareBuilder<?> builder) {
- this.builder = requireNonNull(builder);
- }
-
- @Override
- public int hashCode() {
- return builder.productHashCode();
- }
-
- @Override
- public boolean equals(Object obj) {
- /*
- * We can tolerate null objects coming our way, but we need
- * to be on the lookout for WeakKeys, as we cannot pass them
- * directly to productEquals().
- */
- if (obj instanceof SoftKey) {
- obj = ((SoftKey<?>)obj).get();
- }
-
- return builder.productEquals(obj);
- }
- }
-
- /**
- * Key used in the underlying map. It is essentially a soft reference, with
- * slightly special properties.
- *
- * <p>
- * It acts as a proxy for the object it refers to and essentially delegates
- * to it. There are three exceptions here:
- *
- * <p>
- * 1) This key needs to have a cached hash code. The requirement is that the
- * key needs to be able to look itself up after the reference to the object
- * has been cleared (and thus we can no longer look it up from there). One
- * typical container where we are stored are HashMaps -- and they need it
- * to be constant.
- * 2) This key does not tolerate checks to see if its equal to null. While we
- * could return false, we want to catch offenders who try to store nulls
- * in the cache.
- * 3) This key inverts the check for equality, e.g. it calls equals() on the
- * object which was passed to its equals(). Instead of supplying itself,
- * it supplies the referent. If the soft reference is cleared, such check
- * will return false, which is fine as it prevents normal lookup from
- * seeing the cleared key. Removal is handled by the explicit identity
- * check.
- */
- protected abstract static class SoftKey<T> extends FinalizableSoftReference<T> {
- private final int hashCode;
-
- public SoftKey(final T referent, final FinalizableReferenceQueue queue) {
- super(requireNonNull(referent), queue);
- hashCode = referent.hashCode();
- }
-
- @Override
- public boolean equals(final Object obj) {
- if (obj == null) {
- return false;
- }
-
- // Order is important: we do not want to call equals() on ourselves!
- return this == obj || obj.equals(get());
- }
-
- @Override
- public int hashCode() {
- return hashCode;
- }
- }
-
- private static final Logger LOG = LoggerFactory.getLogger(AbstractObjectCache.class);
- private final FinalizableReferenceQueue queue;
- private final Cache<SoftKey<?>, Object> cache;
-
- protected AbstractObjectCache(final Cache<SoftKey<?>, Object> cache, final FinalizableReferenceQueue queue) {
- this.queue = requireNonNull(queue);
- this.cache = requireNonNull(cache);
- }
-
- protected <T> SoftKey<T> createSoftKey(final T object) {
- /*
- * This may look like a race (having a soft reference and not have
- * it in the cache). In fact this is protected by the fact we still
- * have a strong reference on the object in our arguments and that
- * reference survives past method return since we return it.
- */
- return new SoftKey<T>(object, queue) {
- @Override
- public void finalizeReferent() {
- /*
- * NOTE: while it may be tempting to add "object" into this
- * trace message, do not ever do that: it would retain
- * a strong reference, preventing collection.
- */
- LOG.trace("Invalidating key {}", this);
- cache.invalidate(this);
- }
- };
- }
-
- @Override
- public final <B extends ProductAwareBuilder<P>, P> P getProduct(@Nonnull final B builder) {
- throw new UnsupportedOperationException();
-// LOG.debug("Looking up product for {}", builder);
-//
-// @SuppressWarnings("unchecked")
-// final P ret = (P) cache.getIfPresent(new BuilderKey(builder));
-// return ret == null ? put(Preconditions.checkNotNull(builder.toInstance())) : ret;
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public final <T> T getReference(final T object) {
- LOG.debug("Looking up reference for {}", object);
- if (object == null) {
- return null;
- }
-
- final SoftKey<T> key = createSoftKey(object);
- try {
- return (T) cache.get(key, () -> object);
- } catch (ExecutionException e) {
- throw new IllegalStateException("Failed to load value", e);
- }
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2014 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.yangtools.objcache.spi;
-
-import static java.util.Objects.requireNonNull;
-
-import javax.annotation.Nonnull;
-
-public abstract class AbstractObjectCacheBinder implements ObjectCacheFactoryBinder {
- private final IObjectCacheFactory factory;
-
- protected AbstractObjectCacheBinder(@Nonnull final IObjectCacheFactory factory) {
- this.factory = requireNonNull(factory);
- }
-
- @Override
- public final IObjectCacheFactory getProductCacheFactory() {
- return factory;
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2014 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.yangtools.objcache.spi;
-
-import javax.annotation.Nonnull;
-import org.opendaylight.yangtools.objcache.ObjectCache;
-
-public interface IObjectCacheFactory {
- ObjectCache getObjectCache(@Nonnull Class<?> objClass);
-}
+++ /dev/null
-/*
- * Copyright (c) 2014 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.yangtools.objcache.spi;
-
-import javax.annotation.Nonnull;
-import org.opendaylight.yangtools.concepts.ProductAwareBuilder;
-import org.opendaylight.yangtools.objcache.ObjectCache;
-
-/**
- * No-operation implementation of an Object Cache. This implementation
- * does not do any caching, so it only returns the request object.
- */
-public final class NoopObjectCache implements ObjectCache {
- private static final NoopObjectCache INSTANCE = new NoopObjectCache();
-
- private NoopObjectCache() {
-
- }
-
- /**
- * Get the cache instance. Since the cache does not have any state,
- * this method always returns a singleton instance.
- *
- * @return Cache instance.
- */
- public static NoopObjectCache getInstance() {
- return INSTANCE;
- }
-
- @Override
- public <T> T getReference(final T object) {
- return object;
- }
-
- @Override
- public <B extends ProductAwareBuilder<P>, P> P getProduct(@Nonnull final B builder) {
- return builder.build();
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2014 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.yangtools.objcache.spi;
-
-public final class NoopObjectCacheBinder extends AbstractObjectCacheBinder {
- public static final NoopObjectCacheBinder INSTANCE = new NoopObjectCacheBinder();
-
- private NoopObjectCacheBinder() {
- super(objClass -> NoopObjectCache.getInstance());
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2014 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.yangtools.objcache.spi;
-
-/**
- * Interface binding an implementation into ObjectCacheFactory.
- */
-public interface ObjectCacheFactoryBinder {
- /**
- * Get the implementation-specific cache factory.
- *
- * @return Implementation-specific factory.
- */
- IObjectCacheFactory getProductCacheFactory();
-}
+++ /dev/null
-/*
- * Copyright (c) 2014 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
- */
-/**
- * Service Provider Interface for Object Cache. Object cache implementations
- * use classes contained in this package to implement their functionality.
- */
-package org.opendaylight.yangtools.objcache.spi;
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) 2014 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.yangtools.objcache.spi;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-import org.junit.Test;
-import org.opendaylight.yangtools.objcache.ObjectCache;
-import org.opendaylight.yangtools.objcache.ObjectCacheFactory;
-
-public class CacheFactoryTest {
-
- @Test
- public void testInvalidEnvironment() {
- final ObjectCache oc = ObjectCacheFactory.getObjectCache(String.class);
-
- assertNotNull(oc);
- assertEquals(NoopObjectCache.class, oc.getClass());
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2014 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.yangtools.objcache.spi;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertSame;
-
-import com.google.common.base.FinalizableReferenceQueue;
-import com.google.common.cache.CacheBuilder;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.yangtools.objcache.ObjectCache;
-
-public class CacheTest {
- private FinalizableReferenceQueue queue;
- private ObjectCache oc;
-
- @Before
- public void setUp() {
- queue = new FinalizableReferenceQueue();
- oc = new AbstractObjectCache(CacheBuilder.newBuilder().softValues().build(), queue) {
- };
- }
-
- @After
- public void tearDown() {
- queue.close();
- }
-
- @Test
- public void testMissingKey() {
- final String key1 = "abcd";
- final String key2 = "efgh";
-
- assertSame(key1, oc.getReference(key1));
- assertSame(key2, oc.getReference(key2));
- }
-
- @Test
- // This test is based on using different references
- @SuppressWarnings("RedundantStringConstructorCall")
- public void testPresentKey() {
- final String key1 = new String("abcd");
- final String key2 = new String("abcd");
-
- assertSame(key1, oc.getReference(key1));
-
- final String key3 = oc.getReference(key2);
- assertEquals(key2, key3);
- assertNotSame(key2, key3);
- assertSame(key1, key3);
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2014 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.yangtools.objcache.spi;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-import com.google.common.base.FinalizableReferenceQueue;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.yangtools.objcache.spi.AbstractObjectCache.SoftKey;
-
-public class SoftKeyTest {
- private FinalizableReferenceQueue queue;
-
-
- @Before
- public void setUp() {
- queue = new FinalizableReferenceQueue();
- }
-
- @After
- public void tearDown() {
- queue.close();
- }
-
- @Test
- public void testEquals() {
- final String str = "foo";
-
- final SoftKey<?> key = new SoftKey<String>(str, queue) {
- @Override
- public void finalizeReferent() {
-
- }
- };
-
- assertSame(str, key.get());
- assertEquals(str.hashCode(), key.hashCode());
- assertTrue(key.equals(str));
- key.clear();
- assertNull(key.get());
- assertEquals(str.hashCode(), key.hashCode());
- assertFalse(key.equals(str));
- }
-}
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- vi: set et smarttab sw=4 tabstop=4: -->
-<!--
- Copyright (c) 2014 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
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
- <parent>
- <groupId>org.opendaylight.odlparent</groupId>
- <artifactId>bundle-parent</artifactId>
- <version>4.0.0</version>
- <relativePath/>
- </parent>
-
- <packaging>bundle</packaging>
- <modelVersion>4.0.0</modelVersion>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>object-cache-guava</artifactId>
- <version>2.1.0-SNAPSHOT</version>
-
- <properties>
- <sonar.jacoco.reportPath>${project.basedir}/../../target/jacoco.exec</sonar.jacoco.reportPath>
- </properties>
-
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>yangtools-artifacts</artifactId>
- <version>2.1.0-SNAPSHOT</version>
- <scope>import</scope>
- <type>pom</type>
- </dependency>
- </dependencies>
- </dependencyManagement>
-
- <dependencies>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>object-cache-api</artifactId>
- </dependency>
- <dependency>
- <groupId>com.google.guava</groupId>
- <artifactId>guava</artifactId>
- </dependency>
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-bundle-plugin</artifactId>
- <extensions>true</extensions>
- <configuration>
- <instructions>
- <Export-Package>
- org.opendaylight.yangtools.objcache.impl
- </Export-Package>
- <Private-Package>
- org.opendaylight.yangtools.objcache.guava
- </Private-Package>
- </instructions>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-checkstyle-plugin</artifactId>
- <configuration>
- <propertyExpansion>checkstyle.violationSeverity=error</propertyExpansion>
- </configuration>
- </plugin>
- </plugins>
- </build>
-
-</project>
+++ /dev/null
-/*
- * Copyright (c) 2014 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.yangtools.objcache.guava;
-
-import com.google.common.base.FinalizableReferenceQueue;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheBuilderSpec;
-import org.opendaylight.yangtools.objcache.spi.AbstractObjectCache;
-
-final class GuavaObjectCache extends AbstractObjectCache {
- GuavaObjectCache(final FinalizableReferenceQueue queue) {
- super(CacheBuilder.newBuilder().softValues().build(), queue);
- }
-
- GuavaObjectCache(final FinalizableReferenceQueue queue, final CacheBuilderSpec spec) {
- super(CacheBuilder.from(spec).build(), queue);
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2014 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.yangtools.objcache.guava;
-
-import com.google.common.base.FinalizableReferenceQueue;
-import javax.annotation.Nonnull;
-import org.opendaylight.yangtools.objcache.ObjectCache;
-import org.opendaylight.yangtools.objcache.spi.IObjectCacheFactory;
-
-public final class GuavaObjectCacheFactory implements AutoCloseable, IObjectCacheFactory {
- private static final GuavaObjectCacheFactory INSTANCE = new GuavaObjectCacheFactory();
- private final FinalizableReferenceQueue queue = new FinalizableReferenceQueue();
- private final ObjectCache cache;
-
- private GuavaObjectCacheFactory() {
- // FIXME: make this more dynamic using a spec
- this.cache = new GuavaObjectCache(queue);
- }
-
- @Override
- public ObjectCache getObjectCache(@Nonnull final Class<?> objClass) {
- return cache;
- }
-
- @Override
- public void close() {
- queue.close();
- }
-
- /**
- * Return a factory instance.
- *
- * @return A factory instance.
- */
- public static GuavaObjectCacheFactory getInstance() {
- return INSTANCE;
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2014 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.yangtools.objcache.guava;
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) 2014 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.yangtools.objcache.impl;
-
-import org.opendaylight.yangtools.objcache.guava.GuavaObjectCacheFactory;
-import org.opendaylight.yangtools.objcache.spi.AbstractObjectCacheBinder;
-
-public final class StaticObjectCacheBinder extends AbstractObjectCacheBinder {
- private static final StaticObjectCacheBinder INSTANCE = new StaticObjectCacheBinder();
-
- private StaticObjectCacheBinder() {
- super(GuavaObjectCacheFactory.getInstance());
- }
-
- public static StaticObjectCacheBinder getInstance() {
- return INSTANCE;
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2014 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.yangtools.objcache.guava;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertSame;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.yangtools.objcache.ObjectCache;
-import org.opendaylight.yangtools.objcache.ObjectCacheFactory;
-
-public class GuavaObjectCacheTest {
- private ObjectCache cache;
-
- @Before
- public void setUp() {
- cache = ObjectCacheFactory.getObjectCache(String.class);
- }
-
- @Test
- public void testCorrectWiring() {
- assertEquals(GuavaObjectCache.class, cache.getClass());
- }
-
- @Test
- public void testInitialReference() {
- final String s1 = "abcd";
- final String s2 = cache.getReference(s1);
- assertSame(s1, s2);
- }
-
- @Test
- // This test is based on using different references
- @SuppressWarnings("RedundantStringConstructorCall")
- public void testMultipleReferences() {
- final String s1 = "abcd";
- final String s2 = new String(s1);
-
- // Preliminary check
- assertEquals(s1, s2);
- assertNotSame(s1, s2);
-
- assertSame(s1, cache.getReference(s1));
- assertSame(s1, cache.getReference(s2));
- assertNotSame(s2, cache.getReference(s2));
- }
-
-}
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- vi: set et smarttab sw=4 tabstop=4: -->
-<!--
- Copyright (c) 2014 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
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
- <parent>
- <groupId>org.opendaylight.odlparent</groupId>
- <artifactId>bundle-parent</artifactId>
- <version>4.0.0</version>
- <relativePath/>
- </parent>
- <packaging>bundle</packaging>
- <modelVersion>4.0.0</modelVersion>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>object-cache-noop</artifactId>
- <version>2.1.0-SNAPSHOT</version>
-
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>yangtools-artifacts</artifactId>
- <version>2.1.0-SNAPSHOT</version>
- <scope>import</scope>
- <type>pom</type>
- </dependency>
- </dependencies>
- </dependencyManagement>
-
- <dependencies>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>object-cache-api</artifactId>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-bundle-plugin</artifactId>
- <extensions>true</extensions>
- <configuration>
- <instructions>
- <Export-Package>
- org.opendaylight.yangtools.objcache.impl
- </Export-Package>
- <Private-Package>
- org.opendaylight.yangtools.objcache.noop
- </Private-Package>
- </instructions>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-checkstyle-plugin</artifactId>
- <configuration>
- <propertyExpansion>checkstyle.violationSeverity=error</propertyExpansion>
- </configuration>
- </plugin>
- </plugins>
- </build>
-
-</project>
+++ /dev/null
-/*
- * Copyright (c) 2014 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.yangtools.objcache.impl;
-
-import org.opendaylight.yangtools.objcache.spi.AbstractObjectCacheBinder;
-import org.opendaylight.yangtools.objcache.spi.NoopObjectCache;
-
-public final class StaticObjectCacheBinder extends AbstractObjectCacheBinder {
- private static final StaticObjectCacheBinder INSTANCE = new StaticObjectCacheBinder();
-
- private StaticObjectCacheBinder() {
- super(objClass -> NoopObjectCache.getInstance());
- }
-
- public static StaticObjectCacheBinder getInstance() {
- return INSTANCE;
- }
-}
<module>checkstyle-logging</module>
<module>concepts</module>
<module>mockito-configuration</module>
- <module>object-cache-api</module>
- <module>object-cache-guava</module>
- <module>object-cache-noop</module>
<module>util</module>
<module>testutils</module>
</modules>
<classifier>features</classifier>
<type>xml</type>
</dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>odl-exp-objcache</artifactId>
- <classifier>features</classifier>
- <type>xml</type>
- </dependency>
<dependency>
<groupId>org.opendaylight.yangtools</groupId>
<artifactId>odl-yangtools-exp-xpath-api</artifactId>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright © 2016 Red Hat, 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
- -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.opendaylight.odlparent</groupId>
- <artifactId>single-feature-parent</artifactId>
- <version>4.0.0</version>
- <relativePath/>
- </parent>
-
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>odl-exp-objcache</artifactId>
- <version>2.1.0-SNAPSHOT</version>
- <packaging>feature</packaging>
- <name>OpenDaylight :: Yangtools :: Experimental :: Object Cache</name>
-
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>yangtools-artifacts</artifactId>
- <version>${project.version}</version>
- <scope>import</scope>
- <type>pom</type>
- </dependency>
- </dependencies>
- </dependencyManagement>
-
- <dependencies>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>odl-yangtools-util</artifactId>
- <type>xml</type>
- <classifier>features</classifier>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>object-cache-guava</artifactId>
- </dependency>
- </dependencies>
-</project>
<module>features-yangtools</module>
<!-- Experimental features -->
- <module>odl-exp-objcache</module>
<module>odl-yangtools-exp-xpath-api</module>
<module>odl-yangtools-exp-xpath-impl</module>