ApplicationLifecycle.java

  1. /*
  2.  * The coLAB project
  3.  * Copyright (C) 2021-2023 AlbaSim, MEI, HEIG-VD, HES-SO
  4.  *
  5.  * Licensed under the MIT License
  6.  */
  7. package ch.colabproject.colab.api.setup;

  8. import ch.colabproject.colab.api.controller.CdiBridgeSingleton;
  9. import ch.colabproject.colab.api.controller.setup.ApplicationLifecycleManager;
  10. import ch.colabproject.colab.generator.model.tools.PolymorphicDeserializer;
  11. import java.util.Set;
  12. import javax.inject.Inject;
  13. import javax.servlet.ServletConfig;
  14. import javax.servlet.ServletException;
  15. import javax.servlet.annotation.WebServlet;
  16. import javax.servlet.http.HttpServlet;
  17. import org.slf4j.Logger;
  18. import org.slf4j.LoggerFactory;
  19. import com.hazelcast.cluster.Member;
  20. import com.hazelcast.core.HazelcastInstance;

  21. /**
  22.  * @author maxence
  23.  */
  24. @WebServlet(loadOnStartup = 2)
  25. public class ApplicationLifecycle extends HttpServlet {

  26.     private static final long serialVersionUID = 1L;

  27.     /**
  28.      * Logger. Default level, set in logback.xml, is INFO
  29.      */
  30.     private static final Logger logger = LoggerFactory.getLogger(ApplicationLifecycle.class);

  31.     /** Hazelcast instance */
  32.     @Inject
  33.     private HazelcastInstance hzInstance;

  34.     /**
  35.      * User related methods
  36.      */
  37.     @Inject
  38.     private ApplicationLifecycleManager applicationLifecycleManager;

  39.     /**
  40.      * CDI bridge
  41.      */
  42.     @Inject
  43.     private CdiBridgeSingleton cdiBridgeSingleton;

  44.     /**
  45.      * Initialize application
  46.      *
  47.      * @param config servlet config
  48.      *
  49.      * @exception ServletException if an exception occurs that interrupts the servlet's normal
  50.      *                             operation
  51.      */
  52.     @Override
  53.     public void init(ServletConfig config) throws ServletException {
  54.         super.init(config);
  55.         logger.info("Initialize Application");

  56.         logger.info("Initialize Bridge Singleton");
  57.         cdiBridgeSingleton.init();

  58.         // make sure the PolymoorphicDeserializer known all entities defined in
  59.         // the ch.colabproject.colab.api package
  60.         int newTypeCount = PolymorphicDeserializer.includePackage("ch.colabproject.colab.api");
  61.         logger.info("Update PolymorphicDeserializer: {} new types", newTypeCount);

  62.         logger.info("Create a default admin user if none exists");
  63.         applicationLifecycleManager.createDefaultAdminIfNone();

  64.         Runtime.getRuntime().addShutdownHook(new Thread() {
  65.             @Override
  66.             public void run() {
  67.                 logger.info("Gracefull Shutdown Hook");
  68.                 gracefullShutdown();
  69.             }
  70.         });
  71.     }

  72.     /**
  73.      * Shutdown everything with grace
  74.      */
  75.     public void gracefullShutdown() {
  76.         if (hzInstance != null) {
  77.             Set<Member> members = hzInstance.getCluster().getMembers();
  78.             // TODO: sessionManager.writeActivityDatesToDatabase();
  79.             logger.error("Members: {}", members);
  80.         } else {
  81.             logger.error("NO HAZELCAST INSTANCE: SHOULD BE UNREACHABLE");
  82.         }

  83.         try {
  84.             String shutdownHook = System.getProperty("hazelcast.shutdownhook.enabled", "true");
  85.             if ("false".equals(shutdownHook)) {
  86.                 hzInstance.shutdown();
  87.             }
  88.         } catch (Exception ex) {
  89.             logger.error("HzShutdown Error: {}", ex);
  90.         }
  91.     }

  92.     @Override
  93.     public void destroy() {
  94.         logger.info("LIFE CYCLE : destroy");
  95.         super.destroy();
  96.     }
  97. }