From 30892c28d12ea5602435dc235d966bea66a3e906 Mon Sep 17 00:00:00 2001 From: Alan Davis Date: Tue, 13 Oct 2020 08:53:28 +0100 Subject: [PATCH] Merge 7.0.0-A8 changes to new projects: alfresco-remote-api 8.238 alfresco-repository 8.286 alfresco-data-model 8.158 alfresco-core 8.50 MNT-21936 : Audit query Rest API does not return the correct totalItems (#838) * MNT-21936 : Audit query Rest API does not return the correct totalItems Retrieve audit entries count if it has more items Require new release of alfresco-repository. * MNT-21936 : introduced skipTotalItems property for AuditImpl#listAuditEntries * MNT-21936 : Change skipTotalItems to omitTotalItems to align with API Spec * update alfresco-repository dependency (cherry picked from commit 91c49be12a21b23a87cd04b7584c230b2ec4b569) Bump dependency.webscripts.version from 8.8 to 8.10 (#1252) Bumps `dependency.webscripts.version` from 8.8 to 8.10. Updates `spring-surf-core-configservice` from 8.8 to 8.10 Updates `spring-webscripts` from 8.8 to 8.10 - [Release notes](https://github.com/Alfresco/surf-webscripts/releases) - [Commits](https://github.com/Alfresco/surf-webscripts/compare/spring-surf-webscripts-parent-8.8...spring-surf-webscripts-parent-8.10) Updates `spring-webscripts-api` from 8.8 to 8.10 Updates `spring-webscripts` from 8.8 to 8.10 - [Release notes](https://github.com/Alfresco/surf-webscripts/releases) - [Commits](https://github.com/Alfresco/surf-webscripts/compare/spring-surf-webscripts-parent-8.8...spring-surf-webscripts-parent-8.10) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> (cherry picked from commit 8434f5f06fbd973c24688e5c7ec3d54b8513d858) MNT-21936 : Audit query Rest API does not return the correct totalItems (#1253) * MNT-21936 : Audit query Rest API does not return the correct totalItems Add CountAuditEntryId select, that provides the total number of items for a specific auditApp Add getAuditEntriesCountByApp(long appId) in AuditDAO interface and its implementation in AuditDAOImpl Add getAuditEntriesCountByApp(String applicationName) in AuditComponent interface and its implementation in AuditComponentImpl Add getAuditEntriesCountByApp(String applicationName) in AuditService interface and its implementation in AuditServiceImpl * MNT-21936 : Added default implementation for getAuditEntriesCountByApp() in AuditComponent AuditService and AuditDAOImpl (cherry picked from commit 706251642bb5ef6dbb0a059bf6a0cd4f7b72ab43) --- pom.xml | 2 +- .../org/alfresco/rest/api/impl/AuditImpl.java | 31 +++++++++++++------ .../alfresco/rest/api/tests/AuditAppTest.java | 26 ++++++++++++++++ .../alfresco/repo/audit/AuditComponent.java | 11 +++++++ .../repo/audit/AuditComponentImpl.java | 14 +++++++++ .../alfresco/repo/audit/AuditServiceImpl.java | 9 ++++++ .../alfresco/repo/domain/audit/AuditDAO.java | 11 +++++++ .../domain/audit/ibatis/AuditDAOImpl.java | 12 +++++++ .../service/cmr/audit/AuditService.java | 11 +++++++ .../audit-common-SqlMap.xml | 14 +++++++++ 10 files changed, 131 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index b42f91fcc8..6e05a8972b 100644 --- a/pom.xml +++ b/pom.xml @@ -63,7 +63,7 @@ 3.3.7 1.0.0 2.0.21 - 8.8 + 8.10 1.66 3.5.11 20090211 diff --git a/remote-api/src/main/java/org/alfresco/rest/api/impl/AuditImpl.java b/remote-api/src/main/java/org/alfresco/rest/api/impl/AuditImpl.java index fdb865fc99..344bb73520 100644 --- a/remote-api/src/main/java/org/alfresco/rest/api/impl/AuditImpl.java +++ b/remote-api/src/main/java/org/alfresco/rest/api/impl/AuditImpl.java @@ -280,21 +280,28 @@ public class AuditImpl implements Audit // clear null elements entriesAudit.removeAll(Collections.singleton(null)); - int totalItems = entriesAudit.size(); + int totalRetrievedItems = entriesAudit.size(); + int end = Math.min(limit - 1, totalRetrievedItems); + boolean hasMoreItems = totalRetrievedItems > end; - if (skipCount >= totalItems) + String omitTotalItemsParameter = parameters.getParameter("omitTotalItems"); + boolean omitTotalItems = (null != omitTotalItemsParameter) && Boolean.parseBoolean(omitTotalItemsParameter); + + Integer totalItems; + + if (omitTotalItems) { - List empty = Collections.emptyList(); - return CollectionWithPagingInfo.asPaged(paging, empty, false, totalItems); + totalItems = null; } else { - int end = Math.min(limit - 1, totalItems); - boolean hasMoreItems = totalItems > end; - - entriesAudit = entriesAudit.subList(skipCount, end); - return CollectionWithPagingInfo.asPaged(paging, entriesAudit, hasMoreItems, totalItems); + totalItems = hasMoreItems ? getAuditEntriesCountByApp(auditApplication) : totalRetrievedItems; } + + entriesAudit = (skipCount >= totalRetrievedItems) + ? Collections.emptyList() + : entriesAudit.subList(skipCount, end); + return CollectionWithPagingInfo.asPaged(paging, entriesAudit, hasMoreItems, totalItems); } /** @@ -882,4 +889,10 @@ public class AuditImpl implements Audit } } + + public int getAuditEntriesCountByApp(AuditService.AuditApplication auditApplication) + { + final String applicationName = auditApplication.getKey().substring(1); + return auditService.getAuditEntriesCountByApp(applicationName); + } } diff --git a/remote-api/src/test/java/org/alfresco/rest/api/tests/AuditAppTest.java b/remote-api/src/test/java/org/alfresco/rest/api/tests/AuditAppTest.java index 630e32d44b..a96d9b6db3 100644 --- a/remote-api/src/test/java/org/alfresco/rest/api/tests/AuditAppTest.java +++ b/remote-api/src/test/java/org/alfresco/rest/api/tests/AuditAppTest.java @@ -26,6 +26,7 @@ package org.alfresco.rest.api.tests; import static org.alfresco.rest.api.tests.util.RestApiUtil.toJsonAsStringNonNull; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; @@ -405,6 +406,31 @@ public class AuditAppTest extends AbstractSingleNetworkSiteTest validateAuditEntryFields(ae, auditApp); } + // MNT-21936 Audit query Rest API does not return the correct totalItems + int auditEntriesTotalItems = auditEntries.getPaging().getTotalItems(); + + // set maxItems to 1 + Map params = new HashMap<>(); + params.put("maxItems","1"); + + auditEntries = auditAppsProxy.getAuditAppEntries(auditApp.getId(), params, + HttpServletResponse.SC_OK); + + int AuditEntriesTotalItemsAfterLimit = auditEntries.getPaging().getTotalItems(); + int retrievedAuditEntriesCount = auditEntries.getPaging().getCount(); + // When totalItems are retrieved using getAuditEntriesCountByApp() method that was introduced in MNT-21936 + // 2 audit entries will be created. + assertEquals(auditEntriesTotalItems + 2, AuditEntriesTotalItemsAfterLimit); + assertEquals(1, retrievedAuditEntriesCount); + + // set omitTotalItems to true. + params.put("omitTotalItems", "true"); + auditEntries = auditAppsProxy.getAuditAppEntries(auditApp.getId(), params, + HttpServletResponse.SC_OK); + + // verify that totalItems is null. + assertNull(auditEntries.getPaging().getTotalItems()); + // Negative tests // 401 setRequestContext(networkOne.getId(), networkAdmin, "wrongPassword"); diff --git a/repository/src/main/java/org/alfresco/repo/audit/AuditComponent.java b/repository/src/main/java/org/alfresco/repo/audit/AuditComponent.java index 88ffcbb65d..49e400b582 100644 --- a/repository/src/main/java/org/alfresco/repo/audit/AuditComponent.java +++ b/repository/src/main/java/org/alfresco/repo/audit/AuditComponent.java @@ -261,4 +261,15 @@ public interface AuditComponent * @return a map containing min/max and the associated value */ HashMap getAuditMinMaxByApp(String applicationName, List extremes); + + /** + * Issue an audit query to retrieve count of records for a given application. + * + * @param applicationName the name of the application + * @return a map containing min/max and the associated value + */ + default int getAuditEntriesCountByApp(String applicationName) + { + return -1; + } } diff --git a/repository/src/main/java/org/alfresco/repo/audit/AuditComponentImpl.java b/repository/src/main/java/org/alfresco/repo/audit/AuditComponentImpl.java index 89d9d6a623..18b464c674 100644 --- a/repository/src/main/java/org/alfresco/repo/audit/AuditComponentImpl.java +++ b/repository/src/main/java/org/alfresco/repo/audit/AuditComponentImpl.java @@ -941,4 +941,18 @@ public class AuditComponentImpl implements AuditComponent return auditDAO.getAuditMinMaxByApp(applicationId, extremes); } + + @Override + public int getAuditEntriesCountByApp(String applicationName) + { + // Get the id for the application + AuditApplication app = auditModelRegistry.getAuditApplicationByName(applicationName); + Long applicationId = app.getApplicationId(); + if (applicationId == null) + { + throw new AuditException("No persisted instance exists for audit application: " + app); + } + + return auditDAO.getAuditEntriesCountByApp(applicationId); + } } diff --git a/repository/src/main/java/org/alfresco/repo/audit/AuditServiceImpl.java b/repository/src/main/java/org/alfresco/repo/audit/AuditServiceImpl.java index 51150e709a..0b96cc9304 100644 --- a/repository/src/main/java/org/alfresco/repo/audit/AuditServiceImpl.java +++ b/repository/src/main/java/org/alfresco/repo/audit/AuditServiceImpl.java @@ -177,4 +177,13 @@ public class AuditServiceImpl implements AuditService { return auditComponent.getAuditMinMaxByApp(applicationName, extremes); } + + /** + * {@inheritDoc} + */ + @Override + public int getAuditEntriesCountByApp(String applicationName) + { + return auditComponent.getAuditEntriesCountByApp(applicationName); + } } \ No newline at end of file diff --git a/repository/src/main/java/org/alfresco/repo/domain/audit/AuditDAO.java b/repository/src/main/java/org/alfresco/repo/domain/audit/AuditDAO.java index a435d04485..22180ea78b 100644 --- a/repository/src/main/java/org/alfresco/repo/domain/audit/AuditDAO.java +++ b/repository/src/main/java/org/alfresco/repo/domain/audit/AuditDAO.java @@ -233,4 +233,15 @@ public interface AuditDAO * @return a map containing min/max and the associated value */ HashMap getAuditMinMaxByApp(long appId, List extremes); + + /** + * Issue an audit query to retrieve count of records for a given application. + * + * @param applicationId the database id of the application + * @return a map containing min/max and the associated value + */ + default int getAuditEntriesCountByApp(long applicationId) + { + return -1; + } } \ No newline at end of file diff --git a/repository/src/main/java/org/alfresco/repo/domain/audit/ibatis/AuditDAOImpl.java b/repository/src/main/java/org/alfresco/repo/domain/audit/ibatis/AuditDAOImpl.java index 8137c0fec8..58c97a9fa6 100644 --- a/repository/src/main/java/org/alfresco/repo/domain/audit/ibatis/AuditDAOImpl.java +++ b/repository/src/main/java/org/alfresco/repo/domain/audit/ibatis/AuditDAOImpl.java @@ -65,6 +65,7 @@ public class AuditDAOImpl extends AbstractAuditDAOImpl private static final String DELETE_ENTRIES_BY_ID = "alfresco.audit.delete_AuditEntriesById"; private static final String INSERT_ENTRY = "alfresco.audit.insert.insert_AuditEntry"; private static final String SELECT_MINMAX_ENTRY_FOR_APP = "alfresco.audit.select_MinMaxAuditEntryId"; + private static final String SELECT_COUNT_ENTRIES_FOR_APP = "alfresco.audit.select_CountAuditEntryId"; @SuppressWarnings("unused") private static final String SELECT_ENTRIES_SIMPLE = "alfresco.audit.select_AuditEntriesSimple"; @@ -223,6 +224,17 @@ public class AuditDAOImpl extends AbstractAuditDAOImpl return result; } + @Override + public int getAuditEntriesCountByApp(long applicationId) + { + Map params = new HashMap<>(); + params.put("auditAppId", applicationId); + + int result = template.selectOne(SELECT_COUNT_ENTRIES_FOR_APP, params); + + return result; + } + @SuppressWarnings("unchecked") @Override protected void findAuditEntries( diff --git a/repository/src/main/java/org/alfresco/service/cmr/audit/AuditService.java b/repository/src/main/java/org/alfresco/service/cmr/audit/AuditService.java index 24bfd36e1a..7f1e2ab264 100644 --- a/repository/src/main/java/org/alfresco/service/cmr/audit/AuditService.java +++ b/repository/src/main/java/org/alfresco/service/cmr/audit/AuditService.java @@ -241,4 +241,15 @@ public interface AuditService * @return a map containing min/max and the associated value */ HashMap getAuditMinMaxByApp(String applicationName, List extremes); + + /** + * Issue an audit query to retrieve min / max audit record id for a given application. + * + * @param applicationName the name of the application + * @return a map containing min/max and the associated value + */ + default int getAuditEntriesCountByApp(String applicationName) + { + return -1; + } } diff --git a/repository/src/main/resources/alfresco/ibatis/org.alfresco.repo.domain.dialect.Dialect/audit-common-SqlMap.xml b/repository/src/main/resources/alfresco/ibatis/org.alfresco.repo.domain.dialect.Dialect/audit-common-SqlMap.xml index 85ffdfe12d..b9adc28823 100644 --- a/repository/src/main/resources/alfresco/ibatis/org.alfresco.repo.domain.dialect.Dialect/audit-common-SqlMap.xml +++ b/repository/src/main/resources/alfresco/ibatis/org.alfresco.repo.domain.dialect.Dialect/audit-common-SqlMap.xml @@ -59,6 +59,10 @@ + + + + @@ -277,6 +281,16 @@ + + +