Skip to content

refactor(rmi): remove ClientUtil and simplify stub creation - #824

Open
joe-chacko wants to merge 198 commits into
OpenLiberty:mainfrom
joe-chacko:refactor/remove-client-util
Open

refactor(rmi): remove ClientUtil and simplify stub creation#824
joe-chacko wants to merge 198 commits into
OpenLiberty:mainfrom
joe-chacko:refactor/remove-client-util

Conversation

@joe-chacko

Copy link
Copy Markdown
Member

Remove the ClientUtil utility class that was used to check if running
as a client container. This check is no longer needed, so the stub
creation logic in PortableRemoteObjectImpl has been simplified to
directly call state.createRMIStub(type).

Changes:

  • Removed ClientUtil.java
  • Removed ClientUtil import from PortableRemoteObjectImpl
  • Simplified createStub() method to remove Optional filter chain

Co-authored-by-AI: IBM Bob 2.0.0

joe-chacko and others added 30 commits April 25, 2026 21:33
- Created AGENTS.md with comprehensive guidelines for AI agents
  - Documented YASF and ROFL mechanisms
  - Documented yoko.verbose logging system
  - References source code as source of truth
- Created CONTRIBUTING.md for Yoko (based on Open Liberty structure)
  - Open Liberty CLA requirements
  - Java 8 compatibility for production code
  - Checkstyle and testing requirements
  - Note that reviewers may modify PRs
- Added GENAI_GUIDELINES.md linking to Open Liberty GenAI guidelines

Co-authored-by-AI: IBM Bob 1.0.1
Removed requirement for AI-generated content commit messages.
…ibutions

docs: add AI agent guidelines and contribution docs
Refactor the test framework to remove the unused Summoner abstraction and
consolidate steward and PartRunner lookup around direct helper methods.

Framework changes:
- remove Summoner and SummonerImpl as unnecessary indirection
- replace PartRunnerSteward with PartRunners utility methods
- simplify ConfigurePartRunner plus logging, ORB, and server extension wiring
- tighten ORB and server steward lifecycle and state handling
- adjust ORBInitInfo_impl interactions required by the updated test flow

Test fixes:
- update testify-iiop and yoko-verify tests to match the new runner/steward model
- fix timeout-sensitive and interceptor-related failures caused by context scoping
- align PartRunner usage across codeset, value, POA, RMI, OCI, and interceptor tests

Diffstat:
- 28 files changed
- 605 insertions(+)
- 626 deletions(-)

Co-authored-by-AI: IBM Bob 1.0.1
- Use @RemoteImpl with lambda implementation for Thrower interface
- Move interceptors to static nested classes with @UseWithOrb annotations
- Simplify exception handling (create exceptions inline)
- Remove manual ORB/POA setup and IOR handling
- Enable automatic stub injection via test method parameters
- Remove obsolete artifact files (now defined inline in test)
- All tests passing (2 tests, 2 successes)

11 files changed, 51 insertions(+), 676 deletions(-)

Co-authored-by-AI: IBM Bob 1.0.1
…ption-handling-test-to-testify

test: port RMIExceptionHandlingTest to testify
test: simplify steward lookup and fix runner-scoped test failures
Add a new Gradle task that creates symbolic links to jar files in the libs directory for easier access to built artifacts. The task:
- Creates symlinks for core Yoko modules (yoko-core, yoko-spec-corba, yoko-rmi-impl, yoko-rmi-spec, yoko-util, yoko-osgi)
- Automatically cleans existing symlinks before creating new ones
- Uses relative paths for portability
- Depends on jar tasks to ensure artifacts are built first
Add validation to ensure .sdkmanrc and gradle-wrapper.properties maintain matching Gradle versions:
- Add pre-commit hook to check version consistency
- Add build-time validation that fails on version mismatch
- Provide clear error messages when versions don't match

Co-authored-by: IBM Bob 1.0.1
- Renamed task from createLibsSymlinks to createBuildLibSymlinks
- Changed symlink directory from libs/ to build/lib/
- Applied base plugin to enable root-level clean task
- Registered build/lib as task output for proper cleanup
- Added external dependencies (org.osgi.core, bcel, commons-lang3)
- Dependencies copied to build/lib/deps/ with version-free symlinks in build/lib/

The symlinks are now properly managed as build outputs and are
automatically cleaned up by gradle clean. All Yoko JARs and their
runtime dependencies are available in build/lib/ with simple names.

Co-authored-by-AI: IBM Bob 1.0.1
…dle-version-consistency

build: add Gradle version consistency validation
…task

build: add createLibsSymlinks task for jar file management
…on-free symlinks

- Create build/lib/deps/ directory for external dependency JARs
- Copy yoko-core runtime classpath dependencies to deps/
- Generate version-free symlinks in lib/ pointing to deps/
- Enhanced cleanup to remove both symlinks and regular JAR files
- Maintains existing project JAR symlink functionality

Co-authored-by-AI: IBM Bob 1.0.1
…links-task

build: organize external dependencies in deps subdirectory with version-free symlinks
Reverse engineered and modernized legacy multi-process IIOP plugin test
to use modern testify framework with annotation-based configuration.

Changes:
- Replaced 9 separate legacy test files with single testify test class
- Converted Client/Server main classes to @test and @BeforeServer methods
- Implemented plugins as @UseWithOrb annotated inner classes
- Replaced verbose POA policy setup with PolicyValue utilities
- Updated CodecObjectReferenceTest to not depend on deleted TestORBInitializer
- Removed legacy multi-process orchestration infrastructure

Benefits:
- Single JVM execution for easier debugging
- Declarative configuration via annotations
- Cleaner, more maintainable code structure
- Reduced complexity with inline components

Test Coverage:
- Plugin lifecycle (construction, initialization)
- Socket creation interception
- Codec encoding of object references
- Object marshaling via Any parameters
- Local vs remote object handling
- Transport validation via interceptors

Code Reduction:
- Deleted: 862 lines across 9 legacy files
- Added: 461 lines in modernized testify implementation
- Net reduction: 401 lines (46.5% reduction)

Files Changed:
- Added: IiopPluginTest.java (new testify-based implementation)
- Modified: CodecObjectReferenceTest.java (removed TestORBInitializer dependency)
- Deleted: IIOPPluginTest.java, Client.java, Server.java, ClientPlugin.java,
  ServerPlugin.java, Test_impl.java, ServiceContextInterceptor.java,
  TestORBInitializer.java, runtest script

Retained:
- All generated IDL files (Test.idl and generated classes)
- LocalTest_impl.java (still used by testify test)

Co-authored-by: IBM Bob 1.0.1
Add LazyInitializedField<T> class that provides lock-free lazy initialization
using atomic function pointer swapping pattern.

Features:
- Thread-safe initialization with exactly-once guarantee
- Lock-free implementation using AtomicReference and CAS operations
- Automatic retry on initialization failure
- Per-waiter CountDownLatch for proper thread coordination
- Closure-based value caching (no separate value field)
- Supplier-based logging for performance

Implementation uses three-state pattern:
1. Initialization function (initial state)
2. Waiter function with latch (during initialization)
3. Getter function with cached value (after initialization)

Includes comprehensive test suite with 18 tests covering:
- Basic initialization and caching
- Concurrent access (10 threads)
- High contention scenarios (50 threads)
- Exception handling and retry
- Null value support
- Complex object handling

Co-authored-by-AI: IBM Bob 1.0.3
… maintainability

- Add null check for initializer parameter using requireNonNull with static import
  to fail fast with clear error message instead of confusing NPE during initialization
- Change exception handling from catching Exception to Throwable to properly
  handle all error conditions including JVM errors
- Extract all magic numbers in tests to named constants for better readability
  and maintainability:
  * INITIALIZATION_DELAY_MS = 50
  * EXPENSIVE_INITIALIZATION_DELAY_MS = 10
  * CONCURRENT_THREAD_COUNT = 10
  * HIGH_CONTENTION_THREAD_COUNT = 50
  * TEST_TIMEOUT_SECONDS = 10
  * EXECUTOR_SHUTDOWN_TIMEOUT_SECONDS = 5
  * SEQUENTIAL_ACCESS_COUNT = 100

These changes improve code quality without altering functionality.

Co-authored-by-AI: IBM Bob 1.0.1
feat(yoko-util): add thread-safe lazy initialization utility
…ation

Add early check in initializationFunction() to detect if initialization
is already in progress before allocating a Waiter object. This reduces
memory allocation overhead in high-contention scenarios.

The check verifies functionPointer is still set to initializationFunctionRef
before creating the Waiter, avoiding unnecessary object allocation when
another thread has already started initialization.

Co-authored-by-AI: IBM Bob 1.0.3
Add boolean allowRetry parameter to LazyInitializedField constructor to
control retry behavior on initialization failure. When false (default),
failed initialization sets a permanent error state that throws the
original exception on subsequent access attempts. When true, allows
retry by resetting to initialization state.

Exception handling distinguishes between Error and Exception types,
wrapping them appropriately in the permanent error getter.

Use custom InitializationException that creates new instances on
each call.
This ensures accurate stack traces for all threads accessing a
failed lazy initialization, not just the first thread.

When allowRetry is false, each get() call now creates a fresh
InitializationException wrapping the original cause, providing
proper call site information for debugging.

Rename LazyInitializedField.isInitialized() to isCompleted() to better
reflect that the method returns true for both successful initialization
and permanent error states (when allowRetry=false).

Update documentation to clarify isCompleted() returns true when initialization
has completed (success or permanent error) and false when not yet attempted
or when retry is allowed after failure.

Co-authored-by-AI: IBM Bob 1.0.3
Replace generic RuntimeException with InitializationInterruptedException
when a thread is interrupted while waiting for lazy initialization.
Update LazyInitializedField.get() documentation to reflect this change.

Co-authored-by-AI: IBM Bob 1.0.3
Rename class and test file to better reflect the purpose as a lazy
reference holder rather than just an initialized field. This naming
is more concise and aligns with common patterns in concurrent utilities.

All references updated:
- LazyInitializedField -> LazyReference
- LazyInitializedFieldTest -> LazyReferenceTest
- All test assertions and exception references updated

Rename all test variables from field/field1/field2 to ref/ref1/ref2 to
align with the LazyReference class name. Update assertion messages to
use 'reference' terminology instead of 'field'.

Update class and constructor javadoc to consistently use 'reference'
terminology instead of 'field' to align with the class name.

Co-authored-by-AI: IBM Bob 1.0.3
- Clarify error message to indicate failure occurred elsewhere
- Improve javadoc grammar: 'if' -> 'whether'

Co-authored-by-AI: IBM Bob 1.0.3
Tests should verify exception types and causes, not specific message text.
This makes tests more resilient to message wording changes.

Co-authored-by-AI: IBM Bob 1.0.3
Prevent deadlock when initializer recursively calls get() on the same
LazyReference instance. The Waiter now tracks the initializing thread
and throws RecursiveInitializationException (extends IllegalStateException)
if that thread attempts to wait on itself. The exception is wrapped in
IllegalStateException to preserve call stacks for all threads.

- Add RecursiveInitializationException extending IllegalStateException
- Store initializing thread in Waiter constructor
- Detect recursive call in Waiter.get() and throw exception
- Wrap RecursiveInitializationException in IllegalStateException
- Update javadoc for get() method to document recursive detection
- Add test case verifying exception chain and messages
- All 21 tests pass successfully

Co-authored-by-AI: IBM Bob 1.0.3
…hods

Add Private.invoke() utility method to testify framework for type-safe
reflection-based access to package-private methods in tests. This eliminates
the need for external dependencies like Apache Commons Lang and provides
cleaner syntax with generic return types and automatic primitive/wrapper
type conversions.

Co-authored-by-AI: IBM Bob 1.0.1
…ty#783

Added parameterized tests to reproduce and verify ThreadLocal pollution
issues when interceptors fail to complete their lifecycle.

Changes:
- Added getStackDepth() methods to CmsfThreadLocal, RoflThreadLocal, and YasfThreadLocal for testing
- Created ThreadLocalPollutionTest with 4 test scenario subclasses:
  * ThreadLocalPollutionTestWithSimpleEcho (interceptor exceptions)
  * ThreadLocalPollutionTestWithUncheckedException (service exceptions)
  * ThreadLocalPollutionTestWithRequestTimeout (timeout handling)
  * ThreadLocalPollutionTestWithShutdown (ORB shutdown during call)

Test Coverage:
- Parameterized tests run against all interception points (send_poll, send_request, receive_reply, receive_exception, receive_other)
- Tests verify ThreadLocal stack depth remains 0 after exceptions
- Each test scenario validates different failure conditions
- AfterEach hook ensures no ThreadLocal pollution between tests

The tests demonstrate that ThreadLocal cleanup works correctly in most
scenarios but can fail when interceptors throw unexpected exceptions or
when the ORB shuts down during in-flight requests.

Related: OpenLiberty#783

Co-authored-by: IBM Bob 1.0.1
…rceptors

Added proper exception handling for unexpected exceptions thrown by client
request interceptors during send_request() and receive_reply() phases.

Changes:
- Wrap unexpected exceptions in UnknownException with appropriate completion status
- Add suppressed exception tracking when multiple exceptions occur
- Set UnknownException cause chain for better diagnostics
- Handle exceptions in both send_request() and receive_reply() interceptor phases

Exception Handling:
- send_request() phase: wrap in UnknownException with COMPLETED_NO
- receive_reply() phase: wrap in UnknownException with COMPLETED_YES
- When receivedException already exists, add new exception as suppressed
- Preserve original exception information through cause chain

This ensures interceptor exceptions don't propagate uncaught and maintains
proper CORBA exception semantics while preserving diagnostic information.

Related: OpenLiberty#783
ngmr and others added 24 commits June 19, 2026 13:52
…ndle

- Added MethodHandle support to MethodDescriptor with lazy initialization
- Implemented genMethodHandle() using privileged blocks for setAccessible()
- Changed RMIServant.invoke_method() to use MethodHandle.bindTo().invokeWithArguments()
- Removed debug_name() helper, updated logging to use MethodDescriptor.toString()
- Changed getReflectedMethod() visibility from public to package-private for security
- Updated RMIStubHandler to pass MethodDescriptor instead of Method
- Substantive lines added: 50, lines removed: 25

This targets the hottest path in RMI invocations, providing expected 2-5x
performance improvement for remote method calls.

Co-authored-by-AI: IBM Bob 1.0.4
- Added MethodHandle support for writeReplace, readResolve, and readObject methods
- Implemented genReadObjectHandle() to create MethodHandle for readObject
- Updated genWriteReplacer() to use MethodHandle instead of Method.invoke()
- Updated genReadResolver() to use MethodHandle instead of Method.invoke()
- Converted readObject invocations in buildReader() and buildCustomMarshalReaderWithReadObject()
- Simplified exception handling for MethodHandle (throws Throwable directly)
- Substantive lines added: 51, lines removed: 31

This improves performance for custom serialization during RMI-IIOP value marshaling.

Co-authored-by-AI: IBM Bob 1.0.4
- Added MethodHandle support for writeObject method in ValueDescriptor
- Implemented genWriteObjectHandle() and getWriteObjectHandle() accessor
- Updated ObjectWriter.invokeWriteObject() to accept MethodHandle instead of Method
- Simplified exception handling in invokeWriteObject() for MethodHandle
- Updated buildCustomWriter() to pass MethodHandle via getWriteObjectHandle()
- Substantive lines added: 24, lines removed: 14

This completes the custom serialization MethodHandle conversion, improving
performance for writeObject during RMI-IIOP value marshaling.

Co-authored-by-AI: IBM Bob 1.0.4
…t and user exceptions

- Added testExceptionInReceiveRequest() to verify exception handling when SI2 throws NO_PERMISSION in receive_request() interception point
- Added testTargetObjectThrowsUserException() to verify proper handling of user exceptions thrown by target objects
- Created TestUserException class and ExceptionThrower RMI interface to support user exception testing
- Added shouldThrowUserException flag and convertStringWithException() method for controlled exception testing
- Enhanced test setup with ArgumentCaptor for detailed ServerRequestInfo verification
- Verified CORBA 3.0.3 spec compliance for exception completion status (COMPLETED_NO vs COMPLETED_YES)
- Verified correct interceptor flow stack unwinding and send_exception() reverse order execution
- Added imports for ArgumentCaptor, Any, UNKNOWN, UnknownException, and UNKNOWNHelper
- Lines added: 175, lines removed: 2

Co-authored-by-AI: IBM Bob 1.0.4
- Moved privileged setAccessible calls into gen*Handle methods
- Removed unused writeObjectMethodRef and readObjectMethodRef lazy references
- Removed genWriteObjectMethod() and genReadObjectMethod() methods
- Made genWriteObjectHandle() and genReadObjectHandle() package-private for subclass overrides
- Updated logic to check MethodHandle null-ness via getOptional*Handle() accessors
- Added customMarshalledRef and chunkedRef as lazy references
- Updated UncustomizableValueDescriptor and FVDUncustomizableValueDescriptor to override gen*Handle
- Substantive lines added: 75, lines removed: 68

This refactoring consolidates the MethodHandle generation logic, eliminating redundant
Method-based lazy references and ensuring all access control is handled within the
MethodHandle generators.

Co-authored-by-AI: IBM Bob 1.0.4
Convert Method.invoke() calls to MethodHandle.invoke() in IDLEntityDescriptor
for better performance when calling IDL Helper methods (read, write, type).

Changes:
- Renamed findMethod() to findMethodHandle() to return MethodHandle directly
- Updated genReader() to use MethodHandle for Helper.read()
- Updated genWriter() to use MethodHandle for Helper.write()
- Updated genTypeCode() to use MethodHandle for Helper.type()
- Simplified exception handling with consistent pattern

Co-authored-by-AI: IBM Bob 1.0.4 (Claude 3.5 Sonnet)
- Add testExceptionInSendException() verifying exception replacement when SI2 throws different exception in send_exception()
- Add testTargetObjectThrowsSystemException() verifying system exception handling with COMPLETED_YES status and minor code preservation
- Add testExceptionInSendReply() verifying exception thrown in send_reply() triggers send_exception() on remaining Flow Stack
- Add support for system exception testing with TARGET_SYSTEM_EXCEPTION_MINOR constant and shouldThrowSystemException flag
- Consolidate CORBA imports using wildcard for cleaner code
- Lines added: 245, lines removed: 4

Co-authored-by-AI: IBM Bob 1.0.4
Convert the remaining reflective defineClass invocation in
org.apache.yoko.rmi.util.stub.Util from Method.invoke() to
MethodHandle.invoke().

Changes:
- store ClassLoader.defineClass as a MethodHandle
- use PrivilegedActions.makeAccessible() before unreflect()
- simplify invoke() exception handling for MethodHandle semantics

Co-authored-by-AI: IBM Bob 1.0.4
…Accessible

- Simplified ClassBaseDescriptor.findField() to use getDeclaredField() and makeAccessible()
- Simplified MethodDescriptor.genMethodHandle() to use getDeclaredMethod() and makeAccessible()
- Simplified FieldDescriptor field copy creation to use getDeclaredField() and makeAccessible()
- Removed manual setAccessible(true) calls in favor of PrivilegedActions.makeAccessible()
- Lines added: 21, lines removed: 23

Co-authored-by-AI: IBM Bob 1.0.4
- Removed doPrivileged(exAction(...)) wrapper from CorbaObjectWriter instantiation in writeValue()
- Removed doPrivileged(exAction(...)) wrapper from CorbaObjectReader instantiation in makeCorbaObjectReader()
- Removed associated PrivilegedActionException catch blocks
- Both constructors only perform simple field assignments without security-sensitive operations
- Lines added: 2, lines removed: 7

Co-authored-by-AI: IBM Bob 1.0.4
Convert Method.invoke() to MethodHandle.invoke() for IDL Helper narrow()
calls in PortableRemoteObjectImpl with ClassValue-based caching.

Changes:
- Added HELPER_NARROW_CACHE using ClassValue<MethodHandle>, mapping from
  helper class to its "narrow" method
- Updated narrowIDL() to use cached MethodHandle instead of Method.invoke()
- Simplified exception handling with consistent pattern
- Updated MultiAddressUrlTest to remove InvocationTargetException from expected causal chains, as MethodHandle.invoke() does not add this wrapper layer (unlike the old Method.invoke() approach)
- Fixed exception handling in StubWriteReplaceMethodHolder to properly unwrap PrivilegedActionException
- Lines added: 29, lines removed: 13

Performance: ClassValue provides thread-safe per-class caching without locks

Co-authored-by: Joe Chacko <chackoj@uk.ibm.com>
Co-authored-by-AI: IBM Bob 1.0.4
chore: add .bobignore to unignore .bob directory
- Updated gradle.yml workflow to use ubuntu-latest runner
- Updated publish.yml workflow to use ubuntu-latest runner
- Updated check-commit-message.yml workflow to use ubuntu-latest runner
- Updated copyright year in check-commit-message.yml to 2026
- Lines added: 4, lines removed: 4

Co-authored-by-AI: IBM Bob 1.0.3
ci(github): replace self-hosted runners with ubuntu-latest
- Replaced stub_map with ClassValue<Constructor<? extends Stub>> in RMIState
- Replaced static_stub_map with ClassValue<Optional<Constructor<? extends Stub>>>
- Moved stub constructor computation logic from PortableRemoteObjectImpl to RMIState.computeRMIStubConstructor()
- Simplified PortableRemoteObjectImpl.getRMIStubClassConstructor() to delegate to ClassValue
- Refactored stub class creation to use Optional for cleaner null handling
- Removed NoDeleteSynchronizedMap.java (no longer needed)
- Removed unused codebase parameter from getStaticStub() and related methods

Benefits:
- Thread-safe caching without explicit synchronization via ClassValue
- Better performance through ClassValue's optimized per-class caching
- Cleaner separation of concerns with stub construction centralized in RMIState
- More idiomatic code using Optional for null handling

- Lines added: 81, lines removed: 190

Co-authored-by-AI: IBM Bob 1.0.4
- Converted MethodRef from mutable to immutable class
- Replaced direct field access with lazy-initialized references using LazyReference
- Changed getParameterTypes() and getExceptionTypes() to return unmodifiable Lists instead of arrays
- Updated BCELClassBuilder to work with List-based API instead of array-based API
- Removed unused import of java.util.logging.Level
- Fixed escaped quote in license header
- Substantive lines added: 45, lines removed: 89

Co-authored-by-AI: IBM Bob 1.0.4
…reation

- Replaced reflection-based Constructor.newInstance() with MethodHandle.invoke()
- Introduced Supplier<Stub> pattern throughout RMIState for lazy stub instantiation
- Deduplicated genStubSupplier() methods by creating overloaded version taking Constructor
- Added NULL_STUB_SUPPLIER constant to replace repeated () -> null lambdas
- Simplified stub creation logic in PortableRemoteObjectImpl using Optional
- Renamed tie_map to tieMap for consistency
- Substantive lines added: 82, lines removed: 108

Co-authored-by-AI: IBM Bob 1.0.4
…ntiation

- Introduced NULL_SERIALIZABLE_SUPPLIER constant to eliminate duplicate lambda expressions
- Made genBlankInstanceSupplier() package-private to allow subclass overrides
- Made createBlankInstance() private to enforce proper encapsulation
- Refactored Externalizable instantiation to use MethodHandles for better performance
- Kept Constructor.newInstance() for Serializable types (required by ReflectionFactory)
- Updated FVDUncustomizableValueDescriptor to override genBlankInstanceSupplier()
- Updated UncustomizableValueDescriptor to override genBlankInstanceSupplier()
- Added explanatory comments for why Serializable types cannot use MethodHandles
- Simplified exception handling in MethodHandle supplier using multi-catch
- Lines added: 60, lines removed: 58

Co-authored-by-AI: IBM Bob 1.0.4
- 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
- remove redundant Mockito `never()` verifications from `ServerExceptionFlowTest`
- rely on `InOrder.verifyNoMoreInteractions()` to assert no unexpected interceptor calls remain
- simplify the exception-flow tests without changing their asserted execution order or outcomes
- substantive lines added: 0, lines removed: 43

Co-authored-by-AI: IBM Bob 1.0.3
…les-for-simple-constructors

refactor/use method handles for simple constructors
Remove the ClientUtil utility class that was used to check if running
as a client container. This check is no longer needed, so the stub
creation logic in PortableRemoteObjectImpl has been simplified to
directly call state.createRMIStub(type).

Changes:
- Removed ClientUtil.java
- Removed ClientUtil import from PortableRemoteObjectImpl
- Simplified createStub() method to remove Optional filter chain

Co-authored-by-AI: IBM Bob 2.0.0
@joe-chacko joe-chacko self-assigned this Jun 24, 2026
sakerl
sakerl previously approved these changes Jun 25, 2026
@joe-chacko
joe-chacko dismissed sakerl’s stale review July 23, 2026 12:25

The merge-base changed after approval.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants