Skip to content

Commit d892b1e

Browse files
authored
Merge pull request #32833 from jimmy1wu/32787
fallback to NamingManagerHelper regardless of JDK version
2 parents 70f553e + b9513d5 commit d892b1e

File tree

1 file changed

+19
-33
lines changed
  • dev/com.ibm.ws.org.apache.aries.jndi.core/src/org/apache/aries/jndi/startup

1 file changed

+19
-33
lines changed

dev/com.ibm.ws.org.apache.aries.jndi.core/src/org/apache/aries/jndi/startup/Activator.java

Lines changed: 19 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,13 @@
1919
package org.apache.aries.jndi.startup;
2020

2121
import java.lang.reflect.Field;
22-
import java.security.AccessController;
23-
import java.security.PrivilegedAction;
2422
import java.util.ArrayList;
2523
import java.util.Arrays;
2624
import java.util.Collection;
2725
import java.util.Collections;
2826
import java.util.List;
2927
import java.util.Map;
3028
import java.util.concurrent.ConcurrentHashMap;
31-
import java.util.function.Supplier;
3229

3330
import javax.naming.NamingException;
3431
import javax.naming.spi.InitialContextFactory;
@@ -89,34 +86,6 @@ public class Activator implements BundleActivator {
8986
private ObjectFactoryBuilder originalOFBuilder;
9087
private OSGiObjectFactoryBuilder ofBuilder;
9188

92-
//In Java20+ the ObjectFactoryBuilder static field is in the NamingManagerHelper class.
93-
private final Class<?> objectFactoryBuilderHolder = new Supplier<Class<?>>() {
94-
@Override
95-
public Class<?> get() {
96-
if (javaMajorVersion() >= 20) {
97-
try {
98-
return Class.forName("com.sun.naming.internal.NamingManagerHelper");
99-
} catch (ClassNotFoundException e) {
100-
}
101-
}
102-
return NamingManager.class;
103-
}
104-
}.get();
105-
106-
private int javaMajorVersion() {
107-
String version = AccessController.doPrivileged(new PrivilegedAction<String>() {
108-
@Override
109-
public String run() {
110-
return System.getProperty("java.version");
111-
}
112-
});
113-
114-
String[] versionElements = version.split("\\D");
115-
116-
// Pre-JDK 9 java.version is 1.MAJOR.MINOR. Post-JDK 9 java.version is MAJOR.MINOR
117-
return Integer.valueOf(versionElements[Integer.valueOf(versionElements[0]) == 1 ? 1 : 0]);
118-
}
119-
12089
public static Collection<ServiceReference<InitialContextFactoryBuilder>> getInitialContextFactoryBuilderServices() {
12190
return instance.icfBuilders.getReferences();
12291
}
@@ -231,7 +200,7 @@ public void modifiedBundle(Bundle bundle, BundleEvent event, ServiceCache object
231200
} catch (IllegalStateException e) {
232201
// use reflection to force the builder to be used
233202
if (isPropertyEnabled(context, FORCE_BUILDER)) {
234-
originalOFBuilder = swapStaticField(objectFactoryBuilderHolder, ObjectFactoryBuilder.class, builder);
203+
swapObjectFactoryBuilderStaticField(builder);
235204
}
236205
}
237206
ofBuilder = builder;
@@ -266,7 +235,7 @@ public void stop(BundleContext context) {
266235
swapStaticField(NamingManager.class, InitialContextFactoryBuilder.class, originalICFBuilder);
267236
}
268237
if (ofBuilder != null) {
269-
swapStaticField(objectFactoryBuilderHolder, ObjectFactoryBuilder.class, originalOFBuilder);
238+
swapObjectFactoryBuilderStaticField(originalOFBuilder);
270239
}
271240

272241
icfBuilders.close();
@@ -277,6 +246,23 @@ public void stop(BundleContext context) {
277246
instance = null;
278247
}
279248

249+
private void swapObjectFactoryBuilderStaticField(ObjectFactoryBuilder value) {
250+
try {
251+
// Try in NamingManager first.
252+
swapStaticField(NamingManager.class, ObjectFactoryBuilder.class, value);
253+
} catch (IllegalStateException ise) {
254+
// The field may have been moved to NamingManagerHelper depending on the JDK version, so let's try there.
255+
try {
256+
Class<?> namingManagerHelperClass = Class.forName("com.sun.naming.internal.NamingManagerHelper");
257+
swapStaticField(namingManagerHelperClass, ObjectFactoryBuilder.class, value);
258+
} catch (ClassNotFoundException cnfe) {
259+
// The NamingManagerHelper class does not exist, so the IllegalStateException may have been
260+
// due to another reason, so let's throw the original exception.
261+
throw ise;
262+
}
263+
}
264+
}
265+
280266
private boolean isPropertyEnabled(BundleContext context, String key) {
281267
String value = context.getProperty(key);
282268
if ("false".equals(value))

0 commit comments

Comments
 (0)