refactor(rmi): remove ClientUtil and simplify stub creation - #824
Open
joe-chacko wants to merge 198 commits into
Open
refactor(rmi): remove ClientUtil and simplify stub creation#824joe-chacko wants to merge 198 commits into
joe-chacko wants to merge 198 commits into
Conversation
- 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
…gin-test Modernise IIOP plugin tests
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
…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
refactor/use method handles
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
…or-test Server interceptor test
…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
sakerl
previously approved these changes
Jun 25, 2026
joe-chacko
dismissed
sakerl’s stale review
July 23, 2026 12:25
The merge-base changed after approval.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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:
Co-authored-by-AI: IBM Bob 2.0.0