Compare commits

...

49 Commits

Author SHA1 Message Date
alfresco-build
8d790ed1cb [maven-release-plugin][skip ci] prepare release 23.6.0.29 2025-10-06 13:25:16 +00:00
cezary-witkowski
87c7bd2877 [ACS-10454] Bump AOS to fix "Edit in Microsoft Office" error (#3602) 2025-10-06 14:16:10 +02:00
alfresco-build
9125f889b0 [maven-release-plugin][skip ci] prepare for next development iteration 2025-10-03 11:40:58 +00:00
alfresco-build
2fb74d2691 [maven-release-plugin][skip ci] prepare release 23.6.0.28 2025-10-03 11:40:56 +00:00
Gerard Olenski
d671162dae ACS-10427 Bump ATS 4.2.2 (#3601) 2025-10-03 12:54:03 +02:00
alfresco-build
bfaa629da7 [maven-release-plugin][skip ci] prepare for next development iteration 2025-09-26 17:19:48 +00:00
alfresco-build
719d73a558 [maven-release-plugin][skip ci] prepare release 23.6.0.27 2025-09-26 17:19:46 +00:00
Piotr Żurek
a2aa867f3f ACS-9665 Fix formatting 2025-09-26 18:34:04 +02:00
Piotr Żurek
8d745c536a Cherry pick ACS-9665 add event generation extensions (#3593) 280a873cb6 Piotr Żurek <Piotr.Zurek@hyland.com> 26 Sep 2025 at 10:25 2025-09-26 18:25:10 +02:00
alfresco-build
b0f4c21ae3 [maven-release-plugin][skip ci] prepare for next development iteration 2025-09-26 12:31:24 +00:00
alfresco-build
72494e34fa [maven-release-plugin][skip ci] prepare release 23.6.0.26 2025-09-26 12:31:22 +00:00
Tiago Salvado
792b7024ea [ACS-9940] Bump spring security version to 6.4.11 (#3592) (#3594) 2025-09-26 12:44:25 +01:00
alfresco-build
40a1371f0d [maven-release-plugin][skip ci] prepare for next development iteration 2025-09-25 20:52:06 +00:00
alfresco-build
c22c47e63f [maven-release-plugin][skip ci] prepare release 23.6.0.25 2025-09-25 20:52:03 +00:00
Tiago Salvado
232299d42d [ACS-10155] Bump spring version to 6.2.11 (#3589) (#3591) 2025-09-25 21:04:30 +01:00
alfresco-build
aca7969849 [maven-release-plugin][skip ci] prepare for next development iteration 2025-09-25 10:22:26 +00:00
alfresco-build
4ab2bbd3d6 [maven-release-plugin][skip ci] prepare release 23.6.0.24 2025-09-25 10:22:24 +00:00
Debjit Chattopadhyay
f68f02372d Merge pull request #3590 from Alfresco/fix/MNT-24776_revert
Revert MNT-24776 as this fix is affecting other scenarios.
2025-09-25 15:05:51 +05:30
Debjit Chattopadhyay
9b0eedc8c1 Revert MNT-24776 as this fix is affecting other scenarios. 2025-09-25 13:19:23 +05:30
alfresco-build
f164dedcee [maven-release-plugin][skip ci] prepare for next development iteration 2025-09-23 12:55:06 +00:00
alfresco-build
9cdaa0a265 [maven-release-plugin][skip ci] prepare release 23.6.0.23 2025-09-23 12:55:04 +00:00
cezary-witkowski
ef034e596b [ACS-10041] Repository - CPU spikes and OOM errors with SQL Server 2019 (#3588) 2025-09-23 14:10:29 +02:00
alfresco-build
1251081a69 [maven-release-plugin][skip ci] prepare for next development iteration 2025-09-23 11:20:49 +00:00
alfresco-build
2d16eb6f42 [maven-release-plugin][skip ci] prepare release 23.6.0.22 2025-09-23 11:20:47 +00:00
Gerard Olenski
e577134875 ACS-10195 Bump Tika and ATS (#3587) 2025-09-23 12:37:56 +02:00
alfresco-build
510eadd565 [maven-release-plugin][skip ci] prepare for next development iteration 2025-09-22 12:43:25 +00:00
alfresco-build
187646895c [maven-release-plugin][skip ci] prepare release 23.6.0.21 2025-09-22 12:43:22 +00:00
Tiago Salvado
f9515e336f [ACS-10166] Include qname and namespace in NodeIdsWhichReferenceContentUrl query (#3579) (#3582) 2025-09-22 12:57:36 +01:00
alfresco-build
828dd20576 [maven-release-plugin][skip ci] prepare for next development iteration 2025-09-22 09:21:07 +00:00
alfresco-build
3372e20c35 [maven-release-plugin][skip ci] prepare release 23.6.0.20 2025-09-22 09:21:05 +00:00
Gerard Olenski
64b5cace27 ACS-10159 Bump ATS (#3581) 2025-09-22 10:12:37 +02:00
alfresco-build
83acf26cf4 [maven-release-plugin][skip ci] prepare for next development iteration 2025-09-18 11:13:01 +00:00
alfresco-build
b3be0f2b7f [maven-release-plugin][skip ci] prepare release 23.6.0.19 2025-09-18 11:12:59 +00:00
Belal Ansari
7a6ebb9a05 Backporting MNT-25216 Error on fixedAclUpdaterJobDetail execution when using Oracle to ACS 23 (#3575) 2025-09-18 15:57:15 +05:30
alfresco-build
fa0f239618 [maven-release-plugin][skip ci] prepare for next development iteration 2025-09-17 01:05:50 +00:00
alfresco-build
43799408a8 [maven-release-plugin][skip ci] prepare release 23.6.0.18 2025-09-17 01:05:48 +00:00
Tiago Salvado
e7305006f0 [ACS-9929] Bump cxf version to 4.1.2 (#3572) 2025-09-17 01:21:54 +01:00
alfresco-build
40c30411af [maven-release-plugin][skip ci] prepare for next development iteration 2025-09-12 11:02:12 +00:00
alfresco-build
91f8b43237 [maven-release-plugin][skip ci] prepare release 23.6.0.17 2025-09-12 11:02:09 +00:00
Eva Vasques
6fccf828e1 ACS-10042 - AGS Concurrent IPR Group Creation (#3566) (#3570) 2025-09-12 11:10:43 +01:00
alfresco-build
3fac3373c9 [maven-release-plugin][skip ci] prepare for next development iteration 2025-09-04 08:24:19 +00:00
alfresco-build
ee857ce1de [maven-release-plugin][skip ci] prepare release 23.6.0.16 2025-09-04 08:24:17 +00:00
Debjit Chattopadhyay
483d7fab21 Merge pull request #3563 from Alfresco/fix/MNT-24776-backport-23.N
backport MNT-24776 to 23.N
2025-09-04 13:01:59 +05:30
Debjit Chattopadhyay
590209b299 Fix for "MNT-24776 : Category Picker Error when a User does not have Read Permissions to a Category"
(cherry picked from commit 626640ddc7)
2025-09-03 15:14:48 +05:30
alfresco-build
376514df67 [maven-release-plugin][skip ci] prepare for next development iteration 2025-08-29 13:30:01 +00:00
alfresco-build
7144a2dd94 [maven-release-plugin][skip ci] prepare release 23.6.0.15 2025-08-29 13:29:59 +00:00
Debjit Chattopadhyay
b4da3d8c20 MNT-24308 - fix search filterquery creation for displaying favourites in Share for both Solr and Elasticsearch
MNT-24308 : On click of 'My Favorites' link under 'Documents' in the left panel of 'Document Library' page, all the links appear grayed out
2025-08-29 18:15:59 +05:30
Debjit Chattopadhyay
62de9ff0c0 MNT-24308 : On click of 'My Favorites' link under 'Documents' in the left panel of 'Document Library' page, all the links appear grayed out 2025-08-29 16:25:23 +05:30
alfresco-build
a11acce720 [maven-release-plugin][skip ci] prepare for next development iteration 2025-08-28 13:37:40 +00:00
39 changed files with 7054 additions and 6631 deletions

View File

@@ -7,7 +7,7 @@
<parent> <parent>
<groupId>org.alfresco</groupId> <groupId>org.alfresco</groupId>
<artifactId>alfresco-community-repo-amps</artifactId> <artifactId>alfresco-community-repo-amps</artifactId>
<version>23.6.0.14</version> <version>23.6.0.29</version>
</parent> </parent>
<modules> <modules>

View File

@@ -7,7 +7,7 @@
<parent> <parent>
<groupId>org.alfresco</groupId> <groupId>org.alfresco</groupId>
<artifactId>alfresco-governance-services-community-parent</artifactId> <artifactId>alfresco-governance-services-community-parent</artifactId>
<version>23.6.0.14</version> <version>23.6.0.29</version>
</parent> </parent>
<modules> <modules>

View File

@@ -7,7 +7,7 @@
<parent> <parent>
<groupId>org.alfresco</groupId> <groupId>org.alfresco</groupId>
<artifactId>alfresco-governance-services-automation-community-repo</artifactId> <artifactId>alfresco-governance-services-automation-community-repo</artifactId>
<version>23.6.0.14</version> <version>23.6.0.29</version>
</parent> </parent>
<build> <build>

View File

@@ -7,7 +7,7 @@
<parent> <parent>
<groupId>org.alfresco</groupId> <groupId>org.alfresco</groupId>
<artifactId>alfresco-governance-services-community-parent</artifactId> <artifactId>alfresco-governance-services-community-parent</artifactId>
<version>23.6.0.14</version> <version>23.6.0.29</version>
</parent> </parent>
<modules> <modules>

View File

@@ -15,6 +15,13 @@
<parameter property="end" jdbcType="BIGINT" javaType="java.lang.Long"/> <parameter property="end" jdbcType="BIGINT" javaType="java.lang.Long"/>
</parameterMap> </parameterMap>
<parameterMap id="parameter_NodeIdsWhichReferenceContentUrl" type="map">
<parameter property="contentUrlShort" jdbcType="VARCHAR" javaType="java.lang.String"/>
<parameter property="contentUrlCrc" jdbcType="BIGINT" javaType="java.lang.Long"/>
<parameter property="localName" jdbcType="VARCHAR" javaType="java.lang.String"/>
<parameter property="uri" jdbcType="VARCHAR" javaType="java.lang.String"/>
</parameterMap>
<resultMap id="result_NodeRefEntity" type="org.alfresco.module.org_alfresco_module_rm.query.NodeRefEntity"> <resultMap id="result_NodeRefEntity" type="org.alfresco.module.org_alfresco_module_rm.query.NodeRefEntity">
<result property="row" column="row" jdbcType="BIGINT" javaType="java.lang.Long"/> <result property="row" column="row" jdbcType="BIGINT" javaType="java.lang.Long"/>
<result property="protocol" column="protocol" jdbcType="VARCHAR" javaType="java.lang.String"/> <result property="protocol" column="protocol" jdbcType="VARCHAR" javaType="java.lang.String"/>
@@ -55,18 +62,21 @@
<!-- Get list of node ids which reference given content url --> <!-- Get list of node ids which reference given content url -->
<select id="select_NodeIdsWhichReferenceContentUrl" <select id="select_NodeIdsWhichReferenceContentUrl"
parameterType="ContentUrl" parameterMap="parameter_NodeIdsWhichReferenceContentUrl"
resultMap="result_NodeIds"> resultMap="result_NodeIds">
select select
p.node_id p.node_id
from from
alf_content_url cu alf_content_url cu
LEFT OUTER JOIN alf_content_data cd ON (cd.content_url_id = cu.id) left outer join alf_content_data cd ON (cd.content_url_id = cu.id)
LEFT OUTER JOIN alf_node_properties p ON (p.long_value = cd.id) left outer join alf_node_properties p ON (p.long_value = cd.id)
WHERE left outer join alf_qname q ON (q.id = p.qname_id)
content_url_short = #{contentUrlShort} and left outer join alf_namespace n ON (n.id = q.ns_id)
content_url_crc = #{contentUrlCrc} where
cu.content_url_short = ? and
cu.content_url_crc = ? and
q.local_name = ? and
n.uri = ?
</select> </select>
<select id="select_RecordFoldersWithSchedules" <select id="select_RecordFoldersWithSchedules"

View File

@@ -8,7 +8,7 @@
<parent> <parent>
<groupId>org.alfresco</groupId> <groupId>org.alfresco</groupId>
<artifactId>alfresco-governance-services-community-repo-parent</artifactId> <artifactId>alfresco-governance-services-community-repo-parent</artifactId>
<version>23.6.0.14</version> <version>23.6.0.29</version>
</parent> </parent>
<properties> <properties>

View File

@@ -27,7 +27,6 @@
package org.alfresco.module.org_alfresco_module_rm.query; package org.alfresco.module.org_alfresco_module_rm.query;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
@@ -36,6 +35,11 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.repo.domain.contentdata.ContentUrlEntity; import org.alfresco.repo.domain.contentdata.ContentUrlEntity;
import org.alfresco.repo.domain.node.NodeDAO; import org.alfresco.repo.domain.node.NodeDAO;
@@ -47,9 +51,6 @@ import org.alfresco.service.cmr.repository.InvalidNodeRefException;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.alfresco.util.Pair; import org.alfresco.util.Pair;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.mybatis.spring.SqlSessionTemplate;
/** /**
* Records management query DAO implementation * Records management query DAO implementation
@@ -89,7 +90,8 @@ public class RecordsManagementQueryDAOImpl implements RecordsManagementQueryDAO,
protected TenantService tenantService; protected TenantService tenantService;
/** /**
* @param sqlSessionTemplate SQL session template * @param sqlSessionTemplate
* SQL session template
*/ */
public final void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) public final void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate)
{ {
@@ -97,7 +99,8 @@ public class RecordsManagementQueryDAOImpl implements RecordsManagementQueryDAO,
} }
/** /**
* @param qnameDAO qname DAO * @param qnameDAO
* qname DAO
*/ */
public final void setQnameDAO(QNameDAO qnameDAO) public final void setQnameDAO(QNameDAO qnameDAO)
{ {
@@ -173,8 +176,9 @@ public class RecordsManagementQueryDAOImpl implements RecordsManagementQueryDAO,
/** /**
* Get a set of node reference which reference the provided content URL * Get a set of node reference which reference the provided content URL
* *
* @param String contentUrl content URL * @param String
* @return Set<NodeRef> set of nodes that reference the provided content URL * contentUrl content URL
* @return Set<NodeRef> set of nodes that reference the provided content URL
*/ */
@Override @Override
public Set<NodeRef> getNodeRefsWhichReferenceContentUrl(String contentUrl) public Set<NodeRef> getNodeRefsWhichReferenceContentUrl(String contentUrl)
@@ -188,13 +192,19 @@ public class RecordsManagementQueryDAOImpl implements RecordsManagementQueryDAO,
ContentUrlEntity contentUrlEntity = new ContentUrlEntity(); ContentUrlEntity contentUrlEntity = new ContentUrlEntity();
contentUrlEntity.setContentUrl(contentUrl.toLowerCase()); contentUrlEntity.setContentUrl(contentUrl.toLowerCase());
Map<String, Object> params = new HashMap<>(4);
params.put("contentUrlShort", contentUrlEntity.getContentUrlShort());
params.put("contentUrlCrc", contentUrlEntity.getContentUrlCrc());
params.put("localName", ContentModel.PROP_CONTENT.getLocalName());
params.put("uri", ContentModel.PROP_CONTENT.getNamespaceURI());
if (logger.isDebugEnabled()) if (logger.isDebugEnabled())
{ {
logger.debug("Executing query " + SELECT_NODE_IDS_WHICH_REFERENCE_CONTENT_URL); logger.debug("Executing query " + SELECT_NODE_IDS_WHICH_REFERENCE_CONTENT_URL);
} }
// Get all the node ids which reference the given content url // Get all the node ids which reference the given content url
List<Long> nodeIds = template.selectList(SELECT_NODE_IDS_WHICH_REFERENCE_CONTENT_URL, contentUrlEntity); List<Long> nodeIds = template.selectList(SELECT_NODE_IDS_WHICH_REFERENCE_CONTENT_URL, params);
if (logger.isDebugEnabled()) if (logger.isDebugEnabled())
{ {
@@ -224,7 +234,7 @@ public class RecordsManagementQueryDAOImpl implements RecordsManagementQueryDAO,
if (logger.isDebugEnabled()) if (logger.isDebugEnabled())
{ {
logMessage.append(nodeRefToAdd) logMessage.append(nodeRefToAdd)
.append(" (from version)"); .append(" (from version)");
} }
} }
@@ -232,7 +242,7 @@ public class RecordsManagementQueryDAOImpl implements RecordsManagementQueryDAO,
else else
{ {
nodeRefToAdd = nodeDAO.getNodeIdStatus(nodeId) nodeRefToAdd = nodeDAO.getNodeIdStatus(nodeId)
.getNodeRef(); .getNodeRef();
if (logger.isDebugEnabled()) if (logger.isDebugEnabled())
{ {
logMessage.append(nodeRefToAdd); logMessage.append(nodeRefToAdd);
@@ -266,9 +276,9 @@ public class RecordsManagementQueryDAOImpl implements RecordsManagementQueryDAO,
{ {
Map<String, Object> params = new HashMap<>(2); Map<String, Object> params = new HashMap<>(2);
params.put("processed", qnameDAO.getQName(ASPECT_DISPOSITION_PROCESSED) params.put("processed", qnameDAO.getQName(ASPECT_DISPOSITION_PROCESSED)
.getFirst()); .getFirst());
params.put("folderQnameId", qnameDAO.getQName(TYPE_RECORD_FOLDER) params.put("folderQnameId", qnameDAO.getQName(TYPE_RECORD_FOLDER)
.getFirst()); .getFirst());
params.put("start", start); params.put("start", start);
params.put("end", end); params.put("end", end);
@@ -280,7 +290,7 @@ public class RecordsManagementQueryDAOImpl implements RecordsManagementQueryDAO,
for (NodeRefEntity nodeRefEntity : entities) for (NodeRefEntity nodeRefEntity : entities)
{ {
results.add( results.add(
new NodeRef(nodeRefEntity.getProtocol(), nodeRefEntity.getIdentifier(), nodeRefEntity.getUuid())); new NodeRef(nodeRefEntity.getProtocol(), nodeRefEntity.getIdentifier(), nodeRefEntity.getUuid()));
} }
return results; return results;
@@ -289,7 +299,8 @@ public class RecordsManagementQueryDAOImpl implements RecordsManagementQueryDAO,
/** /**
* @see org.alfresco.module.org_alfresco_module_rm.query.RecordsManagementQueryDAO#getPropertyStringValueEntity(String stringValue) * @see org.alfresco.module.org_alfresco_module_rm.query.RecordsManagementQueryDAO#getPropertyStringValueEntity(String stringValue)
*/ */
public PropertyStringValueEntity getPropertyStringValueEntity(String stringValue){ public PropertyStringValueEntity getPropertyStringValueEntity(String stringValue)
{
PropertyStringValueEntity propertyStringValueEntity = new PropertyStringValueEntity(); PropertyStringValueEntity propertyStringValueEntity = new PropertyStringValueEntity();
propertyStringValueEntity.setValue(stringValue); propertyStringValueEntity.setValue(stringValue);

View File

@@ -36,6 +36,7 @@ import java.util.Set;
import org.springframework.context.ApplicationListener; import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.dao.ConcurrencyFailureException;
import org.springframework.extensions.webscripts.ui.common.StringUtils; import org.springframework.extensions.webscripts.ui.common.StringUtils;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
@@ -649,8 +650,8 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl
} }
catch (DuplicateChildNodeNameException ex) catch (DuplicateChildNodeNameException ex)
{ {
// the group was concurrently created // Rethrow as ConcurrencyFailureException so that is can be retried and linked to the group created by the concurrent transaction
group = authorityService.getName(AuthorityType.GROUP, groupShortName); throw new ConcurrencyFailureException("IPR group creation failed due to concurrent duplicate group name creation: " + groupShortName);
} }
return group; return group;

View File

@@ -29,14 +29,23 @@ package org.alfresco.module.org_alfresco_module_rm.test.legacy.service;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.concurrent.CompletableFuture;
import org.junit.Assert;
import org.springframework.dao.ConcurrencyFailureException;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase; import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase;
import org.alfresco.query.PagingRequest;
import org.alfresco.query.PagingResults;
import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
import org.alfresco.repo.site.SiteModel; import org.alfresco.repo.site.SiteModel;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.security.AccessPermission;
import org.alfresco.service.cmr.security.AccessStatus; import org.alfresco.service.cmr.security.AccessStatus;
import org.alfresco.service.cmr.security.AuthorityType;
import org.alfresco.service.cmr.site.SiteService; import org.alfresco.service.cmr.site.SiteService;
import org.alfresco.service.cmr.site.SiteVisibility; import org.alfresco.service.cmr.site.SiteVisibility;
import org.alfresco.util.GUID; import org.alfresco.util.GUID;
@@ -73,8 +82,7 @@ public class ExtendedSecurityServiceImplTest extends BaseRMTestCase
private String createTestUser() private String createTestUser()
{ {
return doTestInTransaction(new Test<String>() return doTestInTransaction(new Test<String>() {
{
public String run() public String run()
{ {
String userName = GUID.generate(); String userName = GUID.generate();
@@ -90,8 +98,7 @@ public class ExtendedSecurityServiceImplTest extends BaseRMTestCase
final String elephant = createTestUser(); final String elephant = createTestUser();
final String snake = createTestUser(); final String snake = createTestUser();
doTestInTransaction(new Test<Void>() doTestInTransaction(new Test<Void>() {
{
public Void run() public Void run()
{ {
assertFalse(extendedSecurityService.hasExtendedSecurity(filePlan)); assertFalse(extendedSecurityService.hasExtendedSecurity(filePlan));
@@ -133,8 +140,7 @@ public class ExtendedSecurityServiceImplTest extends BaseRMTestCase
final String monkey = createTestUser(); final String monkey = createTestUser();
final String elephant = createTestUser(); final String elephant = createTestUser();
doTestInTransaction(new Test<Void>() doTestInTransaction(new Test<Void>() {
{
Set<String> extendedReaders = new HashSet<>(2); Set<String> extendedReaders = new HashSet<>(2);
public Void run() throws Exception public Void run() throws Exception
@@ -184,112 +190,337 @@ public class ExtendedSecurityServiceImplTest extends BaseRMTestCase
public void testDifferentUsersDifferentPermissions() public void testDifferentUsersDifferentPermissions()
{ {
final String userNone = createTestUser(); final String userNone = createTestUser();
final String userRead = createTestUser(); final String userRead = createTestUser();
final String userWrite = createTestUser(); final String userWrite = createTestUser();
final String siteShortName = GUID.generate(); final String siteShortName = GUID.generate();
doTestInTransaction(new Test<Void>() doTestInTransaction(new Test<Void>() {
{
public Void run() throws Exception public Void run() throws Exception
{ {
siteService.createSite(null, siteShortName, "test", "test", SiteVisibility.PRIVATE); siteService.createSite(null, siteShortName, "test", "test", SiteVisibility.PRIVATE);
return null; return null;
} }
}); });
final NodeRef documentLibrary = doTestInTransaction(new Test<NodeRef>() final NodeRef documentLibrary = doTestInTransaction(new Test<NodeRef>() {
{
public NodeRef run() throws Exception public NodeRef run() throws Exception
{ {
siteService.setMembership(siteShortName, userRead, SiteModel.SITE_CONSUMER); siteService.setMembership(siteShortName, userRead, SiteModel.SITE_CONSUMER);
siteService.setMembership(siteShortName, userWrite, SiteModel.SITE_COLLABORATOR); siteService.setMembership(siteShortName, userWrite, SiteModel.SITE_COLLABORATOR);
return siteService.createContainer(siteShortName, SiteService.DOCUMENT_LIBRARY, null, null); return siteService.createContainer(siteShortName, SiteService.DOCUMENT_LIBRARY, null, null);
} }
}); });
final NodeRef record = doTestInTransaction(new Test<NodeRef>() final NodeRef record = doTestInTransaction(new Test<NodeRef>() {
{
public NodeRef run() throws Exception public NodeRef run() throws Exception
{ {
NodeRef record = fileFolderService.create(documentLibrary, GUID.generate(), ContentModel.TYPE_CONTENT).getNodeRef(); NodeRef record = fileFolderService.create(documentLibrary, GUID.generate(), ContentModel.TYPE_CONTENT)
recordService.createRecord(filePlan, record); .getNodeRef();
return record; recordService.createRecord(filePlan, record);
return record;
} }
}); });
doTestInTransaction(new Test<Void>() doTestInTransaction(new Test<Void>() {
{
public Void run() throws Exception public Void run() throws Exception
{ {
AuthenticationUtil.runAs(new RunAsWork<Void>() AuthenticationUtil.runAs(new RunAsWork<Void>() {
{ public Void doWork() throws Exception
public Void doWork() throws Exception {
{ // check permissions
// check permissions assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record, READ_RECORDS));
assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record, READ_RECORDS)); assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record, FILING));
assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record, FILING)); return null;
return null; }
} }, userNone);
}, userNone);
AuthenticationUtil.runAs(new RunAsWork<Void>() AuthenticationUtil.runAs(new RunAsWork<Void>() {
{ public Void doWork() throws Exception
public Void doWork() throws Exception {
{ // check permissions
// check permissions assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record, READ_RECORDS));
assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record, READ_RECORDS)); assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record, FILING));
assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record, FILING)); return null;
return null; }
} }, userRead);
}, userRead);
AuthenticationUtil.runAs(new RunAsWork<Void>() AuthenticationUtil.runAs(new RunAsWork<Void>() {
{ public Void doWork() throws Exception
public Void doWork() throws Exception {
{ // check permissions
// check permissions assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record, READ_RECORDS));
assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record, READ_RECORDS)); assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record, FILING));
assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record, FILING)); return null;
return null; }
} }, userWrite);
}, userWrite);
AuthenticationUtil.runAs(new RunAsWork<Void>() AuthenticationUtil.runAs(new RunAsWork<Void>() {
{ public Void doWork() throws Exception
public Void doWork() throws Exception {
{ // check permissions
// check permissions assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record, READ_RECORDS));
assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record, READ_RECORDS)); assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record, FILING));
assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record, FILING)); return null;
return null; }
} }, userNone);
}, userNone);
AuthenticationUtil.runAs(new RunAsWork<Void>() AuthenticationUtil.runAs(new RunAsWork<Void>() {
{ public Void doWork() throws Exception
public Void doWork() throws Exception {
{ // check permissions
// check permissions assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record, READ_RECORDS));
assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record, READ_RECORDS)); assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record, FILING));
assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record, FILING)); return null;
return null; }
} }, userRead);
}, userRead);
AuthenticationUtil.runAs(new RunAsWork<Void>() AuthenticationUtil.runAs(new RunAsWork<Void>() {
{ public Void doWork() throws Exception
public Void doWork() throws Exception {
{ // check permissions
// check permissions assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record, READ_RECORDS));
assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record, READ_RECORDS)); assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record, FILING));
assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record, FILING)); return null;
return null; }
} }, userWrite);
}, userWrite);
return null; return null;
} }
}); });
} }
public void testConcurrentSetWithRetry()
{
Set<String> extendedReaders = new HashSet<>(2);
Set<String> extendedWriters = new HashSet<>(2);
Set<NodeRef> documents = setupConcurrentTestCase(10, extendedReaders, extendedWriters);
// For each record created previously, spawn a thread to set extended security so we cause concurrency
// failure trying to create IPR groups with the same name
fireParallelExecutionOfSetExtendedSecurity(documents, extendedReaders, extendedWriters, true);
// Look for duplicated IPR groups and verify all documents have the same groups assigned
verifyCreatedGroups(documents, false);
AuthenticationUtil.clearCurrentSecurityContext();
}
public void testConcurrentSetWithoutRetry()
{
Set<String> extendedReaders = new HashSet<>(2);
Set<String> extendedWriters = new HashSet<>(2);
Set<NodeRef> documents = setupConcurrentTestCase(10, extendedReaders, extendedWriters);
// For each record created previously, spawn a thread to set extended security so we cause concurrency
// failure trying to create IPR groups with the same name.
// Since there is no retry, we expect to get a ConcurrencyFailureException
Assert.assertThrows(ConcurrencyFailureException.class, () -> {
fireParallelExecutionOfSetExtendedSecurity(documents, extendedReaders, extendedWriters, false);
});
// Look for duplicated IPR groups and verify all documents have the same groups assigned
// Since there was a ConcurrencyFailureException some threads failed to set extended security so some
// documents may not have IPR groups created.
verifyCreatedGroups(documents, true);
AuthenticationUtil.clearCurrentSecurityContext();
}
private Set<NodeRef> setupConcurrentTestCase(int concurrentThreads, Set<String> extendedReaders, Set<String> extendedWriters)
{
final String usera = createTestUser();
final String userb = createTestUser();
final String owner = createTestUser();
extendedReaders.add(usera);
extendedReaders.add(userb);
extendedWriters.add(usera);
extendedWriters.add(userb);
AuthenticationUtil.setAdminUserAsFullyAuthenticatedUser();
// Create a site
NodeRef documentLib = createSite(new HashSet<>(), new HashSet<>());
// Create records in the site document library
return createRecords(concurrentThreads, documentLib, owner);
}
private NodeRef createSite(Set<String> readers, Set<String> writers)
{
return retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback<NodeRef>() {
@Override
public NodeRef execute() throws Throwable
{
final String siteShortName = GUID.generate();
siteService.createSite(null, siteShortName, "test", "test", SiteVisibility.PRIVATE);
readers.forEach(reader -> siteService.setMembership(siteShortName, reader, SiteModel.SITE_CONSUMER));
writers.forEach(writer -> siteService.setMembership(siteShortName, writer, SiteModel.SITE_COLLABORATOR));
return siteService.createContainer(siteShortName, SiteService.DOCUMENT_LIBRARY, null, null);
}
}, false, true);
}
private Set<NodeRef> createRecords(int numRecords, NodeRef parent, String owner)
{
return retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback<Set<NodeRef>>() {
@Override
public Set<NodeRef> execute() throws Throwable
{
int createdRecords = 0;
Set<NodeRef> documents = new HashSet<>();
while (createdRecords < numRecords)
{
final NodeRef doc = fileFolderService.create(parent, GUID.generate(), ContentModel.TYPE_CONTENT).getNodeRef();
ownableService.setOwner(doc, owner);
recordService.createRecord(filePlan, doc, rmFolder, true);
recordService.file(doc);
recordService.complete(doc);
documents.add(doc);
createdRecords++;
}
return documents;
}
}, false, true);
}
private void setExtendedSecurity(NodeRef doc, Set<String> readers, Set<String> writers, boolean useRetry)
{
if (!useRetry)
{
setExtendedSecurity(doc, readers, writers);
return;
}
retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback<Void>() {
@Override
public Void execute() throws Throwable
{
setExtendedSecurity(doc, readers, writers);
return null;
}
}, false, true);
}
private void setExtendedSecurity(NodeRef doc, Set<String> readers, Set<String> writers)
{
AuthenticationUtil.setAdminUserAsFullyAuthenticatedUser();
extendedSecurityService.set(doc, readers, writers);
}
private void fireParallelExecutionOfSetExtendedSecurity(Set<NodeRef> documents, Set<String> extendedReaders, Set<String> extendedWriters, boolean useRetry)
{
CompletableFuture<?>[] futures = documents.stream()
.map(doc -> CompletableFuture.runAsync(() -> setExtendedSecurity(doc, extendedReaders, extendedWriters, useRetry)))
.toArray(CompletableFuture[]::new);
try
{
CompletableFuture.allOf(futures).join();
}
catch (Exception e)
{
Throwable cause = e.getCause();
if (cause instanceof ConcurrencyFailureException)
{
throw (ConcurrencyFailureException) cause;
}
throw new RuntimeException("Error during parallel execution", e);
}
}
private void verifyCreatedGroups(Set<NodeRef> documents, boolean onlyDuplicatesValidation)
{
retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback<Void>() {
@Override
public Void execute() throws Throwable
{
Set<String> expectedAuthorities = null;
Set<Set<String>> errors = new HashSet<>();
for (NodeRef doc : documents)
{
Set<AccessPermission> permissions = permissionService.getAllSetPermissions(doc);
Set<String> authorities = getDocumentAuthorities(permissions);
Set<String> authoritiesById = getAuthorityIds(authorities);
verifyIPRGroups(authorities, onlyDuplicatesValidation);
if (onlyDuplicatesValidation)
{
// Some documents may not have IPR groups created if there was a ConcurrencyFailureException
continue;
}
// All documents should have the same exact set of groups assigned
if (expectedAuthorities == null)
{
expectedAuthorities = authoritiesById;
}
if (!expectedAuthorities.equals(authoritiesById))
{
errors.add(authoritiesById);
}
}
assertTrue("Unexpected authorities linked to document", errors.isEmpty());
return null;
}
}, false, true);
}
private Set<String> getDocumentAuthorities(Set<AccessPermission> permissions)
{
Set<String> authorities = new HashSet<>();
for (AccessPermission accessPermission : permissions)
{
String authority = accessPermission.getAuthority();
String authName = authorityService.getName(AuthorityType.GROUP, authority);
authorities.add(authName);
}
return authorities;
}
private Set<String> getAuthorityIds(Set<String> authorities)
{
Set<String> authorityIds = new HashSet<>();
for (String authority : authorities)
{
String authId = authorityService.getAuthorityNodeRef(authority) != null
? authorityService.getAuthorityNodeRef(authority).getId()
: null;
authorityIds.add(authId);
}
return authorityIds;
}
private void verifyIPRGroups(Set<String> authorities, boolean onlyDuplicatesValidation)
{
boolean hasGroupIPR = false;
for (String authorityName : authorities)
{
String shortName = authorityService.getShortName(authorityName);
if (authorityName.startsWith("GROUP_IPR"))
{
hasGroupIPR = true;
PagingResults<String> results = authorityService.getAuthorities(AuthorityType.GROUP, null, shortName, false,
false, new PagingRequest(0, 10));
assertEquals("No duplicated IPR group expected", 1, results.getPage().size());
}
}
if (!onlyDuplicatesValidation)
{
assertTrue("No IPR Groups created", hasGroupIPR);
}
}
} }

View File

@@ -7,7 +7,7 @@
<parent> <parent>
<groupId>org.alfresco</groupId> <groupId>org.alfresco</groupId>
<artifactId>alfresco-governance-services-community-repo-parent</artifactId> <artifactId>alfresco-governance-services-community-repo-parent</artifactId>
<version>23.6.0.14</version> <version>23.6.0.29</version>
</parent> </parent>
<build> <build>

View File

@@ -7,7 +7,7 @@
<parent> <parent>
<groupId>org.alfresco</groupId> <groupId>org.alfresco</groupId>
<artifactId>alfresco-community-repo</artifactId> <artifactId>alfresco-community-repo</artifactId>
<version>23.6.0.14</version> <version>23.6.0.29</version>
</parent> </parent>
<modules> <modules>

View File

@@ -8,7 +8,7 @@
<parent> <parent>
<groupId>org.alfresco</groupId> <groupId>org.alfresco</groupId>
<artifactId>alfresco-community-repo-amps</artifactId> <artifactId>alfresco-community-repo-amps</artifactId>
<version>23.6.0.14</version> <version>23.6.0.29</version>
</parent> </parent>
<properties> <properties>

View File

@@ -91,6 +91,15 @@ function doclist_getAllNodes(parsedArgs, filterParams, query, totalItemCount)
}; };
} }
function sanitizeJunkFavouriteKeys(favourites){
for (var key in favourites) {
if (!key || key.trim() === "") {
delete favourites[key];
}
}
return favourites;
}
/** /**
* Main entry point: Create collection of documents and folders in the given space * Main entry point: Create collection of documents and folders in the given space
* *
@@ -124,6 +133,28 @@ function doclist_main()
if (logger.isLoggingEnabled()) if (logger.isLoggingEnabled())
logger.log("doclist.lib.js - NodeRef: " + parsedArgs.nodeRef + " Query: " + query); logger.log("doclist.lib.js - NodeRef: " + parsedArgs.nodeRef + " Query: " + query);
favourites = sanitizeJunkFavouriteKeys(favourites);
if(Object.keys(favourites).length === 0 && query === null)
{
return {
luceneQuery: "",
paging: {
totalRecords: 0,
startIndex: 0
},
container: parsedArgs.rootNode,
parent: null,
onlineEditing: utils.moduleInstalled("org.alfresco.module.vti"),
itemCount: {
folders: 0,
documents: 0
},
items: [],
customJSON: slingshotDocLib.getJSON()
};
}
var totalItemCount = filterParams.limitResults ? parseInt(filterParams.limitResults, 10) : -1; var totalItemCount = filterParams.limitResults ? parseInt(filterParams.limitResults, 10) : -1;
// For all sites documentLibrary query we pull in all available results and post filter // For all sites documentLibrary query we pull in all available results and post filter
if (totalItemCount === 0) totalItemCount = -1; if (totalItemCount === 0) totalItemCount = -1;

View File

@@ -182,11 +182,14 @@ var Filters =
case "favourites": case "favourites":
for (var favourite in favourites) for (var favourite in favourites)
{ {
if (filterQuery) if (favourite && favourite.trim() !== "")
{ {
filterQuery += " OR "; if (filterQuery)
{
filterQuery += " OR ";
}
filterQuery += "ID:\"" + favourite + "\"";
} }
filterQuery += "ID:\"" + favourite + "\"";
} }
if (filterQuery.length !== 0) if (filterQuery.length !== 0)
@@ -201,7 +204,13 @@ var Filters =
else else
{ {
// empty favourites query // empty favourites query
filterQuery = "+ID:\"\""; logger.warn("No favourites found for user: " + person.properties.userName);
return {
query: null,
limitResults: 0,
sort: [],
language: "lucene"
};
} }
filterParams.query = filterQuery; filterParams.query = filterQuery;

View File

@@ -7,7 +7,7 @@
<parent> <parent>
<groupId>org.alfresco</groupId> <groupId>org.alfresco</groupId>
<artifactId>alfresco-community-repo</artifactId> <artifactId>alfresco-community-repo</artifactId>
<version>23.6.0.14</version> <version>23.6.0.29</version>
</parent> </parent>
<dependencies> <dependencies>

View File

@@ -7,7 +7,7 @@
<parent> <parent>
<groupId>org.alfresco</groupId> <groupId>org.alfresco</groupId>
<artifactId>alfresco-community-repo</artifactId> <artifactId>alfresco-community-repo</artifactId>
<version>23.6.0.14</version> <version>23.6.0.29</version>
</parent> </parent>
<properties> <properties>

View File

@@ -7,7 +7,7 @@
<parent> <parent>
<groupId>org.alfresco</groupId> <groupId>org.alfresco</groupId>
<artifactId>alfresco-community-repo</artifactId> <artifactId>alfresco-community-repo</artifactId>
<version>23.6.0.14</version> <version>23.6.0.29</version>
</parent> </parent>
<dependencies> <dependencies>

View File

@@ -9,6 +9,6 @@
<parent> <parent>
<groupId>org.alfresco</groupId> <groupId>org.alfresco</groupId>
<artifactId>alfresco-community-repo-packaging</artifactId> <artifactId>alfresco-community-repo-packaging</artifactId>
<version>23.6.0.14</version> <version>23.6.0.29</version>
</parent> </parent>
</project> </project>

View File

@@ -7,7 +7,7 @@
<parent> <parent>
<groupId>org.alfresco</groupId> <groupId>org.alfresco</groupId>
<artifactId>alfresco-community-repo-packaging</artifactId> <artifactId>alfresco-community-repo-packaging</artifactId>
<version>23.6.0.14</version> <version>23.6.0.29</version>
</parent> </parent>
<properties> <properties>

View File

@@ -7,7 +7,7 @@
<parent> <parent>
<groupId>org.alfresco</groupId> <groupId>org.alfresco</groupId>
<artifactId>alfresco-community-repo</artifactId> <artifactId>alfresco-community-repo</artifactId>
<version>23.6.0.14</version> <version>23.6.0.29</version>
</parent> </parent>
<modules> <modules>

View File

@@ -6,7 +6,7 @@
<parent> <parent>
<groupId>org.alfresco</groupId> <groupId>org.alfresco</groupId>
<artifactId>alfresco-community-repo-packaging</artifactId> <artifactId>alfresco-community-repo-packaging</artifactId>
<version>23.6.0.14</version> <version>23.6.0.29</version>
</parent> </parent>
<modules> <modules>

View File

@@ -7,7 +7,7 @@
<parent> <parent>
<groupId>org.alfresco</groupId> <groupId>org.alfresco</groupId>
<artifactId>alfresco-community-repo-tests</artifactId> <artifactId>alfresco-community-repo-tests</artifactId>
<version>23.6.0.14</version> <version>23.6.0.29</version>
</parent> </parent>
<organization> <organization>

View File

@@ -9,7 +9,7 @@
<parent> <parent>
<groupId>org.alfresco</groupId> <groupId>org.alfresco</groupId>
<artifactId>alfresco-community-repo-tests</artifactId> <artifactId>alfresco-community-repo-tests</artifactId>
<version>23.6.0.14</version> <version>23.6.0.29</version>
</parent> </parent>
<developers> <developers>

View File

@@ -9,7 +9,7 @@
<parent> <parent>
<groupId>org.alfresco</groupId> <groupId>org.alfresco</groupId>
<artifactId>alfresco-community-repo-tests</artifactId> <artifactId>alfresco-community-repo-tests</artifactId>
<version>23.6.0.14</version> <version>23.6.0.29</version>
</parent> </parent>
<developers> <developers>

View File

@@ -8,7 +8,7 @@
<parent> <parent>
<groupId>org.alfresco</groupId> <groupId>org.alfresco</groupId>
<artifactId>alfresco-community-repo-tests</artifactId> <artifactId>alfresco-community-repo-tests</artifactId>
<version>23.6.0.14</version> <version>23.6.0.29</version>
</parent> </parent>
<properties> <properties>

View File

@@ -9,7 +9,7 @@
<parent> <parent>
<groupId>org.alfresco</groupId> <groupId>org.alfresco</groupId>
<artifactId>alfresco-community-repo-tests</artifactId> <artifactId>alfresco-community-repo-tests</artifactId>
<version>23.6.0.14</version> <version>23.6.0.29</version>
</parent> </parent>
<developers> <developers>

View File

@@ -7,7 +7,7 @@
<parent> <parent>
<groupId>org.alfresco</groupId> <groupId>org.alfresco</groupId>
<artifactId>alfresco-community-repo-packaging</artifactId> <artifactId>alfresco-community-repo-packaging</artifactId>
<version>23.6.0.14</version> <version>23.6.0.29</version>
</parent> </parent>
<properties> <properties>

32
pom.xml
View File

@@ -2,7 +2,7 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>alfresco-community-repo</artifactId> <artifactId>alfresco-community-repo</artifactId>
<version>23.6.0.14</version> <version>23.6.0.29</version>
<packaging>pom</packaging> <packaging>pom</packaging>
<name>Alfresco Community Repo Parent</name> <name>Alfresco Community Repo Parent</name>
@@ -51,17 +51,17 @@
<dependency.alfresco-server-root.version>7.0.1</dependency.alfresco-server-root.version> <dependency.alfresco-server-root.version>7.0.1</dependency.alfresco-server-root.version>
<dependency.activiti-engine.version>5.23.0</dependency.activiti-engine.version> <dependency.activiti-engine.version>5.23.0</dependency.activiti-engine.version>
<dependency.activiti.version>5.23.0</dependency.activiti.version> <dependency.activiti.version>5.23.0</dependency.activiti.version>
<dependency.alfresco-transform-core.version>5.1.5</dependency.alfresco-transform-core.version> <dependency.alfresco-transform-core.version>5.2.2</dependency.alfresco-transform-core.version>
<dependency.alfresco-transform-service.version>4.1.5</dependency.alfresco-transform-service.version> <dependency.alfresco-transform-service.version>4.2.2</dependency.alfresco-transform-service.version>
<dependency.alfresco-greenmail.version>7.0</dependency.alfresco-greenmail.version> <dependency.alfresco-greenmail.version>7.0</dependency.alfresco-greenmail.version>
<dependency.acs-event-model.version>0.0.33</dependency.acs-event-model.version> <dependency.acs-event-model.version>0.0.33</dependency.acs-event-model.version>
<dependency.aspectj.version>1.9.22.1</dependency.aspectj.version> <dependency.aspectj.version>1.9.22.1</dependency.aspectj.version>
<dependency.spring.version>6.2.8</dependency.spring.version> <dependency.spring.version>6.2.11</dependency.spring.version>
<dependency.spring-security.version>6.3.9</dependency.spring-security.version> <dependency.spring-security.version>6.4.11</dependency.spring-security.version>
<dependency.antlr.version>3.5.3</dependency.antlr.version> <dependency.antlr.version>3.5.3</dependency.antlr.version>
<dependency.jackson.version>2.17.2</dependency.jackson.version> <dependency.jackson.version>2.17.2</dependency.jackson.version>
<dependency.cxf.version>4.1.0</dependency.cxf.version> <dependency.cxf.version>4.1.2</dependency.cxf.version>
<dependency.opencmis.version>1.0.0-jakarta-1</dependency.opencmis.version> <dependency.opencmis.version>1.0.0-jakarta-1</dependency.opencmis.version>
<dependency.webscripts.version>10.2</dependency.webscripts.version> <dependency.webscripts.version>10.2</dependency.webscripts.version>
<dependency.bouncycastle.version>1.78.1</dependency.bouncycastle.version> <dependency.bouncycastle.version>1.78.1</dependency.bouncycastle.version>
@@ -81,7 +81,7 @@
<dependency.slf4j.version>2.0.16</dependency.slf4j.version> <dependency.slf4j.version>2.0.16</dependency.slf4j.version>
<dependency.log4j.version>2.23.1</dependency.log4j.version> <dependency.log4j.version>2.23.1</dependency.log4j.version>
<dependency.groovy.version>3.0.22</dependency.groovy.version> <dependency.groovy.version>3.0.22</dependency.groovy.version>
<dependency.tika.version>2.9.2</dependency.tika.version> <dependency.tika.version>3.2.3</dependency.tika.version>
<dependency.truezip.version>7.7.10</dependency.truezip.version> <dependency.truezip.version>7.7.10</dependency.truezip.version>
<dependency.poi.version>5.4.1</dependency.poi.version> <dependency.poi.version>5.4.1</dependency.poi.version>
<dependency.jboss.logging.version>3.5.0.Final</dependency.jboss.logging.version> <dependency.jboss.logging.version>3.5.0.Final</dependency.jboss.logging.version>
@@ -113,7 +113,7 @@
<dependency.jakarta-json-path.version>2.9.0</dependency.jakarta-json-path.version> <dependency.jakarta-json-path.version>2.9.0</dependency.jakarta-json-path.version>
<dependency.json-smart.version>2.5.2</dependency.json-smart.version> <dependency.json-smart.version>2.5.2</dependency.json-smart.version>
<alfresco.googledrive.version>4.1.0</alfresco.googledrive.version> <alfresco.googledrive.version>4.1.0</alfresco.googledrive.version>
<alfresco.aos-module.version>3.3.0</alfresco.aos-module.version> <alfresco.aos-module.version>3.4.0-A.1</alfresco.aos-module.version>
<alfresco.api-explorer.version>23.4.0</alfresco.api-explorer.version> <!-- Also in alfresco-enterprise-share --> <alfresco.api-explorer.version>23.4.0</alfresco.api-explorer.version> <!-- Also in alfresco-enterprise-share -->
<alfresco.maven-plugin.version>2.2.0</alfresco.maven-plugin.version> <alfresco.maven-plugin.version>2.2.0</alfresco.maven-plugin.version>
@@ -154,7 +154,7 @@
<connection>scm:git:https://github.com/Alfresco/alfresco-community-repo.git</connection> <connection>scm:git:https://github.com/Alfresco/alfresco-community-repo.git</connection>
<developerConnection>scm:git:https://github.com/Alfresco/alfresco-community-repo.git</developerConnection> <developerConnection>scm:git:https://github.com/Alfresco/alfresco-community-repo.git</developerConnection>
<url>https://github.com/Alfresco/alfresco-community-repo</url> <url>https://github.com/Alfresco/alfresco-community-repo</url>
<tag>23.6.0.14</tag> <tag>23.6.0.29</tag>
</scm> </scm>
<distributionManagement> <distributionManagement>
@@ -170,6 +170,12 @@
<dependencyManagement> <dependencyManagement>
<dependencies> <dependencies>
<!-- v1.10 has 0BSD license it must be consulted with Legal -->
<dependency>
<groupId>org.tukaani</groupId>
<artifactId>xz</artifactId>
<version>1.9</version>
</dependency>
<!-- Jakarta... --> <!-- Jakarta... -->
<dependency> <dependency>
<groupId>jakarta.xml.bind</groupId> <groupId>jakarta.xml.bind</groupId>
@@ -1132,16 +1138,10 @@
<exclude>jakarta.xml.soap:jakarta.xml.soap-api:(, 2.0.1)</exclude> <exclude>jakarta.xml.soap:jakarta.xml.soap-api:(, 2.0.1)</exclude>
<exclude>jakarta.jws:jakarta.jws-api:(, 3.0.0)</exclude> <exclude>jakarta.jws:jakarta.jws-api:(, 3.0.0)</exclude>
<!-- Enforce ban bouncycastle dependencies other than specified under <includes> section--> <!-- Enforce ban bouncycastle dependencies other than specified under <includes> section-->
<exclude>org.bouncycastle</exclude> <exclude>org.bouncycastle:(,1.81)</exclude>
<!-- Enforce one version of Jaxb--> <!-- Enforce one version of Jaxb-->
<exclude>com.sun.xml.bind</exclude> <exclude>com.sun.xml.bind</exclude>
</excludes> </excludes>
<includes>
<include>org.bouncycastle:bcprov-jdk18on:[1.78.1,)</include>
<include>org.bouncycastle:bcmail-jdk18on:[1.78.1,)</include>
<include>org.bouncycastle:bcpkix-jdk18on:[1.78.1,)</include>
<include>org.bouncycastle:bcutil-jdk18on:[1.78.1,)</include>
</includes>
</bannedDependencies> </bannedDependencies>
</rules> </rules>
<fail>true</fail> <fail>true</fail>

View File

@@ -7,7 +7,7 @@
<parent> <parent>
<groupId>org.alfresco</groupId> <groupId>org.alfresco</groupId>
<artifactId>alfresco-community-repo</artifactId> <artifactId>alfresco-community-repo</artifactId>
<version>23.6.0.14</version> <version>23.6.0.29</version>
</parent> </parent>
<dependencies> <dependencies>

View File

@@ -7,7 +7,7 @@
<parent> <parent>
<groupId>org.alfresco</groupId> <groupId>org.alfresco</groupId>
<artifactId>alfresco-community-repo</artifactId> <artifactId>alfresco-community-repo</artifactId>
<version>23.6.0.14</version> <version>23.6.0.29</version>
</parent> </parent>
<dependencies> <dependencies>

View File

@@ -2,7 +2,7 @@
* #%L * #%L
* Alfresco Repository * Alfresco Repository
* %% * %%
* Copyright (C) 2005 - 2016 Alfresco Software Limited * Copyright (C) 2005 - 2025 Alfresco Software Limited
* %% * %%
* This file is part of the Alfresco software. * This file is part of the Alfresco software.
* If the software was purchased under a paid Alfresco license, the terms of * If the software was purchased under a paid Alfresco license, the terms of
@@ -36,8 +36,7 @@ import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
/** /**
* Class holding properties associated with the <b>sys:referenceable</b> aspect. * Class holding properties associated with the <b>sys:referenceable</b> aspect. This aspect is common enough to warrant direct inclusion on the <b>Node</b> entity.
* This aspect is common enough to warrant direct inclusion on the <b>Node</b> entity.
* *
* @author Derek Hulley * @author Derek Hulley
* @since 3.4 * @since 3.4
@@ -55,7 +54,7 @@ public class ReferenceablePropertiesEntity
} }
/** /**
* @return Returns <tt>true</tt> if the property belongs to the <b>sys:referenceable</b> aspect * @return Returns <tt>true</tt> if the property belongs to the <b>sys:referenceable</b> aspect
*/ */
public static boolean isReferenceableProperty(QName qname) public static boolean isReferenceableProperty(QName qname)
{ {
@@ -87,10 +86,8 @@ public class ReferenceablePropertiesEntity
/** /**
* Adds all {@link ContentModel#ASPECT_REFERENCEABLE referencable} properties. * Adds all {@link ContentModel#ASPECT_REFERENCEABLE referencable} properties.
*/ */
public static void addReferenceableProperties(Node node, Map<QName, Serializable> properties) public static void addReferenceableProperties(Long nodeId, NodeRef nodeRef, Map<QName, Serializable> properties)
{ {
Long nodeId = node.getId();
NodeRef nodeRef = node.getNodeRef();
properties.put(ContentModel.PROP_STORE_PROTOCOL, nodeRef.getStoreRef().getProtocol()); properties.put(ContentModel.PROP_STORE_PROTOCOL, nodeRef.getStoreRef().getProtocol());
properties.put(ContentModel.PROP_STORE_IDENTIFIER, nodeRef.getStoreRef().getIdentifier()); properties.put(ContentModel.PROP_STORE_IDENTIFIER, nodeRef.getStoreRef().getIdentifier());
properties.put(ContentModel.PROP_NODE_UUID, nodeRef.getId()); properties.put(ContentModel.PROP_NODE_UUID, nodeRef.getId());

View File

@@ -116,7 +116,7 @@ public class NodeDAOImpl extends AbstractNodeDAOImpl
private static final String SELECT_NODE_MAX_ID = "alfresco.node.select_NodeMaxId"; private static final String SELECT_NODE_MAX_ID = "alfresco.node.select_NodeMaxId";
private static final String SELECT_NODE_INTERVAL_BY_TYPE = "alfresco.node.select_MinMaxNodeIdForNodeType"; private static final String SELECT_NODE_INTERVAL_BY_TYPE = "alfresco.node.select_MinMaxNodeIdForNodeType";
private static final String SELECT_NODES_WITH_ASPECT_IDS = "alfresco.node.select_NodesWithAspectIds"; private static final String SELECT_NODES_WITH_ASPECT_IDS = "alfresco.node.select_NodesWithAspectIds";
private static final String SELECT_NODES_WITH_ASPECT_IDS_LIMITED = "alfresco.node.select_NodesWithAspectIds_Limited"; private static final String SELECT_NODES_WITH_ASPECT_IDS_LIMITED = "alfresco.node.select.select_NodesWithAspectIds_Limited";
private static final String INSERT_NODE_ASSOC = "alfresco.node.insert.insert_NodeAssoc"; private static final String INSERT_NODE_ASSOC = "alfresco.node.insert.insert_NodeAssoc";
private static final String UPDATE_NODE_ASSOC = "alfresco.node.update_NodeAssoc"; private static final String UPDATE_NODE_ASSOC = "alfresco.node.update_NodeAssoc";
private static final String DELETE_NODE_ASSOC = "alfresco.node.delete_NodeAssoc"; private static final String DELETE_NODE_ASSOC = "alfresco.node.delete_NodeAssoc";

View File

@@ -2,7 +2,7 @@
* #%L * #%L
* Alfresco Repository * Alfresco Repository
* %% * %%
* Copyright (C) 2005 - 2023 Alfresco Software Limited * Copyright (C) 2005 - 2025 Alfresco Software Limited
* %% * %%
* This file is part of the Alfresco software. * This file is part of the Alfresco software.
* If the software was purchased under a paid Alfresco license, the terms of * If the software was purchased under a paid Alfresco license, the terms of
@@ -39,8 +39,10 @@ import org.alfresco.service.namespace.QName;
/** /**
* Encapsulates events occurred in a single transaction. * Encapsulates events occurred in a single transaction.
* *
* @param <REF> entity (e.g. node, child association, peer association) reference type * @param <REF>
* @param <RES> entity resource type * entity (e.g. node, child association, peer association) reference type
* @param <RES>
* entity resource type
*/ */
public abstract class EventConsolidator<REF extends EntityRef, RES extends Resource> public abstract class EventConsolidator<REF extends EntityRef, RES extends Resource>
{ {
@@ -90,23 +92,31 @@ public abstract class EventConsolidator<REF extends EntityRef, RES extends Resou
/** /**
* Builds and returns the {@link RepoEvent} instance. * Builds and returns the {@link RepoEvent} instance.
* *
* @param eventInfo the object holding the event information * @param eventInfo
* the object holding the event information
* @return the {@link RepoEvent} instance * @return the {@link RepoEvent} instance
*/ */
public RepoEvent<DataAttributes<RES>> getRepoEvent(EventInfo eventInfo) public RepoEvent<DataAttributes<RES>> getRepoEvent(EventInfo eventInfo)
{
final RepoEvent.Builder<DataAttributes<RES>> builder = RepoEvent.builder();
configureRepoEventBuilder(builder, eventInfo);
return builder.build();
}
protected void configureRepoEventBuilder(RepoEvent.Builder<DataAttributes<RES>> builder, EventInfo eventInfo)
{ {
EventType eventType = getDerivedEvent(); EventType eventType = getDerivedEvent();
DataAttributes<RES> eventData = buildEventData(eventInfo, resource, eventType); DataAttributes<RES> eventData = buildEventData(eventInfo, resource, eventType);
return RepoEvent.<DataAttributes<RES>>builder() builder.setId(eventInfo.getId())
.setId(eventInfo.getId()) .setSource(eventInfo.getSource())
.setSource(eventInfo.getSource()) .setTime(eventInfo.getTimestamp())
.setTime(eventInfo.getTimestamp()) .setType(eventType.getType())
.setType(eventType.getType()) .setData(eventData)
.setData(eventData) .setDataschema(EventJSONSchema.getSchemaV1(eventType));
.setDataschema(EventJSONSchema.getSchemaV1(eventType))
.build();
} }
/** /**
@@ -114,9 +124,9 @@ public abstract class EventConsolidator<REF extends EntityRef, RES extends Resou
*/ */
protected DataAttributes<RES> buildEventData(EventInfo eventInfo, RES resource, EventType eventType) protected DataAttributes<RES> buildEventData(EventInfo eventInfo, RES resource, EventType eventType)
{ {
return EventData.<RES>builder() return EventData.<RES> builder()
.setEventGroupId(eventInfo.getTxnId()) .setEventGroupId(eventInfo.getTxnId())
.setResource(resource) .setResource(resource)
.build(); .build();
} }
} }

View File

@@ -2,7 +2,7 @@
* #%L * #%L
* Alfresco Repository * Alfresco Repository
* %% * %%
* Copyright (C) 2005 - 2016 Alfresco Software Limited * Copyright (C) 2005 - 2025 Alfresco Software Limited
* %% * %%
* This file is part of the Alfresco software. * This file is part of the Alfresco software.
* If the software was purchased under a paid Alfresco license, the terms of * If the software was purchased under a paid Alfresco license, the terms of
@@ -28,8 +28,10 @@ package org.alfresco.repo.node.getchildren;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import org.alfresco.repo.domain.node.NodeEntity; import org.alfresco.repo.domain.node.AuditablePropertiesEntity;
import org.alfresco.repo.domain.node.NodePropertyEntity; import org.alfresco.repo.domain.node.NodePropertyEntity;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.StoreRef;
/** /**
* Filterable/Sortable Node Entity * Filterable/Sortable Node Entity
@@ -42,12 +44,17 @@ import org.alfresco.repo.domain.node.NodePropertyEntity;
public class FilterSortNodeEntity public class FilterSortNodeEntity
{ {
private Long id; // node id private Long id; // node id
private String nodeUuid;
private Long typeQNameId;
private NodeEntity node; private AuditablePropertiesEntity auditablePropertiesEntity;
private NodePropertyEntity prop1; private NodePropertyEntity prop1;
private NodePropertyEntity prop2; private NodePropertyEntity prop2;
private NodePropertyEntity prop3; private NodePropertyEntity prop3;
private String storeProtocol;
private String storeIdentifier;
// Supplemental query-related parameters // Supplemental query-related parameters
private Long parentNodeId; private Long parentNodeId;
private Long prop1qnameId; private Long prop1qnameId;
@@ -80,6 +87,26 @@ public class FilterSortNodeEntity
this.id = id; this.id = id;
} }
public String getNodeUuid()
{
return nodeUuid;
}
public void setNodeUuid(String nodeUuid)
{
this.nodeUuid = nodeUuid;
}
public Long getTypeQNameId()
{
return typeQNameId;
}
public void setTypeQNameId(Long typeQNameId)
{
this.typeQNameId = typeQNameId;
}
public String getPattern() public String getPattern()
{ {
return pattern; return pattern;
@@ -93,22 +120,21 @@ public class FilterSortNodeEntity
do do
{ {
idx = s.indexOf(escapeChar, offset); idx = s.indexOf(escapeChar, offset);
if(idx != -1) if (idx != -1)
{ {
sb.append(s.substring(offset, idx)); sb.append(s.substring(offset, idx));
sb.append("\\"); sb.append("\\");
sb.append(escapeChar); sb.append(escapeChar);
offset = idx + 1; offset = idx + 1;
} }
} } while (idx != -1);
while(idx != -1);
sb.append(s.substring(offset)); sb.append(s.substring(offset));
return sb.toString(); return sb.toString();
} }
public void setPattern(String pattern) public void setPattern(String pattern)
{ {
if(pattern != null) if (pattern != null)
{ {
// escape the '%' character with '\' (standard SQL escape character) // escape the '%' character with '\' (standard SQL escape character)
pattern = escape(pattern, '%'); pattern = escape(pattern, '%');
@@ -137,6 +163,16 @@ public class FilterSortNodeEntity
this.namePropertyQNameId = namePropertyQNameId; this.namePropertyQNameId = namePropertyQNameId;
} }
public AuditablePropertiesEntity getAuditablePropertiesEntity()
{
return auditablePropertiesEntity;
}
public void setAuditablePropertiesEntity(AuditablePropertiesEntity auditablePropertiesEntity)
{
this.auditablePropertiesEntity = auditablePropertiesEntity;
}
public NodePropertyEntity getProp1() public NodePropertyEntity getProp1()
{ {
return prop1; return prop1;
@@ -167,14 +203,24 @@ public class FilterSortNodeEntity
this.prop3 = prop3; this.prop3 = prop3;
} }
public NodeEntity getNode() public String getStoreProtocol()
{ {
return node; return storeProtocol;
} }
public void setNode(NodeEntity childNode) public void setStoreProtocol(String storeProtocol)
{ {
this.node = childNode; this.storeProtocol = storeProtocol;
}
public String getStoreIdentifier()
{
return storeIdentifier;
}
public void setStoreIdentifier(String storeIdentifier)
{
this.storeIdentifier = storeIdentifier;
} }
// Supplemental query-related parameters // Supplemental query-related parameters
@@ -258,4 +304,9 @@ public class FilterSortNodeEntity
{ {
this.isPrimary = isPrimary; this.isPrimary = isPrimary;
} }
public NodeRef createNodeRef()
{
return new NodeRef(new StoreRef(storeProtocol, storeIdentifier), nodeUuid);
}
} }

View File

@@ -2,7 +2,7 @@
* #%L * #%L
* Alfresco Repository * Alfresco Repository
* %% * %%
* Copyright (C) 2005 - 2016 Alfresco Software Limited * Copyright (C) 2005 - 2025 Alfresco Software Limited
* %% * %%
* This file is part of the Alfresco software. * This file is part of the Alfresco software.
* If the software was purchased under a paid Alfresco license, the terms of * If the software was purchased under a paid Alfresco license, the terms of
@@ -38,13 +38,16 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.extensions.surf.util.I18NUtil;
import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.query.CannedQueryParameters; import org.alfresco.query.CannedQueryParameters;
import org.alfresco.query.CannedQuerySortDetails; import org.alfresco.query.CannedQuerySortDetails;
import org.alfresco.query.CannedQuerySortDetails.SortOrder; import org.alfresco.query.CannedQuerySortDetails.SortOrder;
import org.alfresco.repo.domain.node.AuditablePropertiesEntity; import org.alfresco.repo.domain.node.AuditablePropertiesEntity;
import org.alfresco.repo.domain.node.Node;
import org.alfresco.repo.domain.node.NodeDAO; import org.alfresco.repo.domain.node.NodeDAO;
import org.alfresco.repo.domain.node.NodeEntity; import org.alfresco.repo.domain.node.NodeEntity;
import org.alfresco.repo.domain.node.NodePropertyEntity; import org.alfresco.repo.domain.node.NodePropertyEntity;
@@ -69,15 +72,11 @@ import org.alfresco.service.namespace.QName;
import org.alfresco.util.AlfrescoCollator; import org.alfresco.util.AlfrescoCollator;
import org.alfresco.util.Pair; import org.alfresco.util.Pair;
import org.alfresco.util.ParameterCheck; import org.alfresco.util.ParameterCheck;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.extensions.surf.util.I18NUtil;
/** /**
* GetChildren canned query * GetChildren canned query
* *
* To get paged list of children of a parent node filtered by child type. * To get paged list of children of a parent node filtered by child type. Also optionally filtered and/or sorted by one or more properties (up to three).
* Also optionally filtered and/or sorted by one or more properties (up to three).
* *
* @author janv * @author janv
* @since 4.0 * @since 4.0
@@ -100,7 +99,6 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
public static final QName FILTER_QNAME_NODE_IS_PRIMARY = QName.createQName("", "IS_PRIMARY"); public static final QName FILTER_QNAME_NODE_IS_PRIMARY = QName.createQName("", "IS_PRIMARY");
private NodeDAO nodeDAO; private NodeDAO nodeDAO;
private QNameDAO qnameDAO; private QNameDAO qnameDAO;
private CannedQueryDAO cannedQueryDAO; private CannedQueryDAO cannedQueryDAO;
@@ -135,8 +133,8 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
} }
// TODO refactor (only apply post query if sorted - as above) // TODO refactor (only apply post query if sorted - as above)
GetChildrenCannedQueryParams paramBean = (GetChildrenCannedQueryParams)params.getParameterBean(); GetChildrenCannedQueryParams paramBean = (GetChildrenCannedQueryParams) params.getParameterBean();
if ((paramBean.getFilterProps()!= null) && (paramBean.getFilterProps().size() > 0)) if ((paramBean.getFilterProps() != null) && (paramBean.getFilterProps().size() > 0))
{ {
applyPostQueryPermissions = true; applyPostQueryPermissions = true;
} }
@@ -163,7 +161,7 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
Long start = (logger.isDebugEnabled() ? System.currentTimeMillis() : null); Long start = (logger.isDebugEnabled() ? System.currentTimeMillis() : null);
// Get parameters // Get parameters
GetChildrenCannedQueryParams paramBean = (GetChildrenCannedQueryParams)parameters.getParameterBean(); GetChildrenCannedQueryParams paramBean = (GetChildrenCannedQueryParams) parameters.getParameterBean();
// Get parent node // Get parent node
NodeRef parentRef = paramBean.getParentRef(); NodeRef parentRef = paramBean.getParentRef();
@@ -192,8 +190,8 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
// Get sort details // Get sort details
CannedQuerySortDetails sortDetails = parameters.getSortDetails(); CannedQuerySortDetails sortDetails = parameters.getSortDetails();
@SuppressWarnings({ "unchecked", "rawtypes" }) @SuppressWarnings({"unchecked", "rawtypes"})
final List<Pair<QName, SortOrder>> sortPairs = (List)sortDetails.getSortPairs(); final List<Pair<QName, SortOrder>> sortPairs = (List) sortDetails.getSortPairs();
if (filterProps.size() > 0) if (filterProps.size() > 0)
{ {
@@ -203,9 +201,9 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
for (FilterProp filter : filterProps) for (FilterProp filter : filterProps)
{ {
if ((filter instanceof FilterPropBoolean) && if ((filter instanceof FilterPropBoolean) &&
((FilterPropBoolean)filter).getPropName().equals(FILTER_QNAME_NODE_IS_PRIMARY)) ((FilterPropBoolean) filter).getPropName().equals(FILTER_QNAME_NODE_IS_PRIMARY))
{ {
isPrimary = ((FilterPropBoolean)filter).getPropVal(); isPrimary = ((FilterPropBoolean) filter).getPropVal();
break; break;
} }
idx++; idx++;
@@ -223,17 +221,17 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
for (Pair<QName, SortOrder> sort : sortPairs) for (Pair<QName, SortOrder> sort : sortPairs)
{ {
QName sortQName = sort.getFirst(); QName sortQName = sort.getFirst();
if(! sortFilterProps.contains(sortQName)) if (!sortFilterProps.contains(sortQName))
{ {
sortFilterProps.add(sortQName); sortFilterProps.add(sortQName);
} }
} }
for (FilterProp filter : filterProps) for (FilterProp filter : filterProps)
{ {
QName filterQName = filter.getPropName(); QName filterQName = filter.getPropName();
if(! sortFilterProps.contains(filterQName)) if (!sortFilterProps.contains(filterQName))
{ {
sortFilterProps.add(filterQName); sortFilterProps.add(filterQName);
} }
} }
@@ -241,109 +239,108 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
if (filterSortPropCnt > MAX_FILTER_SORT_PROPS) if (filterSortPropCnt > MAX_FILTER_SORT_PROPS)
{ {
throw new AlfrescoRuntimeException("GetChildren: exceeded maximum number filter/sort properties: (max="+MAX_FILTER_SORT_PROPS+", actual="+filterSortPropCnt); throw new AlfrescoRuntimeException("GetChildren: exceeded maximum number filter/sort properties: (max=" + MAX_FILTER_SORT_PROPS + ", actual=" + filterSortPropCnt);
} }
filterSortPropCnt = setFilterSortParams(sortFilterProps, params); filterSortPropCnt = setFilterSortParams(sortFilterProps, params);
List<NodeRef> result = new ArrayList<>(0); List<NodeRef> result = new ArrayList<>(0);
try try
{ {
if ((childNodeTypeQNames != null) && (childNodeTypeQNames.size() > 0)) if ((childNodeTypeQNames != null) && (childNodeTypeQNames.size() > 0))
{ {
// Set child node type qnames (additional filter - performed by DB query) // Set child node type qnames (additional filter - performed by DB query)
Set<Long> childNodeTypeQNameIds = qnameDAO.convertQNamesToIds(childNodeTypeQNames, false); Set<Long> childNodeTypeQNameIds = qnameDAO.convertQNamesToIds(childNodeTypeQNames, false);
if (childNodeTypeQNameIds.size() > 0) if (childNodeTypeQNameIds.size() > 0)
{ {
params.setChildNodeTypeQNameIds(new ArrayList<Long>(childNodeTypeQNameIds)); params.setChildNodeTypeQNameIds(new ArrayList<Long>(childNodeTypeQNameIds));
} }
else else
{ {
// short-circuit - return no results - given node type qname(s) do not exist // short-circuit - return no results - given node type qname(s) do not exist
return result; return result;
} }
} }
if ((assocTypeQNames != null) && (assocTypeQNames.size() > 0)) if ((assocTypeQNames != null) && (assocTypeQNames.size() > 0))
{ {
// Set assoc type qnames (additional filter - performed by DB query) // Set assoc type qnames (additional filter - performed by DB query)
Set<Long> assocTypeQNameIds = qnameDAO.convertQNamesToIds(assocTypeQNames, false); Set<Long> assocTypeQNameIds = qnameDAO.convertQNamesToIds(assocTypeQNames, false);
if (assocTypeQNameIds.size() > 0) if (assocTypeQNameIds.size() > 0)
{ {
params.setAssocTypeQNameIds(assocTypeQNameIds); params.setAssocTypeQNameIds(assocTypeQNameIds);
} }
else else
{ {
// short-circuit - return no results - given assoc type qname(s) do not exist // short-circuit - return no results - given assoc type qname(s) do not exist
return result; return result;
} }
} }
if (pattern != null) if (pattern != null)
{ {
// TODO, check that we should be tied to the content model in this way. Perhaps a configurable property // TODO, check that we should be tied to the content model in this way. Perhaps a configurable property
// name against which compare the pattern? // name against which compare the pattern?
Pair<Long, QName> nameQName = qnameDAO.getQName(ContentModel.PROP_NAME); Pair<Long, QName> nameQName = qnameDAO.getQName(ContentModel.PROP_NAME);
if(nameQName == null) if (nameQName == null)
{ {
throw new AlfrescoRuntimeException("Unable to determine qname id of name property"); throw new AlfrescoRuntimeException("Unable to determine qname id of name property");
} }
params.setNamePropertyQNameId(nameQName.getFirst()); params.setNamePropertyQNameId(nameQName.getFirst());
params.setPattern(pattern); params.setPattern(pattern);
} }
if (filterSortPropCnt > 0) if (filterSortPropCnt > 0)
{ {
// filtered and/or sorted - note: permissions will be applied post query // filtered and/or sorted - note: permissions will be applied post query
final List<FilterSortNode> children = new ArrayList<FilterSortNode>(100); final List<FilterSortNode> children = new ArrayList<FilterSortNode>(100);
final FilterSortChildQueryCallback c = getFilterSortChildQuery(children, filterProps, paramBean); final FilterSortChildQueryCallback c = getFilterSortChildQuery(children, filterProps, paramBean);
FilterSortResultHandler resultHandler = new FilterSortResultHandler(c); FilterSortResultHandler resultHandler = new FilterSortResultHandler(c);
cannedQueryDAO.executeQuery(QUERY_NAMESPACE, QUERY_SELECT_GET_CHILDREN_WITH_PROPS, params, 0, Integer.MAX_VALUE, resultHandler); cannedQueryDAO.executeQuery(QUERY_NAMESPACE, QUERY_SELECT_GET_CHILDREN_WITH_PROPS, params, 0, Integer.MAX_VALUE, resultHandler);
resultHandler.done(); resultHandler.done();
if (sortPairs.size() > 0) if (sortPairs.size() > 0)
{ {
Long startSort = (logger.isDebugEnabled() ? System.currentTimeMillis() : null); Long startSort = (logger.isDebugEnabled() ? System.currentTimeMillis() : null);
// sort // sort
Collections.sort(children, new PropComparatorAsc(sortPairs)); Collections.sort(children, new PropComparatorAsc(sortPairs));
if (startSort != null) if (startSort != null)
{ {
logger.debug("Post-query sort: "+children.size()+" in "+(System.currentTimeMillis()-startSort)+" msecs"); logger.debug("Post-query sort: " + children.size() + " in " + (System.currentTimeMillis() - startSort) + " msecs");
} }
} }
result = new ArrayList<NodeRef>(children.size()); result = new ArrayList<NodeRef>(children.size());
for (FilterSortNode child : children) for (FilterSortNode child : children)
{ {
result.add(tenantService.getBaseName(child.getNodeRef())); result.add(tenantService.getBaseName(child.getNodeRef()));
} }
} }
else else
{ {
// unsorted (apart from any implicit order) - note: permissions are applied during result handling to allow early cutoff // unsorted (apart from any implicit order) - note: permissions are applied during result handling to allow early cutoff
final int requestedCount = parameters.getResultsRequired(); final int requestedCount = parameters.getResultsRequired();
final List<NodeRef> rawResult = new ArrayList<NodeRef>(Math.min(1000, requestedCount)); final List<NodeRef> rawResult = new ArrayList<NodeRef>(Math.min(1000, requestedCount));
UnsortedChildQueryCallback callback = getUnsortedChildQueryCallback(rawResult, requestedCount, paramBean); UnsortedChildQueryCallback callback = getUnsortedChildQueryCallback(rawResult, requestedCount, paramBean);
UnsortedResultHandler resultHandler = new UnsortedResultHandler(callback); UnsortedResultHandler resultHandler = new UnsortedResultHandler(callback);
cannedQueryDAO.executeQuery(QUERY_NAMESPACE, QUERY_SELECT_GET_CHILDREN_WITHOUT_PROPS, params, 0, Integer.MAX_VALUE, resultHandler); cannedQueryDAO.executeQuery(QUERY_NAMESPACE, QUERY_SELECT_GET_CHILDREN_WITHOUT_PROPS, params, 0, Integer.MAX_VALUE, resultHandler);
resultHandler.done(); resultHandler.done();
// permissions have been applied // permissions have been applied
result = PermissionCheckedValueMixin.create(rawResult); result = PermissionCheckedValueMixin.create(rawResult);
} }
} }
finally finally
{ {
if (start != null) if (start != null)
{ {
logger.debug("Base query "+(filterSortPropCnt > 0 ? "(sort=y, perms=n)" : "(sort=n, perms=y)")+": "+result.size()+" in "+(System.currentTimeMillis()-start)+" msecs"); logger.debug("Base query " + (filterSortPropCnt > 0 ? "(sort=y, perms=n)" : "(sort=n, perms=y)") + ": " + result.size() + " in " + (System.currentTimeMillis() - start) + " msecs");
} }
} }
return result; return result;
@@ -385,14 +382,14 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
else else
{ {
// belts and braces // belts and braces
throw new AlfrescoRuntimeException("GetChildren: unexpected - cannot set sort parameter: "+cnt); throw new AlfrescoRuntimeException("GetChildren: unexpected - cannot set sort parameter: " + cnt);
} }
propCnt++; propCnt++;
} }
else else
{ {
logger.warn("Skipping filter/sort param - cannot find: "+filterSortProp); logger.warn("Skipping filter/sort param - cannot find: " + filterSortProp);
break; break;
} }
} }
@@ -443,7 +440,7 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
Object pv1 = null; Object pv1 = null;
Object pv2 = null; Object pv2 = null;
QName sortPropQName = (QName)sortProps.get(0).getFirst(); QName sortPropQName = (QName) sortProps.get(0).getFirst();
boolean sortAscending = (sortProps.get(0).getSecond() == SortOrder.ASCENDING); boolean sortAscending = (sortProps.get(0).getSecond() == SortOrder.ASCENDING);
FilterSortNode node1 = node1In; FilterSortNode node1 = node1In;
@@ -462,7 +459,7 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
if (pv1 == null) if (pv1 == null)
{ {
if(pv2 == null && sortProps.size() > 1) if (pv2 == null && sortProps.size() > 1)
{ {
return compareImpl(node1In, node2In, sortProps.subList(1, sortProps.size())); return compareImpl(node1In, node2In, sortProps.subList(1, sortProps.size()));
} }
@@ -478,32 +475,32 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
if (pv1 instanceof String) if (pv1 instanceof String)
{ {
result = collator.compare((String)pv1, (String)pv2); // TODO use collation keys (re: performance) result = collator.compare((String) pv1, (String) pv2); // TODO use collation keys (re: performance)
} }
else if (pv1 instanceof Date) else if (pv1 instanceof Date)
{ {
result = (((Date)pv1).compareTo((Date)pv2)); result = (((Date) pv1).compareTo((Date) pv2));
} }
else if (pv1 instanceof Long) else if (pv1 instanceof Long)
{ {
result = (((Long)pv1).compareTo((Long)pv2)); result = (((Long) pv1).compareTo((Long) pv2));
} }
else if (pv1 instanceof Integer) else if (pv1 instanceof Integer)
{ {
result = (((Integer)pv1).compareTo((Integer)pv2)); result = (((Integer) pv1).compareTo((Integer) pv2));
} }
else if (pv1 instanceof QName) else if (pv1 instanceof QName)
{ {
result = (((QName)pv1).compareTo((QName)pv2)); result = (((QName) pv1).compareTo((QName) pv2));
} }
else if (pv1 instanceof Boolean) else if (pv1 instanceof Boolean)
{ {
result = (((Boolean)pv1).compareTo((Boolean)pv2)); result = (((Boolean) pv1).compareTo((Boolean) pv2));
} }
else else
{ {
// TODO other comparisons // TODO other comparisons
throw new RuntimeException("Unsupported sort type: "+pv1.getClass().getName()); throw new RuntimeException("Unsupported sort type: " + pv1.getClass().getName());
} }
if ((result == 0) && (sortProps.size() > 1)) if ((result == 0) && (sortProps.size() > 1))
@@ -555,68 +552,68 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
{ {
if ((filterProp instanceof FilterPropString) && (propVal instanceof String)) if ((filterProp instanceof FilterPropString) && (propVal instanceof String))
{ {
String val = (String)propVal; String val = (String) propVal;
String filter = (String)filterProp.getPropVal(); String filter = (String) filterProp.getPropVal();
switch ((FilterTypeString)filterProp.getFilterType()) switch ((FilterTypeString) filterProp.getFilterType())
{ {
case STARTSWITH: case STARTSWITH:
if (val.startsWith(filter)) if (val.startsWith(filter))
{ {
return true; return true;
} }
break; break;
case STARTSWITH_IGNORECASE: case STARTSWITH_IGNORECASE:
if (val.toLowerCase().startsWith(filter.toLowerCase())) if (val.toLowerCase().startsWith(filter.toLowerCase()))
{ {
return true; return true;
} }
break;
case EQUALS:
if (val.equals(filter))
{
return true;
}
break; break;
case EQUALS_IGNORECASE: case EQUALS:
if (val.equalsIgnoreCase(filter)) if (val.equals(filter))
{ {
return true; return true;
} }
break; break;
case ENDSWITH: case EQUALS_IGNORECASE:
if (val.endsWith(filter)) if (val.equalsIgnoreCase(filter))
{ {
return true; return true;
} }
break; break;
case ENDSWITH_IGNORECASE: case ENDSWITH:
if (val.toLowerCase().endsWith(filter.toLowerCase())) if (val.endsWith(filter))
{ {
return true; return true;
} }
break; break;
case MATCHES: case ENDSWITH_IGNORECASE:
if (val.matches(filter)) if (val.toLowerCase().endsWith(filter.toLowerCase()))
{ {
return true; return true;
} }
break; break;
case MATCHES_IGNORECASE: case MATCHES:
if (val.toLowerCase().matches(filter.toLowerCase())) if (val.matches(filter))
{ {
return true; return true;
} }
break; break;
default: case MATCHES_IGNORECASE:
if (val.toLowerCase().matches(filter.toLowerCase()))
{
return true;
}
break;
default:
} }
} }
} }
if ((filterProp instanceof FilterPropBoolean) && (propVal instanceof Boolean)) if ((filterProp instanceof FilterPropBoolean) && (propVal instanceof Boolean))
{ {
Boolean val = (Boolean)propVal; Boolean val = (Boolean) propVal;
Boolean filter = (Boolean)filterProp.getPropVal(); Boolean filter = (Boolean) filterProp.getPropVal();
return (val == filter); return (val == filter);
} }
@@ -649,7 +646,7 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
if (start != null) if (start != null)
{ {
logger.debug("Post-query perms: "+ret.size()+" in "+(System.currentTimeMillis()-start)+" msecs"); logger.debug("Post-query perms: " + ret.size() + " in " + (System.currentTimeMillis() - start) + " msecs");
} }
return ret; return ret;
@@ -663,7 +660,7 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
if (start != null) if (start != null)
{ {
logger.trace("Pre-load: "+nodeRefs.size()+" in "+(System.currentTimeMillis()-start)+" msecs"); logger.trace("Pre-load: " + nodeRefs.size() + " in " + (System.currentTimeMillis() - start) + " msecs");
} }
} }
@@ -697,7 +694,7 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
@Override @Override
public boolean handle(FilterSortNode node) public boolean handle(FilterSortNode node)
{ {
if(include(node)) if (include(node))
{ {
children.add(node); children.add(node);
} }
@@ -709,7 +706,7 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
protected boolean include(FilterSortNode node) protected boolean include(FilterSortNode node)
{ {
// filter, if needed // filter, if needed
return(!applyFilter || includeFilter(node.getPropVals(), filterProps)) && includeAspects(node.getNodeRef(), inclusiveAspects, exclusiveAspects); return (!applyFilter || includeFilter(node.getPropVals(), filterProps)) && includeAspects(node.getNodeRef(), inclusiveAspects, exclusiveAspects);
} }
} }
@@ -731,7 +728,7 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
@Override @Override
public boolean handle(NodeRef nodeRef) public boolean handle(NodeRef nodeRef)
{ {
if(include(nodeRef)) if (include(nodeRef))
{ {
rawResult.add(tenantService.getBaseName(nodeRef)); rawResult.add(tenantService.getBaseName(nodeRef));
} }
@@ -777,7 +774,8 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
if (results.size() >= BATCH_SIZE) if (results.size() >= BATCH_SIZE)
{ {
// batch // batch
preloadFilterSort(); preloadNodes();
filterSort();
} }
results.add(result); results.add(result);
@@ -790,24 +788,27 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
if (results.size() >= 0) if (results.size() >= 0)
{ {
// finish batch // finish batch
preloadFilterSort(); preloadNodes();
filterSort();
} }
} }
private void preloadFilterSort() private void preloadNodes()
{ {
List<NodeRef> nodeRefs = new ArrayList<>(results.size()); List<NodeRef> nodeRefs = new ArrayList<>(results.size());
for (FilterSortNodeEntity result : results) for (FilterSortNodeEntity result : results)
{ {
nodeRefs.add(result.getNode().getNodeRef()); nodeRefs.add(result.createNodeRef());
} }
preload(nodeRefs); preload(nodeRefs);
}
private void filterSort()
{
for (FilterSortNodeEntity result : results) for (FilterSortNodeEntity result : results)
{ {
Node node = result.getNode(); NodeRef nodeRef = result.createNodeRef();
NodeRef nodeRef = node.getNodeRef();
Map<NodePropertyKey, NodePropertyValue> propertyValues = new HashMap<NodePropertyKey, NodePropertyValue>(3); Map<NodePropertyKey, NodePropertyValue> propertyValues = new HashMap<NodePropertyKey, NodePropertyValue>(3);
@@ -832,7 +833,7 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
Map<QName, Serializable> propVals = nodePropertyHelper.convertToPublicProperties(propertyValues); Map<QName, Serializable> propVals = nodePropertyHelper.convertToPublicProperties(propertyValues);
// Add referenceable / spoofed properties (including spoofed name if null) // Add referenceable / spoofed properties (including spoofed name if null)
ReferenceablePropertiesEntity.addReferenceableProperties(node, propVals); ReferenceablePropertiesEntity.addReferenceableProperties(result.getId(), nodeRef, propVals);
// special cases // special cases
@@ -841,12 +842,12 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
{ {
if (entry.getValue() instanceof MLText) if (entry.getValue() instanceof MLText)
{ {
propVals.put(entry.getKey(), DefaultTypeConverter.INSTANCE.convert(String.class, (MLText)entry.getValue())); propVals.put(entry.getKey(), DefaultTypeConverter.INSTANCE.convert(String.class, (MLText) entry.getValue()));
} }
} }
// ContentData (eg. cm:content.size, cm:content.mimetype) // ContentData (eg. cm:content.size, cm:content.mimetype)
ContentData contentData = (ContentData)propVals.get(ContentModel.PROP_CONTENT); ContentData contentData = (ContentData) propVals.get(ContentModel.PROP_CONTENT);
if (contentData != null) if (contentData != null)
{ {
propVals.put(SORT_QNAME_CONTENT_SIZE, contentData.getSize()); propVals.put(SORT_QNAME_CONTENT_SIZE, contentData.getSize());
@@ -854,7 +855,7 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
} }
// Auditable props (eg. cm:creator, cm:created, cm:modifier, cm:modified, ...) // Auditable props (eg. cm:creator, cm:created, cm:modifier, cm:modified, ...)
AuditablePropertiesEntity auditableProps = node.getAuditableProperties(); AuditablePropertiesEntity auditableProps = result.getAuditablePropertiesEntity();
if (auditableProps != null) if (auditableProps != null)
{ {
for (Map.Entry<QName, Serializable> entry : auditableProps.getAuditableProperties().entrySet()) for (Map.Entry<QName, Serializable> entry : auditableProps.getAuditableProperties().entrySet())
@@ -864,7 +865,7 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
} }
// Node type // Node type
Long nodeTypeQNameId = node.getTypeQNameId(); Long nodeTypeQNameId = result.getTypeQNameId();
if (nodeTypeQNameId != null) if (nodeTypeQNameId != null)
{ {
Pair<Long, QName> pair = qnameDAO.getQName(nodeTypeQNameId); Pair<Long, QName> pair = qnameDAO.getQName(nodeTypeQNameId);

View File

@@ -133,6 +133,14 @@
<resultMap id="result_FilterSortNode" type="FilterSortNode"> <resultMap id="result_FilterSortNode" type="FilterSortNode">
<id property="id" column="id" jdbcType="BIGINT" javaType="java.lang.Long"/> <id property="id" column="id" jdbcType="BIGINT" javaType="java.lang.Long"/>
<result property="nodeUuid" column="uuid" jdbcType="VARCHAR" javaType="java.lang.String"/>
<result property="typeQNameId" column="type_qname_id" jdbcType="BIGINT" javaType="java.lang.Long"/>
<result property="auditablePropertiesEntity.auditCreator" column="audit_creator" jdbcType="VARCHAR" javaType="java.lang.String"/>
<result property="auditablePropertiesEntity.auditCreated" column="audit_created" jdbcType="VARCHAR" javaType="java.lang.String"/>
<result property="auditablePropertiesEntity.auditModifier" column="audit_modifier" jdbcType="VARCHAR" javaType="java.lang.String"/>
<result property="auditablePropertiesEntity.auditModified" column="audit_modified" jdbcType="VARCHAR" javaType="java.lang.String"/>
<result property="auditablePropertiesEntity.auditAccessed" column="audit_accessed" jdbcType="VARCHAR" javaType="java.lang.String"/>
<result property="prop1.nodeId" column="prop1_node_id" jdbcType="BIGINT" javaType="java.lang.Long"/> <result property="prop1.nodeId" column="prop1_node_id" jdbcType="BIGINT" javaType="java.lang.Long"/>
<result property="prop1.key.qnameId" column="prop1_qname_id" jdbcType="BIGINT" javaType="java.lang.Long"/> <result property="prop1.key.qnameId" column="prop1_qname_id" jdbcType="BIGINT" javaType="java.lang.Long"/>
@@ -170,7 +178,8 @@
<result property="prop3.value.doubleValue" column="prop3_double_value" jdbcType="FLOAT" javaType="java.lang.Double"/> <result property="prop3.value.doubleValue" column="prop3_double_value" jdbcType="FLOAT" javaType="java.lang.Double"/>
<result property="prop3.value.stringValue" column="prop3_string_value" jdbcType="VARCHAR" javaType="java.lang.String"/> <result property="prop3.value.stringValue" column="prop3_string_value" jdbcType="VARCHAR" javaType="java.lang.String"/>
<association property="node" resultMap="alfresco.node.result_Node"/> <result property="storeProtocol" column="protocol" jdbcType="VARCHAR" javaType="java.lang.String"/>
<result property="storeIdentifier" column="identifier" jdbcType="VARCHAR" javaType="java.lang.String"/>
</resultMap> </resultMap>
@@ -782,25 +791,6 @@
<if test="ordered == true">order by node.id ASC</if> <if test="ordered == true">order by node.id ASC</if>
</select> </select>
<select id="select_NodesWithAspectIds_Limited" parameterType="Ids" resultMap="result_NodeRef" >
select
node.id as id,
store.protocol as protocol,
store.identifier as identifier,
node.uuid as uuid
from
alf_node_aspects na
join alf_node node on (na.node_id = node.id)
left join alf_store store on (store.id = node.store_id)
where
<![CDATA[na.node_id >= #{idOne}]]>
<if test="idTwo != null"><![CDATA[and na.node_id < #{idTwo}]]></if>
and na.qname_id in
<foreach item="item" index="i" collection="ids" open="(" separator="," close=")">#{item}</foreach>
<if test="ordered == true">order by node.id ASC</if>
<if test="maxResults != null"><![CDATA[limit #{maxResults}]]></if>
</select>
<!-- Common results for result_NodeAssoc --> <!-- Common results for result_NodeAssoc -->
<sql id="select_NodeAssoc_Results"> <sql id="select_NodeAssoc_Results">
select select
@@ -991,8 +981,8 @@
</select> </select>
<!-- GetChildren - with explicit prop filtering and/or sorting --> <!-- GetChildren - with explicit prop filtering and/or sorting -->
<select id="select_GetChildrenCannedQueryWithProps" parameterType="FilterSortNode" resultMap="result_FilterSortNode"> <select id="select_GetChildrenCannedQueryWithProps" parameterType="FilterSortNode" resultMap="result_FilterSortNode" flushCache="true">
select select distinct
childNode.id as id, childNode.id as id,
childNode.version as version, childNode.version as version,
childStore.id as store_id, childStore.id as store_id,
@@ -1008,7 +998,7 @@
childNode.audit_created as audit_created, childNode.audit_created as audit_created,
childNode.audit_modifier as audit_modifier, childNode.audit_modifier as audit_modifier,
childNode.audit_modified as audit_modified, childNode.audit_modified as audit_modified,
childNode.audit_accessed as audit_accessed childNode.audit_accessed as audit_accessed
<if test="prop1qnameId != null"> <if test="prop1qnameId != null">
, prop1.node_id as prop1_node_id, , prop1.node_id as prop1_node_id,
prop1.qname_id as prop1_qname_id, prop1.qname_id as prop1_qname_id,
@@ -1086,9 +1076,6 @@
#{item} #{item}
</foreach> </foreach>
</if> </if>
<if test="prop1qnameId == null and auditableProps == false">
<include refid="alfresco.node.select_ChildAssoc_OrderBy"/>
</if>
</select> </select>
<!-- GetChildren - with no explicit sorting (or prop filtering) - note: still filtered by child type (and optionally primary or secondary) --> <!-- GetChildren - with no explicit sorting (or prop filtering) - note: still filtered by child type (and optionally primary or secondary) -->

View File

@@ -30,4 +30,23 @@
<![CDATA[and commit_time_ms <= #{maxCommitTime}]]> <![CDATA[and commit_time_ms <= #{maxCommitTime}]]>
</select> </select>
<select id="select_NodesWithAspectIds_Limited" parameterType="Ids" resultMap="alfresco.node.result_NodeRef" >
select
node.id as id,
store.protocol as protocol,
store.identifier as identifier,
node.uuid as uuid
from
alf_node_aspects na
join alf_node node on (na.node_id = node.id)
left join alf_store store on (store.id = node.store_id)
where
<![CDATA[na.node_id >= #{idOne}]]>
<if test="idTwo != null"><![CDATA[and na.node_id < #{idTwo}]]></if>
and na.qname_id in
<foreach item="item" index="i" collection="ids" open="(" separator="," close=")">#{item}</foreach>
<if test="ordered == true">order by node.id ASC</if>
<if test="maxResults != null"><![CDATA[limit #{maxResults}]]></if>
</select>
</mapper> </mapper>

View File

@@ -30,4 +30,23 @@
<![CDATA[and commit_time_ms <= #{maxCommitTime}]]> <![CDATA[and commit_time_ms <= #{maxCommitTime}]]>
</select> </select>
<select id="select_NodesWithAspectIds_Limited" parameterType="Ids" resultMap="alfresco.node.result_NodeRef" >
select
node.id as id,
store.protocol as protocol,
store.identifier as identifier,
node.uuid as uuid
from
alf_node_aspects na
join alf_node node on (na.node_id = node.id)
left join alf_store store on (store.id = node.store_id)
where
<![CDATA[na.node_id >= #{idOne}]]>
<if test="idTwo != null"><![CDATA[and na.node_id < #{idTwo}]]></if>
and na.qname_id in
<foreach item="item" index="i" collection="ids" open="(" separator="," close=")">#{item}</foreach>
<if test="ordered == true">order by node.id ASC</if>
<if test="maxResults != null"><![CDATA[limit #{maxResults}]]></if>
</select>
</mapper> </mapper>