noel 2004/03/29 16:48:40
Modified: src/java/org/apache/james/dnsserver DNSServer.java
Log:
Revert to prior version. Premature merger from branch_2_1_fcs
Revision Changes Path
1.26 +12 -182 james-server/src/java/org/apache/james/dnsserver/DNSServer.java
Index: DNSServer.java
===================================================================
RCS file: /home/cvs/james-server/src/java/org/apache/james/dnsserver/DNSServer.java,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -r1.25 -r1.26
--- DNSServer.java 30 Mar 2004 00:37:46 -0000 1.25
+++ DNSServer.java 30 Mar 2004 00:48:40 -0000 1.26
@@ -29,7 +29,6 @@
import org.xbill.DNS.FindServer;
import org.xbill.DNS.Message;
import org.xbill.DNS.MXRecord;
-import org.xbill.DNS.ARecord;
import org.xbill.DNS.Name;
import org.xbill.DNS.Rcode;
import org.xbill.DNS.Record;
@@ -43,7 +42,7 @@
import java.net.UnknownHostException;
import java.util.*;
-/*
+/**
* Provides DNS client functionality to services running
* inside James
*/
@@ -52,34 +51,34 @@
implements Configurable, Initializable,
org.apache.james.services.DNSServer, DNSServerMBean {
- /*
+ /**
* A resolver instance used to retrieve DNS records. This
* is a reference to a third party library object.
*/
private Resolver resolver;
- /*
+ /**
* A TTL cache of results received from the DNS server. This
* is a reference to a third party library object.
*/
private Cache cache;
- /*
+ /**
* Whether the DNS response is required to be authoritative
*/
private byte dnsCredibility;
- /*
+ /**
* The DNS servers to be used by this service
*/
private List dnsServers = new ArrayList();
- /*
+ /**
* The MX Comparator used in the MX sort.
*/
private Comparator mxComparator = new MXRecordComparator();
- /*
+ /**
* @see
org.apache.avalon.framework.configuration.Configurable#configure(Configuration)
*/
public void configure( final Configuration configuration )
@@ -120,7 +119,7 @@
dnsCredibility = authoritative ? Credibility.AUTH_ANSWER :
Credibility.NONAUTH_ANSWER;
}
- /*
+ /**
* @see org.apache.avalon.framework.activity.Initializable#initialize()
*/
public void initialize()
@@ -158,7 +157,7 @@
getLogger().debug("DNSServer ...init end");
}
- /*
+ /**
* <p>Return the list of DNS servers in use by this service</p>
*
* @return an array of DNS server names
@@ -167,7 +166,7 @@
return (String[])dnsServers.toArray(new String[0]);
}
- /*
+ /**
* <p>Return a prioritized unmodifiable list of MX records
* obtained from the server.</p>
*
@@ -223,7 +222,7 @@
}
}
- /*
+ /**
* Looks up DNS records of the specified type for the specified name.
*
* This method is a public wrapper for the private implementation
@@ -236,7 +235,7 @@
return rawDNSLookup(name,false,type);
}
- /*
+ /**
* Looks up DNS records of the specified type for the specified name
*
* @param namestr the name of the host to be looked up
@@ -347,175 +346,6 @@
int pa = ((MXRecord)a).getPriority();
int pb = ((MXRecord)b).getPriority();
return (pa == pb) ? (512 - random.nextInt(1024)) : pa - pb;
- }
- }
-
- /*
- * Returns an Iterator over org.apache.mailet.HostAddress, a
- * specialized subclass of javax.mail.URLName, which provides
- * location information for servers that are specified as mail
- * handlers for the given hostname. This is done using MX records,
- * and the HostAddress instances are returned sorted by MX priority.
- * If no host is found for domainName, the Iterator returned will be
- * empty and the first call to hasNext() will return false. The
- * Iterator is a nested iterator: the outer iteration is over the
- * results of the MX record lookup, and the inner iteration is over
- * potentially multiple A records for each MX record. DNS lookups
- * are deferred until actually needed.
- *
- * @since v2.2.0a16-unstable
- * @param domainName - the domain for which to find mail servers
- * @return an Iterator over HostAddress instances, sorted by priority
- */
- public Iterator getSMTPHostAddresses(final String domainName) {
- return new Iterator() {
- private Iterator mxHosts = new MxSorter(domainName);
- private Iterator addresses = null;
-
- public boolean hasNext() {
- /* Make sure that when next() is called, that we can
- * provide a HostAddress. This means that we need to
- * have an inner iterator, and verify that it has
- * addresses. We could, for example, run into a
- * situation where the next mxHost didn't have any valid
- * addresses.
- */
- if ((addresses == null || !addresses.hasNext()) &&
mxHosts.hasNext()) do {
- final String nextHostname = (String)mxHosts.next();
- addresses = new Iterator() {
- private Record[] aRecords = lookup(nextHostname, Type.A);
- int i = 0;
-
- public boolean hasNext() {
- return aRecords != null && i < aRecords.length;
- }
-
- public Object next() {
- return new org.apache.mailet.HostAddress(nextHostname,
"smtp://" + ((ARecord)aRecords[i++]).getAddress().getHostAddress());
- }
-
- public void remove() {
- throw new UnsupportedOperationException ("remove not
supported by this iterator");
- }
- };
- } while (!addresses.hasNext() && mxHosts.hasNext());
-
- return addresses != null && addresses.hasNext();
- }
-
- public Object next() {
- return addresses != null ? addresses.next() : null;
- }
-
- public void remove() {
- throw new UnsupportedOperationException ("remove not supported by
this iterator");
- }
- };
- }
-
- /* A way to get mail hosts to try. If any MX hosts are found for the
- * domain name with which this is constructed, then these MX hostnames
- * are returned in priority sorted order, lowest priority numbers coming
- * first. And, whenever multiple hosts have the same priority then these
- * are returned in a randomized order within that priority group, as
- * specified in RFC 2821, Section 5.
- *
- * If no MX hosts are found for the domain name, then a DNS search is
- * performed for an A record. If an A record is found then domainName itself
- * will be returned by the Iterator, and it will be the only object in
- * the Iterator. If however no A record is found (in addition to no MX
- * record) then the Iterator constructed will be empty; the first call to
- * its hasNext() will return false.
- *
- * This behavior attempts to satisfy the requirements of RFC 2821, Section 5.
- * @since v2.2.0a16-unstable
- */
- private class MxSorter implements Iterator {
- private int priorListPriority = Integer.MIN_VALUE;
- private ArrayList equiPriorityList = new ArrayList();
- private Record[] mxRecords;
- private Random rnd = new Random ();
-
- /* The implementation of this class attempts to achieve efficiency by
- * performing no more sorting of the rawMxRecords than necessary. In the
- * large majority of cases the first attempt, made by a client of this class
- * to connect to an SMTP server for a given domain, will succeed. As such,
- * in most cases only one call will be made to this Iterator's
- * next(), and in that majority of cases there will have been no need
- * to sort the array of MX Records. This implementation would, however, be
- * relatively inefficient in the case where all hosts fail, when every
- * Object is called out of a long Iterator.
- */
-
- private MxSorter(String domainName) {
- mxRecords = lookup(domainName, Type.MX);
- if (mxRecords == null || mxRecords.length == 0) {
- //no MX records were found, so try to use the domainName
- Record[] aRecords = lookup(domainName, Type.A);
- if(aRecords != null && aRecords.length > 0) {
- equiPriorityList.add(domainName);
- }
- }
- }
-
- /*
- * Sets presentPriorityList to contain all hosts
- * which have the least priority greater than pastPriority.
- * When this is called, both (rawMxRecords.length > 0) and
- * (presentPriorityList.size() == 0), by contract.
- * In the case where this is called repeatedly, so that priorListPriority
- * has already become the highest of the priorities in the rawMxRecords,
- * then this returns without having added any elements to
- * presentPriorityList; presentPriorityList.size remains zero.
- */
- private void createPriorityList(){
- int leastPriorityFound = Integer.MAX_VALUE;
- /* We loop once through the rawMxRecords, finding the lowest priority
- * greater than priorListPriority, and collecting all the hostnames
- * with that priority into equiPriorityList.
- */
- for (int i = 0; i < mxRecords.length; i++) {
- MXRecord thisRecord = (MXRecord)mxRecords[i];
- int thisRecordPriority = thisRecord.getPriority();
- if (thisRecordPriority > priorListPriority) {
- if (thisRecordPriority < leastPriorityFound) {
- equiPriorityList.clear();
- leastPriorityFound = thisRecordPriority;
- equiPriorityList.add(thisRecord.getTarget().toString());
- } else if (thisRecordPriority == leastPriorityFound) {
- equiPriorityList.add(thisRecord.getTarget().toString());
- }
- }
- }
- priorListPriority = leastPriorityFound;
- }
-
- public boolean hasNext(){
- if (equiPriorityList.size() > 0){
- return true;
- }else if (mxRecords != null && mxRecords.length > 0){
- createPriorityList();
- return equiPriorityList.size() > 0;
- } else{
- return false;
- }
- }
-
- public Object next(){
- if (hasNext()){
- /* this randomization is done to comply with RFC-2821 */
- /* Note: java.util.Random.nextInt(limit) is about twice as fast as
(int)(Math.random()*limit) */
- int getIndex = rnd.nextInt(equiPriorityList.size());
- Object returnElement = equiPriorityList.get(getIndex);
- equiPriorityList.remove(getIndex);
- return returnElement;
- }else{
- throw new NoSuchElementException();
- }
- }
-
- public void remove () {
- throw new UnsupportedOperationException ("remove not supported by this
iterator");
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]