< prev index next >
src/java.naming/share/classes/javax/naming/spi/NamingManager.java
Print this page
*** 1,7 ****
/*
! * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
--- 1,7 ----
/*
! * Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
*** 24,40 ****
*/
package javax.naming.spi;
import java.net.MalformedURLException;
import java.util.*;
-
import javax.naming.*;
import com.sun.naming.internal.VersionHelper;
import com.sun.naming.internal.ResourceManager;
import com.sun.naming.internal.FactoryEnumeration;
/**
* This class contains methods for creating context objects
* and objects referred to by location information in the naming
* or directory service.
--- 24,42 ----
*/
package javax.naming.spi;
import java.net.MalformedURLException;
+ import java.security.AccessController;
+ import java.security.PrivilegedAction;
import java.util.*;
import javax.naming.*;
import com.sun.naming.internal.VersionHelper;
import com.sun.naming.internal.ResourceManager;
import com.sun.naming.internal.FactoryEnumeration;
+ import jdk.internal.loader.ClassLoaderValue;
/**
* This class contains methods for creating context objects
* and objects referred to by location information in the naming
* or directory service.
*** 77,86 ****
--- 79,91 ----
/**
* Package-private; used by DirectoryManager and NamingManager.
*/
private static ObjectFactoryBuilder object_factory_builder = null;
+ private static final ClassLoaderValue<InitialContextFactory> FACTORIES_CACHE =
+ new ClassLoaderValue<>();
+
/**
* The ObjectFactoryBuilder determines the policy used when
* trying to load object factories.
* See getObjectInstance() and class ObjectFactory for a description
* of the default policy.
*** 670,679 ****
--- 675,685 ----
* @see javax.naming.InitialContext
* @see javax.naming.directory.InitialDirContext
*/
public static Context getInitialContext(Hashtable<?,?> env)
throws NamingException {
+ ClassLoader loader;
InitialContextFactory factory = null;
InitialContextFactoryBuilder builder = getInitialContextFactoryBuilder();
if (builder == null) {
// No builder installed, use property
*** 687,715 ****
"property, or in an application resource file: " +
Context.INITIAL_CONTEXT_FACTORY);
throw ne;
}
! ServiceLoader<InitialContextFactory> loader =
! ServiceLoader.load(InitialContextFactory.class);
! Iterator<InitialContextFactory> iterator = loader.iterator();
try {
! while (iterator.hasNext()) {
! InitialContextFactory f = iterator.next();
! if (f.getClass().getName().equals(className)) {
! factory = f;
! break;
}
}
} catch (ServiceConfigurationError e) {
NoInitialContextException ne =
new NoInitialContextException(
"Cannot load initial context factory "
+ "'" + className + "'");
ne.setRootCause(e);
! throw ne;
}
if (factory == null) {
try {
@SuppressWarnings("deprecation")
--- 693,745 ----
"property, or in an application resource file: " +
Context.INITIAL_CONTEXT_FACTORY);
throw ne;
}
! if (System.getSecurityManager() == null) {
! loader = Thread.currentThread().getContextClassLoader();
! if (loader == null) loader = ClassLoader.getSystemClassLoader();
! } else {
! PrivilegedAction<ClassLoader> pa = () -> {
! ClassLoader cl = Thread.currentThread().getContextClassLoader();
! return (cl == null) ? ClassLoader.getSystemClassLoader() : cl;
! };
! loader = AccessController.doPrivileged(pa);
! }
! var key = FACTORIES_CACHE.sub(className);
try {
! factory = key.computeIfAbsent(loader, (ld, ky) -> getFactory(ky.key()));
! } catch (FactoryInitializationError e) {
! throw e.getCause();
}
+ } else {
+ factory = builder.createInitialContextFactory(env);
}
+
+ return factory.getInitialContext(env);
+ }
+
+ private static InitialContextFactory getFactory(String className) {
+ InitialContextFactory factory;
+ try {
+ ServiceLoader<InitialContextFactory> loader =
+ ServiceLoader.load(InitialContextFactory.class);
+
+ factory = loader
+ .stream()
+ .filter(p -> p.type().getName().equals(className))
+ .findFirst()
+ .map(ServiceLoader.Provider::get)
+ .orElse(null);
} catch (ServiceConfigurationError e) {
NoInitialContextException ne =
new NoInitialContextException(
"Cannot load initial context factory "
+ "'" + className + "'");
ne.setRootCause(e);
! throw new FactoryInitializationError(ne);
}
if (factory == null) {
try {
@SuppressWarnings("deprecation")
*** 718,735 ****
} catch (Exception e) {
NoInitialContextException ne =
new NoInitialContextException(
"Cannot instantiate class: " + className);
ne.setRootCause(e);
! throw ne;
}
}
! } else {
! factory = builder.createInitialContextFactory(env);
! }
!
! return factory.getInitialContext(env);
}
/**
* Sets the InitialContextFactory builder to be builder.
--- 748,761 ----
} catch (Exception e) {
NoInitialContextException ne =
new NoInitialContextException(
"Cannot instantiate class: " + className);
ne.setRootCause(e);
! throw new FactoryInitializationError(ne);
}
}
! return factory;
}
/**
* Sets the InitialContextFactory builder to be builder.
*** 919,924 ****
--- 945,964 ----
answer = factory.getStateToBind(obj, name, nameCtx, environment);
}
return (answer != null) ? answer : obj;
}
+
+ private static class FactoryInitializationError extends Error {
+ @java.io.Serial
+ static final long serialVersionUID = -5805552256848841560L;
+
+ private FactoryInitializationError(NoInitialContextException cause) {
+ super(cause);
+ }
+
+ @Override
+ public NoInitialContextException getCause() {
+ return (NoInitialContextException) super.getCause();
+ }
+ }
}
< prev index next >