diff --git a/core/pom.xml b/core/pom.xml index 57e410edca..1efc45d4f4 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -7,7 +7,7 @@ org.alfresco alfresco-community-repo - 7.300-TEST4-SNAPSHOT + 7.301-SNAPSHOT diff --git a/data-model/pom.xml b/data-model/pom.xml index 615ad57717..8c6a5095d2 100644 --- a/data-model/pom.xml +++ b/data-model/pom.xml @@ -7,7 +7,7 @@ org.alfresco alfresco-community-repo - 7.300-TEST4-SNAPSHOT + 7.301-SNAPSHOT diff --git a/packaging/distribution/pom.xml b/packaging/distribution/pom.xml index b42f8033ff..8ffad77639 100644 --- a/packaging/distribution/pom.xml +++ b/packaging/distribution/pom.xml @@ -9,6 +9,6 @@ org.alfresco alfresco-community-repo-packaging - 7.300-TEST4-SNAPSHOT + 7.301-SNAPSHOT diff --git a/packaging/docker-alfresco/pom.xml b/packaging/docker-alfresco/pom.xml index cd932323f3..b596dfd585 100644 --- a/packaging/docker-alfresco/pom.xml +++ b/packaging/docker-alfresco/pom.xml @@ -7,7 +7,7 @@ org.alfresco alfresco-community-repo-packaging - 7.300-TEST4-SNAPSHOT + 7.301-SNAPSHOT diff --git a/packaging/pom.xml b/packaging/pom.xml index a26687d6bc..83a413180f 100644 --- a/packaging/pom.xml +++ b/packaging/pom.xml @@ -7,7 +7,7 @@ org.alfresco alfresco-community-repo - 7.300-TEST4-SNAPSHOT + 7.301-SNAPSHOT diff --git a/packaging/tests/pom.xml b/packaging/tests/pom.xml index 11027fa2c8..9272137d29 100644 --- a/packaging/tests/pom.xml +++ b/packaging/tests/pom.xml @@ -6,7 +6,7 @@ org.alfresco alfresco-community-repo-packaging - 7.300-TEST4-SNAPSHOT + 7.301-SNAPSHOT diff --git a/packaging/tests/tas-cmis/pom.xml b/packaging/tests/tas-cmis/pom.xml index 48fc27052b..fbf6f75456 100644 --- a/packaging/tests/tas-cmis/pom.xml +++ b/packaging/tests/tas-cmis/pom.xml @@ -9,7 +9,7 @@ org.alfresco alfresco-community-repo-tests - 7.300-TEST4-SNAPSHOT + 7.301-SNAPSHOT diff --git a/packaging/tests/tas-email/pom.xml b/packaging/tests/tas-email/pom.xml index 27daab6423..9cfe335543 100644 --- a/packaging/tests/tas-email/pom.xml +++ b/packaging/tests/tas-email/pom.xml @@ -9,7 +9,7 @@ org.alfresco alfresco-community-repo-tests - 7.300-TEST4-SNAPSHOT + 7.301-SNAPSHOT diff --git a/packaging/tests/tas-integration/pom.xml b/packaging/tests/tas-integration/pom.xml index 4224cc092a..c785ff0aa8 100644 --- a/packaging/tests/tas-integration/pom.xml +++ b/packaging/tests/tas-integration/pom.xml @@ -9,7 +9,7 @@ org.alfresco alfresco-community-repo-tests - 7.300-TEST4-SNAPSHOT + 7.301-SNAPSHOT diff --git a/packaging/tests/tas-restapi/pom.xml b/packaging/tests/tas-restapi/pom.xml index 374e85095d..27719019eb 100644 --- a/packaging/tests/tas-restapi/pom.xml +++ b/packaging/tests/tas-restapi/pom.xml @@ -9,7 +9,7 @@ org.alfresco alfresco-community-repo-tests - 7.300-TEST4-SNAPSHOT + 7.301-SNAPSHOT diff --git a/packaging/tests/tas-webdav/pom.xml b/packaging/tests/tas-webdav/pom.xml index 3b6808acfa..a75a12dc9b 100644 --- a/packaging/tests/tas-webdav/pom.xml +++ b/packaging/tests/tas-webdav/pom.xml @@ -9,7 +9,7 @@ org.alfresco alfresco-community-repo-tests - 7.300-TEST4-SNAPSHOT + 7.301-SNAPSHOT diff --git a/packaging/war/pom.xml b/packaging/war/pom.xml index 66f1f19a14..252c14e3ce 100644 --- a/packaging/war/pom.xml +++ b/packaging/war/pom.xml @@ -7,7 +7,7 @@ org.alfresco alfresco-community-repo-packaging - 7.300-TEST4-SNAPSHOT + 7.301-SNAPSHOT diff --git a/pom.xml b/pom.xml index 6c33b8159e..511f659d2c 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 alfresco-community-repo - 7.300-TEST4-SNAPSHOT + 7.301-SNAPSHOT pom Alfresco Community Repo Parent @@ -57,8 +57,8 @@ 5.1.15.RELEASE 3.5.2 - 2.10.2 - 2.10.1 + 2.10.5 + 2.10.5 3.3.5 1.0.0 2.0.19 diff --git a/remote-api/pom.xml b/remote-api/pom.xml index 2397657905..106c7f4794 100644 --- a/remote-api/pom.xml +++ b/remote-api/pom.xml @@ -7,7 +7,7 @@ org.alfresco alfresco-community-repo - 7.300-TEST4-SNAPSHOT + 7.301-SNAPSHOT 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/main/java/org/alfresco/rest/framework/jacksonextensions/JacksonHelper.java b/remote-api/src/main/java/org/alfresco/rest/framework/jacksonextensions/JacksonHelper.java index 15f471e77e..a707cf69c0 100644 --- a/remote-api/src/main/java/org/alfresco/rest/framework/jacksonextensions/JacksonHelper.java +++ b/remote-api/src/main/java/org/alfresco/rest/framework/jacksonextensions/JacksonHelper.java @@ -82,9 +82,8 @@ public class JacksonHelper implements InitializingBean //Configure the objectMapper ready for use objectMapper = new ObjectMapper(); objectMapper.registerModule(module); - objectMapper.setDefaultPropertyInclusion(JsonInclude.Include.NON_EMPTY); - objectMapper.configOverride(java.util.Map.class) - .setInclude(JsonInclude.Value.construct(JsonInclude.Include.NON_EMPTY, null)); + objectMapper.setDefaultPropertyInclusion( + JsonInclude.Value.construct(JsonInclude.Include.NON_EMPTY, JsonInclude.Include.ALWAYS)); objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); DateFormat DATE_FORMAT_ISO8601 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); DATE_FORMAT_ISO8601.setTimeZone(TimeZone.getTimeZone("UTC")); 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/pom.xml b/repository/pom.xml index 2156c68411..79b17f6cbb 100644 --- a/repository/pom.xml +++ b/repository/pom.xml @@ -7,7 +7,7 @@ org.alfresco alfresco-community-repo - 7.300-TEST4-SNAPSHOT + 7.301-SNAPSHOT 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 @@ + + +