package mil.nga.giat.geowave.datastore.accumulo.util; import java.util.HashMap; import java.util.Map; import org.apache.accumulo.core.client.AccumuloException; import org.apache.accumulo.core.client.AccumuloSecurityException; import org.apache.accumulo.core.client.Connector; import org.apache.accumulo.core.client.Instance; import org.apache.accumulo.core.client.ZooKeeperInstance; public class ConnectorPool { private static ConnectorPool singletonInstance; public static synchronized ConnectorPool getInstance() { if (singletonInstance == null) { singletonInstance = new ConnectorPool(); } return singletonInstance; } private final Map<ConnectorConfig, Connector> connectorCache = new HashMap<ConnectorConfig, Connector>(); public synchronized Connector getConnector( final String zookeeperUrl, final String instanceName, final String userName, final String password ) throws AccumuloException, AccumuloSecurityException { final ConnectorConfig config = new ConnectorConfig( zookeeperUrl, instanceName, userName, password); Connector connector = connectorCache.get(config); if (connector == null) { final Instance inst = new ZooKeeperInstance( instanceName, zookeeperUrl); connector = inst.getConnector( userName, password); connectorCache.put( config, connector); } return connector; } private static class ConnectorConfig { private final String zookeeperUrl; private final String instanceName; private final String userName; private final String password; public ConnectorConfig( final String zookeeperUrl, final String instanceName, final String userName, final String password ) { this.zookeeperUrl = zookeeperUrl; this.instanceName = instanceName; this.userName = userName; this.password = password; } @Override public int hashCode() { final int prime = 31; int result = 1; result = (prime * result) + ((instanceName == null) ? 0 : instanceName.hashCode()); result = (prime * result) + ((password == null) ? 0 : password.hashCode()); result = (prime * result) + ((userName == null) ? 0 : userName.hashCode()); result = (prime * result) + ((zookeeperUrl == null) ? 0 : zookeeperUrl.hashCode()); return result; } @Override public boolean equals( final Object obj ) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final ConnectorConfig other = (ConnectorConfig) obj; if (instanceName == null) { if (other.instanceName != null) { return false; } } else if (!instanceName.equals(other.instanceName)) { return false; } if (password == null) { if (other.password != null) { return false; } } else if (!password.equals(other.password)) { return false; } if (userName == null) { if (other.userName != null) { return false; } } else if (!userName.equals(other.userName)) { return false; } if (zookeeperUrl == null) { if (other.zookeeperUrl != null) { return false; } } else if (!zookeeperUrl.equals(other.zookeeperUrl)) { return false; } return true; } } }