You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by mw...@apache.org on 2007/08/17 03:50:49 UTC

svn commit: r566901 - /mina/trunk/core/src/main/java/org/apache/mina/util/CopyOnWriteMap.java

Author: mwebb
Date: Thu Aug 16 18:50:48 2007
New Revision: 566901

URL: http://svn.apache.org/viewvc?view=rev&rev=566901
Log:
new class.  This class will help to maintain information in the LoggingFilter, and ConnectionThrottleFilter.  The purpose of this class is to create a thread-safe class that supports mostly reads from the map, and minimal writes.

Added:
    mina/trunk/core/src/main/java/org/apache/mina/util/CopyOnWriteMap.java

Added: mina/trunk/core/src/main/java/org/apache/mina/util/CopyOnWriteMap.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/util/CopyOnWriteMap.java?view=auto&rev=566901
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/util/CopyOnWriteMap.java (added)
+++ mina/trunk/core/src/main/java/org/apache/mina/util/CopyOnWriteMap.java Thu Aug 16 18:50:48 2007
@@ -0,0 +1,224 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF 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
+ *  
+ *    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 org.apache.mina.util;
+
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+
+/**
+ * A thread-safe version of {@link Map} in which all operations that change the 
+ * Map are implemented by making a new copy of the underlying Map.
+ * 
+ * While the creation of a new Map can be expensive, this class is designed for
+ * cases in which the primary function is to read data from the Map, not to 
+ * modify the Map.  Therefore the operations that do not cause a change to this 
+ * class happen quickly and concurrently.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class CopyOnWriteMap<K, V> implements Map<K, V>, Cloneable
+{
+    private HashMap<K, V> internalMap;
+
+    /**
+     * Creates a new instance of CopyOnWriteMap.
+     *
+     */
+    public CopyOnWriteMap()
+    {
+        internalMap = new HashMap<K,V>();
+    }
+
+
+    /**
+     * Creates a new instance of CopyOnWriteMap in which the
+     * initial data being held by this map is contained in
+     * the supplied map.
+     *
+     * @param internalMap
+     *  A Map containing the initial contents to be placed into
+     *  this class.
+     */
+    public CopyOnWriteMap( Map<K, V> data )
+    {
+        internalMap = new HashMap<K,V>( data );
+    }
+
+    /**
+     * Adds the provided key and value to this map.
+     * 
+     * @see java.util.Map#put(java.lang.Object, java.lang.Object)
+     */
+    @SuppressWarnings("unchecked")
+    public V put( K key, V value )
+    {
+        synchronized( this ){
+            HashMap<K,V> newMap = (HashMap<K, V>)internalMap.clone();
+            V val = newMap.put( key, value );
+            internalMap = newMap;
+            return val;
+        }
+    }
+
+
+    /**
+     * Removed the value and key from this map based on the
+     * provided key.
+     * 
+     * @see java.util.Map#remove(java.lang.Object)
+     */
+    @SuppressWarnings("unchecked")
+    public V remove( Object key )
+    {
+        synchronized( this ){
+            HashMap<K,V> newMap = (HashMap<K,V>)internalMap.clone();
+            V val = newMap.remove( key );
+            internalMap = newMap;
+            return val;
+        }
+    }
+
+
+    /**
+     * Inserts all the keys and values contained in the
+     * provided map to this map.
+     * 
+     * @see java.util.Map#putAll(java.util.Map)
+     */
+    @SuppressWarnings("unchecked")
+    public void putAll( Map<? extends K, ? extends V> newData )
+    {
+        synchronized( this ){
+            HashMap<K,V> newMap = (HashMap<K,V>)internalMap.clone();
+            newMap.putAll( newData );
+            internalMap = newMap;
+        }
+    }
+
+
+    /**
+     * Removes all entries in this map.
+     * 
+     * @see java.util.Map#clear()
+     */
+    @SuppressWarnings("unchecked")
+    public void clear()
+    {
+        synchronized( this ){
+            HashMap<K,V> newMap = (HashMap<K,V>)internalMap.clone();
+            newMap.clear();
+            internalMap = newMap;
+        }
+    }
+
+
+    // ==============================================
+    // ==== Below are methods that do not modify ====
+    // ====         the internal Maps            ====
+    // ==============================================
+    /**
+     * Returns the number of key/value pairs in this map.
+     * 
+     * @see java.util.Map#size()
+     */
+    public int size()
+    {
+        return internalMap.size();
+    }
+
+
+    /**
+     * Returns true if this map is empty, otherwise false.
+     * 
+     * @see java.util.Map#isEmpty()
+     */
+    public boolean isEmpty()
+    {
+        return internalMap.isEmpty();
+    }
+
+
+    /**
+     * Returns true if this map contains the provided key, otherwise
+     * this method return false.
+     * 
+     * @see java.util.Map#containsKey(java.lang.Object)
+     */
+    public boolean containsKey( Object key )
+    {
+        return internalMap.containsKey( key );
+    }
+
+
+    /**
+     * Returns true if this map contains the provided value, otherwise
+     * this method returns false.
+     * 
+     * @see java.util.Map#containsValue(java.lang.Object)
+     */
+    public boolean containsValue( Object value )
+    {
+        return internalMap.containsValue( value );
+    }
+
+
+    /**
+     * Returns the value associated with the provided key from this
+     * map.
+     * 
+     * @see java.util.Map#get(java.lang.Object)
+     */
+    public V get( Object key )
+    {
+        return internalMap.get( key );
+    }
+
+
+    /**
+     * This method will return a read-only {@link Set}.
+     */
+    public Set<K> keySet()
+    {
+        return internalMap.keySet();
+    }
+
+
+    /**
+     * This method will return a read-only {@link Collection}.
+     */
+    public Collection<V> values()
+    {
+        return internalMap.values();
+    }
+
+
+    /**
+     * This method will return a read-only {@link Set}.
+     */
+    public Set<Entry<K, V>> entrySet()
+    {
+        return internalMap.entrySet();
+    }
+}
\ No newline at end of file