Skip to content

Commit af42bee

Browse files
committed
refactor(yoko-util,yoko-core): use MethodHandles for simple constructors
- Introduce InstanceFactory utility class with cached MethodHandle-based instantiation - Replace reflection-based Constructor.newInstance() calls with MethodHandles for better performance - Add CannotInstantiateException as unchecked wrapper for instantiation failures - Update YokoInputStream to use createNoArgsInstance for stub creation - Update PluginManager to use createNoArgsInstance for plugin initialization - Update ValueFactoryManager to use createNoArgsInstance and simplify error handling - Update ValueReader to use createNoArgsInstance for value and helper instantiation - Update ValueWriter to use createNoArgsInstance for helper instantiation - Update ORB_impl to use createNoArgsInstance for ORB initializer creation - Update iiop plugin to use createNoArgsInstance for connection helper creation - Update SecurityContext to use createNoArgsInstance for delegate creation - Refactor RepIds.toClass() to simplify control flow and reduce nesting - Substantive lines added: 149, lines removed: 84 Co-authored-by-AI: IBM Bob 1.0.4
1 parent eafbf32 commit af42bee

10 files changed

Lines changed: 150 additions & 85 deletions

File tree

yoko-core/src/main/java/org/apache/yoko/orb/CORBA/YokoInputStream.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
import static org.apache.yoko.orb.OB.TypeCodeFactory.createWStringTC;
7676
import static org.apache.yoko.orb.OCI.GiopVersion.GIOP1_0;
7777
import static org.apache.yoko.util.Assert.ensure;
78+
import static org.apache.yoko.util.InstanceFactory.createNoArgsInstance;
7879
import static org.apache.yoko.util.MinorCodes.MinorInvalidUnionDiscriminator;
7980
import static org.apache.yoko.util.MinorCodes.MinorLoadStub;
8081
import static org.apache.yoko.util.MinorCodes.MinorReadBooleanArrayOverflow;
@@ -111,7 +112,6 @@
111112
import static org.apache.yoko.util.MinorCodes.describeMarshal;
112113
import static org.apache.yoko.util.PrivilegedActions.getClassLoader;
113114
import static org.apache.yoko.util.PrivilegedActions.getMethod;
114-
import static org.apache.yoko.util.PrivilegedActions.getNoArgConstructor;
115115
import static org.omg.CORBA.CompletionStatus.COMPLETED_NO;
116116
import static org.omg.CORBA.TCKind._tk_Principal;
117117
import static org.omg.CORBA.TCKind._tk_TypeCode;
@@ -147,7 +147,6 @@
147147
import static org.omg.CORBA.TCKind._tk_wchar;
148148
import static org.omg.CORBA.TCKind._tk_wstring;
149149
import static org.omg.CORBA.TCKind.tk_union;
150-
import static org.omg.CORBA_2_4.TCKind._tk_local_interface;
151150

152151
final public class YokoInputStream extends InputStreamWithOffsets {
153152
private ORBInstance orbInstance;
@@ -1057,10 +1056,10 @@ private org.omg.CORBA.Object createStub(Class<?> stubClass, org.omg.CORBA.portab
10571056
@SuppressWarnings("unchecked")
10581057
Class<? extends ObjectImpl> clz = (Class<? extends ObjectImpl>) stubClass;
10591058
try {
1060-
org.omg.CORBA.portable.ObjectImpl stub = doPrivileged(getNoArgConstructor(clz)).newInstance();
1059+
ObjectImpl stub = createNoArgsInstance(clz);
10611060
stub._set_delegate(delegate);
10621061
return stub;
1063-
} catch (InvocationTargetException | InstantiationException | IllegalAccessException | PrivilegedActionException ex) {
1062+
} catch (RuntimeException ex) {
10641063
GIOP_IN_LOG.log(FINE, ex, () -> "Exception creating object stub");
10651064
throw newMarshalError(MinorLoadStub, ex);
10661065
}

yoko-core/src/main/java/org/apache/yoko/orb/OB/PluginManager.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@
3131
import static java.util.logging.Level.SEVERE;
3232
import static org.apache.yoko.logging.VerboseLogging.INIT_LOG;
3333
import static org.apache.yoko.osgi.ProviderLocator.loadClass;
34+
import static org.apache.yoko.util.InstanceFactory.createNoArgsInstance;
3435
import static org.apache.yoko.util.PrivilegedActions.GET_CONTEXT_CLASS_LOADER;
35-
import static org.apache.yoko.util.PrivilegedActions.getNoArgConstructor;
3636

3737
public final class PluginManager {
3838
private ORB orb;
@@ -55,7 +55,7 @@ private Plugin createPlugin(String name, StringSeqHolder args) {
5555
final String className = orb.properties().getProperty("yoko.oci.plugin." + name, "org.apache.yoko.orb.OCI." + name);
5656
try {
5757
Class<? extends PluginInit> c = loadClass(className, this.getClass(), doPrivileged(GET_CONTEXT_CLASS_LOADER));
58-
PluginInit pi = doPrivileged(getNoArgConstructor(c)).newInstance();
58+
PluginInit pi = createNoArgsInstance(c);
5959
pi.version(orb, Version.value);
6060
return pi.init(orb, args);
6161
} catch (SystemException ex) {

yoko-core/src/main/java/org/apache/yoko/orb/OB/ValueFactoryManager.java

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,16 @@
2727
import org.omg.CORBA.WStringValueHelper;
2828
import org.omg.CORBA.portable.ValueFactory;
2929

30-
import java.lang.reflect.InvocationTargetException;
31-
import java.security.PrivilegedActionException;
3230
import java.util.Hashtable;
3331
import java.util.logging.Logger;
3432

35-
import static java.security.AccessController.doPrivileged;
3633
import static java.util.logging.Logger.getLogger;
3734
import static org.apache.yoko.util.Assert.ensure;
35+
import static org.apache.yoko.util.InstanceFactory.createNoArgsInstance;
3836
import static org.apache.yoko.util.MinorCodes.MinorORBDestroyed;
3937
import static org.apache.yoko.util.MinorCodes.MinorValueFactoryError;
4038
import static org.apache.yoko.util.MinorCodes.describeBadParam;
4139
import static org.apache.yoko.util.MinorCodes.describeInitialize;
42-
import static org.apache.yoko.util.PrivilegedActions.getNoArgConstructor;
4340
import static org.omg.CORBA.CompletionStatus.COMPLETED_NO;
4441

4542
public final class ValueFactoryManager {
@@ -169,18 +166,14 @@ public ValueFactory lookupValueFactoryWithClass(String id) {
169166

170167
// Try to convert the repository ID into a class name.
171168
Class<? extends ValueFactory> c = RepIds.query(id).suffix("DefaultFactory").toClass();
172-
if (c != null) {
173-
try {
174-
logger.finer(() -> "Attempting to create value factory from class " + c.getName());
175-
// Instantiate the factory
176-
ValueFactory result = doPrivileged(getNoArgConstructor(c)).newInstance();
177-
178-
// Cache the result
179-
classFactories_.put(id, result);
180-
return result;
181-
} catch (ClassCastException | PrivilegedActionException | InvocationTargetException | InstantiationException | IllegalAccessException ignored) {
182-
}
169+
if (null == c) return null;
170+
try {
171+
logger.finer(() -> "Attempting to create value factory from class " + c.getName());
172+
ValueFactory result = createNoArgsInstance(c);
173+
classFactories_.put(id, result);
174+
return result;
175+
} catch (RuntimeException ignored) {
176+
return null;
183177
}
184-
return null;
185178
}
186179
}

yoko-core/src/main/java/org/apache/yoko/orb/OB/ValueReader.java

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,6 @@
4646
import javax.rmi.CORBA.ValueHandler;
4747
import java.io.Serializable;
4848
import java.lang.reflect.Array;
49-
import java.lang.reflect.InvocationTargetException;
50-
import java.security.PrivilegedActionException;
5149
import java.util.Hashtable;
5250
import java.util.Map;
5351
import java.util.Optional;
@@ -56,22 +54,22 @@
5654
import static java.lang.Integer.toHexString;
5755
import static java.lang.System.arraycopy;
5856
import static java.security.AccessController.doPrivileged;
59-
import static org.apache.yoko.util.Arrays.NO_STRINGS;
6057
import static java.util.logging.Level.FINE;
6158
import static java.util.logging.Level.FINER;
6259
import static javax.rmi.CORBA.Util.createValueHandler;
6360
import static org.apache.yoko.logging.VerboseLogging.MARSHAL_IN_LOG;
6461
import static org.apache.yoko.orb.CORBA.TypeCodeImpl._OB_getOrigType;
6562
import static org.apache.yoko.orb.OB.ValueReader.SettingsHolder.IGNORE_INVALID_VALUE_TAG;
63+
import static org.apache.yoko.util.Arrays.NO_STRINGS;
6664
import static org.apache.yoko.util.Assert.ensure;
6765
import static org.apache.yoko.util.Assert.fail;
6866
import static org.apache.yoko.util.Exceptions.as;
67+
import static org.apache.yoko.util.InstanceFactory.createNoArgsInstance;
6968
import static org.apache.yoko.util.MinorCodes.MinorNoValueFactory;
7069
import static org.apache.yoko.util.MinorCodes.MinorReadInvalidIndirection;
7170
import static org.apache.yoko.util.MinorCodes.describeMarshal;
7271
import static org.apache.yoko.util.PrivilegedActions.GET_CONTEXT_CLASS_LOADER;
7372
import static org.apache.yoko.util.PrivilegedActions.action;
74-
import static org.apache.yoko.util.PrivilegedActions.getNoArgConstructor;
7573
import static org.omg.CORBA.CompletionStatus.COMPLETED_NO;
7674
import static org.omg.CORBA.TCKind.tk_abstract_interface;
7775
import static org.omg.CORBA.TCKind.tk_value;
@@ -229,7 +227,7 @@ Serializable create(Header h) {
229227
MARSHAL_IN_LOG.info(() -> "Attempting to read a value with type '" + h.ids[0] + "' into a field of type '" + clz_ + "'");
230228

231229
try {
232-
result = doPrivileged(getNoArgConstructor(clz_)).newInstance();
230+
result = createNoArgsInstance(clz_);
233231
reader_.addInstance(h.headerPos, result);
234232
try {
235233
reader_.unmarshalValueState(result);
@@ -238,8 +236,7 @@ Serializable create(Header h) {
238236
throw ex;
239237
}
240238
return result;
241-
} catch (ClassCastException | PrivilegedActionException | InvocationTargetException |
242-
InstantiationException | IllegalAccessException e) {
239+
} catch (RuntimeException e) {
243240
throw as(MARSHAL::new, e, describeMarshal(MinorNoValueFactory) + ": " + clz_.getName(), MinorNoValueFactory, COMPLETED_NO);
244241
}
245242
}
@@ -309,15 +306,12 @@ private BoxedValueHelper getBoxedHelper(String id) {
309306
if (WStringValueHelper.id().equals(id)) return new WStringValueHelper();
310307

311308
final Class<? extends BoxedValueHelper> helperClass = RepIds.query(id).suffix("Helper").toClass();
312-
313309
try {
314-
if (helperClass != null) return doPrivileged(getNoArgConstructor(helperClass)).newInstance();
315-
} catch (ClassCastException | PrivilegedActionException | InvocationTargetException | InstantiationException | IllegalAccessException ex) {
310+
return createNoArgsInstance(helperClass);
311+
} catch (RuntimeException ex) {
316312
String msg = describeMarshal(MinorNoValueFactory) + ": invalid BoxedValueHelper for " + id;
317313
throw as(MARSHAL::new, ex, msg, MinorNoValueFactory, COMPLETED_NO);
318314
}
319-
320-
return null;
321315
}
322316

323317
Serializable create(Header h) {

yoko-core/src/main/java/org/apache/yoko/orb/OB/ValueWriter.java

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.apache.yoko.orb.CORBA.YokoOutputStream;
2323
import org.apache.yoko.osgi.ProviderLocator;
2424
import org.apache.yoko.util.Assert;
25+
import org.apache.yoko.util.InstanceFactory.CannotInstantiateException;
2526
import org.apache.yoko.util.cmsf.RepIds;
2627
import org.omg.CORBA.CustomMarshal;
2728
import org.omg.CORBA.MARSHAL;
@@ -36,21 +37,19 @@
3637

3738
import javax.rmi.CORBA.ValueHandler;
3839
import java.io.Serializable;
39-
import java.lang.reflect.InvocationTargetException;
40-
import java.security.PrivilegedActionException;
4140
import java.util.Arrays;
4241
import java.util.Hashtable;
4342
import java.util.IdentityHashMap;
4443

4544
import static java.security.AccessController.doPrivileged;
4645
import static javax.rmi.CORBA.Util.createValueHandler;
4746
import static javax.rmi.CORBA.Util.getCodebase;
48-
import static org.apache.yoko.util.Arrays.NO_STRINGS;
4947
import static org.apache.yoko.orb.CORBA.TypeCodeImpl._OB_getOrigType;
48+
import static org.apache.yoko.util.Arrays.NO_STRINGS;
49+
import static org.apache.yoko.util.InstanceFactory.createNoArgsInstance;
5050
import static org.apache.yoko.util.MinorCodes.MinorNoValueFactory;
5151
import static org.apache.yoko.util.MinorCodes.describeMarshal;
5252
import static org.apache.yoko.util.PrivilegedActions.GET_CONTEXT_CLASS_LOADER;
53-
import static org.apache.yoko.util.PrivilegedActions.getNoArgConstructor;
5453
import static org.omg.CORBA.CompletionStatus.COMPLETED_NO;
5554
import static org.omg.CORBA.TCKind._tk_string;
5655

@@ -208,14 +207,11 @@ private BoxedValueHelper getHelper(Serializable value, TypeCode type) {
208207
//
209208
// Instantiate the Helper
210209
//
211-
if (helperClass != null) {
212-
try {
213-
return doPrivileged(getNoArgConstructor(helperClass)).newInstance();
214-
} catch (PrivilegedActionException | InvocationTargetException | InstantiationException | IllegalAccessException ignored) {
215-
}
210+
try {
211+
return createNoArgsInstance(helperClass);
212+
} catch (CannotInstantiateException ignored) {
213+
return null;
216214
}
217-
218-
return null;
219215
}
220216

221217
private BoxedValueHelper fastPathStringBoxHelper(TypeCode type) {

yoko-core/src/main/java/org/apache/yoko/orb/OBCORBA/ORB_impl.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626
import org.apache.yoko.orb.CORBA.ORBPolicyFactory_impl;
2727
import org.apache.yoko.orb.CORBA.ORBPolicyManager_impl;
2828
import org.apache.yoko.orb.CORBA.ORBSingleton;
29-
import org.apache.yoko.orb.CORBA.YokoOutputStream;
3029
import org.apache.yoko.orb.CORBA.PolicyMap;
30+
import org.apache.yoko.orb.CORBA.YokoOutputStream;
3131
import org.apache.yoko.orb.DynamicAny.DynAnyFactory_impl;
3232
import org.apache.yoko.orb.IOP.CodecFactory_impl;
3333
import org.apache.yoko.orb.Messaging.RebindPolicy_impl;
@@ -188,10 +188,8 @@
188188
import java.io.FileInputStream;
189189
import java.io.IOException;
190190
import java.io.InputStream;
191-
import java.lang.reflect.InvocationTargetException;
192191
import java.net.MalformedURLException;
193192
import java.net.URL;
194-
import java.security.PrivilegedActionException;
195193
import java.util.ArrayList;
196194
import java.util.Hashtable;
197195
import java.util.List;
@@ -202,16 +200,16 @@
202200
import static java.security.AccessController.doPrivileged;
203201
import static java.util.logging.Level.SEVERE;
204202
import static java.util.logging.Level.WARNING;
205-
import static org.apache.yoko.util.Arrays.EMPTY_INTS;
206-
import static org.apache.yoko.util.Arrays.emptyArray;
207-
import static org.apache.yoko.util.Arrays.NO_STRINGS;
208203
import static org.apache.yoko.logging.VerboseLogging.INIT_LOG;
209204
import static org.apache.yoko.logging.VerboseLogging.SHUTDOWN_LOG;
210205
import static org.apache.yoko.orb.OB.CodeSetInfo.UTF_16;
211206
import static org.apache.yoko.orb.OB.CodeSetInfo.UTF_8;
207+
import static org.apache.yoko.util.Arrays.EMPTY_INTS;
208+
import static org.apache.yoko.util.Arrays.NO_STRINGS;
209+
import static org.apache.yoko.util.Arrays.emptyArray;
210+
import static org.apache.yoko.util.InstanceFactory.createNoArgsInstance;
212211
import static org.apache.yoko.util.PrivilegedActions.GET_CONTEXT_CLASS_LOADER;
213212
import static org.apache.yoko.util.PrivilegedActions.GET_SYSPROPS_OR_EMPTY_MAP;
214-
import static org.apache.yoko.util.PrivilegedActions.getNoArgConstructor;
215213

216214
// This class must be public and not final
217215
public class ORB_impl extends ORBSingleton {
@@ -790,12 +788,12 @@ private void instantiateORBInitializers(Properties properties) {
790788
// get the appropriate class for the loading.
791789
ClassLoader loader = doPrivileged(GET_CONTEXT_CLASS_LOADER);
792790
final Class<? extends ORBInitializer> initClass = ProviderLocator.loadClass(className, getClass(), loader);
793-
initializers.put(className, doPrivileged(getNoArgConstructor(initClass)).newInstance());
791+
initializers.put(className, createNoArgsInstance(initClass));
794792
}
795793
// Exceptions have to be ignored here
796794
catch (ClassNotFoundException e) {
797795
INIT_LOG.log(WARNING, e, () -> "ORB.init: initializer class " + className + " not found");
798-
} catch (PrivilegedActionException | InvocationTargetException | InstantiationException | IllegalAccessException e) {
796+
} catch (RuntimeException e) {
799797
INIT_LOG.log(WARNING, e, () -> "ORB.init: error occurred while instantiating initializer class " + className);
800798
}
801799
}

yoko-core/src/main/java/org/apache/yoko/orb/OCI/iiop.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@
3636
import java.util.stream.Stream;
3737

3838
import static java.security.AccessController.doPrivileged;
39+
import static org.apache.yoko.util.InstanceFactory.createNoArgsInstance;
3940
import static org.apache.yoko.util.PrivilegedActions.GET_CONTEXT_CLASS_LOADER;
40-
import static org.apache.yoko.util.PrivilegedActions.getNoArgConstructor;
4141

4242
public class iiop implements PluginInit {
4343
static final Logger logger = Logger.getLogger(iiop.class.getName());
@@ -67,9 +67,8 @@ public Plugin init(ORB orb, StringSeqHolder args) {
6767

6868
try {
6969
// get the appropriate class for the loading.
70-
Class<?> c = ProviderLocator.loadClass(connectionHelper, getClass(), doPrivileged(GET_CONTEXT_CLASS_LOADER));
71-
UnifiedConnectionHelper connectionHelper = ((UnifiedConnectionHelperProvider)doPrivileged(getNoArgConstructor(c)).newInstance())
72-
.getUnifiedConnectionHelper();
70+
Class<? extends UnifiedConnectionHelperProvider> c = ProviderLocator.loadClass(connectionHelper, getClass(), doPrivileged(GET_CONTEXT_CLASS_LOADER));
71+
UnifiedConnectionHelper connectionHelper = createNoArgsInstance(c).getUnifiedConnectionHelper();
7372
connectionHelper.init(orb, helperArgs);
7473
return new Plugin_impl(orb, connectionHelper);
7574
} catch (AssertionFailed|INITIALIZE e) {

yoko-core/src/main/java/org/apache/yoko/orb/csi/SecurityContext.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2022 IBM Corporation and others.
2+
* Copyright 2026 IBM Corporation and others.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -23,8 +23,8 @@
2323
import javax.security.auth.login.LoginException;
2424

2525
import static java.security.AccessController.doPrivileged;
26+
import static org.apache.yoko.util.InstanceFactory.createNoArgsInstance;
2627
import static org.apache.yoko.util.PrivilegedActions.GET_CONTEXT_CLASS_LOADER;
27-
import static org.apache.yoko.util.PrivilegedActions.getNoArgConstructor;
2828
import static org.apache.yoko.util.PrivilegedActions.getSysProp;
2929

3030
public abstract class SecurityContext {
@@ -49,7 +49,7 @@ private static SecurityContextDelegate allocateDelegate() {
4949

5050
try {
5151
Class<? extends SecurityContextDelegate> c = ProviderLocator.loadClass(className, SecurityContext.class, doPrivileged(GET_CONTEXT_CLASS_LOADER));
52-
return doPrivileged(getNoArgConstructor(c)).newInstance();
52+
return createNoArgsInstance(c);
5353
} catch (Exception e) {
5454
throw new InternalError("unable to attach to SecurityContext", e);
5555
}

0 commit comments

Comments
 (0)