package codeine.servlets.api_servlets; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import codeine.api.NodeGetter; import codeine.api.NodeInfo; import codeine.api.NodeWithMonitorsInfo; import codeine.configuration.IConfigurationManager; import codeine.jsons.nodes.NodeDiscoveryStrategy; import codeine.jsons.project.ProjectJson; import codeine.model.Constants; import codeine.servlet.AbstractApiServlet; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.inject.Inject; public class ProjectTagsApiServlet extends AbstractApiServlet { private static final long serialVersionUID = 1L; private static final Logger log = Logger.getLogger(ProjectTagsApiServlet.class); @Inject private IConfigurationManager configurationManager; @Inject private NodeGetter nodesGetter; @Override protected void myGet(HttpServletRequest request, HttpServletResponse response) { String projectName = getParameter(request, Constants.UrlParameters.PROJECT_NAME); ProjectJson project = configurationManager.getProjectForName(projectName); Map<String,Integer> map = Maps.newHashMap(); if (project.node_discovery_startegy() == NodeDiscoveryStrategy.Configuration && !projectName.equals(Constants.CODEINE_NODES_PROJECT_NAME)) { log.info("getting static tags"); for (NodeInfo node : project.nodes_info()) { updateMapWithNode(map, node); } } else { List<NodeWithMonitorsInfo> nodes = nodesGetter.getNodes(projectName); for (NodeWithMonitorsInfo nodeWithMonitorsInfo : nodes) { updateMapWithNode(map, nodeWithMonitorsInfo); } } List<NodeTag> list = Lists.newArrayList(); for (Entry<String, Integer> e : map.entrySet()) { list.add(new NodeTag(e.getKey(), e.getValue())); } Comparator<NodeTag> c = new Comparator<NodeTag>() { @Override public int compare(NodeTag o1, NodeTag o2) { return o1.name().compareTo(o2.name()); } }; Collections.sort(list, c); writeResponseJson(response, list); } public void updateMapWithNode(Map<String, Integer> map, NodeInfo node) { if (node.tags() == null) { return; } for (String tag : node.tags()) { if (!map.containsKey(tag)) { map.put(tag, 1); } else { map.put(tag, map.get(tag) + 1); } } } public static class NodeTag { public NodeTag(String name, int count) { super(); this.name = name; this.count = count; } String name; int count; public String name() { return name; } } @Override protected boolean checkPermissions(HttpServletRequest request) { return canReadProject(request); } }