package com.robonobo.sonar;
import java.io.IOException;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.robonobo.core.api.proto.CoreApi.Node;
import com.robonobo.core.api.proto.CoreApi.NodeList;
import com.robonobo.sonar.retention.*;
@Controller
public class SonarController {
static final int MAX_PUBLIC_NODES_TO_RETURN = 10;
Log log = LogFactory.getLog(getClass());
RetentionStrategy rStrat = new PublicSupernodesOnlyStrategy();
// RetentionStrategy rStrat = new SupernodesOnlyStrategy();
@Autowired
private NodeDao nodeDao;
@RequestMapping(value = "/", method = RequestMethod.POST)
@Transactional(rollbackFor = Exception.class)
public void getSupernodes(HttpServletRequest req, HttpServletResponse resp) throws IOException {
Node.Builder nb = Node.newBuilder();
nb.mergeFrom(req.getInputStream());
Node node = nb.build();
if (rStrat.shouldRetainNode(node)) {
log.info("Retaining node " + node);
nodeDao.deleteDuplicateNodes(node);
nodeDao.saveNode(node);
}
List<Node> nodes = nodeDao.getAllSupernodes(node);
NodeList nl = NodeList.newBuilder().addAllNode(nodes).build();
nl.writeTo(resp.getOutputStream());
resp.setContentType("application/data");
resp.setStatus(HttpServletResponse.SC_OK);
log.info("Node " + node.getId() + " called in - sent " + nodes.size() + " supernodes");
}
}