ApplicationLifecycle.java
/*
* The coLAB project
* Copyright (C) 2021-2023 AlbaSim, MEI, HEIG-VD, HES-SO
*
* Licensed under the MIT License
*/
package ch.colabproject.colab.api.setup;
import ch.colabproject.colab.api.controller.CdiBridgeSingleton;
import ch.colabproject.colab.api.controller.setup.ApplicationLifecycleManager;
import ch.colabproject.colab.generator.model.tools.PolymorphicDeserializer;
import java.util.Set;
import javax.inject.Inject;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.hazelcast.cluster.Member;
import com.hazelcast.core.HazelcastInstance;
/**
* @author maxence
*/
@WebServlet(loadOnStartup = 2)
public class ApplicationLifecycle extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* Logger. Default level, set in logback.xml, is INFO
*/
private static final Logger logger = LoggerFactory.getLogger(ApplicationLifecycle.class);
/** Hazelcast instance */
@Inject
private HazelcastInstance hzInstance;
/**
* User related methods
*/
@Inject
private ApplicationLifecycleManager applicationLifecycleManager;
/**
* CDI bridge
*/
@Inject
private CdiBridgeSingleton cdiBridgeSingleton;
/**
* Initialize application
*
* @param config servlet config
*
* @exception ServletException if an exception occurs that interrupts the servlet's normal
* operation
*/
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
logger.info("Initialize Application");
logger.info("Initialize Bridge Singleton");
cdiBridgeSingleton.init();
// make sure the PolymoorphicDeserializer known all entities defined in
// the ch.colabproject.colab.api package
int newTypeCount = PolymorphicDeserializer.includePackage("ch.colabproject.colab.api");
logger.info("Update PolymorphicDeserializer: {} new types", newTypeCount);
logger.info("Create a default admin user if none exists");
applicationLifecycleManager.createDefaultAdminIfNone();
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
logger.info("Gracefull Shutdown Hook");
gracefullShutdown();
}
});
}
/**
* Shutdown everything with grace
*/
public void gracefullShutdown() {
if (hzInstance != null) {
Set<Member> members = hzInstance.getCluster().getMembers();
// TODO: sessionManager.writeActivityDatesToDatabase();
logger.error("Members: {}", members);
} else {
logger.error("NO HAZELCAST INSTANCE: SHOULD BE UNREACHABLE");
}
try {
String shutdownHook = System.getProperty("hazelcast.shutdownhook.enabled", "true");
if ("false".equals(shutdownHook)) {
hzInstance.shutdown();
}
} catch (Exception ex) {
logger.error("HzShutdown Error: {}", ex);
}
}
@Override
public void destroy() {
logger.info("LIFE CYCLE : destroy");
super.destroy();
}
}