StartUpServiceManager.java

  1. /*
  2.  * Copyright (c) 2002-2022, City of Paris
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  *
  9.  *  1. Redistributions of source code must retain the above copyright notice
  10.  *     and the following disclaimer.
  11.  *
  12.  *  2. Redistributions in binary form must reproduce the above copyright notice
  13.  *     and the following disclaimer in the documentation and/or other materials
  14.  *     provided with the distribution.
  15.  *
  16.  *  3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
  17.  *     contributors may be used to endorse or promote products derived from
  18.  *     this software without specific prior written permission.
  19.  *
  20.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  21.  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  23.  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
  24.  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  25.  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  26.  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  27.  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  28.  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  29.  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  30.  * POSSIBILITY OF SUCH DAMAGE.
  31.  *
  32.  * License 1.0
  33.  */
  34. package fr.paris.lutece.portal.service.init;

  35. import fr.paris.lutece.portal.service.spring.SpringContextService;
  36. import fr.paris.lutece.portal.service.util.AppLogService;

  37. import java.util.ArrayList;
  38. import java.util.Comparator;
  39. import java.util.List;
  40. import java.util.ServiceLoader;

  41. /**
  42.  * StartUpServiceManager
  43.  */
  44. public final class StartUpServiceManager
  45. {
  46.     /**
  47.      * Private constructor
  48.      */
  49.     private StartUpServiceManager( )
  50.     {
  51.     }
  52.     /**
  53.      * Initializes early initialization services.
  54.      * <p>
  55.      * This method loads and processes services implementing the {@link IEarlyInitializationService} interface
  56.      * before starting the Spring context.
  57.      * </p>
  58.      */
  59.     public static void initializeEarlyInitializationServices() {
  60.         List<IEarlyInitializationService> serviceList = new ArrayList<>();

  61.         // Load early initialization services using ServiceLoader
  62.         ServiceLoader<IEarlyInitializationService> providers = ServiceLoader.load(IEarlyInitializationService.class);
  63.         providers.forEach(serviceList::add);

  64.         // Sort services by order before processing
  65.         serviceList.stream()
  66.                 .sorted(Comparator.comparingInt(IEarlyInitializationService::getOrder))
  67.                 .forEach(service -> {
  68.                     String serviceName = service.getClass().getName();
  69.                     try {
  70.                         // Display an informational message before processing the service
  71.                         AppLogService.info("Processing StartUp service: {} before starting Spring Context", serviceName);
  72.                         // Call the service processing method
  73.                         service.process();
  74.                         // Display a success message after processing the service
  75.                         AppLogService.info("StartUp service processed successfully: {}", serviceName);
  76.                     } catch (Exception e) {
  77.                         // In case of error, display an error message and log the exception
  78.                         AppLogService.error("Error while processing StartUp service: {}", serviceName, e);
  79.                     }
  80.                 });
  81.     }
  82.     /**
  83.      * Runs all StartUp Services
  84.      */
  85.     public static void init( )
  86.     {
  87.         // Get all beans from the global ApplicationContext
  88.         List<StartUpService> listServices = SpringContextService.getBeansOfType( StartUpService.class );

  89.         // Process all services
  90.         for ( StartUpService service : listServices )
  91.         {
  92.             try
  93.             {
  94.                 AppLogService.info( "Processing StartUp service : {}", service.getName( ) );
  95.                 service.process( );
  96.             }
  97.             catch( Exception e )
  98.             {
  99.                 AppLogService.error( "Error while processing StartUp service : {}", service.getName( ), e );
  100.             }
  101.         }
  102.     }
  103. }