001: /*
002: * Copyright 2003-2004 The Apache Software Foundation
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package org.apache.commons.collections.map;
017:
018: import java.util.Comparator;
019: import java.util.SortedMap;
020:
021: import org.apache.commons.collections.Predicate;
022:
023: /**
024: * Decorates another <code>SortedMap </code> to validate that additions
025: * match a specified predicate.
026: * <p>
027: * This map exists to provide validation for the decorated map.
028: * It is normally created to decorate an empty map.
029: * If an object cannot be added to the map, an IllegalArgumentException is thrown.
030: * <p>
031: * One usage would be to ensure that no null keys are added to the map.
032: * <pre>SortedMap map = PredicatedSortedSet.decorate(new TreeMap(), NotNullPredicate.INSTANCE, null);</pre>
033: * <p>
034: * <strong>Note that PredicatedSortedMap is not synchronized and is not thread-safe.</strong>
035: * If you wish to use this map from multiple threads concurrently, you must use
036: * appropriate synchronization. The simplest approach is to wrap this map
037: * using {@link java.util.Collections#synchronizedSortedMap}. This class may throw
038: * exceptions when accessed by concurrent threads without synchronization.
039: * <p>
040: * This class is Serializable from Commons Collections 3.1.
041: *
042: * @since Commons Collections 3.0
043: * @version $Revision: 348007 $ $Date: 2005-11-21 22:52:57 +0000 (Mon, 21 Nov 2005) $
044: *
045: * @author Stephen Colebourne
046: * @author Paul Jack
047: */
048: public class PredicatedSortedMap extends PredicatedMap implements
049: SortedMap {
050:
051: /** Serialization version */
052: private static final long serialVersionUID = 3359846175935304332L;
053:
054: /**
055: * Factory method to create a predicated (validating) sorted map.
056: * <p>
057: * If there are any elements already in the list being decorated, they
058: * are validated.
059: *
060: * @param map the map to decorate, must not be null
061: * @param keyPredicate the predicate to validate the keys, null means no check
062: * @param valuePredicate the predicate to validate to values, null means no check
063: * @throws IllegalArgumentException if the map is null
064: */
065: public static SortedMap decorate(SortedMap map,
066: Predicate keyPredicate, Predicate valuePredicate) {
067: return new PredicatedSortedMap(map, keyPredicate,
068: valuePredicate);
069: }
070:
071: //-----------------------------------------------------------------------
072: /**
073: * Constructor that wraps (not copies).
074: *
075: * @param map the map to decorate, must not be null
076: * @param keyPredicate the predicate to validate the keys, null means no check
077: * @param valuePredicate the predicate to validate to values, null means no check
078: * @throws IllegalArgumentException if the map is null
079: */
080: protected PredicatedSortedMap(SortedMap map,
081: Predicate keyPredicate, Predicate valuePredicate) {
082: super (map, keyPredicate, valuePredicate);
083: }
084:
085: //-----------------------------------------------------------------------
086: /**
087: * Gets the map being decorated.
088: *
089: * @return the decorated map
090: */
091: protected SortedMap getSortedMap() {
092: return (SortedMap) map;
093: }
094:
095: //-----------------------------------------------------------------------
096: public Object firstKey() {
097: return getSortedMap().firstKey();
098: }
099:
100: public Object lastKey() {
101: return getSortedMap().lastKey();
102: }
103:
104: public Comparator comparator() {
105: return getSortedMap().comparator();
106: }
107:
108: public SortedMap subMap(Object fromKey, Object toKey) {
109: SortedMap map = getSortedMap().subMap(fromKey, toKey);
110: return new PredicatedSortedMap(map, keyPredicate,
111: valuePredicate);
112: }
113:
114: public SortedMap headMap(Object toKey) {
115: SortedMap map = getSortedMap().headMap(toKey);
116: return new PredicatedSortedMap(map, keyPredicate,
117: valuePredicate);
118: }
119:
120: public SortedMap tailMap(Object fromKey) {
121: SortedMap map = getSortedMap().tailMap(fromKey);
122: return new PredicatedSortedMap(map, keyPredicate,
123: valuePredicate);
124: }
125:
126: }
|