package com.netifera.platform.channel.socket; import java.net.InetAddress; import java.net.InetSocketAddress; public class ConfigParser { public final static int INVALID_PORT = -1; private final String prefix; public ConfigParser(String prefix) { this.prefix = prefix; } /* * channelConfig is expected in the form "tcplisten:a.b.c.d:port" * for example "tcplisten:22.99.7.12:443" */ public InetSocketAddress configToAddress(String channelConfig) { if(channelConfig.startsWith(prefix)) { channelConfig = channelConfig.substring(prefix.length() + 1); } if(!isValidAddressConfig(channelConfig)) return null; final InetAddress address = configToInetAddress(channelConfig); final int port = configToPort(channelConfig); return new InetSocketAddress(address, port); } private boolean isValidAddressConfig(String config) { try { final String[] parts = splitConfig(config); return IPv4Address.isValid(parts[0]) && stringToPort(parts[1]) != INVALID_PORT; } catch(IllegalArgumentException e) { return false; } } private InetAddress configToInetAddress(String config) { final String[] parts = splitConfig(config); final int addressData = IPv4Address.stringParse(parts[0]); final IPv4Address address = new IPv4Address(addressData); return address.getInetAddress(); } public int configToPort(String config) { final String[] parts = splitConfig(config); final int last = parts.length - 1; return stringToPort(parts[last]); } private String[] splitConfig(String config) { final String[] parts = config.split(":"); if(parts.length != 2) { throw new IllegalArgumentException(); } else { return parts; } } public int stringToPort(String s) { try { final int port = Integer.parseInt(s); return (isValidPort(port)) ? (port) : (INVALID_PORT); } catch(NumberFormatException e) { return INVALID_PORT; } } private boolean isValidPort(int port) { return port > 0 && port <= 65535; } }