package org.radargun.utils; import java.lang.reflect.Type; import java.net.InetAddress; import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.radargun.config.Converter; /** * Converter that parses a list of <code>host:port</code> entries and generates a list of * <code>InetSocketAddress</code> objects * * @author Alan Field <afield@redhat.com> */ public abstract class AddressListConverter implements Converter<List<InetSocketAddress>> { private static final String PATTERN_STRING = "(\\[([0-9A-Fa-f:]+)\\]|([^:/?#]*))(?::(\\d*))?"; private static final Pattern ADDRESS_PATTERN = Pattern.compile(PATTERN_STRING); private int defaultPort; public AddressListConverter(int defaultPort) { super(); this.defaultPort = defaultPort; } @Override public List<InetSocketAddress> convert(String servers, Type type) { List<InetSocketAddress> addresses = new ArrayList<InetSocketAddress>(); for (String server : servers.split(";")) { Matcher matcher = ADDRESS_PATTERN.matcher(server.trim()); if (matcher.matches()) { String v6host = matcher.group(2); String v4host = matcher.group(3); String host = v6host != null ? v6host.trim() : v4host.trim(); String portString = matcher.group(4); int port = portString == null ? defaultPort : Integer.parseInt(portString.trim()); addresses.add(new InetSocketAddress(host, port)); } else { throw new IllegalArgumentException("Cannot parse host:port from " + server); } } return addresses; } @Override public String convertToString(List<InetSocketAddress> value) { StringBuilder sb = new StringBuilder(); for (InetSocketAddress address : value) { if (sb.length() != 0) sb.append(';'); sb.append(address.getHostString()); InetAddress inetAddr = address.getAddress(); if (inetAddr != null) { sb.append('=').append(inetAddr.getCanonicalHostName()); sb.append('=').append(Arrays.toString(inetAddr.getAddress())); } else { sb.append("(not resolved)"); } sb.append(':').append(address.getPort()); } return sb.toString(); } @Override public String allowedPattern(Type type) { return PATTERN_STRING; } }