package codeine.collectors.tags;
import java.util.List;
import javax.inject.Inject;
import org.apache.log4j.Logger;
import codeine.PeerStatusChangedUpdater;
import codeine.api.NodeInfo;
import codeine.collectors.IOneCollectorRunner;
import codeine.collectors.OneCollectorRunner;
import codeine.collectors.OneCollectorRunnerFactory;
import codeine.configuration.IConfigurationManager;
import codeine.jsons.collectors.CollectorInfo;
import codeine.jsons.collectors.CollectorInfo.CollectorType;
import codeine.jsons.peer_status.PeerStatus;
import codeine.jsons.project.ProjectJson;
import codeine.model.Constants;
import codeine.utils.logging.LogUtils;
import com.google.common.collect.Lists;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import com.google.inject.assistedinject.Assisted;
public class TagsCollectorRunner implements IOneCollectorRunner {
private static final Logger log = Logger.getLogger(TagsCollectorRunner.class);
@Inject private PeerStatus projectStatusUpdater;
@Inject private PeerStatusChangedUpdater peerStatusChangedUpdater;
private IConfigurationManager configurationManager;
private OneCollectorRunner runner;
private ProjectJson project;
private String projectName;
private NodeInfo node;
@Inject
public TagsCollectorRunner(@Assisted String projectName, @Assisted NodeInfo node
, IConfigurationManager configurationManager, OneCollectorRunnerFactory oneCollectorRunnerFactory) {
super();
this.projectName = projectName;
this.node = node;
this.configurationManager = configurationManager;
CollectorInfo collectorInfo = initAndGetConf();
runner = oneCollectorRunnerFactory.create(collectorInfo, project, node);
}
private CollectorInfo initAndGetConf() {
project = configurationManager.getProjectForName(projectName);
CollectorInfo collectorInfo = new CollectorInfo(Constants.TAGS_COLLECTOR_NAME, project.tags_discovery_script(), CollectorType.String);
return collectorInfo;
}
@Override
public void execute() {
CollectorInfo collectorInfo = initAndGetConf();
runner.updateConf(collectorInfo);
List<String> tags = getTagsList();
updateTags(tags);
}
public void updateTags(List<String> tags) {
List<String> prevTags = projectStatusUpdater.updateTags(project, node.name(), node.alias(), tags);
if (!tags.equals(prevTags)) {
LogUtils.info(log, "tags should update", tags, prevTags);
peerStatusChangedUpdater.pushUpdate("TagsCollectorRunner.updateTags()");
}
}
public List<String> getTagsList() {
switch (project.node_discovery_startegy()) {
case Script:
if (project.tags_discovery_script() == null) {
return Lists.newArrayList();
}
return getTagsByScript();
case Configuration:
return getTagsByConfiguration();
default:
LogUtils.assertFailed(log, "could not find how to execute strategy " + project.node_discovery_startegy() + " for project " + project.name());
return Lists.newArrayList();
}
}
private List<String> getTagsByScript() {
runner.execute();
String tags = runner.outputFromFile();
log.info("output is " + tags);
if (tags.isEmpty()){
tags = "[]";
}
@SuppressWarnings("serial")
List<String> tagsList = new Gson().fromJson(tags, new TypeToken<List<String>>(){}.getType());
return tagsList;
}
private List<String> getTagsByConfiguration() {
return node.tags();
}
}