package com.anjlab.ping.pages;
import static com.anjlab.ping.services.Utils.isNullOrEmpty;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.tapestry5.PersistenceConstants;
import org.apache.tapestry5.annotations.CleanupRender;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.services.RequestGlobals;
import com.anjlab.ping.services.location.IPResolver;
import com.anjlab.ping.services.location.Location;
import com.anjlab.ping.services.location.LocationResolver;
public class TraceRoute {
@Property
@Persist(PersistenceConstants.SESSION)
private String traceRoute;
@Inject
private LocationResolver locationResolver;
@Property
private List<String> ipList;
private Map<String, Location> locations;
private String ips;
@Property
private String ip;
public Location getLocation() {
return locations.get(ip);
}
@Inject
private RequestGlobals globals;
@Inject
private IPResolver ipResolver;
public void onActivate() {
if (isNullOrEmpty(traceRoute)) {
traceRoute =
"Your IP: " + globals.getHTTPServletRequest().getRemoteAddr()
+ "\nPing Service IP: " + ipResolver.resolveIp("http://ping-service.appspot.com");
}
}
@CleanupRender
public void cleanup() {
ips = null;
ipList = null;
locations = null;
}
public String getIps() {
if (ips == null) {
StringBuilder builder = new StringBuilder("{");
ipList = extractIPs(traceRoute);
locations = new HashMap<String, Location>();
for (String ip : ipList) {
if (ip.startsWith("192.168.") || ip.startsWith("127.")) {
continue;
}
Location location = locationResolver.resolveLocation(ip);
if (location.isEmpty()) {
continue;
}
if (builder.length() > 1) {
builder.append(",");
}
builder.append('"');
builder.append(ip);
builder.append("\":");
builder.append(location.toJSON());
locations.put(ip, location);
}
builder.append("}");
ips = builder.toString();
}
return ips;
}
public static List<String> extractIPs(String traceRoute) {
List<String> ips = new ArrayList<String>();
if (isNullOrEmpty(traceRoute)) {
return ips;
}
Matcher matcher = Pattern.compile("(\\d+\\.\\d+\\.\\d+\\.\\d+)\n?").matcher(traceRoute);
while (matcher.find()) {
String ip = matcher.group(1);
ips.add(ip);
}
return ips;
}
}