/*
* 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 com.sun.jini.fiddler;
import com.sun.jini.fiddler.FiddlerAdmin;
import com.sun.jini.fiddler.FiddlerRenewResults;
import net.jini.discovery.LookupDiscoveryRegistration;
import com.sun.jini.proxy.ThrowThis;
import com.sun.jini.start.ServiceProxyAccessor;
import net.jini.id.Uuid;
import net.jini.admin.Administrable;
import net.jini.core.discovery.LookupLocator;
import net.jini.core.event.RemoteEventListener;
import net.jini.core.lease.UnknownLeaseException;
import net.jini.core.lookup.ServiceRegistrar;
import java.io.IOException;
import java.rmi.MarshalledObject;
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
* This interface defines the private protocol between the client-side
* proxy and the server of a lookup discovery service.
* <p>
* The declared methods mirror the methods of the LookupDiscoveryService
* interface. Classes that act as a "smart proxy" to the lookup discovery
* service typically contain a field which implements this interface.
* When the lookup discovery service registers with a lookup service,
* the proxy - containing a "server field" that is an instance of this
* interface - is registered. It is through the server field that the
* proxy interacts with the back-end server of the lookup discovery service,
* on behalf of a client, using the private protocol defined by a class
* that implements this interface.
*
* @author Sun Microsystems, Inc.
*
*/
interface Fiddler extends Remote, Administrable, FiddlerAdmin,
ServiceProxyAccessor
{
/**
* Returns the unique identifier generated (or recovered) by the back-end
* implementation of the lookup discovery service when an instance of
* that service is constructed. This ID is typically used to determine
* equality between the proxies of any two instances of the lookup
* discovery service.
*
* @return the unique ID that was generated (or recovered) by the
* back-end implementation of the lookup discovery service
* at creation time
*
* @throws java.rmi.RemoteException typically, this exception occurs when
* there is a communication failure between the client and the
* lookup discovery service.
*/
Uuid getProxyID() throws RemoteException;
/**
* On behalf of a requesting client, creates a registration with the
* lookup discovery service, which then performs discovery processing
* on behalf of the client.
*
* @param groups String array, none of whose elements may be null,
* consisting of zero or more names of groups to
* which lookup services to discover belong.
*
* @param locators array of zero or more non-null LookupLocator
* objects, each corresponding to a specific lookup
* service to discover.
*
* @param listener a non-null instance of RemoteEventListener. This
* argument specifies the entity that will receive
* events notifying the registration that a lookup
* service of interest has been discovered.
*
* @param handback null or an instance of MarshalledObject. This
* argument specifies an object that will be
* included in the notification event that the
* lookup discovery service sends to the registered
* listener.
*
* @param leaseDuration long value representing the amount of time (in
* milliseconds) for which the resources of the
* lookup discovery service are being requested.
*
* @return an instance of the LookupDiscoveryRegistration interface.
*
* @throws java.rmi.RemoteException typically, this exception occurs when
* there is a communication failure between the client and the
* lookup discovery service. When this exception does occur, the
* registration may or may not have completed successfully.
*
* @see net.jini.discovery.LookupDiscoveryService#register
*/
LookupDiscoveryRegistration register(String[] groups,
LookupLocator[] locators,
RemoteEventListener listener,
MarshalledObject handback,
long leaseDuration)
throws RemoteException;
/**
* Returns an array consisting of instances of the ServiceRegistrar
* interface. Each element in the returned set is a proxy to one of
* the lookup service(s) that have already been discovered for the
* registration corresponding to the <code>registrationID</code>
* parameter. Each element of the return set is a marshalled instance
* of the <code>ServiceRegistrar</code> interface. The contents of the
* returned set make up the 'remote state' of the registration's
* currently discovered lookup service(s).
*
* @param registrationID unique identifier assigned to the registration
* from which the set of registrars is being
* retrieved
*
* @return an array of MarshalledObject objects where each element is
* is a marshalled instance of ServiceRegistrar.
*
* @throws java.rmi.RemoteException typically, this exception occurs when
* there is a communication failure between the client and the
* lookup discovery service.
*
* @throws com.sun.jini.proxy.ThrowThis which is a non-remote "wrapper"
* class used to wrap various remote exceptions (for example,
* NoSuchObjectException) that this method wishes to throw.
* When a service is implemented as a smart proxy with a
* backend server, and a method on the backend which was invoked
* through the proxy wishes to explicitly throw a particular
* remote exception, it cannot simply throw that exception if
* it wishes that exception to be visible to the proxy running
* on the "client side". This is because when the backend throws
* any remote exception, the RMI sub-system automatically wraps
* that exception in a java.rmi.ServerException. Thus, the proxy
* will only be able to "see" the ServerException (the actual
* exception that the backend tried to throw is "buried" in the
* detail field of the ServerException). Thus, in order to allow
* the proxy access to the actual remote exception this method
* throws, that exception wraps the desired remote exception in
* the non-remote exception ThrowThis; which will not be wrapped
* in a ServerException.
*
* This method throws a NoSuchObjectException wrapped in a
* ThrowThis exception whenever the <code>registrationID</code>
* parameter references an invalid or non-existent registration.
*
* @see net.jini.discovery.LookupDiscoveryRegistration#getRegistrars
*/
MarshalledObject[] getRegistrars(Uuid registrationID)
throws RemoteException, ThrowThis;
/**
* Returns an array consisting of the names of the groups whose members
* are lookup services the lookup discovery service will attempt to
* discover for the registration corresponding to the current instance
* of this class. This set of group names is referred to as the
* registration's 'managed set of groups'.
* <p>
* If the registration's managed set of groups is currently empty, then
* the empty array is returned. If the lookup discovery service currently
* has no managed set of groups for the registration through which the
* request is being made, then null will be returned.
*
* @param registrationID unique identifier assigned to the registration
* from which the set of groups is being retrieved
*
* @return a String array containing the elements of the managed set of
* groups for the registration.
*
* @throws java.rmi.RemoteException typically, this exception occurs when
* there is a communication failure between the client and the
* lookup discovery service.
*
* @throws java.rmi.NoSuchObjectException wrapped in an instance of
* com.sun.jini.proxy.ThrowThis exception whenever the
* <code>registrationID</code> parameter references an invalid
* or non-existent registration. Refer to the description of the
* <code>getRegistrars</code> method for more information on
* this exception.
*
* @see net.jini.discovery.LookupDiscoveryRegistration#getGroups
*/
String[] getGroups(Uuid registrationID) throws RemoteException, ThrowThis;
/**
* Returns an array consisting of the the LookupLocator objects
* corresponding to specific lookup services the lookup discovery
* service will attempt to discover for for the registration
* corresponding to the current instance of this class. This set of
* locators is referred to as the registration's 'managed set of locators'.
* <p>
* If the registration's managed set of locators is currently empty, then
* the empty array is returned. If the lookup discovery service currently
* has no managed set of locators for the registration through which the
* request is being made, then null will be returned.
*
* @param registrationID unique identifier assigned to the registration
* from which the set of locators is being retrieved
*
* @return array consisting of net.jini.core.discovery.LookupLocator
* objects corresponding to the elements of the managed set of
* locators for the registration.
*
* @throws java.rmi.RemoteException typically, this exception occurs when
* there is a communication failure between the client and the
* lookup discovery service.
*
* @throws java.rmi.NoSuchObjectException wrapped in an instance of
* com.sun.jini.proxy.ThrowThis exception whenever the
* <code>registrationID</code> parameter references an invalid
* or non-existent registration. Refer to the description of the
* <code>getRegistrars</code> method for more information on
* this exception.
*
* @see net.jini.discovery.LookupDiscoveryRegistration#getLocators
*/
LookupLocator[] getLocators(Uuid registrationID)
throws RemoteException, ThrowThis;
/**
* Adds a set of group names to the managed set of groups associated
* with the registration corresponding to the current instance of
* this class.
*
* @param registrationID unique identifier assigned to the registration
* to which the set of groups being augmented
* corresponds
* @param groups a String array, none of whose elements may be
* null, consisting of the group names with which to
* augment the registration's managed set of groups.
* <p>
* If any element of this parameter duplicates any
* other element of this parameter, the duplicate
* will be ignored. If any element of this parameter
* duplicates any element of the registration's
* current managed set of groups, the duplicate will
* be ignored.
* <p>
* If the empty set is input, then the registration's
* managed set of groups will not change. If null is
* input, this method will throw a
* <code>NullPointerException</code>.
*
* @throws java.lang.IllegalStateException this exception occurs when
* the <code>addGroups</code> method of the discovery
* manager is invoked after the <code>terminate</code> method
* of that manager is called.
*
* @throws java.lang.UnsupportedOperationException this exception occurs
* when the lookup discovery service has no managed set of groups
* associated with the registration.
*
* @throws java.lang.NullPointerException this exception occurs when
* either null is input to the groups parameter, or one or more
* of the elements of the groups parameter is null.
*
* @throws java.rmi.RemoteException typically, this exception occurs when
* there is a communication failure between the client and the
* lookup discovery service. When this exception does occur, the
* registration's managed set of groups may or may not have been
* successfully augmented.
*
* @throws java.rmi.NoSuchObjectException wrapped in an instance of
* com.sun.jini.proxy.ThrowThis exception whenever the
* <code>registrationID</code> parameter references an invalid
* or non-existent registration. Refer to the description of the
* <code>getRegistrars</code> method for more information on
* this exception.
*
* @see net.jini.discovery.LookupDiscoveryRegistration#addGroups
*/
void addGroups(Uuid registrationID,
String[] groups) throws RemoteException,ThrowThis;
/**
* Replaces all of the group names in the managed set of groups
* associated with the registration corresponding to the current
* instance of this class.
*
* @param registrationID unique identifier assigned to the registration
* to which the set of groups being replaced
* corresponds
* @param groups a String array, none of whose elements may be
* null, consisting of the group names with which to
* replace the names in this registration's managed
* set of groups.
* <p>
* If any element of this parameter duplicates any
* other element of this parameter, the duplicate
* will be ignored.
* <p>
* If the empty set is input, then group discovery
* for the registration will cease. If null is input,
* the lookup discovery service will attempt to
* discover all as yet undiscovered lookup services
* located within its multicast radius and, upon
* discovery of any such lookup service, will send
* to the registration's listener an event signaling
* that discovery.
*
* @throws java.lang.IllegalStateException this exception occurs when
* the <code>addGroups</code> method of the discovery
* manager is invoked after the <code>terminate</code> method
* of that manager is called.
*
* @throws java.lang.NullPointerException this exception occurs when one
* or more of the elements of the groups parameter is null.
*
* @throws java.rmi.RemoteException typically, this exception occurs when
* there is a communication failure between the client and the
* lookup discovery service. When this exception does occur, the
* registration's managed set of groups may or may not have been
* successfully replaced.
*
* @throws java.rmi.NoSuchObjectException wrapped in an instance of
* com.sun.jini.proxy.ThrowThis exception whenever the
* <code>registrationID</code> parameter references an invalid
* or non-existent registration. Refer to the description of the
* <code>getRegistrars</code> method for more information on
* this exception.
*
* @see net.jini.discovery.LookupDiscoveryRegistration#setGroups
*/
void setGroups(Uuid registrationID,
String[] groups) throws RemoteException,ThrowThis;
/**
* Deletes a set of group names from the managed set of groups
* associated with the registration corresponding to the current
* instance of this class.
*
* @param registrationID unique identifier assigned to the registration
* to which the set of groups being removed
* corresponds
* @param groups a String array, none of whose elements may be
* null, consisting of the group names to delete
* from the registration's managed set of groups.
* <p>
* If any element of this parameter duplicates any
* other element of this parameter, the duplicate
* will be ignored.
* <p>
* If the empty set is input, the registration's
* managed set of groups will not change. If null is
* input, this method will throw a
* <code>NullPointerException</code>.
*
* @throws java.lang.IllegalStateException this exception occurs when
* the <code>addGroups</code> method of the discovery
* manager is invoked after the <code>terminate</code> method
* of that manager is called.
*
* @throws java.lang.UnsupportedOperationException this exception occurs
* when the lookup discovery service has no managed set of groups
* associated with the registration.
*
* @throws java.lang.NullPointerException this exception occurs when
* either null is input to the groups parameter, or one or more
* of the elements of the groups parameter is null.
*
* @throws java.rmi.RemoteException typically, this exception occurs when
* there is a communication failure between the client and the
* lookup discovery service. When this exception does occur, the
* registration's managed set of groups may or may not have been
* successfully modified.
*
* @throws java.rmi.NoSuchObjectException wrapped in an instance of
* com.sun.jini.proxy.ThrowThis exception whenever the
* <code>registrationID</code> parameter references an invalid
* or non-existent registration. Refer to the description of the
* <code>getRegistrars</code> method for more information on
* this exception.
*
* @see net.jini.discovery.LookupDiscoveryRegistration#removeGroups
*/
void removeGroups(Uuid registrationID,
String[] groups) throws RemoteException,ThrowThis;
/**
* Adds a set of LookupLocator objects to the managed set of locators
* associated with the registration corresponding to the current
* instance of this class.
*
* @param registrationID unique identifier assigned to the registration
* to which the set of locators being augmented
* corresponds
* @param locators an array, none of whose elements may be null,
* consisting of the LookupLocator objects with
* which to augment the registration's managed set
* of locators.
* <p>
* If any element of this parameter duplicates any
* other element of this parameter, the duplicate
* will be ignored. If any element of this parameter
* duplicates any element of the registration's
* managed set of locators, the duplicate will be
* ignored.
* <p>
* If the empty array is input, then the
* registration's managed set of locators will not
* change. If null is input, this method will throw
* a <code>NullPointerException</code>.
*
* @throws java.lang.UnsupportedOperationException this exception occurs
* when the lookup discovery service has no managed set of
* locators associated with the registration.
*
* @throws java.lang.NullPointerException this exception occurs when
* either null is input to the locators parameter, or one or
* more of the elements of the locators parameter is null.
*
* @throws java.rmi.RemoteException typically, this exception occurs when
* there is a communication failure between the client and the
* lookup discovery service. When this exception does occur, the
* registration's managed set of locators may or may not have
* been successfully augmented.
*
* @throws java.rmi.NoSuchObjectException wrapped in an instance of
* com.sun.jini.proxy.ThrowThis exception whenever the
* <code>registrationID</code> parameter references an invalid
* or non-existent registration. Refer to the description of the
* <code>getRegistrars</code> method for more information on
* this exception.
*
* @see net.jini.discovery.LookupDiscoveryRegistration#addLocators
*/
void addLocators(Uuid registrationID,
LookupLocator[] locators) throws RemoteException,
ThrowThis;
/**
* Replaces with a new set of LookupLocator objects, all of the
* elements in the managed set of locators associated with the
* registration corresponding to the current instance of this class.
*
* @param registrationID unique identifier assigned to the registration
* to which the set of locators being replaced
* corresponds
* @param locators an array, none of whose elements may be null,
* consisting of the LookupLocator objects with
* which to replace the locators in the
* registration's managed set of locators.
* <p>
* If any element of this parameter duplicates any
* other element of this parameter, the duplicate
* will be ignored.
* <p>
* If the empty array is input, then locator
* discovery for the registration will cease. If
* null is input, this method will throw a
* <code>NullPointerException</code>.
*
* @throws java.lang.NullPointerException this exception occurs when one
* or more of the elements of the locators parameter is null.
*
* @throws java.rmi.RemoteException typically, this exception occurs when
* there is a communication failure between the client and the
* lookup discovery service. When this exception does occur, the
* registration's managed set of locators may or may not have
* been successfully replaced.
*
* @throws java.rmi.NoSuchObjectException wrapped in an instance of
* com.sun.jini.proxy.ThrowThis exception whenever the
* <code>registrationID</code> parameter references an invalid
* or non-existent registration. Refer to the description of the
* <code>getRegistrars</code> method for more information on
* this exception.
*
* @see net.jini.discovery.LookupDiscoveryRegistration#setLocators
*/
void setLocators(Uuid registrationID,
LookupLocator[] locators) throws RemoteException,
ThrowThis;
/**
* Deletes a set of LookupLocator objects from the managed set of
* locators associated with the registration corresponding to the
* current instance of this class.
*
* @param registrationID unique identifier assigned to the registration
* to which the set of locators being removed
* corresponds
* @param locators an array, none of whose elements may be null,
* consisting of the LookupLocator objects to remove
* from the registration's managed set of locators.
* <p>
* If any element of this parameter duplicates any
* other element of this parameter, the duplicate
* will be ignored.
* <p>
* If the empty set is input, the managed set of
* locators will not change. If null is input,
* this method will throw a
* <code>NullPointerException</code>.
*
* @throws java.lang.UnsupportedOperationException this exception occurs
* when the lookup discovery service has no managed set of
* locators associated with the registration.
*
* @throws java.lang.NullPointerException this exception occurs when
* either null is input to the locators parameter, or one or
* more of the elements of the locators parameter is null.
*
* @throws java.rmi.RemoteException typically, this exception occurs when
* there is a communication failure between the client and the
* lookup discovery service. When this exception does occur, the
* registration's managed set of locators may or may not have
* been successfully modified.
*
* @throws java.rmi.NoSuchObjectException wrapped in an instance of
* com.sun.jini.proxy.ThrowThis exception whenever the
* <code>registrationID</code> parameter references an invalid
* or non-existent registration. Refer to the description of the
* <code>getRegistrars</code> method for more information on
* this exception.
*
* @see net.jini.discovery.LookupDiscoveryRegistration#removeLocators
*/
void removeLocators(Uuid registrationID,
LookupLocator[] locators) throws RemoteException,
ThrowThis;
/**
* Informs the lookup discovery service of the existence of an
* unavailable lookup service and requests that the lookup discovery
* service discard the unavailable lookup service.
*
* @param registrationID unique identifier assigned to the registration
* making the current discard request
* @param registrar a reference to the lookup service that the lookup
* discovery service is being asked to discard.
* <p>
* If this parameter equals none of the lookup
* services contained in the managed set of lookup
* services for this registration, no action will
* be taken.
*
* @throws java.lang.NullPointerException this exception occurs when
* null is input to the registrar parameter.
*
* @throws java.rmi.RemoteException typically, this exception occurs when
* there is a communication failure between the client and the
* lookup discovery service. When this exception does occur,
* the lookup service may or may not have been successfully
* discarded.
*
* @throws java.rmi.NoSuchObjectException wrapped in an instance of
* com.sun.jini.proxy.ThrowThis exception whenever the
* <code>registrationID</code> parameter references an invalid
* or non-existent registration. Refer to the description of the
* <code>getRegistrars</code> method for more information on
* this exception.
*
* @see net.jini.discovery.LookupDiscoveryRegistration#discard
*/
void discard(Uuid registrationID,
ServiceRegistrar registrar) throws RemoteException, ThrowThis;
/**
* This method renews the lease corresponding to the given
* <code>registrationID</code> and <code>leaseID</code> parameters,
* granting a new duration that is less than or equal to the requested
* duration value contained in the <code>duration</code> parameter.
*
* @param registrationID unique identifier assigned to the registration
* to which the lease being renewed corresponds
* @param leaseID identifier assigned by the lease grantor to the
* lease being renewed
* @param duration the requested duration for the lease being renewed
*
* @return <code>long</code> value representing the actual duration that
* was granted for the renewed lease. Note that the actual
* duration granted and returned by this method may be less than
* the duration requested.
*
* @throws net.jini.core.lease.UnknownLeaseException this exception occurs
* when the lease being renewed does not exist, or is unknown
* to the lease grantor; typically because the lease has expired.
*
* @throws java.rmi.RemoteException typically, this exception occurs when
* there is a communication failure between the client and the
* server. When this exception does occur, the lease may or may
* not have been renewed successfully.
*
* @see net.jini.core.lease.Lease#renew
*/
long renewLease(Uuid registrationID,
Uuid leaseID,
long duration) throws UnknownLeaseException,
RemoteException;
/**
* Renews all leases from a <code>LeaseMap</code>.
* <p>
* For each element in the <code>registrationIDs</code> parameter,
* this method will renew the corresponding element in the
* <code>leaseIDs</code> parameter with the corresponding element
* in the <code>registrationID</code> parameter.
*
* @param registrationIDs array containing the unique identifiers assigned
* to the each registration to which each lease
* to be renewed corresponds
* @param leaseIDs array containing the identifiers assigned by the
* lease grantor to each lease being renewed
* @param durations array containing the requested durations for
* each lease being renewed
*
* @return an instance of FiddlerRenewResults containing data corresponding
* to the results (granted durations or exceptions) of each
* renewal attempt
*
* @throws java.rmi.RemoteException typically, this exception occurs when
* there is a communication failure between the client and the
* server. When this exception does occur, this method may or
* may not have complete its processing successfully.
*
* @see net.jini.core.lease.LeaseMap#renewAll
*/
FiddlerRenewResults renewLeases(Uuid[] registrationIDs,
Uuid[] leaseIDs,
long[] durations) throws RemoteException;
/**
* This method cancels the lease corresponding to the given
* <code>registrationID</code> and <code>leaseID</code> parameters.
*
* @param registrationID unique identifier assigned to the registration
* to which the lease being cancelled corresponds
* @param leaseID identifier assigned by the lease grantor to the
* lease being cancelled
*
* @throws net.jini.core.lease.UnknownLeaseException this exception occurs
* when the lease being cancelled is unknown to the lease grantor.
*
* @throws java.rmi.RemoteException typically, this exception occurs when
* there is a communication failure between the client and the
* server. When this exception does occur, the lease may or may
* not have been cancelled successfully.
*
* @see net.jini.core.lease.Lease#cancel
*/
void cancelLease(Uuid registrationID,
Uuid leaseID) throws UnknownLeaseException,
RemoteException;
/**
* Cancels all leases from a <code>LeaseMap</code>.
* <p>
* For each element in the <code>registrationIDs</code> parameter,
* this method will cancel the corresponding element in the
* <code>leaseIDs</code> parameter.
*
* @param registrationIDs array containing the unique identifiers assigned
* to the each registration to which each lease
* to be cancelled corresponds
* @param leaseIDs array containing the identifiers assigned by the
* lease grantor to each lease being cancelled
*
* @throws java.rmi.RemoteException typically, this exception occurs when
* there is a communication failure between the client and the
* server. When this exception does occur, this method may or
* may not have complete its processing successfully.
*
* @return array consisting of any exceptions that may have occurred
* while attempting to cancel one of the leases in the map.
*
* @see net.jini.core.lease.LeaseMap#cancelAll
*/
Exception[] cancelLeases(Uuid[] registrationIDs,
Uuid[] leaseIDs) throws RemoteException;
}