package com.netflix.suro.input; import com.google.common.collect.Sets; import com.google.inject.Singleton; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @Singleton public class InputManager { private static final Logger log = LoggerFactory.getLogger(InputManager.class); private ConcurrentMap<String, SuroInput> inputMap = new ConcurrentHashMap<String, SuroInput>(); public void initialStart() throws Exception { for (SuroInput suroInput : inputMap.values()) { suroInput.start(); } } public void initialSet(List<SuroInput> inputList) { if (!inputMap.isEmpty()) { throw new RuntimeException("inputMap is not empty"); } for (SuroInput suroInput : inputList) { inputMap.put(suroInput.getId(), suroInput); } } public void set(List<SuroInput> inputList) { for (SuroInput suroInput : inputList) { if (!inputMap.containsKey(suroInput.getId())) { try { suroInput.start(); inputMap.put(suroInput.getId(), suroInput); } catch (Exception e) { log.error("Exception on starting the input", e); } } } HashSet<SuroInput> suroInputIdSet = Sets.newHashSet(inputList); for (Map.Entry<String, SuroInput> e : inputMap.entrySet()) { if (!suroInputIdSet.contains(e.getValue())) { SuroInput input = inputMap.remove(e.getKey()); input.shutdown(); } } } public SuroInput getInput(String id) { return inputMap.get(id); } public void shutdown() { for (SuroInput input : inputMap.values()) { input.shutdown(); } } }