You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by te...@apache.org on 2007/06/23 22:53:48 UTC
svn commit: r550106 [14/16] - in
/harmony/enhanced/classlib/branches/java6/modules:
beans/src/main/java/java/beans/ jndi/META-INF/
jndi/src/main/java/javax/naming/ jndi/src/main/java/javax/naming/directory/
jndi/src/main/java/javax/naming/event/ jndi/s...
Modified: harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/dns/Resolver.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/dns/Resolver.java?view=diff&rev=550106&r1=550105&r2=550106
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/dns/Resolver.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/jndi/src/main/java/org/apache/harmony/jndi/provider/dns/Resolver.java Sat Jun 23 13:53:42 2007
@@ -42,10 +42,8 @@
import org.apache.harmony.jndi.internal.nls.Messages;
import org.apache.harmony.jndi.provider.dns.SList.Server;
-//import org.apache.harmony.util.logging.LogConst;
-
/**
- * This class implements the functionality of a simple DNS resolver.<br>
+ * This class implements the functionality of a simple DNS resolver.<br>
* Following DNS Resource Records are supported:
* <ul>
* <li>A</li>
@@ -66,53 +64,57 @@
* <li>HS (TODO)</li>
* </ul>
* <br>
- * @author Alexei Zakharov
- * @version $Revision: 1.1.2.5 $
- * TODO do we need broadcasting and IP multicasting to obtain initial name
- * server address?
- * TODO network-preference feature for choosing most welcome address
- * for multihomed hosts (RFC 1123 point 6.1.3.4)
- * TODO add general IPv6 support and support for AAAA resource record
+ * TODO: do we need broadcasting and IP multicasting to obtain initial name
+ * server address? TODO: network-preference feature for choosing most welcome
+ * address for multihomed hosts (RFC 1123 point 6.1.3.4) TODO: add general IPv6
+ * support and support for AAAA resource record
*/
public class Resolver implements Runnable {
-
+
private static final int MSG_MAX_BYTES = 512;
+
/**
* Entry of the resolver thread list.
- * @author Alexei Zakharov
*/
private static class ThreadListEntry {
Thread thread;
+
String serverNameToResolve;
+
int dnsClass;
}
-
private static final Random rndGen = new Random();
// resolver configuration
private int initialTimeout;
+
private int timeoutRetries;
+
private boolean authoritativeAnswerDesired;
+
private boolean recursionDesired;
+
// maximum number of active threads
private int threadNumberLimit;
-
- // vector with currently running Resolver threads
+
+ // vector with currently running Resolver threads
private final ArrayList<ThreadListEntry> resolverThreads = new ArrayList<ThreadListEntry>();
+
// the list of host names that should be resolved
private final ArrayList<ThreadListEntry> hostnamesToResolve = new ArrayList<ThreadListEntry>();
+
// semaphore that controls access to both lists above
- private class ThreadListSemaphore {}
+ private class ThreadListSemaphore {
+ }
+
private final Object threadListSemaphore = new ThreadListSemaphore();
-
- // <---- Constructor's section
-
- /**
- * Constructs a <code>Resolver</code> object with default initial
- * timeout (1 second), default timeout retries (4 times), default
- * recursion desired switch (true) and default authoritative answer
- * desired
+
+ /**
+ * Constructs a <code>Resolver</code> object with default initial timeout
+ * (1 second), default timeout retries (4 times), default recursion desired
+ * switch (true) and default authoritative answer desired
+ *
* @see #Resolver(int, int)
*/
public Resolver() {
@@ -122,30 +124,27 @@
ProviderConstants.DEFAULT_AUTHORITATIVE,
ProviderConstants.DEFAULT_RECURSION);
}
-
+
/**
- * Constructs a <code>Resolver</code> object with given initial
- * timeout and timeout retries. Initially the resolver will try to access
- * DNS servers with timeout set to initial timeout. If none of servers
- * answer it will double the timeout and perform the second round. The
- * process will continue for <code>timeoutRetries</code> rounds. If there
- * is no answer still the resolver will give up.
+ * Constructs a <code>Resolver</code> object with given initial timeout
+ * and timeout retries. Initially the resolver will try to access DNS
+ * servers with timeout set to initial timeout. If none of servers answer it
+ * will double the timeout and perform the second round. The process will
+ * continue for <code>timeoutRetries</code> rounds. If there is no answer
+ * still the resolver will give up.
*
- * @param initialTimeout the initial timeout that is used during the
- * first round (in milliseconds)
- * @param timeoutRetries number of rounds the Resolver should perform
- * before giving up
- * @param authoritativeAnswerDesired do we want to receive only
- * authoritative answers
- * @param recursionDesired do we want our outgoing packages to have
- * RD but set
- */
- public Resolver(int initialTimeout,
- int timeoutRetries,
- int maxThreads,
- boolean authoritativeAnswerDesired,
- boolean recursionDesired)
- {
+ * @param initialTimeout
+ * the initial timeout that is used during the first round (in
+ * milliseconds)
+ * @param timeoutRetries
+ * number of rounds the Resolver should perform before giving up
+ * @param authoritativeAnswerDesired
+ * do we want to receive only authoritative answers
+ * @param recursionDesired
+ * do we want our outgoing packages to have RD but set
+ */
+ public Resolver(int initialTimeout, int timeoutRetries, int maxThreads,
+ boolean authoritativeAnswerDesired, boolean recursionDesired) {
this.initialTimeout = initialTimeout;
this.timeoutRetries = timeoutRetries;
this.threadNumberLimit = maxThreads;
@@ -159,121 +158,133 @@
public int getThreadNumberLimit() {
return threadNumberLimit;
}
+
/**
- * @param threadNumberLimit The threadNumberLimit to set.
+ * @param threadNumberLimit
+ * The threadNumberLimit to set.
*/
public void setThreadNumberLimit(int threadNumberLimit) {
this.threadNumberLimit = threadNumberLimit;
}
+
/**
* @return Returns the authoritativeAnswerDesired.
*/
public boolean isAuthoritativeAnswerDesired() {
return authoritativeAnswerDesired;
}
+
/**
- * @param authoritativeAnswerDesired The authoritativeAnswerDesired to set.
+ * @param authoritativeAnswerDesired
+ * The authoritativeAnswerDesired to set.
*/
- public void setAuthoritativeAnswerDesired(
- boolean authoritativeAnswerDesired) {
+ public void setAuthoritativeAnswerDesired(boolean authoritativeAnswerDesired) {
this.authoritativeAnswerDesired = authoritativeAnswerDesired;
}
+
/**
* @return Returns the initialTimeout.
*/
public int getInitialTimeout() {
return initialTimeout;
}
+
/**
- * @param initialTimeout The initialTimeout to set.
+ * @param initialTimeout
+ * The initialTimeout to set.
*/
public void setInitialTimeout(int initialTimeout) {
this.initialTimeout = initialTimeout;
}
+
/**
* @return Returns the recursionDesired.
*/
public boolean isRecursionDesired() {
return recursionDesired;
}
+
/**
- * @param recursionDesired The recursionDesired to set.
+ * @param recursionDesired
+ * The recursionDesired to set.
*/
public void setRecursionDesired(boolean recursionDesired) {
this.recursionDesired = recursionDesired;
}
+
/**
* @return Returns the timeoutRetries.
*/
public int getTimeoutRetries() {
return timeoutRetries;
}
+
/**
- * @param timeoutRetries The timeoutRetries to set.
+ * @param timeoutRetries
+ * The timeoutRetries to set.
*/
public void setTimeoutRetries(int timeoutRetries) {
this.timeoutRetries = timeoutRetries;
}
-
- // <---- End of constructor's section
-
+
/**
* Checks available name servers if they have any resource records related
* to given name & type & class combination. Standard DNS lookup algorithm
- * is used.
- *
- * @param name well-formed domain name
- * @param types an array of types; only records that have such types will
- * be returned
+ * is used.
+ *
+ * @param name
+ * well-formed domain name
+ * @param types
+ * an array of types; only records that have such types will be
+ * returned
* @param classes
* @return enumeration with found resource records
- * @throws SecurityException if the resolver is not allowed to use a
- * network subsystem
- * @throws NameNotFoundException if authoritative server for desired
- * zone was contacted but given name has not been found in that zone
- * @throws ServiceUnavailableException if no authoritative server for
- * desired name was found or all servers are dead or malfunction
- * @throws DomainProtocolException if some DNS specific error has occured
- */
- public Enumeration<ResourceRecord> lookup(String name, int[] types, int[] classes)
- throws SecurityException,
- NameNotFoundException,
- ServiceUnavailableException,
- DomainProtocolException
- {
-
+ * @throws SecurityException
+ * if the resolver is not allowed to use a network subsystem
+ * @throws NameNotFoundException
+ * if authoritative server for desired zone was contacted but
+ * given name has not been found in that zone
+ * @throws ServiceUnavailableException
+ * if no authoritative server for desired name was found or all
+ * servers are dead or malfunction
+ * @throws DomainProtocolException
+ * if some DNS specific error has occurred
+ */
+ public Enumeration<ResourceRecord> lookup(String name, int[] types,
+ int[] classes) throws SecurityException, NameNotFoundException,
+ ServiceUnavailableException, DomainProtocolException {
+
// Algorithm:
- // 1. Set workZone to the parent of qName; clear queriedServers.
- // 2. Try to get a complete answer for the workZone from the servers
- // currently available in SLIST exclude servers from queriedServers.
- // 3. update queriedServers with "visited servers" info.
- // 4. If the complete answer was received - return it to the user;exit.
- // 5. If the delegation was received:
- // a) If we already have this server & zone pair in SLIST - skip it.
- // b) If we don't have - put it into SLIST
- // c) If we haven't received any new delegations - goto step (7)
- // d) If some new delegation has been received:
- // 1) from delegations: found the zone with the best matching count
- // with qName
- // 2) if this matching count is bigger than matching count between
- // workZone and qName:
- // - set workZone to zone with biggest matching count determined
- // at step (5.d.1)
- // - goto step (2)
- // 3) if it doesn't then goto step 2 with the same workZone
- // 6. If ALIAS was received ...
- // 7. If no answer has been received:
- // a) Check if the workZone is the root zone.
- // b) If so - give up; return empty result to the user.
- // c) If it isn't, set workZone to parent of workZone. Goto step (2).
+ // 1. Set workZone to the parent of qName; clear queriedServers.
+ // 2. Try to get a complete answer for the workZone from the servers
+ // currently available in SLIST exclude servers from queriedServers.
+ // 3. update queriedServers with "visited servers" info.
+ // 4. If the complete answer was received - return it to the user;exit.
+ // 5. If the delegation was received:
+ // a) If we already have this server & zone pair in SLIST - skip it.
+ // b) If we don't have - put it into SLIST
+ // c) If we haven't received any new delegations - goto step (7)
+ // d) If some new delegation has been received:
+ // 1) from delegations: found the zone with the best matching count
+ // with qName
+ // 2) if this matching count is bigger than matching count between
+ // workZone and qName:
+ // - set workZone to zone with biggest matching count determined
+ // at step (5.d.1)
+ // - goto step (2)
+ // 3) if it doesn't then goto step 2 with the same workZone
+ // 6. If ALIAS was received ...
+ // 7. If no answer has been received:
+ // a) Check if the workZone is the root zone.
+ // b) If so - give up; return empty result to the user.
+ // c) If it isn't, set workZone to parent of workZone. Goto step (2).
- //SList slist = SList.getInstance();
+ // SList slist = SList.getInstance();
ResolverCache cache = ResolverCache.getInstance();
-
+
Vector<QuestionRecord> questions = new Vector<QuestionRecord>();
- Vector<ResourceRecord> answers = new Vector<ResourceRecord>();
+ Vector<ResourceRecord> answers = new Vector<ResourceRecord>();
-
if (name == null) {
// jndi.2E=The name is null
throw new NullPointerException(Messages.getString("jndi.2E")); //$NON-NLS-1$
@@ -295,8 +306,7 @@
}
// iterate over question records
for (int i = 0; i < questions.size(); i++) {
- QuestionRecord curQuestion =
- questions.elementAt(i);
+ QuestionRecord curQuestion = questions.elementAt(i);
String qName = curQuestion.getQName();
Message mesToSend = null;
Message receivedMes = null;
@@ -304,14 +314,13 @@
String workZone;
Hashtable<Server, Object> visitedServers = new Hashtable<Server, Object>();
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine("Current question: " +
- // curQuestion.toString());
- //}
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine("Current question: " +
+ // curQuestion.toString());
+ // }
// look in cache
- if (curQuestion.getQType() != ProviderConstants.ANY_QTYPE &&
- curQuestion.getQClass() != ProviderConstants.ANY_QCLASS)
- {
+ if (curQuestion.getQType() != ProviderConstants.ANY_QTYPE
+ && curQuestion.getQClass() != ProviderConstants.ANY_QCLASS) {
Enumeration<ResourceRecord> recEnum = cache.get(curQuestion);
if (recEnum.hasMoreElements()) {
@@ -320,38 +329,38 @@
}
// we don't need to query any servers since the information
// we want has been found in the local cache
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine(
- // "Information was gathered from cache");
- //}
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine(
+ // "Information was gathered from cache");
+ // }
continue;
}
}
// query remote DNS servers
- // determine work zone
+ // determine work zone
if (qName != null && !qName.equals(".")) { //$NON-NLS-1$
workZone = qName;
- // support for SRV-style qNames
+ // support for SRV-style qNames
while (workZone.startsWith("_")) { //$NON-NLS-1$
workZone = ProviderMgr.getParentName(workZone);
}
} else {
workZone = "."; //$NON-NLS-1$
}
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine("Lookup: new workZone is " +
- // "\"" + workZone + "\"");
- //}
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine("Lookup: new workZone is " +
+ // "\"" + workZone + "\"");
+ // }
// construct request message
try {
- mesToSend = createMessageForSending(qName,
- curQuestion.getQType(), curQuestion.getQClass());
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.finest("Message to send:\n" +
- // mesToSend.toString());
- //}
+ mesToSend = createMessageForSending(qName, curQuestion
+ .getQType(), curQuestion.getQClass());
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.finest("Message to send:\n" +
+ // mesToSend.toString());
+ // }
} catch (DomainProtocolException e) {
throw e;
@@ -367,15 +376,13 @@
if (!report.messageWasTruncated) {
// Put all extra records into the cache for
// future use
- for (int k = 0; k < report.extraRecords.size();
- k++)
- {
- ResourceRecord rec = report.extraRecords.elementAt(k);
-
+ for (int k = 0; k < report.extraRecords.size(); k++) {
+ ResourceRecord rec = report.extraRecords
+ .elementAt(k);
+
cache.put(rec);
}
- }
- else {
+ } else {
// Truncated message MUST NOT be cached and later
// used in such a way that the fact that they are
// truncated is lost (RFC 1123 point 6.1.3.2).
@@ -383,12 +390,13 @@
// examine the report
if (report.completeAnswerWasReceived) {
// complete answer
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine(
- // "Lookup: a complete answer was received");
- //}
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine(
+ // "Lookup: a complete answer was received");
+ // }
for (int k = 0; k < report.records.size(); k++) {
- ResourceRecord rec = report.records.elementAt(k);
+ ResourceRecord rec = report.records
+ .elementAt(k);
answers.addElement(rec);
// we are sure that the answer section has not
// been truncated so we can put the record
@@ -397,37 +405,35 @@
}
// exit the loop
break;
- }
- else if (report.nameError) {
+ } else if (report.nameError) {
// name error
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine("Lookup: name error");
- //}
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine("Lookup: name error");
+ // }
// jndi.6D=Name {0} was not found
- throw new NameNotFoundException(Messages.getString("jndi.6D", name)); //$NON-NLS-1$
- }
- else if (report.aliasInfoWasReceived) {
+ throw new NameNotFoundException(Messages.getString(
+ "jndi.6D", name)); //$NON-NLS-1$
+ } else if (report.aliasInfoWasReceived) {
// alias received
- //QuestionRecord newQuestion = new QuestionRecord();
+ // QuestionRecord newQuestion = new
+ // QuestionRecord();
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine(
- // "Lookup: an alias was received");
- //}
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine(
+ // "Lookup: an alias was received");
+ // }
qName = report.newName;
curQuestion.setQName(qName);
// look in cache
- if (curQuestion.getQType() !=
- ProviderConstants.ANY_QTYPE &&
- curQuestion.getQClass() !=
- ProviderConstants.ANY_QCLASS)
- {
- Enumeration<ResourceRecord> recEnum = cache.get(curQuestion);
+ if (curQuestion.getQType() != ProviderConstants.ANY_QTYPE
+ && curQuestion.getQClass() != ProviderConstants.ANY_QCLASS) {
+ Enumeration<ResourceRecord> recEnum = cache
+ .get(curQuestion);
if (recEnum.hasMoreElements()) {
while (recEnum.hasMoreElements()) {
- answers.addElement(
- recEnum.nextElement());
+ answers.addElement(recEnum
+ .nextElement());
}
// We don't need to query any more servers
// since the information we want has been
@@ -439,8 +445,7 @@
if (qName != null && !qName.equals(".")) //$NON-NLS-1$
{
workZone = qName;
- }
- else {
+ } else {
workZone = "."; //$NON-NLS-1$
}
visitedServers = new Hashtable<Server, Object>();
@@ -450,57 +455,54 @@
// construct a new request message
try {
mesToSend = createMessageForSending(qName,
- curQuestion.getQType(),
- curQuestion.getQClass());
+ curQuestion.getQType(), curQuestion
+ .getQClass());
} catch (DomainProtocolException e) {
throw e;
}
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine("Lookup: new name is " +
- // "\"" + qName + "\"");
- // ProviderMgr.logger.fine(
- // "Lookup: new workZone is " +
- // "\"" + workZone + "\"");
- //}
- }
- else if (report.delegationArrived) {
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine("Lookup: new name is " +
+ // "\"" + qName + "\"");
+ // ProviderMgr.logger.fine(
+ // "Lookup: new workZone is " +
+ // "\"" + workZone + "\"");
+ // }
+ } else if (report.delegationArrived) {
// new delegation, probably need to query once again
int k17 = -1;
int matchingCount = ProviderMgr.getMatchingCount(
qName, workZone);
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine(
- // "Lookup: delegation arrived");
- //}
- for (int k = 0; k < report.delegationZones.size();
- k++)
- {
- String curZone = report.delegationZones.elementAt(k);
- int tmpMatchingCount = ProviderMgr.
- getMatchingCount(qName, curZone);
-
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine(
+ // "Lookup: delegation arrived");
+ // }
+ for (int k = 0; k < report.delegationZones.size(); k++) {
+ String curZone = report.delegationZones
+ .elementAt(k);
+ int tmpMatchingCount = ProviderMgr
+ .getMatchingCount(qName, curZone);
+
if (tmpMatchingCount > matchingCount) {
k17 = k;
matchingCount = tmpMatchingCount;
}
-
+
}
if (k17 != -1) {
// better delegation was received
- workZone = report.delegationZones.elementAt(k17);
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine(
- // "Lookup: better delegation was found");
- //}
- }
- else {
+ workZone = report.delegationZones
+ .elementAt(k17);
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine(
+ // "Lookup: better delegation was found");
+ // }
+ } else {
// no better delegation
// do nothing, just query the next server of
- // the current workZone
+ // the current workZone
}
- }
- else {
+ } else {
noIdea = true;
}
} // end of if report != null block
@@ -508,36 +510,33 @@
noIdea = true;
}
if (noIdea) {
- // Resolver has no idea how to get info about
+ // Resolver has no idea how to get info about
// desired host while querying master hosts of the
// current workZone.
// Let's make one step up to the root.
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine("Lookup: no idea");
- //}
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine("Lookup: no idea");
+ // }
if (!workZone.equals(".")) { //$NON-NLS-1$
workZone = ProviderMgr.getParentName(workZone);
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine(
- // "Lookup: new work zone is " +
- // "\"" + workZone + "\"");
- //}
- }
- else {
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine(
+ // "Lookup: new work zone is " +
+ // "\"" + workZone + "\"");
+ // }
+ } else {
// give up
break;
- //throw new ServiceUnavailableException(
- // "Unable to " +
- // "contact authoritative server for " +
- // qName +
- // " and no other results were found");
+ // throw new ServiceUnavailableException(
+ // "Unable to " +
+ // "contact authoritative server for " +
+ // qName +
+ // " and no other results were found");
}
}
- }
- catch (NameNotFoundException e) {
+ } catch (NameNotFoundException e) {
throw e;
- }
- catch (DomainProtocolException e) {
+ } catch (DomainProtocolException e) {
throw e;
}
} // query servers loop
@@ -549,25 +548,28 @@
/**
* Lists entire DNS zone using zone transfer mechanism.
*
- * @param name DNS zone name
+ * @param name
+ * DNS zone name
* @return enumeration with found <code>ResourceRecord</code> objects
- * @throws SecurityException if the resolver is not allowed to use a
- * network subsystem
- * @throws NameNotFoundException if authoritative server(s) was not found
- * @throws ServiceUnavailableException if none of found servers permits zone
- * transfers
- * @throws DomainProtocolException if some DNS specific error has occured
+ * @throws SecurityException
+ * if the resolver is not allowed to use a network subsystem
+ * @throws NameNotFoundException
+ * if authoritative server(s) was not found
+ * @throws ServiceUnavailableException
+ * if none of found servers permits zone transfers
+ * @throws DomainProtocolException
+ * if some DNS specific error has occured
*/
public Enumeration<ResourceRecord> list(String name) throws NamingException {
final int OUT_BUF_SIZE = 512;
final int IN_BUF_SIZE = 65536;
-
- Vector<ResourceRecord> answerVect = new Vector<ResourceRecord>();
+
+ Vector<ResourceRecord> answerVect = new Vector<ResourceRecord>();
Message mesToSend = null;
Message receivedMes = null;
Enumeration<ResourceRecord> enum1;
- //String zoneMasterServer = null;
- //Vector authoritativeServerIPs = new Vector();
+ // String zoneMasterServer = null;
+ // Vector authoritativeServerIPs = new Vector();
HashSet<Object> authoritativeServers = new HashSet<Object>();
Iterator<Object> authServersIter;
int qClassArr[] = new int[1];
@@ -579,13 +581,13 @@
String proto = null;
ResolverCache cache = ResolverCache.getInstance();
- //SList slist = SList.getInstance();
-
+ // SList slist = SList.getInstance();
+
if (name == null) {
// jndi.2E=The name is null
throw new NullPointerException(Messages.getString("jndi.2E")); //$NON-NLS-1$
}
- // if given name is SRV style name where domain name is prefixed
+ // if given name is SRV style name where domain name is prefixed
// with _Proto
if (name.startsWith("_")) { //$NON-NLS-1$
int n = name.indexOf('.');
@@ -603,10 +605,10 @@
name = "."; //$NON-NLS-1$
}
}
- enum1 = lookup(name, new int[] {ProviderConstants.NS_TYPE},
- new int[] {ProviderConstants.ANY_QTYPE} );
- mesToSend = createMessageForSending(name,
- ProviderConstants.AXFR_QTYPE, ProviderConstants.ANY_QCLASS);
+ enum1 = lookup(name, new int[] { ProviderConstants.NS_TYPE },
+ new int[] { ProviderConstants.ANY_QTYPE });
+ mesToSend = createMessageForSending(name, ProviderConstants.AXFR_QTYPE,
+ ProviderConstants.ANY_QCLASS);
outLen = mesToSend.writeBytes(outBuf, 0);
// determine the list of zone authoritative servers
while (enum1.hasMoreElements()) {
@@ -630,98 +632,100 @@
}
// try to perform a zone transfer
authServersIter = authoritativeServers.iterator();
- authServersLoop:
- while (authServersIter.hasNext()) {
+ authServersLoop: while (authServersIter.hasNext()) {
String authServerName = (String) authServersIter.next();
Enumeration<ResourceRecord> addrEnum = lookup(authServerName,
- new int[] {ProviderConstants.A_TYPE}, qClassArr);
-
+ new int[] { ProviderConstants.A_TYPE }, qClassArr);
+
while (addrEnum.hasMoreElements()) {
ResourceRecord curRR = addrEnum.nextElement();
String ip = (String) curRR.getRData();
try {
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine(
- // "Initiating zone transfer, IP=" + ip);
- //}
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine(
+ // "Initiating zone transfer, IP=" + ip);
+ // }
TransportMgr.sendReceiveTCP(ip,
- ProviderConstants.DEFAULT_DNS_PORT,
- outBuf, outLen, inBuf, IN_BUF_SIZE,
- this.initialTimeout * this.timeoutRetries);
+ ProviderConstants.DEFAULT_DNS_PORT, outBuf, outLen,
+ inBuf, IN_BUF_SIZE, this.initialTimeout
+ * this.timeoutRetries);
received = true;
} catch (SocketTimeoutException e) {
-
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine("Socket timeout");
- //}
+
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine("Socket timeout");
+ // }
} catch (DomainProtocolException e) {
// some problem was encountered
- //ProviderMgr.logger.log(Level.WARNING,
- // "Connection failure", e);
+ // ProviderMgr.logger.log(Level.WARNING,
+ // "Connection failure", e);
}
if (received) {
receivedMes = new Message();
try {
int rCode;
-
+
Message.parseMessage(inBuf, 0, receivedMes);
rCode = receivedMes.getRCode();
switch (rCode) {
- case ProviderConstants.NO_ERROR:
- // put all received records into Resolver's cache
- for (int k = 0; k < 3; k++) {
- switch (k) {
- case 0:
- enum1 = receivedMes.getAnswerRRs();
- break;
- case 1:
- enum1 = receivedMes.getAuthorityRRs();
- break;
- case 2:
- enum1 = receivedMes.getAdditionalRRs();
- break;
- }
- while (enum1.hasMoreElements()) {
- ResourceRecord rr = enum1.nextElement();
-
- cache.put(rr);
- if (k == 0) {
- answerVect.addElement(rr);
+ case ProviderConstants.NO_ERROR:
+ // put all received records into Resolver's
+ // cache
+ for (int k = 0; k < 3; k++) {
+ switch (k) {
+ case 0:
+ enum1 = receivedMes.getAnswerRRs();
+ break;
+ case 1:
+ enum1 = receivedMes
+ .getAuthorityRRs();
+ break;
+ case 2:
+ enum1 = receivedMes
+ .getAdditionalRRs();
+ break;
+ }
+ while (enum1.hasMoreElements()) {
+ ResourceRecord rr = enum1.nextElement();
+
+ cache.put(rr);
+ if (k == 0) {
+ answerVect.addElement(rr);
+ }
}
}
- }
- completeAnswer = true;
- break;
- case ProviderConstants.NAME_ERROR:
- // jndi.6D=Name {0} was not found
- throw new NameNotFoundException(Messages.getString("jndi.6D", name)); //$NON-NLS-1$
- case ProviderConstants.SERVER_FAILURE:
- case ProviderConstants.FORMAT_ERROR:
- case ProviderConstants.NOT_IMPLEMENTED:
- case ProviderConstants.REFUSED:
- default:
+ completeAnswer = true;
+ break;
+ case ProviderConstants.NAME_ERROR:
+ // jndi.6D=Name {0} was not found
+ throw new NameNotFoundException(Messages
+ .getString("jndi.6D", name)); //$NON-NLS-1$
+ case ProviderConstants.SERVER_FAILURE:
+ case ProviderConstants.FORMAT_ERROR:
+ case ProviderConstants.NOT_IMPLEMENTED:
+ case ProviderConstants.REFUSED:
+ default:
}
} catch (DomainProtocolException e) {
- //ProviderMgr.logger.log(Level.WARNING,
- // "Error while parsing of DNS message", e);
- }
+ // ProviderMgr.logger.log(Level.WARNING,
+ // "Error while parsing of DNS message", e);
+ }
} // if received
if (completeAnswer) {
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine(
- // "list: Complete answer received");
- //}
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine(
+ // "list: Complete answer received");
+ // }
break authServersLoop;
}
- } // address loop
+ } // address loop
} // authoritative servers loop
-
+
if (!completeAnswer) {
// found nothing
// jndi.6E=Unable to perform zone transfer
- throw new ServiceUnavailableException(
- Messages.getString("jndi.6E")); //$NON-NLS-1$
+ throw new ServiceUnavailableException(Messages.getString("jndi.6E")); //$NON-NLS-1$
}
// SRV _Proto prefix support - filter all records that don't have given
// _Proto field
@@ -730,16 +734,14 @@
for (int i = 0; i < answerVect.size(); i++) {
ResourceRecord rr = answerVect.elementAt(i);
- StringTokenizer st = new StringTokenizer(rr.getName(),
- "."); //$NON-NLS-1$
+ StringTokenizer st = new StringTokenizer(rr.getName(), "."); //$NON-NLS-1$
String token = null;
boolean valid = false;
if (st.hasMoreTokens()) {
token = st.nextToken();
- if (token.length() > 0 && token.charAt(0) == '_' &&
- st.hasMoreTokens())
- {
+ if (token.length() > 0 && token.charAt(0) == '_'
+ && st.hasMoreTokens()) {
token = st.nextToken();
if (token.equalsIgnoreCase(proto)) {
valid = true;
@@ -759,13 +761,15 @@
* Adds initial DNS server the resolver should start with. Trying underlying
* OS services to determine IP from name.
*
- * @param name server's name
- * @param ip server's IP address
- * @param port port on server
+ * @param name
+ * server's name
+ * @param ip
+ * server's IP address
+ * @param port
+ * port on server
*/
public void addInitialServer(String name, String ip, int port,
- String zoneName)
- {
+ String zoneName) {
SList.Server server = new SList.Server(name, ip, port);
SList slist = SList.getInstance();
@@ -795,26 +799,29 @@
/**
* Query available DNS servers for desired information. This method doesn't
* look into the local cache. Drops all answers that contains "server fail"
- * and "not implemented" answer codes and returns the first "good" answer.
+ * and "not implemented" answer codes and returns the first "good" answer.
*
- * @param request a DNS message that contains the request record
- * @param workZone a zone that is closest known (grand-) parent of the
- * desired name
- * @param visitedServers the hash list of servers, that should not be
- * examined; this method also appends to this list all server that have
- * been visited during execution of this method
- * @param tcpOnly <code>true</code> if we want to use TCP protocol only;
- * otherwise UDP will be tried first
+ * @param request
+ * a DNS message that contains the request record
+ * @param workZone
+ * a zone that is closest known (grand-) parent of the desired
+ * name
+ * @param visitedServers
+ * the hash list of servers, that should not be examined; this
+ * method also appends to this list all server that have been
+ * visited during execution of this method
+ * @param tcpOnly
+ * <code>true</code> if we want to use TCP protocol only;
+ * otherwise UDP will be tried first
* @return the message received; <code>null</code> if none found
- * @throws DomainProtocolException some domain protocol related error
- * occured
- * @throws SecurityException if the resolver doesn't have the permission
- * to use sockets
+ * @throws DomainProtocolException
+ * some domain protocol related error occured
+ * @throws SecurityException
+ * if the resolver doesn't have the permission to use sockets
*/
Message queryServers(Message request, String workZone,
Hashtable<Server, Object> visitedServers, boolean tcpOnly)
- throws DomainProtocolException, SecurityException
- {
+ throws DomainProtocolException, SecurityException {
QuestionRecord qRecord;
SList slist = SList.getInstance();
@@ -830,7 +837,6 @@
boolean correctAnswer = false;
int rCode = -1;
-
// determine a question
if (!request.getQuestionRecords().hasMoreElements()) {
// jndi.71=no question record
@@ -860,8 +866,8 @@
if (curServer.getIP() == null) {
// if we don't know IP lets start background resolving
// thread
- startResolvingThread(curServer.getName(),
- qRecord.getQClass());
+ startResolvingThread(curServer.getName(), qRecord
+ .getQClass());
slist.updateEntry(workZone, curServer,
SList.NETWORK_FAILURE);
queriedServers.add(curServer);
@@ -869,43 +875,39 @@
}
// send the message and receive the answer
try {
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine("Timeout is set to " +
- // curTimeout);
- // ProviderMgr.logger.fine("Querying server \"" +
- // curServer + "\"");
- //}
- //timeBeforeSending = System.currentTimeMillis();
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine("Timeout is set to " +
+ // curTimeout);
+ // ProviderMgr.logger.fine("Querying server \"" +
+ // curServer + "\"");
+ // }
+ // timeBeforeSending = System.currentTimeMillis();
if (tcpOnly) {
TransportMgr.sendReceiveTCP(curServer.getIP(),
- curServer.getPort(),
- outBuf, outBufLen,
- inBuf, inBuf.length,
- curTimeout);
+ curServer.getPort(), outBuf, outBufLen, inBuf,
+ inBuf.length, curTimeout);
} else {
TransportMgr.sendReceiveUDP(curServer.getIP(),
- curServer.getPort(),
- outBuf, outBufLen,
- inBuf, inBuf.length,
- curTimeout);
+ curServer.getPort(), outBuf, outBufLen, inBuf,
+ inBuf.length, curTimeout);
}
- //responseTime = (int) (System.currentTimeMillis() -
- // timeBeforeSending);
- //ProviderMgr.logger.fine("Answer received in " +
- // responseTime + " milliseconds");
+ // responseTime = (int) (System.currentTimeMillis() -
+ // timeBeforeSending);
+ // ProviderMgr.logger.fine("Answer received in " +
+ // responseTime + " milliseconds");
received = true;
} catch (SocketTimeoutException e) {
slist.updateEntry(workZone, curServer, SList.TIMEOUT);
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine("Socket timeout");
- //}
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine("Socket timeout");
+ // }
} catch (DomainProtocolException e) {
// problems with receiving the message
// skipping this server
slist.updateEntry(workZone, curServer,
SList.NETWORK_FAILURE);
- //ProviderMgr.logger.log(Level.WARNING,
- // "Connection failure", e);
+ // ProviderMgr.logger.log(Level.WARNING,
+ // "Connection failure", e);
}
// parse the message
if (received) {
@@ -916,31 +918,28 @@
idx = 0;
idx = Message.parseMessage(inBuf, idx, receivedMes);
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.finest("Received message:\n" +
- // receivedMes.toString());
- //}
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.finest("Received message:\n" +
+ // receivedMes.toString());
+ // }
parsed = true;
// handle a truncation
if (receivedMes.isTc() && !tcpOnly) {
// The Message is truncated.
- // Let's try to establish a TCP connection
+ // Let's try to establish a TCP connection
// and retransmit the message over that connection.
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine("Message is truncated");
- // ProviderMgr.logger.fine("Trying to establish " +
- // "a connection over TCP");
- //}
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine("Message is truncated");
+ // ProviderMgr.logger.fine("Trying to establish " +
+ // "a connection over TCP");
+ // }
try {
Message receivedMesTcp;
int idx2;
- TransportMgr.sendReceiveTCP(
- curServer.getIP(),
- curServer.getPort(),
- outBuf, outBufLen,
- inBuf, inBuf.length,
- curTimeout);
+ TransportMgr.sendReceiveTCP(curServer.getIP(),
+ curServer.getPort(), outBuf, outBufLen,
+ inBuf, inBuf.length, curTimeout);
receivedMesTcp = new Message();
idx2 = Message.parseMessage(inBuf, 0,
receivedMesTcp);
@@ -950,15 +949,15 @@
idx = idx2;
}
} catch (Exception e) {
- //ProviderMgr.logger.log(Level.WARNING,
- // "Receiving a complete message" +
- // " over TCP failed", e);
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine(
- // "Parsing the message " +
- // "previously received over UDP");
- //}
- }
+ // ProviderMgr.logger.log(Level.WARNING,
+ // "Receiving a complete message" +
+ // " over TCP failed", e);
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine(
+ // "Parsing the message " +
+ // "previously received over UDP");
+ // }
+ }
}
// Is the message still truncated?
// (It is possible in case if TCP connection failed)
@@ -966,93 +965,91 @@
// check if the ANSWER section is truncated
// or not
if (!receivedMes.getAuthorityRRs()
- .hasMoreElements() &&
- !receivedMes.getAdditionalRRs()
- .hasMoreElements())
- {
+ .hasMoreElements()
+ && !receivedMes.getAdditionalRRs()
+ .hasMoreElements()) {
answerSectionIsTruncated = true;
}
}
rCode = receivedMes.getRCode();
- if (rCode == ProviderConstants.NO_ERROR)
- {
+ if (rCode == ProviderConstants.NO_ERROR) {
// correct message has been received
- slist.updateEntry(workZone, curServer,
- responseTime);
- visitedServers.put(curServer, new Object()); //$NON-LOCK-1$
+ slist
+ .updateEntry(workZone, curServer,
+ responseTime);
+ visitedServers.put(curServer, new Object()); // $NON-LOCK-1$
if (!answerSectionIsTruncated) {
correctAnswer = true;
break;
}
} else if (rCode == ProviderConstants.SERVER_FAILURE) {
// removing server from list
- //ProviderMgr.logger.warning("Server failure. " +
- // errMsg);
+ // ProviderMgr.logger.warning("Server failure. " +
+ // errMsg);
slist.updateEntry(workZone, curServer,
SList.SERVER_FAILURE);
- visitedServers.put(curServer, new Object()); //$NON-LOCK-1$
+ visitedServers.put(curServer, new Object()); // $NON-LOCK-1$
} else if (rCode == ProviderConstants.FORMAT_ERROR) {
// removing server from list
- //ProviderMgr.logger.warning("Format error. " +
- // errMsg);
+ // ProviderMgr.logger.warning("Format error. " +
+ // errMsg);
slist.updateEntry(workZone, curServer,
SList.SERVER_FAILURE);
- visitedServers.put(curServer, new Object()); //$NON-LOCK-1$
+ visitedServers.put(curServer, new Object()); // $NON-LOCK-1$
} else if (rCode == ProviderConstants.NAME_ERROR) {
- //ProviderMgr.logger.warning("Name error. " +
- // errMsg);
+ // ProviderMgr.logger.warning("Name error. " +
+ // errMsg);
if (receivedMes.isAA()) {
slist.updateEntry(workZone, curServer,
responseTime);
- visitedServers.put(curServer, new Object()); //$NON-LOCK-1$
+ visitedServers.put(curServer, new Object()); // $NON-LOCK-1$
correctAnswer = true;
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine(
- // "Return name error to user");
- //}
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine(
+ // "Return name error to user");
+ // }
break;
}
// This server is not authoritative server for
- // this zone. It should not answer with a
+ // this zone. It should not answer with a
// name error. Probably it is misconfigured.
slist.updateEntry(workZone, curServer,
SList.SERVER_FAILURE);
- visitedServers.put(curServer, new Object()); //$NON-LOCK-1$
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine(
- // "Not authoritative answer. " +
- // "Skip it.");
- //}
+ visitedServers.put(curServer, new Object()); // $NON-LOCK-1$
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine(
+ // "Not authoritative answer. " +
+ // "Skip it.");
+ // }
} else if (rCode == ProviderConstants.NOT_IMPLEMENTED) {
- //ProviderMgr.logger.warning("Not implemented. " +
- // errMsg);
+ // ProviderMgr.logger.warning("Not implemented. " +
+ // errMsg);
slist.updateEntry(workZone, curServer,
SList.SERVER_FAILURE);
- visitedServers.put(curServer, new Object()); //$NON-LOCK-1$
+ visitedServers.put(curServer, new Object()); // $NON-LOCK-1$
} else if (rCode == ProviderConstants.REFUSED) {
- //ProviderMgr.logger.warning("Refused. " +
- // errMsg);
+ // ProviderMgr.logger.warning("Refused. " +
+ // errMsg);
slist.updateEntry(workZone, curServer,
SList.SERVER_FAILURE);
- visitedServers.put(curServer, new Object()); //$NON-LOCK-1$
+ visitedServers.put(curServer, new Object()); // $NON-LOCK-1$
}
} catch (DomainProtocolException e) {
// removing this server from SLIST
slist.dropServer(workZone, curServer);
- //ProviderMgr.logger.warning("Unknown error.");
+ // ProviderMgr.logger.warning("Unknown error.");
} catch (IndexOutOfBoundsException e) {
// bad message received
slist.dropServer(workZone, curServer);
- //ProviderMgr.logger.warning("Bad message received: " +
- // " IndexOutOfBoundsException.");
+ // ProviderMgr.logger.warning("Bad message received: " +
+ // " IndexOutOfBoundsException.");
}
}
queriedServers.add(curServer);
}
// end of round
- if (received & parsed & correctAnswer)
- {
+ if (received & parsed & correctAnswer) {
// correct answer received
return receivedMes;
}
@@ -1063,30 +1060,31 @@
}
/**
- * Analyzes the answer message and constructs an analysis report.
- *
- * @param request the request has been send to the server
- * @param answer the answer has been received
- * @param workZone the current resolver's work zone
- * @return analysis report
- * TODO may be optimized
+ * Analyzes the answer message and constructs an analysis report.
+ *
+ * @param request
+ * the request has been send to the server
+ * @param answer
+ * the answer has been received
+ * @param workZone
+ * the current resolver's work zone
+ * @return analysis report TODO may be optimized
*/
AnalysisReport analyzeAnswer(Message request, Message answer)
- throws DomainProtocolException
- {
+ throws DomainProtocolException {
Enumeration<QuestionRecord> questions = request.getQuestionRecords();
Enumeration<ResourceRecord> answerRRs = answer.getAnswerRRs();
Enumeration<ResourceRecord> authorityRRs = answer.getAuthorityRRs();
Enumeration<ResourceRecord> additionalRRs;
QuestionRecord question;
- Resolver.AnalysisReport report = new AnalysisReport();
+ Resolver.AnalysisReport report = new AnalysisReport();
// Check the ID.
if (request.getId() != answer.getId()) {
// jndi.72=Request and Answer have different ids
throw new DomainProtocolException(Messages.getString("jndi.72")); //$NON-NLS-1$
}
-
+
// Determine a question.
if (questions.hasMoreElements()) {
question = questions.nextElement();
@@ -1099,7 +1097,7 @@
report.nameError = true;
return report;
}
- // check truncation, truncated message should not be cached
+ // check truncation, truncated message should not be cached
if (answer.isTc()) {
report.messageWasTruncated = true;
}
@@ -1107,59 +1105,52 @@
while (answerRRs.hasMoreElements()) {
ResourceRecord curRec = answerRRs.nextElement();
- if (question.getQClass() == curRec.getRRClass() ||
- question.getQClass() == ProviderConstants.ANY_QCLASS)
- {
- if (question.getQType() == ProviderConstants.ANY_QTYPE &&
- ProviderMgr.namesAreEqual(curRec.getName(),
- question.getQName()))
- {
+ if (question.getQClass() == curRec.getRRClass()
+ || question.getQClass() == ProviderConstants.ANY_QCLASS) {
+ if (question.getQType() == ProviderConstants.ANY_QTYPE
+ && ProviderMgr.namesAreEqual(curRec.getName(), question
+ .getQName())) {
// If we query for ANY record types and the server returns
// some record for the SAME domain name we will collect
// all of such records and treat
// this situation as a complete answer for this query.
- // We will not perform any more attempts to obtain more
+ // We will not perform any more attempts to obtain more
// records.
-
+
report.records.addElement(curRec);
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine("Adding " +
- // ProviderConstants.rrTypeNames[
- // curRec.getRRType()]);
- //}
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine("Adding " +
+ // ProviderConstants.rrTypeNames[
+ // curRec.getRRType()]);
+ // }
if (curRec.getRRType() == ProviderConstants.CNAME_TYPE) {
report.aliasInfoWasReceived = true;
report.newName = (String) curRec.getRData();
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine("Alias \"" +
- // report.newName + "\" was received");
- //}
- }
- else {
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine("Alias \"" +
+ // report.newName + "\" was received");
+ // }
+ } else {
// XXX have we received a complete set of records?
report.completeAnswerWasReceived = true;
}
- }
- else if (question.getQType() == curRec.getRRType() &&
- ProviderMgr.namesAreEqual(
- question.getQName(), curRec.getName()))
- {
+ } else if (question.getQType() == curRec.getRRType()
+ && ProviderMgr.namesAreEqual(question.getQName(),
+ curRec.getName())) {
// This is a situation when we get the record with the
// name and type exactly matching to that we have asked for.
- // We will treat this as a complete answer.
+ // We will treat this as a complete answer.
report.records.addElement(curRec);
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine("Adding " +
- // ProviderConstants.rrTypeNames[
- // curRec.getRRType()]);
- //}
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine("Adding " +
+ // ProviderConstants.rrTypeNames[
+ // curRec.getRRType()]);
+ // }
report.completeAnswerWasReceived = true;
- }
- else if (curRec.getRRType() == ProviderConstants.CNAME_TYPE &&
- ProviderMgr.namesAreEqual(curRec.getName(),
- question.getQName()))
- {
+ } else if (curRec.getRRType() == ProviderConstants.CNAME_TYPE
+ && ProviderMgr.namesAreEqual(curRec.getName(), question
+ .getQName())) {
// This is the case of an alias. If we received an alias for
// the name we have asked the information for then we need
// to change the desired name to this newly received name.
@@ -1167,106 +1158,105 @@
// this new name in the current answer. If we fail then
// we will continue our general lookup algorithm with the
// new name instead of an old one. We will query servers
- // from the SLIST with this new name.
-
+ // from the SLIST with this new name.
+
// TODO this is not effective
- Enumeration<ResourceRecord> answerRRs2 = answer.getAnswerRRs();
- Enumeration<ResourceRecord> additionalRRs2 = answer.getAdditionalRRs();
-
+ Enumeration<ResourceRecord> answerRRs2 = answer
+ .getAnswerRRs();
+ Enumeration<ResourceRecord> additionalRRs2 = answer
+ .getAdditionalRRs();
+
report.aliasInfoWasReceived = true;
report.newName = (String) curRec.getRData();
report.extraRecords.addElement(curRec);
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine("Alias \"" + report.newName +
- // "\" was received");
- //}
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine("Alias \"" + report.newName +
+ // "\" was received");
+ // }
// if we find the one of desired records in the
// current answer then we will treat the answer as complete
while (answerRRs2.hasMoreElements()) {
- // Try to look for info about newly received name
+ // Try to look for info about newly received name
// in ANSWER section.
ResourceRecord tmpRec = answerRRs2.nextElement();
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine(
- // "Look for an answer in ANSWER section");
- //}
- if (tmpRec.getRRType() == question.getQType() &&
- ProviderMgr.namesAreEqual(
- tmpRec.getName(), report.newName))
- {
- // the answer is founded in ANSWER section
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine(
+ // "Look for an answer in ANSWER section");
+ // }
+ if (tmpRec.getRRType() == question.getQType()
+ && ProviderMgr.namesAreEqual(tmpRec.getName(),
+ report.newName)) {
+ // the answer is founded in ANSWER section
report.records.addElement(tmpRec);
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine("Adding " +
- // ProviderConstants.rrTypeNames[
- // tmpRec.getRRType()]);
- //}
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine("Adding " +
+ // ProviderConstants.rrTypeNames[
+ // tmpRec.getRRType()]);
+ // }
report.completeAnswerWasReceived = true;
}
}
while (additionalRRs2.hasMoreElements()) {
- // Try to look for info about newly received name
+ // Try to look for info about newly received name
// in ADDITIONAL section.
ResourceRecord tmpRec = additionalRRs2.nextElement();
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine("Look for an answer in " +
- // "ADDITIONAL section");
- //}
- if (tmpRec.getRRType() == question.getQType() &&
- ProviderMgr.namesAreEqual(tmpRec.getName(),
- report.newName))
- {
- // the answer is founded in ADDITIONAL section
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine("Look for an answer in " +
+ // "ADDITIONAL section");
+ // }
+ if (tmpRec.getRRType() == question.getQType()
+ && ProviderMgr.namesAreEqual(tmpRec.getName(),
+ report.newName)) {
+ // the answer is founded in ADDITIONAL section
report.records.addElement(tmpRec);
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine("Adding " +
- // ProviderConstants.rrTypeNames[
- // tmpRec.getRRType()]);
- //}
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine("Adding " +
+ // ProviderConstants.rrTypeNames[
+ // tmpRec.getRRType()]);
+ // }
report.completeAnswerWasReceived = true;
}
}
- //if (report.completeAnswerWasReceived) {
- // if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine("Complete answer received");
- // }
- //}
- }
- else {
+ // if (report.completeAnswerWasReceived) {
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine("Complete answer received");
+ // }
+ // }
+ } else {
// We have received some extra records. Let's save it for
// future use.
-
+
// we will treat authoritative answer as a complete answer
- // and in no case will perform further actions
+ // and in no case will perform further actions
if (answer.isAA()) {
report.completeAnswerWasReceived = true;
}
report.extraRecords.addElement(curRec);
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine("Adding additional record " +
- // ProviderConstants.rrTypeNames[
- // curRec.getRRType()]);
- //}
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine("Adding additional record " +
+ // ProviderConstants.rrTypeNames[
+ // curRec.getRRType()]);
+ // }
}
} else {
// The record from another DNS class arrived. Just ignore it.
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine("Ignore records from DNS class " +
- // curRec.getRRClass());
- //}
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine("Ignore records from DNS class " +
+ // curRec.getRRClass());
+ // }
}
}
// analyze authority section
// 1. Store all info from authority NS records; try to locate NS IPs
- // from additional records in case if it is not present in SLIST;
- // start new background lookup process if not found in additional
- // section
+ // from additional records in case if it is not present in SLIST;
+ // start new background lookup process if not found in additional
+ // section
// TODO current implementation isn't effective
while (authorityRRs.hasMoreElements()) {
ResourceRecord curRec = authorityRRs.nextElement();
@@ -1279,8 +1269,8 @@
String serverName = (String) curRec.getRData();
SList.Server server2 = new SList.Server(serverName, null,
ProviderConstants.DEFAULT_DNS_PORT);
- SList.Server server = slist.getServerByServer(
- curRec.getName(), server2);
+ SList.Server server = slist.getServerByServer(curRec.getName(),
+ server2);
report.delegationArrived = true;
if (server == null) {
@@ -1295,24 +1285,23 @@
while (additionalRRs.hasMoreElements()) {
ResourceRecord addRec = additionalRRs.nextElement();
- if (ProviderMgr.namesAreEqual(
- addRec.getName(), serverName) &&
- addRec.getRRType() == ProviderConstants.A_TYPE)
- {
+ if (ProviderMgr.namesAreEqual(addRec.getName(),
+ serverName)
+ && addRec.getRRType() == ProviderConstants.A_TYPE) {
server.setIP((String) addRec.getRData());
}
}
if (server.getIP() == null) {
// IP was not found in additional section
// start resolving process in the background
- this.startResolvingThread(server.getName(),
- curRec.getRRClass());
+ this.startResolvingThread(server.getName(), curRec
+ .getRRClass());
}
}
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine("Delegation \"" + server +
- // "\" arrived");
- //}
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine("Delegation \"" + server +
+ // "\" arrived");
+ // }
} // end of NS type analysis
} // end of authority section analysis
@@ -1322,17 +1311,17 @@
ResourceRecord addRec = additionalRRs.nextElement();
report.extraRecords.addElement(addRec);
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine("Adding additional record " +
- // ProviderConstants.rrTypeNames[addRec.getRRType()]);
- //}
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine("Adding additional record " +
+ // ProviderConstants.rrTypeNames[addRec.getRRType()]);
+ // }
}
// Fixing RRSet TTL issue.
// If TTL fields in RRSet are not all the same then we need to set
// all TTLs to lowest found value.
// See RFC 2181 point 5.2
-
+
// checking report.records and report.extraRecords
for (int k = 0; k < 2; k++) {
Vector<ResourceRecord> records = null;
@@ -1352,7 +1341,7 @@
rr.getRRType();
long ttl = rr.getTtl();
Vector<ResourceRecord> objToUpdateTTL = new Vector<ResourceRecord>();
-
+
if (processed.contains(key)) {
continue;
}
@@ -1363,12 +1352,12 @@
String key2 = rr2.getName() + " " + rr2.getRRClass() + " " + //$NON-NLS-1$ //$NON-NLS-2$
rr2.getRRType();
long ttl2 = rr2.getTtl();
-
+
if (processed.contains(key2)) {
continue;
}
if (key.equals(key2)) {
- if (ttl > ttl2) {
+ if (ttl > ttl2) {
ttl = ttl2;
}
objToUpdateTTL.addElement(rr2);
@@ -1377,7 +1366,7 @@
// update TTL if necessary
for (int j = 0; j < objToUpdateTTL.size(); j++) {
ResourceRecord rr2 = objToUpdateTTL.elementAt(j);
-
+
if (rr2.getTtl() != ttl) {
rr2.setTtl(ttl);
}
@@ -1392,13 +1381,12 @@
/**
* Creates a new <code>Message</code> object and fills some of it's
- * standard fields.
+ * standard fields.
*
* @return created <code>Message</code> object
*/
- static Message createMessageForSending(String desiredName,
- int recType, int recClass) throws DomainProtocolException
- {
+ static Message createMessageForSending(String desiredName, int recType,
+ int recClass) throws DomainProtocolException {
Message mes = new Message();
QuestionRecord qr = new QuestionRecord();
@@ -1413,26 +1401,28 @@
mes.addQuestionRecord(qr);
return mes;
}
-
+
/**
- * Starts new resolver thread that will be searching for IP of the
- * given hostname.
- * @param hostname hostname to resolve
- * @param dnsClass DNS class of host
+ * Starts new resolver thread that will be searching for IP of the given
+ * hostname.
+ *
+ * @param hostname
+ * hostname to resolve
+ * @param dnsClass
+ * DNS class of host
*/
void startResolvingThread(String hostname, int dnsClass) {
Thread newThread;
Resolver.ThreadListEntry newEntry;
int classes[] = new int[1];
-
+
synchronized (threadListSemaphore) {
- // check that no currently running thread looks for this hostname
+ // check that no currently running thread looks for this hostname
for (int i = 0; i < resolverThreads.size(); i++) {
Resolver.ThreadListEntry entry = resolverThreads.get(i);
if (ProviderMgr.namesAreEqual(hostname,
- entry.serverNameToResolve) &&
- entry.dnsClass == dnsClass)
- {
+ entry.serverNameToResolve)
+ && entry.dnsClass == dnsClass) {
// this hostname is already under investigation
// exiting
return;
@@ -1442,9 +1432,8 @@
for (int i = 0; i < hostnamesToResolve.size(); i++) {
Resolver.ThreadListEntry entry = hostnamesToResolve.get(i);
if (ProviderMgr.namesAreEqual(hostname,
- entry.serverNameToResolve) &&
- entry.dnsClass == dnsClass)
- {
+ entry.serverNameToResolve)
+ && entry.dnsClass == dnsClass) {
// this hostname is already scheduled for resolving
// exiting
return;
@@ -1462,23 +1451,22 @@
hostnamesToResolve.add(newEntry);
// starting new thread that should make further updates by itself
newThread = new Thread(this);
- //if (LogConst.DEBUG) {
- // ProviderMgr.logger.fine("Starting new resolver thread," +
- // " target hostname: " + hostname);
- //}
+ // if (LogConst.DEBUG) {
+ // ProviderMgr.logger.fine("Starting new resolver thread," +
+ // " target hostname: " + hostname);
+ // }
newThread.start();
}
}
-
+
/**
- * Start background search of the address of next unresolved server
- * hostname
+ * Start background search of the address of next unresolved server hostname
*/
public void run() {
SList slist = SList.getInstance();
Enumeration<ResourceRecord> foundRecords;
Resolver.ThreadListEntry entryToProcess;
- int [] classes = new int[1];
+ int[] classes = new int[1];
// update lists
synchronized (threadListSemaphore) {
@@ -1488,8 +1476,8 @@
entryToProcess.thread = Thread.currentThread();
resolverThreads.add(entryToProcess);
} else {
- //ProviderMgr.logger.warning(
- // "Resolver thread: no host name to resolve");
+ // ProviderMgr.logger.warning(
+ // "Resolver thread: no host name to resolve");
return;
}
}
@@ -1497,8 +1485,7 @@
try {
classes[0] = entryToProcess.dnsClass;
foundRecords = lookup(entryToProcess.serverNameToResolve,
- new int[] {ProviderConstants.A_TYPE},
- classes);
+ new int[] { ProviderConstants.A_TYPE }, classes);
while (foundRecords != null && foundRecords.hasMoreElements()) {
// we will take all A records and store all of them in SLIST
ResourceRecord rr = foundRecords.nextElement();
@@ -1508,8 +1495,7 @@
(String) rr.getRData());
}
}
- }
- catch (NamingException e) {
+ } catch (NamingException e) {
// just ignore it
}
// update resolver threads list, remove info about current thread
@@ -1519,9 +1505,8 @@
if (ProviderMgr.namesAreEqual(
entryToProcess.serverNameToResolve,
- entry.serverNameToResolve) &&
- entryToProcess.dnsClass == entry.dnsClass)
- {
+ entry.serverNameToResolve)
+ && entryToProcess.dnsClass == entry.dnsClass) {
resolverThreads.remove(i);
break;
}
@@ -1529,23 +1514,30 @@
}
// exiting
}
-
-
+
/**
- * Analysis report.
- * @author Alexei Zakharov
+ * Analysis report.
+ *
* @see Resolver#analyzeAnswer(Message, Message)
*/
static class AnalysisReport {
boolean completeAnswerWasReceived = false;
+
boolean nameError = false;
+
boolean delegationArrived = false;
+
boolean aliasInfoWasReceived = false;
+
boolean messageWasTruncated = false;
+
Vector<ResourceRecord> records;
+
Vector<String> delegationZones;
+
String newName = null;
+
Vector<ResourceRecord> extraRecords;
AnalysisReport() {