/** 
 * 
 * Copyright 2004 Protique Ltd
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 * you may not use this file except in compliance with the License. 
 * You may obtain a copy of the License at 
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 * See the License for the specific language governing permissions and 
 * limitations under the License. 
 * 
 **/
package org.activemq.message;

/**
 * ReceiptHolder is a utility class used for waiting for receipts from Packets sent to the broker
 * 
 * @version $Revision: 1.1.1.1 $
 */
public class ReceiptHolder {
    protected Receipt receipt;
    protected Object lock = new Object();
    protected boolean notified;

    /**
     * Construct a receipt holder
     */
    public ReceiptHolder() {
    }

    /**
     * Set the Receipt for this holder
     *
     * @param r
     */
    public void setReceipt(Receipt r) {
        synchronized (lock) {
            this.receipt = r;
            notified = true;
            lock.notify();
        }
    }

    /**
     * Get the Receipt
     * 
     * @return the Receipt or null if it is closed
     */
    public Receipt getReceipt() {
        return getReceipt(0);
    }

    /**
     * wait upto <Code>timeout</Code> timeout ms to get a receipt
     *
     * @param timeout
     * @return
     */
    public Receipt getReceipt(int timeout) {
        synchronized (lock) {
            if (!notified) {
                try {
                    lock.wait(timeout);
                }
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        return this.receipt;
    }

    /**
     * close this holder
     */
    public void close() {
        synchronized (lock) {
            notified = true;
            lock.notifyAll();
        }
    }
}
