You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@river.apache.org by pe...@apache.org on 2020/07/05 11:41:42 UTC

svn commit: r1879521 [9/37] - in /river/jtsk/modules/modularize/apache-river: ./ browser/ browser/src/main/java/org/apache/river/example/browser/ extra/ groovy-config/ river-activation/ river-collections/ river-collections/src/main/java/org/apache/rive...

Modified: river/jtsk/modules/modularize/apache-river/river-services/fiddler/fiddler-dl/src/main/java/org/apache/river/fiddler/proxy/FiddlerAdminProxy.java
URL: http://svn.apache.org/viewvc/river/jtsk/modules/modularize/apache-river/river-services/fiddler/fiddler-dl/src/main/java/org/apache/river/fiddler/proxy/FiddlerAdminProxy.java?rev=1879521&r1=1879520&r2=1879521&view=diff
==============================================================================
--- river/jtsk/modules/modularize/apache-river/river-services/fiddler/fiddler-dl/src/main/java/org/apache/river/fiddler/proxy/FiddlerAdminProxy.java (original)
+++ river/jtsk/modules/modularize/apache-river/river-services/fiddler/fiddler-dl/src/main/java/org/apache/river/fiddler/proxy/FiddlerAdminProxy.java Sun Jul  5 11:41:39 2020
@@ -1,900 +1,901 @@
-/*
- * 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 org.apache.river.fiddler;
-
-import org.apache.river.admin.DestroyAdmin;
-import org.apache.river.proxy.ConstrainableProxyUtil;
-
-import net.jini.admin.JoinAdmin;
-import net.jini.id.ReferentUuid;
-import net.jini.id.ReferentUuids;
-import net.jini.id.Uuid;
-import net.jini.security.proxytrust.ProxyTrustIterator;
-import net.jini.security.proxytrust.SingletonProxyTrustIterator;
-
-import net.jini.core.constraint.MethodConstraints;
-import net.jini.core.constraint.RemoteMethodControl;
-import net.jini.core.discovery.LookupLocator;
-import net.jini.core.entry.Entry;
-
-import java.lang.reflect.Method;
-import java.io.InvalidObjectException;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.Serializable;
-import java.rmi.RemoteException;
-
-/**
- * This class is a proxy providing access to the methods of an implementation
- * of the lookup discovery service which allow the administration of the
- * service. Clients only see instances of this class via the FiddlerAdmin
- * interface.
- *
- * @author Sun Microsystems, Inc.
- *
- */
-class FiddlerAdminProxy implements FiddlerAdmin, ReferentUuid, Serializable {
-
-    private static final long serialVersionUID = 2L;
-
-    /**
-     * The reference through which communication occurs between the
-     * client-side and the server-side of the lookup discovery service
-     *
-     * @serial
-     */
-    final Fiddler server;
-    /** 
-     * The unique identifier assigned to the current instance of this 
-     * proxy class by the lookup discovery service. This ID is used to
-     * determine equality between proxies.
-     *
-     * @serial
-     */
-    final Uuid proxyID;
-
-    /**
-     * Public static factory method that creates and returns an instance of 
-     * <code>FiddlerAdminProxy</code>. If the server associated with this proxy
-     * implements <code>RemoteMethodControl</code>, then the object returned by
-     * this method will also implement <code>RemoteMethodControl</code>.
-     * 
-     * @param server  reference to the server object through which 
-     *                communication occurs between the client-side and
-     *                server-side of the associated service.
-     * @param proxyID the unique identifier assigned by the service to each
-     *                instance of this proxy
-     * 
-     * @return an instance of <code>FiddlerAdminProxy</code> that implements
-     *         <code>RemoteMethodControl</code> if the given <code>server</code>
-     *         does.
-     */
-    public static FiddlerAdminProxy createAdminProxy(Fiddler server,
-                                                     Uuid proxyID)
-    {
-        if(server instanceof RemoteMethodControl) {
-            return new ConstrainableFiddlerAdminProxy(server, proxyID, null);
-        } else {
-            return new FiddlerAdminProxy(server, proxyID);
-        }//endif
-    }//end createAdminProxy
-
-    /**
-     * Constructs a new instance of FiddlerAdminProxy.
-     *
-     * @param server  reference to the server object through which 
-     *                communication occurs between the client-side and
-     *                server-side of the associated service
-     * @param proxyID the unique identifier assigned by the service to each
-     *                instance of this proxy
-     */
-    private FiddlerAdminProxy(Fiddler server, Uuid proxyID) {
-	this.server  = server;
-	this.proxyID = proxyID;
-    }//end constructor
-
-    /* *** Methods of org.apache.river.fiddler.FiddlerAdmin *** */
-
-    /**
-     * Changes the least upper bound applied to all lease durations granted
-     * by the lookup discovery service.
-     * <p>
-     * This method is a mechanism for an entity with the appropriate
-     * privileges to administratively change the value of the least upper
-     * bound that will be applied by the Fiddler implementation of the lookup
-     * discovery service when determining the duration to assign to the lease
-     * on a requested registration.
-     *
-     * @param newBound <code>long</code> value representing the new least
-     *        upper bound (in milliseconds) on the set of all possible
-     *        lease durations that may be granted
-     * 
-     * @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
-     *         bound value may or may not have been changed successfully.
-     *
-     * @see org.apache.river.fiddler.FiddlerAdmin#setLeaseBound
-     */
-    public void setLeaseBound(long newBound) throws RemoteException {
-        server.setLeaseBound(newBound);
-    }
-    /**
-     * Retrieves the least upper bound applied to all lease durations granted
-     * by the lookup discovery service.
-     *
-     * @return <code>long</code> value representing the current least
-     *         upper bound (in milliseconds) on the set of all possible
-     *         lease durations that may be granted
-     * 
-     * @throws java.rmi.RemoteException typically, this exception occurs when
-     *         there is a communication failure between the client and the
-     *         lookup discovery service.
-     *
-     * @see org.apache.river.fiddler.FiddlerAdmin#setLeaseBound
-     */
-    public long getLeaseBound() throws RemoteException {
-        return server.getLeaseBound();
-    }
-
-    /**
-     * Change the weight factor applied by the lookup discovery service
-     * to the snapshot size during the test to determine whether or not
-     * to take a "snapshot" of the system state.
-     *
-     * @param weight weight factor for snapshot size
-     * 
-     * @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
-     *         weight factor may or may not have been changed successfully.
-     *
-     * @see org.apache.river.fiddler.FiddlerAdmin#setPersistenceSnapshotWeight
-     */
-    public void setPersistenceSnapshotWeight(float weight)
-                                                     throws RemoteException
-    {
-        server.setPersistenceSnapshotWeight(weight);
-    }
-
-    /**
-     * Retrieve the weight factor applied by the lookup discovery service
-     * to the snapshot size during the test to determine whether or not to
-     * take a "snapshot" of the system state.
-     * 
-     * @return float value corresponding to the weight factor for snapshot
-     *         size
-     * 
-     * @throws java.rmi.RemoteException typically, this exception occurs when
-     *         there is a communication failure between the client and the
-     *         lookup discovery service.
-     *
-     * @see org.apache.river.fiddler.FiddlerAdmin#getPersistenceSnapshotWeight
-     */
-    public float getPersistenceSnapshotWeight() throws RemoteException {
-        return server.getPersistenceSnapshotWeight();
-    }
-
-    /**
-     * Change the value of the size threshold of the snapshot; which is
-     * employed by the lookup discovery service in the test to determine
-     * whether or not to take a "snapshot" of the system state.
-     *
-     * @param threshold size threshold for taking a snapshot
-     * 
-     * @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
-     *         threshold may or may not have been changed successfully.
-     *
-     * @see org.apache.river.fiddler.FiddlerAdmin#setPersistenceSnapshotThreshold
-     */
-    public void setPersistenceSnapshotThreshold(int threshold)
-                                                        throws RemoteException
-    {
-        server.setPersistenceSnapshotThreshold(threshold);
-    }
-
-    /**
-     * Retrieve the value of the size threshold of the snapshot; which is
-     * employed by the lookup discovery service in the test to determine
-     * whether or not to take a "snapshot" of the system state.
-     * 
-     * @return int value corresponding to the size threshold of the snapshot
-     * 
-     * @throws java.rmi.RemoteException typically, this exception occurs when
-     *         there is a communication failure between the client and the
-     *         lookup discovery service.
-     *
-     * @see org.apache.river.fiddler.FiddlerAdmin#getPersistenceSnapshotThreshold
-     */
-    public int getPersistenceSnapshotThreshold() throws RemoteException {
-        return server.getPersistenceSnapshotThreshold();
-    }
-
-    /* *** Methods of net.jini.admin.JoinAdmin *** */
-
-    /** 
-     * Get the current attribute sets for the lookup discovery service. 
-     * 
-     * @return array of net.jini.core.entry.Entry containing the current
-     *         attribute sets for the lookup discovery service
-     * 
-     * @throws java.rmi.RemoteException typically, this exception occurs when
-     *         there is a communication failure between the client and the
-     *         lookup discovery service.
-     *
-     * @see net.jini.admin.JoinAdmin#getLookupAttributes
-     */
-    public Entry[] getLookupAttributes() throws RemoteException {
-	return server.getLookupAttributes();
-    }
-
-    /** 
-     * Add attribute sets to the current set of attributes associated
-     * with the lookup discovery service. The resulting set will be used
-     * for all future registrations with lookup services. The new attribute
-     * sets are also added to the lookup discovery service's attributes
-     * on each lookup service with which the lookup discovery service
-     * is currently registered.
-     *
-     * @param  attrSets array of net.jini.core.entry.Entry containing the
-     *         attribute sets to add
-     * 
-     * @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
-     *         attributes may or may not have been added successfully.
-     *
-     * @see net.jini.admin.JoinAdmin#addLookupAttributes
-     */
-    public void addLookupAttributes(Entry[] attrSets) throws RemoteException {
-	server.addLookupAttributes(attrSets);
-    }
-
-    /** 
-     * Modify the current set of attributes associated with the lookup
-     * discovery service. The resulting set will be used for all future
-     * registrations with lookup services. The same modifications are 
-     * also made to the lookup discovery service's attributes on each
-     * lookup service with which the lookup discovery service is currently
-     * registered.
-     *
-     * @param  attrSetTemplates  array of net.jini.core.entry.Entry containing
-     *         the templates for matching attribute sets
-     * @param  attrSets array of net.jini.core.entry.Entry containing the
-     *         modifications to make to matching sets
-     * 
-     * @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
-     *         attributes may or may not have been modified successfully.
-     *
-     * @see net.jini.admin.JoinAdmin#modifyLookupAttributes
-     */
-    public void modifyLookupAttributes(Entry[] attrSetTemplates,
-				       Entry[] attrSets)
-	throws RemoteException
-    {
-	server.modifyLookupAttributes(attrSetTemplates, attrSets);
-    }
-
-    /** 
-     * Get the names of the groups whose members are lookup services the
-     * lookup discovery services wishes to register with (join).
-     * 
-     * @return String array containing the names of the groups whose members
-     *         are lookup services the lookup discovery service wishes to
-     *         join.
-     * <p>
-     *         If the array returned is empty, the lookup discovery service
-     *         is configured to join no groups. If null is returned, the
-     *         lookup discovery service is configured to join all groups.
-     * 
-     * @throws java.rmi.RemoteException typically, this exception occurs when
-     *         there is a communication failure between the client and the
-     *         lookup discovery service.
-     *
-     * @see net.jini.admin.JoinAdmin#getLookupGroups
-     */
-    public String[] getLookupGroups() throws RemoteException {
-	return server.getLookupGroups();
-    }
-
-    /** 
-     * Add new names to the set consisting of the names of groups whose
-     * members are lookup services the lookup discovery service wishes
-     * to register with (join). Any lookup services belonging to the
-     * new groups that the lookup discovery service has not yet registered
-     * with, will be discovered and joined.
-     *
-     * @param  groups String array containing the names of the groups to add
-     * 
-     * @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
-     *         group names may or may not have been added successfully.
-     *
-     * @see net.jini.admin.JoinAdmin#addLookupGroups
-     */
-    public void addLookupGroups(String[] groups) throws RemoteException {
-	server.addLookupGroups(groups);
-    }
-
-    /** 
-     * Remove a set of group names from lookup discovery service's managed
-     * set of groups (the set consisting of the names of groups whose
-     * members are lookup services the lookup discovery service wishes
-     * to join). Any leases granted to the lookup discovery service by
-     * lookup services that are not members of the groups whose names 
-     * remain in the managed set will be cancelled at those lookup services.
-     *
-     * @param  groups String array containing the names of the groups to remove
-     * 
-     * @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
-     *         group names may or may not have been removed successfully.
-     *
-     * @see net.jini.admin.JoinAdmin#removeLookupGroups
-     */
-    public void removeLookupGroups(String[] groups) throws RemoteException {
-	server.removeLookupGroups(groups);
-    }
-
-    /** 
-     * Replace the lookup discovery service's managed set of groups with a
-     * new set of group names. Any leases granted to the lookup discovery
-     * service by lookup services that are not members of the groups whose
-     * names are in the new managed set will be cancelled at those lookup
-     * services. Lookup services that are members of groups reflected in
-     * the new managed set will be discovered and joined.
-     *
-     * @param  groups String array containing the names of the new groups
-     * 
-     * @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
-     *         group names may or may not have been replaced successfully.
-     *
-     * @see net.jini.admin.JoinAdmin#setLookupGroups
-     */
-    public void setLookupGroups(String[] groups) throws RemoteException {
-	server.setLookupGroups(groups);
-    }
-
-    /** 
-     * Get the lookup discovery service's managed set of locators. The
-     * managed set of locators is the set of LookupLocator objects
-     * corresponding to the specific lookup services with which the lookup
-     * discovery service wishes to register (join).
-     * 
-     * @return array of objects of type net.jini.core.discovery.LookupLocator,
-     *         each of which corresponds to a specific lookup service the
-     *         lookup discovery service wishes to join.
-     * 
-     * @throws java.rmi.RemoteException typically, this exception occurs when
-     *         there is a communication failure between the client and the
-     *         lookup discovery service.
-     *
-     * @see net.jini.admin.JoinAdmin#getLookupLocators
-     */
-    public LookupLocator[] getLookupLocators() throws RemoteException {
-	return server.getLookupLocators();
-    }
-
-    /** 
-     * Add a set of LookupLocator objects to the lookup discovery service's
-     * managed set of locators. The managed set of locators is the set of
-     * LookupLocator objects corresponding to the specific lookup services
-     * with which the lookup discovery service wishes to register (join).
-     * <p>
-     * Any lookup services corresponding to the new locators that the lookup
-     * discovery service has not yet joined, will be discovered and joined.
-     *
-     * @param  locators array of net.jini.core.discovery.LookupLocator objects to add
-     *         to the managed set of locators
-     * 
-     * @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
-     *         new locators may or may not have been added successfully.
-     *
-     * @see net.jini.admin.JoinAdmin#addLookupLocators
-     */
-    public void addLookupLocators(LookupLocator[] locators)
-	throws RemoteException
-    {
-	server.addLookupLocators(locators);
-    }
-
-    /** 
-     * Remove a set of LookupLocator objects from the lookup discovery
-     * service's managed set of locators. The managed set of locators is the
-     * set of LookupLocator objects corresponding to the specific lookup
-     * services with which the lookup discovery service wishes to register
-     * (join).
-     * <p>
-     * Note that any leases granted to the lookup discovery service by
-     * lookup services that do not correspond to any of the locators
-     * remaining in the managed set will be cancelled at those lookup
-     * services.
-     *
-     * @param  locators array of net.jini.core.discovery.LookupLocator objects to
-     *         remove from the managed set of locators
-     * 
-     * @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
-     *         new locators may or may not have been removed successfully.
-     *
-     * @see net.jini.admin.JoinAdmin#removeLookupLocators
-     */
-    public void removeLookupLocators(LookupLocator[] locators)
-	throws RemoteException
-    {
-	server.removeLookupLocators(locators);
-    }
-
-    /** 
-     * Replace the lookup discovery service's managed set of locators with
-     * a new set of locators. The managed set of locators is the set of
-     * LookupLocator objects corresponding to the specific lookup services
-     * with which the lookup discovery service wishes to register (join).
-     * <p>
-     * Note that any leases granted to the lookup discovery service by
-     * lookup services whose corresponding locator is removed from the
-     * managed set will be cancelled at those lookup services. The lookup
-     * services corresponding to the new locators in the managed set
-     * will be discovered and joined.
-     *
-     * @param  locators array of net.jini.core.discovery.LookupLocator objects with
-     *         which to replace the current managed set of locators
-     *         remove from the managed set of locators
-     * 
-     * @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
-     *         locators in the managed set may or may not have been replaced
-     *         successfully.
-     *
-     * @see net.jini.admin.JoinAdmin#setLookupLocators
-     */
-    public void setLookupLocators(LookupLocator[] locators)
-	throws RemoteException
-    {
-	server.setLookupLocators(locators);
-    }
-
-    /* From net.jini.id.ReferentUuid */
-
-    /** 
-     * Returns the universally unique identifier that has been assigned to the
-     * resource this proxy represents.
-     *
-     * @return the instance of <code>Uuid</code> that is associated with the
-     *         resource this proxy represents. This method will not return
-     *         <code>null</code>.
-     *
-     * @see net.jini.id.ReferentUuid
-     */
-    public Uuid getReferentUuid() {
-        return proxyID;
-    }
-
-    /* *** Methods of org.apache.river.admin.DestroyAdmin *** */
-
-    /**
-     * Destroy the lookup discovery service, if possible, including its
-     * persistent storage. This method will typically spawn a separate
-     * thread to do the actual work asynchronously, so a successful
-     * return from this method usually does not mean that the service
-     * has been destroyed.
-     * 
-     * @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 discovery service may or may not have been successfully
-     *         destroyed.
-     *
-     * @see org.apache.river.admin.DestroyAdmin#destroy
-     */
-    public void destroy() throws RemoteException {
-	server.destroy();
-    }
-
-    /* *** HashCode and Equals for this class *** */
-
-    /** 
-     * For any instance of this class, returns the hashcode value generated
-     * by the hashCode method of the proxy ID associated with the current
-     * instance of this proxy.
-     *
-     * @return <code>int</code> value representing the hashcode for an
-     *         instance of this class.
-     */
-    public int hashCode() {
-	return proxyID.hashCode();
-    }
-
-    /** 
-     * For any instance of this class, indicates whether the object input
-     * to this method is equal to the current instance of this class; where
-     * equality of administrative proxies to a lookup discovery service is
-     * defined by reference equality. That is, two proxies are equal if they
-     * reference (are proxies to) the same backend server.
-     *
-     * @param obj reference to the object that is to be compared to the
-     *            object on which this method is invoked.
-     *
-     * @return <code>true</code> if the object input is referentially
-     *         equal to the object on which this method is invoked;
-     *         <code>false</code> otherwise.
-     */
-    public boolean equals(Object obj) {
-	return ReferentUuids.compare(this,obj);
-    }
-
-    /** When an instance of this class is deserialized, this method is
-     *  automatically invoked. This implementation of this method validates
-     *  the state of the deserialized instance.
-     *
-     * @throws <code>InvalidObjectException</code> if the state of the
-     *         deserialized instance of this class is found to be invalid.
-     */
-    private void readObject(ObjectInputStream s)  
-                               throws IOException, ClassNotFoundException
-    {
-        s.defaultReadObject();
-        /* Verify server */
-        if(server == null) {
-            throw new InvalidObjectException("FiddlerAdminProxy.readObject "
-                                             +"failure - server "
-                                             +"field is null");
-        }//endif
-        /* Verify proxyID */
-        if(proxyID == null) {
-            throw new InvalidObjectException("FiddlerAdminProxy.readObject "
-                                             +"failure - proxyID "
-                                             +"field is null");
-        }//endif
-    }//end readObject
-
-    /** During deserialization of an instance of this class, if it is found
-     *  that the stream contains no data, this method is automatically
-     *  invoked. Because it is expected that the stream should always 
-     *  contain data, this implementation of this method simply declares
-     *  that something must be wrong.
-     *
-     * @throws <code>InvalidObjectException</code> to indicate that there
-     *         was no data in the stream during deserialization of an
-     *         instance of this class; declaring that something is wrong.
-     */
-    private void readObjectNoData() throws InvalidObjectException {
-        throw new InvalidObjectException("no data found when attempting to "
-                                         +"deserialize FiddlerAdminProxy "
-                                         +"instance");
-    }//end readObjectNoData
-
-    /** The constrainable version of the class <code>FiddlerAdminProxy</code>. 
-     *  <p>
-     *  When a client obtains an instance of this proxy class, the client
-     *  should not attempt to use the proxy until the client is assured
-     *  that the proxy can be trusted. In addition to implementing the
-     *  methods and mechanisms required by <code>RemoteMethodControl</code>, 
-     *  this class - in conjunction with the service's
-     *  <code>ProxyVerifier</code> class, helps provide a mechanism
-     *  for verifying trust in the proxy on behalf of a client.
-     *  <p>
-     *  In order to verify that an instance of this class is trusted, 
-     *  trust must be verified in all subsidiary objects (contained in that
-     *  instance) through which the client ultimately makes calls (local or
-     *  remote).  With respect to this class, the <code>server</code> field
-     *  is a proxy object through which the client makes remote calls to the 
-     *  service's backend. Therefore, trust in that object must be
-     *  verified. Additionally, this class also contains a field of type
-     *  <code>Uuid</code> (<code>proxyID</code> which should be
-     *  tested for trust. Consider the following diagram:
-     *  <p>
-     *  <pre>
-     *    FiddlerAdminProxy {
-     *        Fiddler server
-     *        Uuid proxyID
-     *    }//end FiddlerAdminProxy
-     *  </pre>
-     *  <p>
-     *  Thus, in order to verify that an instance of this class is trusted,
-     *  trust must be verified in the following objects from the diagram
-     *  above:
-     *  <ul><li> server
-     *      <li> proxyID
-     *  </ul>
-     *
-     *  When a client obtains an instance of this proxy class, the
-     *  deserialization process which delivers the proxy to the client
-     *  invokes the <code>readObject</code> method of this class. Part of
-     *  trust verification is performed in the <code>readObject</code> method,
-     *  and part is performed when the client prepares the proxy. Thus, this
-     *  class' participation in the trust verification process can be
-     *  summarized as follows:
-     *  <p>
-     *  <ul>
-     *    <li> server
-     *      <ul>
-     *        <li> readObject
-     *          <ul>
-     *            <li> verify server != null
-     *            <li> verify server implements RemoteMethodControl
-     *            <li> verify server's method constraints are the same
-     *                 as those placed on the corresponding public Remote
-     *                 methods of its outer proxy class
-     *          </ul>
-     *        <li> proxy preparation
-     *          <ul>
-     *            <li> Security.verifyObjectTrust() which calls
-     *            <li> ProxyVerifier.isTrustedObject() which calls
-     *            <li> canonicalServerObject.checkTrustEquivalence(server)
-     *                 (whose implementation is supplied by the particular 
-     *                 RMI implementation that was used to export the server)
-     *          </ul>
-     *      </ul>
-     *    <li> proxyID
-     *      <ul><li> readObject
-     *          <ul><li> verify proxyID != null</ul>
-     *      </ul>
-     *  </ul>
-     *
-     * @since 2.0
-     */
-    static final class ConstrainableFiddlerAdminProxy 
-                                                extends FiddlerAdminProxy
-                                                implements RemoteMethodControl
-    {
-        static final long serialVersionUID = 2L;
-
-        /* Array containing element pairs in which each pair of elements
-         * represents a correspondence 'mapping' between two methods having
-         * the following characteristics:
-         *  - the first element in the pair is one of the public, remote
-         *    method(s) that may be invoked by the client through the proxy
-         *    class that this class extends
-         *  - the second element in the pair is the method, implemented
-         *    in the backend server class, that is ultimately executed in
-         *    the server's backend when the client invokes the corresponding
-         *    method in this proxy
-         */
-        private static final Method[] methodMapArray = 
-        {
-            ProxyUtil.getMethod(JoinAdmin.class,
-                                "getLookupAttributes", new Class[] {} ),
-            ProxyUtil.getMethod(JoinAdmin.class,
-                                "getLookupAttributes", new Class[] {} ),
-
-            ProxyUtil.getMethod(JoinAdmin.class,
-                                "addLookupAttributes",
-                                new Class[] {Entry[].class} ),
-            ProxyUtil.getMethod(JoinAdmin.class,
-                                "addLookupAttributes",
-                                new Class[] {Entry[].class} ),
-
-            ProxyUtil.getMethod(JoinAdmin.class,
-                                "modifyLookupAttributes",
-                                new Class[] {Entry[].class,
-                                             Entry[].class} ),
-            ProxyUtil.getMethod(JoinAdmin.class,
-                                "modifyLookupAttributes",
-                                new Class[] {Entry[].class,
-                                             Entry[].class} ),
-
-            ProxyUtil.getMethod(JoinAdmin.class,
-                                "getLookupGroups", new Class[] {} ),
-            ProxyUtil.getMethod(JoinAdmin.class,
-                                "getLookupGroups", new Class[] {} ),
-
-            ProxyUtil.getMethod(JoinAdmin.class,
-                                "addLookupGroups",
-                                new Class[] {String[].class} ),
-            ProxyUtil.getMethod(JoinAdmin.class,
-                                "addLookupGroups",
-                                new Class[] {String[].class} ),
-
-            ProxyUtil.getMethod(JoinAdmin.class,
-                                "removeLookupGroups",
-                                new Class[] {String[].class} ),
-            ProxyUtil.getMethod(JoinAdmin.class,
-                                "removeLookupGroups",
-                                new Class[] {String[].class} ),
-
-            ProxyUtil.getMethod(JoinAdmin.class,
-                                "setLookupGroups",
-                                new Class[] {String[].class} ),
-            ProxyUtil.getMethod(JoinAdmin.class,
-                                "setLookupGroups",
-                                new Class[] {String[].class} ),
-
-            ProxyUtil.getMethod(JoinAdmin.class,
-                                "getLookupLocators", new Class[] {} ),
-            ProxyUtil.getMethod(JoinAdmin.class,
-                                "getLookupLocators", new Class[] {} ),
-
-            ProxyUtil.getMethod(JoinAdmin.class,
-                                "addLookupLocators",
-                                new Class[] {LookupLocator[].class} ),
-            ProxyUtil.getMethod(JoinAdmin.class,
-                                "addLookupLocators",
-                                new Class[] {LookupLocator[].class} ),
-
-            ProxyUtil.getMethod(JoinAdmin.class,
-                                "removeLookupLocators",
-                                new Class[] {LookupLocator[].class} ),
-            ProxyUtil.getMethod(JoinAdmin.class,
-                                "removeLookupLocators",
-                                new Class[] {LookupLocator[].class} ),
-
-            ProxyUtil.getMethod(JoinAdmin.class,
-                                "setLookupLocators",
-                                new Class[] {LookupLocator[].class} ),
-            ProxyUtil.getMethod(JoinAdmin.class,
-                                "setLookupLocators",
-                                new Class[] {LookupLocator[].class} ),
-
-
-            ProxyUtil.getMethod(DestroyAdmin.class,
-                                "destroy", new Class[] {} ),
-            ProxyUtil.getMethod(DestroyAdmin.class,
-                                "destroy", new Class[] {} ),
-
-            ProxyUtil.getMethod(FiddlerAdmin.class,
-                                "setLeaseBound",
-                                new Class[] {long.class} ),
-            ProxyUtil.getMethod(FiddlerAdmin.class,
-                                "setLeaseBound",
-                                new Class[] {long.class} ),
-
-            ProxyUtil.getMethod(FiddlerAdmin.class,
-                                "getLeaseBound",
-                                new Class[] {} ),
-            ProxyUtil.getMethod(FiddlerAdmin.class,
-                                "getLeaseBound",
-                                new Class[] {} ),
-
-            ProxyUtil.getMethod(FiddlerAdmin.class,
-                                "setPersistenceSnapshotWeight",
-                                new Class[] {float.class} ),
-            ProxyUtil.getMethod(FiddlerAdmin.class,
-                                "setPersistenceSnapshotWeight",
-                                new Class[] {float.class} ),
-
-            ProxyUtil.getMethod(FiddlerAdmin.class,
-                                "getPersistenceSnapshotWeight",
-                                new Class[] {} ),
-            ProxyUtil.getMethod(FiddlerAdmin.class,
-                                "getPersistenceSnapshotWeight",
-                                new Class[] {} ),
-
-            ProxyUtil.getMethod(FiddlerAdmin.class,
-                                "setPersistenceSnapshotThreshold",
-                                new Class[] {int.class} ),
-            ProxyUtil.getMethod(FiddlerAdmin.class,
-                                "setPersistenceSnapshotThreshold",
-                                new Class[] {int.class} ),
-
-            ProxyUtil.getMethod(FiddlerAdmin.class,
-                                "getPersistenceSnapshotThreshold",
-                                new Class[] {} ),
-            ProxyUtil.getMethod(FiddlerAdmin.class,
-                                "getPersistenceSnapshotThreshold",
-                                new Class[] {} )
-        };//end methodMapArray
-
-        /** Client constraints placed on this proxy (may be <code>null</code>).
-         *
-         * @serial
-         */
-        private MethodConstraints methodConstraints;
-
-        /** Constructs a new <code>ConstrainableFiddlerAdminProxy</code>
-         *  instance.
-         *  <p>
-         *  For a description of all but the <code>methodConstraints</code>
-         *  argument (provided below), refer to the description for the
-         *  constructor of this class' super class.
-         *
-         *  @param methodConstraints the client method constraints to place on
-         *                           this proxy (may be <code>null</code>).
-         */
-        private ConstrainableFiddlerAdminProxy
-                                       (Fiddler server, 
-                                        Uuid proxyID,
-                                        MethodConstraints methodConstraints)
-        {
-            super( constrainServer(server, methodConstraints), proxyID);
-	    this.methodConstraints = methodConstraints;
-        }//end constructor
-
-        /** Returns a copy of the given server proxy having the client method
-         *  constraints that result after the specified method mapping is
-         *  applied to the given client method constraints.
-         */
-        private static Fiddler constrainServer( Fiddler server,
-                                                MethodConstraints constraints )
-        {
-            MethodConstraints newConstraints 
-               = ConstrainableProxyUtil.translateConstraints(constraints,
-                                                             methodMapArray);
-            RemoteMethodControl constrainedServer = 
-                ((RemoteMethodControl)server).setConstraints(newConstraints);
-
-            return ((Fiddler)constrainedServer);
-        }//end constrainServer
-
-        /** Returns a new copy of this proxy class 
-         *  (<code>ConstrainableFiddlerAdminProxy</code>) with its client
-         *  constraints set to the specified constraints. A <code>null</code>
-         *  value is interpreted as mapping all methods to empty constraints.
-         */
-        public RemoteMethodControl setConstraints
-                                              (MethodConstraints constraints)
-        {
-            return (new ConstrainableFiddlerAdminProxy
-                                              (server, proxyID, constraints));
-        }//end setConstraints
-
-        /** Returns the client constraints placed on the current instance
-         *  of this proxy class (<code>ConstrainableFiddlerAdminProxy</code>).
-         *  The value returned by this method can be <code>null</code>,
-         *  which is interpreted as mapping all methods to empty constraints.
-         */
-        public MethodConstraints getConstraints() {
-            return methodConstraints;
-        }//end getConstraints
-
-        /** Returns a proxy trust iterator that is used in 
-         *  <code>ProxyTrustVerifier</code> to retrieve this object's
-         *  trust verifier.
-         */
-        private ProxyTrustIterator getProxyTrustIterator() {
-	    return new SingletonProxyTrustIterator(server);
-        }//end getProxyTrustIterator
-
-        /** Performs various functions related to the trust verification
-         *  process for the current instance of this proxy class, as
-         *  detailed in the description for this class.
-         *
-         * @throws <code>InvalidObjectException</code> if any of the
-         *         requirements for trust verification (as detailed in the 
-         *         class description) are not satisfied.
-         */
-        private void readObject(ObjectInputStream s)  
-                                   throws IOException, ClassNotFoundException
-        {
-            /* Note that basic validation of the fields of this class was
-             * already performed in the readObject() method of this class'
-             * super class.
-             */
-            s.defaultReadObject();
-            /* Verify the server and its constraints */
-            ConstrainableProxyUtil.verifyConsistentConstraints
-                                                       (methodConstraints,
-                                                        server,
-                                                        methodMapArray);
-        }//end readObject
-
-    }//end class ConstrainableFiddlerAdminProxy
-
-}//end class FiddlerAdminProxy
+/*
+ * 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 org.apache.river.fiddler.proxy;
+
+import org.apache.river.admin.DestroyAdmin;
+import org.apache.river.proxy.ConstrainableProxyUtil;
+import org.apache.river.admin.FiddlerAdmin;
+
+import net.jini.admin.JoinAdmin;
+import net.jini.id.ReferentUuid;
+import net.jini.id.ReferentUuids;
+import net.jini.id.Uuid;
+import net.jini.security.proxytrust.ProxyTrustIterator;
+import net.jini.security.proxytrust.SingletonProxyTrustIterator;
+
+import net.jini.core.constraint.MethodConstraints;
+import net.jini.core.constraint.RemoteMethodControl;
+import net.jini.core.discovery.LookupLocator;
+import net.jini.core.entry.Entry;
+
+import java.lang.reflect.Method;
+import java.io.InvalidObjectException;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.Serializable;
+import java.rmi.RemoteException;
+
+/**
+ * This class is a proxy providing access to the methods of an implementation
+ * of the lookup discovery service which allow the administration of the
+ * service. Clients only see instances of this class via the FiddlerAdmin
+ * interface.
+ *
+ * @author Sun Microsystems, Inc.
+ *
+ */
+public class FiddlerAdminProxy implements FiddlerAdmin, ReferentUuid, Serializable {
+
+    private static final long serialVersionUID = 2L;
+
+    /**
+     * The reference through which communication occurs between the
+     * client-side and the server-side of the lookup discovery service
+     *
+     * @serial
+     */
+    final Fiddler server;
+    /** 
+     * The unique identifier assigned to the current instance of this 
+     * proxy class by the lookup discovery service. This ID is used to
+     * determine equality between proxies.
+     *
+     * @serial
+     */
+    final Uuid proxyID;
+
+    /**
+     * Public static factory method that creates and returns an instance of 
+     * <code>FiddlerAdminProxy</code>. If the server associated with this proxy
+     * implements <code>RemoteMethodControl</code>, then the object returned by
+     * this method will also implement <code>RemoteMethodControl</code>.
+     * 
+     * @param server  reference to the server object through which 
+     *                communication occurs between the client-side and
+     *                server-side of the associated service.
+     * @param proxyID the unique identifier assigned by the service to each
+     *                instance of this proxy
+     * 
+     * @return an instance of <code>FiddlerAdminProxy</code> that implements
+     *         <code>RemoteMethodControl</code> if the given <code>server</code>
+     *         does.
+     */
+    public static FiddlerAdminProxy createAdminProxy(Fiddler server,
+                                                     Uuid proxyID)
+    {
+        if(server instanceof RemoteMethodControl) {
+            return new ConstrainableFiddlerAdminProxy(server, proxyID, null);
+        } else {
+            return new FiddlerAdminProxy(server, proxyID);
+        }//endif
+    }//end createAdminProxy
+
+    /**
+     * Constructs a new instance of FiddlerAdminProxy.
+     *
+     * @param server  reference to the server object through which 
+     *                communication occurs between the client-side and
+     *                server-side of the associated service
+     * @param proxyID the unique identifier assigned by the service to each
+     *                instance of this proxy
+     */
+    private FiddlerAdminProxy(Fiddler server, Uuid proxyID) {
+	this.server  = server;
+	this.proxyID = proxyID;
+    }//end constructor
+
+    /* *** Methods of org.apache.river.fiddler.FiddlerAdmin *** */
+
+    /**
+     * Changes the least upper bound applied to all lease durations granted
+     * by the lookup discovery service.
+     * <p>
+     * This method is a mechanism for an entity with the appropriate
+     * privileges to administratively change the value of the least upper
+     * bound that will be applied by the Fiddler implementation of the lookup
+     * discovery service when determining the duration to assign to the lease
+     * on a requested registration.
+     *
+     * @param newBound <code>long</code> value representing the new least
+     *        upper bound (in milliseconds) on the set of all possible
+     *        lease durations that may be granted
+     * 
+     * @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
+     *         bound value may or may not have been changed successfully.
+     *
+     * @see org.apache.river.fiddler.FiddlerAdmin#setLeaseBound
+     */
+    public void setLeaseBound(long newBound) throws RemoteException {
+        server.setLeaseBound(newBound);
+    }
+    /**
+     * Retrieves the least upper bound applied to all lease durations granted
+     * by the lookup discovery service.
+     *
+     * @return <code>long</code> value representing the current least
+     *         upper bound (in milliseconds) on the set of all possible
+     *         lease durations that may be granted
+     * 
+     * @throws java.rmi.RemoteException typically, this exception occurs when
+     *         there is a communication failure between the client and the
+     *         lookup discovery service.
+     *
+     * @see org.apache.river.fiddler.FiddlerAdmin#setLeaseBound
+     */
+    public long getLeaseBound() throws RemoteException {
+        return server.getLeaseBound();
+    }
+
+    /**
+     * Change the weight factor applied by the lookup discovery service
+     * to the snapshot size during the test to determine whether or not
+     * to take a "snapshot" of the system state.
+     *
+     * @param weight weight factor for snapshot size
+     * 
+     * @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
+     *         weight factor may or may not have been changed successfully.
+     *
+     * @see org.apache.river.fiddler.FiddlerAdmin#setPersistenceSnapshotWeight
+     */
+    public void setPersistenceSnapshotWeight(float weight)
+                                                     throws RemoteException
+    {
+        server.setPersistenceSnapshotWeight(weight);
+    }
+
+    /**
+     * Retrieve the weight factor applied by the lookup discovery service
+     * to the snapshot size during the test to determine whether or not to
+     * take a "snapshot" of the system state.
+     * 
+     * @return float value corresponding to the weight factor for snapshot
+     *         size
+     * 
+     * @throws java.rmi.RemoteException typically, this exception occurs when
+     *         there is a communication failure between the client and the
+     *         lookup discovery service.
+     *
+     * @see org.apache.river.fiddler.FiddlerAdmin#getPersistenceSnapshotWeight
+     */
+    public float getPersistenceSnapshotWeight() throws RemoteException {
+        return server.getPersistenceSnapshotWeight();
+    }
+
+    /**
+     * Change the value of the size threshold of the snapshot; which is
+     * employed by the lookup discovery service in the test to determine
+     * whether or not to take a "snapshot" of the system state.
+     *
+     * @param threshold size threshold for taking a snapshot
+     * 
+     * @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
+     *         threshold may or may not have been changed successfully.
+     *
+     * @see org.apache.river.fiddler.FiddlerAdmin#setPersistenceSnapshotThreshold
+     */
+    public void setPersistenceSnapshotThreshold(int threshold)
+                                                        throws RemoteException
+    {
+        server.setPersistenceSnapshotThreshold(threshold);
+    }
+
+    /**
+     * Retrieve the value of the size threshold of the snapshot; which is
+     * employed by the lookup discovery service in the test to determine
+     * whether or not to take a "snapshot" of the system state.
+     * 
+     * @return int value corresponding to the size threshold of the snapshot
+     * 
+     * @throws java.rmi.RemoteException typically, this exception occurs when
+     *         there is a communication failure between the client and the
+     *         lookup discovery service.
+     *
+     * @see org.apache.river.fiddler.FiddlerAdmin#getPersistenceSnapshotThreshold
+     */
+    public int getPersistenceSnapshotThreshold() throws RemoteException {
+        return server.getPersistenceSnapshotThreshold();
+    }
+
+    /* *** Methods of net.jini.admin.JoinAdmin *** */
+
+    /** 
+     * Get the current attribute sets for the lookup discovery service. 
+     * 
+     * @return array of net.jini.core.entry.Entry containing the current
+     *         attribute sets for the lookup discovery service
+     * 
+     * @throws java.rmi.RemoteException typically, this exception occurs when
+     *         there is a communication failure between the client and the
+     *         lookup discovery service.
+     *
+     * @see net.jini.admin.JoinAdmin#getLookupAttributes
+     */
+    public Entry[] getLookupAttributes() throws RemoteException {
+	return server.getLookupAttributes();
+    }
+
+    /** 
+     * Add attribute sets to the current set of attributes associated
+     * with the lookup discovery service. The resulting set will be used
+     * for all future registrations with lookup services. The new attribute
+     * sets are also added to the lookup discovery service's attributes
+     * on each lookup service with which the lookup discovery service
+     * is currently registered.
+     *
+     * @param  attrSets array of net.jini.core.entry.Entry containing the
+     *         attribute sets to add
+     * 
+     * @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
+     *         attributes may or may not have been added successfully.
+     *
+     * @see net.jini.admin.JoinAdmin#addLookupAttributes
+     */
+    public void addLookupAttributes(Entry[] attrSets) throws RemoteException {
+	server.addLookupAttributes(attrSets);
+    }
+
+    /** 
+     * Modify the current set of attributes associated with the lookup
+     * discovery service. The resulting set will be used for all future
+     * registrations with lookup services. The same modifications are 
+     * also made to the lookup discovery service's attributes on each
+     * lookup service with which the lookup discovery service is currently
+     * registered.
+     *
+     * @param  attrSetTemplates  array of net.jini.core.entry.Entry containing
+     *         the templates for matching attribute sets
+     * @param  attrSets array of net.jini.core.entry.Entry containing the
+     *         modifications to make to matching sets
+     * 
+     * @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
+     *         attributes may or may not have been modified successfully.
+     *
+     * @see net.jini.admin.JoinAdmin#modifyLookupAttributes
+     */
+    public void modifyLookupAttributes(Entry[] attrSetTemplates,
+				       Entry[] attrSets)
+	throws RemoteException
+    {
+	server.modifyLookupAttributes(attrSetTemplates, attrSets);
+    }
+
+    /** 
+     * Get the names of the groups whose members are lookup services the
+     * lookup discovery services wishes to register with (join).
+     * 
+     * @return String array containing the names of the groups whose members
+     *         are lookup services the lookup discovery service wishes to
+     *         join.
+     * <p>
+     *         If the array returned is empty, the lookup discovery service
+     *         is configured to join no groups. If null is returned, the
+     *         lookup discovery service is configured to join all groups.
+     * 
+     * @throws java.rmi.RemoteException typically, this exception occurs when
+     *         there is a communication failure between the client and the
+     *         lookup discovery service.
+     *
+     * @see net.jini.admin.JoinAdmin#getLookupGroups
+     */
+    public String[] getLookupGroups() throws RemoteException {
+	return server.getLookupGroups();
+    }
+
+    /** 
+     * Add new names to the set consisting of the names of groups whose
+     * members are lookup services the lookup discovery service wishes
+     * to register with (join). Any lookup services belonging to the
+     * new groups that the lookup discovery service has not yet registered
+     * with, will be discovered and joined.
+     *
+     * @param  groups String array containing the names of the groups to add
+     * 
+     * @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
+     *         group names may or may not have been added successfully.
+     *
+     * @see net.jini.admin.JoinAdmin#addLookupGroups
+     */
+    public void addLookupGroups(String[] groups) throws RemoteException {
+	server.addLookupGroups(groups);
+    }
+
+    /** 
+     * Remove a set of group names from lookup discovery service's managed
+     * set of groups (the set consisting of the names of groups whose
+     * members are lookup services the lookup discovery service wishes
+     * to join). Any leases granted to the lookup discovery service by
+     * lookup services that are not members of the groups whose names 
+     * remain in the managed set will be cancelled at those lookup services.
+     *
+     * @param  groups String array containing the names of the groups to remove
+     * 
+     * @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
+     *         group names may or may not have been removed successfully.
+     *
+     * @see net.jini.admin.JoinAdmin#removeLookupGroups
+     */
+    public void removeLookupGroups(String[] groups) throws RemoteException {
+	server.removeLookupGroups(groups);
+    }
+
+    /** 
+     * Replace the lookup discovery service's managed set of groups with a
+     * new set of group names. Any leases granted to the lookup discovery
+     * service by lookup services that are not members of the groups whose
+     * names are in the new managed set will be cancelled at those lookup
+     * services. Lookup services that are members of groups reflected in
+     * the new managed set will be discovered and joined.
+     *
+     * @param  groups String array containing the names of the new groups
+     * 
+     * @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
+     *         group names may or may not have been replaced successfully.
+     *
+     * @see net.jini.admin.JoinAdmin#setLookupGroups
+     */
+    public void setLookupGroups(String[] groups) throws RemoteException {
+	server.setLookupGroups(groups);
+    }
+
+    /** 
+     * Get the lookup discovery service's managed set of locators. The
+     * managed set of locators is the set of LookupLocator objects
+     * corresponding to the specific lookup services with which the lookup
+     * discovery service wishes to register (join).
+     * 
+     * @return array of objects of type net.jini.core.discovery.LookupLocator,
+     *         each of which corresponds to a specific lookup service the
+     *         lookup discovery service wishes to join.
+     * 
+     * @throws java.rmi.RemoteException typically, this exception occurs when
+     *         there is a communication failure between the client and the
+     *         lookup discovery service.
+     *
+     * @see net.jini.admin.JoinAdmin#getLookupLocators
+     */
+    public LookupLocator[] getLookupLocators() throws RemoteException {
+	return server.getLookupLocators();
+    }
+
+    /** 
+     * Add a set of LookupLocator objects to the lookup discovery service's
+     * managed set of locators. The managed set of locators is the set of
+     * LookupLocator objects corresponding to the specific lookup services
+     * with which the lookup discovery service wishes to register (join).
+     * <p>
+     * Any lookup services corresponding to the new locators that the lookup
+     * discovery service has not yet joined, will be discovered and joined.
+     *
+     * @param  locators array of net.jini.core.discovery.LookupLocator objects to add
+     *         to the managed set of locators
+     * 
+     * @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
+     *         new locators may or may not have been added successfully.
+     *
+     * @see net.jini.admin.JoinAdmin#addLookupLocators
+     */
+    public void addLookupLocators(LookupLocator[] locators)
+	throws RemoteException
+    {
+	server.addLookupLocators(locators);
+    }
+
+    /** 
+     * Remove a set of LookupLocator objects from the lookup discovery
+     * service's managed set of locators. The managed set of locators is the
+     * set of LookupLocator objects corresponding to the specific lookup
+     * services with which the lookup discovery service wishes to register
+     * (join).
+     * <p>
+     * Note that any leases granted to the lookup discovery service by
+     * lookup services that do not correspond to any of the locators
+     * remaining in the managed set will be cancelled at those lookup
+     * services.
+     *
+     * @param  locators array of net.jini.core.discovery.LookupLocator objects to
+     *         remove from the managed set of locators
+     * 
+     * @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
+     *         new locators may or may not have been removed successfully.
+     *
+     * @see net.jini.admin.JoinAdmin#removeLookupLocators
+     */
+    public void removeLookupLocators(LookupLocator[] locators)
+	throws RemoteException
+    {
+	server.removeLookupLocators(locators);
+    }
+
+    /** 
+     * Replace the lookup discovery service's managed set of locators with
+     * a new set of locators. The managed set of locators is the set of
+     * LookupLocator objects corresponding to the specific lookup services
+     * with which the lookup discovery service wishes to register (join).
+     * <p>
+     * Note that any leases granted to the lookup discovery service by
+     * lookup services whose corresponding locator is removed from the
+     * managed set will be cancelled at those lookup services. The lookup
+     * services corresponding to the new locators in the managed set
+     * will be discovered and joined.
+     *
+     * @param  locators array of net.jini.core.discovery.LookupLocator objects with
+     *         which to replace the current managed set of locators
+     *         remove from the managed set of locators
+     * 
+     * @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
+     *         locators in the managed set may or may not have been replaced
+     *         successfully.
+     *
+     * @see net.jini.admin.JoinAdmin#setLookupLocators
+     */
+    public void setLookupLocators(LookupLocator[] locators)
+	throws RemoteException
+    {
+	server.setLookupLocators(locators);
+    }
+
+    /* From net.jini.id.ReferentUuid */
+
+    /** 
+     * Returns the universally unique identifier that has been assigned to the
+     * resource this proxy represents.
+     *
+     * @return the instance of <code>Uuid</code> that is associated with the
+     *         resource this proxy represents. This method will not return
+     *         <code>null</code>.
+     *
+     * @see net.jini.id.ReferentUuid
+     */
+    public Uuid getReferentUuid() {
+        return proxyID;
+    }
+
+    /* *** Methods of org.apache.river.admin.DestroyAdmin *** */
+
+    /**
+     * Destroy the lookup discovery service, if possible, including its
+     * persistent storage. This method will typically spawn a separate
+     * thread to do the actual work asynchronously, so a successful
+     * return from this method usually does not mean that the service
+     * has been destroyed.
+     * 
+     * @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 discovery service may or may not have been successfully
+     *         destroyed.
+     *
+     * @see org.apache.river.admin.DestroyAdmin#destroy
+     */
+    public void destroy() throws RemoteException {
+	server.destroy();
+    }
+
+    /* *** HashCode and Equals for this class *** */
+
+    /** 
+     * For any instance of this class, returns the hashcode value generated
+     * by the hashCode method of the proxy ID associated with the current
+     * instance of this proxy.
+     *
+     * @return <code>int</code> value representing the hashcode for an
+     *         instance of this class.
+     */
+    public int hashCode() {
+	return proxyID.hashCode();
+    }
+
+    /** 
+     * For any instance of this class, indicates whether the object input
+     * to this method is equal to the current instance of this class; where
+     * equality of administrative proxies to a lookup discovery service is
+     * defined by reference equality. That is, two proxies are equal if they
+     * reference (are proxies to) the same backend server.
+     *
+     * @param obj reference to the object that is to be compared to the
+     *            object on which this method is invoked.
+     *
+     * @return <code>true</code> if the object input is referentially
+     *         equal to the object on which this method is invoked;
+     *         <code>false</code> otherwise.
+     */
+    public boolean equals(Object obj) {
+	return ReferentUuids.compare(this,obj);
+    }
+
+    /** When an instance of this class is deserialized, this method is
+     *  automatically invoked. This implementation of this method validates
+     *  the state of the deserialized instance.
+     *
+     * @throws <code>InvalidObjectException</code> if the state of the
+     *         deserialized instance of this class is found to be invalid.
+     */
+    private void readObject(ObjectInputStream s)  
+                               throws IOException, ClassNotFoundException
+    {
+        s.defaultReadObject();
+        /* Verify server */
+        if(server == null) {
+            throw new InvalidObjectException("FiddlerAdminProxy.readObject "
+                                             +"failure - server "
+                                             +"field is null");
+        }//endif
+        /* Verify proxyID */
+        if(proxyID == null) {
+            throw new InvalidObjectException("FiddlerAdminProxy.readObject "
+                                             +"failure - proxyID "
+                                             +"field is null");
+        }//endif
+    }//end readObject
+
+    /** During deserialization of an instance of this class, if it is found
+     *  that the stream contains no data, this method is automatically
+     *  invoked. Because it is expected that the stream should always 
+     *  contain data, this implementation of this method simply declares
+     *  that something must be wrong.
+     *
+     * @throws <code>InvalidObjectException</code> to indicate that there
+     *         was no data in the stream during deserialization of an
+     *         instance of this class; declaring that something is wrong.
+     */
+    private void readObjectNoData() throws InvalidObjectException {
+        throw new InvalidObjectException("no data found when attempting to "
+                                         +"deserialize FiddlerAdminProxy "
+                                         +"instance");
+    }//end readObjectNoData
+
+    /** The constrainable version of the class <code>FiddlerAdminProxy</code>. 
+     *  <p>
+     *  When a client obtains an instance of this proxy class, the client
+     *  should not attempt to use the proxy until the client is assured
+     *  that the proxy can be trusted. In addition to implementing the
+     *  methods and mechanisms required by <code>RemoteMethodControl</code>, 
+     *  this class - in conjunction with the service's
+     *  <code>ProxyVerifier</code> class, helps provide a mechanism
+     *  for verifying trust in the proxy on behalf of a client.
+     *  <p>
+     *  In order to verify that an instance of this class is trusted, 
+     *  trust must be verified in all subsidiary objects (contained in that
+     *  instance) through which the client ultimately makes calls (local or
+     *  remote).  With respect to this class, the <code>server</code> field
+     *  is a proxy object through which the client makes remote calls to the 
+     *  service's backend. Therefore, trust in that object must be
+     *  verified. Additionally, this class also contains a field of type
+     *  <code>Uuid</code> (<code>proxyID</code> which should be
+     *  tested for trust. Consider the following diagram:
+     *  <p>
+     *  <pre>
+     *    FiddlerAdminProxy {
+     *        Fiddler server
+     *        Uuid proxyID
+     *    }//end FiddlerAdminProxy
+     *  </pre>
+     *  <p>
+     *  Thus, in order to verify that an instance of this class is trusted,
+     *  trust must be verified in the following objects from the diagram
+     *  above:
+     *  <ul><li> server
+     *      <li> proxyID
+     *  </ul>
+     *
+     *  When a client obtains an instance of this proxy class, the
+     *  deserialization process which delivers the proxy to the client
+     *  invokes the <code>readObject</code> method of this class. Part of
+     *  trust verification is performed in the <code>readObject</code> method,
+     *  and part is performed when the client prepares the proxy. Thus, this
+     *  class' participation in the trust verification process can be
+     *  summarized as follows:
+     *  <p>
+     *  <ul>
+     *    <li> server
+     *      <ul>
+     *        <li> readObject
+     *          <ul>
+     *            <li> verify server != null
+     *            <li> verify server implements RemoteMethodControl
+     *            <li> verify server's method constraints are the same
+     *                 as those placed on the corresponding public Remote
+     *                 methods of its outer proxy class
+     *          </ul>
+     *        <li> proxy preparation
+     *          <ul>
+     *            <li> Security.verifyObjectTrust() which calls
+     *            <li> ProxyVerifier.isTrustedObject() which calls
+     *            <li> canonicalServerObject.checkTrustEquivalence(server)
+     *                 (whose implementation is supplied by the particular 
+     *                 RMI implementation that was used to export the server)
+     *          </ul>
+     *      </ul>
+     *    <li> proxyID
+     *      <ul><li> readObject
+     *          <ul><li> verify proxyID != null</ul>
+     *      </ul>
+     *  </ul>
+     *
+     * @since 2.0
+     */
+    static final class ConstrainableFiddlerAdminProxy 
+                                                extends FiddlerAdminProxy
+                                                implements RemoteMethodControl
+    {
+        static final long serialVersionUID = 2L;
+
+        /* Array containing element pairs in which each pair of elements
+         * represents a correspondence 'mapping' between two methods having
+         * the following characteristics:
+         *  - the first element in the pair is one of the public, remote
+         *    method(s) that may be invoked by the client through the proxy
+         *    class that this class extends
+         *  - the second element in the pair is the method, implemented
+         *    in the backend server class, that is ultimately executed in
+         *    the server's backend when the client invokes the corresponding
+         *    method in this proxy
+         */
+        private static final Method[] methodMapArray = 
+        {
+            ProxyUtil.getMethod(JoinAdmin.class,
+                                "getLookupAttributes", new Class[] {} ),
+            ProxyUtil.getMethod(JoinAdmin.class,
+                                "getLookupAttributes", new Class[] {} ),
+
+            ProxyUtil.getMethod(JoinAdmin.class,
+                                "addLookupAttributes",
+                                new Class[] {Entry[].class} ),
+            ProxyUtil.getMethod(JoinAdmin.class,
+                                "addLookupAttributes",
+                                new Class[] {Entry[].class} ),
+
+            ProxyUtil.getMethod(JoinAdmin.class,
+                                "modifyLookupAttributes",
+                                new Class[] {Entry[].class,
+                                             Entry[].class} ),
+            ProxyUtil.getMethod(JoinAdmin.class,
+                                "modifyLookupAttributes",
+                                new Class[] {Entry[].class,
+                                             Entry[].class} ),
+
+            ProxyUtil.getMethod(JoinAdmin.class,
+                                "getLookupGroups", new Class[] {} ),
+            ProxyUtil.getMethod(JoinAdmin.class,
+                                "getLookupGroups", new Class[] {} ),
+
+            ProxyUtil.getMethod(JoinAdmin.class,
+                                "addLookupGroups",
+                                new Class[] {String[].class} ),
+            ProxyUtil.getMethod(JoinAdmin.class,
+                                "addLookupGroups",
+                                new Class[] {String[].class} ),
+
+            ProxyUtil.getMethod(JoinAdmin.class,
+                                "removeLookupGroups",
+                                new Class[] {String[].class} ),
+            ProxyUtil.getMethod(JoinAdmin.class,
+                                "removeLookupGroups",
+                                new Class[] {String[].class} ),
+
+            ProxyUtil.getMethod(JoinAdmin.class,
+                                "setLookupGroups",
+                                new Class[] {String[].class} ),
+            ProxyUtil.getMethod(JoinAdmin.class,
+                                "setLookupGroups",
+                                new Class[] {String[].class} ),
+
+            ProxyUtil.getMethod(JoinAdmin.class,
+                                "getLookupLocators", new Class[] {} ),
+            ProxyUtil.getMethod(JoinAdmin.class,
+                                "getLookupLocators", new Class[] {} ),
+
+            ProxyUtil.getMethod(JoinAdmin.class,
+                                "addLookupLocators",
+                                new Class[] {LookupLocator[].class} ),
+            ProxyUtil.getMethod(JoinAdmin.class,
+                                "addLookupLocators",
+                                new Class[] {LookupLocator[].class} ),
+
+            ProxyUtil.getMethod(JoinAdmin.class,
+                                "removeLookupLocators",
+                                new Class[] {LookupLocator[].class} ),
+            ProxyUtil.getMethod(JoinAdmin.class,
+                                "removeLookupLocators",
+                                new Class[] {LookupLocator[].class} ),
+
+            ProxyUtil.getMethod(JoinAdmin.class,
+                                "setLookupLocators",
+                                new Class[] {LookupLocator[].class} ),
+            ProxyUtil.getMethod(JoinAdmin.class,
+                                "setLookupLocators",
+                                new Class[] {LookupLocator[].class} ),
+
+
+            ProxyUtil.getMethod(DestroyAdmin.class,
+                                "destroy", new Class[] {} ),
+            ProxyUtil.getMethod(DestroyAdmin.class,
+                                "destroy", new Class[] {} ),
+
+            ProxyUtil.getMethod(FiddlerAdmin.class,
+                                "setLeaseBound",
+                                new Class[] {long.class} ),
+            ProxyUtil.getMethod(FiddlerAdmin.class,
+                                "setLeaseBound",
+                                new Class[] {long.class} ),
+
+            ProxyUtil.getMethod(FiddlerAdmin.class,
+                                "getLeaseBound",
+                                new Class[] {} ),
+            ProxyUtil.getMethod(FiddlerAdmin.class,
+                                "getLeaseBound",
+                                new Class[] {} ),
+
+            ProxyUtil.getMethod(FiddlerAdmin.class,
+                                "setPersistenceSnapshotWeight",
+                                new Class[] {float.class} ),
+            ProxyUtil.getMethod(FiddlerAdmin.class,
+                                "setPersistenceSnapshotWeight",
+                                new Class[] {float.class} ),
+
+            ProxyUtil.getMethod(FiddlerAdmin.class,
+                                "getPersistenceSnapshotWeight",
+                                new Class[] {} ),
+            ProxyUtil.getMethod(FiddlerAdmin.class,
+                                "getPersistenceSnapshotWeight",
+                                new Class[] {} ),
+
+            ProxyUtil.getMethod(FiddlerAdmin.class,
+                                "setPersistenceSnapshotThreshold",
+                                new Class[] {int.class} ),
+            ProxyUtil.getMethod(FiddlerAdmin.class,
+                                "setPersistenceSnapshotThreshold",
+                                new Class[] {int.class} ),
+
+            ProxyUtil.getMethod(FiddlerAdmin.class,
+                                "getPersistenceSnapshotThreshold",
+                                new Class[] {} ),
+            ProxyUtil.getMethod(FiddlerAdmin.class,
+                                "getPersistenceSnapshotThreshold",
+                                new Class[] {} )
+        };//end methodMapArray
+
+        /** Client constraints placed on this proxy (may be <code>null</code>).
+         *
+         * @serial
+         */
+        private MethodConstraints methodConstraints;
+
+        /** Constructs a new <code>ConstrainableFiddlerAdminProxy</code>
+         *  instance.
+         *  <p>
+         *  For a description of all but the <code>methodConstraints</code>
+         *  argument (provided below), refer to the description for the
+         *  constructor of this class' super class.
+         *
+         *  @param methodConstraints the client method constraints to place on
+         *                           this proxy (may be <code>null</code>).
+         */
+        private ConstrainableFiddlerAdminProxy
+                                       (Fiddler server, 
+                                        Uuid proxyID,
+                                        MethodConstraints methodConstraints)
+        {
+            super( constrainServer(server, methodConstraints), proxyID);
+	    this.methodConstraints = methodConstraints;
+        }//end constructor
+
+        /** Returns a copy of the given server proxy having the client method
+         *  constraints that result after the specified method mapping is
+         *  applied to the given client method constraints.
+         */
+        private static Fiddler constrainServer( Fiddler server,
+                                                MethodConstraints constraints )
+        {
+            MethodConstraints newConstraints 
+               = ConstrainableProxyUtil.translateConstraints(constraints,
+                                                             methodMapArray);
+            RemoteMethodControl constrainedServer = 
+                ((RemoteMethodControl)server).setConstraints(newConstraints);
+
+            return ((Fiddler)constrainedServer);
+        }//end constrainServer
+
+        /** Returns a new copy of this proxy class 
+         *  (<code>ConstrainableFiddlerAdminProxy</code>) with its client
+         *  constraints set to the specified constraints. A <code>null</code>
+         *  value is interpreted as mapping all methods to empty constraints.
+         */
+        public RemoteMethodControl setConstraints
+                                              (MethodConstraints constraints)
+        {
+            return (new ConstrainableFiddlerAdminProxy
+                                              (server, proxyID, constraints));
+        }//end setConstraints
+
+        /** Returns the client constraints placed on the current instance
+         *  of this proxy class (<code>ConstrainableFiddlerAdminProxy</code>).
+         *  The value returned by this method can be <code>null</code>,
+         *  which is interpreted as mapping all methods to empty constraints.
+         */
+        public MethodConstraints getConstraints() {
+            return methodConstraints;
+        }//end getConstraints
+
+        /** Returns a proxy trust iterator that is used in 
+         *  <code>ProxyTrustVerifier</code> to retrieve this object's
+         *  trust verifier.
+         */
+        private ProxyTrustIterator getProxyTrustIterator() {
+	    return new SingletonProxyTrustIterator(server);
+        }//end getProxyTrustIterator
+
+        /** Performs various functions related to the trust verification
+         *  process for the current instance of this proxy class, as
+         *  detailed in the description for this class.
+         *
+         * @throws <code>InvalidObjectException</code> if any of the
+         *         requirements for trust verification (as detailed in the 
+         *         class description) are not satisfied.
+         */
+        private void readObject(ObjectInputStream s)  
+                                   throws IOException, ClassNotFoundException
+        {
+            /* Note that basic validation of the fields of this class was
+             * already performed in the readObject() method of this class'
+             * super class.
+             */
+            s.defaultReadObject();
+            /* Verify the server and its constraints */
+            ConstrainableProxyUtil.verifyConsistentConstraints
+                                                       (methodConstraints,
+                                                        server,
+                                                        methodMapArray);
+        }//end readObject
+
+    }//end class ConstrainableFiddlerAdminProxy
+
+}//end class FiddlerAdminProxy

Modified: river/jtsk/modules/modularize/apache-river/river-services/fiddler/fiddler-dl/src/main/java/org/apache/river/fiddler/proxy/FiddlerLease.java
URL: http://svn.apache.org/viewvc/river/jtsk/modules/modularize/apache-river/river-services/fiddler/fiddler-dl/src/main/java/org/apache/river/fiddler/proxy/FiddlerLease.java?rev=1879521&r1=1879520&r2=1879521&view=diff
==============================================================================
--- river/jtsk/modules/modularize/apache-river/river-services/fiddler/fiddler-dl/src/main/java/org/apache/river/fiddler/proxy/FiddlerLease.java (original)
+++ river/jtsk/modules/modularize/apache-river/river-services/fiddler/fiddler-dl/src/main/java/org/apache/river/fiddler/proxy/FiddlerLease.java Sun Jul  5 11:41:39 2020
@@ -15,7 +15,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.river.fiddler;
+package org.apache.river.fiddler.proxy;
 
 import org.apache.river.proxy.ConstrainableProxyUtil;
 import org.apache.river.lease.AbstractLease;
@@ -51,7 +51,7 @@ import org.apache.river.lease.ID;
  * @author Sun Microsystems, Inc.
  *
  */
-class FiddlerLease extends AbstractLease 
+public class FiddlerLease extends AbstractLease 
                    implements ReferentUuid, ID<Uuid>
 {