From 69edda3085e1cf90ca3a572c5b8bbb714682b219 Mon Sep 17 00:00:00 2001 From: Valera V Harseko Date: Fri, 18 Sep 2026 17:12:39 +0300 Subject: [PATCH 1/2] Replace deprecated API calls flagged by CodeQL - Class.newInstance() -> getDeclaredConstructor().newInstance() - Jackson: set MapperFeature through JsonMapper.builder() instead of on a built ObjectMapper (JsonUtil and the Activiti resources) - OSGi LogEntry.getLevel() -> getLogLevel(), mapping AUDIT and TRACE too - OrientDB: db.save(doc) and the internal index manager API - commons-io FileUtils.write with an explicit charset - Log the client certificate subject via getSubjectX500Principal() - Drop the no-op BoneCP setReleaseHelperThreads() Resolves CodeQL alerts #54-#56, #58, #59, #65-#68, #73, #76-#83, #86-#92. --- .../tools/scriptedbundler/SourceGenerator.java | 6 ++++-- .../openidm/audit/impl/AuditServiceImpl.java | 7 ++++--- .../openidm/auth/AuthenticationService.java | 7 ++++--- .../auth/modules/ClientCertAuthModule.java | 4 ++-- .../openidm/logging/OsgiLogHandler.java | 18 ++++++++++++------ .../openidm/metadata/impl/ProviderTracker.java | 2 +- .../openidm/http/ContextRegistrator.java | 2 +- .../jdbc/impl/BoneCPDataSourceFactory.java | 2 +- .../openidm/repo/orientdb/impl/DBHelper.java | 14 +++++++------- .../orientdb/impl/OrientDBRepoService.java | 6 +++--- .../impl/ServletRegistrationSingleton.java | 2 +- .../org/forgerock/openidm/util/JsonUtil.java | 13 +++++++------ .../impl/ProcessDefinitionResource.java | 5 +++-- .../activiti/impl/ProcessInstanceResource.java | 5 +++-- .../activiti/impl/TaskDefinitionResource.java | 5 +++-- .../impl/TaskInstanceHistoryResource.java | 5 +++-- .../activiti/impl/TaskInstanceResource.java | 5 +++-- 17 files changed, 62 insertions(+), 46 deletions(-) diff --git a/custom-scripted-connector-bundler/src/main/java/org/forgerock/openidm/tools/scriptedbundler/SourceGenerator.java b/custom-scripted-connector-bundler/src/main/java/org/forgerock/openidm/tools/scriptedbundler/SourceGenerator.java index a5a4c15929..ea0cf34275 100644 --- a/custom-scripted-connector-bundler/src/main/java/org/forgerock/openidm/tools/scriptedbundler/SourceGenerator.java +++ b/custom-scripted-connector-bundler/src/main/java/org/forgerock/openidm/tools/scriptedbundler/SourceGenerator.java @@ -2,6 +2,7 @@ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2015 ForgeRock AS. All Rights Reserved + * Portions Copyright 2026 3A Systems, LLC. * * The contents of this file are subject to the terms * of the Common Development and Distribution License @@ -34,6 +35,7 @@ import java.io.BufferedReader; import java.io.File; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; @@ -125,7 +127,7 @@ public CharSequence apply(String context, Options options) throws IOException { hbtemplate = hb.compileInline(out.toString()); String contents = hbtemplate.apply(config); - FileUtils.write(new File(outputPath + outputFilename), contents); + FileUtils.write(new File(outputPath + outputFilename), contents, StandardCharsets.UTF_8); } catch (Exception e) { throw new IOException("Failed to read contents of " + template.getInputName(), e); } @@ -162,7 +164,7 @@ public CharSequence apply(String context, Options options) throws IOException { } contents += out.toString(); - FileUtils.write(new File(outputPath + outputFilename), contents); + FileUtils.write(new File(outputPath + outputFilename), contents, StandardCharsets.UTF_8); } catch (IOException e) { throw new IOException("Failed to read contents of " + uiTemplate.getInputName(), e); } diff --git a/openidm-audit/src/main/java/org/forgerock/openidm/audit/impl/AuditServiceImpl.java b/openidm-audit/src/main/java/org/forgerock/openidm/audit/impl/AuditServiceImpl.java index 79565a30c8..f19435aef8 100644 --- a/openidm-audit/src/main/java/org/forgerock/openidm/audit/impl/AuditServiceImpl.java +++ b/openidm-audit/src/main/java/org/forgerock/openidm/audit/impl/AuditServiceImpl.java @@ -12,7 +12,7 @@ * information: "Portions copyright [year] [name of copyright owner]". * * Copyright 2011-2016 ForgeRock AS. - * Portions Copyrighted 2024 3A Systems LLC. + * Portions Copyrighted 2024-2026 3A Systems LLC. */ package org.forgerock.openidm.audit.impl; @@ -705,8 +705,9 @@ private void createDummyAuditEventHandlers(final Map providerClazz = bundle.loadClass(providerClazzName); - MetaDataProvider provider = (MetaDataProvider) providerClazz.newInstance(); + MetaDataProvider provider = (MetaDataProvider) providerClazz.getDeclaredConstructor().newInstance(); String id = Long.valueOf(bundle.getBundleId()).toString(); // Instantiate and set the provider callback provider.setCallback(new ProviderTrackerCallback(provider, id)); diff --git a/openidm-httpcontext/src/main/java/org/forgerock/openidm/http/ContextRegistrator.java b/openidm-httpcontext/src/main/java/org/forgerock/openidm/http/ContextRegistrator.java index 676fbeb183..7d374ae8aa 100644 --- a/openidm-httpcontext/src/main/java/org/forgerock/openidm/http/ContextRegistrator.java +++ b/openidm-httpcontext/src/main/java/org/forgerock/openidm/http/ContextRegistrator.java @@ -154,7 +154,7 @@ SecurityConfigurator instantiateSecurityConfigurator(String clazzName) { } try { if (configuratorClazz != null) { - Object instance = configuratorClazz.newInstance(); + Object instance = configuratorClazz.getDeclaredConstructor().newInstance(); logger.debug("Instantiated configurator {}", instance); configurator = (SecurityConfigurator) instance; } diff --git a/openidm-repo-jdbc/src/main/java/org/forgerock/openidm/datasource/jdbc/impl/BoneCPDataSourceFactory.java b/openidm-repo-jdbc/src/main/java/org/forgerock/openidm/datasource/jdbc/impl/BoneCPDataSourceFactory.java index 3a8df62cbd..3d07f0080c 100644 --- a/openidm-repo-jdbc/src/main/java/org/forgerock/openidm/datasource/jdbc/impl/BoneCPDataSourceFactory.java +++ b/openidm-repo-jdbc/src/main/java/org/forgerock/openidm/datasource/jdbc/impl/BoneCPDataSourceFactory.java @@ -12,6 +12,7 @@ * information: "Portions copyright [year] [name of copyright owner]". * * Copyright 2015 ForgeRock AS. + * Portions Copyright 2026 3A Systems, LLC. */ package org.forgerock.openidm.datasource.jdbc.impl; @@ -51,7 +52,6 @@ public DataSource newInstance() { ds.setConnectionHook(new BoneCPDatabaseShutdownHook()); ds.setTransactionRecoveryEnabled(true);// Important: This should be enabled ds.setAcquireRetryAttempts(10);//default is 5 - ds.setReleaseHelperThreads(5); ds.setStatisticsEnabled(Boolean.parseBoolean( IdentityServer.getInstance().getProperty("openidm.bonecp.statistics.enabled", "false"))); if (ds.getPoolName() == null || ds.getPoolName().isEmpty()) { diff --git a/openidm-repo-orientdb/src/main/java/org/forgerock/openidm/repo/orientdb/impl/DBHelper.java b/openidm-repo-orientdb/src/main/java/org/forgerock/openidm/repo/orientdb/impl/DBHelper.java index 95b31aaec0..37952ca354 100644 --- a/openidm-repo-orientdb/src/main/java/org/forgerock/openidm/repo/orientdb/impl/DBHelper.java +++ b/openidm-repo-orientdb/src/main/java/org/forgerock/openidm/repo/orientdb/impl/DBHelper.java @@ -45,7 +45,7 @@ import com.orientechnologies.orient.core.db.document.ODatabaseDocumentPool; import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx; import com.orientechnologies.orient.core.index.OIndex; -import com.orientechnologies.orient.core.index.OIndexManager; +import com.orientechnologies.orient.core.index.OIndexManagerAbstract; import com.orientechnologies.orient.core.metadata.schema.OClass; import com.orientechnologies.orient.core.metadata.schema.OProperty; import com.orientechnologies.orient.core.metadata.schema.OSchema; @@ -412,7 +412,7 @@ private static void populateDefaultRole(String defaultTableName, ODatabaseDocume try { ODocument newDoc = DocumentUtil.toDocument(role.asMap(), null, db, defaultTableName); - newDoc.save(); + db.save(newDoc); logger.trace("Created default role {}", id); } catch (ConflictException ex) { throw new InvalidException("Unexpected failure during DB set-up of default role", ex); @@ -451,7 +451,7 @@ private static void populateDefaultUser(String defaultTableName, ODatabaseDocume try { ODocument newDoc = DocumentUtil.toDocument(defaultAdmin.asMap(), null, db, defaultTableName); - newDoc.save(); + db.save(newDoc); } catch (ConflictException ex) { throw new InvalidException("Unexpected failure during DB set-up of default user", ex); } @@ -506,7 +506,7 @@ private static void createIndex(OClass orientClass, String indexType, String[] p private static void createOrUpdateOrientDBClass(ODatabaseDocumentTx db, OSchema schema, String orientClassName, JsonValue orientClassConfig) { - OIndexManager indexManager = db.getMetadata().getIndexManager(); + OIndexManagerAbstract indexManager = db.getMetadata().getIndexManagerInternal(); OClass orientClass = schema.getClass(orientClassName); if (orientClass == null) { logger.info("OrientDB class {} does not exist and is being created.", orientClassName); @@ -552,7 +552,7 @@ private static void createOrUpdateOrientDBClass(ODatabaseDocumentTx db, OSchema String indexName = uniqueIndexName(orientClass.getName(), propertyNames); OIndex oIndex = orientClass.getClassIndex(indexName); if (oIndex != null && !oIndex.getType().equalsIgnoreCase(indexType)) { - indexManager.dropIndex(indexName); + indexManager.dropIndex(db, indexName); oIndex = null; } if (oIndex == null) { @@ -571,13 +571,13 @@ private static void createOrUpdateOrientDBClass(ODatabaseDocumentTx db, OSchema String propName = property.getName(); if (!indexProperties.contains(propName)) { - Set propIndexes = indexManager.getClassInvolvedIndexes(orientClass.getName(), propName); + Set propIndexes = indexManager.getClassInvolvedIndexes(db, orientClass.getName(), propName); for (OIndex propIndex : propIndexes) { // Ensure that we only drop indexes which we created and // match the OpenIDM index naming convention String indexRegex = uniqueIndexName(orientClass.getName(), new String[]{".*"}); if (propIndex.getName().matches(indexRegex)) { - indexManager.dropIndex(propIndex.getName()); + indexManager.dropIndex(db, propIndex.getName()); } } } diff --git a/openidm-repo-orientdb/src/main/java/org/forgerock/openidm/repo/orientdb/impl/OrientDBRepoService.java b/openidm-repo-orientdb/src/main/java/org/forgerock/openidm/repo/orientdb/impl/OrientDBRepoService.java index 0f008e4946..de7480c27a 100644 --- a/openidm-repo-orientdb/src/main/java/org/forgerock/openidm/repo/orientdb/impl/OrientDBRepoService.java +++ b/openidm-repo-orientdb/src/main/java/org/forgerock/openidm/repo/orientdb/impl/OrientDBRepoService.java @@ -12,7 +12,7 @@ * information: "Portions copyright [year] [name of copyright owner]". * * Copyright 2011-2016 ForgeRock AS. - * Portions Copyrighted 2024 3A Systems LLC. + * Portions Copyrighted 2024-2026 3A Systems LLC. * Portions copyright 2026 3A Systems, LLC. */ package org.forgerock.openidm.repo.orientdb.impl; @@ -282,7 +282,7 @@ public ResourceResponse create(CreateRequest request) throws ResourceException { // Rather than using MVCC for insert, rely on primary key uniqueness constraints to detect duplicate create ODocument newDoc = DocumentUtil.toDocument(obj, null, db, orientClassName); logger.trace("Created doc for id: {} to save {}", fullId, newDoc); - newDoc.save(); + db.save(newDoc); obj.put(DocumentUtil.TAG_REV, Integer.toString(newDoc.getVersion())); logger.debug("Completed create for id: {} revision: {}", fullId, newDoc.getVersion()); @@ -353,7 +353,7 @@ public ResourceResponse update(UpdateRequest request) throws ResourceException { ODocument updatedDoc = DocumentUtil.toDocument(obj, existingDoc, db, orientClassName); logger.trace("Updated doc for id {} to save {}", request.getResourcePath(), updatedDoc); - updatedDoc.save(); + db.save(updatedDoc); obj.put(DocumentUtil.TAG_REV, Integer.toString(updatedDoc.getVersion())); // Set ID to return to caller diff --git a/openidm-servlet-registrator/src/main/java/org/forgerock/openidm/servletregistration/impl/ServletRegistrationSingleton.java b/openidm-servlet-registrator/src/main/java/org/forgerock/openidm/servletregistration/impl/ServletRegistrationSingleton.java index 6fcdecc6f0..e7ad3843d0 100644 --- a/openidm-servlet-registrator/src/main/java/org/forgerock/openidm/servletregistration/impl/ServletRegistrationSingleton.java +++ b/openidm-servlet-registrator/src/main/java/org/forgerock/openidm/servletregistration/impl/ServletRegistrationSingleton.java @@ -244,7 +244,7 @@ public URL apply(JsonValue jsonValue) throws JsonValueException { try { filterCL = new URLClassLoader(urls.toArray(new URL[0]), this.getClass().getClassLoader()); Thread.currentThread().setContextClassLoader(filterCL); - filter = (Filter)(Class.forName(filterClass, true, filterCL).newInstance()); + filter = (Filter) Class.forName(filterClass, true, filterCL).getDeclaredConstructor().newInstance(); } catch (Exception ex) { logger.warn("Configured class {} failed to load from configured class path URLs {}", filterClass, urls, ex); throw ex; diff --git a/openidm-util/src/main/java/org/forgerock/openidm/util/JsonUtil.java b/openidm-util/src/main/java/org/forgerock/openidm/util/JsonUtil.java index 33043a4979..d6c4841553 100644 --- a/openidm-util/src/main/java/org/forgerock/openidm/util/JsonUtil.java +++ b/openidm-util/src/main/java/org/forgerock/openidm/util/JsonUtil.java @@ -31,6 +31,7 @@ import com.fasterxml.jackson.core.util.DefaultPrettyPrinter.Indenter; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.MapperFeature; +import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter; import com.fasterxml.jackson.databind.SerializationFeature; @@ -48,12 +49,12 @@ public final class JsonUtil { private static final ObjectWriter PRETTY_WRITER; static { - OBJECT_MAPPER = - new ObjectMapper().configure( - JsonParser.Feature.ALLOW_COMMENTS, true).disable( - DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES).enable( - SerializationFeature.INDENT_OUTPUT).enable( - MapperFeature.SORT_PROPERTIES_ALPHABETICALLY); + OBJECT_MAPPER = JsonMapper.builder() + .enable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY) + .configure(JsonParser.Feature.ALLOW_COMMENTS, true) + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .enable(SerializationFeature.INDENT_OUTPUT) + .build(); // TODO Make it configurable for Audit service // .configure(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS, true); diff --git a/openidm-workflow-activiti/src/main/java/org/forgerock/openidm/workflow/activiti/impl/ProcessDefinitionResource.java b/openidm-workflow-activiti/src/main/java/org/forgerock/openidm/workflow/activiti/impl/ProcessDefinitionResource.java index 755ff14caa..87d0ea1564 100644 --- a/openidm-workflow-activiti/src/main/java/org/forgerock/openidm/workflow/activiti/impl/ProcessDefinitionResource.java +++ b/openidm-workflow-activiti/src/main/java/org/forgerock/openidm/workflow/activiti/impl/ProcessDefinitionResource.java @@ -12,6 +12,7 @@ * information: "Portions copyright [year] [name of copyright owner]". * * Copyright 2012-2015 ForgeRock AS. + * Portions Copyright 2026 3A Systems, LLC. */ package org.forgerock.openidm.workflow.activiti.impl; @@ -28,6 +29,7 @@ import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.databind.SerializationFeature; import org.forgerock.services.context.Context; import org.forgerock.json.resource.ActionRequest; @@ -86,12 +88,11 @@ public class ProcessDefinitionResource implements CollectionResourceProvider { private ProcessEngine processEngine; static { - mapper = new ObjectMapper(); + mapper = JsonMapper.builder().enable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY).build(); mapper.addMixIn(ProcessDefinitionEntity.class, ProcessDefinitionMixIn.class); mapper.addMixIn(EnumFormType.class, EnumFormTypeMixIn.class); mapper.addMixIn(DateFormType.class, DateFormTypeMixIn.class); mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); - mapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true); } public ProcessDefinitionResource(ProcessEngine processEngine) { diff --git a/openidm-workflow-activiti/src/main/java/org/forgerock/openidm/workflow/activiti/impl/ProcessInstanceResource.java b/openidm-workflow-activiti/src/main/java/org/forgerock/openidm/workflow/activiti/impl/ProcessInstanceResource.java index 401e646e68..bbd62926eb 100644 --- a/openidm-workflow-activiti/src/main/java/org/forgerock/openidm/workflow/activiti/impl/ProcessInstanceResource.java +++ b/openidm-workflow-activiti/src/main/java/org/forgerock/openidm/workflow/activiti/impl/ProcessInstanceResource.java @@ -12,6 +12,7 @@ * information: "Portions copyright [year] [name of copyright owner]". * * Copyright 2012-2015 ForgeRock AS. + * Portions Copyright 2026 3A Systems, LLC. */ package org.forgerock.openidm.workflow.activiti.impl; @@ -29,6 +30,7 @@ import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.databind.SerializationFeature; import org.activiti.bpmn.model.BpmnModel; import org.activiti.engine.RuntimeService; @@ -88,11 +90,10 @@ public class ProcessInstanceResource implements CollectionResourceProvider { private final Function queryFunction; static { - mapper = new ObjectMapper(); + mapper = JsonMapper.builder().enable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY).build(); mapper.addMixIn(HistoricProcessInstanceEntity.class, HistoricProcessInstanceMixIn.class); mapper.addMixIn(HistoricTaskInstanceEntity.class, HistoricTaskInstanceEntityMixIn.class); mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); - mapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true); } /** diff --git a/openidm-workflow-activiti/src/main/java/org/forgerock/openidm/workflow/activiti/impl/TaskDefinitionResource.java b/openidm-workflow-activiti/src/main/java/org/forgerock/openidm/workflow/activiti/impl/TaskDefinitionResource.java index 58486c33a2..819846d8e5 100644 --- a/openidm-workflow-activiti/src/main/java/org/forgerock/openidm/workflow/activiti/impl/TaskDefinitionResource.java +++ b/openidm-workflow-activiti/src/main/java/org/forgerock/openidm/workflow/activiti/impl/TaskDefinitionResource.java @@ -12,6 +12,7 @@ * information: "Portions copyright [year] [name of copyright owner]". * * Copyright 2012-2015 ForgeRock AS. + * Portions Copyright 2026 3A Systems, LLC. */ package org.forgerock.openidm.workflow.activiti.impl; @@ -27,6 +28,7 @@ import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.databind.SerializationFeature; import org.forgerock.services.context.Context; import org.forgerock.http.routing.UriRouterContext; @@ -78,13 +80,12 @@ public class TaskDefinitionResource implements CollectionResourceProvider { private ProcessEngine processEngine; static { - mapper = new ObjectMapper(); + mapper = JsonMapper.builder().enable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY).build(); mapper.addMixIn(TaskDefinition.class, TaskDefinitionMixIn.class); mapper.addMixIn(EnumFormType.class, EnumFormTypeMixIn.class); mapper.addMixIn(DateFormType.class, DateFormTypeMixIn.class); mapper.addMixIn(FormPropertyHandler.class, FormPropertyHandlerMixIn.class); mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); - mapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true); } public TaskDefinitionResource(ProcessEngine processEngine) { diff --git a/openidm-workflow-activiti/src/main/java/org/forgerock/openidm/workflow/activiti/impl/TaskInstanceHistoryResource.java b/openidm-workflow-activiti/src/main/java/org/forgerock/openidm/workflow/activiti/impl/TaskInstanceHistoryResource.java index 655da8de92..49099b047a 100644 --- a/openidm-workflow-activiti/src/main/java/org/forgerock/openidm/workflow/activiti/impl/TaskInstanceHistoryResource.java +++ b/openidm-workflow-activiti/src/main/java/org/forgerock/openidm/workflow/activiti/impl/TaskInstanceHistoryResource.java @@ -12,6 +12,7 @@ * information: "Portions copyright [year] [name of copyright owner]". * * Copyright 2015 ForgeRock AS. + * Portions Copyright 2026 3A Systems, LLC. */ package org.forgerock.openidm.workflow.activiti.impl; @@ -22,6 +23,7 @@ import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.databind.SerializationFeature; import org.activiti.engine.ProcessEngine; import org.activiti.engine.history.HistoricTaskInstance; @@ -64,11 +66,10 @@ public class TaskInstanceHistoryResource implements CollectionResourceProvider { private ProcessEngine processEngine; static { - mapper = new ObjectMapper(); + mapper = JsonMapper.builder().enable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY).build(); mapper.addMixIn(HistoricTaskInstanceEntity.class, HistoricTaskInstanceEntityMixIn.class); mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); - mapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true); } /** diff --git a/openidm-workflow-activiti/src/main/java/org/forgerock/openidm/workflow/activiti/impl/TaskInstanceResource.java b/openidm-workflow-activiti/src/main/java/org/forgerock/openidm/workflow/activiti/impl/TaskInstanceResource.java index 0231358b1d..8468f3a86b 100644 --- a/openidm-workflow-activiti/src/main/java/org/forgerock/openidm/workflow/activiti/impl/TaskInstanceResource.java +++ b/openidm-workflow-activiti/src/main/java/org/forgerock/openidm/workflow/activiti/impl/TaskInstanceResource.java @@ -12,6 +12,7 @@ * information: "Portions copyright [year] [name of copyright owner]". * * Copyright 2012-2016 ForgeRock AS. + * Portions Copyright 2026 3A Systems, LLC. */ package org.forgerock.openidm.workflow.activiti.impl; @@ -23,6 +24,7 @@ import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.databind.SerializationFeature; import org.activiti.engine.ActivitiObjectNotFoundException; import org.activiti.engine.task.IdentityLink; @@ -79,10 +81,9 @@ public class TaskInstanceResource implements CollectionResourceProvider { private ProcessEngine processEngine; static { - mapper = new ObjectMapper(); + mapper = JsonMapper.builder().enable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY).build(); mapper.addMixIn(TaskEntity.class, TaskEntityMixIn.class); mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); - mapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true); } public TaskInstanceResource(ProcessEngine processEngine) { From 3a37a9dc196a6bf0ddae0ca772388d89ef9b5cb4 Mon Sep 17 00:00:00 2001 From: Valera V Harseko Date: Sat, 3 Oct 2026 09:06:18 +0300 Subject: [PATCH 2/2] Address review on deprecated-API replacements - AuditServiceImpl: let a failing *Configuration constructor fail activation again (InvocationTargetException), log other reflection failures with the cause - OsgiLogHandler: drop the unused LogService import, document the default branch - Pin the JsonMapper.builder() settings in JsonUtilTest - Cover the db.save and index-manager rewrites in DBHelperTest --- .../openidm/audit/impl/AuditServiceImpl.java | 7 +++- .../openidm/logging/OsgiLogHandler.java | 3 +- .../repo/orientdb/impl/DBHelperTest.java | 37 +++++++++++++++++++ .../forgerock/openidm/util/JsonUtilTest.java | 16 ++++++++ 4 files changed, 61 insertions(+), 2 deletions(-) diff --git a/openidm-audit/src/main/java/org/forgerock/openidm/audit/impl/AuditServiceImpl.java b/openidm-audit/src/main/java/org/forgerock/openidm/audit/impl/AuditServiceImpl.java index f19435aef8..5181bb0c32 100644 --- a/openidm-audit/src/main/java/org/forgerock/openidm/audit/impl/AuditServiceImpl.java +++ b/openidm-audit/src/main/java/org/forgerock/openidm/audit/impl/AuditServiceImpl.java @@ -24,6 +24,7 @@ import static org.forgerock.json.resource.Responses.newResourceResponse; import static org.forgerock.openidm.audit.impl.AuditLogFilters.*; +import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.LinkedList; @@ -707,8 +708,12 @@ private void createDummyAuditEventHandlers(final Map indexManager.dropIndex(db, indexName) and re-create + index.put("indexType", "unique"); + db = DBHelper.getPool(url, user, password, minSize, maxSize, config, true).acquire(url, user, password); + assertThat(db.getMetadata().getSchema().getClass("pinned").getClassIndex("pinned!name!Idx").getType()) + .isEqualToIgnoringCase("unique"); + db.close(); + + // index no longer configured -> getClassInvolvedIndexes(db, ..) + dropIndex(db, ..) + classes.put("pinned", object()); + db = DBHelper.getPool(url, user, password, minSize, maxSize, config, true).acquire(url, user, password); + assertThat(db.getMetadata().getSchema().getClass("pinned").getClassIndex("pinned!name!Idx")).isNull(); + db.drop(); + db.close(); + DBHelper.closePools(); + } + } diff --git a/openidm-util/src/test/java/org/forgerock/openidm/util/JsonUtilTest.java b/openidm-util/src/test/java/org/forgerock/openidm/util/JsonUtilTest.java index 7c96c734fc..5020f30384 100644 --- a/openidm-util/src/test/java/org/forgerock/openidm/util/JsonUtilTest.java +++ b/openidm-util/src/test/java/org/forgerock/openidm/util/JsonUtilTest.java @@ -12,6 +12,7 @@ * information: "Portions copyright [year] [name of copyright owner]". * * Copyright 2016 ForgeRock AS. + * Portions Copyright 2026 3A Systems, LLC. */ package org.forgerock.openidm.util; @@ -24,6 +25,9 @@ import java.util.Comparator; import java.util.List; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.MapperFeature; +import com.fasterxml.jackson.databind.ObjectMapper; import org.forgerock.json.JsonValue; import org.forgerock.json.resource.SortKey; import org.testng.annotations.Test; @@ -99,4 +103,16 @@ public void testJsonComparatorDescending() { assertThat(listToSort.get(0).get("fn").asString()).isEqualTo("Zebra"); } + @Test + public void testObjectMapperSettings() throws Exception { + // ALLOW_COMMENTS on OBJECT_MAPPER itself (build() re-enables it only on its copy) + assertThat(JsonUtil.parseStringified("{ /* comment */ \"a\" : 1 }").get("a").asInteger()).isEqualTo(1); + // INDENT_OUTPUT + assertThat(JsonUtil.writeValueAsString(json(object(field("a", 1))))).contains("\n"); + // the remaining builder settings travel with OBJECT_MAPPER.copy() + ObjectMapper copy = JsonUtil.build(); + assertThat(copy.isEnabled(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY)).isTrue(); + assertThat(copy.isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)).isFalse(); + } + }