/******************************************************************************* * Copyright (c) 2009 MATERNA Information & Communications. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html. For further * project-related information visit http://www.ws4d.org. The most recent * version of the JMEDS framework can be obtained from * http://sourceforge.net/projects/ws4d-javame. ******************************************************************************/ package org.ws4d.java.structures; import org.ws4d.java.concurrency.LockSupport; import org.ws4d.java.concurrency.Lockable; /** * Synchronized List Class, uses lockSupport for synchronization. * * @author mspies */ public class LockedList extends List implements Lockable { /** lock **/ private Lockable lock; /** list to be synchronized */ private List listToSynchronize; /** * Constructor. A new ArrayList will be created and synchronized. */ public LockedList() { this(new ArrayList()); } /** * Constructor. * * @param list List, which should be synchronized */ public LockedList(List list) { this(list, new LockSupport()); } /** * Constructor. * * @param list List, which should be synchronized * @param lock Lock for access synchronization. */ public LockedList(List list, Lockable lock) { this.lock = lock; listToSynchronize = list; } // ------------------------------ LOCKABLE ------------------------------ /* * (non-Javadoc) * @see org.ws4d.java.concurrency.locks.Lockable#sharedLock() */ public void sharedLock() { lock.sharedLock(); } /* * (non-Javadoc) * @see org.ws4d.java.concurrency.locks.Lockable#exclusiveLock() */ public void exclusiveLock() { lock.exclusiveLock(); } /* * (non-Javadoc) * @see org.ws4d.java.concurrency.locks.Lockable#releaseSharedLock() */ public void releaseSharedLock() { lock.releaseSharedLock(); } /* * (non-Javadoc) * @see org.ws4d.java.concurrency.locks.Lockable#releaseExclusiveLock() */ public boolean releaseExclusiveLock() { return lock.releaseExclusiveLock(); } /* * (non-Javadoc) * @see org.ws4d.java.concurrency.locks.Lockable#tryExclusiveLock() */ public boolean tryExclusiveLock() { return lock.tryExclusiveLock(); } /* * (non-Javadoc) * @see org.ws4d.java.concurrency.locks.Lockable#trySharedLock() */ public boolean trySharedLock() { return lock.trySharedLock(); } // ---------------------------- OVERRIDDEN SET METHODS // ------------------------------- public void add(int index, Object obj) { try { lock.exclusiveLock(); listToSynchronize.add(index, obj); } finally { lock.releaseExclusiveLock(); } } public boolean addAll(int index, DataStructure data) { try { lock.exclusiveLock(); return listToSynchronize.addAll(index, data); } finally { lock.releaseExclusiveLock(); } } public Object get(int index) { try { lock.sharedLock(); return listToSynchronize.get(index); } finally { lock.releaseSharedLock(); } } public int indexOf(Object obj) { try { lock.sharedLock(); return listToSynchronize.indexOf(obj); } finally { lock.releaseSharedLock(); } } public int lastIndexOf(Object obj) { try { lock.sharedLock(); return listToSynchronize.lastIndexOf(obj); } finally { lock.releaseSharedLock(); } } public ListIterator listIterator() { try { lock.sharedLock(); return listToSynchronize.listIterator(); } finally { lock.releaseSharedLock(); } } public ListIterator listIterator(int index) { try { lock.sharedLock(); return listToSynchronize.listIterator(index); } finally { lock.releaseSharedLock(); } } public Object remove(int index) { try { lock.exclusiveLock(); return listToSynchronize.remove(index); } finally { lock.releaseExclusiveLock(); } } public Object set(int index, Object obj) { try { lock.exclusiveLock(); return listToSynchronize.set(index, obj); } finally { lock.releaseExclusiveLock(); } } public List subList(int fromIndex, int toIndex) { try { lock.sharedLock(); return listToSynchronize.subList(fromIndex, toIndex); } finally { lock.releaseExclusiveLock(); } } // ------------------------------ OVERRIDDEN DATA STRUCTURE // METHODS--------------------------- /** * Manual synchronization of iterator necessary. */ public Iterator iterator() { return listToSynchronize.iterator(); } public int size() { lock.sharedLock(); try { return listToSynchronize.size(); } finally { lock.releaseSharedLock(); } } public boolean contains(Object obj) { lock.sharedLock(); try { return listToSynchronize.contains(obj); } finally { lock.releaseSharedLock(); } } public boolean remove(Object obj) { lock.exclusiveLock(); try { return listToSynchronize.remove(obj); } finally { lock.releaseExclusiveLock(); } } public void clear() { lock.exclusiveLock(); try { listToSynchronize.clear(); } finally { lock.releaseExclusiveLock(); } } public boolean add(Object obj) { lock.exclusiveLock(); try { return listToSynchronize.add(obj); } finally { lock.releaseExclusiveLock(); } } public boolean addAll(DataStructure data) { lock.exclusiveLock(); try { return listToSynchronize.addAll(data); } finally { lock.releaseExclusiveLock(); } } public boolean containsAll(DataStructure data) { lock.sharedLock(); try { return listToSynchronize.containsAll(data); } finally { lock.releaseSharedLock(); } } public boolean isEmpty() { lock.sharedLock(); try { return listToSynchronize.isEmpty(); } finally { lock.releaseSharedLock(); } } public Object[] toArray() { lock.sharedLock(); try { return listToSynchronize.toArray(); } finally { lock.releaseSharedLock(); } } public Object[] toArray(Object[] object) { lock.sharedLock(); try { return listToSynchronize.toArray(object); } finally { lock.releaseSharedLock(); } } // ------------------------- OVERRIDDEN OBJECT METHODS // ------------------------------------ /* * (non-Javadoc) * @see java.lang.Object#hashCode() */ public int hashCode() { lock.sharedLock(); try { return listToSynchronize.hashCode(); } finally { lock.releaseSharedLock(); } } /* * (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ public boolean equals(Object o) { lock.sharedLock(); try { return listToSynchronize.equals(o); } finally { lock.releaseSharedLock(); } } /* * (non-Javadoc) * @see java.lang.Object#toString() */ public String toString() { lock.sharedLock(); try { return listToSynchronize.toString(); } finally { lock.releaseSharedLock(); } } }