--- old/src/share/classes/java/net/InetAddress.java 2014-06-20 13:04:48.992440218 +0200 +++ new/src/share/classes/java/net/InetAddress.java 2014-06-20 13:04:48.906441799 +0200 @@ -252,8 +252,91 @@ return holder; } - /* Used to store the name service provider */ - private static List nameServices = null; + /* Used to store the name service providers */ + private static final class NameServices { + private static final List nameServices = new ArrayList<>(); + + static { + // get name service if provided and requested + String propPrefix = "sun.net.spi.nameservice.provider."; + int n = 1; + String provider = AccessController.doPrivileged( + new GetPropertyAction(propPrefix + n)); + while (provider != null) { + NameService ns = createNSProvider(provider); + if (ns != null) + nameServices.add(ns); + + n++; + provider = AccessController.doPrivileged( + new GetPropertyAction(propPrefix + n)); + } + + // if not designate any name services provider, + // create a default one + if (nameServices.size() == 0) { + NameService ns = createNSProvider("default"); + nameServices.add(ns); + } + } + + private static NameService createNSProvider(String provider) { + if (provider == null) + return null; + + NameService nameService = null; + if (provider.equals("default")) { + // initialize the default name service + nameService = new NameService() { + public InetAddress[] lookupAllHostAddr(String host) + throws UnknownHostException { + return impl.lookupAllHostAddr(host); + } + public String getHostByAddr(byte[] addr) + throws UnknownHostException { + return impl.getHostByAddr(addr); + } + }; + } else { + final String providerName = provider; + try { + nameService = java.security.AccessController.doPrivileged( + new java.security.PrivilegedExceptionAction() { + public NameService run() { + Iterator itr = + ServiceLoader.load(NameServiceDescriptor.class) + .iterator(); + while (itr.hasNext()) { + NameServiceDescriptor nsd = itr.next(); + if (providerName. + equalsIgnoreCase(nsd.getType()+"," + +nsd.getProviderName())) { + try { + return nsd.createNameService(); + } catch (Exception e) { + e.printStackTrace(); + System.err.println( + "Cannot create name service:" + +providerName+": " + e); + } + } + } + + return null; + } + } + ); + } catch (java.security.PrivilegedActionException e) { + } + } + + return nameService; + } + + static List get() { + return nameServices; + } + } /* Used to store the best available hostname */ private transient String canonicalHostName = null; @@ -590,7 +673,7 @@ */ private static String getHostFromNameService(InetAddress addr, boolean check) { String host = null; - for (NameService nameService : nameServices) { + for (NameService nameService : NameServices.get()) { try { // first lookup the hostname host = nameService.getHostByAddr(addr.getAddress()); @@ -894,86 +977,9 @@ return null; } - private static NameService createNSProvider(String provider) { - if (provider == null) - return null; - - NameService nameService = null; - if (provider.equals("default")) { - // initialize the default name service - nameService = new NameService() { - public InetAddress[] lookupAllHostAddr(String host) - throws UnknownHostException { - return impl.lookupAllHostAddr(host); - } - public String getHostByAddr(byte[] addr) - throws UnknownHostException { - return impl.getHostByAddr(addr); - } - }; - } else { - final String providerName = provider; - try { - nameService = java.security.AccessController.doPrivileged( - new java.security.PrivilegedExceptionAction() { - public NameService run() { - Iterator itr = - ServiceLoader.load(NameServiceDescriptor.class) - .iterator(); - while (itr.hasNext()) { - NameServiceDescriptor nsd = itr.next(); - if (providerName. - equalsIgnoreCase(nsd.getType()+"," - +nsd.getProviderName())) { - try { - return nsd.createNameService(); - } catch (Exception e) { - e.printStackTrace(); - System.err.println( - "Cannot create name service:" - +providerName+": " + e); - } - } - } - - return null; - } - } - ); - } catch (java.security.PrivilegedActionException e) { - } - } - - return nameService; - } - static { // create the impl impl = InetAddressImplFactory.create(); - - // get name service if provided and requested - String provider = null;; - String propPrefix = "sun.net.spi.nameservice.provider."; - int n = 1; - nameServices = new ArrayList(); - provider = AccessController.doPrivileged( - new GetPropertyAction(propPrefix + n)); - while (provider != null) { - NameService ns = createNSProvider(provider); - if (ns != null) - nameServices.add(ns); - - n++; - provider = AccessController.doPrivileged( - new GetPropertyAction(propPrefix + n)); - } - - // if not designate any name services provider, - // create a default one - if (nameServices.size() == 0) { - NameService ns = createNSProvider("default"); - nameServices.add(ns); - } } /** @@ -1291,7 +1297,7 @@ // This is the first thread which looks up the addresses // this host or the cache entry for this host has been // expired so this thread should do the lookup. - for (NameService nameService : nameServices) { + for (NameService nameService : NameServices.get()) { try { /* * Do not put the call to lookup() inside the