/******************************************************************************* * 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; /** * Class encapsulates data structure, method invocations are synchronized by a * Lockable object. */ public class LockedStructure extends DataStructure implements Lockable { /** data structure to be synchronized */ DataStructure dataToSynchronize; /** lock **/ Lockable lock; /** * Constructor. * * @param data data structure which will be encapsulated by this. * @param lock Lock for access synchronization. */ public LockedStructure(DataStructure data, Lockable lock) { this.dataToSynchronize = data; this.lock = lock; } /** * Constructor. * * @param data data structure which will be encapsulated by this. */ public LockedStructure(DataStructure data) { this.dataToSynchronize = data; this.lock = new LockSupport(); } // ======================= 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(); } // ======================== DATA STRUCTURE ========================== /** * Manual synchronization of iterator necessary. */ public Iterator iterator() { return dataToSynchronize.iterator(); } public int size() { lock.sharedLock(); try { return dataToSynchronize.size(); } finally { lock.releaseSharedLock(); } } public boolean contains(Object obj) { lock.sharedLock(); try { return dataToSynchronize.contains(obj); } finally { lock.releaseSharedLock(); } } public boolean remove(Object obj) { lock.exclusiveLock(); try { return dataToSynchronize.remove(obj); } finally { lock.releaseExclusiveLock(); } } public void clear() { lock.exclusiveLock(); try { dataToSynchronize.clear(); } finally { lock.releaseExclusiveLock(); } } public boolean add(Object obj) { lock.exclusiveLock(); try { return dataToSynchronize.add(obj); } finally { lock.releaseExclusiveLock(); } } public boolean addAll(DataStructure data) { lock.exclusiveLock(); try { return dataToSynchronize.addAll(data); } finally { lock.releaseExclusiveLock(); } } public boolean containsAll(DataStructure data) { lock.sharedLock(); try { return dataToSynchronize.containsAll(data); } finally { lock.releaseSharedLock(); } } public boolean isEmpty() { lock.sharedLock(); try { return dataToSynchronize.isEmpty(); } finally { lock.releaseSharedLock(); } } public Object[] toArray() { lock.sharedLock(); try { return dataToSynchronize.toArray(); } finally { lock.releaseSharedLock(); } } public Object[] toArray(Object[] object) { lock.sharedLock(); try { return dataToSynchronize.toArray(object); } finally { lock.releaseSharedLock(); } } // ------------------------- OVERRIDDEN OBJECT METHODS // ------------------------------------ /* * (non-Javadoc) * @see java.lang.Object#hashCode() */ public int hashCode() { lock.sharedLock(); try { return dataToSynchronize.hashCode(); } finally { lock.releaseSharedLock(); } } /* * (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ public boolean equals(Object o) { lock.sharedLock(); try { return dataToSynchronize.equals(o); } finally { lock.releaseSharedLock(); } } /* * (non-Javadoc) * @see java.lang.Object#toString() */ public String toString() { lock.sharedLock(); try { return dataToSynchronize.toString(); } finally { lock.releaseSharedLock(); } } }