Package org.gudy.azureus2.core3.util

Source Code of org.gudy.azureus2.core3.util.IPToHostNameResolver

/*
* Created on 27-May-2004
* Created by Paul Gardner
* Copyright (C) 2004, 2005, 2006 Aelitis, All Rights Reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*
* AELITIS, SAS au capital de 46,603.30 euros
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*
*/

package org.gudy.azureus2.core3.util;

/**
* @author parg
*
*/

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.*;

public class
IPToHostNameResolver
{
  static protected AEThread2    resolver_thread;
  static protected List      request_queue    = new ArrayList();
  static protected AEMonitor    request_mon      = new AEMonitor( "IPToHostNameResolver" );

  static protected AESemaphore  request_semaphore  = new AESemaphore("IPToHostNameResolver");
 
  public static IPToHostNameResolverRequest
  addResolverRequest(
    String              ip,
    IPToHostNameResolverListener  l )
  {
    try{
      request_mon.enter();
     
      IPToHostNameResolverRequest  request = new IPToHostNameResolverRequest( ip, l );
     
      request_queue.add( request );
     
      request_semaphore.release();
     
      if ( resolver_thread == null ){
       
        resolver_thread =
          new AEThread2("IPToHostNameResolver", true )
          {
            public void
            run()
            {
              while(true){
               
                try{
                  request_semaphore.reserve(30000);
                 
                  IPToHostNameResolverRequest  req;
                 
                  try{
                    request_mon.enter();
                   
                    if ( request_queue.isEmpty()){
                     
                      resolver_thread = null;
                     
                      break;
                    }
                   
                    req  = (IPToHostNameResolverRequest)request_queue.remove(0);
                   
                  }finally{
                   
                    request_mon.exit();
                  }
                 
                  IPToHostNameResolverListener  listener = req.getListener();
                 
                    // if listener is null the request has been cancelled
                 
                  if ( listener != null ){
                   
                    try{
                      InetAddress addr = InetAddress.getByName( req.getIP());
                       
                      req.getListener().IPResolutionComplete( addr.getHostName(), true );
                       
                    }catch( Throwable e ){
                     
                      req.getListener().IPResolutionComplete( req.getIP(), false );
                     
                    }
                  }
                }catch( Throwable e ){
                 
                  Debug.printStackTrace( e );
                }
              }
            }
          };
                   
        resolver_thread.start();
      }
     
      return( request );
     
    }finally{
     
      request_mon.exit();
    }
  }
 
  public static String
  syncResolve(
    String      ip,
    int        timeout )
 
    throws Exception
  {
    final AESemaphore  sem = new AESemaphore( "IPToHostNameREsolver:sync" );
   
    final Object[]  result = {null};
       
    addResolverRequest(
      ip,
      new IPToHostNameResolverListener()
      {
        public void
        IPResolutionComplete(
          String    resolved_ip,
          boolean    succeeded )
        {
          try{
            synchronized( result ){

              if ( succeeded ){
                 
                result[0] = resolved_ip;
              }
            }
          }finally{
           
            sem.release();
          }
        }
      });
     
    if ( !sem.reserve( timeout )){
     
      throw( new Exception( "Timeout" ));
    }
       
    synchronized( result ){

      if ( result[0] != null ){
       
        return((String)result[0]);
      }
     
      throw( new UnknownHostException( ip ));
    }
  }
}
TOP

Related Classes of org.gudy.azureus2.core3.util.IPToHostNameResolver

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.