RFR: 8223260: NamingManager should cache InitialContextFactory

Seán Coffey sean.coffey at oracle.com
Wed Feb 5 08:31:52 UTC 2020


Thanks again for the review Peter. There's an off-thread conversation 
around whether the ClassLoaderValue should hold SoftReferences to the 
Factory that's stored with the classloader. I think we're looking at a 
possible leak otherwise.
i.e. ClassLoaderValue<SoftReference<InitialContextFactory>>

I'm looking into that now.

Also - I'm hoping to port this to JDK 11u also so I might spin the 
specification changes into a different bug ID.

regards,
Sean.

On 03/02/2020 09:05, Peter Levart wrote:
> Hi Seán,
>
> On 2/1/20 12:22 AM, Seán Coffey wrote:
>>> The following is also possible:
>>>
>>>             // 1st try finding a ServiceLoader.Provider with type() 
>>> of correct name
>>>             factory = loader
>>>                 .stream()
>>>                 .filter(p -> p.type().getName().equals(className))
>>>                 .findFirst()
>>>                 .map(ServiceLoader.Provider::get)
>>>                 .or( // if that doesn't yield any result, 
>>> instantiate the services
>>>                      // one by one and search for implementation 
>>> class of correct name
>>>                     () -> loader
>>>                         .stream()
>>>                         .map(ServiceLoader.Provider::get)
>>>                         .filter(f -> 
>>> f.getClass().getName().equals(className))
>>>                         .findFirst()
>>>                 ).orElse(null);
>>>
>>> So what do you think?
>>
>> ok - possible I guess but I think it's highly unlikely ? It looks 
>> like alot of extra care for a case that shouldn't happen. I'll stick 
>> with your earlier suggestion unless you or others object.
>
> For the 3 InitialContextFactory implementations in JDK 
> (DnsContextFactory, RegistryContextFactory, LdapCtxFactory), none uses 
> the provider() static method convention, so for them the 
> Provider.type()s are actually the same as their implementation 
> classes. Should other InitialContextFactory service providers use the 
> provider() static method convention (they may do this only if they are 
> provided as Java modules I think), the InitialContextFactory sub-type 
> name searched for in the NamingManager.getInitialContext() method is 
> the provider type name, and not the implementation class name of the 
> InitialContextFactory. They are usually the same, but in case of 
> provider() static method convention, they may or may not be. This is 
> not a problem for JDK supplied implementations and I don't think for 
> any other current implementation. But anyway, I think this distinction 
> should be spelled out in the specification of the 
> NamingManager.getInitialContext() method and this is an opportunity to 
> add some text for that. For example:
>
> Index: src/java.naming/share/classes/javax/naming/spi/NamingManager.java
> IDEA additional info:
> Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
> <+>UTF-8
> ===================================================================
> --- src/java.naming/share/classes/javax/naming/spi/NamingManager.java 
> (revision 57904:0905868db490c87df463258166762797374e5a96)
> +++ src/java.naming/share/classes/javax/naming/spi/NamingManager.java 
> (revision 57904+:0905868db490+)
> @@ -644,7 +660,9 @@
>       *     <ul>
>       *     <li>First, the {@linkplain java.util.ServiceLoader 
> ServiceLoader}
>       *         mechanism tries to locate an {@code InitialContextFactory}
> -     *         provider using the current thread's context class 
> loader</li>
> +     *         provider for which the {@linkplain 
> ServiceLoader.Provider#type()}
> +     *         returns a type with name equal to {@code 
> Context.INITIAL_CONTEXT_FACTORY}
> +     *         environment property and using the current thread's 
> context class loader</li>
>       *     <li>Failing that, this implementation tries to locate a 
> suitable
>       *         {@code InitialContextFactory} using a built-in mechanism
>       *         <br>
> @@ -662,7 +680,7 @@
>       * @return A non-null initial context.
>       * @exception NoInitialContextException If the
>       *          {@code Context.INITIAL_CONTEXT_FACTORY} property
> -     *         is not found or names a nonexistent
> +     *         is not found or names a nonexistent {@linkplain 
> ServiceLoader.Provider#type()},
>       *         class or a class that cannot be instantiated,
>       *          or if the initial context could not be created for 
> some other
>       *          reason.
>
>
>>
>> current webrev: 
>> https://cr.openjdk.java.net/~coffeys/webrev.8223260.v3/webrev/
>>
>
> Otherwise, I think this webrev looks good now.
>
>> regards,
>> Sean. 
>
> Regards, Peter
>


More information about the core-libs-dev mailing list