package com.hwlcn.ldap.ldap.sdk; import javax.net.SocketFactory; import com.hwlcn.ldap.util.Debug; import com.hwlcn.core.annotation.NotMutable; import com.hwlcn.core.annotation.ThreadSafety; import com.hwlcn.ldap.util.ThreadSafetyLevel; @NotMutable() @ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE) public final class DNSSRVRecordServerSet extends ServerSet { private static final String DEFAULT_RECORD_NAME = "_ldap._tcp"; private static final long DEFAULT_TTL_MILLIS = 60L * 60L * 1000L; private static final String DEFAULT_DNS_PROVIDER_URL = "dns:"; private final LDAPConnectionOptions connectionOptions; private final long ttlMillis; private final SocketFactory socketFactory; private volatile SRVRecordSet recordSet; private final String recordName; private final String providerURL; public DNSSRVRecordServerSet(final String recordName) { this(recordName, null, DEFAULT_TTL_MILLIS, null, null); } public DNSSRVRecordServerSet(final String recordName, final String providerURL, final long ttlMillis, final SocketFactory socketFactory, final LDAPConnectionOptions connectionOptions) { this.socketFactory = socketFactory; this.connectionOptions = connectionOptions; recordSet = null; if (recordName == null) { this.recordName = DEFAULT_RECORD_NAME; } else { this.recordName = recordName; } if (providerURL == null) { this.providerURL = DEFAULT_DNS_PROVIDER_URL; } else { this.providerURL = providerURL; } if (ttlMillis <= 0L) { this.ttlMillis = DEFAULT_TTL_MILLIS; } else { this.ttlMillis = ttlMillis; } } public String getRecordName() { return recordName; } public String getProviderURL() { return providerURL; } public long getTTLMillis() { return ttlMillis; } public SocketFactory getSocketFactory() { return socketFactory; } public LDAPConnectionOptions getConnectionOptions() { return connectionOptions; } @Override() public LDAPConnection getConnection() throws LDAPException { return getConnection(null); } @Override() public LDAPConnection getConnection( final LDAPConnectionPoolHealthCheck healthCheck) throws LDAPException { if ((recordSet == null) || recordSet.isExpired()) { try { recordSet = SRVRecordSet.getRecordSet(recordName, providerURL, ttlMillis); } catch (final LDAPException le) { Debug.debugException(le); if (recordSet == null) { throw le; } } } LDAPException firstException = null; for (final SRVRecord r : recordSet.getOrderedRecords()) { final LDAPConnection conn; try { conn = new LDAPConnection(socketFactory, connectionOptions, r.getAddress(), r.getPort()); } catch (final LDAPException le) { Debug.debugException(le); if (firstException == null) { firstException = le; } continue; } if (healthCheck != null) { try { healthCheck.ensureNewConnectionValid(conn); } catch (final LDAPException le) { Debug.debugException(le); if (firstException == null) { firstException = le; } continue; } } return conn; } throw firstException; } @Override() public void toString(final StringBuilder buffer) { buffer.append("DNSSRVRecordServerSet(recordName='"); buffer.append(recordName); buffer.append("', providerURL='"); buffer.append(providerURL); buffer.append("', ttlMillis="); buffer.append(ttlMillis); if (socketFactory != null) { buffer.append(", socketFactoryClass='"); buffer.append(socketFactory.getClass().getName()); buffer.append('\''); } if (connectionOptions != null) { buffer.append(", connectionOptions"); connectionOptions.toString(buffer); } buffer.append(')'); } }