1   package com.atlassian.seraph.ioc;
2   
3   import com.atlassian.seraph.service.rememberme.NoopRememberMeService;
4   import com.atlassian.seraph.service.rememberme.RememberMeService;
5   
6   /**
7    * This class represents an extension point for Seraph. Applications that use Seraph library can register implementations of service interfaces
8    * defined by Seraph. To register an implementation host application must call an appropriate setter method eg. {@link #setRememberMeService(RememberMeService)}
9    * Once host application registers a service Seraph will use the registered service. Host application may chose not to register a service, 
10   * in such case Seraph will use default Noop implementation of it. E.g. if a host application does not set a {@link RememberMeService} through 
11   * {@link #setRememberMeService(RememberMeService)} Seraph will use a {@link NoopRememberMeService}  implementation of {@link RememberMeService}.
12   * 
13   * If in the future Seraph defines new SPIs and expects host application to provide implementations for them then this class will have to add 
14   * setters and getters definitions for new interfaces.
15   *  
16   * @author anatoli
17   *
18   */
19  public class ApplicationServicesRegistry
20  {
21      private static volatile RememberMeService rememberMeService = NoopRememberMeService.INSTANCE;
22  
23      /**
24       * This method provides the ability for a host application to set an implementation of {@link RememberMeService} for Seraph to use.
25       * If host application does not set its implementation of {@link RememberMeService} Seraph will use a {@link NoopRememberMeService}.
26       * 
27       * @param rememberMeService
28       * 
29       * @throws IllegalArgumentException if argument is null
30       */
31      public static void setRememberMeService(RememberMeService rememberMeService)
32      {
33          if (rememberMeService == null)
34          {
35              throw new IllegalArgumentException("rememberMeService must not be null.");
36          }
37          ApplicationServicesRegistry.rememberMeService = rememberMeService;
38      }
39      
40      /**
41       * Returns a RememberMeService that was set by an application via {@link #setRememberMeService(RememberMeService)}
42       * or a {@link NoopRememberMeService} if application has not set one. Will never return null. 
43       * @return
44       */
45      public static RememberMeService getRememberMeService()
46      {
47          return rememberMeService;
48      }
49  }