package io.cattle.platform.spring.web; import io.cattle.platform.archaius.util.ArchaiusUtil; import io.cattle.platform.util.type.InitializationTask; import io.cattle.platform.util.type.NamedUtils; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TreeSet; import javax.inject.Inject; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.context.support.WebApplicationContextUtils; import com.netflix.config.DynamicStringListProperty; public class StartupListener implements ServletContextListener { private static DynamicStringListProperty START_ORDER = ArchaiusUtil.getList("startup.priority"); private static final Logger log = LoggerFactory.getLogger("ConsoleStatus"); @Inject List<InitializationTask> tasks; @Override public void contextInitialized(ServletContextEvent event) { WebApplicationContextUtils .getRequiredWebApplicationContext(event.getServletContext()) .getAutowireCapableBeanFactory() .autowireBean(this); TreeSet<InitializationTask> sorted = new TreeSet<>(new Comparator<InitializationTask>() { @Override public int compare(InitializationTask o1, InitializationTask o2) { String left = NamedUtils.getName(o1); if (left == null) { throw new IllegalStateException("Name is null for " + o1); } int result = left.compareTo(NamedUtils.getName(o2)); if (result == 0) { return Integer.compare(o1.hashCode(), o2.hashCode()); } return result; } }); List<InitializationTask> runOrder = new ArrayList<>(); Map<String, InitializationTask> byName = new HashMap<>(); for (InitializationTask task : tasks) { byName.put(NamedUtils.getName(task), task); } sorted.addAll(tasks); for (String name : START_ORDER.get()) { InitializationTask task = byName.get(name); if (task == null) { continue; } runOrder.add(task); sorted.remove(task); } try { Class<?> schemaFactory = Class.forName("io.github.ibuildthecloud.gdapi.factory.SchemaFactory"); Iterator<InitializationTask> taskIter = sorted.iterator(); while (taskIter.hasNext()) { InitializationTask task = taskIter.next(); if (schemaFactory.isAssignableFrom(task.getClass())) { runOrder.add(task); taskIter.remove(); } } } catch (ClassNotFoundException e) { } runOrder.addAll(sorted); for (int i = 0; i < runOrder.size() ; i++) { InitializationTask task = runOrder.get(i); log.info("Starting [{}/{}]: {}", i+1, runOrder.size(), NamedUtils.getName(task)); task.start(); } } @Override public void contextDestroyed(ServletContextEvent sce) { } }