/* java.beans.beancontext.BeanContextServices
   Copyright (C) 1999 Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
 
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */


package java.beans.beancontext;

import java.util.Iterator;
import java.util.TooManyListenersException;

/**
 * Allows a <code>BeanContext</code> to provide services to its children.
 *
 * @specnote it is unclear whether a <code>BeanContextServices</code>
 *           should delegate unhandled requests to parents.  I assume so.
 * @author John Keiser
 * @since 1.2
 */

public interface BeanContextServices
  extends BeanContext, BeanContextServicesListener
{
  /**
   * Register a service to make it available to others.
   * This class may refuse to add the service based on whatever
   * information it can gather, including whether the service
   * provider is trusted.
   *
   * @param serviceClass the service class.
   * @param provider the factory that will actually provide the service.
   * @return whether the service was added or not.
   */
  boolean addService (Class serviceClass,
                             BeanContextServiceProvider provider);

  /**
   * Make it so that no one else can use this service.
   * <P>
   *
   * If <code>revokeNow</code> is <code>false</code>, the only
   * effect of this method is to make all subsequent calls to
   * <code>getService()</code> on this service class fail.
   * <P>
   *
   * If it is <code>true</code>, a message is also sent out to all
   * listeners on the service and all references to it are released.
   *
   * @param serviceClass the service class to revoke.
   * @param provider the service provider providing the service class.
   * @param revokeNow whether to release all current references to
   *        the service.
   */
  void revokeService (Class serviceClass,
                             BeanContextServiceProvider provider,
                             boolean revokeNow);

  /**
   * Release your copy of this service.
   * <P>
   *
   * If all copies of the service's class have been relinquished by
   * the requestor, the <code>BeanContextServiceRevokedListener</code>
   * previously registered by <code>getService()</code> will be
   * unregistered.
   *
   * @param requestorChild the original <code>BeanContextChild</code>
   *        requesting the service.
   * @param requestor the original requestor of the service.
   * @param service the service to relinquish
   * @see #getService(java.beans.beancontext.BeanContextChild,java.lang.Object,java.lang.Class,java.lang.Object,java.beans.beancontext.BeanContextServiceRevokedListener)
   */
  void releaseService (BeanContextChild requestorChild, Object requestor,
                              Object service);

  /**
   * Get a service from this <code>BeanContextServices</code>.
   * <P>
   *
   * The specified listener will be registered to receive a
   * revocation notice for the specified serviceClass.  One
   * notification per service class per requestor object will be
   * sent.
   * <P>
   *
   * The listener will be unregistered when all services that were
   * obtained by that requestor for that service class are released.
   * <P>
   *
   * If the requested service class is not available, or if this
   * <code>BeanContextServices</code> object chooses not honor the
   * request because the service class has been revoked or for some
   * other reason, then this method will return <code>null</code>.
   * <P>
   *
   * This method may throw unchecked exceptions, so watch out.
   *
   * @specnote it is not specified what happens when two subsequent
   *           calls are made to <code>getService()</code> with the
   *           same requestor object and service class but different
   *           listeners.  Which listener is to be notified?
   *
   * @param requestorChild the <code>BeanContextChild</code>
   *        associated with the requestor.  Typically this will be
   *        the same as the requestor itself, but since any
   *        <code>Object</code>, even one outside the hierarchy, may
   *        make a request, this parameter is necessary.  Only weak
   *        references to this will be retained, and it will never
   *        be changed, only queried in a read-only manner.
   * @param requestor the actual requestor of the service.  Only
   *        weak references to this will be retained, and it will
   *        never be changed, only queried in a read-only manner.
   * @param serviceClass the <code>Class</code> of the service being
   *        requested.
   * @param serviceSelector a parameter to customize the service
   *        returned with.
   * @param listener a listener that will be notified if the service
   *        being requested is revoked.
   * @return an instance of <code>serviceClass</code> (such that
   *        <code>instanceof</code> serviceClass is true), or
   *        <code>null</code>.
   */
  Object getService (BeanContextChild requestorChild, Object requestor,
                            Class serviceClass, Object serviceSelector,
                            BeanContextServiceRevokedListener listener)
    throws TooManyListenersException;

  /**
   * Get a list of all service classes supported.
   * <P>
   *
   * This method must synchronize on
   * <code>BeanContext.globalHierarchyLock</code>.
   *
   * @return a list of all service classes supported.
   * @see java.beans.beancontext.BeanContext#globalHierarchyLock
   */
  Iterator getCurrentServiceClasses ();

  /**
   * Get a list of valid service selectors for the specified service class.
   * <P>
   *
   * If the specified service class does not have a finite number of
   * valid service selectors, it should return <code>null</code>.
   * If it takes a general <code>Integer</code> parameter, for
   * example, you may as well return <code>null</code> or the poor
   * soul who called this method will be iterating all day.
   * <P>
   *
   * If it has no valid service selectors, it should still return an empty
   * <code>Iterator</code>.
   *
   * @param serviceClass the service class to get selectors for.
   * @return a list of valid service selectors for the service
   *         class, or <code>null</code>.
   */
  Iterator getCurrentServiceSelectors (Class serviceClass);

  /**
   * Tell whether the specified service class is available.
   * Iff getService() could return a non-null value for the
   * specified service, this method will return <code>true</code>.
   *
   * @param serviceClass the service class to check on.
   * @return whether the specified service class is available.
   */
  boolean hasService (Class serviceClass);

  /**
   * Add a listener on all adds and removes of services.
   * @param listener the listener to add.
   */
  void addBeanContextServicesListener (BeanContextServicesListener listener);

  /**
   * Remove a listener on all adds and removes of services.
   * @specnote it is not certain whether this should remove this
   *           listener if it was specified in
   *           <code>getService()</code>.
   * @param listener the listener to add.
   */
  void removeBeanContextServicesListener (BeanContextServicesListener listener);
}
