package se.sics.ipasdistances;
import java.io.*;
import java.util.HashMap;
import java.util.Scanner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import se.sics.asdistances.PrefixHandler;
/**
*
* This prefix matcher class. It is a singleton
*
* @author elbeltagy
*
*/
public class PrefixMatcher {
private static Logger log = LoggerFactory.getLogger(PrefixMatcher.class);
private static final Integer MINUSONE = new Integer(-1);
// private static final Logger log =
// LoggerFactory.getLogger(PrefixMatcher.class);
private static HashMap<Integer, Integer> prefixMap = new HashMap<Integer, Integer>();
private static HashMap<Integer, String> asNameMap = null;
int minPrefixLen = 50;
int maxPrefixLen = 0;
private PrefixMatcher() {
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("data/routes.txt");
try {
Scanner s = new Scanner(is);
while (s.hasNext()) {
String prefix = s.next();
int asNum = s.nextInt();
String[] prefixPart = prefix.split("[./]");
int prefixLen = Integer.parseInt(prefixPart[4]);
int integerPrefix = PrefixHandler.prefixToInteger(prefix);
prefixMap.put(integerPrefix, asNum);
if (prefixLen < minPrefixLen) {
minPrefixLen = prefixLen;
}
if (prefixLen > maxPrefixLen) {
maxPrefixLen = prefixLen;
}
}
s.close();
} catch (Exception e) {
// log.error("Can not read prefix file data"+e.toString());
}
}
/**
* Finds the AS number that the IP adress belongs to
*
* @param ip
* @return
*/
public Integer matchIPtoAS(String ip) {
Integer ipInteger = PrefixHandler.prefixToInteger(ip);
return matchIPtoAS(ipInteger);
}
/**
* Finds the AS number that the IP adress belongs to
*
* @param ip
* @return
*/
public Integer matchIPtoAS(Integer ipInteger) {
Integer asNum = MINUSONE;
for (int i = maxPrefixLen; i >= minPrefixLen; i--) {
ipInteger = (ipInteger >>> (32 - i)) << (32 - i);
if (prefixMap.containsKey(ipInteger)) {
asNum = prefixMap.get(ipInteger);
break;
}
}
if (asNum == MINUSONE) {
log.error("Failed to lookup AS for " + ipInteger);
}
return asNum;
}
private void constructASnameMap() {
asNameMap = new HashMap<Integer, String>();
BufferedReader br;
try {
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("data/asn-ctl.txt");
br = new BufferedReader(new InputStreamReader(is));
br.readLine(); // Just skip the first line
String line;
while ((line = br.readLine()) != null) {
String[] parts = line.split("\t");
if (parts[0].compareTo("1.0") == 0) {
break;
}
int asNum = Integer.parseInt(parts[0]);
asNameMap.put(asNum, parts[3]);
}
br.close();
} catch (Exception e) {
// log.error("Can not read AS Name file data");
}
}
public String getASName(int asNum) {
if (asNameMap == null) {
constructASnameMap();
}
return asNameMap.get(asNum);
}
private static PrefixMatcher instance = null;
public static synchronized PrefixMatcher getInstance() {
if (instance == null) {
instance = new PrefixMatcher();
}
return instance;
}
/**
*
* @param args
*/
public static void main(String[] args) {
PrefixMatcher pm = PrefixMatcher.getInstance();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String ip = null;
try {
while (ip != "q") {
System.out.print("Enter IP:");
ip = br.readLine();
int asNum = pm.matchIPtoAS(ip);
String asName = pm.getASName(asNum);
System.out.println(asNum + "\t" + asName);
}
} catch (IOException ioe) {
System.out.println("IO error trying to read your name!");
System.exit(1);
}
}
public HashMap<Integer, Integer> getRawData() {
return prefixMap;
}
}