/*
* Copyright 2011 ArcBees Inc.
*
* 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.gwtplatform.dispatch.rpc.client.interceptor.caching;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* Default Implementation for {@link Cache}, backed by an {@link java.util.HashMap}.
*/
public class DefaultCacheImpl implements Cache {
private static class CacheValue {
private final Object value;
private final long lastUpdateTime;
private CacheValue(Object value) {
this.value = value;
this.lastUpdateTime = new Date().getTime();
}
public Object getValue() {
return this.value;
}
public long getLastUpateTime() {
return this.lastUpdateTime;
}
}
private final Map<Object, CacheValue> map;
private long autoExpireTimeInMs;
/**
* Initializes the cache with auto expiration OFF.
*/
public DefaultCacheImpl() {
this.map = new HashMap<>();
// By default, autoExpireTime is -1 so that objects never expire
this.autoExpireTimeInMs = -1;
}
/**
* Initialize the cache with auto expiration ON.
*
* @param autoExpireTimeInMs Time in milliseconds after which entries in cache expire
*/
public DefaultCacheImpl(long autoExpireTimeInMs) {
this.map = new HashMap<>();
this.autoExpireTimeInMs = autoExpireTimeInMs;
}
@Override
public void clear() {
map.clear();
}
@Override
public Object get(Object key) {
// Check for null as Cache should not store null values / keys
if (key == null) {
throw new NullPointerException("key is null");
}
CacheValue cacheValue = map.get(key);
// Check for null
if (cacheValue == null) {
return null;
}
// Check if to be autoexpired, autoExpireTimeInMs = 0 means expire immediately / no caching
// Note: This point will never be reached if the value was put in cache when autoExpireTimeInMs was 0
if (this.autoExpireTimeInMs >= 0) {
// Check if expired
long now = new Date().getTime();
if (cacheValue.getLastUpateTime() + this.autoExpireTimeInMs < now) {
// Expired, remove
remove(key);
return null;
}
}
// Not expired, return the value
return cacheValue.getValue();
}
@Override
public void put(Object key, Object value) {
// No point caching if autoExpireTimeInMs = 0
if (this.autoExpireTimeInMs != 0) {
// Check for null as Cache should not store null values / keys
if (key == null) {
throw new NullPointerException("key is null");
}
if (value == null) {
throw new NullPointerException("value is null");
}
// Put in map
map.put(key, new CacheValue(value));
}
}
@Override
public void remove(Object key) {
map.remove(key);
}
@Override
public long getLastUpateTime(Object key) {
// Check for null as Cache should not store null values / keys
if (key == null) {
throw new NullPointerException("key is null");
}
CacheValue value = map.get(key);
if (value != null) {
return value.getLastUpateTime();
} else {
return -1;
}
}
@Override
public long getAutoExpireTimeInMs() {
return autoExpireTimeInMs;
}
@Override
public void setAutoExpireTimeInMs(long autoExpireTimeInMs) {
this.autoExpireTimeInMs = autoExpireTimeInMs;
}
}