Repository: wso2/carbon-identity-framework
Pull request #6578: Add fallback to IDN_ACTION_PROPERTIES table
Author: login: osandamaleesha
Created: 2025-03-03T17:25:38Z | Merged: 2025-03-04T03:47:00Z

### Proposed changes in this pull request

This PR adds the backward compatibilty in BE to support the future schema change to be done in IDN_ACTION_PROPERTIES table. When the PROPERTY_VALUE column is getting changed to PRIMITIVE_VALUE column this BE logic handles the CRUD operations.


### When should this PR be merged

Soon

### Follow up actions

- [ ] Todo code lines mentioned in this implementation should be removed with a new PR after the new schema change becomes stable in the PROD

### Related issue

- https://github.com/wso2/product-is/issues/23347



Diff:
diff --git a/components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/internal/constant/ActionMgtSQLConstants.java b/components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/internal/constant/ActionMgtSQLConstants.java
index 1abd8cbbd89e..af510c559057 100644
--- a/components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/internal/constant/ActionMgtSQLConstants.java
+++ b/components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/internal/constant/ActionMgtSQLConstants.java
@@ -42,6 +42,7 @@ public static class Column {
         public static final String ACTION_PROPERTIES_UUID = "ACTION_UUID";
         public static final String ACTION_PROPERTIES_PROPERTY_NAME = "PROPERTY_NAME";
         public static final String ACTION_PROPERTIES_PROPERTY_VALUE = "PROPERTY_VALUE";
+        public static final String ACTION_PROPERTIES_PRIMITIVE_VALUE = "PRIMITIVE_VALUE";
         public static final String TENANT_ID = "TENANT_ID";
 
         private Column() {
@@ -58,11 +59,11 @@ public static class Query {
                 "DESCRIPTION, STATUS, TENANT_ID, VERSION) VALUES (:UUID;, :TYPE;, :NAME;, :DESCRIPTION;, :STATUS;, " +
                 ":TENANT_ID;, :VERSION;)";
         public static final String ADD_ACTION_PROPERTIES = "INSERT INTO IDN_ACTION_PROPERTIES (ACTION_UUID, " +
-                "PROPERTY_NAME, PROPERTY_VALUE, TENANT_ID) VALUES (:ACTION_UUID;, :PROPERTY_NAME;, :PROPERTY_VALUE;, " +
-                ":TENANT_ID;)";
+                "PROPERTY_NAME, PRIMITIVE_VALUE, TENANT_ID) VALUES (:ACTION_UUID;, :PROPERTY_NAME;, " +
+                ":PRIMITIVE_VALUE;, :TENANT_ID;)";
         public static final String GET_ACTION_BASIC_INFO_BY_ID = "SELECT TYPE, NAME, DESCRIPTION, STATUS FROM " +
                 "IDN_ACTION WHERE TYPE = :TYPE; AND UUID = :UUID; AND TENANT_ID = :TENANT_ID;";
-        public static final String GET_ACTION_PROPERTIES_INFO_BY_ID = "SELECT PROPERTY_NAME, PROPERTY_VALUE FROM " +
+        public static final String GET_ACTION_PROPERTIES_INFO_BY_ID = "SELECT PROPERTY_NAME, PRIMITIVE_VALUE FROM " +
                 "IDN_ACTION_PROPERTIES WHERE ACTION_UUID = :ACTION_UUID; AND TENANT_ID = :TENANT_ID;";
         public static final String GET_ACTIONS_BASIC_INFO_BY_ACTION_TYPE = "SELECT UUID, TYPE, NAME, DESCRIPTION," +
                 " STATUS FROM IDN_ACTION WHERE TYPE = :TYPE; AND TENANT_ID = :TENANT_ID;";
@@ -77,9 +78,20 @@ public static class Query {
         public static final String GET_ACTIONS_COUNT_PER_ACTION_TYPE = "SELECT TYPE, COUNT(UUID) AS COUNT" +
                 " FROM IDN_ACTION WHERE TENANT_ID = :TENANT_ID; GROUP BY TYPE";
         public static final String UPDATE_ACTION_PROPERTY = "UPDATE IDN_ACTION_PROPERTIES SET " +
-                "PROPERTY_VALUE = :PROPERTY_VALUE; WHERE ACTION_UUID = :ACTION_UUID; AND " +
+                "PRIMITIVE_VALUE = :PRIMITIVE_VALUE; WHERE ACTION_UUID = :ACTION_UUID; AND " +
                 "TENANT_ID = :TENANT_ID; AND PROPERTY_NAME = :PROPERTY_NAME;";
 
+        //TODO: Adding following queries to support existing schema. Should be removed once the PROPERTY_VALUE column
+        // name to PRIMITIVE_TYPE schema change is deployed.
+        public static final String ADD_ACTION_PROPERTIES_WITH_PROPERTY_VALUE_COLUMN = "INSERT INTO " +
+                "IDN_ACTION_PROPERTIES (ACTION_UUID, PROPERTY_NAME, PROPERTY_VALUE, TENANT_ID) VALUES " +
+                "(:ACTION_UUID;, :PROPERTY_NAME;, :PROPERTY_VALUE;, :TENANT_ID;)";
+        public static final String GET_ACTION_PROPERTIES_INFO_BY_ID_WITH_PROPERTY_VALUE_COLUMN = "SELECT " +
+                "PROPERTY_NAME, PROPERTY_VALUE FROM IDN_ACTION_PROPERTIES WHERE ACTION_UUID = :ACTION_UUID; AND " +
+                "TENANT_ID = :TENANT_ID;";
+        public static final String UPDATE_ACTION_PROPERTY_WITH_PROPERTY_VALUE_COLUMN = "UPDATE IDN_ACTION_PROPERTIES " +
+                "SET PROPERTY_VALUE = :PROPERTY_VALUE; WHERE ACTION_UUID = :ACTION_UUID; AND " +
+                "TENANT_ID = :TENANT_ID; AND PROPERTY_NAME = :PROPERTY_NAME;";
         private Query() {
 
         }
diff --git a/components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/internal/dao/impl/ActionManagementDAOImpl.java b/components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/internal/dao/impl/ActionManagementDAOImpl.java
index 6bdbbbe61720..c26b19a03f6d 100644
--- a/components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/internal/dao/impl/ActionManagementDAOImpl.java
+++ b/components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/internal/dao/impl/ActionManagementDAOImpl.java
@@ -184,7 +184,6 @@ public Map<String, Integer> getActionsCountPerType(Integer tenantId) throws Acti
                                 resultSet.getInt(ActionMgtSQLConstants.Column.ACTION_COUNT));
                         return null;
                     }, statement -> statement.setInt(ActionMgtSQLConstants.Column.TENANT_ID, tenantId)));
-
             return actionTypesCountMap;
         } catch (TransactionException e) {
             throw new ActionMgtServerException("Error while retrieving Actions count per Action Type from the system.",
@@ -581,21 +580,30 @@ private void addActionPropertiesToDB(String actionId, Map<String, String> action
             throws TransactionException {
 
         NamedJdbcTemplate jdbcTemplate = new NamedJdbcTemplate(IdentityDatabaseUtil.getDataSource());
-        jdbcTemplate.withTransaction(template -> {
-            template.executeBatchInsert(ActionMgtSQLConstants.Query.ADD_ACTION_PROPERTIES,
-                    statement -> {
-                        for (Map.Entry<String, String> property : actionProperties.entrySet()) {
-                            statement.setString(ActionMgtSQLConstants.Column.ACTION_PROPERTIES_UUID, actionId);
-                            statement.setInt(ActionMgtSQLConstants.Column.TENANT_ID, tenantId);
-                            statement.setString(ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PROPERTY_NAME,
-                                    property.getKey());
-                            statement.setString(ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PROPERTY_VALUE,
-                                    property.getValue());
-                            statement.addBatch();
-                        }
-                    }, null);
-            return null;
-        });
+        try {
+            boolean primitiveValueColumnExists  = isPrimitiveValueColumnExists();
+            String query = primitiveValueColumnExists ? ActionMgtSQLConstants.Query.ADD_ACTION_PROPERTIES
+                    : ActionMgtSQLConstants.Query.ADD_ACTION_PROPERTIES_WITH_PROPERTY_VALUE_COLUMN;
+            jdbcTemplate.withTransaction(template -> {
+                template.executeBatchInsert(query,
+                        statement -> {
+                            for (Map.Entry<String, String> property : actionProperties.entrySet()) {
+                                statement.setString(ActionMgtSQLConstants.Column.ACTION_PROPERTIES_UUID, actionId);
+                                statement.setInt(ActionMgtSQLConstants.Column.TENANT_ID, tenantId);
+                                statement.setString(ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PROPERTY_NAME,
+                                        property.getKey());
+                                statement.setString(primitiveValueColumnExists ?
+                                                ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PRIMITIVE_VALUE :
+                                                ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PROPERTY_VALUE,
+                                        property.getValue());
+                                statement.addBatch();
+                            }
+                        }, null);
+                return null;
+            });
+        } catch (SQLException e) {
+            throw new TransactionException("Error while adding Action Properties in the system.", e);
+        }
     }
 
     /**
@@ -610,13 +618,19 @@ private Map<String, String> getActionPropertiesFromDB(String actionId, Integer t
 
         NamedJdbcTemplate jdbcTemplate = new NamedJdbcTemplate(IdentityDatabaseUtil.getDataSource());
         Map<String, String> actionEndpointProperties = new HashMap<>();
+
         try {
+            boolean primitiveValueColumnExists = isPrimitiveValueColumnExists();
+            String query = primitiveValueColumnExists ? ActionMgtSQLConstants.Query.GET_ACTION_PROPERTIES_INFO_BY_ID
+                    : ActionMgtSQLConstants.Query.GET_ACTION_PROPERTIES_INFO_BY_ID_WITH_PROPERTY_VALUE_COLUMN;
             jdbcTemplate.withTransaction(template ->
-                template.executeQuery(ActionMgtSQLConstants.Query.GET_ACTION_PROPERTIES_INFO_BY_ID,
+                template.executeQuery(query,
                     (resultSet, rowNumber) -> {
                         actionEndpointProperties.put(
                                 resultSet.getString(ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PROPERTY_NAME),
-                                resultSet.getString(ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PROPERTY_VALUE));
+                                resultSet.getString(primitiveValueColumnExists ?
+                                        ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PRIMITIVE_VALUE :
+                                        ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PROPERTY_VALUE));
                         return null;
                     },
                     statement -> {
@@ -625,7 +639,7 @@ private Map<String, String> getActionPropertiesFromDB(String actionId, Integer t
                 }));
 
             return actionEndpointProperties;
-        } catch (TransactionException e) {
+        } catch (TransactionException | SQLException e) {
             throw new ActionMgtServerException("Error while retrieving Action Properties from the system.", e);
         }
     }
@@ -642,19 +656,28 @@ private void updateActionPropertiesInDB(String actionId, Map<String, String> upd
                                             Integer tenantId) throws TransactionException {
 
         NamedJdbcTemplate jdbcTemplate = new NamedJdbcTemplate(IdentityDatabaseUtil.getDataSource());
-        jdbcTemplate.withTransaction(template ->
-            template.executeBatchInsert(ActionMgtSQLConstants.Query.UPDATE_ACTION_PROPERTY,
-                statement -> {
-                    for (Map.Entry<String, String> property : updatingProperties.entrySet()) {
-                        statement.setString(ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PROPERTY_VALUE,
-                                property.getValue());
-                        statement.setString(ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PROPERTY_NAME,
-                                property.getKey());
-                        statement.setString(ActionMgtSQLConstants.Column.ACTION_PROPERTIES_UUID, actionId);
-                        statement.setInt(ActionMgtSQLConstants.Column.TENANT_ID, tenantId);
-                        statement.addBatch();
-                    }
-                }, null));
+        try {
+            boolean primitiveValueColumnExists = isPrimitiveValueColumnExists();
+            String query = primitiveValueColumnExists ? ActionMgtSQLConstants.Query.UPDATE_ACTION_PROPERTY
+                    : ActionMgtSQLConstants.Query.UPDATE_ACTION_PROPERTY_WITH_PROPERTY_VALUE_COLUMN;
+            jdbcTemplate.withTransaction(template ->
+                    template.executeBatchInsert(query,
+                            statement -> {
+                                for (Map.Entry<String, String> property : updatingProperties.entrySet()) {
+                                    statement.setString(primitiveValueColumnExists ?
+                                                    ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PRIMITIVE_VALUE :
+                                                    ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PROPERTY_VALUE,
+                                            property.getValue());
+                                    statement.setString(ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PROPERTY_NAME,
+                                            property.getKey());
+                                    statement.setString(ActionMgtSQLConstants.Column.ACTION_PROPERTIES_UUID, actionId);
+                                    statement.setInt(ActionMgtSQLConstants.Column.TENANT_ID, tenantId);
+                                    statement.addBatch();
+                                }
+                            }, null));
+        } catch (SQLException  e) {
+            throw new TransactionException("Error while updating Action Properties in the system.", e);
+        }
     }
 
     /**
@@ -714,4 +737,21 @@ private ActionDTO changeActionStatus(String actionType, String actionId, String
             throw new ActionMgtServerException("Error while updating Action Status to " + status, e);
         }
     }
+
+    /**
+     * Check whether the PRITMITIVE_VALUE column exists in IDN_ACTION_PROPERTIES table.
+     * TODO: Remove this temporary method once the column name is changed.
+     *
+     * @return True if the column exists, False otherwise.
+     * @throws SQLException If an error occurs while checking the table existence.
+     */
+    private boolean isPrimitiveValueColumnExists() throws SQLException {
+
+        try (Connection connection = IdentityDatabaseUtil.getDBConnection(false);
+             ResultSet resultSet = connection.getMetaData().getColumns(null, null,
+                     "IDN_ACTION_PROPERTIES", "PRIMITIVE_VALUE")) {
+            return resultSet.next();
+        }
+    }
+
 }


Reviews:
user: login: ashanthamara
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-03T22:10:04Z
user: login: ashanthamara
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-03T22:10:37Z
user: login: ashanthamara
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-03T22:13:10Z
user: login: osandamaleesha
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-04T01:41:34Z
user: login: osandamaleesha
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-04T01:41:43Z
user: login: osandamaleesha
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-04T01:41:55Z
user: login: ashanthamara
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-04T03:25:08Z

Review comments:
diff_hunk: @@ -183,8 +183,8 @@ public Map<String, Integer> getActionsCountPerType(Integer tenantId) throws Acti
                         actionTypesCountMap.put(resultSet.getString(ActionMgtSQLConstants.Column.ACTION_TYPE),
                                 resultSet.getInt(ActionMgtSQLConstants.Column.ACTION_COUNT));
                         return null;
-                    }, statement -> statement.setInt(ActionMgtSQLConstants.Column.TENANT_ID, tenantId)));
-
+                    }, statement -> statement.setInt(ActionMgtSQLConstants.Column.TENANT_ID,
+                                tenantId)));
path: components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/internal/dao/impl/ActionManagementDAOImpl.java
user: login: ashanthamara
body: Hope this change is not required
created_at: 2025-03-03T22:10:04Z
author_association: CONTRIBUTOR
diff_hunk: @@ -308,7 +308,8 @@ private void addEndpoint(ActionDTO actionDTO, Integer tenantId) throws ActionMgt
             endpointProperties.put(URI_PROPERTY, endpoint.getUri());
             endpointProperties.put(AUTHN_TYPE_PROPERTY, endpoint.getAuthentication().getType().name());
             endpoint.getAuthentication().getProperties().forEach(
-                    authProperty -> endpointProperties.put(authProperty.getName(), authProperty.getValue()));
+                    authProperty -> endpointProperties.put(authProperty.getName(),
+                            authProperty.getValue()));
path: components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/internal/dao/impl/ActionManagementDAOImpl.java
user: login: ashanthamara
body: Same as above comment
created_at: 2025-03-03T22:10:36Z
author_association: CONTRIBUTOR
diff_hunk: @@ -606,17 +616,24 @@ private void addActionPropertiesToDB(String actionId, Map<String, String> action
      * @return A map of action properties, including any additional data based on action type.
      * @throws ActionMgtException If an error occurs while retrieving action properties from the database.
      */
-    private Map<String, String> getActionPropertiesFromDB(String actionId, Integer tenantId) throws ActionMgtException {
+    private Map<String, String> getActionPropertiesFromDB(String actionId, Integer tenantId)
+            throws ActionMgtException {
path: components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/internal/dao/impl/ActionManagementDAOImpl.java
user: login: ashanthamara
body: Same as above comment
created_at: 2025-03-03T22:13:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -183,8 +183,8 @@ public Map<String, Integer> getActionsCountPerType(Integer tenantId) throws Acti
                         actionTypesCountMap.put(resultSet.getString(ActionMgtSQLConstants.Column.ACTION_TYPE),
                                 resultSet.getInt(ActionMgtSQLConstants.Column.ACTION_COUNT));
                         return null;
-                    }, statement -> statement.setInt(ActionMgtSQLConstants.Column.TENANT_ID, tenantId)));
-
+                    }, statement -> statement.setInt(ActionMgtSQLConstants.Column.TENANT_ID,
+                                tenantId)));
path: components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/internal/dao/impl/ActionManagementDAOImpl.java
user: login: osandamaleesha
body: Updated in https://github.com/wso2/carbon-identity-framework/pull/6578/commits/90cb2b39a4639ed6d5bde954cd1308634ced4fac
created_at: 2025-03-04T01:41:34Z
author_association: CONTRIBUTOR
diff_hunk: @@ -606,17 +616,24 @@ private void addActionPropertiesToDB(String actionId, Map<String, String> action
      * @return A map of action properties, including any additional data based on action type.
      * @throws ActionMgtException If an error occurs while retrieving action properties from the database.
      */
-    private Map<String, String> getActionPropertiesFromDB(String actionId, Integer tenantId) throws ActionMgtException {
+    private Map<String, String> getActionPropertiesFromDB(String actionId, Integer tenantId)
+            throws ActionMgtException {
path: components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/internal/dao/impl/ActionManagementDAOImpl.java
user: login: osandamaleesha
body: Updated in https://github.com/wso2/carbon-identity-framework/pull/6578/commits/90cb2b39a4639ed6d5bde954cd1308634ced4fac
created_at: 2025-03-04T01:41:43Z
author_association: CONTRIBUTOR
diff_hunk: @@ -308,7 +308,8 @@ private void addEndpoint(ActionDTO actionDTO, Integer tenantId) throws ActionMgt
             endpointProperties.put(URI_PROPERTY, endpoint.getUri());
             endpointProperties.put(AUTHN_TYPE_PROPERTY, endpoint.getAuthentication().getType().name());
             endpoint.getAuthentication().getProperties().forEach(
-                    authProperty -> endpointProperties.put(authProperty.getName(), authProperty.getValue()));
+                    authProperty -> endpointProperties.put(authProperty.getName(),
+                            authProperty.getValue()));
path: components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/internal/dao/impl/ActionManagementDAOImpl.java
user: login: osandamaleesha
body: Updated in https://github.com/wso2/carbon-identity-framework/pull/6578/commits/90cb2b39a4639ed6d5bde954cd1308634ced4fac
created_at: 2025-03-04T01:41:55Z
author_association: CONTRIBUTOR

PR comments:
user: login: codecov[bot]
created_at: 2025-03-03T17:55:45Z
body: ## [Codecov](https://app.codecov.io/gh/wso2/carbon-identity-framework/pull/6578?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=wso2) Report
Attention: Patch coverage is `73.07692%` with `14 lines` in your changes missing coverage. Please review.
> Project coverage is 47.12%. Comparing base [(`e08010e`)](https://app.codecov.io/gh/wso2/carbon-identity-framework/commit/e08010e8e3ec3a0a3ba91a358b5f8e3074e53066?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=wso2) to head [(`90cb2b3`)](https://app.codecov.io/gh/wso2/carbon-identity-framework/commit/90cb2b39a4639ed6d5bde954cd1308634ced4fac?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=wso2).
> Report is 15 commits behind head on master.

| [Files with missing lines](https://app.codecov.io/gh/wso2/carbon-identity-framework/pull/6578?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=wso2) | Patch % | Lines |
|---|---|---|
| [...ent/internal/dao/impl/ActionManagementDAOImpl.java](https://app.codecov.io/gh/wso2/carbon-identity-framework/pull/6578?src=pr&el=tree&filepath=components%2Faction-mgt%2Forg.wso2.carbon.identity.action.management%2Fsrc%2Fmain%2Fjava%2Forg%2Fwso2%2Fcarbon%2Fidentity%2Faction%2Fmanagement%2Finternal%2Fdao%2Fimpl%2FActionManagementDAOImpl.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=wso2#diff-Y29tcG9uZW50cy9hY3Rpb24tbWd0L29yZy53c28yLmNhcmJvbi5pZGVudGl0eS5hY3Rpb24ubWFuYWdlbWVudC9zcmMvbWFpbi9qYXZhL29yZy93c28yL2NhcmJvbi9pZGVudGl0eS9hY3Rpb24vbWFuYWdlbWVudC9pbnRlcm5hbC9kYW8vaW1wbC9BY3Rpb25NYW5hZ2VtZW50REFPSW1wbC5qYXZh) | 73.07% | [8 Missing and 6 partials :warning: ](https://app.codecov.io/gh/wso2/carbon-identity-framework/pull/6578?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=wso2) |

<details><summary>Additional details and impacted files</summary>


```diff
@@             Coverage Diff              @@
##             master    #6578      +/-   ##
============================================
- Coverage     47.15%   47.12%   -0.03%     
+ Complexity    15561    15504      -57     
============================================
  Files          1779     1779              
  Lines        106913   107030     +117     
  Branches      20201    20222      +21     
============================================
+ Hits          50411    50440      +29     
- Misses        49427    49502      +75     
- Partials       7075     7088      +13     
```

| [Flag](https://app.codecov.io/gh/wso2/carbon-identity-framework/pull/6578/flags?src=pr&el=flags&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=wso2) | Coverage Δ | |
|---|---|---|
| [unit](https://app.codecov.io/gh/wso2/carbon-identity-framework/pull/6578/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=wso2) | `31.02% <73.07%> (+<0.01%)` | :arrow_up: |

Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=wso2#carryforward-flags-in-the-pull-request-comment) to find out more.

</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/wso2/carbon-identity-framework/pull/6578?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=wso2).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=wso2).

author_association: NONE
user: login: jenkins-is-staging
created_at: 2025-03-03T22:14:50Z
body: PR builder started 
Link: https://github.com/wso2/product-is/actions/runs/13641504204
author_association: NONE
user: login: jenkins-is-staging
created_at: 2025-03-04T00:10:27Z
body: PR builder completed 
Link: https://github.com/wso2/product-is/actions/runs/13641504204 
Status: **failure**
author_association: NONE
user: login: sonarqubecloud[bot]
created_at: 2025-03-04T01:43:31Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=wso2_carbon-identity-framework&pullRequest=6578) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [2 New issues](https://sonarcloud.io/project/issues?id=wso2_carbon-identity-framework&pullRequest=6578&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=wso2_carbon-identity-framework&pullRequest=6578&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=wso2_carbon-identity-framework&pullRequest=6578&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=wso2_carbon-identity-framework&pullRequest=6578&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=wso2_carbon-identity-framework&pullRequest=6578&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=wso2_carbon-identity-framework&pullRequest=6578)


author_association: NONE
user: login: osandamaleesha
created_at: 2025-03-04T03:35:48Z
body: > PR builder completed Link: https://github.com/wso2/product-is/actions/runs/13641504204 Status: **failure**

Integration test failures are intermittent and not relevant to the changes
author_association: CONTRIBUTOR