ServiceManager
Date: 2016-02-08

org.apache.avalon.framework.service

## Interface ServiceManager

-     public interface ServiceManager

  A `ServiceManager` selects `Object`s based on a role. The contract is that all the `Object`s implement the differing roles and there is one `Object` per role. If you need to select on of many `Object`s that implement the same role, then you need to use a `ServiceSelector`. Roles are usually the full interface name. A role is better understood by the analogy of a play. There are many different roles in a script. Any actor or actress can play any given part and you get the same results (phrases said, movements made, etc.). The exact nuances of the performance is different. Below is a list of things that might be considered the different roles:
  - InputAdapter and OutputAdapter
  - Store and Spool
  The `ServiceManager` does not specify the methodology of getting the `Object`, merely the interface used to get it. Therefore the `ServiceManager` can be implemented with a factory pattern, an object pool, or a simple Hashtable.
  See Also:
    `Serviceable`, `ServiceSelector`

- - ### Method Summary

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `boolean` | `hasService(java.lang.String key)` Check to see if a `Object` exists for a key.
    `java.lang.Object` | `lookup(java.lang.String key)` Get the `Object` associated with the given key.
    `void` | `release(java.lang.Object object)` Return the `Object` when you are finished with it.

- - ### Method Detail

    - #### lookup

          java.lang.Object lookup(java.lang.String key)
                                  throws ServiceException

      Get the `Object` associated with the given key. For instance, If the `ServiceManager` had a `LoggerComponent` stored and referenced by key, the following could be used:

           try
           {
               LoggerComponent log;
               myComponent = (LoggerComponent) manager.lookup( LoggerComponent.ROLE );
           }
           catch (...)
           {
               ...
           }

      Parameters:
        `key` - The lookup key of the `Object` to retrieve.
      Returns:
        an `Object` value
      Throws:
        `ServiceException` - if an error occurs

    - #### hasService

          boolean hasService(java.lang.String key)

      Check to see if a `Object` exists for a key.
      Parameters:
        `key` - a string identifying the key to check.
      Returns:
        True if the object exists, False if it does not.

    - #### release

          void release(java.lang.Object object)

      Return the `Object` when you are finished with it. This allows the `ServiceManager` to handle the End-Of-Life Lifecycle events associated with the `Object`. Please note, that no Exception should be thrown at this point. This is to allow easy use of the ServiceManager system without having to trap Exceptions on a release.
      Parameters:
        `object` - The `Object` we are releasing, may also be a `null` reference