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.bag;
017:
018: import java.util.Set;
019:
020: import org.apache.commons.collections.Bag;
021: import org.apache.commons.collections.collection.SynchronizedCollection;
022: import org.apache.commons.collections.set.SynchronizedSet;
023:
024: /**
025: * Decorates another <code>Bag</code> to synchronize its behaviour
026: * for a multi-threaded environment.
027: * <p>
028: * Methods are synchronized, then forwarded to the decorated bag.
029: * Iterators must be separately synchronized around the loop.
030: * <p>
031: * This class is Serializable from Commons Collections 3.1.
032: *
033: * @since Commons Collections 3.0
034: * @version $Revision: 155406 $ $Date: 2005-02-26 12:55:26 +0000 (Sat, 26 Feb 2005) $
035: *
036: * @author Stephen Colebourne
037: */
038: public class SynchronizedBag extends SynchronizedCollection implements
039: Bag {
040:
041: /** Serialization version */
042: private static final long serialVersionUID = 8084674570753837109L;
043:
044: /**
045: * Factory method to create a synchronized bag.
046: *
047: * @param bag the bag to decorate, must not be null
048: * @return a new synchronized Bag
049: * @throws IllegalArgumentException if bag is null
050: */
051: public static Bag decorate(Bag bag) {
052: return new SynchronizedBag(bag);
053: }
054:
055: //-----------------------------------------------------------------------
056: /**
057: * Constructor that wraps (not copies).
058: *
059: * @param bag the bag to decorate, must not be null
060: * @throws IllegalArgumentException if bag is null
061: */
062: protected SynchronizedBag(Bag bag) {
063: super (bag);
064: }
065:
066: /**
067: * Constructor that wraps (not copies).
068: *
069: * @param bag the bag to decorate, must not be null
070: * @param lock the lock to use, must not be null
071: * @throws IllegalArgumentException if bag is null
072: */
073: protected SynchronizedBag(Bag bag, Object lock) {
074: super (bag, lock);
075: }
076:
077: /**
078: * Gets the bag being decorated.
079: *
080: * @return the decorated bag
081: */
082: protected Bag getBag() {
083: return (Bag) collection;
084: }
085:
086: //-----------------------------------------------------------------------
087: public boolean add(Object object, int count) {
088: synchronized (lock) {
089: return getBag().add(object, count);
090: }
091: }
092:
093: public boolean remove(Object object, int count) {
094: synchronized (lock) {
095: return getBag().remove(object, count);
096: }
097: }
098:
099: public Set uniqueSet() {
100: synchronized (lock) {
101: Set set = getBag().uniqueSet();
102: return new SynchronizedBagSet(set, lock);
103: }
104: }
105:
106: public int getCount(Object object) {
107: synchronized (lock) {
108: return getBag().getCount(object);
109: }
110: }
111:
112: //-----------------------------------------------------------------------
113: /**
114: * Synchronized Set for the Bag class.
115: */
116: class SynchronizedBagSet extends SynchronizedSet {
117: /**
118: * Constructor.
119: * @param set the set to decorate
120: * @param lock the lock to use, shared with the bag
121: */
122: SynchronizedBagSet(Set set, Object lock) {
123: super(set, lock);
124: }
125: }
126:
127: }
|