package com.nutiteq.cache;
/**
* Combines different caching levels to one cache.
*/
public class CachingChain implements Cache {
private final Cache[] cacheLevels;
/**
* Define caching chain with given cache levels.
*
* @param cacheLevels
* cache levels to be used in this chain.
*/
public CachingChain(final Cache[] cacheLevels) {
this.cacheLevels = cacheLevels;
}
public void initialize() {
for (int i = 0; i < cacheLevels.length; i++) {
cacheLevels[i].initialize();
}
}
public void deinitialize() {
for (int i = 0; i < cacheLevels.length; i++) {
cacheLevels[i].deinitialize();
}
}
public byte[] get(final String cacheKey) {
byte[] result = null;
for (int i = 0; i < cacheLevels.length; i++) {
result = cacheLevels[i].get(cacheKey);
if (result != null) {
break;
}
}
return result;
}
public void cache(final String cacheKey, final byte[] data, final int cacheLevel) {
if (cacheLevel == CACHE_LEVEL_NONE || data == null || data.length == 0) {
return;
}
for (int i = 0; i < cacheLevels.length; i++) {
cacheLevels[i].cache(cacheKey, data, cacheLevel);
}
}
public boolean contains(final String cacheKey) {
for (int i = 0; i < cacheLevels.length; i++) {
if (cacheLevels[i].contains(cacheKey)) {
return true;
}
}
return false;
}
public boolean contains(final String cacheKey, final int cacheLevel) {
for (int i = 0; i < cacheLevels.length; i++) {
if (cacheLevels[i].contains(cacheKey, cacheLevel)) {
return true;
}
}
return false;
}
}