package codeine.servlets.api_servlets.angular;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import codeine.api.NodeGetter;
import codeine.api.NodeWithMonitorsInfo;
import codeine.configuration.IConfigurationManager;
import codeine.configuration.Links;
import codeine.jsons.collectors.CollectorExecutionInfoWithResult;
import codeine.jsons.collectors.CollectorInfo;
import codeine.jsons.collectors.CollectorInfo.CollectorType;
import codeine.jsons.project.ProjectJson;
import codeine.model.Constants;
import codeine.servlet.AbstractApiServlet;
import codeine.utils.network.HttpUtils;
import com.google.gson.Gson;
import com.google.inject.Inject;
public class CollectorStatusApiServlet extends AbstractApiServlet {
private static final Logger log = Logger
.getLogger(CollectorStatusApiServlet.class);
private static final long serialVersionUID = 1L;
@Inject private NodeGetter nodesGetter;
@Inject private Links links;
@Inject private Gson gson;
@Inject private IConfigurationManager configurationManager;
@Override
protected boolean checkPermissions(HttpServletRequest request) {
return canReadProject(request);
}
@Override
protected void myGet(HttpServletRequest request, HttpServletResponse response) {
CollectorExecutionInfoWithResult collectorResult = null;
try {
String projectName = getParameter(request, Constants.UrlParameters.PROJECT_NAME);
String nodeName = getParameter(request, Constants.UrlParameters.NODE);
String collectorName = getParameter(request, Constants.UrlParameters.COLLECTOR);
NodeWithMonitorsInfo node = nodesGetter.getNodeByNameOrNull(projectName, nodeName);
String peerCollectorResultLink = links.getPeerCollectorResultLink(node.peer_address(), projectName, collectorName, nodeName);
log.info("accessing url " + peerCollectorResultLink);
String outputFromPeer = HttpUtils.doGET(peerCollectorResultLink,null, HttpUtils.MEDIUM_READ_TIMEOUT_MILLI);
// String encodeOutput = HttpUtils.encodeHTML(outputFromPeer);
collectorResult = gson.fromJson(outputFromPeer, CollectorExecutionInfoWithResult.class);
collectorResult.collector_configuration(getCollectorInfo(projectName, collectorName));
} catch (Exception e) {
log.error("failed to get collector output", e);
collectorResult = new CollectorExecutionInfoWithResult(null, null);
}
writeResponseGzipJson(collectorResult, request, response);
}
private CollectorInfo getCollectorInfo(String projectName, String collectorName) {
ProjectJson projectForName = configurationManager.getProjectForName(projectName);
if (collectorName.equals(Constants.VERSION_COLLECTOR_NAME)) {
return new CollectorInfo(Constants.VERSION_COLLECTOR_NAME, projectForName.version_detection_script(), CollectorType.String);
}
if (collectorName.equals(Constants.TAGS_COLLECTOR_NAME)) {
return new CollectorInfo(Constants.TAGS_COLLECTOR_NAME, projectForName.tags_discovery_script(), CollectorType.String);
}
for (CollectorInfo c : projectForName.collectors()) {
if (c.name().equals(collectorName)) {
return c;
}
}
throw new IllegalArgumentException(collectorName + " not found in project " + projectName);
}
}