/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 net.jini.lease; import java.io.IOException; import java.rmi.MarshalledObject; import net.jini.core.lease.Lease; import net.jini.core.event.RemoteEvent; /** * Event generated by a lease renewal set when it can't renew a lease it * is responsible for. * <p> * <code>RenewalFailureEvent</code> is a subclass of * <code>RemoteEvent</code>, adding two additional items of abstract * state: the client lease that could not be renewed before expiration * and the <code>Throwable</code> object that was thrown by the last * renewal attempt (if any). * <p> * The methods of this interface are declared to allow implementations * to defer the unmarshalling of the lease and <code>Throwable</code> * until the client explicitly asks for them. * * @author Sun Microsystems, Inc. * @see LeaseRenewalSet */ public abstract class RenewalFailureEvent extends RemoteEvent { private static final long serialVersionUID = 8891457049195932943L; /** * Simple constructor. Note event id is fixed to * <code>LeaseRenewalSet.RENEWAL_FAILURE_EVENT_ID</code>. * * @param source the <code>LeaseRenewalSet</code> that generated the * event * @param seqNum the sequence number of this event * @param handback the client handback */ public RenewalFailureEvent(LeaseRenewalSet source, long seqNum, MarshalledObject handback) { super(source, LeaseRenewalSet.RENEWAL_FAILURE_EVENT_ID, seqNum, handback); } /** * Returns the lease that could not be renewed. This method may * cause the lease to be unmarshalled. If it does and unmarshalling * fails, future calls will attempt to re-unmarshal the lease. Once * this method succeeds, subsequent calls must return the same * object. * <p> * If the renewal service was able to renew the lease before the * event occurred, the expiration time of the <code>Lease</code> * object returned by this method will reflect the result of the * last successful renewal call. This time may be distorted by clock * skew between hosts if it is currently set to use the * <code>Lease.ABSOLUTE</code> serial format. If the * <code>Lease</code> object is using the * <code>Lease.DURATION</code> serial format, and the implementation * only unmarshals the lease when <code>getLease</code> is called, * the expiration time may be distorted if a long time has passed * between the time the event was generated by the renewal service * and when the client called <code>getLease</code>. When a renewal * failure event is generated for a given lease, that lease is * removed from the set. * * @return the lease that could not be renewed * @throws IOException if there are difficulties unmarshalling the * lease, usually this will be some sort of class mismatch * @throws ClassNotFoundException if there are difficulties * unmarshalling the lease, usually this will indicate one * of the classes associated with the lease's implementation * could not be loaded */ public abstract Lease getLease() throws IOException, ClassNotFoundException; /** * Returns the <code>Throwable</code> (if any) that was thrown by * the last renewal attempt. If <code>null</code> is returned it can * be assumed ether the last renewal attempt succeeded, or that the * renewal service was unable to make a renewal attempt before the * lease expired. * <p> * This method may cause the <code>Throwable</code> to be * unmarshalled. If it does and unmarshalling fails, future calls * will attempt to re-unmarshal the <code>Throwable</code>. Once * this method succeeds, subsequent calls must return the same * object. * * @return the <code>Throwable</code> (if any) that was thrown by * the last renewal attempt * @throws IOException if there are difficulties unmarshalling the * <code>Throwable</code>, usually this will be some sort of * class mismatch * @throws ClassNotFoundException if there are difficulties * unmarshalling the <code>Throwable</code>, usually this * will indicate one of the classes associated with the * implementation of the <code>Throwable</code> could not be * loaded */ public abstract Throwable getThrowable() throws IOException, ClassNotFoundException; }