/** * Licensed to Apereo under one or more contributor license agreements. See the NOTICE file * distributed with this work for additional information regarding copyright ownership. Apereo * licenses this file to you 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 the * following location: * * <p>http://www.apache.org/licenses/LICENSE-2.0 * * <p>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 org.apereo.portal.utils.cache; import java.io.Serializable; import java.util.Collection; import java.util.Collections; import java.util.Map; import java.util.Set; import net.sf.ehcache.Ehcache; import net.sf.ehcache.Element; import org.apache.commons.lang.Validate; /** * Hides a {@link CacheProviderFacade} behind a the {@link Map} interface. Only the following * methods are supported: * * <ul> * <li>{@link #clear()} * <li>{@link #containsKey(Object)} * <li>{@link #get(Object)} * <li>{@link #put(Serializable, Object)} * <li>{@link #putAll(Map)} * <li>{@link #remove(Object)} * </ul> * * The {@link #put(Serializable, Object)} and {@link #remove(Object)} methods call {@link * #get(Object)} before performing the requested operation to be able to return the 'old' value. * */ public class MapCacheProvider<K extends Serializable, V> implements Map<K, V> { private final Ehcache cache; /** * @param cacheProviderFacade The facade to expose as a Map. * @param cachingModel The cache model to use for storing and retrieving data * @param flushModel The flushing model to use when clearing the cache */ public MapCacheProvider(Ehcache cache) { Validate.notNull(cache, "cache can not be null"); this.cache = cache; } /* (non-Javadoc) * @see java.util.Map#clear() */ public void clear() { this.cache.removeAll(); } /** * This does "{@link #get(Object)} != null". * * @see java.util.Map#containsKey(java.lang.Object) */ public boolean containsKey(Object key) { return this.cache.isKeyInCache(key); } /* (non-Javadoc) * @see java.util.Map#get(java.lang.Object) */ @SuppressWarnings("unchecked") public V get(Object key) { final Element element = this.cache.get((Serializable) key); if (element == null) { return null; } return (V) element.getObjectValue(); } /* (non-Javadoc) * @see java.util.Map#put(java.lang.Object, java.lang.Object) */ public V put(K key, V value) { final V old = this.get(key); this.cache.put(new Element(key, value)); return old; } /* (non-Javadoc) * @see java.util.Map#putAll(java.util.Map) */ public void putAll(Map<? extends K, ? extends V> t) { for (final Map.Entry<? extends K, ? extends V> e : t.entrySet()) { final K key = e.getKey(); final V value = e.getValue(); this.cache.put(new Element(key, value)); } } /* (non-Javadoc) * @see java.util.Map#remove(java.lang.Object) */ public V remove(Object key) { final V old = this.get(key); this.cache.remove((Serializable) key); return old; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((cache == null) ? 0 : cache.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (!(obj instanceof MapCacheProvider<?, ?>)) { return false; } MapCacheProvider<?, ?> other = (MapCacheProvider<?, ?>) obj; if (cache == null) { if (other.cache != null) { return false; } } else if (!cache.equals(other.cache)) { return false; } return true; } @Override public String toString() { return "MapCacheProvider [" + cache + "]"; } /* (non-Javadoc) * @see java.util.Map#containsValue(java.lang.Object) */ public boolean containsValue(Object value) { return this.cache.isValueInCache(value); } /* (non-Javadoc) * @see java.util.Map#isEmpty() */ public boolean isEmpty() { return this.cache.getSize() > 0; } /* (non-Javadoc) * @see java.util.Map#size() */ public int size() { return this.cache.getSize(); } //********** Unsupported Map methods **********// /* (non-Javadoc) * @see java.util.Map#entrySet() */ public Set<java.util.Map.Entry<K, V>> entrySet() { return Collections.emptySet(); } /* (non-Javadoc) * @see java.util.Map#keySet() */ public Set<K> keySet() { return Collections.emptySet(); } /* (non-Javadoc) * @see java.util.Map#values() */ public Collection<V> values() { return Collections.emptySet(); } }