001 /* $Id: RuleSetCache.java 992080 2010-09-02 19:46:29Z simonetripodi $
002 *
003 * Licensed to the Apache Software Foundation (ASF) under one or more
004 * contributor license agreements. See the NOTICE file distributed with
005 * this work for additional information regarding copyright ownership.
006 * The ASF licenses this file to You under the Apache License, Version 2.0
007 * (the "License"); you may not use this file except in compliance with
008 * the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018 package org.apache.commons.digester.annotations.internal;
019
020 import java.io.Serializable;
021 import java.util.LinkedHashMap;
022 import java.util.Map;
023
024 import org.apache.commons.digester.annotations.FromAnnotationsRuleSet;
025
026 /**
027 * Simple in-memory LRU cache implementation.
028 *
029 * @since 2.1
030 */
031 public final class RuleSetCache implements Serializable {
032
033 /**
034 * This class serialVersionUID.
035 */
036 private static final long serialVersionUID = 1L;
037
038 /**
039 * The fixed cache size.
040 */
041 private final int cacheSize = 255;
042
043 /**
044 * The fixed cache load facor.
045 */
046 private final float loadFactor = 0.75f;
047
048 /**
049 * The fixed cache capacity.
050 */
051 private final int capacity = (int) Math.ceil(this.cacheSize / this.loadFactor) + 1;
052
053 /**
054 * The map that implements the LRU cache.
055 */
056 private final Map<Class<?>, FromAnnotationsRuleSet> data =
057 new LinkedHashMap<Class<?>, FromAnnotationsRuleSet>(capacity, loadFactor) {
058
059 /**
060 * This class serialVersionUID.
061 */
062 private static final long serialVersionUID = 1L;
063
064 /**
065 * {@inheritDoc}
066 */
067 @Override
068 protected boolean removeEldestEntry(Map.Entry<Class<?>, FromAnnotationsRuleSet> eldest) {
069 return size() > cacheSize;
070 }
071 };
072
073 /**
074 * Returns true if this cache contains a mapping for the specified key.
075 *
076 * @param key key whose presence in this map is to be tested.
077 * @return true if this map contains a mapping for the specified key, false
078 * otherwise.
079 */
080 public boolean containsKey(Class<?> key) {
081 checkKey(key);
082 return this.data.containsKey(key);
083 }
084
085 /**
086 * Returns the value to which the specified key is cached, or null if this
087 * cache contains no mapping for the key.
088 *
089 * Key parameter must not be null.
090 *
091 * @param key the key has to be checked it is present, it must not be null.
092 * @return the value to which the specified key is cached, null if this
093 * cache contains no mapping for the key.
094 */
095 public FromAnnotationsRuleSet get(Class<?> key) {
096 checkKey(key);
097 return this.data.get(key);
098 }
099
100 /**
101 * Associates the specified value with the specified key in this cache.
102 *
103 * Key parameter must not be null.
104 *
105 * @param key key with which the specified value is to be associated.
106 * @param value value to be associated with the specified key.
107 */
108 public void put(Class<?> key, FromAnnotationsRuleSet value) {
109 checkKey(key);
110 this.data.put(key, value);
111 }
112
113 /**
114 * Verify that a key is not null.
115 *
116 * @param <T> the generic key type.
117 * @param key the key object.
118 */
119 private static void checkKey(Class<?> key) {
120 if (key == null) {
121 throw new IllegalArgumentException("null keys not supported");
122 }
123 }
124
125 }