package core.aws.resource.ec2;
import core.aws.util.ToStringHelper;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author neo
*/
public class Protocol {
static final String TCP = "tcp";
private static final Pattern SINGLE_PORT_PATTERN = Pattern.compile("\\d+");
private static final Pattern PORT_RANGE_PATTERN = Pattern.compile("(\\d+)-(\\d+)");
private static final String UDP = "udp";
private static final Map<String, Protocol> PREDEFINED_PROTOCOLS = new HashMap<>();
static {
PREDEFINED_PROTOCOLS.put("http", new Protocol(TCP, 80));
PREDEFINED_PROTOCOLS.put("https", new Protocol(TCP, 443));
PREDEFINED_PROTOCOLS.put("ssh", new Protocol(TCP, 22));
PREDEFINED_PROTOCOLS.put("memcached", new Protocol(TCP, 11211));
PREDEFINED_PROTOCOLS.put("mssql", new Protocol(TCP, 1433));
PREDEFINED_PROTOCOLS.put("mysql", new Protocol(TCP, 3306));
PREDEFINED_PROTOCOLS.put("rdp", new Protocol(TCP, 3389));
PREDEFINED_PROTOCOLS.put("mongodb", new Protocol(TCP, 27017));
PREDEFINED_PROTOCOLS.put("rabbitmq", new Protocol(TCP, 5672));
PREDEFINED_PROTOCOLS.put("kafka", new Protocol(TCP, 9092));
PREDEFINED_PROTOCOLS.put("elasticsearch", new Protocol(TCP, 9300));
PREDEFINED_PROTOCOLS.put("redis", new Protocol(TCP, 6379));
PREDEFINED_PROTOCOLS.put("openvpn", new Protocol(UDP, 1194));
PREDEFINED_PROTOCOLS.put("all-tcp", new Protocol(TCP, 0, 65535));
PREDEFINED_PROTOCOLS.put("all-udp", new Protocol(UDP, 0, 65535));
}
public static Protocol parse(String value) {
Protocol protocol = PREDEFINED_PROTOCOLS.get(value.toLowerCase());
if (protocol != null) return protocol;
Matcher matcher = SINGLE_PORT_PATTERN.matcher(value);
if (matcher.matches()) return new Protocol(TCP, Integer.parseInt(matcher.group()));
matcher = PORT_RANGE_PATTERN.matcher(value);
if (matcher.matches())
return new Protocol(TCP, Integer.parseInt(matcher.group(1)), Integer.parseInt(matcher.group(2)));
throw new IllegalArgumentException("unknown protocol, protocol=" + value);
}
public final String ipProtocol;
public final int fromPort;
public final int toPort;
public Protocol(String ipProtocol, int port) {
this(ipProtocol, port, port);
}
public Protocol(String ipProtocol, int fromPort, int toPort) {
this.ipProtocol = ipProtocol;
this.fromPort = fromPort;
this.toPort = toPort;
}
@Override
public boolean equals(Object object) {
if (this == object) return true;
if (object == null || getClass() != object.getClass()) return false;
Protocol protocol = (Protocol) object;
return fromPort == protocol.fromPort
&& toPort == protocol.toPort
&& ipProtocol.equals(protocol.ipProtocol);
}
@Override
public int hashCode() {
int result = ipProtocol.hashCode();
result = 31 * result + fromPort;
result = 31 * result + toPort;
return result;
}
@Override
public String toString() {
ToStringHelper helper = new ToStringHelper(this);
if (fromPort == toPort) {
helper.add(fromPort);
} else {
helper.add(fromPort + "-" + toPort);
}
return helper.toString();
}
}