diff options
Diffstat (limited to 'gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheProvider.java')
-rw-r--r-- | gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheProvider.java | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheProvider.java new file mode 100644 index 0000000000..6a7293ece0 --- /dev/null +++ b/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheProvider.java @@ -0,0 +1,129 @@ +// Copyright (C) 2009 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.server.cache; + +import static com.google.gerrit.server.cache.EvictionPolicy.LFU; +import static java.util.concurrent.TimeUnit.DAYS; +import static java.util.concurrent.TimeUnit.SECONDS; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import com.google.inject.ProvisionException; + +import net.sf.ehcache.Ehcache; + +import java.util.concurrent.TimeUnit; + +final class CacheProvider<K, V> implements Provider<Cache<K, V>>, + NamedCacheBinding, UnnamedCacheBinding { + private final boolean disk; + private int memoryLimit; + private int diskLimit; + private long maxAge; + private EvictionPolicy evictionPolicy; + private String cacheName; + private ProxyEhcache cache; + + CacheProvider(final boolean disk) { + this.disk = disk; + + memoryLimit(1024); + maxAge(90, DAYS); + evictionPolicy(LFU); + + if (disk) { + diskLimit(16384); + } + } + + @Inject + void setCachePool(final CachePool pool) { + this.cache = pool.register(this); + } + + void bind(final Ehcache ehcache) { + cache.bind(ehcache); + } + + String getName() { + if (cacheName == null) { + throw new ProvisionException("Cache has no name"); + } + return cacheName; + } + + boolean disk() { + return disk; + } + + int memoryLimit() { + return memoryLimit; + } + + int diskLimit() { + return diskLimit; + } + + long maxAge() { + return maxAge; + } + + EvictionPolicy evictionPolicy() { + return evictionPolicy; + } + + public NamedCacheBinding name(final String name) { + if (cacheName != null) { + throw new IllegalStateException("Cache name already set"); + } + cacheName = name; + return this; + } + + public NamedCacheBinding memoryLimit(final int objects) { + memoryLimit = objects; + return this; + } + + public NamedCacheBinding diskLimit(final int objects) { + if (!disk) { + // TODO This should really be a compile time type error, but I'm + // too lazy to create the mess of permutations required to setup + // type safe returns for bindings in our little DSL. + // + throw new IllegalStateException("Cache is not disk based"); + } + diskLimit = objects; + return this; + } + + public NamedCacheBinding maxAge(final long duration, final TimeUnit unit) { + maxAge = SECONDS.convert(duration, unit); + return this; + } + + @Override + public NamedCacheBinding evictionPolicy(final EvictionPolicy policy) { + evictionPolicy = policy; + return this; + } + + public Cache<K, V> get() { + if (cache == null) { + throw new ProvisionException("Cache \"" + cacheName + "\" not available"); + } + return new SimpleCache<K, V>(cache); + } +} |