package com.appengine.dockstats;
//~--- non-JDK imports --------------------------------------------------------
import com.appengine.dockstats.entities.DockStation;
import com.google.appengine.api.memcache.Expiration;
import com.google.appengine.api.memcache.MemcacheService;
import com.google.appengine.api.memcache.MemcacheServiceFactory;
//~--- JDK imports ------------------------------------------------------------
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* DockFeedServlet
*
* @author Sachin Handiekar
* @version 1.0
*/
@SuppressWarnings("serial")
public class DockFeedServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setContentType("text/plain");
PrintWriter out = resp.getWriter();
out.println("-- TFL Cycle Hire Crawler --");
URL page = new URL("https://web.barclayscyclehire.tfl.gov.uk/maps");
URLConnection urlc = page.openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(urlc.getInputStream()));
StringBuffer buffer = new StringBuffer();
String temp = Constants.EMPTY_STRING;
while ((temp = br.readLine()) != null) {
buffer.append(temp);
}
br.close();
Map<Integer, DockStation> mp = new HashMap<Integer, DockStation>();
DockStation station = null;
try {
Pattern regex =
Pattern.compile(
"(\\{id:\"(\\d+)\".+?name:\"(.+?)\".+?lat:\"(.+?)\".+?long:\"(.+?)\".+?nbBikes:\"(\\d+)\".+?nbEmptyDocks:\"(\\d+)\".+?installed:\"(.+?)\".+?locked:\"(.+?)\".+?temporary:\"(.+?)\"\\})");
Matcher regexMatcher = regex.matcher(buffer);
while (regexMatcher.find()) {
station = new DockStation();
int id = Integer.parseInt(regexMatcher.group(2));
station.setId(id);
station.setName(regexMatcher.group(3));
station.setLatitude((Double.parseDouble(regexMatcher.group(4))));
station.setLongitude((Double.parseDouble(regexMatcher.group(5))));
station.setNbBikeAvailable(Integer.parseInt(regexMatcher.group(6)));
station.setNbEmptyDocks(Integer.parseInt(regexMatcher.group(7)));
station.setInstalled(Boolean.valueOf(regexMatcher.group(8)));
station.setLocked(Boolean.valueOf(regexMatcher.group(9)));
station.setTemporary(Boolean.valueOf(regexMatcher.group(10)));
mp.put(id, station);
}
} catch (PatternSyntaxException ex) {
// Syntax error in the regular expression
}
String updatedTime = Constants.EMPTY_STRING;
// Get Time
try {
Pattern regex = Pattern.compile("(var hour='(\\d\\d:\\d\\d)')");
Matcher regexMatcher = regex.matcher(buffer);
while (regexMatcher.find()) {
updatedTime = regexMatcher.group(2);
}
} catch (PatternSyntaxException ex) {
// Syntax error in the regular expression
}
MemcacheService memcache = MemcacheServiceFactory.getMemcacheService();
memcache.put("cycleData", mp, Expiration.byDeltaSeconds(120));
memcache.put("updateTime", updatedTime, Expiration.byDeltaSeconds(120));
}
}