summaryrefslogtreecommitdiffstats
path: root/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheProvider.java
diff options
context:
space:
mode:
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.java129
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);
+ }
+}