package com.netflix.hystrix.dashboard.stream;
import com.google.common.base.Charsets;
import com.google.common.io.Files;
import com.google.common.io.Resources;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
/**
* Simulate an event stream URL by retrieving pre-canned data instead of going to live servers.
*/
public class MockStreamServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final Logger logger = LoggerFactory.getLogger(MockStreamServlet.class);
public MockStreamServlet() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filename = request.getParameter("file");
if (filename == null) {
// default to using hystrix.stream
filename = "hystrix.stream";
} else {
// strip any .. / characters to avoid security problems
filename = filename.replaceAll("\\.\\.", "");
filename = filename.replaceAll("/", "");
}
int delay = 500;
String delayArg = request.getParameter("delay");
if (delayArg != null) {
delay = Integer.parseInt(delayArg);
}
int batch = 1;
String batchArg = request.getParameter("batch");
if (batchArg != null) {
batch = Integer.parseInt(batchArg);
}
String data = getFileFromPackage(filename);
String lines[] = data.split("\n");
response.setContentType("text/event-stream");
response.setCharacterEncoding("UTF-8");
int batchCount = 0;
// loop forever unless the user closes the connection
for (;;) {
for (String s : lines) {
s = s.trim();
if (s.length() > 0) {
try {
response.getWriter().println(s);
response.getWriter().println(""); // a newline is needed after each line for the events to trigger
response.getWriter().flush();
batchCount++;
} catch (Exception e) {
logger.warn("Exception writing mock data to output.", e);
// most likely the user closed the connection
return;
}
if (batchCount == batch) {
// we insert the delay whenever we finish a batch
try {
// simulate the delays we get from the real feed
Thread.sleep(delay);
} catch (InterruptedException e) {
// ignore
}
// reset
batchCount = 0;
}
}
}
}
}
private String getFileFromPackage(String filename) {
try {
return Files.toString(new File(Resources.getResource("assets/" + filename).toURI()), Charsets.UTF_8);
} catch (Exception e) {
throw new RuntimeException("Could not find file: " + filename, e);
}
}
}