Class ServiceFactoryFactory

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

public final class ServiceFactoryFactory extends 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 Details

    • USE_THREAD_CONTEXT_CLASSLOADER_PROPERTY

      public static final 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:
  • Constructor Details

    • ServiceFactoryFactory

      public ServiceFactoryFactory()
  • Method Details

    • getFactory

      public static <T> T getFactory(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:
      IllegalArgumentException - raised if the client requests a factory that does not have a provider registered for it.
      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:
      IllegalStateException - raised if calls to getFactoryProvider have already been made.