package com.subgraph.orchid.data.exitpolicy;
import com.subgraph.orchid.TorException;
import com.subgraph.orchid.TorParsingException;
public class PortRange {
public static PortRange createFromString(String ports) {
final String[] parts = ports.split("-");
if(parts.length == 1) {
return new PortRange(stringToPort(parts[0]));
} else if(parts.length == 2) {
return new PortRange(stringToPort(parts[0]), stringToPort(parts[1]));
} else {
throw new TorParsingException("Could not parse port range from string: " + ports);
}
}
private static int stringToPort(String port) {
try {
final int portValue = Integer.parseInt(port);
if(!isValidPort(portValue))
throw new TorParsingException("Illegal port value: "+ port);
return portValue;
} catch(NumberFormatException e) {
throw new TorParsingException("Could not parse port value: "+ port);
}
}
private final static int MAX_PORT = 0xFFFF;
public final static PortRange ALL_PORTS = new PortRange(1,MAX_PORT);
private final int portStart;
private final int portEnd;
PortRange(int portValue) {
this(portValue, portValue);
}
PortRange(int start, int end) {
if(!isValidRange(start, end))
throw new TorException("Invalid port range: "+ start +"-"+ end);
portStart = start;
portEnd = end;
}
static private boolean isValidRange(int start, int end) {
if(!(isValidPort(start) && isValidPort(end)))
return false;
else if(start > end)
return false;
else
return true;
}
static private boolean isValidPort(int port) {
return port >= 0 && port <= MAX_PORT;
}
public boolean rangeContains(int port) {
return port >= portStart && port <= portEnd;
}
public String toString() {
if(portStart == 1 && portEnd == MAX_PORT) {
return "*";
} else if(portStart == portEnd) {
return Integer.toString(portStart);
} else {
return Integer.toString(portStart) + "-" + Integer.toString(portEnd);
}
}
}