View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership. The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License. You may obtain a copy of the License at
9    * 
10   *      http://www.apache.org/licenses/LICENSE-2.0
11   * 
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   */
18  
19  package net.jini.lease;
20  
21  import java.io.IOException;
22  import java.util.EventObject;
23  import net.jini.core.lease.Lease;
24  import net.jini.core.lease.LeaseException;
25  import org.apache.river.api.io.AtomicSerial;
26  import org.apache.river.api.io.AtomicSerial.GetArg;
27  
28  /**
29   * Event generated when a <code>LeaseRenewalManager</code> cannot renew
30   * a lease.
31   * <p>
32   * The <code>LeaseRenewalEvent</code> instances are sent to the
33   * <code>LeaseListener</code> (if any) associated with a given lease
34   * when the lease was added to the managed set. These events are
35   * typically generated because one of the following conditions occur:
36   * <ul>
37   *   <li> After successfully renewing a lease any number of times and
38   *	  experiencing no failures, the <code>LeaseRenewalManager</code>
39   *	  determines, prior to the next renewal attempt, that the actual
40   *	  expiration time of the lease has passed, implying that any
41   *	  further attempt to renew the lease would be fruitless.
42   *   <li> An indefinite exception occurs during each attempt to renew a
43   *	  lease, from the point that the first such exception occurs
44   *	  until the point when the <code>LeaseRenewalManager</code>
45   *	  determines that lease's actual expiration time has passed.
46   *   <li> A definite exception occurs during a lease renewal attempt.
47   * </ul>
48   * <p>
49   * Note that bad object exceptions, bad invocation exceptions, and
50   * <code>LeaseException</code>s are all considered definite
51   * exceptions.
52   * <p>
53   * This class encapsulates information about both the lease for which the
54   * failure occurred, as well as information about the condition that
55   * caused the renewal attempt to fail.
56   * <p>
57   * This class is a subclass of the class <code>EventObject</code>,
58   * adding the following additional items of abstract state:
59   * <ul>
60   *   <li> The lease on which the renewal attempt failed, and to which
61   *	  the event pertains
62   *   <li> The desired expiration time of the affected lease
63   *   <li> The <code>Throwable</code> associated with the last renewal
64   *	  attempt (if any)
65   * </ul>
66   * <p>
67   * In addition to the methods of the <code>EventObject</code> class,
68   * this class defines methods through which this additional state may be
69   * retrieved.
70   * <p>
71   * The source associated with a <code>LeaseRenewalEvent</code> will be
72   * the <code>LeaseRenewalManager</code> that generated the event.
73   *
74   * @author Sun Microsystems, Inc.
75   * @see Lease
76   * @see LeaseException
77   * @see LeaseRenewalManager
78   * @see LeaseListener
79   * @see EventObject
80   */
81  @AtomicSerial
82  public class LeaseRenewalEvent extends EventObject {
83      private static final long serialVersionUID = -626399341646348302L;
84  
85      /**
86       * The failed lease.
87       *
88       * @serial
89       */
90      private final Lease lease;
91  
92      /**
93       * The desired expiration of the failed lease.
94       *
95       * @serial
96       */
97      private final long expiration;
98  
99      /**
100      * The exception that caused the failure, if any.
101      *
102      * @serial
103      */
104     private final Throwable ex;
105 
106     /** 
107      * Constructs an instance of this class with the specified state.
108      *
109      * @param source reference to the instance of the
110      *	      <code>LeaseRenewalManager</code> that generated the event
111      * @param lease the lease to which the event pertains
112      * @param expiration the desired expiration time for the affected
113      *	      lease
114      * @param ex the <code>Throwable</code> associated with the last
115      *	      renewal attempt (if any)
116      * @see Lease
117      * @see LeaseRenewalManager
118      */
119     public LeaseRenewalEvent(LeaseRenewalManager source,
120 			     Lease lease,
121 			     long expiration,
122 			     Throwable ex) 
123     {
124 	super(source);
125 	this.lease = lease;
126 	this.expiration = expiration;
127 	this.ex = ex;
128     }
129     
130     public LeaseRenewalEvent(GetArg arg) throws IOException{
131 	this(null, 
132 	     arg.get("lease", null, Lease.class), 
133 	     arg.get("expiration", 0L),
134 	     arg.get("ex", null, Throwable.class)
135 	);
136     }
137 
138     /** 
139      * Returns a reference to the lease to which the event pertains.
140      *
141      * @return the <code>Lease</code> object corresponding to the lease
142      *	       on which the renewal attempt failed
143      * @see Lease
144      */
145     public Lease getLease() {
146 	return lease;
147     }
148 
149     /** 
150      * Returns the desired expiration time of the lease to which event
151      * pertains.
152      *
153      * @return a <code>long</code> value that represents the desired
154      *	       expiration time of the lease on which the renewal attempt
155      *	       failed
156      */
157     public long getExpiration() {
158 	return expiration;
159     }
160 
161     /** 
162      * Returns the exception (if any) that caused the event to be sent.
163      * The conditions under which the event may be sent, and the related
164      * values returned by this method, are as follows:
165      * <ul>
166      *
167      * <li> When any lease in the managed set has passed its actual
168      *	    expiration time, and either the most recent renewal attempt
169      *	    was successful or there have been no renewal attempts, the
170      *	    <code>LeaseRenewalManager</code> will cease any further
171      *	    attempts to renew the lease, and will send a
172      *	    <code>LeaseRenewalEvent</code> with no associated exception.
173      *	    In this case, invoking this method will return
174      *	    <code>null</code>.
175      * <li> For any lease from the managed set for which the most recent
176      *	    renewal attempt was unsuccessful because of the occurrence
177      *	    of a indefinite exception, the
178      *	    <code>LeaseRenewalManager</code> will continue to attempt to
179      *	    renew the affected lease at the appropriate times until: the
180      *	    renewal succeeds, the lease's expiration time has passed, or
181      *	    a renewal attempt throws a definite exception. If a definite
182      *	    exception is thrown or the lease expires, the
183      *	    <code>LeaseRenewalManager</code> will cease any further
184      *	    attempts to renew the lease, and will send a
185      *	    <code>LeaseRenewalEvent</code> containing the exception
186      *	    associated with the last renewal attempt.
187      * <li> If, while attempting to renew a lease from the managed set,
188      *	    a definite exception is encountered, the
189      *	    <code>LeaseRenewalManager</code> will cease any further
190      *	    attempts to renew the lease, and will send a
191      *	    <code>LeaseRenewalEvent</code> containing the particular
192      *	    exception that occurred.
193      * </ul>
194      *
195      * @return an instance of <code>Throwable</code> or
196      *	       <code>null</code>, indicating the condition that caused
197      *	       the <code>LeaseRenewalManager</code> to fail to renew the
198      *	       affected lease
199      */
200     public Throwable getException() {
201 	return ex;
202     }
203 }