package at.asitplus.eidas.specific.connector; import org.opensaml.core.config.InitializationException; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.web.context.WebApplicationContext; import at.gv.egiz.eaaf.core.api.IStatusMessenger; import at.gv.egiz.eaaf.core.impl.logging.LogMessageProviderFactory; import at.gv.egiz.eaaf.core.impl.logging.SimpleStatusMessager; import at.gv.egiz.eaaf.modules.pvp2.impl.opensaml.initialize.EaafOpenSaml3xInitializer; import lombok.extern.slf4j.Slf4j; import net.shibboleth.utilities.java.support.component.ComponentInitializationException; @Slf4j @SpringBootApplication(scanBasePackages = { "at.asitplus.eidas.specific.connector", "at.gv.egiz.eaaf.utils.springboot.ajp" }) public class SpringBootApplicationInitializer extends SpringBootServletInitializer { private static ConfigurableApplicationContext ctx; /** * Starts MS-specific eIDAS-Implementation SpringBoot application. * * @param args Starting parameters * @throws Throwable In case of a start-up error */ public static void main(final String[] args) throws Throwable { try { log.info("=============== Initializing Spring-Boot context! ==============="); LogMessageProviderFactory.setStatusMessager(new SimpleStatusMessager()); final SpringApplication springApp = new SpringApplication(SpringBootApplicationInitializer.class); springApp.addInitializers(new MsSpecificSpringBootApplicationContextInitializer()); log.info("Bootstrap openSAML .... "); EaafOpenSaml3xInitializer.eaafInitialize(); log.debug("Run SpringBoot initialization process ... "); ctx = springApp.run(args); // initialize status messenger LogMessageProviderFactory.setStatusMessager(ctx.getBean(IStatusMessenger.class)); log.info("Initialization of MS-specific eIDAS-Connector finished."); } catch (final Throwable e) { log.error("MS-specific eIDAS-Connector initialization FAILED!", e); throw e; } } protected SpringApplicationBuilder createSpringApplicationBuilder() { try { log.info("Bootstrap openSAML .... "); EaafOpenSaml3xInitializer.eaafInitialize(); } catch (InitializationException | ComponentInitializationException e) { throw new RuntimeException(e); } SpringApplicationBuilder builder = new SpringApplicationBuilder(); builder.initializers(new MsSpecificSpringBootApplicationContextInitializer()); return builder; } protected WebApplicationContext run(SpringApplication application) { WebApplicationContext internalContext = (WebApplicationContext) application.run(); // initialize status messenger LogMessageProviderFactory.setStatusMessager(internalContext.getBean(IStatusMessenger.class)); log.info("Initialization of MS-specific eIDAS-Connector finished."); return internalContext; } /** * Stops SpringBoot application of MS-specific eIDAS-Implementation. * */ public static void exit() { if (ctx != null) { log.info("Stopping SpringBoot application ... "); SpringApplication.exit(ctx, () -> 0); ctx = null; } else { log.info("No SpringBoot context. Nothing todo"); } } }