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 @@
+
+
+