package com.netflix.evcache.pool; import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.StringTokenizer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.net.InetAddresses; import com.netflix.evcache.util.EVCacheConfig; public class SimpleNodeListProvider implements EVCacheNodeList { private static Logger log = LoggerFactory.getLogger(EVCacheClientPool.class); private String currentNodeList = ""; private final String propertyName; public SimpleNodeListProvider(String propertyName) { this.propertyName = propertyName; } /** * Pass a System Property of format * * <EVCACHE_APP>-NODES=setname0=instance01:port,instance02:port, * instance03:port;setname1=instance11:port,instance12:port,instance13:port; * setname2=instance21:port,instance22:port,instance23:port * */ @Override public Map<ServerGroup, EVCacheServerGroupConfig> discoverInstances() throws IOException { final String nodeListString = EVCacheConfig.getInstance().getDynamicStringProperty(propertyName, "").get(); if (log.isDebugEnabled()) log.debug("List of Nodes = " + nodeListString); if (nodeListString != null && nodeListString.length() > 0) { final Map<ServerGroup, EVCacheServerGroupConfig> instancesSpecific = new HashMap<ServerGroup,EVCacheServerGroupConfig>(); final StringTokenizer setTokenizer = new StringTokenizer(nodeListString, ";"); while (setTokenizer.hasMoreTokens()) { final String token = setTokenizer.nextToken(); final StringTokenizer replicaSetTokenizer = new StringTokenizer(token, "="); while (replicaSetTokenizer.hasMoreTokens()) { final String replicaSetToken = replicaSetTokenizer.nextToken(); final String instanceToken = replicaSetTokenizer.nextToken(); final StringTokenizer instanceTokenizer = new StringTokenizer(instanceToken, ","); final Set<InetSocketAddress> instanceList = new HashSet<InetSocketAddress>(); final ServerGroup rSet = new ServerGroup(replicaSetToken, replicaSetToken); final EVCacheServerGroupConfig config = new EVCacheServerGroupConfig(rSet, instanceList, 0, 0, 0); instancesSpecific.put(rSet, config); while (instanceTokenizer.hasMoreTokens()) { final String instance = instanceTokenizer.nextToken(); int index = instance.indexOf(':'); String host = instance.substring(0, index); String port = instance.substring(index + 1); int ind = host.indexOf('/'); if (ind == -1) { final InetAddress add = InetAddress.getByName(host); instanceList.add(new InetSocketAddress(add, Integer.parseInt(port))); } else { final String hostName = host.substring(0, ind); final String localIp = host.substring(ind + 1); final InetAddress add = InetAddresses.forString(localIp); final InetAddress inetAddress = InetAddress.getByAddress(hostName, add.getAddress()); instanceList.add(new InetSocketAddress(inetAddress, Integer.parseInt(port))); } } } } currentNodeList = nodeListString; log.debug("List by Servergroup" + instancesSpecific); return instancesSpecific; } return Collections.<ServerGroup, EVCacheServerGroupConfig> emptyMap(); } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("{\"Current Node List\":\""); builder.append(currentNodeList); builder.append("\",\"System Property Name\":\""); builder.append(propertyName); builder.append("\"}"); return builder.toString(); } }