package codeine.collectors;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import javax.inject.Inject;
import org.apache.log4j.Logger;
import codeine.PeerStatusChangedUpdater;
import codeine.api.NodeInfo;
import codeine.configuration.IConfigurationManager;
import codeine.configuration.NodeMonitor;
import codeine.jsons.collectors.CollectorInfo;
import codeine.jsons.collectors.CollectorInfo.CollectorType;
import codeine.jsons.peer_status.PeerStatus;
import codeine.jsons.project.ProjectJson;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.google.inject.assistedinject.Assisted;
public class CollectorsListHolder {
private static final Logger log = Logger.getLogger(CollectorsListHolder.class);
@Inject private PeerStatus peerStatus;
@Inject private IConfigurationManager configurationManager;
@Inject private PeerStatusChangedUpdater peerStatusChangedUpdater;
@Inject private OneCollectorRunnerFactory oneCollectorRunnerFactory;
private String projectName;
private NodeInfo node;
private Map<String, OneCollectorRunner> runnersMap = Maps.newLinkedHashMap();
@Inject
public CollectorsListHolder(@Assisted String projectName, @Assisted NodeInfo node) {
this.projectName = projectName;
this.node = node;
}
public Collection<OneCollectorRunner> getCurrentListAndRemoveOldCollectors() {
ProjectJson project = project();
removeFromMap(project);
addAndUpdateConfInMap(project);
boolean removed = peerStatus.removeNonExistCollectors(project, node.name(), node.alias());
if (removed) {
peerStatusChangedUpdater.pushUpdate("CollectorsListHolder.getCurrentListAndRemoveOldCollectors()");
}
return runnersMap.values();
}
private void addAndUpdateConfInMap(ProjectJson project) {
//TODO monitors backward
for (NodeMonitor monitorInfo : project.monitors()) {
String name = monitorInfo.name();
CollectorType type = CollectorType.Monitor;
int minInterval = monitorInfo.minInterval() == null ? 0 : monitorInfo.minInterval();
CollectorInfo collectorInfo = new CollectorInfo(name, monitorInfo.script_content(), minInterval, monitorInfo.credentials(), type, monitorInfo.notification_enabled());
if (runnersMap.containsKey(name)) {
runnersMap.get(name).updateConf(collectorInfo);
} else {
runnersMap.put(name, oneCollectorRunnerFactory.create(collectorInfo, project, node));
}
}
for (CollectorInfo collectorInfo : project.collectors()) {
String name = collectorInfo.name();
if (runnersMap.containsKey(name)) {
runnersMap.get(name).updateConf(collectorInfo);
} else {
runnersMap.put(name, oneCollectorRunnerFactory.create(collectorInfo, project, node));
}
}
}
private void removeFromMap(ProjectJson project) {
Set<String> names = Sets.newHashSet();
for (CollectorInfo c : project.collectors()) {
names.add(c.name());
}
//TODO monitors backward
for (NodeMonitor m : project.monitors()) {
names.add(m.name());
}
Set<String> namesToRemove = Sets.newHashSet(runnersMap.keySet());
namesToRemove.removeAll(names);
for (String name : namesToRemove) {
log.info("removing collector " + name);
runnersMap.remove(name);
}
}
private ProjectJson project() {
return configurationManager.getProjectForName(projectName);
}
}