com.google.appengine.spi

## Class ServiceFactoryFactory

- java.lang.Object
- - com.google.appengine.spi.ServiceFactoryFactory

-     public final class ServiceFactoryFactory
      extends java.lang.Object

  This class is not intended for end users.

  Provide factory instances for AppEngine APIs. Each API will have an associated `FactoryProvider` registered with this class. N.B. Once `getFactory(Class)` has been called, no further mappings may be registered with this class.

  To construct the runtime mapping, this class first uses `java.util.ServiceLoader` to find all registered `FactoryProvider` entities using the `ClassLoader` of `ServiceFactoryFactory`. Finally, the explicitly registered providers `register(FactoryProvider)` are merged in.

  If `ServiceLoader` locates multiple providers for a given factory interface, the ambiguity can be resolved by using the `ServiceProvider.precedence()` annotation property (higher precedence wins; the google implementations all have precedence Integer.MIN_VALUE). An exception is raised if the ambiguity cannot be resolved. Note that explicit registration (`register(FactoryProvider)`) always takes precedence (it does not honor the `ServiceProvider.precedence()` annotation property).

- - ### Field Summary

    Fields
    Modifier and Type | Field and Description
    --- | ---
    `static java.lang.String` | `USE_THREAD_CONTEXT_CLASSLOADER_PROPERTY` If this system property is set to "true" the thread context classloader is used (if non-null) when looking up API service implementations.

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `ServiceFactoryFactory()`

  - ### Method Summary

    All Methods Static Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `static <T> T` | `getFactory(java.lang.Class<T> base)` Used by AppEngine service factories.
    `static <I> void` | `register(FactoryProvider<I> p)` Explicitly register a provider.

    - ### Methods inherited from class java.lang.Object

      `equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Field Detail

    - #### USE_THREAD_CONTEXT_CLASSLOADER_PROPERTY

          public static final java.lang.String USE_THREAD_CONTEXT_CLASSLOADER_PROPERTY

      If this system property is set to "true" the thread context classloader is used (if non-null) when looking up API service implementations. Otherwise the class loader of this class is used.
      See Also:
        Constant Field Values

  - ### Constructor Detail

    - #### ServiceFactoryFactory

          public ServiceFactoryFactory()

  - ### Method Detail

    - #### getFactory

          public static <T> T getFactory(java.lang.Class<T> base)

      Used by AppEngine service factories. Returns an instance of the factory implementing the interface provide by `base`. Since there must always be a provider registered for a given base, an error will be raised if no appropriate registration is found.
      Type Parameters:
        `T` - The type of the factory
      Parameters:
        `base` - The returned factory must extend this class.
      Throws:
        `java.lang.IllegalArgumentException` - raised if the client requests a factory that does not have a provider registered for it.
        `java.util.ServiceConfigurationError` - raised if there is a problem creating the factory instance

    - #### register

          public static <I> void register(FactoryProvider<I> p)

      Explicitly register a provider. This does not take the precedence (see `FactoryProvider.getPrecedence()`) of the provider into consideration; subsequent registrations will always override previous ones.
      Parameters:
        `p` - The provider to register
      Throws:
        `java.lang.IllegalStateException` - raised if calls to getFactoryProvider have already been made.