/*
 * 
 * Copyright 2004 Sun Microsystems, Inc. All Rights Reserved.
 * 
 * The contents of this file are subject to the Sun Community Source
 * License v3.0/Jini Technology Specific Attachment v 1.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://wwws.sun.com/software/jini/licensing/SCSL3_JiniTSA1.html.
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
 * the License for the specific language governing rights and limitations
 * under the License.
 * 
 * The Reference Code is Jini Technology Core Platform code, v2.0. The
 * Developer of the Reference Code is Sun Microsystems, Inc.
 * 
 * Contributor(s): Sun Microsystems, Inc.
 * 
 */

package net.jini.core.lease;

import java.rmi.RemoteException;

/**
 * The Lease interface defines a type of object that is returned to the
 * lease holder and issued by the lease grantor.  Particular instances of
 * the Lease type will be created by the grantors of a lease, and returned
 * to the holder of the lease as part of the return value from a call that
 * allocates a leased resource.  The call that requests a leased resource
 * will typically include a requested duration for the lease.  If the request
 * is for a particular duration, the lease grantor is required to grant a
 * lease of no more than the requested period of time. A lease may be granted
 * for a period of time shorter than that requested.
 *
 * @author Sun Microsystems, Inc.
 *
 * @since 1.0
 */
public interface Lease {

    /** 
     * Used to request a lease that never expires. 
     */
    long FOREVER = Long.MAX_VALUE;

    /**
     * Used by the requestor to indicate that there is no particular lease
     * time desired, and that the grantor of the lease should supply a time
     * that is most convenient for the grantor.
     */
    long ANY = -1;

    /**
     * The serialized form of the lease will convert the time of lease
     * expiration into a duration (in milliseconds) from the time of
     * serialization.  This form is best used when transmitting a Lease
     * object from one address space to another (via an RMI call) where
     * it cannot be assumed that the address spaces have synchronized clocks.
     */
    int DURATION = 1;

    /**
     * The serialized form of the lease will contain the time of expiration
     * stored as an absolute time, represented in terms of milliseconds since
     * the beginning of the epoch.
     */
    int ABSOLUTE = 2;

    /**
     * Returns the absolute time that the lease will expire, represented as
     * milliseconds from the beginning of the epoch, relative to the local
     * clock.
     * 
     * @return a long value in milliseconds from the beginning of the epoch 
     *         relative to the local clock that represents the absolute time 
     *         that the lease will expire.
     */
    long getExpiration();

    /**
     * Used by the lease holder to indicate that it is no longer interested
     * in the resource or information held by the lease.  If the leased
     * information or resource could cause a callback to the lease holder
     * (or some other object on behalf of the lease holder), the lease
     * grantor should not issue such a callback after the lease has been
     * cancelled.  The overall effect of a cancel call is the same as
     * lease expiration, but instead of happening at the end of a pre-agreed
     * duration it happens immediately.
     *
     * @throws UnknownLeaseException the lease being cancelled is unknown
     *         to the lease grantor
     * @throws RemoteException
     */
    void cancel() throws UnknownLeaseException, RemoteException;

    /**
     * Used to renew a lease for an additional period of time, specified in
     * milliseconds.  This duration is not added to the original lease, but
     * is used to determine a new expiration time for the existing lease.
     * If the renewal is granted this is reflected in value returned by
     * getExpiration.  If the renewal fails, the lease is left intact for
     * the same duration that was in force prior to the call to renew.
     *
     * @param duration the requested duration in milliseconds
     *
     * @throws LeaseDeniedException the lease grantor is unable or
     *         unwilling to renew the lease
     * @throws UnknownLeaseException the lease being renewed is unknown
     *         to the lease grantor
     * @throws RemoteException
     */
    void renew(long duration)
	throws LeaseDeniedException, UnknownLeaseException, RemoteException;

    /**
     * Sets the format to use when serializing the lease.
     *
     * @param format DURATION or ABSOLUTE
     * @see #getSerialFormat
     */
    void setSerialFormat(int format);

    /**
     * Returns the format that will be used to serialize the lease.
     *
     * @return an <tt>int</tt> representing the serial format value
     * @see #setSerialFormat
     */
    int getSerialFormat();

    /**
     * Creates a Map object that can contain leases whose renewal or
     * cancellation can be batched, and adds the current lease to that map.
     * The current lease is put in the map with the duration value given
     * by the parameter.
     *
     * @param duration the duration to put into a Long and use as the
     * value for the current lease in the created LeaseMap
     *
     * @return the created <tt>LeaseMap</tt> object
     */
    LeaseMap createLeaseMap(long duration);

    /**
     * Returns a boolean indicating whether or not the lease given as a
     * parameter can be batched (placed in the same LeaseMap) with the
     * current lease.  Whether or not two Lease objects can be batched
     * is an implementation detail determined by the objects.
     * 
     * @param lease the <tt>Lease</tt> to be evaluated
     * @return a boolean indicating whether or not the lease given as a
     *         parameter can be batched (placed in the same LeaseMap) with 
     *         the current lease
     */
    boolean canBatch(Lease lease);
}
