From 0f9289e6901c812d4b673a06821863fcf7b77edc Mon Sep 17 00:00:00 2001 From: Valera V Harseko Date: Sat, 19 Sep 2026 15:37:56 +0300 Subject: [PATCH 1/2] Make safe-to-static nested classes static and drop dead locals - Add static to 6 nested classes that never reference their enclosing instance (TstConnector.BatchUseCase2Processor, TstAbstractConnector.BatchUseCase3Processor, AppendingAttributes.AppendingEnumeration, AbstractRemoteConnection.InternalFutureCallback, ConnectorEventSubscriptionApiOpImpl.InternalRequestFactory, CSVFileConnector.OptionalTrim). - Drop 9 local variables that are assigned but never read. Where the assignment's call has a real side effect (ASN.1 cursor advance in VlvIndexSearchStrategy, protobuf validation in OpenICFServerAdapter's onPing/onPong, self-registration in RemoteConnectionContext's constructor) the call stays, only the unused binding goes; the rest (LdapConnection.getAnonymousContext, SQLUtil.getDriverMangerConnection, UpdateApiOpTests.testUpdateToNull's redundant pre-update fetch, ConnectionManager.doClose's commented-out-since-2015 close loop) were fully dead and are removed outright. - Leave OpenICFServerAdapter.initialiseEncryptor()'s dead encryptor local alone: that whole method is removed by #126. --- .../java/org/forgerock/openicf/csvfile/CSVFileConnector.java | 2 +- .../main/java/org/identityconnectors/dbcommon/SQLUtil.java | 1 - .../openicf/misc/crest/AbstractRemoteConnection.java | 2 +- .../identityconnectors/contract/test/UpdateApiOpTests.java | 3 --- .../async/impl/ConnectorEventSubscriptionApiOpImpl.java | 2 +- .../framework/client/ClientRemoteConnectorInfoManager.java | 4 ++-- .../forgerock/openicf/framework/client/ConnectionManager.java | 3 --- .../openicf/framework/remote/OpenICFServerAdapter.java | 4 ++-- .../java/org/forgerock/openicf/framework/server/Main.java | 2 +- .../testconnector/TstAbstractConnector.java | 2 +- .../org/identityconnectors/testconnector/TstConnector.java | 2 +- .../java/org/identityconnectors/ldap/AppendingAttributes.java | 2 +- .../main/java/org/identityconnectors/ldap/LdapConnection.java | 1 - .../ldap/search/VlvIndexSearchStrategy.java | 3 ++- 14 files changed, 13 insertions(+), 20 deletions(-) diff --git a/OpenICF-csvfile-connector/src/main/java/org/forgerock/openicf/csvfile/CSVFileConnector.java b/OpenICF-csvfile-connector/src/main/java/org/forgerock/openicf/csvfile/CSVFileConnector.java index c5e4e6f25..c9f5b61e7 100644 --- a/OpenICF-csvfile-connector/src/main/java/org/forgerock/openicf/csvfile/CSVFileConnector.java +++ b/OpenICF-csvfile-connector/src/main/java/org/forgerock/openicf/csvfile/CSVFileConnector.java @@ -1217,7 +1217,7 @@ private CellProcessor[] getProcessors(String[] header) { return processors; } - private class OptionalTrim extends CellProcessorAdaptor implements BoolCellProcessor, DateCellProcessor, DoubleCellProcessor, + private static class OptionalTrim extends CellProcessorAdaptor implements BoolCellProcessor, DateCellProcessor, DoubleCellProcessor, LongCellProcessor, StringCellProcessor { /** diff --git a/OpenICF-dbcommon/src/main/java/org/identityconnectors/dbcommon/SQLUtil.java b/OpenICF-dbcommon/src/main/java/org/identityconnectors/dbcommon/SQLUtil.java index 05edfff95..2e343d813 100644 --- a/OpenICF-dbcommon/src/main/java/org/identityconnectors/dbcommon/SQLUtil.java +++ b/OpenICF-dbcommon/src/main/java/org/identityconnectors/dbcommon/SQLUtil.java @@ -247,7 +247,6 @@ public void access(char[] clearChars) { public static Connection getDriverMangerConnection(final String driver, final String url, final Properties properties) { // create the connection base on the configuration.. - Connection[] ret = new Connection[1]; try { // load the driver class.. Class.forName(driver); diff --git a/OpenICF-groovy-connector/src/main/java/org/forgerock/openicf/misc/crest/AbstractRemoteConnection.java b/OpenICF-groovy-connector/src/main/java/org/forgerock/openicf/misc/crest/AbstractRemoteConnection.java index be65cf086..a7f3fdb72 100644 --- a/OpenICF-groovy-connector/src/main/java/org/forgerock/openicf/misc/crest/AbstractRemoteConnection.java +++ b/OpenICF-groovy-connector/src/main/java/org/forgerock/openicf/misc/crest/AbstractRemoteConnection.java @@ -536,7 +536,7 @@ private Promise handleRequestAsync(final Co } } - class InternalFutureCallback implements FutureCallback { + static class InternalFutureCallback implements FutureCallback { final PromiseImpl promise; public InternalFutureCallback(PromiseImpl promise) { diff --git a/OpenICF-java-framework/connector-framework-contract/src/main/java/org/identityconnectors/contract/test/UpdateApiOpTests.java b/OpenICF-java-framework/connector-framework-contract/src/main/java/org/identityconnectors/contract/test/UpdateApiOpTests.java index b2b13f71c..8bbf54f7f 100644 --- a/OpenICF-java-framework/connector-framework-contract/src/main/java/org/identityconnectors/contract/test/UpdateApiOpTests.java +++ b/OpenICF-java-framework/connector-framework-contract/src/main/java/org/identityconnectors/contract/test/UpdateApiOpTests.java @@ -230,9 +230,6 @@ public void testUpdateToNull(ObjectClass objectClass) { getObjectClassInfo(objectClass), getTestName(), 2, getOperationOptionsByOp(objectClass, CreateApiOp.class)); assertNotNull(uid,"Create returned null Uid."); - ConnectorObject originalObject = getConnectorFacade().getObject(objectClass, uid, - getOperationOptionsByOp(objectClass, GetApiOp.class)); - Collection skippedAttributesForUpdateToNullValue = getSkippedAttributesForUpdateToNullValue(); for (AttributeInfo attInfo : getObjectClassInfo(objectClass).getAttributeInfo()) { if (attInfo.isUpdateable() && !attInfo.isRequired() && !AttributeUtil.isSpecial(attInfo) && !attInfo.getType().isPrimitive()) { diff --git a/OpenICF-java-framework/connector-framework-server/src/main/java/org/forgerock/openicf/framework/async/impl/ConnectorEventSubscriptionApiOpImpl.java b/OpenICF-java-framework/connector-framework-server/src/main/java/org/forgerock/openicf/framework/async/impl/ConnectorEventSubscriptionApiOpImpl.java index f3fa5e6c4..68aca0c14 100644 --- a/OpenICF-java-framework/connector-framework-server/src/main/java/org/forgerock/openicf/framework/async/impl/ConnectorEventSubscriptionApiOpImpl.java +++ b/OpenICF-java-framework/connector-framework-server/src/main/java/org/forgerock/openicf/framework/async/impl/ConnectorEventSubscriptionApiOpImpl.java @@ -134,7 +134,7 @@ public Promise trySubscribe(final ObjectClass objectClas .setConnectorEventSubscriptionOpRequest(requestBuilder), handler)); } - private class InternalRequestFactory extends + private static class InternalRequestFactory extends AbstractRemoteOperationRequestFactory { private final OperationRequest.Builder operationRequest; final Observer handler; diff --git a/OpenICF-java-framework/connector-framework-server/src/main/java/org/forgerock/openicf/framework/client/ClientRemoteConnectorInfoManager.java b/OpenICF-java-framework/connector-framework-server/src/main/java/org/forgerock/openicf/framework/client/ClientRemoteConnectorInfoManager.java index 80bf9f1cf..fcd87e95f 100644 --- a/OpenICF-java-framework/connector-framework-server/src/main/java/org/forgerock/openicf/framework/client/ClientRemoteConnectorInfoManager.java +++ b/OpenICF-java-framework/connector-framework-server/src/main/java/org/forgerock/openicf/framework/client/ClientRemoteConnectorInfoManager.java @@ -161,8 +161,8 @@ protected void preConfigure(final Connection conn) { final ICFWebSocket socket = new ICFWebSocket(protocolHandler, getOperationMessageListener()); final WebSocketHolder holder = WebSocketHolder.set(conn, protocolHandler, socket); - final RemoteConnectionContext context = - new RemoteConnectionContext(conn, connectionInfo); + // The constructor registers itself on the connection (RemoteConnectionContext.set()). + new RemoteConnectionContext(conn, connectionInfo); holder.handshake = protocolHandler.createClientHandShake(connectionInfo.getRemoteURI()); diff --git a/OpenICF-java-framework/connector-framework-server/src/main/java/org/forgerock/openicf/framework/client/ConnectionManager.java b/OpenICF-java-framework/connector-framework-server/src/main/java/org/forgerock/openicf/framework/client/ConnectionManager.java index 83038f545..2219c7dae 100644 --- a/OpenICF-java-framework/connector-framework-server/src/main/java/org/forgerock/openicf/framework/client/ConnectionManager.java +++ b/OpenICF-java-framework/connector-framework-server/src/main/java/org/forgerock/openicf/framework/client/ConnectionManager.java @@ -173,9 +173,6 @@ protected void doClose() { } registry.clear(); - for (WebSocketConnectionGroup group : connectionGroups.values()) { - // group.close(); - } connectionGroups.clear(); clientTransport.shutdownNow(); diff --git a/OpenICF-java-framework/connector-framework-server/src/main/java/org/forgerock/openicf/framework/remote/OpenICFServerAdapter.java b/OpenICF-java-framework/connector-framework-server/src/main/java/org/forgerock/openicf/framework/remote/OpenICFServerAdapter.java index 16f6d2207..ad692f87a 100644 --- a/OpenICF-java-framework/connector-framework-server/src/main/java/org/forgerock/openicf/framework/remote/OpenICFServerAdapter.java +++ b/OpenICF-java-framework/connector-framework-server/src/main/java/org/forgerock/openicf/framework/remote/OpenICFServerAdapter.java @@ -269,7 +269,7 @@ public void onPing(WebSocketConnectionHolder socket, byte[] bytes) { // Nothing to do, pong response has been sent logger.info("{0} onPing()", loggerName()); try { - RPCMessages.PingMessage message = RPCMessages.PingMessage.parseFrom(bytes); + RPCMessages.PingMessage.parseFrom(bytes); } catch (InvalidProtocolBufferException e) { logger.warn(e, "{0} failed parse message", loggerName()); } @@ -281,7 +281,7 @@ public void onPong(WebSocketConnectionHolder socket, byte[] bytes) { // Confirm ping response! logger.info("{0} onPong()", loggerName()); try { - RPCMessages.PingMessage message = RPCMessages.PingMessage.parseFrom(bytes); + RPCMessages.PingMessage.parseFrom(bytes); } catch (InvalidProtocolBufferException e) { logger.warn(e, "{0} failed parse message", loggerName()); } diff --git a/OpenICF-java-framework/connector-server-grizzly/src/main/java/org/forgerock/openicf/framework/server/Main.java b/OpenICF-java-framework/connector-server-grizzly/src/main/java/org/forgerock/openicf/framework/server/Main.java index c872cdcc3..849f2a062 100644 --- a/OpenICF-java-framework/connector-server-grizzly/src/main/java/org/forgerock/openicf/framework/server/Main.java +++ b/OpenICF-java-framework/connector-server-grizzly/src/main/java/org/forgerock/openicf/framework/server/Main.java @@ -20,6 +20,7 @@ * "Portions Copyrighted [year] [name of copyright owner]" * ==================== * Portions Copyrighted 2015-2016 ForgeRock AS. + * Portions Copyrighted 2026 3A Systems LLC. */ package org.forgerock.openicf.framework.server; @@ -193,7 +194,6 @@ private static void loadProperties(Properties properties) throws Exception { String useSSLStr = properties.getProperty(PROP_SSL); String ifAddress = properties.getProperty(PROP_IFADDRESS); String keyHash = properties.getProperty(PROP_KEY); - String facadeLifeTime = properties.getProperty(PROP_FACADE_LIFETIME); String loggerClass = properties.getProperty(PROP_LOGGER_CLASS); String url = properties.getProperty(PROP_REMOTE_URL); diff --git a/OpenICF-java-framework/testbundlev1/src/main/java/org/identityconnectors/testconnector/TstAbstractConnector.java b/OpenICF-java-framework/testbundlev1/src/main/java/org/identityconnectors/testconnector/TstAbstractConnector.java index c8ceee8d8..8372fdabc 100755 --- a/OpenICF-java-framework/testbundlev1/src/main/java/org/identityconnectors/testconnector/TstAbstractConnector.java +++ b/OpenICF-java-framework/testbundlev1/src/main/java/org/identityconnectors/testconnector/TstAbstractConnector.java @@ -846,7 +846,7 @@ public void run() { * Simulated Use Case 3: execute returns a batch token immediately and processes results in a separate thread. * No need to call queryBatch() unless the caller is interrupted and needs to reestablish the connection. */ - private class BatchUseCase3Processor extends Thread { + private static class BatchUseCase3Processor extends Thread { private OperationOptions options; private Observer observer; private BatchToken token; diff --git a/OpenICF-java-framework/testbundlev1/src/main/java/org/identityconnectors/testconnector/TstConnector.java b/OpenICF-java-framework/testbundlev1/src/main/java/org/identityconnectors/testconnector/TstConnector.java index 23587657a..ec0e74116 100644 --- a/OpenICF-java-framework/testbundlev1/src/main/java/org/identityconnectors/testconnector/TstConnector.java +++ b/OpenICF-java-framework/testbundlev1/src/main/java/org/identityconnectors/testconnector/TstConnector.java @@ -391,7 +391,7 @@ public Object getReturnValue() { return ret; } - private class BatchUseCase2Processor extends Thread { + private static class BatchUseCase2Processor extends Thread { private OperationOptions options; private String token; diff --git a/OpenICF-ldap-connector/src/main/java/org/identityconnectors/ldap/AppendingAttributes.java b/OpenICF-ldap-connector/src/main/java/org/identityconnectors/ldap/AppendingAttributes.java index 3176c6138..b2a5d337c 100644 --- a/OpenICF-ldap-connector/src/main/java/org/identityconnectors/ldap/AppendingAttributes.java +++ b/OpenICF-ldap-connector/src/main/java/org/identityconnectors/ldap/AppendingAttributes.java @@ -122,7 +122,7 @@ public final int size() { return size; } - private abstract class AppendingEnumeration implements NamingEnumeration { + private abstract static class AppendingEnumeration implements NamingEnumeration { private final NamingEnumeration delegate; private Enumeration remainingValues; diff --git a/OpenICF-ldap-connector/src/main/java/org/identityconnectors/ldap/LdapConnection.java b/OpenICF-ldap-connector/src/main/java/org/identityconnectors/ldap/LdapConnection.java index 8a48a2092..c51f752ee 100644 --- a/OpenICF-ldap-connector/src/main/java/org/identityconnectors/ldap/LdapConnection.java +++ b/OpenICF-ldap-connector/src/main/java/org/identityconnectors/ldap/LdapConnection.java @@ -160,7 +160,6 @@ private Hashtable getDefaultContextEnv(){ } private LdapContext getAnonymousContext() throws NamingException { - InitialLdapContext ctx = null; return new InitialLdapContext(getDefaultContextEnv(), null); } diff --git a/OpenICF-ldap-connector/src/main/java/org/identityconnectors/ldap/search/VlvIndexSearchStrategy.java b/OpenICF-ldap-connector/src/main/java/org/identityconnectors/ldap/search/VlvIndexSearchStrategy.java index fff1de0d2..341121774 100644 --- a/OpenICF-ldap-connector/src/main/java/org/identityconnectors/ldap/search/VlvIndexSearchStrategy.java +++ b/OpenICF-ldap-connector/src/main/java/org/identityconnectors/ldap/search/VlvIndexSearchStrategy.java @@ -21,6 +21,7 @@ * ==================== * * "Portions Copyrighted 2013-2015 ForgeRock AS" + * "Portions Copyrighted 2026 3A Systems LLC" */ package org.identityconnectors.ldap.search; @@ -190,7 +191,7 @@ private void processResponseControls(Control[] controls) throws NamingException try { reader.readStartSequence(); - final int offset = (int) reader.readInteger(); + reader.readInteger(); // offset, not used by this strategy lastListSize = (int) reader.readInteger(); getLog().ok("Response control: lastListSize = {0}", lastListSize); From 4cbfa0b01f6141332356221d050e7b2c2704674f Mon Sep 17 00:00:00 2001 From: Valera V Harseko Date: Fri, 2 Oct 2026 21:05:09 +0300 Subject: [PATCH 2/2] Address review: canonical 3A copyright lines, note unused facade lifetime key --- .../main/java/org/forgerock/openicf/framework/server/Main.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OpenICF-java-framework/connector-server-grizzly/src/main/java/org/forgerock/openicf/framework/server/Main.java b/OpenICF-java-framework/connector-server-grizzly/src/main/java/org/forgerock/openicf/framework/server/Main.java index 849f2a062..32b853465 100644 --- a/OpenICF-java-framework/connector-server-grizzly/src/main/java/org/forgerock/openicf/framework/server/Main.java +++ b/OpenICF-java-framework/connector-server-grizzly/src/main/java/org/forgerock/openicf/framework/server/Main.java @@ -20,7 +20,7 @@ * "Portions Copyrighted [year] [name of copyright owner]" * ==================== * Portions Copyrighted 2015-2016 ForgeRock AS. - * Portions Copyrighted 2026 3A Systems LLC. + * Portions Copyrighted 2026 3A Systems, LLC */ package org.forgerock.openicf.framework.server; @@ -61,6 +61,7 @@ public final class Main { private static final String PROP_SSL = "connectorserver.usessl"; private static final String PROP_IFADDRESS = "connectorserver.ifaddress"; private static final String PROP_KEY = "connectorserver.key"; + // Not applied by the grizzly server: facade lifetime is fixed in ConnectorFramework. private static final String PROP_FACADE_LIFETIME = "connectorserver.maxFacadeLifeTime"; private static final String PROP_LOGGER_CLASS = "connectorserver.loggerClass"; private static final String PROP_REMOTE_URL = "connectorserver.url";