mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-11-12 15:39:46 +00:00
Compare commits
44 Commits
9.2
...
dev-dhrn-t
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c9bce5170d | ||
|
|
9bd54efc10 | ||
|
|
3c81ec949e | ||
|
|
53704a2c58 | ||
|
|
b4455f7d60 | ||
|
|
0617fbb0bf | ||
|
|
f748334f1e | ||
|
|
08748e8af5 | ||
|
|
ce62fb1da3 | ||
|
|
34f360211f | ||
|
|
b559e78827 | ||
|
|
1add8a0f08 | ||
|
|
5eb8767f4c | ||
|
|
7fb3386413 | ||
|
|
22945a30ea | ||
|
|
fc531f64ed | ||
|
|
98090ac48c | ||
|
|
33b64f483d | ||
|
|
5e2d939f4e | ||
|
|
26dbcd3e79 | ||
|
|
8ec9fa5f5e | ||
|
|
578becd586 | ||
|
|
1f6774f2ef | ||
|
|
9ff5f3b843 | ||
|
|
9e3bb59067 | ||
|
|
db47063830 | ||
|
|
562479bde4 | ||
|
|
e738e0a0fb | ||
|
|
eb703c19aa | ||
|
|
b772205539 | ||
|
|
b9c6b59129 | ||
|
|
cf7ce72209 | ||
|
|
7a58014c32 | ||
|
|
e964aab211 | ||
|
|
2d3cac3c27 | ||
|
|
3a495f7b3f | ||
|
|
949e257f19 | ||
|
|
dfb34140ac | ||
|
|
c1f78b1a17 | ||
|
|
8b70483aa0 | ||
|
|
3ebeac2eb4 | ||
|
|
d91a552925 | ||
|
|
8c91145b39 | ||
|
|
86fcf67016 |
@@ -25,10 +25,6 @@
|
|||||||
<url>https://artifacts.alfresco.com/nexus/content/groups/public</url>
|
<url>https://artifacts.alfresco.com/nexus/content/groups/public</url>
|
||||||
</pluginRepository>
|
</pluginRepository>
|
||||||
</pluginRepositories>
|
</pluginRepositories>
|
||||||
<properties>
|
|
||||||
<!-- WhiteSource token -->
|
|
||||||
<org.whitesource.orgToken>${env.WHITESOURCE_API_KEY}</org.whitesource.orgToken>
|
|
||||||
</properties>
|
|
||||||
</profile>
|
</profile>
|
||||||
</profiles>
|
</profiles>
|
||||||
|
|
||||||
|
|||||||
@@ -177,6 +177,11 @@ jobs:
|
|||||||
- docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.16.1
|
- docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.16.1
|
||||||
script: travis_wait 20 mvn -B test -pl repository -Dtest=AllDBTestsTestSuite -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
|
script: travis_wait 20 mvn -B test -pl repository -Dtest=AllDBTestsTestSuite -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
|
||||||
|
|
||||||
|
- name: "Repository - Messaging tests"
|
||||||
|
before_script:
|
||||||
|
- docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.16.1
|
||||||
|
script: travis_wait 20 mvn -B test -pl repository -Dtest=CamelRoutesTest,CamelComponentsTest
|
||||||
|
|
||||||
- name: "Remote-api - AppContext01TestSuite"
|
- name: "Remote-api - AppContext01TestSuite"
|
||||||
before_script:
|
before_script:
|
||||||
- docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:13.1 postgres -c 'max_connections=300'
|
- docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:13.1 postgres -c 'max_connections=300'
|
||||||
|
|||||||
@@ -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>9.2</version>
|
<version>11.5-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
|||||||
@@ -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>9.2</version>
|
<version>11.5-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
@@ -167,7 +167,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.fasterxml.woodstox</groupId>
|
<groupId>com.fasterxml.woodstox</groupId>
|
||||||
<artifactId>woodstox-core</artifactId>
|
<artifactId>woodstox-core</artifactId>
|
||||||
<version>6.2.4</version>
|
<version>6.2.5</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- the cxf libs were updated, see dependencyManagement section -->
|
<!-- the cxf libs were updated, see dependencyManagement section -->
|
||||||
|
|||||||
@@ -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>9.2</version>
|
<version>11.5-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@@ -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>9.2</version>
|
<version>11.5-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
|
|||||||
@@ -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>9.2</version>
|
<version>11.5-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<profiles>
|
<profiles>
|
||||||
|
|||||||
@@ -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>9.2</version>
|
<version>11.5-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<modules>
|
<modules>
|
||||||
|
|||||||
@@ -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>9.2</version>
|
<version>11.5-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<developers>
|
<developers>
|
||||||
|
|||||||
@@ -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>9.2</version>
|
<version>11.5-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<developers>
|
<developers>
|
||||||
|
|||||||
@@ -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>9.2</version>
|
<version>11.5-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<developers>
|
<developers>
|
||||||
|
|||||||
@@ -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>9.2</version>
|
<version>11.5-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<developers>
|
<developers>
|
||||||
|
|||||||
@@ -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>9.2</version>
|
<version>11.5-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<developers>
|
<developers>
|
||||||
|
|||||||
@@ -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>9.2</version>
|
<version>11.5-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
|
|||||||
28
pom.xml
28
pom.xml
@@ -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>9.2</version>
|
<version>11.5-SNAPSHOT</version>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
<name>Alfresco Community Repo Parent</name>
|
<name>Alfresco Community Repo Parent</name>
|
||||||
|
|
||||||
@@ -22,8 +22,8 @@
|
|||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<acs.version.major>7</acs.version.major>
|
<acs.version.major>7</acs.version.major>
|
||||||
<acs.version.minor>0</acs.version.minor>
|
<acs.version.minor>1</acs.version.minor>
|
||||||
<acs.version.revision>1</acs.version.revision>
|
<acs.version.revision>0</acs.version.revision>
|
||||||
<acs.version.label />
|
<acs.version.label />
|
||||||
|
|
||||||
<version.edition>Community</version.edition>
|
<version.edition>Community</version.edition>
|
||||||
@@ -55,14 +55,14 @@
|
|||||||
|
|
||||||
<dependency.spring.version>5.3.3</dependency.spring.version>
|
<dependency.spring.version>5.3.3</dependency.spring.version>
|
||||||
<dependency.antlr.version>3.5.2</dependency.antlr.version>
|
<dependency.antlr.version>3.5.2</dependency.antlr.version>
|
||||||
<dependency.jackson.version>2.12.1</dependency.jackson.version>
|
<dependency.jackson.version>2.12.2</dependency.jackson.version>
|
||||||
<dependency.jackson-databind.version>${dependency.jackson.version}</dependency.jackson-databind.version>
|
<dependency.jackson-databind.version>${dependency.jackson.version}</dependency.jackson-databind.version>
|
||||||
<dependency.cxf.version>3.4.2</dependency.cxf.version>
|
<dependency.cxf.version>3.4.3</dependency.cxf.version>
|
||||||
<dependency.opencmis.version>1.0.0</dependency.opencmis.version>
|
<dependency.opencmis.version>1.0.0</dependency.opencmis.version>
|
||||||
<dependency.webscripts.version>8.18</dependency.webscripts.version>
|
<dependency.webscripts.version>8.18</dependency.webscripts.version>
|
||||||
<dependency.bouncycastle.version>1.68</dependency.bouncycastle.version>
|
<dependency.bouncycastle.version>1.68</dependency.bouncycastle.version>
|
||||||
<dependency.mockito-core.version>3.8.0</dependency.mockito-core.version>
|
<dependency.mockito-core.version>3.8.0</dependency.mockito-core.version>
|
||||||
<dependency.org-json.version>20201115</dependency.org-json.version>
|
<dependency.org-json.version>20210307</dependency.org-json.version>
|
||||||
<dependency.commons-dbcp.version>1.4-DBCP330</dependency.commons-dbcp.version>
|
<dependency.commons-dbcp.version>1.4-DBCP330</dependency.commons-dbcp.version>
|
||||||
<dependency.commons-io.version>2.8.0</dependency.commons-io.version>
|
<dependency.commons-io.version>2.8.0</dependency.commons-io.version>
|
||||||
<dependency.gson.version>2.8.5</dependency.gson.version>
|
<dependency.gson.version>2.8.5</dependency.gson.version>
|
||||||
@@ -73,14 +73,14 @@
|
|||||||
<dependency.slf4j.version>1.7.30</dependency.slf4j.version>
|
<dependency.slf4j.version>1.7.30</dependency.slf4j.version>
|
||||||
<dependency.gytheio.version>0.12</dependency.gytheio.version>
|
<dependency.gytheio.version>0.12</dependency.gytheio.version>
|
||||||
<dependency.groovy.version>2.5.9</dependency.groovy.version>
|
<dependency.groovy.version>2.5.9</dependency.groovy.version>
|
||||||
<dependency.tika.version>1.25</dependency.tika.version>
|
<dependency.tika.version>1.26</dependency.tika.version>
|
||||||
<dependency.spring-security.version>5.4.1</dependency.spring-security.version>
|
<dependency.spring-security.version>5.4.1</dependency.spring-security.version>
|
||||||
<dependency.truezip.version>7.7.10</dependency.truezip.version>
|
<dependency.truezip.version>7.7.10</dependency.truezip.version>
|
||||||
<dependency.poi.version>4.1.2</dependency.poi.version>
|
<dependency.poi.version>4.1.2</dependency.poi.version>
|
||||||
<dependency.ooxml-schemas.version>1.4</dependency.ooxml-schemas.version>
|
<dependency.ooxml-schemas.version>1.4</dependency.ooxml-schemas.version>
|
||||||
<dependency.keycloak.version>11.0.0-alfresco-001</dependency.keycloak.version>
|
<dependency.keycloak.version>11.0.0-alfresco-001</dependency.keycloak.version>
|
||||||
<dependency.jboss.logging.version>3.4.1.Final</dependency.jboss.logging.version>
|
<dependency.jboss.logging.version>3.4.1.Final</dependency.jboss.logging.version>
|
||||||
<dependency.camel.version>3.7.0</dependency.camel.version>
|
<dependency.camel.version>3.7.1</dependency.camel.version>
|
||||||
<dependency.activemq.version>5.16.1</dependency.activemq.version>
|
<dependency.activemq.version>5.16.1</dependency.activemq.version>
|
||||||
<dependency.apache.taglibs.version>1.2.5</dependency.apache.taglibs.version>
|
<dependency.apache.taglibs.version>1.2.5</dependency.apache.taglibs.version>
|
||||||
<dependency.awaitility.version>4.0.3</dependency.awaitility.version>
|
<dependency.awaitility.version>4.0.3</dependency.awaitility.version>
|
||||||
@@ -102,10 +102,10 @@
|
|||||||
<dependency.postgresql.version>42.2.19</dependency.postgresql.version>
|
<dependency.postgresql.version>42.2.19</dependency.postgresql.version>
|
||||||
<dependency.mysql.version>8.0.23</dependency.mysql.version>
|
<dependency.mysql.version>8.0.23</dependency.mysql.version>
|
||||||
<dependency.mariadb.version>2.7.2</dependency.mariadb.version>
|
<dependency.mariadb.version>2.7.2</dependency.mariadb.version>
|
||||||
<dependency.tas-utility.version>3.0.43</dependency.tas-utility.version>
|
<dependency.tas-utility.version>3.0.44</dependency.tas-utility.version>
|
||||||
<dependency.rest-assured.version>3.3.0</dependency.rest-assured.version>
|
<dependency.rest-assured.version>3.3.0</dependency.rest-assured.version>
|
||||||
<dependency.tas-restapi.version>1.56</dependency.tas-restapi.version>
|
<dependency.tas-restapi.version>1.57</dependency.tas-restapi.version>
|
||||||
<dependency.tas-cmis.version>1.27</dependency.tas-cmis.version>
|
<dependency.tas-cmis.version>1.29</dependency.tas-cmis.version>
|
||||||
<dependency.tas-email.version>1.8</dependency.tas-email.version>
|
<dependency.tas-email.version>1.8</dependency.tas-email.version>
|
||||||
<dependency.tas-webdav.version>1.6</dependency.tas-webdav.version>
|
<dependency.tas-webdav.version>1.6</dependency.tas-webdav.version>
|
||||||
<dependency.tas-ftp.version>1.5</dependency.tas-ftp.version>
|
<dependency.tas-ftp.version>1.5</dependency.tas-ftp.version>
|
||||||
@@ -116,7 +116,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>9.2</tag>
|
<tag>HEAD</tag>
|
||||||
</scm>
|
</scm>
|
||||||
|
|
||||||
<distributionManagement>
|
<distributionManagement>
|
||||||
@@ -679,7 +679,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>joda-time</groupId>
|
<groupId>joda-time</groupId>
|
||||||
<artifactId>joda-time</artifactId>
|
<artifactId>joda-time</artifactId>
|
||||||
<version>2.10.9</version>
|
<version>2.10.10</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- provided dependencies -->
|
<!-- provided dependencies -->
|
||||||
@@ -694,7 +694,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>junit</groupId>
|
<groupId>junit</groupId>
|
||||||
<artifactId>junit</artifactId>
|
<artifactId>junit</artifactId>
|
||||||
<version>4.13</version>
|
<version>4.13.1</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@@ -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>9.2</version>
|
<version>11.5-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
|||||||
@@ -25,11 +25,16 @@
|
|||||||
*/
|
*/
|
||||||
package org.alfresco.rest.api.model;
|
package org.alfresco.rest.api.model;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
|
import org.alfresco.rest.api.groups.GroupsEntityResource;
|
||||||
|
import org.alfresco.rest.api.people.PeopleEntityResource;
|
||||||
|
import org.alfresco.rest.framework.resource.EmbeddedEntityResource;
|
||||||
|
import org.alfresco.rest.framework.resource.UniqueId;
|
||||||
|
import org.alfresco.service.cmr.security.AccessStatus;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.alfresco.service.cmr.security.AccessStatus;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Representation of Node Permissions
|
* Representation of Node Permissions
|
||||||
@@ -128,6 +133,18 @@ public class NodePermissions
|
|||||||
return authorityId;
|
return authorityId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EmbeddedEntityResource(propertyName = "person", entityResource = PeopleEntityResource.class)
|
||||||
|
public String getPerson()
|
||||||
|
{
|
||||||
|
return authorityId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@EmbeddedEntityResource(propertyName = "group", entityResource = GroupsEntityResource.class)
|
||||||
|
public String getGroup()
|
||||||
|
{
|
||||||
|
return authorityId;
|
||||||
|
}
|
||||||
|
|
||||||
public String getAccessStatus()
|
public String getAccessStatus()
|
||||||
{
|
{
|
||||||
return accessStatus;
|
return accessStatus;
|
||||||
|
|||||||
@@ -4,31 +4,71 @@
|
|||||||
|
|
||||||
<#macro dateFormat date>${date?string("dd MMM yyyy HH:mm:ss 'GMT'Z '('zzz')'")}</#macro>
|
<#macro dateFormat date>${date?string("dd MMM yyyy HH:mm:ss 'GMT'Z '('zzz')'")}</#macro>
|
||||||
<#macro propValue p>
|
<#macro propValue p>
|
||||||
<#if p.value??>
|
<#attempt>
|
||||||
<#if p.value?is_date>
|
<#if p.value??>
|
||||||
<@dateFormat p.value />
|
<#if p.value?is_date>
|
||||||
<#elseif p.value?is_boolean>
|
<@dateFormat p.value />
|
||||||
${p.value?string}
|
<#elseif p.value?is_boolean>
|
||||||
<#elseif p.value?is_number>
|
${p.value?string}
|
||||||
${p.value?c}
|
<#elseif p.value?is_number>
|
||||||
<#elseif p.value?is_string>
|
${p.value?c}
|
||||||
${p.value?html}
|
<#elseif p.value?is_string>
|
||||||
<#elseif p.value?is_hash>
|
${p.value?html}
|
||||||
<#assign result = "{"/>
|
<#elseif p.value?is_hash || p.value?is_enumerable>
|
||||||
<#assign first = true />
|
<@convertToJSON p.value />
|
||||||
<#list p.value?keys as key>
|
</#if>
|
||||||
<#if first = false>
|
<#else>
|
||||||
<#assign result = result + ", "/>
|
${null}
|
||||||
|
</#if>
|
||||||
|
<#recover>
|
||||||
|
<span style="color:red">${.error}</span>
|
||||||
|
</#attempt>
|
||||||
|
</#macro>
|
||||||
|
<#macro convertToJSON v>
|
||||||
|
<#attempt>
|
||||||
|
<#if v??>
|
||||||
|
<#if v?is_date>
|
||||||
|
<@dateFormat v />
|
||||||
|
<#elseif v?is_boolean>
|
||||||
|
${v?string}
|
||||||
|
<#elseif v?is_number>
|
||||||
|
${v?c}
|
||||||
|
<#elseif v?is_string>
|
||||||
|
"${v?string}"
|
||||||
|
<#elseif v?is_hash>
|
||||||
|
<@compress single_line=true>
|
||||||
|
{
|
||||||
|
<#assign first = true />
|
||||||
|
<#list v?keys as key>
|
||||||
|
<#if first = false>,</#if>
|
||||||
|
"${key}":
|
||||||
|
<#if v[key]??>
|
||||||
|
<@convertToJSON v[key] />
|
||||||
|
<#else>
|
||||||
|
${null}
|
||||||
|
</#if>
|
||||||
|
<#assign first = false/>
|
||||||
|
</#list>
|
||||||
|
}
|
||||||
|
</@compress>
|
||||||
|
<#elseif v?is_enumerable>
|
||||||
|
<#assign first = true />
|
||||||
|
<@compress single_line=true>
|
||||||
|
[
|
||||||
|
<#list v as item>
|
||||||
|
<#if first = false>,</#if>
|
||||||
|
<@convertToJSON item />
|
||||||
|
<#assign first = false/>
|
||||||
|
</#list>
|
||||||
|
]
|
||||||
|
</@compress>
|
||||||
</#if>
|
</#if>
|
||||||
<#assign result = result + "${key}=${p.value[key]?html}" />
|
<#else>
|
||||||
<#assign first = false/>
|
${null}
|
||||||
</#list>
|
</#if>
|
||||||
<#assign result = result + "}"/>
|
<#recover>
|
||||||
${result}
|
<span style="color:red">${.error}</span>
|
||||||
</#if>
|
</#attempt>
|
||||||
<#else>
|
|
||||||
${null}
|
|
||||||
</#if>
|
|
||||||
</#macro>
|
</#macro>
|
||||||
<#macro contentUrl nodeRef prop>
|
<#macro contentUrl nodeRef prop>
|
||||||
${url.serviceContext}/api/node/${nodeRef?replace("://","/")}/content;${prop?url}
|
${url.serviceContext}/api/node/${nodeRef?replace("://","/")}/content;${prop?url}
|
||||||
|
|||||||
@@ -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>9.2</version>
|
<version>11.5-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
@@ -82,7 +82,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.commons</groupId>
|
<groupId>org.apache.commons</groupId>
|
||||||
<artifactId>commons-lang3</artifactId>
|
<artifactId>commons-lang3</artifactId>
|
||||||
<version>3.11</version>
|
<version>3.12.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>commons-codec</groupId>
|
<groupId>commons-codec</groupId>
|
||||||
@@ -191,7 +191,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.maven</groupId>
|
<groupId>org.apache.maven</groupId>
|
||||||
<artifactId>maven-artifact</artifactId>
|
<artifactId>maven-artifact</artifactId>
|
||||||
<version>3.6.3</version>
|
<version>3.8.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>de.schlichtherle.truezip</groupId>
|
<groupId>de.schlichtherle.truezip</groupId>
|
||||||
@@ -383,7 +383,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.fasterxml.woodstox</groupId>
|
<groupId>com.fasterxml.woodstox</groupId>
|
||||||
<artifactId>woodstox-core</artifactId>
|
<artifactId>woodstox-core</artifactId>
|
||||||
<version>6.2.4</version>
|
<version>6.2.5</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- GData -->
|
<!-- GData -->
|
||||||
@@ -810,7 +810,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>commons-net</groupId>
|
<groupId>commons-net</groupId>
|
||||||
<artifactId>commons-net</artifactId>
|
<artifactId>commons-net</artifactId>
|
||||||
<version>3.7.2</version>
|
<version>3.8.0</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ public class IdsEntity
|
|||||||
private Long idThree;
|
private Long idThree;
|
||||||
private Long idFour;
|
private Long idFour;
|
||||||
private List<Long> ids;
|
private List<Long> ids;
|
||||||
|
private boolean ordered;
|
||||||
public Long getIdOne()
|
public Long getIdOne()
|
||||||
{
|
{
|
||||||
return idOne;
|
return idOne;
|
||||||
@@ -80,4 +81,12 @@ public class IdsEntity
|
|||||||
{
|
{
|
||||||
this.ids = ids;
|
this.ids = ids;
|
||||||
}
|
}
|
||||||
|
public boolean isOrdered()
|
||||||
|
{
|
||||||
|
return ordered;
|
||||||
|
}
|
||||||
|
public void setOrdered(boolean ordered)
|
||||||
|
{
|
||||||
|
this.ordered = ordered;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2756,6 +2756,22 @@ public abstract class AbstractNodeDAOImpl implements NodeDAO, BatchingDAO
|
|||||||
selectNodesWithAspects(qnameIds, minNodeId, maxNodeId, resultsCallback);
|
selectNodesWithAspects(qnameIds, minNodeId, maxNodeId, resultsCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void getNodesWithAspects(
|
||||||
|
Set<QName> aspectQNames,
|
||||||
|
Long minNodeId, Long maxNodeId, boolean ordered,
|
||||||
|
NodeRefQueryCallback resultsCallback)
|
||||||
|
{
|
||||||
|
Set<Long> qnameIdsSet = qnameDAO.convertQNamesToIds(aspectQNames, false);
|
||||||
|
if (qnameIdsSet.size() == 0)
|
||||||
|
{
|
||||||
|
// No point running a query
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
List<Long> qnameIds = new ArrayList<Long>(qnameIdsSet);
|
||||||
|
selectNodesWithAspects(qnameIds, minNodeId, maxNodeId, ordered, resultsCallback);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Returns a writable copy of the cached aspects set
|
* @return Returns a writable copy of the cached aspects set
|
||||||
*/
|
*/
|
||||||
@@ -4927,6 +4943,10 @@ public abstract class AbstractNodeDAOImpl implements NodeDAO, BatchingDAO
|
|||||||
List<Long> qnameIds,
|
List<Long> qnameIds,
|
||||||
Long minNodeId, Long maxNodeId,
|
Long minNodeId, Long maxNodeId,
|
||||||
NodeRefQueryCallback resultsCallback);
|
NodeRefQueryCallback resultsCallback);
|
||||||
|
protected abstract void selectNodesWithAspects(
|
||||||
|
List<Long> qnameIds,
|
||||||
|
Long minNodeId, Long maxNodeId, boolean ordered,
|
||||||
|
NodeRefQueryCallback resultsCallback);
|
||||||
protected abstract Long insertNodeAssoc(Long sourceNodeId, Long targetNodeId, Long assocTypeQNameId, int assocIndex);
|
protected abstract Long insertNodeAssoc(Long sourceNodeId, Long targetNodeId, Long assocTypeQNameId, int assocIndex);
|
||||||
protected abstract int updateNodeAssoc(Long id, int assocIndex);
|
protected abstract int updateNodeAssoc(Long id, int assocIndex);
|
||||||
protected abstract int deleteNodeAssoc(Long sourceNodeId, Long targetNodeId, Long assocTypeQNameId);
|
protected abstract int deleteNodeAssoc(Long sourceNodeId, Long targetNodeId, Long assocTypeQNameId);
|
||||||
|
|||||||
@@ -405,6 +405,20 @@ public interface NodeDAO extends NodeBulkLoader
|
|||||||
Long minNodeId, Long maxNodeId,
|
Long minNodeId, Long maxNodeId,
|
||||||
NodeRefQueryCallback resultsCallback);
|
NodeRefQueryCallback resultsCallback);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get nodes with aspects between the given ranges, ordering the results optionally
|
||||||
|
*
|
||||||
|
* @param aspectQNames the aspects that must be on the nodes
|
||||||
|
* @param minNodeId the minimum node ID (inclusive)
|
||||||
|
* @param maxNodeId the maximum node ID (exclusive)
|
||||||
|
* @param ordered if the results are to be ordered by nodeID
|
||||||
|
* @param resultsCallback callback to process results
|
||||||
|
*/
|
||||||
|
public void getNodesWithAspects(
|
||||||
|
Set<QName> aspectQNames,
|
||||||
|
Long minNodeId, Long maxNodeId, boolean ordered,
|
||||||
|
NodeRefQueryCallback resultsCallback);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Node Assocs
|
* Node Assocs
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -764,6 +764,31 @@ public class NodeDAOImpl extends AbstractNodeDAOImpl
|
|||||||
template.select(SELECT_NODES_WITH_ASPECT_IDS, parameters, resultHandler);
|
template.select(SELECT_NODES_WITH_ASPECT_IDS, parameters, resultHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void selectNodesWithAspects(
|
||||||
|
List<Long> qnameIds,
|
||||||
|
Long minNodeId, Long maxNodeId, boolean ordered,
|
||||||
|
final NodeRefQueryCallback resultsCallback)
|
||||||
|
{
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
|
ResultHandler resultHandler = new ResultHandler()
|
||||||
|
{
|
||||||
|
public void handleResult(ResultContext context)
|
||||||
|
{
|
||||||
|
NodeEntity entity = (NodeEntity) context.getResultObject();
|
||||||
|
Pair<Long, NodeRef> nodePair = new Pair<Long, NodeRef>(entity.getId(), entity.getNodeRef());
|
||||||
|
resultsCallback.handle(nodePair);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
IdsEntity parameters = new IdsEntity();
|
||||||
|
parameters.setIdOne(minNodeId);
|
||||||
|
parameters.setIdTwo(maxNodeId);
|
||||||
|
parameters.setIds(qnameIds);
|
||||||
|
parameters.setOrdered(ordered);
|
||||||
|
template.select(SELECT_NODES_WITH_ASPECT_IDS, parameters, resultHandler);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Long insertNodeAssoc(Long sourceNodeId, Long targetNodeId, Long assocTypeQNameId, int assocIndex)
|
protected Long insertNodeAssoc(Long sourceNodeId, Long targetNodeId, Long assocTypeQNameId, int assocIndex)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -35,6 +35,8 @@ import java.util.List;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
|
||||||
import org.alfresco.model.ContentModel;
|
import org.alfresco.model.ContentModel;
|
||||||
import org.alfresco.repo.batch.BatchProcessWorkProvider;
|
import org.alfresco.repo.batch.BatchProcessWorkProvider;
|
||||||
import org.alfresco.repo.batch.BatchProcessor;
|
import org.alfresco.repo.batch.BatchProcessor;
|
||||||
@@ -83,13 +85,16 @@ public class FixedAclUpdater extends TransactionListenerAdapter implements Appli
|
|||||||
|
|
||||||
public static final String FIXED_ACL_ASYNC_REQUIRED_KEY = "FIXED_ACL_ASYNC_REQUIRED";
|
public static final String FIXED_ACL_ASYNC_REQUIRED_KEY = "FIXED_ACL_ASYNC_REQUIRED";
|
||||||
public static final String FIXED_ACL_ASYNC_CALL_KEY = "FIXED_ACL_ASYNC_CALL";
|
public static final String FIXED_ACL_ASYNC_CALL_KEY = "FIXED_ACL_ASYNC_CALL";
|
||||||
|
protected static final QName LOCK_Q_NAME = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "FixedAclUpdater");
|
||||||
|
|
||||||
|
/** A set of listeners to receive callback events whenever permissions are updated by this class. */
|
||||||
|
private static Set<FixedAclUpdaterListener> listeners = Sets.newConcurrentHashSet();
|
||||||
|
|
||||||
private ApplicationContext applicationContext;
|
private ApplicationContext applicationContext;
|
||||||
private JobLockService jobLockService;
|
private JobLockService jobLockService;
|
||||||
private TransactionService transactionService;
|
private TransactionService transactionService;
|
||||||
private AccessControlListDAO accessControlListDAO;
|
private AccessControlListDAO accessControlListDAO;
|
||||||
private NodeDAO nodeDAO;
|
private NodeDAO nodeDAO;
|
||||||
private QName lockQName = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "FixedAclUpdater");
|
|
||||||
private long lockTimeToLive = 10000;
|
private long lockTimeToLive = 10000;
|
||||||
private long lockRefreshTime = lockTimeToLive / 2;
|
private long lockRefreshTime = lockTimeToLive / 2;
|
||||||
|
|
||||||
@@ -158,6 +163,12 @@ public class FixedAclUpdater extends TransactionListenerAdapter implements Appli
|
|||||||
this.policyIgnoreUtil = policyIgnoreUtil;
|
this.policyIgnoreUtil = policyIgnoreUtil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Register a {@link FixedAclUpdaterListener} to be notified when a node is updated by an instance of this class. */
|
||||||
|
public static void registerListener(FixedAclUpdaterListener listener)
|
||||||
|
{
|
||||||
|
listeners.add(listener);
|
||||||
|
}
|
||||||
|
|
||||||
public void init()
|
public void init()
|
||||||
{
|
{
|
||||||
onInheritPermissionsDisabledDelegate = policyComponent
|
onInheritPermissionsDisabledDelegate = policyComponent
|
||||||
@@ -192,7 +203,7 @@ public class FixedAclUpdater extends TransactionListenerAdapter implements Appli
|
|||||||
public List<NodeRef> execute() throws Throwable
|
public List<NodeRef> execute() throws Throwable
|
||||||
{
|
{
|
||||||
getNodesCallback.init();
|
getNodesCallback.init();
|
||||||
nodeDAO.getNodesWithAspects(aspects, getNodesCallback.getMinNodeId(), null, getNodesCallback);
|
nodeDAO.getNodesWithAspects(aspects, getNodesCallback.getMinNodeId(), null, true, getNodesCallback);
|
||||||
getNodesCallback.done();
|
getNodesCallback.done();
|
||||||
|
|
||||||
return getNodesCallback.getNodes();
|
return getNodesCallback.getNodes();
|
||||||
@@ -241,7 +252,7 @@ public class FixedAclUpdater extends TransactionListenerAdapter implements Appli
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class AclWorker implements BatchProcessor.BatchProcessWorker<NodeRef>
|
protected class AclWorker implements BatchProcessor.BatchProcessWorker<NodeRef>
|
||||||
{
|
{
|
||||||
private Set<QName> aspects = new HashSet<>(1);
|
private Set<QName> aspects = new HashSet<>(1);
|
||||||
|
|
||||||
@@ -315,6 +326,8 @@ public class FixedAclUpdater extends TransactionListenerAdapter implements Appli
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
listeners.forEach(listener -> listener.permissionsUpdatedAsynchronously(nodeRef));
|
||||||
|
|
||||||
if (log.isDebugEnabled())
|
if (log.isDebugEnabled())
|
||||||
{
|
{
|
||||||
log.debug(String.format("Node processed %s", nodeRef));
|
log.debug(String.format("Node processed %s", nodeRef));
|
||||||
@@ -330,7 +343,13 @@ public class FixedAclUpdater extends TransactionListenerAdapter implements Appli
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
private class GetNodesWithAspectCallback implements NodeRefQueryCallback
|
/** Create a new AclWorker. */
|
||||||
|
protected AclWorker createAclWorker()
|
||||||
|
{
|
||||||
|
return new AclWorker();
|
||||||
|
}
|
||||||
|
|
||||||
|
class GetNodesWithAspectCallback implements NodeRefQueryCallback
|
||||||
{
|
{
|
||||||
private List<NodeRef> nodes = new ArrayList<>();
|
private List<NodeRef> nodes = new ArrayList<>();
|
||||||
private long minNodeId;
|
private long minNodeId;
|
||||||
@@ -421,11 +440,11 @@ public class FixedAclUpdater extends TransactionListenerAdapter implements Appli
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
lockToken = jobLockService.getLock(lockQName, lockTimeToLive, 0, 1);
|
lockToken = jobLockService.getLock(LOCK_Q_NAME, lockTimeToLive, 0, 1);
|
||||||
jobLockService.refreshLock(lockToken, lockQName, lockRefreshTime, jobLockRefreshCallback);
|
jobLockService.refreshLock(lockToken, LOCK_Q_NAME, lockRefreshTime, jobLockRefreshCallback);
|
||||||
|
|
||||||
AclWorkProvider provider = new AclWorkProvider();
|
AclWorkProvider provider = new AclWorkProvider();
|
||||||
AclWorker worker = new AclWorker();
|
AclWorker worker = createAclWorker();
|
||||||
BatchProcessor<NodeRef> bp = new BatchProcessor<>("FixedAclUpdater",
|
BatchProcessor<NodeRef> bp = new BatchProcessor<>("FixedAclUpdater",
|
||||||
transactionService.getRetryingTransactionHelper(), provider, numThreads, maxItemBatchSize, applicationContext,
|
transactionService.getRetryingTransactionHelper(), provider, numThreads, maxItemBatchSize, applicationContext,
|
||||||
log, 100);
|
log, 100);
|
||||||
@@ -442,7 +461,7 @@ public class FixedAclUpdater extends TransactionListenerAdapter implements Appli
|
|||||||
jobLockRefreshCallback.isActive.set(false);
|
jobLockRefreshCallback.isActive.set(false);
|
||||||
if (lockToken != null)
|
if (lockToken != null)
|
||||||
{
|
{
|
||||||
jobLockService.releaseLock(lockToken, lockQName);
|
jobLockService.releaseLock(lockToken, LOCK_Q_NAME);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* #%L
|
||||||
|
* Alfresco Repository
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||||
|
* %%
|
||||||
|
* This file is part of the Alfresco software.
|
||||||
|
* If the software was purchased under a paid Alfresco license, the terms of
|
||||||
|
* the paid license agreement will prevail. Otherwise, the software is
|
||||||
|
* provided under the following open source license terms:
|
||||||
|
*
|
||||||
|
* Alfresco is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Alfresco is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
|
package org.alfresco.repo.domain.permissions;
|
||||||
|
|
||||||
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
|
|
||||||
|
/** Listener to receive callback events when permissions are asynchronously updated with the {@link FixedAclUpdater}. */
|
||||||
|
public interface FixedAclUpdaterListener
|
||||||
|
{
|
||||||
|
/** Callback method for when permissions have been updated by the FixedAclUpdater. */
|
||||||
|
void permissionsUpdatedAsynchronously(NodeRef nodeRef);
|
||||||
|
}
|
||||||
@@ -32,7 +32,6 @@ import java.util.Deque;
|
|||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.Executor;
|
|
||||||
|
|
||||||
import org.alfresco.repo.event.v1.model.EventType;
|
import org.alfresco.repo.event.v1.model.EventType;
|
||||||
import org.alfresco.repo.event.v1.model.RepoEvent;
|
import org.alfresco.repo.event.v1.model.RepoEvent;
|
||||||
@@ -96,7 +95,6 @@ public class EventGenerator extends AbstractLifecycleBean implements Initializin
|
|||||||
private PersonService personService;
|
private PersonService personService;
|
||||||
protected NodeResourceHelper nodeResourceHelper;
|
protected NodeResourceHelper nodeResourceHelper;
|
||||||
|
|
||||||
private Executor threadPoolExecutor;
|
|
||||||
private NodeTypeFilter nodeTypeFilter;
|
private NodeTypeFilter nodeTypeFilter;
|
||||||
private ChildAssociationTypeFilter childAssociationTypeFilter;
|
private ChildAssociationTypeFilter childAssociationTypeFilter;
|
||||||
private EventUserFilter userFilter;
|
private EventUserFilter userFilter;
|
||||||
@@ -115,7 +113,6 @@ public class EventGenerator extends AbstractLifecycleBean implements Initializin
|
|||||||
PropertyCheck.mandatory(this, "transactionService", transactionService);
|
PropertyCheck.mandatory(this, "transactionService", transactionService);
|
||||||
PropertyCheck.mandatory(this, "personService", personService);
|
PropertyCheck.mandatory(this, "personService", personService);
|
||||||
PropertyCheck.mandatory(this, "nodeResourceHelper", nodeResourceHelper);
|
PropertyCheck.mandatory(this, "nodeResourceHelper", nodeResourceHelper);
|
||||||
PropertyCheck.mandatory(this, "threadPoolExecutor", threadPoolExecutor);
|
|
||||||
|
|
||||||
this.nodeTypeFilter = eventFilterRegistry.getNodeTypeFilter();
|
this.nodeTypeFilter = eventFilterRegistry.getNodeTypeFilter();
|
||||||
this.childAssociationTypeFilter = eventFilterRegistry.getChildAssociationTypeFilter();
|
this.childAssociationTypeFilter = eventFilterRegistry.getChildAssociationTypeFilter();
|
||||||
@@ -201,11 +198,6 @@ public class EventGenerator extends AbstractLifecycleBean implements Initializin
|
|||||||
this.nodeResourceHelper = nodeResourceHelper;
|
this.nodeResourceHelper = nodeResourceHelper;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setThreadPoolExecutor(Executor threadPoolExecutor)
|
|
||||||
{
|
|
||||||
this.threadPoolExecutor = threadPoolExecutor;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreateNode(ChildAssociationRef childAssocRef)
|
public void onCreateNode(ChildAssociationRef childAssocRef)
|
||||||
{
|
{
|
||||||
@@ -435,11 +427,6 @@ public class EventGenerator extends AbstractLifecycleBean implements Initializin
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void sendEvent(NodeRef nodeRef, EventConsolidator consolidator)
|
protected void sendEvent(NodeRef nodeRef, EventConsolidator consolidator)
|
||||||
{
|
|
||||||
threadPoolExecutor.execute(()-> sendEventNow(nodeRef, consolidator));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void sendEventNow(NodeRef nodeRef, EventConsolidator consolidator)
|
|
||||||
{
|
{
|
||||||
if (consolidator.isTemporaryNode())
|
if (consolidator.isTemporaryNode())
|
||||||
{
|
{
|
||||||
@@ -481,12 +468,6 @@ public class EventGenerator extends AbstractLifecycleBean implements Initializin
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void sendEvent(ChildAssociationRef childAssociationRef, ChildAssociationEventConsolidator consolidator)
|
protected void sendEvent(ChildAssociationRef childAssociationRef, ChildAssociationEventConsolidator consolidator)
|
||||||
{
|
|
||||||
threadPoolExecutor.execute(()-> sendEventNow(childAssociationRef, consolidator));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void sendEventNow(ChildAssociationRef childAssociationRef,
|
|
||||||
ChildAssociationEventConsolidator consolidator)
|
|
||||||
{
|
{
|
||||||
if (consolidator.isTemporaryChildAssociation())
|
if (consolidator.isTemporaryChildAssociation())
|
||||||
{
|
{
|
||||||
@@ -527,11 +508,6 @@ public class EventGenerator extends AbstractLifecycleBean implements Initializin
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void sendEvent(AssociationRef peerAssociationRef, PeerAssociationEventConsolidator consolidator)
|
protected void sendEvent(AssociationRef peerAssociationRef, PeerAssociationEventConsolidator consolidator)
|
||||||
{
|
|
||||||
threadPoolExecutor.execute(()-> sendEventNow(peerAssociationRef, consolidator));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void sendEventNow(AssociationRef peerAssociationRef, PeerAssociationEventConsolidator consolidator)
|
|
||||||
{
|
{
|
||||||
if (consolidator.isTemporaryPeerAssociation())
|
if (consolidator.isTemporaryPeerAssociation())
|
||||||
{
|
{
|
||||||
@@ -557,7 +533,6 @@ public class EventGenerator extends AbstractLifecycleBean implements Initializin
|
|||||||
LOGGER.trace("List of Events:" + listOfEvents);
|
LOGGER.trace("List of Events:" + listOfEvents);
|
||||||
LOGGER.trace("Sending event:" + event);
|
LOGGER.trace("Sending event:" + event);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Need to execute this in another read txn because Camel expects it
|
// Need to execute this in another read txn because Camel expects it
|
||||||
transactionService.getRetryingTransactionHelper().doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
transactionService.getRetryingTransactionHelper().doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
||||||
event2MessageProducer.send(event);
|
event2MessageProducer.send(event);
|
||||||
|
|||||||
@@ -56,23 +56,5 @@
|
|||||||
|
|
||||||
<bean id="eventGeneratorV2" class="org.alfresco.repo.event2.EventGenerator" parent="baseEventGeneratorV2">
|
<bean id="eventGeneratorV2" class="org.alfresco.repo.event2.EventGenerator" parent="baseEventGeneratorV2">
|
||||||
<property name="nodeResourceHelper" ref="nodeResourceHelper"/>
|
<property name="nodeResourceHelper" ref="nodeResourceHelper"/>
|
||||||
<property name="threadPoolExecutor">
|
|
||||||
<ref bean="eventAsyncThreadPool"/>
|
|
||||||
</property>
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<bean id="eventAsyncThreadPool" class="org.alfresco.util.ThreadPoolExecutorFactoryBean">
|
|
||||||
<property name="poolName">
|
|
||||||
<value>eventAsyncThreadPool</value>
|
|
||||||
</property>
|
|
||||||
<property name="corePoolSize">
|
|
||||||
<value>${repo.event2.threadPool.coreSize}</value>
|
|
||||||
</property>
|
|
||||||
<property name="maximumPoolSize">
|
|
||||||
<value>${repo.event2.threadPool.maximumSize}</value>
|
|
||||||
</property>
|
|
||||||
<property name="threadPriority">
|
|
||||||
<value>${repo.event2.threadPool.priority}</value>
|
|
||||||
</property>
|
|
||||||
</bean>
|
</bean>
|
||||||
</beans>
|
</beans>
|
||||||
|
|||||||
@@ -779,6 +779,7 @@
|
|||||||
<if test="idTwo != null"><![CDATA[and na.node_id < #{idTwo}]]></if>
|
<if test="idTwo != null"><![CDATA[and na.node_id < #{idTwo}]]></if>
|
||||||
and na.qname_id in
|
and na.qname_id in
|
||||||
<foreach item="item" index="i" collection="ids" open="(" separator="," close=")">#{item}</foreach>
|
<foreach item="item" index="i" collection="ids" open="(" separator="," close=")">#{item}</foreach>
|
||||||
|
<if test="ordered == true">order by node.id ASC</if>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<!-- Common results for result_NodeAssoc -->
|
<!-- Common results for result_NodeAssoc -->
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
repository.name=Main Repository
|
repository.name=Main Repository
|
||||||
|
|
||||||
# Schema number
|
# Schema number
|
||||||
version.schema=14100
|
version.schema=15000
|
||||||
|
|
||||||
# Directory configuration
|
# Directory configuration
|
||||||
|
|
||||||
@@ -220,6 +220,8 @@ system.content.deletionFailureAction=IGNORE
|
|||||||
# The CRON expression to trigger the deletion of resources associated with orphaned content.
|
# The CRON expression to trigger the deletion of resources associated with orphaned content.
|
||||||
system.content.orphanCleanup.cronExpression=0 0 4 * * ?
|
system.content.orphanCleanup.cronExpression=0 0 4 * * ?
|
||||||
|
|
||||||
|
# The CRON expression to trigger the cleanup of deleted nodes and dangling transactions that are old enough
|
||||||
|
system.nodeServiceCleanup.cronExpression=0 0 21 * * ?
|
||||||
|
|
||||||
# When transforming archive files (.zip etc) into text representations (such as
|
# When transforming archive files (.zip etc) into text representations (such as
|
||||||
# for full text indexing), should the files within the archive be processed too?
|
# for full text indexing), should the files within the archive be processed too?
|
||||||
@@ -1206,13 +1208,9 @@ repo.event2.filter.nodeAspects=sys:*
|
|||||||
repo.event2.filter.childAssocTypes=rn:rendition
|
repo.event2.filter.childAssocTypes=rn:rendition
|
||||||
# Comma separated list of users which should be excluded
|
# Comma separated list of users which should be excluded
|
||||||
# Note: username's case-sensitivity depends on the {user.name.caseSensitive} setting
|
# Note: username's case-sensitivity depends on the {user.name.caseSensitive} setting
|
||||||
repo.event2.filter.users=System, null
|
repo.event2.filter.users=
|
||||||
# Topic name
|
# Topic name
|
||||||
repo.event2.topic.endpoint=amqp:topic:alfresco.repo.event2
|
repo.event2.topic.endpoint=amqp:topic:alfresco.repo.event2
|
||||||
# Thread pool for async delivery
|
|
||||||
repo.event2.threadPool.priority=1
|
|
||||||
repo.event2.threadPool.coreSize=8
|
|
||||||
repo.event2.threadPool.maximumSize=10
|
|
||||||
|
|
||||||
# MNT-21083
|
# MNT-21083
|
||||||
# --DELETE_NOT_EXISTS - default settings
|
# --DELETE_NOT_EXISTS - default settings
|
||||||
@@ -1231,4 +1229,4 @@ system.new-node-transaction-indexes.ignored=true
|
|||||||
|
|
||||||
# Allows the configuration of maximum limits of the temp files to be deleted or the maximum time allowed to run for the job
|
# Allows the configuration of maximum limits of the temp files to be deleted or the maximum time allowed to run for the job
|
||||||
system.tempFileCleaner.maxFilesToDelete=
|
system.tempFileCleaner.maxFilesToDelete=
|
||||||
system.tempFileCleaner.maxTimeToRun=
|
system.tempFileCleaner.maxTimeToRun=
|
||||||
|
|||||||
@@ -107,7 +107,7 @@
|
|||||||
</property>
|
</property>
|
||||||
</bean>
|
</bean>
|
||||||
<bean id="nodeServiceCleanupTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
|
<bean id="nodeServiceCleanupTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
|
||||||
<property name="cronExpression" value="0 0 21 * * ?"/>
|
<property name="cronExpression" value="${system.nodeServiceCleanup.cronExpression}"/>
|
||||||
<property name="startDelay" value="${system.cronJob.startDelayMilliseconds}"/>
|
<property name="startDelay" value="${system.cronJob.startDelayMilliseconds}"/>
|
||||||
<property name="jobDetail">
|
<property name="jobDetail">
|
||||||
<bean class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
|
<bean class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
|
||||||
|
|||||||
@@ -170,6 +170,7 @@ import org.junit.runners.Suite;
|
|||||||
org.alfresco.repo.content.caching.quota.UnlimitedQuotaStrategyTest.class,
|
org.alfresco.repo.content.caching.quota.UnlimitedQuotaStrategyTest.class,
|
||||||
org.alfresco.repo.content.caching.CachingContentStoreTest.class,
|
org.alfresco.repo.content.caching.CachingContentStoreTest.class,
|
||||||
org.alfresco.repo.content.caching.ContentCacheImplTest.class,
|
org.alfresco.repo.content.caching.ContentCacheImplTest.class,
|
||||||
|
org.alfresco.repo.domain.permissions.FixedAclUpdaterUnitTest.class,
|
||||||
org.alfresco.repo.domain.propval.PropertyTypeConverterTest.class,
|
org.alfresco.repo.domain.propval.PropertyTypeConverterTest.class,
|
||||||
org.alfresco.repo.search.MLAnaysisModeExpansionTest.class,
|
org.alfresco.repo.search.MLAnaysisModeExpansionTest.class,
|
||||||
org.alfresco.repo.search.DocumentNavigatorTest.class,
|
org.alfresco.repo.search.DocumentNavigatorTest.class,
|
||||||
|
|||||||
@@ -0,0 +1,99 @@
|
|||||||
|
/*
|
||||||
|
* #%L
|
||||||
|
* Alfresco Repository
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2005 - 2018 Alfresco Software Limited
|
||||||
|
* %%
|
||||||
|
* This file is part of the Alfresco software.
|
||||||
|
* If the software was purchased under a paid Alfresco license, the terms of
|
||||||
|
* the paid license agreement will prevail. Otherwise, the software is
|
||||||
|
* provided under the following open source license terms:
|
||||||
|
*
|
||||||
|
* Alfresco is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Alfresco is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
|
package org.alfresco.messaging.camel;
|
||||||
|
|
||||||
|
import org.apache.camel.CamelContext;
|
||||||
|
import org.apache.camel.Produce;
|
||||||
|
import org.apache.camel.ProducerTemplate;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.test.context.ContextConfiguration;
|
||||||
|
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests Camel components defined in the application's Spring context
|
||||||
|
*/
|
||||||
|
@RunWith(SpringJUnit4ClassRunner.class)
|
||||||
|
@ContextConfiguration(locations = "/test-messaging-context.xml")
|
||||||
|
public class CamelComponentsTest {
|
||||||
|
@Autowired
|
||||||
|
protected CamelContext camelContext;
|
||||||
|
|
||||||
|
@Produce("activemq:queue:alfresco.test")
|
||||||
|
protected ProducerTemplate activemqTemplate;
|
||||||
|
|
||||||
|
@Produce("amqp:queue:alfresco.test")
|
||||||
|
protected ProducerTemplate amqpTemplate;
|
||||||
|
|
||||||
|
@Produce("jms:queue:alfresco.test")
|
||||||
|
protected ProducerTemplate jmsTemplate;
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testActivemqComponent()
|
||||||
|
{
|
||||||
|
final String msg = "ping <activemq>";
|
||||||
|
|
||||||
|
activemqTemplate.sendBody(msg);
|
||||||
|
|
||||||
|
final Object reply = camelContext
|
||||||
|
.createConsumerTemplate()
|
||||||
|
.receiveBody("activemq:queue:alfresco.test", 2000);
|
||||||
|
|
||||||
|
assertEquals(msg, reply);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAmqpComponent()
|
||||||
|
{
|
||||||
|
final String msg = "ping <amqp>";
|
||||||
|
|
||||||
|
amqpTemplate.sendBody(msg);
|
||||||
|
|
||||||
|
final Object reply = camelContext
|
||||||
|
.createConsumerTemplate()
|
||||||
|
.receiveBody("amqp:queue:alfresco.test", 2000);
|
||||||
|
|
||||||
|
assertEquals(msg, reply);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testJmsComponent()
|
||||||
|
{
|
||||||
|
final String msg = "ping <jms>";
|
||||||
|
|
||||||
|
jmsTemplate.sendBody(msg);
|
||||||
|
|
||||||
|
final Object reply = camelContext
|
||||||
|
.createConsumerTemplate()
|
||||||
|
.receiveBody("jms:queue:alfresco.test", 2000);
|
||||||
|
|
||||||
|
assertEquals(msg, reply);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -61,76 +61,76 @@ public class CamelRoutesTest
|
|||||||
|
|
||||||
@Produce("direct-vm:alfresco.test.1")
|
@Produce("direct-vm:alfresco.test.1")
|
||||||
protected ProducerTemplate template1;
|
protected ProducerTemplate template1;
|
||||||
|
|
||||||
@Produce("direct-vm:alfresco.test.2")
|
@Produce("direct-vm:alfresco.test.2")
|
||||||
protected ProducerTemplate template2;
|
protected ProducerTemplate template2;
|
||||||
|
|
||||||
@Produce("direct-vm:alfresco.default")
|
@Produce("direct-vm:alfresco.default")
|
||||||
protected ProducerTemplate template3;
|
protected ProducerTemplate template3;
|
||||||
|
|
||||||
@Produce("direct-vm:alfresco.test.transacted")
|
@Produce("direct-vm:alfresco.test.transacted")
|
||||||
protected ProducerTemplate template4;
|
protected ProducerTemplate template4;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
protected MockExceptionProcessor messagingExceptionProcessor;
|
protected MockExceptionProcessor messagingExceptionProcessor;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
protected MockConsumer mockConsumer;
|
protected MockConsumer mockConsumer;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
protected MockExceptionThrowingConsumer mockExceptionThrowingConsumer;
|
protected MockExceptionThrowingConsumer mockExceptionThrowingConsumer;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testMessageRouteXmlDefined() throws Exception {
|
public void testMessageRouteXmlDefined() throws Exception {
|
||||||
String expectedBody = "<matched.>";
|
String expectedBody = "<matched.>";
|
||||||
|
|
||||||
resultEndpoint1.expectedBodiesReceived(expectedBody);
|
resultEndpoint1.expectedBodiesReceived(expectedBody);
|
||||||
|
|
||||||
template1.sendBody(expectedBody);
|
template1.sendBody(expectedBody);
|
||||||
|
|
||||||
resultEndpoint1.assertIsSatisfied();
|
resultEndpoint1.assertIsSatisfied();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testMessageRoutePackageDefined() throws Exception {
|
public void testMessageRoutePackageDefined() throws Exception {
|
||||||
String expectedBody = "<matched.>";
|
String expectedBody = "<matched.>";
|
||||||
|
|
||||||
resultEndpoint2.expectedBodiesReceived(expectedBody);
|
resultEndpoint2.expectedBodiesReceived(expectedBody);
|
||||||
|
|
||||||
template2.sendBody(expectedBody);
|
template2.sendBody(expectedBody);
|
||||||
|
|
||||||
resultEndpoint2.assertIsSatisfied();
|
resultEndpoint2.assertIsSatisfied();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testMessageRouteXmlOverride() throws Exception {
|
public void testMessageRouteXmlOverride() throws Exception {
|
||||||
String expectedBody = "<matched.>";
|
String expectedBody = "<matched.>";
|
||||||
|
|
||||||
dlqEndpoint.expectedBodiesReceived(expectedBody);
|
dlqEndpoint.expectedBodiesReceived(expectedBody);
|
||||||
|
|
||||||
template3.sendBody(expectedBody);
|
template3.sendBody(expectedBody);
|
||||||
|
|
||||||
dlqEndpoint.assertIsSatisfied();
|
dlqEndpoint.assertIsSatisfied();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testTransactedRoute() throws Exception {
|
public void testTransactedRoute() throws Exception {
|
||||||
String expectedBody = "<matched.>";
|
String expectedBody = "<matched.>";
|
||||||
|
|
||||||
template4.sendBody(expectedBody);
|
template4.sendBody(expectedBody);
|
||||||
|
|
||||||
// Wait for Camel and ActiveMQ to process
|
// Wait for Camel and ActiveMQ to process
|
||||||
Thread.sleep(2000);
|
Thread.sleep(2000);
|
||||||
|
|
||||||
// Test that our exception processor received the error
|
// Test that our exception processor received the error
|
||||||
assertNotNull(messagingExceptionProcessor.getLastError());
|
assertNotNull(messagingExceptionProcessor.getLastError());
|
||||||
assertTrue(messagingExceptionProcessor.getLastError().getClass().equals(
|
assertTrue(messagingExceptionProcessor.getLastError().getClass().equals(
|
||||||
IllegalArgumentException.class));
|
IllegalArgumentException.class));
|
||||||
|
|
||||||
// Check that an error was thrown the first time
|
// Check that an error was thrown the first time
|
||||||
assertTrue(mockExceptionThrowingConsumer.isErrorThrown());
|
assertTrue(mockExceptionThrowingConsumer.isErrorThrown());
|
||||||
assertNull(mockExceptionThrowingConsumer.getLastMessage());
|
assertNull(mockExceptionThrowingConsumer.getLastMessage());
|
||||||
|
|
||||||
// Check that the message was re-delivered to a second consumer
|
// Check that the message was re-delivered to a second consumer
|
||||||
assertEquals(expectedBody, mockConsumer.getLastMessage());
|
assertEquals(expectedBody, mockConsumer.getLastMessage());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,108 @@
|
|||||||
|
/*
|
||||||
|
* #%L
|
||||||
|
* Alfresco Repository
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||||
|
* %%
|
||||||
|
* This file is part of the Alfresco software.
|
||||||
|
* If the software was purchased under a paid Alfresco license, the terms of
|
||||||
|
* the paid license agreement will prevail. Otherwise, the software is
|
||||||
|
* provided under the following open source license terms:
|
||||||
|
*
|
||||||
|
* Alfresco is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Alfresco is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
|
package org.alfresco.repo.domain.permissions;
|
||||||
|
|
||||||
|
import static org.alfresco.model.ContentModel.TYPE_BASE;
|
||||||
|
import static org.alfresco.service.cmr.repository.StoreRef.STORE_REF_ARCHIVE_SPACESSTORE;
|
||||||
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
import static org.mockito.Mockito.never;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
import static org.mockito.MockitoAnnotations.openMocks;
|
||||||
|
|
||||||
|
import org.alfresco.repo.domain.node.NodeDAO;
|
||||||
|
import org.alfresco.repo.domain.permissions.FixedAclUpdater.AclWorker;
|
||||||
|
import org.alfresco.repo.policy.ClassPolicyDelegate;
|
||||||
|
import org.alfresco.repo.security.permissions.PermissionServicePolicies.OnInheritPermissionsDisabled;
|
||||||
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
|
import org.alfresco.util.Pair;
|
||||||
|
import org.alfresco.util.PolicyIgnoreUtil;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.mockito.InjectMocks;
|
||||||
|
import org.mockito.Mock;
|
||||||
|
|
||||||
|
/** Mock-based unit tests for {@link FixedAclUpdater}. */
|
||||||
|
public class FixedAclUpdaterUnitTest
|
||||||
|
{
|
||||||
|
private static final NodeRef NODE_REF = new NodeRef("test://node/ref");
|
||||||
|
private static final long NODE_ID = 123L;
|
||||||
|
private static final NodeRef ARCHIVED_NODE = new NodeRef(STORE_REF_ARCHIVE_SPACESSTORE, "archived");
|
||||||
|
|
||||||
|
@InjectMocks
|
||||||
|
private FixedAclUpdater fixedAclUpdater = new FixedAclUpdater();
|
||||||
|
/** The inner class under test. */
|
||||||
|
private AclWorker aclWorker = fixedAclUpdater.createAclWorker();
|
||||||
|
@Mock
|
||||||
|
private NodeDAO nodeDAO;
|
||||||
|
@Mock
|
||||||
|
private AccessControlListDAO accessControlListDAO;
|
||||||
|
@Mock
|
||||||
|
private PolicyIgnoreUtil policyIgnoreUtil;
|
||||||
|
@Mock
|
||||||
|
private ClassPolicyDelegate<OnInheritPermissionsDisabled> onInheritPermissionsDisabledDelegate;
|
||||||
|
@Mock
|
||||||
|
private OnInheritPermissionsDisabled onInheritPermissionsDisabled;
|
||||||
|
/** A pair of mock listeners. */
|
||||||
|
@Mock
|
||||||
|
private FixedAclUpdaterListener listenerA, listenerB;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp()
|
||||||
|
{
|
||||||
|
openMocks(this);
|
||||||
|
|
||||||
|
fixedAclUpdater.registerListener(listenerA);
|
||||||
|
fixedAclUpdater.registerListener(listenerB);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Check that when the AclWorker successfully processes a node then the listeners are notified. */
|
||||||
|
@Test
|
||||||
|
public void testListenersNotifiedAboutUpdate() throws Throwable
|
||||||
|
{
|
||||||
|
when(nodeDAO.getNodePair(NODE_REF)).thenReturn(new Pair<>(NODE_ID, NODE_REF));
|
||||||
|
when(onInheritPermissionsDisabledDelegate.get(TYPE_BASE)).thenReturn(onInheritPermissionsDisabled);
|
||||||
|
|
||||||
|
aclWorker.process(NODE_REF);
|
||||||
|
|
||||||
|
verify(listenerA).permissionsUpdatedAsynchronously(NODE_REF);
|
||||||
|
verify(listenerB).permissionsUpdatedAsynchronously(NODE_REF);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Check that archived nodes get the "Pending ACL" aspect removed without further updates, and the listeners are not notified. */
|
||||||
|
@Test
|
||||||
|
public void testListenersNotNotifiedAboutArchivedNode() throws Throwable
|
||||||
|
{
|
||||||
|
when(nodeDAO.getNodePair(ARCHIVED_NODE)).thenReturn(new Pair<>(NODE_ID, ARCHIVED_NODE));
|
||||||
|
when(onInheritPermissionsDisabledDelegate.get(TYPE_BASE)).thenReturn(onInheritPermissionsDisabled);
|
||||||
|
|
||||||
|
aclWorker.process(ARCHIVED_NODE);
|
||||||
|
|
||||||
|
verify(accessControlListDAO).removePendingAclAspect(NODE_ID);
|
||||||
|
verify(listenerA, never()).permissionsUpdatedAsynchronously(any(NodeRef.class));
|
||||||
|
verify(listenerB, never()).permissionsUpdatedAsynchronously(any(NodeRef.class));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -31,7 +31,6 @@ import static org.awaitility.Awaitility.await;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.Executor;
|
|
||||||
|
|
||||||
import javax.jms.ConnectionFactory;
|
import javax.jms.ConnectionFactory;
|
||||||
|
|
||||||
@@ -105,10 +104,6 @@ public abstract class AbstractContextAwareRepoEvent extends BaseSpringTest
|
|||||||
@Autowired
|
@Autowired
|
||||||
protected ObjectMapper event2ObjectMapper;
|
protected ObjectMapper event2ObjectMapper;
|
||||||
|
|
||||||
@Autowired @Qualifier("eventGeneratorV2")
|
|
||||||
protected EventGenerator eventGenerator;
|
|
||||||
|
|
||||||
|
|
||||||
protected NodeRef rootNodeRef;
|
protected NodeRef rootNodeRef;
|
||||||
|
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
@@ -148,18 +143,6 @@ public abstract class AbstractContextAwareRepoEvent extends BaseSpringTest
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Before
|
|
||||||
public void forceEventGeneratorToBeSynchronous() {
|
|
||||||
eventGenerator.setThreadPoolExecutor(new Executor()
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public void execute(Runnable command)
|
|
||||||
{
|
|
||||||
command.run();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@After
|
@After
|
||||||
public void tearDown()
|
public void tearDown()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -231,7 +231,7 @@ public class ModuleVersionNumberTest extends TestCase
|
|||||||
return (ModuleVersionNumber) objectInputStream.readObject();
|
return (ModuleVersionNumber) objectInputStream.readObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tests that we can strip the suffixes such as "-M2", "-A12" or "-RC2" from versions "7.0.0-M2", "6.2.2-A12", "7.0.1-RC2"
|
// Tests that we can strip the suffixes such as "-M2", "-A12" or "-RC2" from versions "7.0.0-M2", "6.2.2-A12", "7.1.0-RC2"
|
||||||
// The main version may contain 3 or 4 digit parts.
|
// The main version may contain 3 or 4 digit parts.
|
||||||
public void testGetVersionWithoutSuffix()
|
public void testGetVersionWithoutSuffix()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -9,13 +9,13 @@
|
|||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<import resource="classpath:/alfresco/subsystems/Messaging/default/messaging-context.xml" />
|
<import resource="classpath:/alfresco/subsystems/Messaging/default/messaging-context.xml" />
|
||||||
|
|
||||||
<bean id="messagingExceptionProcessor"
|
<bean id="messagingExceptionProcessor"
|
||||||
class="org.alfresco.messaging.camel.MockExceptionProcessor" />
|
class="org.alfresco.messaging.camel.MockExceptionProcessor" />
|
||||||
|
|
||||||
<bean id="mockConsumer"
|
<bean id="mockConsumer"
|
||||||
class="org.alfresco.messaging.camel.MockConsumer" />
|
class="org.alfresco.messaging.camel.MockConsumer" />
|
||||||
|
|
||||||
<bean id="mockExceptionThrowingConsumer"
|
<bean id="mockExceptionThrowingConsumer"
|
||||||
class="org.alfresco.messaging.camel.MockExceptionThrowingConsumer" />
|
class="org.alfresco.messaging.camel.MockExceptionThrowingConsumer" />
|
||||||
|
|
||||||
@@ -25,4 +25,19 @@
|
|||||||
<property name="routeContextId" value="customRoutes" />
|
<property name="routeContextId" value="customRoutes" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
|
<bean id="transactionAwareEventProducer" class="org.mockito.Mockito" factory-method="mock">
|
||||||
|
<constructor-arg value="org.alfresco.repo.rawevents.TransactionAwareEventProducer" />
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<bean id="policyComponent" class="org.mockito.Mockito" factory-method="mock">
|
||||||
|
<constructor-arg value="org.alfresco.repo.policy.PolicyComponentImpl"/>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<bean id="renditionEventProcessor" class="org.mockito.Mockito" factory-method="mock">
|
||||||
|
<constructor-arg value="org.alfresco.repo.rendition2.RenditionEventProcessor"/>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<bean id="transformRequestProcessor" class="org.mockito.Mockito" factory-method="mock">
|
||||||
|
<constructor-arg value="org.alfresco.repo.rendition2.TransformRequestProcessor" />
|
||||||
|
</bean>
|
||||||
</beans>
|
</beans>
|
||||||
@@ -1,6 +1,9 @@
|
|||||||
messaging.broker.url=vm://localhost?broker.persistent=false
|
messaging.broker.url=nio://localhost:61616
|
||||||
messaging.broker.ssl=false
|
messaging.broker.ssl=false
|
||||||
messaging.broker.connections.max=8
|
messaging.broker.connections.max=8
|
||||||
messaging.transacted=true
|
messaging.transacted=true
|
||||||
messaging.broker.username=
|
messaging.broker.username=
|
||||||
messaging.broker.password=
|
messaging.broker.password=
|
||||||
|
|
||||||
|
acs.repo.rendition.events.endpoint=jms:acs-repo-rendition-events-test?jmsMessageType=Text
|
||||||
|
acs.repo.transform.request.endpoint=jms:acs-repo-transform-request-test?jmsMessageType=Text
|
||||||
Reference in New Issue
Block a user