src/share/classes/java/net/InetAddress.java

Print this page

        

@@ -250,12 +250,95 @@
 
     InetAddressHolder holder() {
         return holder;
     }
 
-    /* Used to store the name service provider */
-    private static List<NameService> nameServices = null;
+    /* Used to store the name service providers */
+    private static final class NameServices {
+        private static final List<NameService> 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<NameService>() {
+                            public NameService run() {
+                                Iterator<NameServiceDescriptor> 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<NameService> get() {
+            return nameServices;
+        }
+    }
 
     /* Used to store the best available hostname */
     private transient String canonicalHostName = null;
 
     /** use serialVersionUID from JDK 1.0.2 for interoperability */

@@ -588,11 +671,11 @@
      *
      * @see SecurityManager#checkConnect
      */
     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());
 
                 /* check to see if calling code is allowed to know

@@ -892,90 +975,13 @@
 
         // not found
         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<NameService>() {
-                        public NameService run() {
-                            Iterator<NameServiceDescriptor> 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<NameService>();
-        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);
-        }
     }
 
     /**
      * Creates an InetAddress based on the provided host name and IP address.
      * No name service is checked for the validity of the address.

@@ -1289,11 +1295,11 @@
         if ((addresses = checkLookupTable(host)) == null) {
             try {
                 // 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
                          * constructor.  if you do you will still be
                          * allocating space when the lookup fails.