From 9affd23088ab02d3e6ead66bcb482b2ea30bab11 Mon Sep 17 00:00:00 2001 From: BojithaPiyathilake Date: Thu, 26 May 2022 14:15:48 +0530 Subject: [PATCH 1/3] Adjusting pre and post listeners for get user with ID when using cursor pagination --- .../listener/IdentityMgtEventListener.java | 53 ++++++++ .../listener/IdentityStoreEventListener.java | 34 +++++ .../store/JDBCIdentityDataStore.java | 118 ++++++++++++++++-- .../store/UserIdentityDataStore.java | 22 ++++ 4 files changed, 214 insertions(+), 13 deletions(-) diff --git a/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/listener/IdentityMgtEventListener.java b/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/listener/IdentityMgtEventListener.java index dbb555be6b..6099ad9a7a 100644 --- a/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/listener/IdentityMgtEventListener.java +++ b/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/listener/IdentityMgtEventListener.java @@ -833,6 +833,32 @@ public boolean doPreGetUserListWithID(Condition condition, String domain, String return true; } + @Override + public boolean doPreGetUserListWithID(Condition condition, String domain, String profileName, int limit, + String cursor, String direction, String sortBy, String sortOrder, UserStoreManager userStoreManager) + throws UserStoreException { + + if (!isEnable()) { + return true; + } + if (log.isDebugEnabled()) { + log.debug("pre get user user list condition with id is called in IdentityMgtEventListener"); + } + String eventName = IdentityEventConstants.Event.PRE_GET_USER_LIST_CONDITION_WITH_ID; + HashMap properties = new HashMap<>(); + properties.put(IdentityEventConstants.EventProperty.CONDITION, condition); + properties.put(IdentityEventConstants.EventProperty.USER_STORE_DOMAIN, domain); + properties.put(IdentityEventConstants.EventProperty.PROFILE_NAME, profileName); + properties.put(IdentityEventConstants.EventProperty.LIMIT, limit); + properties.put(IdentityEventConstants.EventProperty.CURSOR, cursor); + properties.put(IdentityEventConstants.EventProperty.DIRECTION, direction); + properties.put(IdentityEventConstants.EventProperty.SORT_BY, sortBy); + properties.put(IdentityEventConstants.EventProperty.SORT_ORDER, sortOrder); + + handleEvent(eventName, properties, userStoreManager); + return true; + } + @Override public boolean doPreGetUserListWithID(String claimUri, String claimValue, int limit, int offset, final List returnUsersList, UserStoreManager userStoreManager) throws UserStoreException { @@ -922,6 +948,33 @@ public boolean doPostGetUserListWithID(Condition condition, String domain, Strin return true; } + @Override + public boolean doPostGetUserListWithID(Condition condition, String domain, String profileName, int limit, + String cursor, String direction, String sortBy, String sortOrder, + List users, UserStoreManager userStoreManager) + throws UserStoreException { + + if (!isEnable()) { + return true; + } + if (log.isDebugEnabled()) { + log.debug("post get user user list condition with id is called in IdentityMgtEventListener"); + } + String eventName = IdentityEventConstants.Event.POST_GET_USER_LIST_CONDITION_WITH_ID; + HashMap properties = new HashMap<>(); + properties.put(IdentityEventConstants.EventProperty.CONDITION, condition); + properties.put(IdentityEventConstants.EventProperty.USER_STORE_DOMAIN, domain); + properties.put(IdentityEventConstants.EventProperty.PROFILE_NAME, profileName); + properties.put(IdentityEventConstants.EventProperty.LIMIT, limit); + properties.put(IdentityEventConstants.EventProperty.CURSOR, cursor); + properties.put(IdentityEventConstants.EventProperty.DIRECTION, direction); + properties.put(IdentityEventConstants.EventProperty.SORT_BY, sortBy); + properties.put(IdentityEventConstants.EventProperty.SORT_ORDER, sortOrder); + + handleEvent(eventName, properties, userStoreManager); + return true; + } + @Override public boolean doPreGetUserWithID(String userID, String[] requestedClaims, String profileName, UserStoreManager userStoreManager) throws UserStoreException { diff --git a/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/listener/IdentityStoreEventListener.java b/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/listener/IdentityStoreEventListener.java index ca4f7270cb..7048000e7d 100644 --- a/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/listener/IdentityStoreEventListener.java +++ b/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/listener/IdentityStoreEventListener.java @@ -486,6 +486,11 @@ public boolean doPreGetPaginatedUserList(Condition condition, List ident return true; } + // No need to separately handle if identity data store is user store based. + if (identityDataStore instanceof UserStoreBasedIdentityDataStore) { + return true; + } + List identityClaimFilterConditions = new ArrayList<>(); try { // Extract identity Claim filter-conditions from the given conditions. @@ -501,6 +506,35 @@ public boolean doPreGetPaginatedUserList(Condition condition, List ident return true; } + public boolean doPreGetPaginatedUserList(Condition condition, List identityClaimFilteredUserNames, + String domain, UserStoreManager userStoreManager, int limit, String cursor, + String direction) + throws UserStoreException { + + if (!isEnable()) { + return true; + } + + // No need to separately handle if identity data store is user store based. + if (identityDataStore instanceof UserStoreBasedIdentityDataStore) { + return true; + } + + List identityClaimFilterConditions = new ArrayList<>(); + try { + // Extract identity Claim filter-conditions from the given conditions. + extractIdentityClaimFilterConditions(condition, identityClaimFilterConditions); + if (!identityClaimFilterConditions.isEmpty()) { + identityDataStore.listPaginatedUsersNames(identityClaimFilterConditions, identityClaimFilteredUserNames, + domain, userStoreManager, limit, cursor, direction); + } + } catch (IdentityException e) { + throw new UserStoreException("Error while listing the users for identity claim filters with pagination " + + "parameters.", e); + } + return true; + } + private void extractIdentityClaimFilterConditions(Condition condition, List expressionConditions) { diff --git a/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/store/JDBCIdentityDataStore.java b/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/store/JDBCIdentityDataStore.java index 028f293543..ab9e7906ea 100644 --- a/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/store/JDBCIdentityDataStore.java +++ b/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/store/JDBCIdentityDataStore.java @@ -351,8 +351,8 @@ public List listPaginatedUsersNames(List identityCl offset = offset - 1; } - SqlBuilder sqlBuilder = getQueryString(identityClaimFilterExpressionConditions, limit, offset, domain, - tenantId, dBType); + SqlBuilder sqlBuilder = getQueryString(identityClaimFilterExpressionConditions, limit, offset, + null, null, domain, tenantId, dBType); String fullQuery = sqlBuilder.getQuery(); int startIndex = 0; @@ -387,6 +387,56 @@ public List listPaginatedUsersNames(List identityCl } } + @Override + public List listPaginatedUsersNames(List identityClaimFilterExpressionConditions, + List identityClaimFilteredUserNames, String domain, + org.wso2.carbon.user.core.UserStoreManager userStoreManager, + int limit, String cursor, String direction) throws IdentityException { + + try { + int tenantId = userStoreManager.getTenantId(); + + try (Connection connection = IdentityDatabaseUtil.getDBConnection()) { + + // Based on the DB Type might need to extend support. + String dBType = DatabaseCreator.getDatabaseType(connection); + + SqlBuilder sqlBuilder = getQueryString(identityClaimFilterExpressionConditions, limit, null, + cursor, direction, domain, tenantId, dBType); + + String fullQuery = sqlBuilder.getQuery(); + int startIndex = 0; + int endIndex = 0; + int occurrence = StringUtils.countMatches(fullQuery, QUERY_BINDING_SYMBOL); + endIndex = endIndex + occurrence; + + try (PreparedStatement preparedStatement = connection.prepareStatement(fullQuery)) { + + populatePrepareStatement(sqlBuilder, preparedStatement, startIndex, endIndex); + try (ResultSet resultSet = preparedStatement.executeQuery()) { + while (resultSet.next()) { + identityClaimFilteredUserNames.add(resultSet.getString("USER_NAME")); + } + IdentityDatabaseUtil.commitTransaction(connection); + } catch (SQLException e) { + if (log.isDebugEnabled()) { + log.debug("Error occurred while retrieving users from Identity Store for " + domain + + "with limit " + limit + "and cursor " + cursor, e); + } + IdentityDatabaseUtil.rollbackTransaction(connection); + } + } catch (SQLException e) { + throw new IdentityException("Error occurred while retrieving users from Identity Store.", e); + } + return identityClaimFilteredUserNames; + } catch (Exception e) { + throw new IdentityException("Error occurred while retrieving users from Identity Store.", e); + } + } catch (org.wso2.carbon.user.core.UserStoreException e) { + throw new IdentityException("Error occurred while retrieving users.", e); + } + } + private void populatePrepareStatement(SqlBuilder sqlBuilder, PreparedStatement prepStmt, int startIndex, int endIndex) throws SQLException { @@ -429,7 +479,8 @@ private void populatePrepareStatement(SqlBuilder sqlBuilder, PreparedStatement p } private SqlBuilder getQueryString(List identityClaimFilterExpressionConditions, - int limit, int offset, String userStoreDomain, int tenantID, String dbType) { + int limit, Integer offset, String cursor, String direction, + String userStoreDomain, int tenantID, String dbType) { boolean hitClaimFilter = false; String userNameWithDomain; @@ -445,7 +496,25 @@ private SqlBuilder getQueryString(List identityClaimFilterE userStoreDomain.toUpperCase() + UserCoreConstants.DOMAIN_SEPARATOR + SQL_FILTER_STRING_ANY; sqlBuilder.where(" USER_NAME LIKE ? ", userNameWithDomain); } - + if (cursor != null) { + if (UserCoreConstants.PREVIOUS.equals(direction)) { + if (StringUtils.equalsIgnoreCase(userStoreDomain, UserCoreConstants.PRIMARY_DEFAULT_DOMAIN_NAME)) { + sqlBuilder.where("USER_NAME < ?", cursor); + } else { + //h2 databases store users in a secondary user store as DOMAIN/USER_NAME + String userDomain = userStoreDomain.toUpperCase() + UserCoreConstants.DOMAIN_SEPARATOR; + sqlBuilder.where("USER_NAME < ?", userDomain + cursor); + } + } else { + if (StringUtils.equalsIgnoreCase(userStoreDomain, UserCoreConstants.PRIMARY_DEFAULT_DOMAIN_NAME)) { + sqlBuilder.where("USER_NAME > ?", cursor); + } else { + //h2 databases store users in a secondary user store as DOMAIN/USER_NAME + String userDomain = userStoreDomain.toUpperCase() + UserCoreConstants.DOMAIN_SEPARATOR; + sqlBuilder.where("USER_NAME > ?", userDomain + cursor); + } + } + } SqlBuilder header = new SqlBuilder(new StringBuilder(sqlBuilder.getSql())); addingWheres(sqlBuilder, header); @@ -463,16 +532,39 @@ private SqlBuilder getQueryString(List identityClaimFilterE hitClaimFilter = true; } - if (DB2.equals(dbType)) { - sqlBuilder.setTail(" ORDER BY USER_NAME LIMIT ? , ? ", limit, offset); - } else if (MSSQL.equals(dbType)) { - sqlBuilder.setTail(" ORDER BY USER_NAME OFFSET ? ROWS FETCH NEXT ? ROWS ONLY ", offset, limit); - } else if (ORACLE.equals(dbType)) { - sqlBuilder.setTail(" ORDER BY USER_NAME OFFSET ? ROWS FETCH NEXT ? ROWS ONLY ", offset, limit); - } else if (POSTGRE_SQL.equals(dbType)) { - sqlBuilder.setTail(" ORDER BY USER_NAME OFFSET ? ROWS FETCH NEXT ? ROWS ONLY ", offset, limit); + if (UserCoreConstants.PREVIOUS.equals(direction)) { + sqlBuilder.prependSql("SELECT * FROM ( "); + } + + if (cursor != null) { + if (DB2.equals(dbType)) { + sqlBuilder.setTail(" ORDER BY USER_NAME LIMIT ?", limit); + } else if (MSSQL.equals(dbType)) { + sqlBuilder.setTail(" ORDER BY USER_NAME ROWS FETCH NEXT ? ROWS ONLY ", limit); + } else if (ORACLE.equals(dbType)) { + sqlBuilder.setTail(" ORDER BY USER_NAME ROWS FETCH NEXT ? ROWS ONLY ", limit); + } else if (POSTGRE_SQL.equals(dbType)) { + sqlBuilder.setTail(" ORDER BY USER_NAME ROWS FETCH NEXT ? ROWS ONLY ", limit); + } else { + if (UserCoreConstants.PREVIOUS.equals(direction)) { + sqlBuilder.setTail(" ORDER BY USER_NAME DESC LIMIT ? ) AS results ORDER BY " + + "results.USER_NAME ASC;", limit); + } else { + sqlBuilder.setTail(" ORDER BY USER_NAME ASC LIMIT ?", limit); + } + } } else { - sqlBuilder.setTail(" ORDER BY USER_NAME ASC LIMIT ? OFFSET ?", limit, offset); + if (DB2.equals(dbType)) { + sqlBuilder.setTail(" ORDER BY USER_NAME LIMIT ? , ? ", limit, offset); + } else if (MSSQL.equals(dbType)) { + sqlBuilder.setTail(" ORDER BY USER_NAME OFFSET ? ROWS FETCH NEXT ? ROWS ONLY ", offset, limit); + } else if (ORACLE.equals(dbType)) { + sqlBuilder.setTail(" ORDER BY USER_NAME OFFSET ? ROWS FETCH NEXT ? ROWS ONLY ", offset, limit); + } else if (POSTGRE_SQL.equals(dbType)) { + sqlBuilder.setTail(" ORDER BY USER_NAME OFFSET ? ROWS FETCH NEXT ? ROWS ONLY ", offset, limit); + } else { + sqlBuilder.setTail(" ORDER BY USER_NAME ASC LIMIT ? OFFSET ?", limit, offset); + } } return sqlBuilder; diff --git a/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/store/UserIdentityDataStore.java b/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/store/UserIdentityDataStore.java index 7a8a59a24f..0950206f4c 100644 --- a/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/store/UserIdentityDataStore.java +++ b/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/store/UserIdentityDataStore.java @@ -113,4 +113,26 @@ public List listPaginatedUsersNames(List expression // Return an immutable empty list if sub classes do not have any overrides. return Collections.emptyList(); } + + /** + * List users according to the given claim URI and value and pagination parameters. + * + * @param expressionConditions List of expression conditions. + * @param identityClaimFilteredUserNames List to hold filtered usernames. + * @param domain Userstore domain + * @param userStoreManager UserStoreManager instance. + * @param limit Number of users to return + * @param cursor Cursor value for cursor-based pagination + * @param direction Direction of pagination + * @return List of usernames. + * @throws IdentityException Identity Exception. + */ + public List listPaginatedUsersNames(List expressionConditions, + List identityClaimFilteredUserNames, String domain, + org.wso2.carbon.user.core.UserStoreManager userStoreManager, int limit, String cursor, + String direction) throws IdentityException { + + // Return an immutable empty list if sub classes do not have any overrides. + return Collections.emptyList(); + } } From 168b97a14ceaf562a864f88fc43be3b91843c528 Mon Sep 17 00:00:00 2001 From: BojithaPiyathilake Date: Fri, 17 Jun 2022 15:31:21 +0530 Subject: [PATCH 2/3] Adding cursor pagination for Oracle, DB2, MSSQL when identity claims are stored in a separate identity store --- .../store/JDBCIdentityDataStore.java | 65 ++++++++++--------- 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/store/JDBCIdentityDataStore.java b/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/store/JDBCIdentityDataStore.java index ab9e7906ea..e3ea15b127 100644 --- a/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/store/JDBCIdentityDataStore.java +++ b/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/store/JDBCIdentityDataStore.java @@ -395,23 +395,17 @@ public List listPaginatedUsersNames(List identityCl try { int tenantId = userStoreManager.getTenantId(); - try (Connection connection = IdentityDatabaseUtil.getDBConnection()) { - // Based on the DB Type might need to extend support. String dBType = DatabaseCreator.getDatabaseType(connection); - SqlBuilder sqlBuilder = getQueryString(identityClaimFilterExpressionConditions, limit, null, cursor, direction, domain, tenantId, dBType); - String fullQuery = sqlBuilder.getQuery(); int startIndex = 0; int endIndex = 0; int occurrence = StringUtils.countMatches(fullQuery, QUERY_BINDING_SYMBOL); endIndex = endIndex + occurrence; - try (PreparedStatement preparedStatement = connection.prepareStatement(fullQuery)) { - populatePrepareStatement(sqlBuilder, preparedStatement, startIndex, endIndex); try (ResultSet resultSet = preparedStatement.executeQuery()) { while (resultSet.next()) { @@ -501,18 +495,18 @@ private SqlBuilder getQueryString(List identityClaimFilterE if (StringUtils.equalsIgnoreCase(userStoreDomain, UserCoreConstants.PRIMARY_DEFAULT_DOMAIN_NAME)) { sqlBuilder.where("USER_NAME < ?", cursor); } else { - //h2 databases store users in a secondary user store as DOMAIN/USER_NAME + //Identity datastores store users in a secondary user store as DOMAIN/USER_NAME String userDomain = userStoreDomain.toUpperCase() + UserCoreConstants.DOMAIN_SEPARATOR; sqlBuilder.where("USER_NAME < ?", userDomain + cursor); } } else { - if (StringUtils.equalsIgnoreCase(userStoreDomain, UserCoreConstants.PRIMARY_DEFAULT_DOMAIN_NAME)) { - sqlBuilder.where("USER_NAME > ?", cursor); - } else { - //h2 databases store users in a secondary user store as DOMAIN/USER_NAME - String userDomain = userStoreDomain.toUpperCase() + UserCoreConstants.DOMAIN_SEPARATOR; - sqlBuilder.where("USER_NAME > ?", userDomain + cursor); - } + if (StringUtils.equalsIgnoreCase(userStoreDomain, UserCoreConstants.PRIMARY_DEFAULT_DOMAIN_NAME)) { + sqlBuilder.where("USER_NAME > ?", cursor); + } else { + //Identity datastores store users in a secondary user store as DOMAIN/USER_NAME + String userDomain = userStoreDomain.toUpperCase() + UserCoreConstants.DOMAIN_SEPARATOR; + sqlBuilder.where("USER_NAME > ?", userDomain + cursor); + } } } SqlBuilder header = new SqlBuilder(new StringBuilder(sqlBuilder.getSql())); @@ -532,41 +526,52 @@ private SqlBuilder getQueryString(List identityClaimFilterE hitClaimFilter = true; } + // SQL to cover the whole query and reverse the result when querying for the previous page which will be in + // DESC order. if (UserCoreConstants.PREVIOUS.equals(direction)) { sqlBuilder.prependSql("SELECT * FROM ( "); } if (cursor != null) { if (DB2.equals(dbType)) { - sqlBuilder.setTail(" ORDER BY USER_NAME LIMIT ?", limit); + if (UserCoreConstants.PREVIOUS.equals(direction)) { + sqlBuilder.setTail(" ORDER BY USER_NAME DESC LIMIT ? " + + ") AS results ORDER BY results.USER_NAME ASC", limit); + } else { + sqlBuilder.setTail(" ORDER BY USER_NAME LIMIT ?", limit); + } + } else if (ORACLE.equals(dbType) || POSTGRE_SQL.equals(dbType)) { + if (UserCoreConstants.PREVIOUS.equals(direction)) { + sqlBuilder.setTail(" ORDER BY USER_NAME DESC FETCH NEXT ? ROWS ONLY" + + ") results ORDER BY results.USER_NAME ASC", limit); + } else { + sqlBuilder.setTail(" ORDER BY USER_NAME FETCH NEXT ? ROWS ONLY", limit); + } } else if (MSSQL.equals(dbType)) { - sqlBuilder.setTail(" ORDER BY USER_NAME ROWS FETCH NEXT ? ROWS ONLY ", limit); - } else if (ORACLE.equals(dbType)) { - sqlBuilder.setTail(" ORDER BY USER_NAME ROWS FETCH NEXT ? ROWS ONLY ", limit); - } else if (POSTGRE_SQL.equals(dbType)) { - sqlBuilder.setTail(" ORDER BY USER_NAME ROWS FETCH NEXT ? ROWS ONLY ", limit); + // Even with cursor pagination we must use the OFFSET keyword as it is compulsory to LIMIT rows in MSSQL + if (UserCoreConstants.PREVIOUS.equals(direction)) { + sqlBuilder.setTail(" ORDER BY USER_NAME DESC OFFSET 0 ROWS FETCH NEXT ? ROWS ONLY" + + ") AS results ORDER BY results.USER_NAME ASC", limit); + } else { + sqlBuilder.setTail(" ORDER BY USER_NAME OFFSET 0 ROWS FETCH NEXT ? ROWS ONLY", limit); + } } else { if (UserCoreConstants.PREVIOUS.equals(direction)) { - sqlBuilder.setTail(" ORDER BY USER_NAME DESC LIMIT ? ) AS results ORDER BY " + - "results.USER_NAME ASC;", limit); + sqlBuilder.setTail(" ORDER BY USER_NAME DESC LIMIT ? " + + ") AS results ORDER BY results.USER_NAME ASC;", limit); } else { sqlBuilder.setTail(" ORDER BY USER_NAME ASC LIMIT ?", limit); } } } else { if (DB2.equals(dbType)) { - sqlBuilder.setTail(" ORDER BY USER_NAME LIMIT ? , ? ", limit, offset); - } else if (MSSQL.equals(dbType)) { - sqlBuilder.setTail(" ORDER BY USER_NAME OFFSET ? ROWS FETCH NEXT ? ROWS ONLY ", offset, limit); - } else if (ORACLE.equals(dbType)) { + sqlBuilder.setTail(" ORDER BY USER_NAME LIMIT ? , ? ", offset, limit); + } else if (MSSQL.equals(dbType) || ORACLE.equals(dbType) || POSTGRE_SQL.equals(dbType)) { sqlBuilder.setTail(" ORDER BY USER_NAME OFFSET ? ROWS FETCH NEXT ? ROWS ONLY ", offset, limit); - } else if (POSTGRE_SQL.equals(dbType)) { - sqlBuilder.setTail(" ORDER BY USER_NAME OFFSET ? ROWS FETCH NEXT ? ROWS ONLY ", offset, limit); - } else { + } else { sqlBuilder.setTail(" ORDER BY USER_NAME ASC LIMIT ? OFFSET ?", limit, offset); } } - return sqlBuilder; } From 710b29635b2ad5a650bb34a3d033ecaac4b16b8c Mon Sep 17 00:00:00 2001 From: BojithaPiyathilake Date: Fri, 8 Jul 2022 21:15:00 +0530 Subject: [PATCH 3/3] Changing the type of direction attribute to enum --- .../listener/IdentityMgtEventListener.java | 7 +++--- .../listener/IdentityStoreEventListener.java | 2 +- .../store/JDBCIdentityDataStore.java | 23 ++++++++++--------- .../store/UserIdentityDataStore.java | 2 +- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/listener/IdentityMgtEventListener.java b/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/listener/IdentityMgtEventListener.java index 6099ad9a7a..016dcd7ccf 100644 --- a/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/listener/IdentityMgtEventListener.java +++ b/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/listener/IdentityMgtEventListener.java @@ -835,7 +835,8 @@ public boolean doPreGetUserListWithID(Condition condition, String domain, String @Override public boolean doPreGetUserListWithID(Condition condition, String domain, String profileName, int limit, - String cursor, String direction, String sortBy, String sortOrder, UserStoreManager userStoreManager) + String cursor, UserCoreConstants.PaginationDirection direction, String sortBy, String sortOrder, + UserStoreManager userStoreManager) throws UserStoreException { if (!isEnable()) { @@ -950,8 +951,8 @@ public boolean doPostGetUserListWithID(Condition condition, String domain, Strin @Override public boolean doPostGetUserListWithID(Condition condition, String domain, String profileName, int limit, - String cursor, String direction, String sortBy, String sortOrder, - List users, UserStoreManager userStoreManager) + String cursor, UserCoreConstants.PaginationDirection direction, String sortBy, String sortOrder, + List users, UserStoreManager userStoreManager) throws UserStoreException { if (!isEnable()) { diff --git a/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/listener/IdentityStoreEventListener.java b/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/listener/IdentityStoreEventListener.java index 7048000e7d..60d3bbfb8e 100644 --- a/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/listener/IdentityStoreEventListener.java +++ b/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/listener/IdentityStoreEventListener.java @@ -508,7 +508,7 @@ public boolean doPreGetPaginatedUserList(Condition condition, List ident public boolean doPreGetPaginatedUserList(Condition condition, List identityClaimFilteredUserNames, String domain, UserStoreManager userStoreManager, int limit, String cursor, - String direction) + UserCoreConstants.PaginationDirection direction) throws UserStoreException { if (!isEnable()) { diff --git a/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/store/JDBCIdentityDataStore.java b/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/store/JDBCIdentityDataStore.java index e3ea15b127..ec8f5ca5e6 100644 --- a/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/store/JDBCIdentityDataStore.java +++ b/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/store/JDBCIdentityDataStore.java @@ -389,9 +389,10 @@ public List listPaginatedUsersNames(List identityCl @Override public List listPaginatedUsersNames(List identityClaimFilterExpressionConditions, - List identityClaimFilteredUserNames, String domain, - org.wso2.carbon.user.core.UserStoreManager userStoreManager, - int limit, String cursor, String direction) throws IdentityException { + List identityClaimFilteredUserNames, String domain, + org.wso2.carbon.user.core.UserStoreManager userStoreManager, + int limit, String cursor, UserCoreConstants.PaginationDirection direction) + throws IdentityException { try { int tenantId = userStoreManager.getTenantId(); @@ -473,8 +474,8 @@ private void populatePrepareStatement(SqlBuilder sqlBuilder, PreparedStatement p } private SqlBuilder getQueryString(List identityClaimFilterExpressionConditions, - int limit, Integer offset, String cursor, String direction, - String userStoreDomain, int tenantID, String dbType) { + int limit, Integer offset, String cursor, UserCoreConstants.PaginationDirection direction, + String userStoreDomain, int tenantID, String dbType) { boolean hitClaimFilter = false; String userNameWithDomain; @@ -491,7 +492,7 @@ private SqlBuilder getQueryString(List identityClaimFilterE sqlBuilder.where(" USER_NAME LIKE ? ", userNameWithDomain); } if (cursor != null) { - if (UserCoreConstants.PREVIOUS.equals(direction)) { + if (UserCoreConstants.PaginationDirection.PREVIOUS == direction) { if (StringUtils.equalsIgnoreCase(userStoreDomain, UserCoreConstants.PRIMARY_DEFAULT_DOMAIN_NAME)) { sqlBuilder.where("USER_NAME < ?", cursor); } else { @@ -528,20 +529,20 @@ private SqlBuilder getQueryString(List identityClaimFilterE // SQL to cover the whole query and reverse the result when querying for the previous page which will be in // DESC order. - if (UserCoreConstants.PREVIOUS.equals(direction)) { + if (UserCoreConstants.PaginationDirection.PREVIOUS == direction) { sqlBuilder.prependSql("SELECT * FROM ( "); } if (cursor != null) { if (DB2.equals(dbType)) { - if (UserCoreConstants.PREVIOUS.equals(direction)) { + if (UserCoreConstants.PaginationDirection.PREVIOUS == direction) { sqlBuilder.setTail(" ORDER BY USER_NAME DESC LIMIT ? " + ") AS results ORDER BY results.USER_NAME ASC", limit); } else { sqlBuilder.setTail(" ORDER BY USER_NAME LIMIT ?", limit); } } else if (ORACLE.equals(dbType) || POSTGRE_SQL.equals(dbType)) { - if (UserCoreConstants.PREVIOUS.equals(direction)) { + if (UserCoreConstants.PaginationDirection.PREVIOUS == direction) { sqlBuilder.setTail(" ORDER BY USER_NAME DESC FETCH NEXT ? ROWS ONLY" + ") results ORDER BY results.USER_NAME ASC", limit); } else { @@ -549,14 +550,14 @@ private SqlBuilder getQueryString(List identityClaimFilterE } } else if (MSSQL.equals(dbType)) { // Even with cursor pagination we must use the OFFSET keyword as it is compulsory to LIMIT rows in MSSQL - if (UserCoreConstants.PREVIOUS.equals(direction)) { + if (UserCoreConstants.PaginationDirection.PREVIOUS == direction) { sqlBuilder.setTail(" ORDER BY USER_NAME DESC OFFSET 0 ROWS FETCH NEXT ? ROWS ONLY" + ") AS results ORDER BY results.USER_NAME ASC", limit); } else { sqlBuilder.setTail(" ORDER BY USER_NAME OFFSET 0 ROWS FETCH NEXT ? ROWS ONLY", limit); } } else { - if (UserCoreConstants.PREVIOUS.equals(direction)) { + if (UserCoreConstants.PaginationDirection.PREVIOUS == direction) { sqlBuilder.setTail(" ORDER BY USER_NAME DESC LIMIT ? " + ") AS results ORDER BY results.USER_NAME ASC;", limit); } else { diff --git a/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/store/UserIdentityDataStore.java b/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/store/UserIdentityDataStore.java index 0950206f4c..4d5564b4e0 100644 --- a/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/store/UserIdentityDataStore.java +++ b/components/org.wso2.carbon.identity.governance/src/main/java/org/wso2/carbon/identity/governance/store/UserIdentityDataStore.java @@ -130,7 +130,7 @@ public List listPaginatedUsersNames(List expression public List listPaginatedUsersNames(List expressionConditions, List identityClaimFilteredUserNames, String domain, org.wso2.carbon.user.core.UserStoreManager userStoreManager, int limit, String cursor, - String direction) throws IdentityException { + UserCoreConstants.PaginationDirection direction) throws IdentityException { // Return an immutable empty list if sub classes do not have any overrides. return Collections.emptyList();