package com.netflix.suro.input; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.inject.Inject; import com.netflix.config.DynamicStringProperty; import com.netflix.governator.annotations.Configuration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.PostConstruct; import java.util.List; public class DynamicPropertyInputConfigurator { public static final String INPUT_CONFIG_PROPERTY = "SuroServer.inputConfig"; private static Logger LOG = LoggerFactory.getLogger(DynamicPropertyInputConfigurator.class); private final InputManager inputManager; private final ObjectMapper jsonMapper; @Configuration(INPUT_CONFIG_PROPERTY) private String initialInputConfig; @Inject public DynamicPropertyInputConfigurator( InputManager inputManager, ObjectMapper jsonMapper) { this.inputManager = inputManager; this.jsonMapper = jsonMapper; } @PostConstruct public void init() { DynamicStringProperty inputFP = new DynamicStringProperty(INPUT_CONFIG_PROPERTY, initialInputConfig) { @Override protected void propertyChanged() { buildInput(get(), false); } }; buildInput(inputFP.get(), true); } private void buildInput(String inputListStr, boolean initialSet) { try { List<SuroInput> inputList = jsonMapper.readValue( inputListStr, new TypeReference<List<SuroInput>>() {}); if (initialSet) { inputManager.initialSet(inputList); } else { inputManager.set(inputList); } } catch (Exception e) { LOG.info("Error reading input config from fast property: "+e.getMessage(), e); } } }