001    /*
002     * Copyright (C) The Apache Software Foundation. All rights reserved.
003     *
004     * This software is published under the terms of the Apache Software License
005     * version 1.1, a copy of which has been included with this distribution in
006     * the LICENSE file.
007     * 
008     * $Id: Lock.java 155459 2005-02-26 13:24:44Z dirkv $
009     */
010    package org.apache.commons.messenger;
011    
012    import javax.jms.JMSException;
013    
014    /** <p><code>Lock</code> is a simple lock.
015      *
016      * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
017      * @version $Revision: 155459 $
018      */
019    public class Lock {
020    
021        private Thread owner;
022        private int count;
023    
024        /**
025         * Acquires the lock, blocking until the lock can be acquired
026         * @throws InterruptedException
027         */
028        public void acquire() {
029            Thread caller = Thread.currentThread();
030            synchronized (this) {
031                if (caller == owner) {
032                    count++;
033                }
034                else {
035                    while (owner != null) {
036                        try {
037                            wait();
038                        }
039                        catch (InterruptedException ex) {
040                            // ignore
041                        }
042                    }
043                    owner = caller;
044                    count = 1;
045                    
046    //                System.out.println("Lock: " + this + " acquired by + "+ caller );
047    //                new Exception().printStackTrace();
048                }
049            }
050        }
051    
052        /**
053         * Release the lock.
054         **/
055        public synchronized void release() throws JMSException {
056            if (Thread.currentThread() != owner) {
057                throw new JMSException("Cannot release lock - not the current owner");
058            }
059            else {
060                if (--count == 0) {
061    //                System.out.println("Lock: " + this + " released by + "+ owner );
062    //                new Exception().printStackTrace();
063    
064                    owner = null;
065    
066                    notify();
067                }
068            }
069        }
070    
071        /**
072         * @return
073         */
074        public synchronized boolean hasLock() {
075            return Thread.currentThread() == owner;
076        }
077    }