From a6dcdc801c0b40293d731f3ae8fb141405a5cb07 Mon Sep 17 00:00:00 2001 From: JeethJJ Date: Mon, 14 Oct 2024 17:53:38 +0530 Subject: [PATCH 1/4] Introduce excludeSystemPortals API query param and following implementation. Introduce systemPortals server level config and implementation to exclude the mentioned systemPortals in get applications api response. --- .../application/mgt/ApplicationConstants.java | 1 + .../mgt/ApplicationManagementService.java | 8 + .../mgt/ApplicationManagementServiceImpl.java | 42 ++++- .../ApplicationPaginationAndSearching.java | 33 ++++ .../PaginatableFilterableApplicationDAO.java | 44 ++++++ .../mgt/dao/impl/ApplicationDAOImpl.java | 143 +++++++++++++++--- .../mgt/dao/impl/ApplicationMgtDBQueries.java | 31 ++-- .../dao/impl/CacheBackedApplicationDAO.java | 28 +++- .../resources/identity.xml.j2 | 9 ++ ....identity.core.server.feature.default.json | 4 +- 10 files changed, 302 insertions(+), 41 deletions(-) diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationConstants.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationConstants.java index 2bca40c45d54..4f66e96615ea 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationConstants.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationConstants.java @@ -126,6 +126,7 @@ private ApplicationConstants() { public static final String MYACCOUNT_PORTAL_PATH = "MyAccount.AppBaseName"; public static final String AUTHORIZE_ALL_SCOPES = "OAuth.AuthorizeAllScopes"; public static final String RBAC = "RBAC"; + public static final String SYSTEM_PORTALS = "SystemPortals"; /** * Group the constants related to logs. diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementService.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementService.java index a7ec04826b33..8fd2cb30307d 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementService.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementService.java @@ -471,6 +471,14 @@ public ApplicationBasicInfo[] getApplicationBasicInfo(String tenantDomain, Strin int offset, int limit) throws IdentityApplicationManagementException { + return getApplicationBasicInfo(tenantDomain, username, filter, offset, limit, false); + } + + @Override + public ApplicationBasicInfo[] getApplicationBasicInfo(String tenantDomain, String username, String filter, + int offset, int limit, Boolean excludeSystemPortals) + throws IdentityApplicationManagementException { + return new ApplicationBasicInfo[0]; } diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImpl.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImpl.java index 4fc26ee37c33..ca0eafdeac70 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImpl.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImpl.java @@ -558,6 +558,26 @@ public ApplicationBasicInfo[] getApplicationBasicInfo(String tenantDomain, Strin int offset, int limit) throws IdentityApplicationManagementException { + return getApplicationBasicInfo(tenantDomain, username, filter, offset, limit, false); + } + + /** + * Get all basic application information for a matching filter with pagination based on the offset and limit. + * + * @param tenantDomain Tenant Domain. + * @param username User name. + * @param filter Application name filter. + * @param offset Starting index of the count. + * @param limit Counting value. + * @param excludeSystemPortals Exclude system portals. + * @return An array of {@link ApplicationBasicInfo} instances within the limit. + * @throws IdentityApplicationManagementException Error in retrieving basic application information. + */ + @Override + public ApplicationBasicInfo[] getApplicationBasicInfo(String tenantDomain, String username, String filter, + int offset, int limit, Boolean excludeSystemPortals) + throws IdentityApplicationManagementException { + ApplicationBasicInfo[] applicationBasicInfoArray; try { @@ -580,7 +600,7 @@ public ApplicationBasicInfo[] getApplicationBasicInfo(String tenantDomain, Strin } applicationBasicInfoArray = ((PaginatableFilterableApplicationDAO) appDAO). - getApplicationBasicInfo(filter, offset, limit); + getApplicationBasicInfo(filter, offset, limit, excludeSystemPortals); // Invoking post listeners. for (ApplicationMgtListener listener : listeners) { @@ -671,11 +691,29 @@ public int getCountOfAllApplications(String tenantDomain, String username) public int getCountOfApplications(String tenantDomain, String username, String filter) throws IdentityApplicationManagementException { + return getCountOfApplications(tenantDomain, username, filter, false); + } + + /** + * Get count of all basic application information for a matching filter. + * + * @param tenantDomain Tenant Domain + * @param username User Name + * @param filter Application name filter + * @param excludeSystemPortals Exclude system portals + * @return int + * @throws IdentityApplicationManagementException + */ + @Override + public int getCountOfApplications(String tenantDomain, String username, String filter, Boolean excludeSystemPortals) + throws IdentityApplicationManagementException { + try { startTenantFlow(tenantDomain, username); ApplicationDAO appDAO = ApplicationMgtSystemConfig.getInstance().getApplicationDAO(); if (appDAO instanceof PaginatableFilterableApplicationDAO) { - return ((PaginatableFilterableApplicationDAO) appDAO).getCountOfApplications(filter); + return ((PaginatableFilterableApplicationDAO) appDAO) + .getCountOfApplications(filter, excludeSystemPortals); } else { throw new UnsupportedOperationException("Application count is not supported. " + "Tenant domain: " + tenantDomain); diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationPaginationAndSearching.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationPaginationAndSearching.java index bf8e7f18b645..2f337c08a094 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationPaginationAndSearching.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationPaginationAndSearching.java @@ -94,10 +94,28 @@ ApplicationBasicInfo[] getPaginatedApplicationBasicInfo(String tenantDomain, Str * @param limit Counting value. * @return An array of {@link ApplicationBasicInfo} instances matching the given filter within the given limit. * @throws IdentityApplicationManagementException Error in retrieving basic application information. + * @Deprecated This is being deprecated as introducing excludeSystemPortals to exclude system portals in response + * use {@link ApplicationPaginationAndSearching#getApplicationBasicInfo(String, String, String, int, int, Boolean)}. */ ApplicationBasicInfo[] getApplicationBasicInfo(String tenantDomain, String username, String filter, int offset, int limit) throws IdentityApplicationManagementException; + /** + * Get all basic application information for a matching filter with pagination based on the offset and limit. + * + * @param tenantDomain Tenant Domain. + * @param username User name. + * @param filter Application name filter. + * @param offset Starting index of the count. + * @param limit Counting value. + * @param excludeSystemPortals Exclude system portals + * @return An array of {@link ApplicationBasicInfo} instances matching the given filter within the given limit. + * @throws IdentityApplicationManagementException Error in retrieving basic application information. + */ + ApplicationBasicInfo[] getApplicationBasicInfo(String tenantDomain, String username, String filter, int offset, + int limit, Boolean excludeSystemPortals) + throws IdentityApplicationManagementException; + /** * Get count of all Application Basic Information. * @@ -117,8 +135,23 @@ int getCountOfAllApplications(String tenantDomain, String username) * @param filter Application name filter * @return int * @throws org.wso2.carbon.identity.application.common.IdentityApplicationManagementException + * @Deprecated This is being deprecated as introducing excludeSystemPortals to exclude system portals in response + * use {@link ApplicationPaginationAndSearching#getCountOfApplications(String, String, String, Boolean)}. */ int getCountOfApplications(String tenantDomain, String username, String filter) throws IdentityApplicationManagementException; + /** + * Get count of all basic application information for a matching filter. + * + * @param tenantDomain Tenant Domain + * @param username User Name + * @param filter Application name filter + * @param excludeSystemPortals Exclude system portals + * @return int + * @throws org.wso2.carbon.identity.application.common.IdentityApplicationManagementException + */ + int getCountOfApplications(String tenantDomain, String username, String filter, Boolean excludeSystemPortals) + throws IdentityApplicationManagementException; + } diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/PaginatableFilterableApplicationDAO.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/PaginatableFilterableApplicationDAO.java index e6db14a3fe96..902a954495cc 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/PaginatableFilterableApplicationDAO.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/PaginatableFilterableApplicationDAO.java @@ -46,9 +46,23 @@ ApplicationBasicInfo[] getAllPaginatedApplicationBasicInfo(int pageNumber) throw * @param limit Count value. * @return An array of {@link ApplicationBasicInfo} instances within the limit. * @throws IdentityApplicationManagementException Error in retrieving basic application information. + * @Deprecated This is being deprecated as introducing excludeSystemPortals to exclude system portals in response + * use {@link PaginatableFilterableApplicationDAO#getApplicationBasicInfo(int, int, Boolean)}. */ ApplicationBasicInfo[] getApplicationBasicInfo(int offset, int limit) throws IdentityApplicationManagementException; + /** + * Get all the basic application information based on the offset and the limit. + * + * @param offset Starting index of the count. + * @param limit Count value. + * @param excludeSystemPortals Exclude system portals. + * @return An array of {@link ApplicationBasicInfo} instances within the limit. + * @throws IdentityApplicationManagementException Error in retrieving basic application information. + */ + ApplicationBasicInfo[] getApplicationBasicInfo(int offset, int limit, Boolean excludeSystemPortals) + throws IdentityApplicationManagementException; + /** * Get all basic application information for a matching filter that falls under the given page number. * @@ -70,10 +84,27 @@ ApplicationBasicInfo[] getPaginatedApplicationBasicInfo(int pageNumber, String f * @return An array of {@link ApplicationBasicInfo} instances matching the given filter within the given limit. * @throws IdentityApplicationManagementException Error in retrieving basic application information based on the * given filter within the given limit. + * @Deprecated This is being deprecated as introducing excludeSystemPortals to exclude system portals in response + * use {@link PaginatableFilterableApplicationDAO#getApplicationBasicInfo(String, int, int, Boolean)}. */ ApplicationBasicInfo[] getApplicationBasicInfo(String filter, int offset, int limit) throws IdentityApplicationManagementException; + /** + * Get all basic application information for a matching filter based on the offset and the limit. + * + * @param filter Application name filter. + * @param offset Starting index of the count. + * @param limit Count value. + * @param excludeSystemPortals Exclude system portals + * @return An array of {@link ApplicationBasicInfo} instances matching the given filter within the given limit. + * @throws IdentityApplicationManagementException Error in retrieving basic application information based on the + * given filter within the given limit. + * + */ + ApplicationBasicInfo[] getApplicationBasicInfo(String filter, int offset, int limit, Boolean excludeSystemPortals) + throws IdentityApplicationManagementException; + /** * Get count of applications. * @@ -88,9 +119,22 @@ ApplicationBasicInfo[] getApplicationBasicInfo(String filter, int offset, int li * @param filter application search filter * @return matched application count in a int value * @throws IdentityApplicationManagementException + * @Deprecated This is being deprecated as introducing excludeSystemPortals to exclude system portals in response + * use {@link PaginatableFilterableApplicationDAO#getCountOfApplications(String, Boolean)}. */ int getCountOfApplications(String filter) throws IdentityApplicationManagementException; + /** + * Get count of applications matching the filter. + * + * @param filter application search filter + * @param excludeSystemPortals Exclude system portals + * @return matched application count in a int value + * @throws IdentityApplicationManagementException + */ + int getCountOfApplications(String filter, Boolean excludeSystemPortals) throws + IdentityApplicationManagementException; + /** * Get all basic application information for a matching filter. * diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationDAOImpl.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationDAOImpl.java index 745068863338..8150be8d7748 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationDAOImpl.java @@ -18,6 +18,7 @@ package org.wso2.carbon.identity.application.mgt.dao.impl; +import org.apache.axiom.om.OMElement; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.ArrayUtils; @@ -86,6 +87,7 @@ import org.wso2.carbon.identity.core.model.FilterTreeBuilder; import org.wso2.carbon.identity.core.model.Node; import org.wso2.carbon.identity.core.model.OperationNode; +import org.wso2.carbon.identity.core.util.IdentityConfigParser; import org.wso2.carbon.identity.core.util.IdentityDatabaseUtil; import org.wso2.carbon.identity.core.util.IdentityTenantUtil; import org.wso2.carbon.identity.core.util.IdentityUtil; @@ -122,6 +124,7 @@ import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -172,8 +175,10 @@ import static org.wso2.carbon.identity.application.common.util.IdentityApplicationConstants.TEMPLATE_VERSION_SP_PROPERTY_NAME; import static org.wso2.carbon.identity.application.common.util.IdentityApplicationConstants.TRUSTED_APP_CONSENT_GRANTED_SP_PROPERTY_DISPLAY_NAME; import static org.wso2.carbon.identity.application.common.util.IdentityApplicationConstants.TRUSTED_APP_CONSENT_GRANTED_SP_PROPERTY_NAME; +import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.APPLICATION_NAME_CONFIG_ELEMENT; import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.LOCAL_SP; import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.ORACLE; +import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.SYSTEM_PORTALS; import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.UNION_SEPARATOR; import static org.wso2.carbon.identity.application.mgt.ApplicationMgtUtil.getConsoleAccessUrlFromServerConfig; import static org.wso2.carbon.identity.application.mgt.ApplicationMgtUtil.getMyAccountAccessUrlFromServerConfig; @@ -208,7 +213,7 @@ public class ApplicationDAOImpl extends AbstractApplicationDAOImpl implements Pa private static final String UUID = "UUID"; private static final String SPACE = " "; - private Log log = LogFactory.getLog(ApplicationDAOImpl.class); + private static final Log log = LogFactory.getLog(ApplicationDAOImpl.class); private static final Log AUDIT_LOG = CarbonConstants.AUDIT_LOG; private static final String AUDIT_MESSAGE = "Initiator : %s | Action : %s | Data : { %s } | Result : %s "; private static final String AUDIT_SUCCESS = "Success"; @@ -2068,8 +2073,16 @@ public ApplicationBasicInfo[] getPaginatedApplicationBasicInfo(int pageNumber, S public ApplicationBasicInfo[] getApplicationBasicInfo(String filter, int offset, int limit) throws IdentityApplicationManagementException { + return getApplicationBasicInfo(filter, offset, limit, false); + } + + @Override + public ApplicationBasicInfo[] getApplicationBasicInfo(String filter, int offset, int limit, + Boolean excludeSystemPortals) + throws IdentityApplicationManagementException { + if (StringUtils.isBlank(filter) || filter.equals(ASTERISK)) { - return getApplicationBasicInfo(offset, limit); + return getApplicationBasicInfo(offset, limit, excludeSystemPortals); } validateAttributesForPagination(offset, limit); @@ -2088,38 +2101,44 @@ public ApplicationBasicInfo[] getApplicationBasicInfo(String filter, int offset, List filterValues = filterData.getFilterValues(); String filterString = filterData.getFilterString(); + String excludeSystemPortalsQueryString = populateSystemPortalsExcludeQuery(excludeSystemPortals); String databaseProductName = connection.getMetaData().getDatabaseProductName(); if (databaseProductName.contains("MySQL") || databaseProductName.contains("MariaDB") || databaseProductName.contains("H2")) { - sqlQuery = String.format( - ApplicationMgtDBQueries.LOAD_APP_NAMES_BY_TENANT_AND_FILTER_MYSQL, filterString); + sqlQuery = String.format(ApplicationMgtDBQueries.LOAD_APP_NAMES_BY_TENANT_AND_FILTER_MYSQL, + excludeSystemPortalsQueryString , filterString); getAppNamesStmt = connection.prepareStatement(sqlQuery); populateApplicationSearchQuery(getAppNamesStmt, tenantID, filterValues, offset, limit); } else if (databaseProductName.contains("Oracle")) { sqlQuery = String.format( - ApplicationMgtDBQueries.LOAD_APP_NAMES_BY_TENANT_AND_FILTER_ORACLE, filterString); + ApplicationMgtDBQueries.LOAD_APP_NAMES_BY_TENANT_AND_FILTER_ORACLE, + excludeSystemPortalsQueryString, filterString); getAppNamesStmt = connection.prepareStatement(sqlQuery); populateApplicationSearchQuery(getAppNamesStmt, tenantID, filterValues, offset + limit, offset); } else if (databaseProductName.contains("Microsoft")) { sqlQuery = String.format( - ApplicationMgtDBQueries.LOAD_APP_NAMES_BY_TENANT_AND_FILTER_MSSQL, filterString); + ApplicationMgtDBQueries.LOAD_APP_NAMES_BY_TENANT_AND_FILTER_MSSQL, + excludeSystemPortalsQueryString, filterString); getAppNamesStmt = connection.prepareStatement(sqlQuery); populateApplicationSearchQuery(getAppNamesStmt, tenantID, filterValues, offset, limit); } else if (databaseProductName.contains("PostgreSQL")) { sqlQuery = String.format( - ApplicationMgtDBQueries.LOAD_APP_NAMES_BY_TENANT_AND_FILTER_POSTGRESQL, filterString); + ApplicationMgtDBQueries.LOAD_APP_NAMES_BY_TENANT_AND_FILTER_POSTGRESQL, + excludeSystemPortalsQueryString, filterString); getAppNamesStmt = connection.prepareStatement(sqlQuery); populateApplicationSearchQuery(getAppNamesStmt, tenantID, filterValues, limit, offset); } else if (databaseProductName.contains("DB2")) { sqlQuery = String.format( - ApplicationMgtDBQueries.LOAD_APP_NAMES_BY_TENANT_AND_FILTER_DB2SQL, filterString); + ApplicationMgtDBQueries.LOAD_APP_NAMES_BY_TENANT_AND_FILTER_DB2SQL, + excludeSystemPortalsQueryString, filterString); getAppNamesStmt = connection.prepareStatement(sqlQuery); populateApplicationSearchQuery(getAppNamesStmt, tenantID, filterValues, offset, offset + limit); } else if (databaseProductName.contains("INFORMIX")) { sqlQuery = String.format( - ApplicationMgtDBQueries.LOAD_APP_NAMES_BY_TENANT_AND_FILTER_INFORMIX, filterString); + ApplicationMgtDBQueries.LOAD_APP_NAMES_BY_TENANT_AND_FILTER_INFORMIX, + excludeSystemPortalsQueryString, filterString); String filterValueResolvedForSQL; getAppNamesStmt = connection.prepareStatement(sqlQuery); getAppNamesStmt.setInt(1, offset); @@ -2156,6 +2175,60 @@ public ApplicationBasicInfo[] getApplicationBasicInfo(String filter, int offset, return appInfo.toArray(new ApplicationBasicInfo[0]); } + /** + * Get query to exclude system portals if excludeSystemPortals is true. + * + * @param excludeSystemPortals Exclude system portals. + * @return + */ + private String populateSystemPortalsExcludeQuery(Boolean excludeSystemPortals) { + + return excludeSystemPortals ? + String.format(ApplicationMgtDBQueries.EXCLUDE_SYSTEM_PORTALS_BY_NAME, + getApplications(SYSTEM_PORTALS).stream() + .map(s -> "'" + s + "'") + .collect(Collectors.joining(", "))) + : ""; + } + + /** + * Get system portals from configuration. + * + * @param parentElement + * @return + */ + private static Set getApplications(String parentElement) { + + IdentityConfigParser configParser = IdentityConfigParser.getInstance(); + OMElement systemApplicationsConfig = configParser.getConfigElement(parentElement); + if (systemApplicationsConfig == null) { + if (log.isDebugEnabled()) { + log.debug("'" + parentElement + "' config not found."); + } + return Collections.emptySet(); + } + + Iterator applicationIdentifierIterator = systemApplicationsConfig + .getChildrenWithLocalName(APPLICATION_NAME_CONFIG_ELEMENT); + if (applicationIdentifierIterator == null) { + if (log.isDebugEnabled()) { + log.debug("'" + APPLICATION_NAME_CONFIG_ELEMENT + "' config not found."); + } + return Collections.emptySet(); + } + + Set applications = new HashSet<>(); + while (applicationIdentifierIterator.hasNext()) { + OMElement applicationIdentifierConfig = (OMElement) applicationIdentifierIterator.next(); + String applicationName = applicationIdentifierConfig.getText(); + if (StringUtils.isNotBlank(applicationName)) { + applications.add(applicationName.trim()); + } + } + + return applications; + } + /** * Set values to the prepare statement for searching applications * @@ -3949,6 +4022,20 @@ private String generateFilterValueForBackend(String searchOperation, String sear @Override public int getCountOfApplications(String filter) throws IdentityApplicationManagementException { + return getCountOfApplications(filter, false); + } + + /** + * Get count of applications for user which has the filter string + * + * @param filter + * @return + * @throws IdentityApplicationManagementException + */ + @Override + public int getCountOfApplications(String filter, Boolean excludeSystemPortals) + throws IdentityApplicationManagementException { + int tenantID = CarbonContext.getThreadLocalCarbonContext().getTenantId(); int count; @@ -3961,12 +4048,14 @@ public int getCountOfApplications(String filter) throws IdentityApplicationManag ResultSet appNameResultSet = null; FilterData filterData = getFilterDataForDBQuery(filter); + String filterString = filterData.getFilterString(); + String excludeSystemPortalsQueryString = populateSystemPortalsExcludeQuery(excludeSystemPortals); try { String filterValueResolvedForSQL; - getAppNamesStmt = connection.prepareStatement( - String.format( - ApplicationMgtDBQueries.LOAD_APP_COUNT_BY_TENANT_AND_FILTER, filterData.getFilterString())); + getAppNamesStmt = connection.prepareStatement(String.format + (ApplicationMgtDBQueries.LOAD_APP_COUNT_BY_TENANT_AND_FILTER, excludeSystemPortalsQueryString, + filterString)); getAppNamesStmt.setInt(1, tenantID); getAppNamesStmt.setString(2, LOCAL_SP); for (int i = 0; i < filterData.getFilterValues().size(); i++) { @@ -4102,8 +4191,15 @@ public ApplicationBasicInfo[] getAllPaginatedApplicationBasicInfo(int pageNumber } @Override - public ApplicationBasicInfo[] getApplicationBasicInfo(int offset, - int limit) throws IdentityApplicationManagementException { + public ApplicationBasicInfo[] getApplicationBasicInfo(int offset, int limit) + throws IdentityApplicationManagementException { + + return getApplicationBasicInfo(offset, limit, false); + } + + @Override + public ApplicationBasicInfo[] getApplicationBasicInfo(int offset, int limit, Boolean excludeSystemPortals) + throws IdentityApplicationManagementException { validateAttributesForPagination(offset, limit); @@ -4114,33 +4210,40 @@ public ApplicationBasicInfo[] getApplicationBasicInfo(int offset, ResultSet appNameResultSet = null; String sqlQuery; ArrayList appInfo = new ArrayList(); + String excludeSystemPortalsQueryString = populateSystemPortalsExcludeQuery(excludeSystemPortals); try { String databaseProductName = connection.getMetaData().getDatabaseProductName(); if (databaseProductName.contains("MySQL") || databaseProductName.contains("MariaDB") || databaseProductName.contains("H2")) { - sqlQuery = ApplicationMgtDBQueries.LOAD_APP_NAMES_BY_TENANT_MYSQL; + sqlQuery = String.format(ApplicationMgtDBQueries.LOAD_APP_NAMES_BY_TENANT_MYSQL, + excludeSystemPortalsQueryString); getAppNamesStmt = connection.prepareStatement(sqlQuery); populateListAppNamesQueryValues(tenantID, offset, limit, getAppNamesStmt); } else if (databaseProductName.contains("Oracle")) { - sqlQuery = ApplicationMgtDBQueries.LOAD_APP_NAMES_BY_TENANT_ORACLE; + sqlQuery = String.format(ApplicationMgtDBQueries.LOAD_APP_NAMES_BY_TENANT_ORACLE, + excludeSystemPortalsQueryString); getAppNamesStmt = connection.prepareStatement(sqlQuery); populateListAppNamesQueryValues(tenantID, offset + limit, offset, getAppNamesStmt); } else if (databaseProductName.contains("Microsoft")) { - sqlQuery = ApplicationMgtDBQueries.LOAD_APP_NAMES_BY_TENANT_MSSQL; + sqlQuery = String.format(ApplicationMgtDBQueries.LOAD_APP_NAMES_BY_TENANT_MSSQL, + excludeSystemPortalsQueryString); getAppNamesStmt = connection.prepareStatement(sqlQuery); populateListAppNamesQueryValues(tenantID, offset, limit, getAppNamesStmt); } else if (databaseProductName.contains("PostgreSQL")) { - sqlQuery = ApplicationMgtDBQueries.LOAD_APP_NAMES_BY_TENANT_POSTGRESQL; + sqlQuery = String.format(ApplicationMgtDBQueries.LOAD_APP_NAMES_BY_TENANT_POSTGRESQL, + excludeSystemPortalsQueryString); getAppNamesStmt = connection.prepareStatement(sqlQuery); populateListAppNamesQueryValues(tenantID, limit, offset, getAppNamesStmt); } else if (databaseProductName.contains("DB2")) { - sqlQuery = ApplicationMgtDBQueries.LOAD_APP_NAMES_BY_TENANT_DB2SQL; + sqlQuery = String.format(ApplicationMgtDBQueries.LOAD_APP_NAMES_BY_TENANT_DB2SQL, + excludeSystemPortalsQueryString); getAppNamesStmt = connection.prepareStatement(sqlQuery); populateListAppNamesQueryValues(tenantID, offset, offset + limit, getAppNamesStmt); } else if (databaseProductName.contains("INFORMIX")) { - sqlQuery = ApplicationMgtDBQueries.LOAD_APP_NAMES_BY_TENANT_INFORMIX; + sqlQuery = String.format(ApplicationMgtDBQueries.LOAD_APP_NAMES_BY_TENANT_INFORMIX, + excludeSystemPortalsQueryString); getAppNamesStmt = connection.prepareStatement(sqlQuery); getAppNamesStmt.setInt(1, offset); getAppNamesStmt.setInt(2, limit); diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationMgtDBQueries.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationMgtDBQueries.java index d5818025a738..61177be3b568 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationMgtDBQueries.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationMgtDBQueries.java @@ -94,20 +94,20 @@ public class ApplicationMgtDBQueries { public static final String LOAD_APP_COUNT_BY_TENANT_AND_FILTER = "SELECT COUNT(DISTINCT(SP_APP.APP_NAME)) FROM " + "SP_APP LEFT JOIN SP_INBOUND_AUTH ON SP_APP.ID = SP_INBOUND_AUTH.APP_ID WHERE SP_APP.TENANT_ID = ? " + - "AND SP_APP.APP_NAME != ? AND (%s)"; + "AND SP_APP.APP_NAME != ? %s AND (%s)"; public static final String LOAD_APP_BY_TENANT_AND_NAME = "SELECT ID, APP_NAME, DESCRIPTION, UUID, IMAGE_URL, " + "ACCESS_URL, IS_DISCOVERABLE, USERNAME, USER_STORE, TENANT_ID FROM SP_APP WHERE TENANT_ID = :TENANT_ID; " + "AND APP_NAME = :APP_NAME;"; // Load application basic information for listing with pagination public static final String LOAD_APP_NAMES_BY_TENANT_MYSQL = "SELECT ID, APP_NAME, DESCRIPTION, UUID, IMAGE_URL, " + - "ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM SP_APP WHERE TENANT_ID = ? AND APP_NAME != ? ORDER BY " + - "ID DESC LIMIT ?, ?"; + "ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM SP_APP WHERE TENANT_ID = ? AND APP_NAME != ? %s " + + "ORDER BY ID DESC LIMIT ?, ?"; public static final String LOAD_APP_NAMES_BY_TENANT_AND_FILTER_MYSQL = "SELECT DISTINCT SP_APP.ID," + " SP_APP.APP_NAME, SP_APP.DESCRIPTION, SP_APP.UUID, SP_APP.IMAGE_URL, SP_APP.ACCESS_URL, SP_APP.USERNAME," + " SP_APP.USER_STORE, SP_APP.TENANT_ID FROM SP_APP LEFT JOIN SP_INBOUND_AUTH ON SP_APP.ID =" + - " SP_INBOUND_AUTH.APP_ID WHERE SP_APP.TENANT_ID = ? AND SP_APP.APP_NAME != ? AND (%s)" + + " SP_INBOUND_AUTH.APP_ID WHERE SP_APP.TENANT_ID = ? AND SP_APP.APP_NAME != ? %s AND (%s)" + " ORDER BY SP_APP.ID DESC LIMIT ?, ?"; public static final String LOAD_APP_NAMES_BY_TENANT_ORACLE = "SELECT ID, APP_NAME, DESCRIPTION, UUID, IMAGE_URL, " + @@ -115,7 +115,7 @@ public class ApplicationMgtDBQueries { "(SELECT ID, APP_NAME, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, " + "TENANT_ID, rownum AS rnum FROM " + "(SELECT ID, APP_NAME, DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID " + - "FROM SP_APP ORDER BY ID DESC) WHERE TENANT_ID = ? AND APP_NAME != ? AND rownum <= ?) WHERE rnum > ? "; + "FROM SP_APP ORDER BY ID DESC) WHERE TENANT_ID = ? AND APP_NAME != ? %s AND rownum <= ?) WHERE rnum > ? "; public static final String LOAD_APP_NAMES_BY_TENANT_AND_FILTER_ORACLE = "SELECT DISTINCT ID, APP_NAME, " + "DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + @@ -125,13 +125,13 @@ public class ApplicationMgtDBQueries { "SP_APP.ACCESS_URL, SP_INBOUND_AUTH.INBOUND_AUTH_KEY, SP_INBOUND_AUTH.INBOUND_AUTH_TYPE, " + "SP_APP.USERNAME, SP_APP.USER_STORE, SP_APP.TENANT_ID FROM SP_APP " + "LEFT JOIN SP_INBOUND_AUTH on SP_APP.ID = SP_INBOUND_AUTH.APP_ID " + - "WHERE SP_APP.TENANT_ID = ? AND SP_APP.APP_NAME <> ? AND (%s) ORDER BY SP_APP.ID DESC) " + + "WHERE SP_APP.TENANT_ID = ? AND SP_APP.APP_NAME <> ? %s AND (%s) ORDER BY SP_APP.ID DESC) " + "WHERE ROWNUM <= ?) WHERE rn > ?"; public static final String LOAD_APP_NAMES_BY_TENANT_DB2SQL = "SELECT ID, APP_NAME, DESCRIPTION, " + "UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM (SELECT " + - "ROW_NUMBER() OVER(ORDER BY ID DESC) AS rn,SP_APP.* FROM SP_APP WHERE TENANT_ID = ? AND APP_NAME != ? ) " + - "WHERE rn BETWEEN ? AND ?"; + "ROW_NUMBER() OVER(ORDER BY ID DESC) AS rn,SP_APP.* FROM SP_APP WHERE TENANT_ID = ? " + + "AND APP_NAME != ? %s ) WHERE rn BETWEEN ? AND ?"; public static final String LOAD_APP_NAMES_BY_TENANT_AND_FILTER_DB2SQL = "SELECT DISTINCT ID, APP_NAME, " + "DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + @@ -140,36 +140,36 @@ public class ApplicationMgtDBQueries { "SP_APP.USERNAME, SP_APP.USER_STORE, SP_APP.TENANT_ID, ROW_NUMBER() " + "OVER (ORDER BY SP_APP.ID DESC) AS rn FROM SP_APP LEFT JOIN SP_INBOUND_AUTH ON " + "SP_APP.ID = SP_INBOUND_AUTH.APP_ID WHERE SP_APP.TENANT_ID = ? AND " + - "SP_APP.APP_NAME <> ? AND (%s) ORDER BY SP_APP.ID DESC ) WHERE rn BETWEEN ? AND ?"; + "SP_APP.APP_NAME <> ? %s AND (%s) ORDER BY SP_APP.ID DESC ) WHERE rn BETWEEN ? AND ?"; public static final String LOAD_APP_NAMES_BY_TENANT_MSSQL = "SELECT ID, APP_NAME, DESCRIPTION, " + "UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + - "SP_APP WHERE TENANT_ID = ? AND APP_NAME != ? ORDER BY ID DESC OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; + "SP_APP WHERE TENANT_ID = ? AND APP_NAME != ? %s ORDER BY ID DESC OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; public static final String LOAD_APP_NAMES_BY_TENANT_AND_FILTER_MSSQL = "SELECT DISTINCT SP_APP.ID, " + "SP_APP.APP_NAME, SP_APP.DESCRIPTION, SP_APP.UUID, SP_APP.IMAGE_URL, SP_APP.ACCESS_URL, SP_APP.USERNAME, " + "SP_APP.USER_STORE, SP_APP.TENANT_ID FROM SP_APP LEFT JOIN SP_INBOUND_AUTH ON " + "SP_APP.ID = SP_INBOUND_AUTH.APP_ID WHERE SP_APP.TENANT_ID = ? AND " + - "SP_APP.APP_NAME != ? AND (%s) ORDER BY SP_APP.ID DESC OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; + "SP_APP.APP_NAME != ? %s AND (%s) ORDER BY SP_APP.ID DESC OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; public static final String LOAD_APP_NAMES_BY_TENANT_POSTGRESQL = "SELECT ID, APP_NAME, DESCRIPTION, " + "UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM " + - "SP_APP WHERE TENANT_ID = ? AND APP_NAME != ? ORDER BY ID DESC LIMIT ? OFFSET ?"; + "SP_APP WHERE TENANT_ID = ? AND APP_NAME != ? %s ORDER BY ID DESC LIMIT ? OFFSET ?"; public static final String LOAD_APP_NAMES_BY_TENANT_AND_FILTER_POSTGRESQL = "SELECT DISTINCT SP_APP.ID, " + "SP_APP.APP_NAME, SP_APP.DESCRIPTION, SP_APP.UUID, SP_APP.IMAGE_URL, SP_APP.ACCESS_URL, " + "SP_APP.USERNAME, SP_APP.USER_STORE, SP_APP.TENANT_ID FROM SP_APP " + "LEFT JOIN SP_INBOUND_AUTH ON SP_APP.ID = SP_INBOUND_AUTH.APP_ID WHERE SP_APP.TENANT_ID = ? " + - "AND SP_APP.APP_NAME != ? AND (%s) ORDER BY SP_APP.ID DESC LIMIT ? OFFSET ?"; + "AND SP_APP.APP_NAME != ? %s AND (%s) ORDER BY SP_APP.ID DESC LIMIT ? OFFSET ?"; public static final String LOAD_APP_NAMES_BY_TENANT_INFORMIX = "SELECT SKIP ? FIRST ? ID, APP_NAME, " + "DESCRIPTION, UUID, IMAGE_URL, ACCESS_URL, USERNAME, USER_STORE, TENANT_ID FROM SP_APP " + - "WHERE TENANT_ID = ? AND APP_NAME != ? ORDER BY ID DESC"; + "WHERE TENANT_ID = ? AND APP_NAME != ? %s ORDER BY ID DESC"; public static final String LOAD_APP_NAMES_BY_TENANT_AND_FILTER_INFORMIX = "SELECT SKIP ? FIRST ? DISTINCT " + "SP_APP.ID, SP_APP.APP_NAME, SP_APP.DESCRIPTION, SP_APP.UUID, SP_APP.IMAGE_URL, SP_APP.ACCESS_URL, " + "SP_APP.USERNAME, SP_APP.USER_STORE, SP_APP.TENANT_ID FROM SP_APP " + "LEFT OUTER JOIN SP_INBOUND_AUTH ON SP_APP.ID = SP_INBOUND_AUTH.APP_ID " + - "WHERE SP_APP.TENANT_ID = ? AND SP_APP.APP_NAME <> ? AND (%s) ORDER BY SP_APP.ID desc"; + "WHERE SP_APP.TENANT_ID = ? AND SP_APP.APP_NAME <> ? %s AND (%s) ORDER BY SP_APP.ID desc"; public static final String LOAD_APP_ID_BY_CLIENT_ID_AND_TYPE = "SELECT APP_ID FROM SP_AUTH_STEP WHERE CLIENT_ID = ? " @@ -257,6 +257,7 @@ public class ApplicationMgtDBQueries { "THUMBPRINTS, IS_FIDO_TRUSTED FROM SP_TRUSTED_APPS WHERE SP_ID = ? AND TENANT_ID = ?"; public static final String LOAD_TRUSTED_APPS_BY_PLATFORM_TYPE = "SELECT APP_IDENTIFIER, THUMBPRINTS, " + "IS_FIDO_TRUSTED FROM SP_TRUSTED_APPS WHERE PLATFORM_TYPE = ?"; + public static final String EXCLUDE_SYSTEM_PORTALS_BY_NAME = "AND SP_APP.APP_NAME NOT IN (%s)"; // DELETE queries public static final String REMOVE_APP_FROM_APPMGT_APP = "DELETE FROM SP_APP WHERE APP_NAME = ? AND TENANT_ID = ?"; diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/CacheBackedApplicationDAO.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/CacheBackedApplicationDAO.java index 5a7ebc574304..4a2c173cb074 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/CacheBackedApplicationDAO.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/CacheBackedApplicationDAO.java @@ -293,9 +293,17 @@ public ApplicationBasicInfo[] getAllPaginatedApplicationBasicInfo(int pageNumber public ApplicationBasicInfo[] getApplicationBasicInfo(int offset, int limit) throws IdentityApplicationManagementException { + return getApplicationBasicInfo(offset, limit, false); + } + + @Override + public ApplicationBasicInfo[] getApplicationBasicInfo(int offset, int limit, Boolean excludeSystemPortals) + throws IdentityApplicationManagementException { + if (appDAO instanceof PaginatableFilterableApplicationDAO) { // No need to cache the returned list. - return ((PaginatableFilterableApplicationDAO) appDAO).getApplicationBasicInfo(offset, limit); + return ((PaginatableFilterableApplicationDAO) appDAO).getApplicationBasicInfo(offset, limit, + excludeSystemPortals); } else { throw new UnsupportedOperationException("This operation only supported in" + " PaginatableFilterableApplicationDAO only."); @@ -331,10 +339,18 @@ public ApplicationBasicInfo[] getPaginatedApplicationBasicInfo(int pageNumber, S @Override public ApplicationBasicInfo[] getApplicationBasicInfo(String filter, int offset, int limit) throws IdentityApplicationManagementException { + return getApplicationBasicInfo(filter, offset, limit, false); + } + + @Override + public ApplicationBasicInfo[] getApplicationBasicInfo(String filter, int offset, int limit, + Boolean excludeSystemPortals) + throws IdentityApplicationManagementException { if (appDAO instanceof PaginatableFilterableApplicationDAO) { // No need to cache the returned list. - return ((PaginatableFilterableApplicationDAO) appDAO).getApplicationBasicInfo(filter, offset, limit); + return ((PaginatableFilterableApplicationDAO) appDAO).getApplicationBasicInfo(filter, offset, limit, + excludeSystemPortals); } else { throw new UnsupportedOperationException("This operation only supported in" + " PaginatableFilterableApplicationDAO only."); @@ -353,8 +369,14 @@ public int getCountOfAllApplications() throws IdentityApplicationManagementExcep public int getCountOfApplications(String filter) throws IdentityApplicationManagementException { + return getCountOfApplications(filter, false); + } + + public int getCountOfApplications(String filter, Boolean excludeSystemPortals) + throws IdentityApplicationManagementException { + if (appDAO instanceof PaginatableFilterableApplicationDAO) { - return ((PaginatableFilterableApplicationDAO) appDAO).getCountOfApplications(filter); + return ((PaginatableFilterableApplicationDAO) appDAO).getCountOfApplications(filter, excludeSystemPortals); } else { throw new UnsupportedOperationException("This operation only supported in" + " PaginatableFilterableApplicationDAO only."); diff --git a/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/identity.xml.j2 b/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/identity.xml.j2 index f044b6c75daf..0bdfcebf9da3 100644 --- a/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/identity.xml.j2 +++ b/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/identity.xml.j2 @@ -4014,6 +4014,15 @@ {% endif %} + + {% if system_applications.system_portals is defined %} + + {% for application in system_applications.system_portals %} + {{application}} + {% endfor %} + + {% endif %} + {% if system_roles is defined %} diff --git a/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/org.wso2.carbon.identity.core.server.feature.default.json b/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/org.wso2.carbon.identity.core.server.feature.default.json index 6dfbe4771366..7ec25e754a22 100644 --- a/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/org.wso2.carbon.identity.core.server.feature.default.json +++ b/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/org.wso2.carbon.identity.core.server.feature.default.json @@ -1616,6 +1616,8 @@ ], "actions.types.authentication.enable": true, - "oauth.authorize_all_scopes": false + "oauth.authorize_all_scopes": false, + + "system_applications.system_portals": ["Console", "My Account"] } From 964c6d3814dba4a93591240fb7b95b4f3b9f77c3 Mon Sep 17 00:00:00 2001 From: JeethJJ Date: Tue, 15 Oct 2024 20:56:48 +0530 Subject: [PATCH 2/4] Add tests & fix comments. --- .../application/mgt/ApplicationConstants.java | 1 + .../mgt/ApplicationManagementServiceImpl.java | 20 ++-- .../ApplicationPaginationAndSearching.java | 24 ++--- .../PaginatableFilterableApplicationDAO.java | 16 +-- .../mgt/dao/impl/ApplicationDAOImpl.java | 34 +++--- .../ApplicationManagementServiceImplTest.java | 101 ++++++++++++++++++ .../resources/identity.xml.j2 | 2 +- 7 files changed, 152 insertions(+), 46 deletions(-) diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationConstants.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationConstants.java index 0dbb85626d7a..5c30320fb9ff 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationConstants.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationConstants.java @@ -102,6 +102,7 @@ private ApplicationConstants() { public static final String SYSTEM_APPLICATIONS_CONFIG_ELEMENT = "SystemApplications"; public static final String DEFAULT_APPLICATIONS_CONFIG_ELEMENT = "DefaultApplications"; public static final String APPLICATION_NAME_CONFIG_ELEMENT = "ApplicationName"; + public static final String PORTAL_NAME_CONFIG_ELEMENT = "PortalName"; // Application Management Service Configurations. public static final String ENABLE_APPLICATION_ROLE_VALIDATION_PROPERTY = "ApplicationMgt.EnableRoleValidation"; diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImpl.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImpl.java index 47999a849cf9..d7e27d99c171 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImpl.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImpl.java @@ -567,11 +567,11 @@ public ApplicationBasicInfo[] getApplicationBasicInfo(String tenantDomain, Strin /** * Get all basic application information for a matching filter with pagination based on the offset and limit. * - * @param tenantDomain Tenant Domain. - * @param username User name. - * @param filter Application name filter. - * @param offset Starting index of the count. - * @param limit Counting value. + * @param tenantDomain Tenant Domain. + * @param username User name. + * @param filter Application name filter. + * @param offset Starting index of the count. + * @param limit Counting value. * @param excludeSystemPortals Exclude system portals. * @return An array of {@link ApplicationBasicInfo} instances within the limit. * @throws IdentityApplicationManagementException Error in retrieving basic application information. @@ -700,11 +700,11 @@ public int getCountOfApplications(String tenantDomain, String username, String f /** * Get count of all basic application information for a matching filter. * - * @param tenantDomain Tenant Domain - * @param username User Name - * @param filter Application name filter - * @param excludeSystemPortals Exclude system portals - * @return int + * @param tenantDomain Tenant Domain. + * @param username User Name. + * @param filter Application name filter. + * @param excludeSystemPortals Exclude system portals. + * @return int Count of applications. * @throws IdentityApplicationManagementException */ @Override diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationPaginationAndSearching.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationPaginationAndSearching.java index 2f337c08a094..32562256af1b 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationPaginationAndSearching.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationPaginationAndSearching.java @@ -103,12 +103,12 @@ ApplicationBasicInfo[] getApplicationBasicInfo(String tenantDomain, String usern /** * Get all basic application information for a matching filter with pagination based on the offset and limit. * - * @param tenantDomain Tenant Domain. - * @param username User name. - * @param filter Application name filter. - * @param offset Starting index of the count. - * @param limit Counting value. - * @param excludeSystemPortals Exclude system portals + * @param tenantDomain Tenant Domain. + * @param username User name. + * @param filter Application name filter. + * @param offset Starting index of the count. + * @param limit Counting value. + * @param excludeSystemPortals Exclude system portals. * @return An array of {@link ApplicationBasicInfo} instances matching the given filter within the given limit. * @throws IdentityApplicationManagementException Error in retrieving basic application information. */ @@ -135,7 +135,7 @@ int getCountOfAllApplications(String tenantDomain, String username) * @param filter Application name filter * @return int * @throws org.wso2.carbon.identity.application.common.IdentityApplicationManagementException - * @Deprecated This is being deprecated as introducing excludeSystemPortals to exclude system portals in response + * @Deprecated This is being deprecated as introducing excludeSystemPortals to exclude system portals in response. * use {@link ApplicationPaginationAndSearching#getCountOfApplications(String, String, String, Boolean)}. */ int getCountOfApplications(String tenantDomain, String username, String filter) @@ -144,11 +144,11 @@ int getCountOfApplications(String tenantDomain, String username, String filter) /** * Get count of all basic application information for a matching filter. * - * @param tenantDomain Tenant Domain - * @param username User Name - * @param filter Application name filter - * @param excludeSystemPortals Exclude system portals - * @return int + * @param tenantDomain Tenant Domain. + * @param username User Name. + * @param filter Application name filter. + * @param excludeSystemPortals Exclude system portals. + * @return int Count of applications. * @throws org.wso2.carbon.identity.application.common.IdentityApplicationManagementException */ int getCountOfApplications(String tenantDomain, String username, String filter, Boolean excludeSystemPortals) diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/PaginatableFilterableApplicationDAO.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/PaginatableFilterableApplicationDAO.java index 902a954495cc..73ce75fdfa6e 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/PaginatableFilterableApplicationDAO.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/PaginatableFilterableApplicationDAO.java @@ -46,7 +46,7 @@ ApplicationBasicInfo[] getAllPaginatedApplicationBasicInfo(int pageNumber) throw * @param limit Count value. * @return An array of {@link ApplicationBasicInfo} instances within the limit. * @throws IdentityApplicationManagementException Error in retrieving basic application information. - * @Deprecated This is being deprecated as introducing excludeSystemPortals to exclude system portals in response + * @Deprecated This is being deprecated as introducing excludeSystemPortals to exclude system portals in response. * use {@link PaginatableFilterableApplicationDAO#getApplicationBasicInfo(int, int, Boolean)}. */ ApplicationBasicInfo[] getApplicationBasicInfo(int offset, int limit) throws IdentityApplicationManagementException; @@ -54,8 +54,8 @@ ApplicationBasicInfo[] getAllPaginatedApplicationBasicInfo(int pageNumber) throw /** * Get all the basic application information based on the offset and the limit. * - * @param offset Starting index of the count. - * @param limit Count value. + * @param offset Starting index of the count. + * @param limit Count value. * @param excludeSystemPortals Exclude system portals. * @return An array of {@link ApplicationBasicInfo} instances within the limit. * @throws IdentityApplicationManagementException Error in retrieving basic application information. @@ -84,7 +84,7 @@ ApplicationBasicInfo[] getPaginatedApplicationBasicInfo(int pageNumber, String f * @return An array of {@link ApplicationBasicInfo} instances matching the given filter within the given limit. * @throws IdentityApplicationManagementException Error in retrieving basic application information based on the * given filter within the given limit. - * @Deprecated This is being deprecated as introducing excludeSystemPortals to exclude system portals in response + * @Deprecated This is being deprecated as introducing excludeSystemPortals to exclude system portals in response. * use {@link PaginatableFilterableApplicationDAO#getApplicationBasicInfo(String, int, int, Boolean)}. */ ApplicationBasicInfo[] getApplicationBasicInfo(String filter, int offset, int limit) throws @@ -93,9 +93,9 @@ ApplicationBasicInfo[] getApplicationBasicInfo(String filter, int offset, int li /** * Get all basic application information for a matching filter based on the offset and the limit. * - * @param filter Application name filter. - * @param offset Starting index of the count. - * @param limit Count value. + * @param filter Application name filter. + * @param offset Starting index of the count. + * @param limit Count value. * @param excludeSystemPortals Exclude system portals * @return An array of {@link ApplicationBasicInfo} instances matching the given filter within the given limit. * @throws IdentityApplicationManagementException Error in retrieving basic application information based on the @@ -119,7 +119,7 @@ ApplicationBasicInfo[] getApplicationBasicInfo(String filter, int offset, int li * @param filter application search filter * @return matched application count in a int value * @throws IdentityApplicationManagementException - * @Deprecated This is being deprecated as introducing excludeSystemPortals to exclude system portals in response + * @Deprecated This is being deprecated as introducing excludeSystemPortals to exclude system portals in response. * use {@link PaginatableFilterableApplicationDAO#getCountOfApplications(String, Boolean)}. */ int getCountOfApplications(String filter) throws IdentityApplicationManagementException; diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationDAOImpl.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationDAOImpl.java index 79bc9a07ba96..c37daaf44de1 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationDAOImpl.java @@ -175,9 +175,9 @@ import static org.wso2.carbon.identity.application.common.util.IdentityApplicationConstants.TEMPLATE_VERSION_SP_PROPERTY_NAME; import static org.wso2.carbon.identity.application.common.util.IdentityApplicationConstants.TRUSTED_APP_CONSENT_GRANTED_SP_PROPERTY_DISPLAY_NAME; import static org.wso2.carbon.identity.application.common.util.IdentityApplicationConstants.TRUSTED_APP_CONSENT_GRANTED_SP_PROPERTY_NAME; -import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.APPLICATION_NAME_CONFIG_ELEMENT; import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.LOCAL_SP; import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.ORACLE; +import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.PORTAL_NAME_CONFIG_ELEMENT; import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.SYSTEM_PORTALS; import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.UNION_SEPARATOR; import static org.wso2.carbon.identity.application.mgt.ApplicationMgtUtil.getConsoleAccessUrlFromServerConfig; @@ -2189,21 +2189,25 @@ public ApplicationBasicInfo[] getApplicationBasicInfo(String filter, int offset, */ private String populateSystemPortalsExcludeQuery(Boolean excludeSystemPortals) { - return excludeSystemPortals ? - String.format(ApplicationMgtDBQueries.EXCLUDE_SYSTEM_PORTALS_BY_NAME, - getApplications(SYSTEM_PORTALS).stream() - .map(s -> "'" + s + "'") - .collect(Collectors.joining(", "))) - : ""; + if (excludeSystemPortals) { + Set systemPortals = getSystemPortalsFromConfiguration(SYSTEM_PORTALS); + return systemPortals.isEmpty() ? "" : + String.format(ApplicationMgtDBQueries.EXCLUDE_SYSTEM_PORTALS_BY_NAME, + systemPortals.stream() + .map(s -> "'" + s + "'") + .collect(Collectors.joining(", "))); + } else { + return ""; + } } /** * Get system portals from configuration. * - * @param parentElement - * @return + * @param parentElement Configuration tag name. + * @return Set of system portals from default.json. */ - private static Set getApplications(String parentElement) { + private static Set getSystemPortalsFromConfiguration(String parentElement) { IdentityConfigParser configParser = IdentityConfigParser.getInstance(); OMElement systemApplicationsConfig = configParser.getConfigElement(parentElement); @@ -2215,10 +2219,10 @@ private static Set getApplications(String parentElement) { } Iterator applicationIdentifierIterator = systemApplicationsConfig - .getChildrenWithLocalName(APPLICATION_NAME_CONFIG_ELEMENT); + .getChildrenWithLocalName(PORTAL_NAME_CONFIG_ELEMENT); if (applicationIdentifierIterator == null) { if (log.isDebugEnabled()) { - log.debug("'" + APPLICATION_NAME_CONFIG_ELEMENT + "' config not found."); + log.debug("'" + PORTAL_NAME_CONFIG_ELEMENT + "' config not found."); } return Collections.emptySet(); } @@ -2231,7 +2235,6 @@ private static Set getApplications(String parentElement) { applications.add(applicationName.trim()); } } - return applications; } @@ -4036,8 +4039,9 @@ public int getCountOfApplications(String filter) throws IdentityApplicationManag /** * Get count of applications for user which has the filter string * - * @param filter - * @return + * @param filter Filter string. + * @param excludeSystemPortals Exclude system portals. + * @return int Count of applications. * @throws IdentityApplicationManagementException */ @Override diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/test/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImplTest.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/test/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImplTest.java index fabba886c63b..66f632859bae 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/test/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImplTest.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/test/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImplTest.java @@ -18,6 +18,7 @@ package org.wso2.carbon.identity.application.mgt; +import org.apache.axiom.om.OMElement; import org.mockito.MockedStatic; import org.mockito.Mockito; import org.testng.Assert; @@ -67,6 +68,7 @@ import org.wso2.carbon.identity.common.testng.realm.InMemoryRealmService; import org.wso2.carbon.identity.common.testng.realm.MockUserStoreManager; import org.wso2.carbon.identity.core.internal.IdentityCoreServiceDataHolder; +import org.wso2.carbon.identity.core.util.IdentityConfigParser; import org.wso2.carbon.identity.core.util.IdentityTenantUtil; import org.wso2.carbon.identity.core.util.IdentityUtil; import org.wso2.carbon.identity.secret.mgt.core.IdPSecretsProcessor; @@ -97,6 +99,7 @@ import java.nio.file.Paths; import java.util.Arrays; import java.util.Collections; +import java.util.Iterator; import java.util.List; import static java.lang.Boolean.FALSE; @@ -110,6 +113,8 @@ import static org.wso2.carbon.identity.application.common.util.IdentityApplicationConstants.PlatformType; import static org.wso2.carbon.identity.application.common.util.IdentityApplicationConstants.TEMPLATE_ID_SP_PROPERTY_NAME; import static org.wso2.carbon.identity.application.common.util.IdentityApplicationConstants.TEMPLATE_VERSION_SP_PROPERTY_NAME; +import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.APPLICATION_NAME_CONFIG_ELEMENT; +import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.SYSTEM_PORTALS; import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.TRUSTED_APP_CONSENT_REQUIRED_PROPERTY; import static org.wso2.carbon.utils.multitenancy.MultitenantConstants.SUPER_TENANT_DOMAIN_NAME; import static org.wso2.carbon.utils.multitenancy.MultitenantConstants.SUPER_TENANT_ID; @@ -124,6 +129,7 @@ public class ApplicationManagementServiceImplTest { private static final String SAMPLE_TENANT_DOMAIN = "tenant domain"; private static final String APPLICATION_NAME_1 = "Test application1"; private static final String APPLICATION_NAME_2 = "Test application2"; + private static final String APPLICATION_NAME_3 = "Test application3"; private static final String APPLICATION_TEMPLATE_ID_1 = "Test_template_1"; private static final String APPLICATION_TEMPLATE_ID_2 = "Test_template_2"; private static final String APPLICATION_TEMPLATE_VERSION_1 = "v1.0.0"; @@ -132,6 +138,7 @@ public class ApplicationManagementServiceImplTest { private static final String APPLICATION_INBOUND_AUTH_KEY_2 = "Test_auth_key2"; private static final String APPLICATION_NAME_FILTER_1 = "name ew application1"; private static final String APPLICATION_NAME_FILTER_2 = "name co 2"; + private static final String APPLICATION_NAME_FILTER_3 = "name ew application3"; private static final String APPLICATION_CLIENT_ID_FILTER = "clientId co %s"; private static final String APPLICATION_ISSUER_FILTER = "issuer co %s"; private static final String APPLICATION_NAME_OR_CLIENT_ID_FILTER = "name co sampleAppName or clientId eq %s"; @@ -152,6 +159,7 @@ public class ApplicationManagementServiceImplTest { private IdPManagementDAO idPManagementDAO; private ApplicationManagementServiceImpl applicationManagementService; + private MockedStatic mockedIdentityConfigParser; @BeforeClass public void setup() throws RegistryException, UserStoreException, SecretManagementException { @@ -464,6 +472,99 @@ public void testGetOAuth2ApplicationBasicInfoWithFilterOffsetLimit(String filter // Deleting all added applications. applicationManagementService.deleteApplications(SUPER_TENANT_ID); } + + @DataProvider(name = "getAppsExcludingSystemPortalsDataProvider") + public Object[][] getAppsExcludingSystemPortals() { + + return new Object[][]{ + {APPLICATION_NAME_FILTER_1, 1}, + {APPLICATION_NAME_FILTER_3, 0} + }; + } + + private void setupExcludeSystemPortalsEnv() throws IdentityApplicationManagementException { + + ServiceProvider serviceProvider1 = new ServiceProvider(); + serviceProvider1.setApplicationName(APPLICATION_NAME_1); + + ServiceProvider serviceProvider2 = new ServiceProvider(); + serviceProvider2.setApplicationName(APPLICATION_NAME_2); + + ServiceProvider serviceProvider3 = new ServiceProvider(); + serviceProvider3.setApplicationName(APPLICATION_NAME_3); + + applicationManagementService.addApplication(serviceProvider1, SUPER_TENANT_DOMAIN_NAME, USERNAME_1); + applicationManagementService.addApplication(serviceProvider2, SUPER_TENANT_DOMAIN_NAME, USERNAME_1); + applicationManagementService.addApplication(serviceProvider3, SUPER_TENANT_DOMAIN_NAME, USERNAME_1); + + IdentityConfigParser mockConfigParser = Mockito.mock(IdentityConfigParser.class); + mockedIdentityConfigParser = Mockito.mockStatic(IdentityConfigParser.class); + mockedIdentityConfigParser.when(IdentityConfigParser::getInstance).thenReturn(mockConfigParser); + OMElement mockOMElement = mock(OMElement.class); + Iterator portals = mock(Iterator.class); + OMElement mockPortalsOMElement = mock(OMElement.class); + + when(mockConfigParser.getConfigElement(SYSTEM_PORTALS)).thenReturn(mockOMElement); + when(mockOMElement.getChildrenWithLocalName(APPLICATION_NAME_CONFIG_ELEMENT)).thenReturn(portals); + when(portals.hasNext()).thenReturn(true).thenReturn(false); + when(portals.next()).thenReturn(mockPortalsOMElement); + when(mockPortalsOMElement.getText()).thenReturn(APPLICATION_NAME_3); + } + + @Test + public void testGetApplicationBasicInfoExcludingSystemPortals() throws IdentityApplicationManagementException { + + setupExcludeSystemPortalsEnv(); + + ApplicationBasicInfo[] applicationBasicInfo = applicationManagementService.getApplicationBasicInfo + (SUPER_TENANT_DOMAIN_NAME, USERNAME_1, "", 0, 10, true); + Assert.assertEquals(applicationBasicInfo.length, 2); + + // Deleting all added applications. + applicationManagementService.deleteApplications(SUPER_TENANT_ID); + mockedIdentityConfigParser.close(); + } + + @Test(dataProvider = "getAppsExcludingSystemPortalsDataProvider") + public void testGetApplicationBasicInfoWithFilterExcludingSystemPortals(String filter, int expectedResult) + throws IdentityApplicationManagementException { + + setupExcludeSystemPortalsEnv(); + + ApplicationBasicInfo[] applicationBasicInfo = applicationManagementService.getApplicationBasicInfo + (SUPER_TENANT_DOMAIN_NAME, USERNAME_1, filter, 0, 10, true); + Assert.assertEquals(applicationBasicInfo.length, expectedResult); + + // Deleting all added applications. + applicationManagementService.deleteApplications(SUPER_TENANT_ID); + mockedIdentityConfigParser.close(); + } + + @Test + public void testGetCountOfApplicationsExcludingSystemPortals() + throws IdentityApplicationManagementException { + + setupExcludeSystemPortalsEnv(); + Assert.assertEquals(applicationManagementService.getCountOfApplications(SUPER_TENANT_DOMAIN_NAME, USERNAME_1, + "", true), 2); + + // Deleting all added applications. + applicationManagementService.deleteApplications(SUPER_TENANT_ID); + mockedIdentityConfigParser.close(); + } + + @Test(dataProvider = "getAppsExcludingSystemPortalsDataProvider") + public void testGetCountOfApplicationsWithFilterExcludingSystemPortals(String filter, int expectedResult) + throws IdentityApplicationManagementException { + + setupExcludeSystemPortalsEnv(); + Assert.assertEquals(applicationManagementService.getCountOfApplications(SUPER_TENANT_DOMAIN_NAME, USERNAME_1, + filter, true), expectedResult); + + // Deleting all added applications. + applicationManagementService.deleteApplications(SUPER_TENANT_ID); + mockedIdentityConfigParser.close(); + } @Test public void testCreateAndGetApplicationWithProtocolService() throws IdentityApplicationManagementException { diff --git a/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/identity.xml.j2 b/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/identity.xml.j2 index 5b27eb8a3207..d83027b4da0a 100644 --- a/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/identity.xml.j2 +++ b/features/identity-core/org.wso2.carbon.identity.core.server.feature/resources/identity.xml.j2 @@ -4032,7 +4032,7 @@ {% if system_applications.system_portals is defined %} {% for application in system_applications.system_portals %} - {{application}} + {{application}} {% endfor %} {% endif %} From 390d2fe79c6ef33c9fb2b82d0c545d835823a303 Mon Sep 17 00:00:00 2001 From: JeethJJ Date: Wed, 16 Oct 2024 10:50:41 +0530 Subject: [PATCH 3/4] Add testcase fix. --- .../mgt/dao/impl/ApplicationDAOImpl.java | 19 +++++++++++-------- .../mgt/dao/impl/ApplicationMgtDBQueries.java | 3 ++- .../ApplicationManagementServiceImplTest.java | 4 ++-- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationDAOImpl.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationDAOImpl.java index c37daaf44de1..dabb855da935 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationDAOImpl.java @@ -2107,7 +2107,7 @@ public ApplicationBasicInfo[] getApplicationBasicInfo(String filter, int offset, List filterValues = filterData.getFilterValues(); String filterString = filterData.getFilterString(); - String excludeSystemPortalsQueryString = populateSystemPortalsExcludeQuery(excludeSystemPortals); + String excludeSystemPortalsQueryString = populateSystemPortalsExcludeQuery(excludeSystemPortals, true); String databaseProductName = connection.getMetaData().getDatabaseProductName(); if (databaseProductName.contains("MySQL") @@ -2184,16 +2184,19 @@ public ApplicationBasicInfo[] getApplicationBasicInfo(String filter, int offset, /** * Get query to exclude system portals if excludeSystemPortals is true. * - * @param excludeSystemPortals Exclude system portals. - * @return + * @param excludeSystemPortals Exclude system portals. + * @param useTableNameInQuery Use the table name in query. + * @return String Query to exclude system portals. */ - private String populateSystemPortalsExcludeQuery(Boolean excludeSystemPortals) { + private String populateSystemPortalsExcludeQuery(Boolean excludeSystemPortals, Boolean useTableNameInQuery) { if (excludeSystemPortals) { + String excludeSystemPortalsQuery = useTableNameInQuery ? + ApplicationMgtDBQueries.EXCLUDE_SYSTEM_PORTALS_BY_TABLE_NAME_AND_NAME : + ApplicationMgtDBQueries.EXCLUDE_SYSTEM_PORTALS_BY_NAME; Set systemPortals = getSystemPortalsFromConfiguration(SYSTEM_PORTALS); return systemPortals.isEmpty() ? "" : - String.format(ApplicationMgtDBQueries.EXCLUDE_SYSTEM_PORTALS_BY_NAME, - systemPortals.stream() + String.format(excludeSystemPortalsQuery, systemPortals.stream() .map(s -> "'" + s + "'") .collect(Collectors.joining(", "))); } else { @@ -4061,7 +4064,7 @@ public int getCountOfApplications(String filter, Boolean excludeSystemPortals) FilterData filterData = getFilterDataForDBQuery(filter); String filterString = filterData.getFilterString(); - String excludeSystemPortalsQueryString = populateSystemPortalsExcludeQuery(excludeSystemPortals); + String excludeSystemPortalsQueryString = populateSystemPortalsExcludeQuery(excludeSystemPortals, true); try { String filterValueResolvedForSQL; @@ -4223,7 +4226,7 @@ public ApplicationBasicInfo[] getApplicationBasicInfo(int offset, int limit, Boo ResultSet appNameResultSet = null; String sqlQuery; ArrayList appInfo = new ArrayList(); - String excludeSystemPortalsQueryString = populateSystemPortalsExcludeQuery(excludeSystemPortals); + String excludeSystemPortalsQueryString = populateSystemPortalsExcludeQuery(excludeSystemPortals, false); try { String databaseProductName = connection.getMetaData().getDatabaseProductName(); diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationMgtDBQueries.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationMgtDBQueries.java index d1900e9be289..f59a91d5c78e 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationMgtDBQueries.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationMgtDBQueries.java @@ -259,7 +259,8 @@ public class ApplicationMgtDBQueries { "THUMBPRINTS, IS_FIDO_TRUSTED FROM SP_TRUSTED_APPS WHERE SP_ID = ? AND TENANT_ID = ?"; public static final String LOAD_TRUSTED_APPS_BY_PLATFORM_TYPE = "SELECT APP_IDENTIFIER, THUMBPRINTS, " + "IS_FIDO_TRUSTED FROM SP_TRUSTED_APPS WHERE PLATFORM_TYPE = ?"; - public static final String EXCLUDE_SYSTEM_PORTALS_BY_NAME = "AND SP_APP.APP_NAME NOT IN (%s)"; + public static final String EXCLUDE_SYSTEM_PORTALS_BY_TABLE_NAME_AND_NAME = "AND SP_APP.APP_NAME NOT IN (%s)"; + public static final String EXCLUDE_SYSTEM_PORTALS_BY_NAME = "AND APP_NAME NOT IN (%s)"; // DELETE queries public static final String REMOVE_APP_FROM_APPMGT_APP = "DELETE FROM SP_APP WHERE APP_NAME = ? AND TENANT_ID = ?"; diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/test/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImplTest.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/test/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImplTest.java index 66f632859bae..09d24fb231a2 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/test/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImplTest.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/test/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImplTest.java @@ -113,7 +113,7 @@ import static org.wso2.carbon.identity.application.common.util.IdentityApplicationConstants.PlatformType; import static org.wso2.carbon.identity.application.common.util.IdentityApplicationConstants.TEMPLATE_ID_SP_PROPERTY_NAME; import static org.wso2.carbon.identity.application.common.util.IdentityApplicationConstants.TEMPLATE_VERSION_SP_PROPERTY_NAME; -import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.APPLICATION_NAME_CONFIG_ELEMENT; +import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.PORTAL_NAME_CONFIG_ELEMENT; import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.SYSTEM_PORTALS; import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.TRUSTED_APP_CONSENT_REQUIRED_PROPERTY; import static org.wso2.carbon.utils.multitenancy.MultitenantConstants.SUPER_TENANT_DOMAIN_NAME; @@ -505,7 +505,7 @@ private void setupExcludeSystemPortalsEnv() throws IdentityApplicationManagement OMElement mockPortalsOMElement = mock(OMElement.class); when(mockConfigParser.getConfigElement(SYSTEM_PORTALS)).thenReturn(mockOMElement); - when(mockOMElement.getChildrenWithLocalName(APPLICATION_NAME_CONFIG_ELEMENT)).thenReturn(portals); + when(mockOMElement.getChildrenWithLocalName(PORTAL_NAME_CONFIG_ELEMENT)).thenReturn(portals); when(portals.hasNext()).thenReturn(true).thenReturn(false); when(portals.next()).thenReturn(mockPortalsOMElement); when(mockPortalsOMElement.getText()).thenReturn(APPLICATION_NAME_3); From 9ab5dadbb9c0b0f8ceffa6a997e49f282954572b Mon Sep 17 00:00:00 2001 From: JeethJJ Date: Wed, 16 Oct 2024 18:44:08 +0530 Subject: [PATCH 4/4] Address comments. --- .../application/mgt/ApplicationConstants.java | 2 +- .../mgt/ApplicationManagementService.java | 9 +-- .../mgt/ApplicationManagementServiceImpl.java | 2 + .../ApplicationPaginationAndSearching.java | 42 +++++++---- .../PaginatableFilterableApplicationDAO.java | 44 +++++++---- .../mgt/dao/impl/ApplicationDAOImpl.java | 52 ++----------- .../dao/impl/CacheBackedApplicationDAO.java | 4 + .../ApplicationManagementServiceImplTest.java | 75 +++++++++---------- 8 files changed, 104 insertions(+), 126 deletions(-) diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationConstants.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationConstants.java index 5c30320fb9ff..9ed1349fb742 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationConstants.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationConstants.java @@ -102,7 +102,7 @@ private ApplicationConstants() { public static final String SYSTEM_APPLICATIONS_CONFIG_ELEMENT = "SystemApplications"; public static final String DEFAULT_APPLICATIONS_CONFIG_ELEMENT = "DefaultApplications"; public static final String APPLICATION_NAME_CONFIG_ELEMENT = "ApplicationName"; - public static final String PORTAL_NAME_CONFIG_ELEMENT = "PortalName"; + public static final String PORTAL_NAMES_CONFIG_ELEMENT = "SystemPortals.PortalName"; // Application Management Service Configurations. public static final String ENABLE_APPLICATION_ROLE_VALIDATION_PROPERTY = "ApplicationMgt.EnableRoleValidation"; diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementService.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementService.java index 8fd2cb30307d..5f469a4ed23a 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementService.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementService.java @@ -466,6 +466,7 @@ public List getTrustedApps(PlatformType platformType) throws Identit return new ArrayList<>(); } + @Deprecated @Override public ApplicationBasicInfo[] getApplicationBasicInfo(String tenantDomain, String username, String filter, int offset, int limit) @@ -474,14 +475,6 @@ public ApplicationBasicInfo[] getApplicationBasicInfo(String tenantDomain, Strin return getApplicationBasicInfo(tenantDomain, username, filter, offset, limit, false); } - @Override - public ApplicationBasicInfo[] getApplicationBasicInfo(String tenantDomain, String username, String filter, - int offset, int limit, Boolean excludeSystemPortals) - throws IdentityApplicationManagementException { - - return new ApplicationBasicInfo[0]; - } - /** * Retrieve application basic information using the application name. * diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImpl.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImpl.java index d7e27d99c171..7c26a56ef327 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImpl.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImpl.java @@ -556,6 +556,7 @@ public ApplicationBasicInfo[] getPaginatedApplicationBasicInfo(String tenantDoma * @return An array of {@link ApplicationBasicInfo} instances within the limit. * @throws IdentityApplicationManagementException Error in retrieving basic application information. */ + @Deprecated @Override public ApplicationBasicInfo[] getApplicationBasicInfo(String tenantDomain, String username, String filter, int offset, int limit) @@ -690,6 +691,7 @@ public int getCountOfAllApplications(String tenantDomain, String username) * @return int * @throws IdentityApplicationManagementException */ + @Deprecated @Override public int getCountOfApplications(String tenantDomain, String username, String filter) throws IdentityApplicationManagementException { diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationPaginationAndSearching.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationPaginationAndSearching.java index 32562256af1b..921d0a201aed 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationPaginationAndSearching.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/ApplicationPaginationAndSearching.java @@ -94,27 +94,32 @@ ApplicationBasicInfo[] getPaginatedApplicationBasicInfo(String tenantDomain, Str * @param limit Counting value. * @return An array of {@link ApplicationBasicInfo} instances matching the given filter within the given limit. * @throws IdentityApplicationManagementException Error in retrieving basic application information. - * @Deprecated This is being deprecated as introducing excludeSystemPortals to exclude system portals in response + * @Deprecated This is being deprecated as introducing excludeSystemPortals to exclude system portals in response. * use {@link ApplicationPaginationAndSearching#getApplicationBasicInfo(String, String, String, int, int, Boolean)}. */ + @Deprecated ApplicationBasicInfo[] getApplicationBasicInfo(String tenantDomain, String username, String filter, int offset, int limit) throws IdentityApplicationManagementException; /** * Get all basic application information for a matching filter with pagination based on the offset and limit. * - * @param tenantDomain Tenant Domain. - * @param username User name. - * @param filter Application name filter. - * @param offset Starting index of the count. - * @param limit Counting value. - * @param excludeSystemPortals Exclude system portals. + * @param tenantDomain Tenant Domain. + * @param username User name. + * @param filter Application name filter. + * @param offset Starting index of the count. + * @param limit Counting value. + * @param excludeSystemPortals Exclude system portals. * @return An array of {@link ApplicationBasicInfo} instances matching the given filter within the given limit. * @throws IdentityApplicationManagementException Error in retrieving basic application information. */ - ApplicationBasicInfo[] getApplicationBasicInfo(String tenantDomain, String username, String filter, int offset, - int limit, Boolean excludeSystemPortals) - throws IdentityApplicationManagementException; + default ApplicationBasicInfo[] getApplicationBasicInfo(String tenantDomain, String username, String filter, + int offset, + int limit, Boolean excludeSystemPortals) + throws IdentityApplicationManagementException { + + return new ApplicationBasicInfo[0]; + } /** * Get count of all Application Basic Information. @@ -138,20 +143,25 @@ int getCountOfAllApplications(String tenantDomain, String username) * @Deprecated This is being deprecated as introducing excludeSystemPortals to exclude system portals in response. * use {@link ApplicationPaginationAndSearching#getCountOfApplications(String, String, String, Boolean)}. */ + @Deprecated int getCountOfApplications(String tenantDomain, String username, String filter) throws IdentityApplicationManagementException; /** * Get count of all basic application information for a matching filter. * - * @param tenantDomain Tenant Domain. - * @param username User Name. - * @param filter Application name filter. - * @param excludeSystemPortals Exclude system portals. + * @param tenantDomain Tenant Domain. + * @param username User Name. + * @param filter Application name filter. + * @param excludeSystemPortals Exclude system portals. * @return int Count of applications. * @throws org.wso2.carbon.identity.application.common.IdentityApplicationManagementException */ - int getCountOfApplications(String tenantDomain, String username, String filter, Boolean excludeSystemPortals) - throws IdentityApplicationManagementException; + default int getCountOfApplications(String tenantDomain, String username, String filter, + Boolean excludeSystemPortals) + throws IdentityApplicationManagementException { + + return 0; + } } diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/PaginatableFilterableApplicationDAO.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/PaginatableFilterableApplicationDAO.java index 73ce75fdfa6e..8b3e0262ab59 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/PaginatableFilterableApplicationDAO.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/PaginatableFilterableApplicationDAO.java @@ -49,19 +49,23 @@ ApplicationBasicInfo[] getAllPaginatedApplicationBasicInfo(int pageNumber) throw * @Deprecated This is being deprecated as introducing excludeSystemPortals to exclude system portals in response. * use {@link PaginatableFilterableApplicationDAO#getApplicationBasicInfo(int, int, Boolean)}. */ + @Deprecated ApplicationBasicInfo[] getApplicationBasicInfo(int offset, int limit) throws IdentityApplicationManagementException; /** * Get all the basic application information based on the offset and the limit. * - * @param offset Starting index of the count. - * @param limit Count value. - * @param excludeSystemPortals Exclude system portals. + * @param offset Starting index of the count. + * @param limit Count value. + * @param excludeSystemPortals Exclude system portals. * @return An array of {@link ApplicationBasicInfo} instances within the limit. * @throws IdentityApplicationManagementException Error in retrieving basic application information. */ - ApplicationBasicInfo[] getApplicationBasicInfo(int offset, int limit, Boolean excludeSystemPortals) - throws IdentityApplicationManagementException; + default ApplicationBasicInfo[] getApplicationBasicInfo(int offset, int limit, Boolean excludeSystemPortals) + throws IdentityApplicationManagementException { + + return null; + } /** * Get all basic application information for a matching filter that falls under the given page number. @@ -87,23 +91,27 @@ ApplicationBasicInfo[] getPaginatedApplicationBasicInfo(int pageNumber, String f * @Deprecated This is being deprecated as introducing excludeSystemPortals to exclude system portals in response. * use {@link PaginatableFilterableApplicationDAO#getApplicationBasicInfo(String, int, int, Boolean)}. */ + @Deprecated ApplicationBasicInfo[] getApplicationBasicInfo(String filter, int offset, int limit) throws IdentityApplicationManagementException; /** * Get all basic application information for a matching filter based on the offset and the limit. * - * @param filter Application name filter. - * @param offset Starting index of the count. - * @param limit Count value. - * @param excludeSystemPortals Exclude system portals + * @param filter Application name filter. + * @param offset Starting index of the count. + * @param limit Count value. + * @param excludeSystemPortals Exclude system portals * @return An array of {@link ApplicationBasicInfo} instances matching the given filter within the given limit. * @throws IdentityApplicationManagementException Error in retrieving basic application information based on the * given filter within the given limit. - * */ - ApplicationBasicInfo[] getApplicationBasicInfo(String filter, int offset, int limit, Boolean excludeSystemPortals) - throws IdentityApplicationManagementException; + default ApplicationBasicInfo[] getApplicationBasicInfo(String filter, int offset, int limit, + Boolean excludeSystemPortals) + throws IdentityApplicationManagementException { + + return null; + } /** * Get count of applications. @@ -122,18 +130,22 @@ ApplicationBasicInfo[] getApplicationBasicInfo(String filter, int offset, int li * @Deprecated This is being deprecated as introducing excludeSystemPortals to exclude system portals in response. * use {@link PaginatableFilterableApplicationDAO#getCountOfApplications(String, Boolean)}. */ + @Deprecated int getCountOfApplications(String filter) throws IdentityApplicationManagementException; /** * Get count of applications matching the filter. * - * @param filter application search filter - * @param excludeSystemPortals Exclude system portals + * @param filter application search filter + * @param excludeSystemPortals Exclude system portals * @return matched application count in a int value * @throws IdentityApplicationManagementException */ - int getCountOfApplications(String filter, Boolean excludeSystemPortals) throws - IdentityApplicationManagementException; + default int getCountOfApplications(String filter, Boolean excludeSystemPortals) throws + IdentityApplicationManagementException { + + return 0; + } /** * Get all basic application information for a matching filter. diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationDAOImpl.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationDAOImpl.java index dabb855da935..94f128adbbbb 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/ApplicationDAOImpl.java @@ -18,7 +18,6 @@ package org.wso2.carbon.identity.application.mgt.dao.impl; -import org.apache.axiom.om.OMElement; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.ArrayUtils; @@ -87,7 +86,6 @@ import org.wso2.carbon.identity.core.model.FilterTreeBuilder; import org.wso2.carbon.identity.core.model.Node; import org.wso2.carbon.identity.core.model.OperationNode; -import org.wso2.carbon.identity.core.util.IdentityConfigParser; import org.wso2.carbon.identity.core.util.IdentityDatabaseUtil; import org.wso2.carbon.identity.core.util.IdentityTenantUtil; import org.wso2.carbon.identity.core.util.IdentityUtil; @@ -124,7 +122,6 @@ import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -177,8 +174,7 @@ import static org.wso2.carbon.identity.application.common.util.IdentityApplicationConstants.TRUSTED_APP_CONSENT_GRANTED_SP_PROPERTY_NAME; import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.LOCAL_SP; import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.ORACLE; -import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.PORTAL_NAME_CONFIG_ELEMENT; -import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.SYSTEM_PORTALS; +import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.PORTAL_NAMES_CONFIG_ELEMENT; import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.UNION_SEPARATOR; import static org.wso2.carbon.identity.application.mgt.ApplicationMgtUtil.getConsoleAccessUrlFromServerConfig; import static org.wso2.carbon.identity.application.mgt.ApplicationMgtUtil.getMyAccountAccessUrlFromServerConfig; @@ -2075,6 +2071,7 @@ public ApplicationBasicInfo[] getPaginatedApplicationBasicInfo(int pageNumber, S return getApplicationBasicInfo(filter, offset, limit); } + @Deprecated @Override public ApplicationBasicInfo[] getApplicationBasicInfo(String filter, int offset, int limit) throws IdentityApplicationManagementException { @@ -2194,51 +2191,14 @@ private String populateSystemPortalsExcludeQuery(Boolean excludeSystemPortals, B String excludeSystemPortalsQuery = useTableNameInQuery ? ApplicationMgtDBQueries.EXCLUDE_SYSTEM_PORTALS_BY_TABLE_NAME_AND_NAME : ApplicationMgtDBQueries.EXCLUDE_SYSTEM_PORTALS_BY_NAME; - Set systemPortals = getSystemPortalsFromConfiguration(SYSTEM_PORTALS); - return systemPortals.isEmpty() ? "" : + List systemPortals = IdentityUtil.getPropertyAsList(PORTAL_NAMES_CONFIG_ELEMENT); + return systemPortals.isEmpty() ? StringUtils.EMPTY : String.format(excludeSystemPortalsQuery, systemPortals.stream() .map(s -> "'" + s + "'") .collect(Collectors.joining(", "))); } else { - return ""; - } - } - - /** - * Get system portals from configuration. - * - * @param parentElement Configuration tag name. - * @return Set of system portals from default.json. - */ - private static Set getSystemPortalsFromConfiguration(String parentElement) { - - IdentityConfigParser configParser = IdentityConfigParser.getInstance(); - OMElement systemApplicationsConfig = configParser.getConfigElement(parentElement); - if (systemApplicationsConfig == null) { - if (log.isDebugEnabled()) { - log.debug("'" + parentElement + "' config not found."); - } - return Collections.emptySet(); - } - - Iterator applicationIdentifierIterator = systemApplicationsConfig - .getChildrenWithLocalName(PORTAL_NAME_CONFIG_ELEMENT); - if (applicationIdentifierIterator == null) { - if (log.isDebugEnabled()) { - log.debug("'" + PORTAL_NAME_CONFIG_ELEMENT + "' config not found."); - } - return Collections.emptySet(); - } - - Set applications = new HashSet<>(); - while (applicationIdentifierIterator.hasNext()) { - OMElement applicationIdentifierConfig = (OMElement) applicationIdentifierIterator.next(); - String applicationName = applicationIdentifierConfig.getText(); - if (StringUtils.isNotBlank(applicationName)) { - applications.add(applicationName.trim()); - } + return StringUtils.EMPTY; } - return applications; } /** @@ -4033,6 +3993,7 @@ private String generateFilterValueForBackend(String searchOperation, String sear * @return * @throws IdentityApplicationManagementException */ + @Deprecated @Override public int getCountOfApplications(String filter) throws IdentityApplicationManagementException { @@ -4206,6 +4167,7 @@ public ApplicationBasicInfo[] getAllPaginatedApplicationBasicInfo(int pageNumber return getApplicationBasicInfo(offset, limit); } + @Deprecated @Override public ApplicationBasicInfo[] getApplicationBasicInfo(int offset, int limit) throws IdentityApplicationManagementException { diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/CacheBackedApplicationDAO.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/CacheBackedApplicationDAO.java index 4a2c173cb074..8874621837b4 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/CacheBackedApplicationDAO.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/main/java/org/wso2/carbon/identity/application/mgt/dao/impl/CacheBackedApplicationDAO.java @@ -289,6 +289,7 @@ public ApplicationBasicInfo[] getAllPaginatedApplicationBasicInfo(int pageNumber } } + @Deprecated @Override public ApplicationBasicInfo[] getApplicationBasicInfo(int offset, int limit) throws IdentityApplicationManagementException { @@ -336,9 +337,11 @@ public ApplicationBasicInfo[] getPaginatedApplicationBasicInfo(int pageNumber, S } } + @Deprecated @Override public ApplicationBasicInfo[] getApplicationBasicInfo(String filter, int offset, int limit) throws IdentityApplicationManagementException { + return getApplicationBasicInfo(filter, offset, limit, false); } @@ -367,6 +370,7 @@ public int getCountOfAllApplications() throws IdentityApplicationManagementExcep } } + @Deprecated public int getCountOfApplications(String filter) throws IdentityApplicationManagementException { return getCountOfApplications(filter, false); diff --git a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/test/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImplTest.java b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/test/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImplTest.java index 09d24fb231a2..ee8bde5b7c0a 100644 --- a/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/test/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImplTest.java +++ b/components/application-mgt/org.wso2.carbon.identity.application.mgt/src/test/java/org/wso2/carbon/identity/application/mgt/ApplicationManagementServiceImplTest.java @@ -18,7 +18,6 @@ package org.wso2.carbon.identity.application.mgt; -import org.apache.axiom.om.OMElement; import org.mockito.MockedStatic; import org.mockito.Mockito; import org.testng.Assert; @@ -68,7 +67,6 @@ import org.wso2.carbon.identity.common.testng.realm.InMemoryRealmService; import org.wso2.carbon.identity.common.testng.realm.MockUserStoreManager; import org.wso2.carbon.identity.core.internal.IdentityCoreServiceDataHolder; -import org.wso2.carbon.identity.core.util.IdentityConfigParser; import org.wso2.carbon.identity.core.util.IdentityTenantUtil; import org.wso2.carbon.identity.core.util.IdentityUtil; import org.wso2.carbon.identity.secret.mgt.core.IdPSecretsProcessor; @@ -99,7 +97,6 @@ import java.nio.file.Paths; import java.util.Arrays; import java.util.Collections; -import java.util.Iterator; import java.util.List; import static java.lang.Boolean.FALSE; @@ -113,8 +110,7 @@ import static org.wso2.carbon.identity.application.common.util.IdentityApplicationConstants.PlatformType; import static org.wso2.carbon.identity.application.common.util.IdentityApplicationConstants.TEMPLATE_ID_SP_PROPERTY_NAME; import static org.wso2.carbon.identity.application.common.util.IdentityApplicationConstants.TEMPLATE_VERSION_SP_PROPERTY_NAME; -import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.PORTAL_NAME_CONFIG_ELEMENT; -import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.SYSTEM_PORTALS; +import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.PORTAL_NAMES_CONFIG_ELEMENT; import static org.wso2.carbon.identity.application.mgt.ApplicationConstants.TRUSTED_APP_CONSENT_REQUIRED_PROPERTY; import static org.wso2.carbon.utils.multitenancy.MultitenantConstants.SUPER_TENANT_DOMAIN_NAME; import static org.wso2.carbon.utils.multitenancy.MultitenantConstants.SUPER_TENANT_ID; @@ -159,7 +155,6 @@ public class ApplicationManagementServiceImplTest { private IdPManagementDAO idPManagementDAO; private ApplicationManagementServiceImpl applicationManagementService; - private MockedStatic mockedIdentityConfigParser; @BeforeClass public void setup() throws RegistryException, UserStoreException, SecretManagementException { @@ -482,7 +477,8 @@ public Object[][] getAppsExcludingSystemPortals() { }; } - private void setupExcludeSystemPortalsEnv() throws IdentityApplicationManagementException { + private void setupExcludeSystemPortalsEnv() + throws IdentityApplicationManagementException { ServiceProvider serviceProvider1 = new ServiceProvider(); serviceProvider1.setApplicationName(APPLICATION_NAME_1); @@ -496,33 +492,22 @@ private void setupExcludeSystemPortalsEnv() throws IdentityApplicationManagement applicationManagementService.addApplication(serviceProvider1, SUPER_TENANT_DOMAIN_NAME, USERNAME_1); applicationManagementService.addApplication(serviceProvider2, SUPER_TENANT_DOMAIN_NAME, USERNAME_1); applicationManagementService.addApplication(serviceProvider3, SUPER_TENANT_DOMAIN_NAME, USERNAME_1); - - IdentityConfigParser mockConfigParser = Mockito.mock(IdentityConfigParser.class); - mockedIdentityConfigParser = Mockito.mockStatic(IdentityConfigParser.class); - mockedIdentityConfigParser.when(IdentityConfigParser::getInstance).thenReturn(mockConfigParser); - OMElement mockOMElement = mock(OMElement.class); - Iterator portals = mock(Iterator.class); - OMElement mockPortalsOMElement = mock(OMElement.class); - - when(mockConfigParser.getConfigElement(SYSTEM_PORTALS)).thenReturn(mockOMElement); - when(mockOMElement.getChildrenWithLocalName(PORTAL_NAME_CONFIG_ELEMENT)).thenReturn(portals); - when(portals.hasNext()).thenReturn(true).thenReturn(false); - when(portals.next()).thenReturn(mockPortalsOMElement); - when(mockPortalsOMElement.getText()).thenReturn(APPLICATION_NAME_3); } @Test public void testGetApplicationBasicInfoExcludingSystemPortals() throws IdentityApplicationManagementException { setupExcludeSystemPortalsEnv(); - - ApplicationBasicInfo[] applicationBasicInfo = applicationManagementService.getApplicationBasicInfo - (SUPER_TENANT_DOMAIN_NAME, USERNAME_1, "", 0, 10, true); - Assert.assertEquals(applicationBasicInfo.length, 2); - + try (MockedStatic identityUtil = Mockito.mockStatic(IdentityUtil.class)) { + List systemApp = Arrays.asList(APPLICATION_NAME_3); + identityUtil.when(() -> IdentityUtil.getPropertyAsList(PORTAL_NAMES_CONFIG_ELEMENT)) + .thenReturn(systemApp); + ApplicationBasicInfo[] applicationBasicInfo = applicationManagementService.getApplicationBasicInfo + (SUPER_TENANT_DOMAIN_NAME, USERNAME_1, "", 0, 10, true); + Assert.assertEquals(applicationBasicInfo.length, 2); + } // Deleting all added applications. applicationManagementService.deleteApplications(SUPER_TENANT_ID); - mockedIdentityConfigParser.close(); } @Test(dataProvider = "getAppsExcludingSystemPortalsDataProvider") @@ -530,14 +515,16 @@ public void testGetApplicationBasicInfoWithFilterExcludingSystemPortals(String f throws IdentityApplicationManagementException { setupExcludeSystemPortalsEnv(); - - ApplicationBasicInfo[] applicationBasicInfo = applicationManagementService.getApplicationBasicInfo - (SUPER_TENANT_DOMAIN_NAME, USERNAME_1, filter, 0, 10, true); - Assert.assertEquals(applicationBasicInfo.length, expectedResult); - + try (MockedStatic identityUtil = Mockito.mockStatic(IdentityUtil.class)) { + List systemApp = Arrays.asList(APPLICATION_NAME_3); + identityUtil.when(() -> IdentityUtil.getPropertyAsList(PORTAL_NAMES_CONFIG_ELEMENT)) + .thenReturn(systemApp); + ApplicationBasicInfo[] applicationBasicInfo = applicationManagementService.getApplicationBasicInfo + (SUPER_TENANT_DOMAIN_NAME, USERNAME_1, filter, 0, 10, true); + Assert.assertEquals(applicationBasicInfo.length, expectedResult); + } // Deleting all added applications. applicationManagementService.deleteApplications(SUPER_TENANT_ID); - mockedIdentityConfigParser.close(); } @Test @@ -545,12 +532,16 @@ public void testGetCountOfApplicationsExcludingSystemPortals() throws IdentityApplicationManagementException { setupExcludeSystemPortalsEnv(); - Assert.assertEquals(applicationManagementService.getCountOfApplications(SUPER_TENANT_DOMAIN_NAME, USERNAME_1, - "", true), 2); - + try (MockedStatic identityUtil = Mockito.mockStatic(IdentityUtil.class)) { + List systemApp = Arrays.asList(APPLICATION_NAME_3); + identityUtil.when(() -> IdentityUtil.getPropertyAsList(PORTAL_NAMES_CONFIG_ELEMENT)) + .thenReturn(systemApp); + Assert.assertEquals( + applicationManagementService.getCountOfApplications(SUPER_TENANT_DOMAIN_NAME, USERNAME_1, + "", true), 2); + } // Deleting all added applications. applicationManagementService.deleteApplications(SUPER_TENANT_ID); - mockedIdentityConfigParser.close(); } @Test(dataProvider = "getAppsExcludingSystemPortalsDataProvider") @@ -558,12 +549,16 @@ public void testGetCountOfApplicationsWithFilterExcludingSystemPortals(String fi throws IdentityApplicationManagementException { setupExcludeSystemPortalsEnv(); - Assert.assertEquals(applicationManagementService.getCountOfApplications(SUPER_TENANT_DOMAIN_NAME, USERNAME_1, - filter, true), expectedResult); - + try (MockedStatic identityUtil = Mockito.mockStatic(IdentityUtil.class)) { + List systemApp = Arrays.asList(APPLICATION_NAME_3); + identityUtil.when(() -> IdentityUtil.getPropertyAsList(PORTAL_NAMES_CONFIG_ELEMENT)) + .thenReturn(systemApp); + Assert.assertEquals( + applicationManagementService.getCountOfApplications(SUPER_TENANT_DOMAIN_NAME, USERNAME_1, + filter, true), expectedResult); + } // Deleting all added applications. applicationManagementService.deleteApplications(SUPER_TENANT_ID); - mockedIdentityConfigParser.close(); } @Test