Author: nbelaevski
Date: 2008-03-17 15:50:23 -0400 (Mon, 17 Mar 2008)
New Revision: 6881
Added:
trunk/framework/impl/src/main/java/org/richfaces/util/
trunk/framework/impl/src/main/java/org/richfaces/util/ReferenceMap.java
Log:
SuggestionBox: optimization - tokens cache added
Added: trunk/framework/impl/src/main/java/org/richfaces/util/ReferenceMap.java
===================================================================
--- trunk/framework/impl/src/main/java/org/richfaces/util/ReferenceMap.java
(rev 0)
+++ trunk/framework/impl/src/main/java/org/richfaces/util/ReferenceMap.java 2008-03-17
19:50:23 UTC (rev 6881)
@@ -0,0 +1,159 @@
+/**
+ * License Agreement.
+ *
+ * JBoss RichFaces - Ajax4jsf Component Library
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package org.richfaces.util;
+
+import java.lang.ref.Reference;
+import java.lang.ref.ReferenceQueue;
+import java.lang.ref.SoftReference;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Created 17.03.2008
+ * @author Nick Belaevski
+ * @since 3.2
+ */
+
+public class ReferenceMap<K, V> implements Map<K, V> {
+
+ private Map<K, ReferenceMapSoftReference<K, V>> map = new HashMap<K,
ReferenceMapSoftReference<K, V>>();
+
+ private ReferenceQueue<V> queue = new ReferenceQueue<V>();
+
+ private void purge() {
+ Reference<? extends V> reference = null;
+ while ((reference = queue.poll()) != null) {
+ ReferenceMapSoftReference<?, ?> entry = (ReferenceMapSoftReference<?,
?>) reference;
+ entry.clear();
+ map.remove(entry.getKey());
+ }
+ }
+
+ public void clear() {
+ map.clear();
+ while (queue.poll() != null) {
+ //release queue entries
+ }
+ }
+
+ public boolean containsKey(Object key) {
+ purge();
+
+ return map.containsKey(key);
+ }
+
+ public boolean containsValue(Object value) {
+ throw new UnsupportedOperationException();
+ }
+
+ public Set<java.util.Map.Entry<K, V>> entrySet() {
+ throw new UnsupportedOperationException();
+ }
+
+ public V get(Object key) {
+ purge();
+
+ ReferenceMapSoftReference<K,V> reference = map.get(key);
+ if (reference != null) {
+ return reference.get();
+ }
+
+ return null;
+ }
+
+ public boolean isEmpty() {
+ purge();
+
+ return map.isEmpty();
+ }
+
+ public Set<K> keySet() {
+ purge();
+
+ return map.keySet();
+ }
+
+ private V doPut(K key, V value) {
+ ReferenceMapSoftReference<K,V> reference = map.put(key,
+ new ReferenceMapSoftReference<K, V>(key, value, queue));
+
+ if (reference != null) {
+ return reference.get();
+ }
+
+ return null;
+ }
+
+ public V put(K key, V value) {
+ purge();
+
+ return doPut(key, value);
+ }
+
+ public void putAll(Map<? extends K, ? extends V> t) {
+ purge();
+
+ for (Map.Entry<? extends K, ? extends V> entry: t.entrySet()) {
+ doPut(entry.getKey(), entry.getValue());
+ }
+ }
+
+ public V remove(Object key) {
+ purge();
+
+ ReferenceMapSoftReference<K,V> reference = map.remove(key);
+ if (reference != null) {
+ return reference.get();
+ }
+
+ return null;
+ }
+
+ public int size() {
+ purge();
+
+ return map.size();
+ }
+
+ public Collection<V> values() {
+ throw new UnsupportedOperationException();
+ }
+}
+
+class ReferenceMapSoftReference<K, V> extends SoftReference<V> {
+ private K key;
+
+ public K getKey() {
+ return key;
+ }
+
+ public ReferenceMapSoftReference(K key, V value) {
+ this(key, value, null);
+ }
+
+ public ReferenceMapSoftReference(K key, V value, ReferenceQueue<? super V>
queue) {
+ super(value, queue);
+ this.key = key;
+ }
+}
\ No newline at end of file