/**
* Copyright (c) 2014, the Railo Company Ltd.
* Copyright (c) 2015, Lucee Assosication Switzerland
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* 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, see <http://www.gnu.org/licenses/>.
*
*/
package lucee.commons.collection;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Collection;
import java.util.Iterator;
public class SyncCollection<E> implements Collection<E>, Serializable {
private static final long serialVersionUID = 3053995032091335093L;
final Collection<E> c; // Backing Collection
final Object mutex; // Object on which to synchronize
SyncCollection(Collection<E> c) {
if (c==null)
throw new NullPointerException();
this.c = c;
mutex = this;
}
SyncCollection(Collection<E> c, Object mutex) {
this.c = c;
this.mutex = mutex;
}
@Override
public int size() {
synchronized (mutex) {return c.size();}
}
@Override
public boolean isEmpty() {
synchronized (mutex) {return c.isEmpty();}
}
@Override
public boolean contains(Object o) {
synchronized (mutex) {return c.contains(o);}
}
@Override
public Object[] toArray() {
synchronized (mutex) {return c.toArray();}
}
@Override
public <T> T[] toArray(T[] a) {
synchronized (mutex) {return c.toArray(a);}
}
@Override
public Iterator<E> iterator() {
return c.iterator(); // Must be manually synched by user!
}
@Override
public boolean add(E e) {
synchronized (mutex) {return c.add(e);}
}
@Override
public boolean remove(Object o) {
synchronized (mutex) {return c.remove(o);}
}
@Override
public boolean containsAll(Collection<?> coll) {
synchronized (mutex) {return c.containsAll(coll);}
}
@Override
public boolean addAll(Collection<? extends E> coll) {
synchronized (mutex) {return c.addAll(coll);}
}
@Override
public boolean removeAll(Collection<?> coll) {
synchronized (mutex) {return c.removeAll(coll);}
}
@Override
public boolean retainAll(Collection<?> coll) {
synchronized (mutex) {return c.retainAll(coll);}
}
@Override
public void clear() {
synchronized (mutex) {c.clear();}
}
@Override
public String toString() {
synchronized (mutex) {return c.toString();}
}
private void writeObject(ObjectOutputStream s) throws IOException {
synchronized (mutex) {s.defaultWriteObject();}
}
}