package io.cattle.platform.extension.spring; import io.cattle.platform.engine.handler.ProcessHandler; import io.cattle.platform.engine.handler.ProcessLogic; import io.cattle.platform.engine.handler.ProcessPostListener; import io.cattle.platform.engine.handler.ProcessPreListener; import io.cattle.platform.extension.impl.ExtensionManagerImpl; import io.cattle.platform.util.type.NamedUtils; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.PostConstruct; import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ExtensionDiscovery { private static final Logger log = LoggerFactory.getLogger("ConsoleStatus"); @Inject ExtensionManagerImpl extensionManager; @Inject List<ProcessHandler> processHandlers; @Inject List<ProcessPreListener> processPreListeners; @Inject List<ProcessPostListener> processPostListeners; private static final Map<Class<?>, String> SUFFIXES = new HashMap<Class<?>, String>(); static { SUFFIXES.put(ProcessHandler.class, ".handlers"); SUFFIXES.put(ProcessPreListener.class, ".pre.listeners"); SUFFIXES.put(ProcessPostListener.class, ".post.listeners"); } @PostConstruct public void init() { log.info("Loading processes"); for (ProcessHandler handler : processHandlers) { process(handler, ProcessHandler.class); } for (ProcessPreListener handler : processPreListeners) { process(handler, ProcessPreListener.class); } for (ProcessPostListener handler : processPostListeners) { process(handler, ProcessPostListener.class); } extensionManager.reset(); } protected String[] getKeys(Object obj, Class<?> typeClz) { if (obj instanceof ProcessLogic) { String[] names = ((ProcessLogic) obj).getProcessNames(); String[] result = new String[names.length]; for (int i = 0; i < result.length; i++) { String suffix = SUFFIXES.get(typeClz); if (suffix == null) { throw new IllegalArgumentException("Object is not an instance of ProcessHandler, " + "ProcessPreListener, or ProcessPostListener, got [" + obj.getClass() + "]"); } result[i] = "process." + names[i].toLowerCase() + suffix; } return result; } return new String[0]; } public Object process(Object bean, Class<?> typeClass) { String name = NamedUtils.getName(bean); if (name != null) { for (String key : getKeys(bean, typeClass)) { extensionManager.addObject(key, typeClass, bean, name); } } return bean; } }