19
19
package org .apache .aries .jndi .startup ;
20
20
21
21
import java .lang .reflect .Field ;
22
- import java .security .AccessController ;
23
- import java .security .PrivilegedAction ;
24
22
import java .util .ArrayList ;
25
23
import java .util .Arrays ;
26
24
import java .util .Collection ;
27
25
import java .util .Collections ;
28
26
import java .util .List ;
29
27
import java .util .Map ;
30
28
import java .util .concurrent .ConcurrentHashMap ;
31
- import java .util .function .Supplier ;
32
29
33
30
import javax .naming .NamingException ;
34
31
import javax .naming .spi .InitialContextFactory ;
@@ -89,34 +86,6 @@ public class Activator implements BundleActivator {
89
86
private ObjectFactoryBuilder originalOFBuilder ;
90
87
private OSGiObjectFactoryBuilder ofBuilder ;
91
88
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
-
120
89
public static Collection <ServiceReference <InitialContextFactoryBuilder >> getInitialContextFactoryBuilderServices () {
121
90
return instance .icfBuilders .getReferences ();
122
91
}
@@ -231,7 +200,7 @@ public void modifiedBundle(Bundle bundle, BundleEvent event, ServiceCache object
231
200
} catch (IllegalStateException e ) {
232
201
// use reflection to force the builder to be used
233
202
if (isPropertyEnabled (context , FORCE_BUILDER )) {
234
- originalOFBuilder = swapStaticField ( objectFactoryBuilderHolder , ObjectFactoryBuilder . class , builder );
203
+ swapObjectFactoryBuilderStaticField ( builder );
235
204
}
236
205
}
237
206
ofBuilder = builder ;
@@ -266,7 +235,7 @@ public void stop(BundleContext context) {
266
235
swapStaticField (NamingManager .class , InitialContextFactoryBuilder .class , originalICFBuilder );
267
236
}
268
237
if (ofBuilder != null ) {
269
- swapStaticField ( objectFactoryBuilderHolder , ObjectFactoryBuilder . class , originalOFBuilder );
238
+ swapObjectFactoryBuilderStaticField ( originalOFBuilder );
270
239
}
271
240
272
241
icfBuilders .close ();
@@ -277,6 +246,23 @@ public void stop(BundleContext context) {
277
246
instance = null ;
278
247
}
279
248
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
+
280
266
private boolean isPropertyEnabled (BundleContext context , String key ) {
281
267
String value = context .getProperty (key );
282
268
if ("false" .equals (value ))
0 commit comments