/*
* Microsoft JDBC Driver for SQL Server
*
* Copyright(c) Microsoft Corporation All rights reserved.
*
* This program is made available under the terms of the MIT License. See the LICENSE file in the project root for more information.
*/
package com.microsoft.sqlserver.jdbc.dns;
import java.util.Hashtable;
import java.util.Set;
import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
public class DNSUtilities {
private final static Logger LOG = Logger.getLogger(DNSUtilities.class.getName());
private static final Level DNS_ERR_LOG_LEVEL = Level.FINE;
/**
* Find all SRV Record using DNS.
*
* You can then use {@link DNSRecordsSRVCollection#getBestRecord()} to find the best candidate (for instance for Round-Robin calls)
*
* @param dnsSrvRecordToFind
* the DNS record, for instance: _ldap._tcp.dc._msdcs.DOMAIN.COM to find all LDAP servers in DOMAIN.COM
* @return the collection of records with facilities to find the best candidate
* @throws NamingException
* if DNS is not available
*/
public static Set<DNSRecordSRV> findSrvRecords(final String dnsSrvRecordToFind) throws NamingException {
Hashtable<Object, Object> env = new Hashtable<Object, Object>();
env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory");
env.put("java.naming.provider.url", "dns:");
DirContext ctx = new InitialDirContext(env);
Attributes attrs = ctx.getAttributes(dnsSrvRecordToFind, new String[] {"SRV"});
NamingEnumeration<? extends Attribute> allServers = attrs.getAll();
TreeSet<DNSRecordSRV> records = new TreeSet<DNSRecordSRV>();
while (allServers.hasMoreElements()) {
Attribute a = allServers.nextElement();
NamingEnumeration<?> srvRecord = a.getAll();
while (srvRecord.hasMore()) {
final String record = String.valueOf(srvRecord.nextElement());
try {
DNSRecordSRV rec = DNSRecordSRV.parseFromDNSRecord(record);
if (rec != null) {
records.add(rec);
}
}
catch (IllegalArgumentException errorParsingRecord) {
if (LOG.isLoggable(DNS_ERR_LOG_LEVEL)) {
LOG.log(DNS_ERR_LOG_LEVEL, String.format("Failed to parse SRV DNS Record: '%s'", record), errorParsingRecord);
}
}
}
}
return records;
}
}