package com.sequenceiq.cloudbreak.reactor.init; import static reactor.bus.selector.Selectors.$; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.PostConstruct; import javax.annotation.Resource; import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import com.sequenceiq.cloudbreak.reactor.ClusterEventHandler; import com.sequenceiq.cloudbreak.reactor.api.event.EventSelectorUtil; import reactor.bus.EventBus; @Component public class ClusterPlatformInitializer { private static final Logger LOGGER = LoggerFactory.getLogger(ClusterPlatformInitializer.class); @Resource private List<ClusterEventHandler> handlers; @Inject private EventBus eventBus; @PostConstruct public void init() { validateSelectors(); LOGGER.info("Registering ClusterEventHandler"); for (ClusterEventHandler handler : handlers) { String selector = EventSelectorUtil.selector(handler.type()); LOGGER.info("Registering handler [{}] for selector [{}]", handler.getClass(), selector); eventBus.on($(selector), handler); } } private void validateSelectors() { LOGGER.debug("There are {} handlers suitable for registering", handlers.size()); Map<Class, ClusterEventHandler> handlerMap = new HashMap<>(); for (ClusterEventHandler handler : handlers) { ClusterEventHandler entry = handlerMap.put(handler.type(), handler); if (null != entry) { LOGGER.error("Duplicated handlers! actual: {}, existing: {}", handler, entry); throw new IllegalStateException("Duplicate handlers! first: " + handler + " second: " + entry); } } } }