mirror of
				https://github.com/Alfresco/alfresco-community-repo.git
				synced 2025-10-29 15:21:53 +00:00 
			
		
		
		
	Compare commits
	
		
			2 Commits
		
	
	
		
			17.113
			...
			fix/admin-
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					53ecbaa74f | ||
| 
						 | 
					bc5aabbf37 | 
							
								
								
									
										680
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										680
									
								
								.travis.yml
									
									
									
									
									
								
							@@ -51,346 +51,346 @@ jobs:
 | 
			
		||||
      install: skip
 | 
			
		||||
      script: travis_retry travis_wait 80 bash scripts/travis/prepare.sh
 | 
			
		||||
 | 
			
		||||
    - name: "Source Clear Scan (SCA)"
 | 
			
		||||
      stage: test
 | 
			
		||||
      if: (branch = master OR branch =~ /release\/.*/) AND type != pull_request
 | 
			
		||||
      # Run Veracode
 | 
			
		||||
      install: skip
 | 
			
		||||
      script: travis_wait 30 bash scripts/travis/source_clear.sh
 | 
			
		||||
 | 
			
		||||
    - name: "Core, Data-Model, Repository - AllUnitTestsSuite - Build and test"
 | 
			
		||||
      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
      install: skip
 | 
			
		||||
      script:
 | 
			
		||||
        - travis_retry mvn -B test -pl core,data-model -am -DfailIfNoTests=false
 | 
			
		||||
        - travis_retry mvn -B test -pl "repository,mmt" -am "-Dtest=AllUnitTestsSuite,AllMmtUnitTestSuite" -DfailIfNoTests=false
 | 
			
		||||
 | 
			
		||||
    - name: "Repository - AppContext01TestSuite"
 | 
			
		||||
      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
      install: skip
 | 
			
		||||
      before_script:
 | 
			
		||||
        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
        - docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:${TRANSFORMERS_TAG}
 | 
			
		||||
      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AppContext01TestSuite -DfailIfNoTests=false -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
 | 
			
		||||
    - name: "Repository - AppContext02TestSuite"
 | 
			
		||||
      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
      install: skip
 | 
			
		||||
      before_script:
 | 
			
		||||
        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AppContext02TestSuite -DfailIfNoTests=false -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
 | 
			
		||||
    - name: "Repository - AppContext03TestSuite"
 | 
			
		||||
      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
      install: skip
 | 
			
		||||
      before_script:
 | 
			
		||||
        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
        - docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:${TRANSFORMERS_TAG}
 | 
			
		||||
      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AppContext03TestSuite -DfailIfNoTests=false -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
 | 
			
		||||
    - name: "Repository - AppContext04TestSuite"
 | 
			
		||||
      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
      install: skip
 | 
			
		||||
      before_script:
 | 
			
		||||
        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
        - docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:${TRANSFORMERS_TAG}
 | 
			
		||||
      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AppContext04TestSuite -DfailIfNoTests=false -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
 | 
			
		||||
    - name: "Repository - AppContext05TestSuite"
 | 
			
		||||
      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
      install: skip
 | 
			
		||||
      before_script:
 | 
			
		||||
        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
        - mkdir -p "${HOME}/tmp"
 | 
			
		||||
        - cp repository/src/test/resources/realms/alfresco-realm.json "${HOME}/tmp"
 | 
			
		||||
        - export HOST_IP=$(hostname  -I | cut -f1 -d' ')
 | 
			
		||||
        - docker run -d -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin -e DB_VENDOR=h2 -p 8999:8080 -e KEYCLOAK_IMPORT=/tmp/alfresco-realm.json -v $HOME/tmp/alfresco-realm.json:/tmp/alfresco-realm.json alfresco/alfresco-identity-service:1.2
 | 
			
		||||
      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AppContext05TestSuite -DfailIfNoTests=false -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco "-Didentity-service.auth-server-url=http://${HOST_IP}:8999/auth"
 | 
			
		||||
 | 
			
		||||
    - name: "Repository - AppContext06TestSuite"
 | 
			
		||||
      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
      install: skip
 | 
			
		||||
      before_script:
 | 
			
		||||
        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
        - docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:${TRANSFORMERS_TAG}
 | 
			
		||||
      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AppContext06TestSuite -DfailIfNoTests=false -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
 | 
			
		||||
    - name: "Repository - AppContextExtraTestSuite"
 | 
			
		||||
      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
      install: skip
 | 
			
		||||
      before_script:
 | 
			
		||||
        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
        - docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:${TRANSFORMERS_TAG}
 | 
			
		||||
      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AppContextExtraTestSuite -DfailIfNoTests=false -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
 | 
			
		||||
    - name: "Repository - MiscContextTestSuite"
 | 
			
		||||
      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
      install: skip
 | 
			
		||||
      before_script:
 | 
			
		||||
        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
        - docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:${TRANSFORMERS_TAG}
 | 
			
		||||
      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=MiscContextTestSuite -DfailIfNoTests=false -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
 | 
			
		||||
    - name: "Repository - SearchTestSuite"
 | 
			
		||||
      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
      install: skip
 | 
			
		||||
      before_script:
 | 
			
		||||
        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=SearchTestSuite -DfailIfNoTests=false -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco -Dindex.subsystem.name=solr6
 | 
			
		||||
 | 
			
		||||
    - name: "Repository - MariaDB 10.2.18 tests"
 | 
			
		||||
      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip db\]/ AND type != pull_request) OR commit_message =~ /\[db\]/
 | 
			
		||||
      install: skip
 | 
			
		||||
      before_script:
 | 
			
		||||
        - docker run -d -p 3307:3306 --name mariadb -e MYSQL_ROOT_PASSWORD=alfresco -e MYSQL_USER=alfresco -e MYSQL_DATABASE=alfresco -e MYSQL_PASSWORD=alfresco mariadb:10.2.18 --transaction-isolation=READ-COMMITTED --max-connections=300 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
 | 
			
		||||
        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AllDBTestsTestSuite -DfailIfNoTests=false -Ddb.name=alfresco -Ddb.url=jdbc:mariadb://localhost:3307/alfresco?useUnicode=yes\&characterEncoding=UTF-8 -Ddb.username=alfresco -Ddb.password=alfresco -Ddb.driver=org.mariadb.jdbc.Driver
 | 
			
		||||
 | 
			
		||||
    - name: "Repository - MariaDB 10.4 tests"
 | 
			
		||||
      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip db\]/ AND type != pull_request) OR commit_message =~ /\[db\]/
 | 
			
		||||
      install: skip
 | 
			
		||||
      before_script:
 | 
			
		||||
        - docker run -d -p 3307:3306 --name mariadb -e MYSQL_ROOT_PASSWORD=alfresco -e MYSQL_USER=alfresco -e MYSQL_DATABASE=alfresco -e MYSQL_PASSWORD=alfresco mariadb:10.4 --transaction-isolation=READ-COMMITTED --max-connections=300 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
 | 
			
		||||
        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AllDBTestsTestSuite -DfailIfNoTests=false -Ddb.name=alfresco -Ddb.url=jdbc:mariadb://localhost:3307/alfresco?useUnicode=yes\&characterEncoding=UTF-8 -Ddb.username=alfresco -Ddb.password=alfresco -Ddb.driver=org.mariadb.jdbc.Driver
 | 
			
		||||
 | 
			
		||||
    - name: "Repository - MariaDB 10.5 tests"
 | 
			
		||||
      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip db\]/ AND type != pull_request) OR commit_message =~ /\[db\]/
 | 
			
		||||
      install: skip
 | 
			
		||||
      before_script:
 | 
			
		||||
        - docker run -d -p 3307:3306 --name mariadb -e MYSQL_ROOT_PASSWORD=alfresco -e MYSQL_USER=alfresco -e MYSQL_DATABASE=alfresco -e MYSQL_PASSWORD=alfresco mariadb:10.5 --transaction-isolation=READ-COMMITTED --max-connections=300 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
 | 
			
		||||
        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AllDBTestsTestSuite -DfailIfNoTests=false -Ddb.name=alfresco -Ddb.url=jdbc:mariadb://localhost:3307/alfresco?useUnicode=yes\&characterEncoding=UTF-8 -Ddb.username=alfresco -Ddb.password=alfresco -Ddb.driver=org.mariadb.jdbc.Driver
 | 
			
		||||
 | 
			
		||||
    - name: "Repository - MariaDB 10.6 tests"
 | 
			
		||||
      # We run tests on the latest version of MariaDB on pull requests plus the normal master and release branches - ignored on feature branches
 | 
			
		||||
      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip db\]/                         ) OR commit_message =~ /\[db\]/ OR commit_message =~ /\[latest db\]/
 | 
			
		||||
      install: skip
 | 
			
		||||
      before_script:
 | 
			
		||||
        - docker run -d -p 3307:3306 --name mariadb -e MYSQL_ROOT_PASSWORD=alfresco -e MYSQL_USER=alfresco -e MYSQL_DATABASE=alfresco -e MYSQL_PASSWORD=alfresco mariadb:10.6 --transaction-isolation=READ-COMMITTED --max-connections=300 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
 | 
			
		||||
        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AllDBTestsTestSuite -DfailIfNoTests=false -Ddb.name=alfresco -Ddb.url=jdbc:mariadb://localhost:3307/alfresco?useUnicode=yes\&characterEncoding=UTF-8 -Ddb.username=alfresco -Ddb.password=alfresco -Ddb.driver=org.mariadb.jdbc.Driver
 | 
			
		||||
 | 
			
		||||
    - name: "Repository - MySQL 8 tests"
 | 
			
		||||
      # We run tests on the latest version of MySQL on pull requests plus the normal master and release branches - ignored on feature branches
 | 
			
		||||
      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip db\]/                         ) OR commit_message =~ /\[db\]/ OR commit_message =~ /\[latest db\]/
 | 
			
		||||
      install: skip
 | 
			
		||||
      before_script:
 | 
			
		||||
        - docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=alfresco -e MYSQL_USER=alfresco -e MYSQL_DATABASE=alfresco -e MYSQL_PASSWORD=alfresco  mysql:8 --transaction-isolation='READ-COMMITTED'
 | 
			
		||||
        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AllDBTestsTestSuite -DfailIfNoTests=false -Ddb.driver=com.mysql.jdbc.Driver -Ddb.name=alfresco -Ddb.url=jdbc:mysql://localhost:3307/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
 | 
			
		||||
    - name: "Repository - PostgreSQL 13.7 tests"
 | 
			
		||||
      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip db\]/ AND type != pull_request) OR commit_message =~ /\[db\]/
 | 
			
		||||
      install: skip
 | 
			
		||||
      before_script:
 | 
			
		||||
        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:13.7 postgres -c 'max_connections=300'
 | 
			
		||||
        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AllDBTestsTestSuite -DfailIfNoTests=false -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
 | 
			
		||||
    - name: "Repository - PostgreSQL 14.4 tests"
 | 
			
		||||
      # We only run DB tests on the latest version of PostgreSQL on feature branches
 | 
			
		||||
      if: commit_message !~ /\[skip db\]/ OR commit_message =~ /\[db\]/ OR commit_message =~ /\[latest db\]/
 | 
			
		||||
      install: skip
 | 
			
		||||
      before_script:
 | 
			
		||||
        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AllDBTestsTestSuite -DfailIfNoTests=false -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"
 | 
			
		||||
      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
      install: skip
 | 
			
		||||
      before_script:
 | 
			
		||||
        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=CamelRoutesTest,CamelComponentsTest -DfailIfNoTests=false
 | 
			
		||||
 | 
			
		||||
    - name: "Remote-api - AppContext01TestSuite"
 | 
			
		||||
      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
      before_script:
 | 
			
		||||
        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
      script: travis_wait 20 mvn -B test -pl remote-api -Dtest=AppContext01TestSuite -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
 | 
			
		||||
    - name: "Remote-api - AppContext02TestSuite"
 | 
			
		||||
      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
      before_script:
 | 
			
		||||
        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
        - docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:${TRANSFORMERS_TAG}
 | 
			
		||||
      script: travis_wait 20 mvn -B test -pl remote-api -Dtest=AppContext02TestSuite -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
 | 
			
		||||
    - name: "Remote-api - AppContext03TestSuite"
 | 
			
		||||
      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
      before_script:
 | 
			
		||||
        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
        - docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:${TRANSFORMERS_TAG}
 | 
			
		||||
      script: travis_wait 20 mvn -B test -pl remote-api -Dtest=AppContext03TestSuite -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
 | 
			
		||||
    - name: "Remote-api - AppContext04TestSuite"
 | 
			
		||||
      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
      before_script:
 | 
			
		||||
        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
        - docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:${TRANSFORMERS_TAG}
 | 
			
		||||
      script: travis_wait 20 mvn -B test -pl remote-api -Dtest=AppContext04TestSuite -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
 | 
			
		||||
    - name: "Remote-api - AppContextExtraTestSuite"
 | 
			
		||||
      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
      before_script:
 | 
			
		||||
        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
      script: travis_wait 20 mvn -B test -pl remote-api -Dtest=AppContextExtraTestSuite -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
 | 
			
		||||
    - name: "REST API TAS tests part1"
 | 
			
		||||
      # TAS tests are generally skipped on feature branches as they will be repeated on the enterprise repo or community packaging builds
 | 
			
		||||
      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip tas\]/) OR commit_message =~ /\[tas\]/
 | 
			
		||||
      install: travis_retry travis_wait 40 env REQUIRES_LOCAL_IMAGES=true bash scripts/travis/build.sh
 | 
			
		||||
      before_script:
 | 
			
		||||
        - ${TAS_SCRIPTS}/start-compose.sh ${TAS_ENVIRONMENT}/docker-compose-minimal+transforms.yml
 | 
			
		||||
        - ${TAS_SCRIPTS}/wait-for-alfresco-start.sh "http://localhost:8082/alfresco"
 | 
			
		||||
      script: travis_wait 60 mvn -B verify -f packaging/tests/tas-restapi/pom.xml -Pall-tas-tests,run-restapi-part1 -Denvironment=default -DrunBugs=false
 | 
			
		||||
 | 
			
		||||
    - name: "REST API TAS tests part2"
 | 
			
		||||
      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip tas\]/) OR commit_message =~ /\[tas\]/
 | 
			
		||||
      install: travis_retry travis_wait 40 env REQUIRES_LOCAL_IMAGES=true bash scripts/travis/build.sh
 | 
			
		||||
      before_script:
 | 
			
		||||
        - ${TAS_SCRIPTS}/start-compose.sh ${TAS_ENVIRONMENT}/docker-compose-minimal+transforms.yml
 | 
			
		||||
        - ${TAS_SCRIPTS}/wait-for-alfresco-start.sh "http://localhost:8082/alfresco"
 | 
			
		||||
      script: travis_wait 60 mvn -B verify -f packaging/tests/tas-restapi/pom.xml -Pall-tas-tests,run-restapi-part2 -Denvironment=default -DrunBugs=false
 | 
			
		||||
 | 
			
		||||
    - name: "REST API TAS tests part3"
 | 
			
		||||
      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip tas\]/) OR commit_message =~ /\[tas\]/
 | 
			
		||||
      install: travis_retry travis_wait 40 env REQUIRES_LOCAL_IMAGES=true bash scripts/travis/build.sh
 | 
			
		||||
      before_script:
 | 
			
		||||
        - ${TAS_SCRIPTS}/start-compose.sh ${TAS_ENVIRONMENT}/docker-compose-minimal+transforms.yml
 | 
			
		||||
        - ${TAS_SCRIPTS}/wait-for-alfresco-start.sh "http://localhost:8082/alfresco"
 | 
			
		||||
      script: travis_wait 60 mvn -B verify -f packaging/tests/tas-restapi/pom.xml -Pall-tas-tests,run-restapi-part3 -Denvironment=default -DrunBugs=false
 | 
			
		||||
 | 
			
		||||
    - name: "CMIS TAS tests - BROWSER binding"
 | 
			
		||||
      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip tas\]/) OR commit_message =~ /\[tas\]/
 | 
			
		||||
      install: travis_retry travis_wait 40 env REQUIRES_LOCAL_IMAGES=true bash scripts/travis/build.sh
 | 
			
		||||
      before_script:
 | 
			
		||||
        - ${TAS_SCRIPTS}/start-compose.sh ${TAS_ENVIRONMENT}/docker-compose-minimal+transforms.yml
 | 
			
		||||
        - ${TAS_SCRIPTS}/wait-for-alfresco-start.sh "http://localhost:8082/alfresco"
 | 
			
		||||
      script: travis_wait 40 mvn -B verify -f packaging/tests/tas-cmis/pom.xml -Pall-tas-tests,run-cmis-browser -Denvironment=default -DrunBugs=false
 | 
			
		||||
 | 
			
		||||
    - name: "CMIS TAS tests - ATOM binding"
 | 
			
		||||
      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip tas\]/) OR commit_message =~ /\[tas\]/
 | 
			
		||||
      install: travis_retry travis_wait 40 env REQUIRES_LOCAL_IMAGES=true bash scripts/travis/build.sh
 | 
			
		||||
      before_script:
 | 
			
		||||
        - ${TAS_SCRIPTS}/start-compose.sh ${TAS_ENVIRONMENT}/docker-compose-minimal+transforms.yml
 | 
			
		||||
        - ${TAS_SCRIPTS}/wait-for-alfresco-start.sh "http://localhost:8082/alfresco"
 | 
			
		||||
      script: travis_wait 40 mvn -B verify -f packaging/tests/tas-cmis/pom.xml -Pall-tas-tests,run-cmis-atom -Denvironment=default -DrunBugs=false
 | 
			
		||||
 | 
			
		||||
    - name: "CMIS TAS tests - WEBSERVICES binding"
 | 
			
		||||
      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip tas\]/) OR commit_message =~ /\[tas\]/
 | 
			
		||||
      install: travis_retry travis_wait 40 env REQUIRES_LOCAL_IMAGES=true bash scripts/travis/build.sh
 | 
			
		||||
      before_script:
 | 
			
		||||
        - ${TAS_SCRIPTS}/start-compose.sh ${TAS_ENVIRONMENT}/docker-compose-minimal+transforms.yml
 | 
			
		||||
        - ${TAS_SCRIPTS}/wait-for-alfresco-start.sh "http://localhost:8082/alfresco"
 | 
			
		||||
      script: travis_wait 40 mvn -B verify -f packaging/tests/tas-cmis/pom.xml -Pall-tas-tests,run-cmis-webservices -Denvironment=default -DrunBugs=false
 | 
			
		||||
 | 
			
		||||
    - name: "Email TAS tests"
 | 
			
		||||
      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip tas\]/) OR commit_message =~ /\[tas\]/
 | 
			
		||||
      install: travis_retry travis_wait 40 env REQUIRES_LOCAL_IMAGES=true bash scripts/travis/build.sh
 | 
			
		||||
      before_script:
 | 
			
		||||
        - ${TAS_SCRIPTS}/start-compose.sh ${TAS_ENVIRONMENT}/docker-compose-minimal.yml
 | 
			
		||||
        - ${TAS_SCRIPTS}/wait-for-alfresco-start.sh "http://localhost:8082/alfresco"
 | 
			
		||||
      script: travis_wait 30 mvn -B verify -f packaging/tests/tas-email/pom.xml -Pall-tas-tests -Denvironment=default -DrunBugs=false
 | 
			
		||||
 | 
			
		||||
    - name: "WebDAV TAS tests"
 | 
			
		||||
      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip tas\]/) OR commit_message =~ /\[tas\]/
 | 
			
		||||
      install: travis_retry travis_wait 40 env REQUIRES_LOCAL_IMAGES=true bash scripts/travis/build.sh
 | 
			
		||||
      before_script:
 | 
			
		||||
        - ${TAS_SCRIPTS}/start-compose.sh ${TAS_ENVIRONMENT}/docker-compose-minimal.yml
 | 
			
		||||
        - ${TAS_SCRIPTS}/wait-for-alfresco-start.sh "http://localhost:8082/alfresco"
 | 
			
		||||
      script: travis_wait 30 mvn -B verify -f packaging/tests/tas-webdav/pom.xml -Pall-tas-tests -Denvironment=default -DrunBugs=false
 | 
			
		||||
 | 
			
		||||
    - name: "Integration TAS tests"
 | 
			
		||||
      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip tas\]/) OR commit_message =~ /\[tas\]/
 | 
			
		||||
      install: travis_retry travis_wait 40 env REQUIRES_LOCAL_IMAGES=true bash scripts/travis/build.sh
 | 
			
		||||
      before_script:
 | 
			
		||||
        - ${TAS_SCRIPTS}/start-compose.sh ${TAS_ENVIRONMENT}/docker-compose-minimal.yml
 | 
			
		||||
        - ${TAS_SCRIPTS}/wait-for-alfresco-start.sh "http://localhost:8082/alfresco"
 | 
			
		||||
      script: travis_wait 30 mvn -B verify -f packaging/tests/tas-integration/pom.xml -Pall-tas-tests -Denvironment=default -DrunBugs=false
 | 
			
		||||
 | 
			
		||||
    - name: "Share Services - ShareServicesTestSuite"
 | 
			
		||||
      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
      install: skip
 | 
			
		||||
      before_script:
 | 
			
		||||
        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
      script: travis_wait 20 mvn -B test -pl :alfresco-share-services -am -Dtest=ShareServicesTestSuite -DfailIfNoTests=false -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
 | 
			
		||||
    - name: "AGS Unit & Integration Tests 01 (PostgreSQL)"
 | 
			
		||||
      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip ags\]/) OR commit_message =~ /\[ags\]/
 | 
			
		||||
      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
      script: travis_retry travis_wait 80 mvn -B verify -Dmaven.javadoc.skip=true -Dmaven.source.skip=true -Pags -Pstart-postgres -PagsAllTestSuitePt1 -f amps/ags/pom.xml ${LOG_WARN}
 | 
			
		||||
 | 
			
		||||
    - name: "AGS        Integration Tests 02 (PostgreSQL)"
 | 
			
		||||
      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip ags\]/) OR commit_message =~ /\[ags\]/
 | 
			
		||||
      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
      script: travis_retry travis_wait 80 mvn -B verify -Dmaven.javadoc.skip=true -Dmaven.source.skip=true -Pags -Pstart-postgres -PagsAllTestSuitePt2 -f amps/ags/pom.xml ${LOG_WARN}
 | 
			
		||||
 | 
			
		||||
    - name: "AGS        Integration Tests 03 (PostgreSQL)"
 | 
			
		||||
      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip ags\]/) OR commit_message =~ /\[ags\]/
 | 
			
		||||
      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
      script: travis_retry travis_wait 80 mvn -B verify -Dmaven.javadoc.skip=true -Dmaven.source.skip=true -Pags -Pstart-postgres -PagsAllTestSuitePt3 -f amps/ags/pom.xml ${LOG_WARN}
 | 
			
		||||
 | 
			
		||||
    - name: "AGS Unit & Integration Tests 04 (PostgreSQL)"
 | 
			
		||||
      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip ags\]/) OR commit_message =~ /\[ags\]/
 | 
			
		||||
      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
      script: travis_retry travis_wait 80 mvn -B verify -Dmaven.javadoc.skip=true -Dmaven.source.skip=true -Pags -Pstart-postgres -PagsAllTestSuitePt4 -f amps/ags/pom.xml ${LOG_WARN}
 | 
			
		||||
 | 
			
		||||
    - name: "AGS Unit & Integration Tests 01 (MySQL) "
 | 
			
		||||
      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip ags\]/) OR commit_message =~ /\[ags on MySQL\]/
 | 
			
		||||
      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
      script: travis_retry travis_wait 80 mvn -B verify -Dmaven.javadoc.skip=true -Dmaven.source.skip=true -Pags -Pstart-mysql    -PagsAllTestSuitePt1 -f amps/ags/pom.xml ${LOG_WARN}
 | 
			
		||||
 | 
			
		||||
    - name: "AGS        Integration Tests 02 (MySQL) "
 | 
			
		||||
      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip ags\]/) OR commit_message =~ /\[ags on MySQL\]/
 | 
			
		||||
      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
      script: travis_retry travis_wait 80 mvn -B verify -Dmaven.javadoc.skip=true -Dmaven.source.skip=true -Pags -Pstart-mysql    -PagsAllTestSuitePt2 -f amps/ags/pom.xml ${LOG_WARN}
 | 
			
		||||
 | 
			
		||||
    - name: "AGS        Integration Tests 03 (MySQL) "
 | 
			
		||||
      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip ags\]/) OR commit_message =~ /\[ags\]/
 | 
			
		||||
      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
      script: travis_retry travis_wait 80 mvn -B verify -Dmaven.javadoc.skip=true -Dmaven.source.skip=true -Pags -Pstart-mysql    -PagsAllTestSuitePt3 -f amps/ags/pom.xml ${LOG_WARN}
 | 
			
		||||
 | 
			
		||||
    - name: "AGS Unit & Integration Tests 04 (MySQL) "
 | 
			
		||||
      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip ags\]/) OR commit_message =~ /\[ags on MySQL\]/
 | 
			
		||||
      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
      script: travis_retry travis_wait 80 mvn -B verify -Dmaven.javadoc.skip=true -Dmaven.source.skip=true -Pags -Pstart-mysql    -PagsAllTestSuitePt4 -f amps/ags/pom.xml ${LOG_WARN}
 | 
			
		||||
 | 
			
		||||
    - name: "AGS Community Rest API Tests"
 | 
			
		||||
      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip ags\]/) OR commit_message =~ /\[ags\]/
 | 
			
		||||
      install: travis_retry travis_wait 40 env REQUIRES_LOCAL_IMAGES=true bash scripts/travis/build.sh
 | 
			
		||||
      addons:
 | 
			
		||||
        artifacts:
 | 
			
		||||
          paths:
 | 
			
		||||
            - ./amps/ags/rm-automation/rm-automation-community-rest-api/target/reports/rm-automation-community-rest-api.log
 | 
			
		||||
            - alfresco.log
 | 
			
		||||
            - solr.log
 | 
			
		||||
          target_paths: community/${TRAVIS_BUILD_NUMBER}/${TRAVIS_JOB_NAME}
 | 
			
		||||
      before_script:
 | 
			
		||||
        - ${TAS_SCRIPTS}/start-compose.sh ./amps/ags/rm-community/rm-community-repo/docker-compose.yml
 | 
			
		||||
        - ${TAS_SCRIPTS}/wait-for-alfresco-start.sh "http://localhost:8080/alfresco"
 | 
			
		||||
      script: travis_wait 40 mvn -B test -pl :alfresco-governance-services-automation-community-rest-api -am -DfailIfNoTests=false -Dskip.automationtests=false -Pags
 | 
			
		||||
      after_script: bash amps/ags/travis/scripts/getLogs.sh
 | 
			
		||||
#    - name: "Source Clear Scan (SCA)"
 | 
			
		||||
#      stage: test
 | 
			
		||||
#      if: branch = master OR branch =~ /release\/.*/
 | 
			
		||||
#      # Run Veracode
 | 
			
		||||
#      install: skip
 | 
			
		||||
#      script: travis_wait 30 bash scripts/travis/source_clear.sh
 | 
			
		||||
#
 | 
			
		||||
#    - name: "Core, Data-Model, Repository - AllUnitTestsSuite - Build and test"
 | 
			
		||||
#      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
#      install: skip
 | 
			
		||||
#      script:
 | 
			
		||||
#        - travis_retry mvn -B test -pl core,data-model -am -DfailIfNoTests=false
 | 
			
		||||
#        - travis_retry mvn -B test -pl "repository,mmt" -am "-Dtest=AllUnitTestsSuite,AllMmtUnitTestSuite" -DfailIfNoTests=false
 | 
			
		||||
#
 | 
			
		||||
#    - name: "Repository - AppContext01TestSuite"
 | 
			
		||||
#      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
#      install: skip
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
#        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
#        - docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:${TRANSFORMERS_TAG}
 | 
			
		||||
#      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AppContext01TestSuite -DfailIfNoTests=false -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
#
 | 
			
		||||
#    - name: "Repository - AppContext02TestSuite"
 | 
			
		||||
#      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
#      install: skip
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
#        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
#      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AppContext02TestSuite -DfailIfNoTests=false -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
#
 | 
			
		||||
#    - name: "Repository - AppContext03TestSuite"
 | 
			
		||||
#      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
#      install: skip
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
#        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
#        - docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:${TRANSFORMERS_TAG}
 | 
			
		||||
#      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AppContext03TestSuite -DfailIfNoTests=false -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
#
 | 
			
		||||
#    - name: "Repository - AppContext04TestSuite"
 | 
			
		||||
#      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
#      install: skip
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
#        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
#        - docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:${TRANSFORMERS_TAG}
 | 
			
		||||
#      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AppContext04TestSuite -DfailIfNoTests=false -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
#
 | 
			
		||||
#    - name: "Repository - AppContext05TestSuite"
 | 
			
		||||
#      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
#      install: skip
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
#        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
#        - mkdir -p "${HOME}/tmp"
 | 
			
		||||
#        - cp repository/src/test/resources/realms/alfresco-realm.json "${HOME}/tmp"
 | 
			
		||||
#        - export HOST_IP=$(hostname  -I | cut -f1 -d' ')
 | 
			
		||||
#        - docker run -d -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin -e DB_VENDOR=h2 -p 8999:8080 -e KEYCLOAK_IMPORT=/tmp/alfresco-realm.json -v $HOME/tmp/alfresco-realm.json:/tmp/alfresco-realm.json alfresco/alfresco-identity-service:1.2
 | 
			
		||||
#      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AppContext05TestSuite -DfailIfNoTests=false -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco "-Didentity-service.auth-server-url=http://${HOST_IP}:8999/auth"
 | 
			
		||||
#
 | 
			
		||||
#    - name: "Repository - AppContext06TestSuite"
 | 
			
		||||
#      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
#      install: skip
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
#        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
#        - docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:${TRANSFORMERS_TAG}
 | 
			
		||||
#      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AppContext06TestSuite -DfailIfNoTests=false -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
#
 | 
			
		||||
#    - name: "Repository - AppContextExtraTestSuite"
 | 
			
		||||
#      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
#      install: skip
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
#        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
#        - docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:${TRANSFORMERS_TAG}
 | 
			
		||||
#      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AppContextExtraTestSuite -DfailIfNoTests=false -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
#
 | 
			
		||||
#    - name: "Repository - MiscContextTestSuite"
 | 
			
		||||
#      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
#      install: skip
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
#        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
#        - docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:${TRANSFORMERS_TAG}
 | 
			
		||||
#      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=MiscContextTestSuite -DfailIfNoTests=false -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
#
 | 
			
		||||
#    - name: "Repository - SearchTestSuite"
 | 
			
		||||
#      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
#      install: skip
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
#        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
#      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=SearchTestSuite -DfailIfNoTests=false -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco -Dindex.subsystem.name=solr6
 | 
			
		||||
#
 | 
			
		||||
#    - name: "Repository - MariaDB 10.2.18 tests"
 | 
			
		||||
#      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip db\]/ AND type != pull_request) OR commit_message =~ /\[db\]/
 | 
			
		||||
#      install: skip
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - docker run -d -p 3307:3306 --name mariadb -e MYSQL_ROOT_PASSWORD=alfresco -e MYSQL_USER=alfresco -e MYSQL_DATABASE=alfresco -e MYSQL_PASSWORD=alfresco mariadb:10.2.18 --transaction-isolation=READ-COMMITTED --max-connections=300 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
 | 
			
		||||
#        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
#      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AllDBTestsTestSuite -DfailIfNoTests=false -Ddb.name=alfresco -Ddb.url=jdbc:mariadb://localhost:3307/alfresco?useUnicode=yes\&characterEncoding=UTF-8 -Ddb.username=alfresco -Ddb.password=alfresco -Ddb.driver=org.mariadb.jdbc.Driver
 | 
			
		||||
#
 | 
			
		||||
#    - name: "Repository - MariaDB 10.4 tests"
 | 
			
		||||
#      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip db\]/ AND type != pull_request) OR commit_message =~ /\[db\]/
 | 
			
		||||
#      install: skip
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - docker run -d -p 3307:3306 --name mariadb -e MYSQL_ROOT_PASSWORD=alfresco -e MYSQL_USER=alfresco -e MYSQL_DATABASE=alfresco -e MYSQL_PASSWORD=alfresco mariadb:10.4 --transaction-isolation=READ-COMMITTED --max-connections=300 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
 | 
			
		||||
#        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
#      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AllDBTestsTestSuite -DfailIfNoTests=false -Ddb.name=alfresco -Ddb.url=jdbc:mariadb://localhost:3307/alfresco?useUnicode=yes\&characterEncoding=UTF-8 -Ddb.username=alfresco -Ddb.password=alfresco -Ddb.driver=org.mariadb.jdbc.Driver
 | 
			
		||||
#
 | 
			
		||||
#    - name: "Repository - MariaDB 10.5 tests"
 | 
			
		||||
#      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip db\]/ AND type != pull_request) OR commit_message =~ /\[db\]/
 | 
			
		||||
#      install: skip
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - docker run -d -p 3307:3306 --name mariadb -e MYSQL_ROOT_PASSWORD=alfresco -e MYSQL_USER=alfresco -e MYSQL_DATABASE=alfresco -e MYSQL_PASSWORD=alfresco mariadb:10.5 --transaction-isolation=READ-COMMITTED --max-connections=300 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
 | 
			
		||||
#        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
#      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AllDBTestsTestSuite -DfailIfNoTests=false -Ddb.name=alfresco -Ddb.url=jdbc:mariadb://localhost:3307/alfresco?useUnicode=yes\&characterEncoding=UTF-8 -Ddb.username=alfresco -Ddb.password=alfresco -Ddb.driver=org.mariadb.jdbc.Driver
 | 
			
		||||
#
 | 
			
		||||
#    - name: "Repository - MariaDB 10.6 tests"
 | 
			
		||||
#      # We run tests on the latest version of MariaDB on pull requests plus the normal master and release branches - ignored on feature branches
 | 
			
		||||
#      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip db\]/                         ) OR commit_message =~ /\[db\]/ OR commit_message =~ /\[latest db\]/
 | 
			
		||||
#      install: skip
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - docker run -d -p 3307:3306 --name mariadb -e MYSQL_ROOT_PASSWORD=alfresco -e MYSQL_USER=alfresco -e MYSQL_DATABASE=alfresco -e MYSQL_PASSWORD=alfresco mariadb:10.6 --transaction-isolation=READ-COMMITTED --max-connections=300 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
 | 
			
		||||
#        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
#      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AllDBTestsTestSuite -DfailIfNoTests=false -Ddb.name=alfresco -Ddb.url=jdbc:mariadb://localhost:3307/alfresco?useUnicode=yes\&characterEncoding=UTF-8 -Ddb.username=alfresco -Ddb.password=alfresco -Ddb.driver=org.mariadb.jdbc.Driver
 | 
			
		||||
#
 | 
			
		||||
#    - name: "Repository - MySQL 8 tests"
 | 
			
		||||
#      # We run tests on the latest version of MySQL on pull requests plus the normal master and release branches - ignored on feature branches
 | 
			
		||||
#      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip db\]/                         ) OR commit_message =~ /\[db\]/ OR commit_message =~ /\[latest db\]/
 | 
			
		||||
#      install: skip
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=alfresco -e MYSQL_USER=alfresco -e MYSQL_DATABASE=alfresco -e MYSQL_PASSWORD=alfresco  mysql:8 --transaction-isolation='READ-COMMITTED'
 | 
			
		||||
#        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
#      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AllDBTestsTestSuite -DfailIfNoTests=false -Ddb.driver=com.mysql.jdbc.Driver -Ddb.name=alfresco -Ddb.url=jdbc:mysql://localhost:3307/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
#
 | 
			
		||||
#    - name: "Repository - PostgreSQL 13.7 tests"
 | 
			
		||||
#      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip db\]/ AND type != pull_request) OR commit_message =~ /\[db\]/
 | 
			
		||||
#      install: skip
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:13.7 postgres -c 'max_connections=300'
 | 
			
		||||
#        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
#      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AllDBTestsTestSuite -DfailIfNoTests=false -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
#
 | 
			
		||||
#    - name: "Repository - PostgreSQL 14.4 tests"
 | 
			
		||||
#      # We only run DB tests on the latest version of PostgreSQL on feature branches
 | 
			
		||||
#      if: commit_message !~ /\[skip db\]/ OR commit_message =~ /\[db\]/ OR commit_message =~ /\[latest db\]/
 | 
			
		||||
#      install: skip
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
#        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
#      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=AllDBTestsTestSuite -DfailIfNoTests=false -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"
 | 
			
		||||
#      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
#      install: skip
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
#      script: travis_wait 20 mvn -B test -pl repository -am -Dtest=CamelRoutesTest,CamelComponentsTest -DfailIfNoTests=false
 | 
			
		||||
#
 | 
			
		||||
#    - name: "Remote-api - AppContext01TestSuite"
 | 
			
		||||
#      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
#      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
#        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
#      script: travis_wait 20 mvn -B test -pl remote-api -Dtest=AppContext01TestSuite -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
#
 | 
			
		||||
#    - name: "Remote-api - AppContext02TestSuite"
 | 
			
		||||
#      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
#      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
#        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
#        - docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:${TRANSFORMERS_TAG}
 | 
			
		||||
#      script: travis_wait 20 mvn -B test -pl remote-api -Dtest=AppContext02TestSuite -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
#
 | 
			
		||||
#    - name: "Remote-api - AppContext03TestSuite"
 | 
			
		||||
#      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
#      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
#        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
#        - docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:${TRANSFORMERS_TAG}
 | 
			
		||||
#      script: travis_wait 20 mvn -B test -pl remote-api -Dtest=AppContext03TestSuite -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
#
 | 
			
		||||
#    - name: "Remote-api - AppContext04TestSuite"
 | 
			
		||||
#      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
#      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
#        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
#        - docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:${TRANSFORMERS_TAG}
 | 
			
		||||
#      script: travis_wait 20 mvn -B test -pl remote-api -Dtest=AppContext04TestSuite -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
#
 | 
			
		||||
#    - name: "Remote-api - AppContextExtraTestSuite"
 | 
			
		||||
#      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
#      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
#        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.17.1-jre11-rockylinux8
 | 
			
		||||
#      script: travis_wait 20 mvn -B test -pl remote-api -Dtest=AppContextExtraTestSuite -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
#
 | 
			
		||||
#    - name: "REST API TAS tests part1"
 | 
			
		||||
#      # TAS tests are generally skipped on feature branches as they will be repeated on the enterprise repo or community packaging builds
 | 
			
		||||
#      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip tas\]/) OR commit_message =~ /\[tas\]/
 | 
			
		||||
#      install: travis_retry travis_wait 40 env REQUIRES_LOCAL_IMAGES=true bash scripts/travis/build.sh
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - ${TAS_SCRIPTS}/start-compose.sh ${TAS_ENVIRONMENT}/docker-compose-minimal+transforms.yml
 | 
			
		||||
#        - ${TAS_SCRIPTS}/wait-for-alfresco-start.sh "http://localhost:8082/alfresco"
 | 
			
		||||
#      script: travis_wait 60 mvn -B verify -f packaging/tests/tas-restapi/pom.xml -Pall-tas-tests,run-restapi-part1 -Denvironment=default -DrunBugs=false
 | 
			
		||||
#
 | 
			
		||||
#    - name: "REST API TAS tests part2"
 | 
			
		||||
#      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip tas\]/) OR commit_message =~ /\[tas\]/
 | 
			
		||||
#      install: travis_retry travis_wait 40 env REQUIRES_LOCAL_IMAGES=true bash scripts/travis/build.sh
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - ${TAS_SCRIPTS}/start-compose.sh ${TAS_ENVIRONMENT}/docker-compose-minimal+transforms.yml
 | 
			
		||||
#        - ${TAS_SCRIPTS}/wait-for-alfresco-start.sh "http://localhost:8082/alfresco"
 | 
			
		||||
#      script: travis_wait 60 mvn -B verify -f packaging/tests/tas-restapi/pom.xml -Pall-tas-tests,run-restapi-part2 -Denvironment=default -DrunBugs=false
 | 
			
		||||
#
 | 
			
		||||
#    - name: "REST API TAS tests part3"
 | 
			
		||||
#      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip tas\]/) OR commit_message =~ /\[tas\]/
 | 
			
		||||
#      install: travis_retry travis_wait 40 env REQUIRES_LOCAL_IMAGES=true bash scripts/travis/build.sh
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - ${TAS_SCRIPTS}/start-compose.sh ${TAS_ENVIRONMENT}/docker-compose-minimal+transforms.yml
 | 
			
		||||
#        - ${TAS_SCRIPTS}/wait-for-alfresco-start.sh "http://localhost:8082/alfresco"
 | 
			
		||||
#      script: travis_wait 60 mvn -B verify -f packaging/tests/tas-restapi/pom.xml -Pall-tas-tests,run-restapi-part3 -Denvironment=default -DrunBugs=false
 | 
			
		||||
#
 | 
			
		||||
#    - name: "CMIS TAS tests - BROWSER binding"
 | 
			
		||||
#      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip tas\]/) OR commit_message =~ /\[tas\]/
 | 
			
		||||
#      install: travis_retry travis_wait 40 env REQUIRES_LOCAL_IMAGES=true bash scripts/travis/build.sh
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - ${TAS_SCRIPTS}/start-compose.sh ${TAS_ENVIRONMENT}/docker-compose-minimal+transforms.yml
 | 
			
		||||
#        - ${TAS_SCRIPTS}/wait-for-alfresco-start.sh "http://localhost:8082/alfresco"
 | 
			
		||||
#      script: travis_wait 40 mvn -B verify -f packaging/tests/tas-cmis/pom.xml -Pall-tas-tests,run-cmis-browser -Denvironment=default -DrunBugs=false
 | 
			
		||||
#
 | 
			
		||||
#    - name: "CMIS TAS tests - ATOM binding"
 | 
			
		||||
#      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip tas\]/) OR commit_message =~ /\[tas\]/
 | 
			
		||||
#      install: travis_retry travis_wait 40 env REQUIRES_LOCAL_IMAGES=true bash scripts/travis/build.sh
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - ${TAS_SCRIPTS}/start-compose.sh ${TAS_ENVIRONMENT}/docker-compose-minimal+transforms.yml
 | 
			
		||||
#        - ${TAS_SCRIPTS}/wait-for-alfresco-start.sh "http://localhost:8082/alfresco"
 | 
			
		||||
#      script: travis_wait 40 mvn -B verify -f packaging/tests/tas-cmis/pom.xml -Pall-tas-tests,run-cmis-atom -Denvironment=default -DrunBugs=false
 | 
			
		||||
#
 | 
			
		||||
#    - name: "CMIS TAS tests - WEBSERVICES binding"
 | 
			
		||||
#      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip tas\]/) OR commit_message =~ /\[tas\]/
 | 
			
		||||
#      install: travis_retry travis_wait 40 env REQUIRES_LOCAL_IMAGES=true bash scripts/travis/build.sh
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - ${TAS_SCRIPTS}/start-compose.sh ${TAS_ENVIRONMENT}/docker-compose-minimal+transforms.yml
 | 
			
		||||
#        - ${TAS_SCRIPTS}/wait-for-alfresco-start.sh "http://localhost:8082/alfresco"
 | 
			
		||||
#      script: travis_wait 40 mvn -B verify -f packaging/tests/tas-cmis/pom.xml -Pall-tas-tests,run-cmis-webservices -Denvironment=default -DrunBugs=false
 | 
			
		||||
#
 | 
			
		||||
#    - name: "Email TAS tests"
 | 
			
		||||
#      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip tas\]/) OR commit_message =~ /\[tas\]/
 | 
			
		||||
#      install: travis_retry travis_wait 40 env REQUIRES_LOCAL_IMAGES=true bash scripts/travis/build.sh
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - ${TAS_SCRIPTS}/start-compose.sh ${TAS_ENVIRONMENT}/docker-compose-minimal.yml
 | 
			
		||||
#        - ${TAS_SCRIPTS}/wait-for-alfresco-start.sh "http://localhost:8082/alfresco"
 | 
			
		||||
#      script: travis_wait 30 mvn -B verify -f packaging/tests/tas-email/pom.xml -Pall-tas-tests -Denvironment=default -DrunBugs=false
 | 
			
		||||
#
 | 
			
		||||
#    - name: "WebDAV TAS tests"
 | 
			
		||||
#      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip tas\]/) OR commit_message =~ /\[tas\]/
 | 
			
		||||
#      install: travis_retry travis_wait 40 env REQUIRES_LOCAL_IMAGES=true bash scripts/travis/build.sh
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - ${TAS_SCRIPTS}/start-compose.sh ${TAS_ENVIRONMENT}/docker-compose-minimal.yml
 | 
			
		||||
#        - ${TAS_SCRIPTS}/wait-for-alfresco-start.sh "http://localhost:8082/alfresco"
 | 
			
		||||
#      script: travis_wait 30 mvn -B verify -f packaging/tests/tas-webdav/pom.xml -Pall-tas-tests -Denvironment=default -DrunBugs=false
 | 
			
		||||
#
 | 
			
		||||
#    - name: "Integration TAS tests"
 | 
			
		||||
#      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip tas\]/) OR commit_message =~ /\[tas\]/
 | 
			
		||||
#      install: travis_retry travis_wait 40 env REQUIRES_LOCAL_IMAGES=true bash scripts/travis/build.sh
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - ${TAS_SCRIPTS}/start-compose.sh ${TAS_ENVIRONMENT}/docker-compose-minimal.yml
 | 
			
		||||
#        - ${TAS_SCRIPTS}/wait-for-alfresco-start.sh "http://localhost:8082/alfresco"
 | 
			
		||||
#      script: travis_wait 30 mvn -B verify -f packaging/tests/tas-integration/pom.xml -Pall-tas-tests -Denvironment=default -DrunBugs=false
 | 
			
		||||
#
 | 
			
		||||
#    - name: "Share Services - ShareServicesTestSuite"
 | 
			
		||||
#      if: commit_message !~ /\[skip repo\]/
 | 
			
		||||
#      install: skip
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:14.4 postgres -c 'max_connections=300'
 | 
			
		||||
#      script: travis_wait 20 mvn -B test -pl :alfresco-share-services -am -Dtest=ShareServicesTestSuite -DfailIfNoTests=false -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
 | 
			
		||||
#
 | 
			
		||||
#    - name: "AGS Unit & Integration Tests 01 (PostgreSQL)"
 | 
			
		||||
#      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip ags\]/) OR commit_message =~ /\[ags\]/
 | 
			
		||||
#      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
#      script: travis_retry travis_wait 80 mvn -B verify -Dmaven.javadoc.skip=true -Dmaven.source.skip=true -Pags -Pstart-postgres -PagsAllTestSuitePt1 -f amps/ags/pom.xml ${LOG_WARN}
 | 
			
		||||
#
 | 
			
		||||
#    - name: "AGS        Integration Tests 02 (PostgreSQL)"
 | 
			
		||||
#      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip ags\]/) OR commit_message =~ /\[ags\]/
 | 
			
		||||
#      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
#      script: travis_retry travis_wait 80 mvn -B verify -Dmaven.javadoc.skip=true -Dmaven.source.skip=true -Pags -Pstart-postgres -PagsAllTestSuitePt2 -f amps/ags/pom.xml ${LOG_WARN}
 | 
			
		||||
#
 | 
			
		||||
#    - name: "AGS        Integration Tests 03 (PostgreSQL)"
 | 
			
		||||
#      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip ags\]/) OR commit_message =~ /\[ags\]/
 | 
			
		||||
#      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
#      script: travis_retry travis_wait 80 mvn -B verify -Dmaven.javadoc.skip=true -Dmaven.source.skip=true -Pags -Pstart-postgres -PagsAllTestSuitePt3 -f amps/ags/pom.xml ${LOG_WARN}
 | 
			
		||||
#
 | 
			
		||||
#    - name: "AGS Unit & Integration Tests 04 (PostgreSQL)"
 | 
			
		||||
#      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip ags\]/) OR commit_message =~ /\[ags\]/
 | 
			
		||||
#      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
#      script: travis_retry travis_wait 80 mvn -B verify -Dmaven.javadoc.skip=true -Dmaven.source.skip=true -Pags -Pstart-postgres -PagsAllTestSuitePt4 -f amps/ags/pom.xml ${LOG_WARN}
 | 
			
		||||
#
 | 
			
		||||
#    - name: "AGS Unit & Integration Tests 01 (MySQL) "
 | 
			
		||||
#      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip ags\]/) OR commit_message =~ /\[ags on MySQL\]/
 | 
			
		||||
#      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
#      script: travis_retry travis_wait 80 mvn -B verify -Dmaven.javadoc.skip=true -Dmaven.source.skip=true -Pags -Pstart-mysql    -PagsAllTestSuitePt1 -f amps/ags/pom.xml ${LOG_WARN}
 | 
			
		||||
#
 | 
			
		||||
#    - name: "AGS        Integration Tests 02 (MySQL) "
 | 
			
		||||
#      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip ags\]/) OR commit_message =~ /\[ags on MySQL\]/
 | 
			
		||||
#      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
#      script: travis_retry travis_wait 80 mvn -B verify -Dmaven.javadoc.skip=true -Dmaven.source.skip=true -Pags -Pstart-mysql    -PagsAllTestSuitePt2 -f amps/ags/pom.xml ${LOG_WARN}
 | 
			
		||||
#
 | 
			
		||||
#    - name: "AGS        Integration Tests 03 (MySQL) "
 | 
			
		||||
#      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip ags\]/) OR commit_message =~ /\[ags\]/
 | 
			
		||||
#      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
#      script: travis_retry travis_wait 80 mvn -B verify -Dmaven.javadoc.skip=true -Dmaven.source.skip=true -Pags -Pstart-mysql    -PagsAllTestSuitePt3 -f amps/ags/pom.xml ${LOG_WARN}
 | 
			
		||||
#
 | 
			
		||||
#    - name: "AGS Unit & Integration Tests 04 (MySQL) "
 | 
			
		||||
#      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip ags\]/) OR commit_message =~ /\[ags on MySQL\]/
 | 
			
		||||
#      install: travis_retry travis_wait 40 env REQUIRES_INSTALLED_ARTIFACTS=true bash scripts/travis/build.sh
 | 
			
		||||
#      script: travis_retry travis_wait 80 mvn -B verify -Dmaven.javadoc.skip=true -Dmaven.source.skip=true -Pags -Pstart-mysql    -PagsAllTestSuitePt4 -f amps/ags/pom.xml ${LOG_WARN}
 | 
			
		||||
#
 | 
			
		||||
#    - name: "AGS Community Rest API Tests"
 | 
			
		||||
#      if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip ags\]/) OR commit_message =~ /\[ags\]/
 | 
			
		||||
#      install: travis_retry travis_wait 40 env REQUIRES_LOCAL_IMAGES=true bash scripts/travis/build.sh
 | 
			
		||||
#      addons:
 | 
			
		||||
#        artifacts:
 | 
			
		||||
#          paths:
 | 
			
		||||
#            - ./amps/ags/rm-automation/rm-automation-community-rest-api/target/reports/rm-automation-community-rest-api.log
 | 
			
		||||
#            - alfresco.log
 | 
			
		||||
#            - solr.log
 | 
			
		||||
#          target_paths: community/${TRAVIS_BUILD_NUMBER}/${TRAVIS_JOB_NAME}
 | 
			
		||||
#      before_script:
 | 
			
		||||
#        - ${TAS_SCRIPTS}/start-compose.sh ./amps/ags/rm-community/rm-community-repo/docker-compose.yml
 | 
			
		||||
#        - ${TAS_SCRIPTS}/wait-for-alfresco-start.sh "http://localhost:8080/alfresco"
 | 
			
		||||
#      script: travis_wait 40 mvn -B test -pl :alfresco-governance-services-automation-community-rest-api -am -DfailIfNoTests=false -Dskip.automationtests=false -Pags
 | 
			
		||||
#      after_script: bash amps/ags/travis/scripts/getLogs.sh
 | 
			
		||||
 | 
			
		||||
    - name: "Push to Nexus"
 | 
			
		||||
      stage: release
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
   <parent>
 | 
			
		||||
      <groupId>org.alfresco</groupId>
 | 
			
		||||
      <artifactId>alfresco-community-repo-amps</artifactId>
 | 
			
		||||
      <version>17.113</version>
 | 
			
		||||
      <version>17.75-SNAPSHOT</version>
 | 
			
		||||
   </parent>
 | 
			
		||||
 | 
			
		||||
   <modules>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
   <parent>
 | 
			
		||||
      <groupId>org.alfresco</groupId>
 | 
			
		||||
      <artifactId>alfresco-governance-services-community-parent</artifactId>
 | 
			
		||||
      <version>17.113</version>
 | 
			
		||||
      <version>17.75-SNAPSHOT</version>
 | 
			
		||||
   </parent>
 | 
			
		||||
 | 
			
		||||
   <modules>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
   <parent>
 | 
			
		||||
      <groupId>org.alfresco</groupId>
 | 
			
		||||
      <artifactId>alfresco-governance-services-automation-community-repo</artifactId>
 | 
			
		||||
      <version>17.113</version>
 | 
			
		||||
      <version>17.75-SNAPSHOT</version>
 | 
			
		||||
   </parent>
 | 
			
		||||
 | 
			
		||||
   <build>
 | 
			
		||||
@@ -45,7 +45,7 @@
 | 
			
		||||
      <dependency>
 | 
			
		||||
         <groupId>org.slf4j</groupId>
 | 
			
		||||
         <artifactId>slf4j-reload4j</artifactId>
 | 
			
		||||
         <version>${dependency.slf4j.version}</version>
 | 
			
		||||
         <version>1.7.35</version>
 | 
			
		||||
         <scope>test</scope>
 | 
			
		||||
      </dependency>
 | 
			
		||||
      <dependency>
 | 
			
		||||
 
 | 
			
		||||
@@ -74,27 +74,4 @@ public class RecordFoldersAPI extends BaseAPI
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public HttpResponse postFolderAction(String user, String password, JSONObject requestParams, String recordFolder) {
 | 
			
		||||
        String recNodeRef = getNodeRefSpacesStore() + contentService.getNodeRef(user, password, RM_SITE_ID, recordFolder);
 | 
			
		||||
        try {
 | 
			
		||||
            requestParams.put("nodeRef", recNodeRef);
 | 
			
		||||
            return doPostJsonRequest(user, password, SC_OK, requestParams, RM_ACTIONS_API);
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception error) {
 | 
			
		||||
            LOGGER.error("Unable to extract response parameter", error);
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public HttpResponse postRecordAction(String user, String password, JSONObject requestParams, String recordId) {
 | 
			
		||||
        try {
 | 
			
		||||
            requestParams.put("nodeRef", recordId);
 | 
			
		||||
            return doPostJsonRequest(user, password, SC_OK, requestParams, RM_ACTIONS_API);
 | 
			
		||||
        }
 | 
			
		||||
        catch (JSONException error) {
 | 
			
		||||
            LOGGER.error("Unable to extract response parameter", error);
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -53,12 +53,9 @@ import static org.springframework.http.HttpStatus.OK;
 | 
			
		||||
import static org.testng.Assert.assertFalse;
 | 
			
		||||
import static org.testng.Assert.assertTrue;
 | 
			
		||||
 | 
			
		||||
import java.text.SimpleDateFormat;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
import java.util.TimeZone;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
import lombok.Getter;
 | 
			
		||||
@@ -94,7 +91,6 @@ import org.alfresco.utility.model.FileModel;
 | 
			
		||||
import org.alfresco.utility.model.FolderModel;
 | 
			
		||||
import org.alfresco.utility.model.SiteModel;
 | 
			
		||||
import org.alfresco.utility.model.UserModel;
 | 
			
		||||
import org.json.JSONObject;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.http.HttpStatus;
 | 
			
		||||
import org.testng.annotations.BeforeClass;
 | 
			
		||||
@@ -125,8 +121,6 @@ public class BaseRMRestTest extends RestTest
 | 
			
		||||
    @Getter(value = PROTECTED)
 | 
			
		||||
    private SearchAPI searchApi;
 | 
			
		||||
 | 
			
		||||
    protected static final String iso8601_DateFormat="yyyy-MM-dd'T'HH:mm:ss.SSSXXX";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Asserts the given status code
 | 
			
		||||
     *
 | 
			
		||||
@@ -634,8 +628,8 @@ public class BaseRMRestTest extends RestTest
 | 
			
		||||
     * Returns search results for the given search term
 | 
			
		||||
     *
 | 
			
		||||
     * @param user
 | 
			
		||||
     * @param q
 | 
			
		||||
     * @param queryLanguage language
 | 
			
		||||
     * @param term
 | 
			
		||||
     * @param query language
 | 
			
		||||
     * @return
 | 
			
		||||
     * @throws Exception
 | 
			
		||||
     */
 | 
			
		||||
@@ -962,34 +956,5 @@ public class BaseRMRestTest extends RestTest
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Helper method to get the Previous Date in the YYYY-MM-ddTHH:mm:ss.SSSXXX format
 | 
			
		||||
     * @param previousDays number of previous days while calculating the date as output
 | 
			
		||||
     * @return previousDate as String in the ISO 8601 Date Format
 | 
			
		||||
     */
 | 
			
		||||
    protected String getIso8601Date(int previousDays) {
 | 
			
		||||
        Date date = new Date(System.currentTimeMillis());
 | 
			
		||||
        Date previousDate = new Date(date.getTime() - previousDays);
 | 
			
		||||
        // Conversion
 | 
			
		||||
        SimpleDateFormat sdf= new SimpleDateFormat(iso8601_DateFormat);;
 | 
			
		||||
        sdf.setTimeZone(TimeZone.getDefault());
 | 
			
		||||
        return sdf.format(previousDate);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Helper method to provide the Edited Disposition Date Json
 | 
			
		||||
     * The Edited Disposition Date is modified to previous date so that CUTOFF & DESTROY Steps will be enabled
 | 
			
		||||
     * @return JsonObject with the format {"name":"editDispositionActionAsOfDate","params":{"asOfDate":{"iso8601":"Previous Date"}}}
 | 
			
		||||
     */
 | 
			
		||||
    protected JSONObject editDispositionDateJson() {
 | 
			
		||||
        JSONObject requestParams = new JSONObject();
 | 
			
		||||
 | 
			
		||||
        requestParams.put("name","editDispositionActionAsOfDate");
 | 
			
		||||
        JSONObject params = new JSONObject();
 | 
			
		||||
        requestParams.put("params",params);
 | 
			
		||||
 | 
			
		||||
        JSONObject asOfDate = new JSONObject();
 | 
			
		||||
        params.put("asOfDate",asOfDate);
 | 
			
		||||
        asOfDate.put("iso8601",getIso8601Date(1));
 | 
			
		||||
        return requestParams;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,211 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Records Management Module
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.rm.community.smoke;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.dataprep.CMISUtil;
 | 
			
		||||
import org.alfresco.rest.core.v0.BaseAPI;
 | 
			
		||||
import org.alfresco.rest.rm.community.base.BaseRMRestTest;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.audit.AuditEntry;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.recordcategory.RecordCategory;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.recordcategory.RecordCategoryChild;
 | 
			
		||||
import org.alfresco.rest.v0.RMRolesAndActionsAPI;
 | 
			
		||||
import org.alfresco.rest.v0.RecordsAPI;
 | 
			
		||||
import org.alfresco.rest.v0.service.RMAuditService;
 | 
			
		||||
import org.alfresco.test.AlfrescoTest;
 | 
			
		||||
import org.alfresco.utility.model.UserModel;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
import static org.alfresco.rest.core.v0.BaseAPI.NODE_PREFIX;
 | 
			
		||||
import static org.alfresco.rest.core.v0.BaseAPI.RM_SITE_ID;
 | 
			
		||||
import static org.alfresco.rest.rm.community.model.audit.AuditEvents.DELETE_PERSON;
 | 
			
		||||
import static org.alfresco.rest.rm.community.model.audit.AuditEvents.LOGIN_SUCCESSFUL;
 | 
			
		||||
import static org.alfresco.rest.rm.community.records.SearchRecordsTests.*;
 | 
			
		||||
import static org.alfresco.rest.rm.community.util.CommonTestUtils.generateTestPrefix;
 | 
			
		||||
import static org.junit.Assert.assertFalse;
 | 
			
		||||
import static org.testng.AssertJUnit.assertTrue;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Audit Access tests
 | 
			
		||||
 * @author Kavit Shah
 | 
			
		||||
 */
 | 
			
		||||
public class AuditAccessTests extends BaseRMRestTest {
 | 
			
		||||
 | 
			
		||||
    private Optional<UserModel> deletedUser;
 | 
			
		||||
    private final String TEST_PREFIX = generateTestPrefix(AuditAccessTests.class);
 | 
			
		||||
    private static final String DELETE_USER_EVENT = "Delete User";
 | 
			
		||||
    private final String record1 = TEST_PREFIX + "RM-2967 uploaded record";
 | 
			
		||||
    private final String classifiedRecord = TEST_PREFIX + "RM-2967 classified record";
 | 
			
		||||
    private final String folderName = TEST_PREFIX + "RM-2967 folder";
 | 
			
		||||
    private final String categoryName = TEST_PREFIX + "RM-2967 category";
 | 
			
		||||
    private final String editedCategoryName = "edited " + categoryName;
 | 
			
		||||
    private final String editedFolderName = "edited " + folderName;
 | 
			
		||||
    private final String editedRecordName = "edited " + record1;
 | 
			
		||||
    private final String login_successfull = "Login Successful";
 | 
			
		||||
    private RecordCategory categoryAll;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RMRolesAndActionsAPI rmRolesAndActionsAPI;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RecordsAPI recordsAPI;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RMAuditService rmAuditService;
 | 
			
		||||
 | 
			
		||||
    @Test(priority = 1)
 | 
			
		||||
    @AlfrescoTest(jira = "RM-2967")
 | 
			
		||||
    public void deleteRMUsersShowFullAuditTest() {
 | 
			
		||||
 | 
			
		||||
        createTestPrecondition();
 | 
			
		||||
        updateCategoryMetadata();
 | 
			
		||||
        updateFolderMetadata();
 | 
			
		||||
        updateRecordMetadata();
 | 
			
		||||
 | 
			
		||||
        // delete record category and folder with rm_admin_deleted
 | 
			
		||||
        rmRolesAndActionsAPI.deleteAllItemsInContainer(deletedUser.get().getUsername(), deletedUser.get().getPassword(),
 | 
			
		||||
            RM_SITE_ID, editedFolderName);
 | 
			
		||||
        rmRolesAndActionsAPI.deleteAllItemsInContainer(deletedUser.get().getUsername(), deletedUser.get().getPassword(),
 | 
			
		||||
            RM_SITE_ID, editedCategoryName);
 | 
			
		||||
 | 
			
		||||
        // delete the user
 | 
			
		||||
        Optional.of(deletedUser).ifPresent(x -> getDataUser().deleteUser(x.get()));
 | 
			
		||||
 | 
			
		||||
        //check for RM-5235 fix
 | 
			
		||||
        List<AuditEntry> auditEntries = rmAuditService.getAuditEntriesFilteredByEvent(getDataUser().usingAdmin().getAdminUser(),
 | 
			
		||||
            DELETE_PERSON);
 | 
			
		||||
 | 
			
		||||
        assertTrue("Delete user event not found in the audit log.", auditEntries.stream().anyMatch(
 | 
			
		||||
            auditEntry -> auditEntry.getEvent().equals(DELETE_USER_EVENT)));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @Test(priority = 2)
 | 
			
		||||
    public void filterEventsByLoginSuccessful()
 | 
			
		||||
    {
 | 
			
		||||
        createRMSiteIfNotExists();
 | 
			
		||||
        List<AuditEntry> auditEntries = rmAuditService.getAuditEntriesFilteredByEvent(getDataUser().usingAdmin().getAdminUser(),
 | 
			
		||||
            LOGIN_SUCCESSFUL);
 | 
			
		||||
 | 
			
		||||
        assertFalse("Audit results should contain at least one Login Successful event",
 | 
			
		||||
            auditEntries.isEmpty());
 | 
			
		||||
 | 
			
		||||
        assertTrue("Audit results contain only Login Successful events",
 | 
			
		||||
            auditEntries.stream()
 | 
			
		||||
                .allMatch(e -> e.getEvent().startsWith(LOGIN_SUCCESSFUL.toString()) || e.getEvent().startsWith(login_successfull)));
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates the required precondition for the test
 | 
			
		||||
     * <p/>
 | 
			
		||||
     * See Precondition in current class JavaDoc
 | 
			
		||||
     */
 | 
			
		||||
    private void createTestPrecondition() {
 | 
			
		||||
        createRMSiteIfNotExists();
 | 
			
		||||
 | 
			
		||||
        // create "rm deleted user" user if it does not exist and assign it to RM Administrator role
 | 
			
		||||
        createDeletedUser();
 | 
			
		||||
 | 
			
		||||
        // create category and folder
 | 
			
		||||
        categoryAll = createCategoryIfDoesNotExist(categoryName,deletedUser.get());
 | 
			
		||||
        createRecordFolderInCategory(folderName,categoryAll,deletedUser.get());
 | 
			
		||||
        // upload an electronic record
 | 
			
		||||
 | 
			
		||||
        recordsAPI.uploadElectronicRecord(deletedUser.get().getUsername(), deletedUser.get().getPassword(), getDefaultElectronicRecordProperties(record1), folderName, CMISUtil.DocumentType.TEXT_PLAIN);
 | 
			
		||||
        // upload another electronic record and classify it
 | 
			
		||||
        recordsAPI.uploadElectronicRecord(deletedUser.get().getUsername(), deletedUser.get().getPassword(), getDefaultElectronicRecordProperties(classifiedRecord), folderName, CMISUtil.DocumentType.TEXT_PLAIN);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void createDeletedUser() {
 | 
			
		||||
        // create Deleted User
 | 
			
		||||
        deletedUser = Optional.ofNullable(getDataUser().createRandomTestUser());
 | 
			
		||||
        rmRolesAndActionsAPI.assignRoleToUser(
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(),
 | 
			
		||||
            deletedUser.get().getUsername(),
 | 
			
		||||
            ADMIN
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void updateCategoryMetadata() {
 | 
			
		||||
        HashMap<BaseAPI.RMProperty, String> categoryProperties = new HashMap<>();
 | 
			
		||||
        categoryProperties.put(BaseAPI.RMProperty.NAME, editedCategoryName);
 | 
			
		||||
        categoryProperties.put(BaseAPI.RMProperty.TITLE, "edited " + TITLE);
 | 
			
		||||
        categoryProperties.put(BaseAPI.RMProperty.DESCRIPTION, "edited " + DESCRIPTION);
 | 
			
		||||
 | 
			
		||||
        // edit some category's properties
 | 
			
		||||
        String categoryNodeRef = NODE_PREFIX + rmRolesAndActionsAPI.getItemNodeRef(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(), "/" +  categoryName);
 | 
			
		||||
        rmRolesAndActionsAPI.updateMetadata(deletedUser.get().getUsername(), deletedUser.get().getPassword(), categoryNodeRef, categoryProperties);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void updateFolderMetadata() {
 | 
			
		||||
        HashMap<BaseAPI.RMProperty, String> folderProperties = new HashMap<>();
 | 
			
		||||
        folderProperties.put(BaseAPI.RMProperty.NAME, editedFolderName);
 | 
			
		||||
        folderProperties.put(BaseAPI.RMProperty.TITLE, "edited " + TITLE);
 | 
			
		||||
        folderProperties.put(BaseAPI.RMProperty.DESCRIPTION, "edited " + DESCRIPTION);
 | 
			
		||||
 | 
			
		||||
        // edit some folder's properties
 | 
			
		||||
        String folderNodeRef = NODE_PREFIX + rmRolesAndActionsAPI.getItemNodeRef(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(), "/" + editedCategoryName + "/" +  folderName);
 | 
			
		||||
        rmRolesAndActionsAPI.updateMetadata(deletedUser.get().getUsername(), deletedUser.get().getPassword(), folderNodeRef, folderProperties);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void updateRecordMetadata() {
 | 
			
		||||
        HashMap<BaseAPI.RMProperty, String> recordProperties = new HashMap<>();
 | 
			
		||||
        recordProperties.put(BaseAPI.RMProperty.NAME, editedRecordName);
 | 
			
		||||
        recordProperties.put(BaseAPI.RMProperty.TITLE, "edited " + TITLE);
 | 
			
		||||
        recordProperties.put(BaseAPI.RMProperty.AUTHOR, "edited author");
 | 
			
		||||
        recordProperties.put(BaseAPI.RMProperty.DESCRIPTION, "edited " + DESCRIPTION);
 | 
			
		||||
 | 
			
		||||
        // edit some record's properties
 | 
			
		||||
        String recordName = recordsAPI.getRecordFullName(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(), editedFolderName, record1);
 | 
			
		||||
        String recordNodeRef = NODE_PREFIX + rmRolesAndActionsAPI.getItemNodeRef(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(), "/" + editedCategoryName + "/" + editedFolderName + "/" + recordName);
 | 
			
		||||
        rmRolesAndActionsAPI.updateMetadata(deletedUser.get().getUsername(), deletedUser.get().getPassword(), recordNodeRef, recordProperties);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private RecordCategory createCategoryIfDoesNotExist(String CATEGORY_ALL, UserModel deletedUser) {
 | 
			
		||||
        return createRootCategory(deletedUser, CATEGORY_ALL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private RecordCategoryChild createRecordFolderInCategory(String FOLDER_SEARCH, RecordCategory recordCategory, UserModel deletedUser) {
 | 
			
		||||
        return createFolder(deletedUser, recordCategory.getId(), FOLDER_SEARCH);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private Map<BaseAPI.RMProperty, String> getDefaultElectronicRecordProperties(String recordName) {
 | 
			
		||||
        Map<BaseAPI.RMProperty, String> defaultProperties = new HashMap<>();
 | 
			
		||||
        defaultProperties.put(BaseAPI.RMProperty.NAME, recordName);
 | 
			
		||||
        defaultProperties.put(BaseAPI.RMProperty.TITLE, TITLE);
 | 
			
		||||
        defaultProperties.put(BaseAPI.RMProperty.DESCRIPTION, DESCRIPTION);
 | 
			
		||||
        defaultProperties.put(BaseAPI.RMProperty.CONTENT, TEST_CONTENT);
 | 
			
		||||
        return defaultProperties;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,104 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Records Management Module
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.rm.community.smoke;
 | 
			
		||||
import org.alfresco.rest.rm.community.base.BaseRMRestTest;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.record.Record;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.recordcategory.RecordCategory;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.rules.ActionsOnRule;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.rules.RuleDefinition;
 | 
			
		||||
import org.alfresco.rest.rm.community.requests.gscore.api.RecordFolderAPI;
 | 
			
		||||
import org.alfresco.rest.v0.RMRolesAndActionsAPI;
 | 
			
		||||
import org.alfresco.rest.v0.RulesAPI;
 | 
			
		||||
import org.alfresco.test.AlfrescoTest;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import static org.alfresco.rest.core.v0.BaseAPI.NODE_PREFIX;
 | 
			
		||||
import static org.alfresco.rest.rm.community.base.TestData.ELECTRONIC_RECORD_NAME;
 | 
			
		||||
import static org.alfresco.rest.rm.community.base.TestData.NONELECTRONIC_RECORD_NAME;
 | 
			
		||||
import static org.alfresco.rest.rm.community.util.CommonTestUtils.generateTestPrefix;
 | 
			
		||||
import static org.alfresco.rest.rm.community.utils.FilePlanComponentsUtil.*;
 | 
			
		||||
import static org.alfresco.utility.data.RandomData.getRandomName;
 | 
			
		||||
import static org.alfresco.utility.report.log.Step.STEP;
 | 
			
		||||
import static org.springframework.http.HttpStatus.*;
 | 
			
		||||
public class BasicRulesIntegrationTests extends BaseRMRestTest {
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RMRolesAndActionsAPI rmRolesAndActionsAPI;
 | 
			
		||||
    private final static String title = "Rule to complete";
 | 
			
		||||
    private final static String description = "Rule to describe";
 | 
			
		||||
    private final String TEST_PREFIX = generateTestPrefix(CreateCategoriesTests.class);
 | 
			
		||||
    private final String RM_ADMIN = TEST_PREFIX + "rm_admin";
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RulesAPI rulesAPI;
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    @AlfrescoTest(jira = "RM-2794")
 | 
			
		||||
    public void basicRulesIntegration() {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        STEP("Create the RM site if doesn't exist");
 | 
			
		||||
        createRMSiteIfNotExists();
 | 
			
		||||
 | 
			
		||||
        STEP("Create RM Admin user");
 | 
			
		||||
        rmRolesAndActionsAPI.createUserAndAssignToRole(getAdminUser().getUsername(), getAdminUser().getPassword(), RM_ADMIN,
 | 
			
		||||
            getAdminUser().getPassword(),
 | 
			
		||||
            "Administrator");
 | 
			
		||||
 | 
			
		||||
        STEP("Create record categories and record folders");
 | 
			
		||||
        RecordCategory Category = createRootCategory(getRandomName("recordCategory"));
 | 
			
		||||
        String recordFolder1 = createRecordFolder(Category.getId(), getRandomName("recFolder")).getId();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        //create a rule for completing a record
 | 
			
		||||
        RuleDefinition ruleDefinition = RuleDefinition.createNewRule().title("name").description("description1")
 | 
			
		||||
            .applyToChildren(true).title(title)
 | 
			
		||||
            .actions(Collections.singletonList(ActionsOnRule.COMPLETE_RECORD.getActionValue()));
 | 
			
		||||
        rulesAPI.createRule(getAdminUser().getUsername(), getAdminUser().getPassword(), NODE_PREFIX + Category.getId(), ruleDefinition);
 | 
			
		||||
 | 
			
		||||
        RecordFolderAPI recordFolderAPI = getRestAPIFactory().getRecordFolderAPI();
 | 
			
		||||
 | 
			
		||||
        //create two electronic record in record folder
 | 
			
		||||
        String electronicRecordId1 = createElectronicRecord(recordFolder1, ELECTRONIC_RECORD_NAME).getId();
 | 
			
		||||
        String electronicRecordId2 = createElectronicRecord(recordFolder1, ELECTRONIC_RECORD_NAME).getId();
 | 
			
		||||
        assertStatusCode(CREATED);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // Update the rules for record Category
 | 
			
		||||
        rulesAPI.updateRule(getAdminUser().getUsername(), getAdminUser().getPassword(),
 | 
			
		||||
            NODE_PREFIX + Category.getId(), ruleDefinition.description("description").id(description));
 | 
			
		||||
 | 
			
		||||
        //Delete the root category and rules
 | 
			
		||||
        deleteRecordCategory(Category.getId());
 | 
			
		||||
        rulesAPI.deleteAllRulesOnContainer(getAdminUser().getUsername(), getAdminUser().getPassword(), NODE_PREFIX + Category.getId());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,125 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Records Management Module
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.rm.community.smoke;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.rm.community.base.BaseRMRestTest;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.fileplan.FilePlan;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.recordcategory.RecordCategory;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.recordcategory.RecordCategoryChild;
 | 
			
		||||
import org.alfresco.rest.v0.RMRolesAndActionsAPI;
 | 
			
		||||
import org.alfresco.test.AlfrescoTest;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.testng.annotations.BeforeClass;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentAlias.FILE_PLAN_ALIAS;
 | 
			
		||||
import static org.alfresco.rest.rm.community.util.CommonTestUtils.generateTestPrefix;
 | 
			
		||||
import static org.alfresco.rest.rm.community.utils.CoreUtil.createBodyForMoveCopy;
 | 
			
		||||
import static org.alfresco.rest.rm.community.utils.CoreUtil.toContentModel;
 | 
			
		||||
import static org.alfresco.utility.data.RandomData.getRandomAlphanumeric;
 | 
			
		||||
import static org.alfresco.utility.data.RandomData.getRandomName;
 | 
			
		||||
import static org.alfresco.utility.report.log.Step.STEP;
 | 
			
		||||
import static org.junit.Assert.assertFalse;
 | 
			
		||||
import static org.springframework.http.HttpStatus.OK;
 | 
			
		||||
import static org.testng.Assert.assertEquals;
 | 
			
		||||
 | 
			
		||||
public class CreateCategoriesTests extends BaseRMRestTest {
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RMRolesAndActionsAPI rmRolesAndActionsAPI;
 | 
			
		||||
    private RecordCategory rootCategory;
 | 
			
		||||
    private final String TEST_PREFIX = generateTestPrefix(CreateCategoriesTests.class);
 | 
			
		||||
    private final String RM_ADMIN = TEST_PREFIX + "rm_admin";
 | 
			
		||||
    private RecordCategory Category1;
 | 
			
		||||
    private RecordCategory Category2;
 | 
			
		||||
    private RecordCategory SubCategory1;
 | 
			
		||||
    private RecordCategory SubCategory2;
 | 
			
		||||
 | 
			
		||||
    @BeforeClass(alwaysRun = true)
 | 
			
		||||
    public void preconditionForCreateCategoriesTests()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Create the RM site if doesn't exist");
 | 
			
		||||
        createRMSiteIfNotExists();
 | 
			
		||||
 | 
			
		||||
        STEP("Create RM Admin user");
 | 
			
		||||
        rmRolesAndActionsAPI.createUserAndAssignToRole(getAdminUser().getUsername(), getAdminUser().getPassword(), RM_ADMIN,
 | 
			
		||||
            getAdminUser().getPassword(),
 | 
			
		||||
            "Administrator");
 | 
			
		||||
 | 
			
		||||
        STEP("Create two category");
 | 
			
		||||
        Category1 = createRootCategory(getRandomName("Category1"));
 | 
			
		||||
 | 
			
		||||
        Category2= createRootCategory(getRandomName("Category2"));
 | 
			
		||||
 | 
			
		||||
        STEP("Create Sub category");
 | 
			
		||||
        RecordCategoryChild subCategory1 = createRecordCategory(Category1.getId(), getRandomName("subCategory1"));
 | 
			
		||||
        RecordCategoryChild subCategory2 = createRecordCategory(Category2.getId(), getRandomName("subCategory2"));
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @Test @AlfrescoTest(jira = "RM-2756")
 | 
			
		||||
    public void createCategories() throws Exception {
 | 
			
		||||
 | 
			
		||||
        FilePlan filePlan = getRestAPIFactory().getFilePlansAPI().getFilePlan(FILE_PLAN_ALIAS);
 | 
			
		||||
 | 
			
		||||
        STEP("copy category 1 to File Plan.");
 | 
			
		||||
        getRestAPIFactory().getNodeAPI(toContentModel(Category1.getId())).copy(createBodyForMoveCopy(filePlan.getId()));
 | 
			
		||||
 | 
			
		||||
        STEP("copy category 1 to category 2");
 | 
			
		||||
        getRestAPIFactory().getNodeAPI(toContentModel(Category1.getId())).copy(createBodyForMoveCopy(Category2.getId()));
 | 
			
		||||
 | 
			
		||||
        String categoryName = "Category name " + getRandomAlphanumeric();
 | 
			
		||||
        String categoryTitle = "Category title " + getRandomAlphanumeric();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // Create the root record category
 | 
			
		||||
        RecordCategory Category1 = createRootCategory(categoryName, categoryTitle);
 | 
			
		||||
 | 
			
		||||
        String newCategoryName = "Rename " + categoryName;
 | 
			
		||||
 | 
			
		||||
        // Build the properties which will be updated
 | 
			
		||||
        RecordCategory  recordCategoryUpdated = Category1.builder().name(newCategoryName).build();
 | 
			
		||||
 | 
			
		||||
        // Update the record category
 | 
			
		||||
        RecordCategory renamedRecordCategory = getRestAPIFactory().getRecordCategoryAPI().updateRecordCategory(recordCategoryUpdated,Category1.getId());
 | 
			
		||||
        // Verify the status code
 | 
			
		||||
        assertStatusCode(OK);
 | 
			
		||||
 | 
			
		||||
        // verify renamed component and editTitle component still has this parent
 | 
			
		||||
        assertEquals(renamedRecordCategory.getParentId(), filePlan.getId());
 | 
			
		||||
 | 
			
		||||
        STEP("move category 1 edited copy to File Plan");
 | 
			
		||||
        getRestAPIFactory().getNodeAPI(toContentModel(renamedRecordCategory.getId())).move(createBodyForMoveCopy(filePlan.getId()));
 | 
			
		||||
        assertStatusCode(OK);
 | 
			
		||||
 | 
			
		||||
        // delete All the categories
 | 
			
		||||
        deleteRecordCategory(Category1.getId());
 | 
			
		||||
        deleteRecordCategory(Category2.getId());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,147 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Records Management Module
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.rm.community.smoke;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.rm.community.base.BaseRMRestTest;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.common.ReviewPeriod;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.recordcategory.RecordCategory;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.recordcategory.RecordCategoryChild;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.recordfolder.RecordFolder;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.recordfolder.RecordFolderProperties;
 | 
			
		||||
import org.alfresco.rest.rm.community.requests.gscore.api.RecordCategoryAPI;
 | 
			
		||||
import org.alfresco.rest.rm.community.requests.gscore.api.RecordFolderAPI;
 | 
			
		||||
import org.alfresco.rest.v0.RMRolesAndActionsAPI;
 | 
			
		||||
import org.alfresco.test.AlfrescoTest;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.testng.annotations.BeforeClass;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.rest.rm.community.util.CommonTestUtils.generateTestPrefix;
 | 
			
		||||
import static org.alfresco.rest.rm.community.utils.CoreUtil.createBodyForMoveCopy;
 | 
			
		||||
import static org.alfresco.rest.rm.community.utils.CoreUtil.toContentModel;
 | 
			
		||||
import static org.alfresco.utility.data.RandomData.getRandomAlphanumeric;
 | 
			
		||||
import static org.alfresco.utility.data.RandomData.getRandomName;
 | 
			
		||||
import static org.alfresco.utility.report.log.Step.STEP;
 | 
			
		||||
import static org.springframework.http.HttpStatus.*;
 | 
			
		||||
 | 
			
		||||
public class CreateFoldersTests extends BaseRMRestTest {
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RMRolesAndActionsAPI rmRolesAndActionsAPI;
 | 
			
		||||
 | 
			
		||||
    private final String TEST_PREFIX = generateTestPrefix(CreateCategoriesTests.class);
 | 
			
		||||
    private final String RM_ADMIN = TEST_PREFIX + "rm_admin";
 | 
			
		||||
    private RecordCategory Category1;
 | 
			
		||||
    private RecordCategory Category2;
 | 
			
		||||
    private RecordCategoryChild recordCategoryChild;
 | 
			
		||||
 | 
			
		||||
    @BeforeClass(alwaysRun = true)
 | 
			
		||||
    public void preconditionForCreateFolderTests() {
 | 
			
		||||
        STEP("Create the RM site if doesn't exist");
 | 
			
		||||
        createRMSiteIfNotExists();
 | 
			
		||||
 | 
			
		||||
        STEP("Create RM Admin user");
 | 
			
		||||
        rmRolesAndActionsAPI.createUserAndAssignToRole(getAdminUser().getUsername(), getAdminUser().getPassword(), RM_ADMIN,
 | 
			
		||||
            getAdminUser().getPassword(),
 | 
			
		||||
            "Administrator");
 | 
			
		||||
 | 
			
		||||
        STEP("Create two category");
 | 
			
		||||
        Category1 = createRootCategory(getRandomName("Category1"));
 | 
			
		||||
 | 
			
		||||
        Category2 = createRootCategory(getRandomName("Category2"));
 | 
			
		||||
 | 
			
		||||
        // Create a record folder inside the category 1
 | 
			
		||||
        recordCategoryChild = createRecordFolder(Category1.getId(), getRandomName("recFolder"));
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    @AlfrescoTest(jira = "RM-2757")
 | 
			
		||||
    public void createFolders() throws Exception {
 | 
			
		||||
 | 
			
		||||
        // Create record category first
 | 
			
		||||
        String folderDescription = "The folder description is updated" + getRandomAlphanumeric();
 | 
			
		||||
        String folderName = "The folder name is updated" + getRandomAlphanumeric();
 | 
			
		||||
        String folderTitle = "Update title " + getRandomAlphanumeric();
 | 
			
		||||
        String location = "Location "+ getRandomAlphanumeric();
 | 
			
		||||
 | 
			
		||||
        // Create the record folder properties to update
 | 
			
		||||
        RecordFolder recordFolder = RecordFolder.builder()
 | 
			
		||||
            .name(folderName)
 | 
			
		||||
            .properties(RecordFolderProperties.builder()
 | 
			
		||||
                .title(folderTitle)
 | 
			
		||||
                .description(folderDescription)
 | 
			
		||||
                .vitalRecordIndicator(true)
 | 
			
		||||
                .reviewPeriod(new ReviewPeriod("month","1"))
 | 
			
		||||
                .location(location)
 | 
			
		||||
                .build())
 | 
			
		||||
            .build();
 | 
			
		||||
 | 
			
		||||
        // Update the record folder
 | 
			
		||||
        RecordFolder updatedRecordFolder = getRestAPIFactory().getRecordFolderAPI().updateRecordFolder(recordFolder, recordCategoryChild.getId());
 | 
			
		||||
 | 
			
		||||
        // Check the Response Status Code
 | 
			
		||||
        assertStatusCode(OK);
 | 
			
		||||
 | 
			
		||||
        STEP("copy updated Record in category 1 and category 2");
 | 
			
		||||
        getRestAPIFactory().getNodeAPI(toContentModel(updatedRecordFolder.getId())).copy(createBodyForMoveCopy(Category1.getId()));
 | 
			
		||||
        //assertStatusCode(OK);
 | 
			
		||||
        getRestAPIFactory().getNodeAPI(toContentModel(updatedRecordFolder.getId())).copy(createBodyForMoveCopy(Category2.getId()));
 | 
			
		||||
        //assertStatusCode(OK);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // Delete the Updated folder
 | 
			
		||||
        RecordFolderAPI recordFolderAPI = getRestAPIFactory().getRecordFolderAPI();
 | 
			
		||||
        String recordFolderId = updatedRecordFolder.getId();
 | 
			
		||||
        recordFolderAPI.deleteRecordFolder(recordFolderId);
 | 
			
		||||
 | 
			
		||||
        // Check the response status code
 | 
			
		||||
        assertStatusCode(NO_CONTENT);
 | 
			
		||||
 | 
			
		||||
        // Check the record folder is not found
 | 
			
		||||
        recordFolderAPI.getRecordFolder(recordFolderId);
 | 
			
		||||
 | 
			
		||||
        // Check the response status code
 | 
			
		||||
        assertStatusCode(NOT_FOUND);
 | 
			
		||||
 | 
			
		||||
        STEP("move updated Record from category 1 to category 2");
 | 
			
		||||
        getRestAPIFactory().getNodeAPI(toContentModel(updatedRecordFolder.getId())).move(createBodyForMoveCopy(Category2.getId()));
 | 
			
		||||
 | 
			
		||||
        // move category 2 to category 1
 | 
			
		||||
        getRestAPIFactory().getNodeAPI(toContentModel(Category2.getId())).move(createBodyForMoveCopy(Category1.getId()));
 | 
			
		||||
 | 
			
		||||
        // Delete the record category
 | 
			
		||||
        RecordCategoryAPI recordCategoryAPI = getRestAPIFactory().getRecordCategoryAPI();
 | 
			
		||||
        String recordCategoryId = Category1.getId();
 | 
			
		||||
        recordCategoryAPI.deleteRecordCategory(recordCategoryId);
 | 
			
		||||
 | 
			
		||||
        // Verify the status code
 | 
			
		||||
        assertStatusCode(NO_CONTENT);
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,122 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Records Management Module
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.rm.community.smoke;
 | 
			
		||||
 | 
			
		||||
import lombok.Getter;
 | 
			
		||||
import org.alfresco.dataprep.CMISUtil;
 | 
			
		||||
import org.alfresco.rest.rm.community.base.BaseRMRestTest;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.recordcategory.RecordCategory;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.recordcategory.RecordCategoryChild;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.rules.ActionsOnRule;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.rules.RuleDefinition;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.unfiledcontainer.UnfiledContainerChildEntry;
 | 
			
		||||
import org.alfresco.rest.rm.community.requests.gscore.api.UnfiledContainerAPI;
 | 
			
		||||
import org.alfresco.rest.v0.RulesAPI;
 | 
			
		||||
import org.alfresco.test.AlfrescoTest;
 | 
			
		||||
import org.alfresco.utility.data.DataContent;
 | 
			
		||||
import org.alfresco.utility.data.DataSite;
 | 
			
		||||
import org.alfresco.utility.data.DataUserAIS;
 | 
			
		||||
import org.alfresco.utility.model.FileModel;
 | 
			
		||||
import org.alfresco.utility.model.FolderModel;
 | 
			
		||||
import org.alfresco.utility.model.SiteModel;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.testng.annotations.BeforeClass;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
import static lombok.AccessLevel.PROTECTED;
 | 
			
		||||
import static org.alfresco.rest.core.v0.BaseAPI.NODE_PREFIX;
 | 
			
		||||
import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentAlias.UNFILED_RECORDS_CONTAINER_ALIAS;
 | 
			
		||||
import static org.alfresco.utility.data.RandomData.getRandomName;
 | 
			
		||||
import static org.alfresco.utility.report.log.Step.STEP;
 | 
			
		||||
import static org.springframework.http.HttpStatus.CREATED;
 | 
			
		||||
 | 
			
		||||
public class DeclareDocsAsRecordsOnUpdateRuleNewVersionTests extends BaseRMRestTest {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private DataSite dataSite;
 | 
			
		||||
    private SiteModel publicSite;
 | 
			
		||||
    private RecordCategory recordCategory;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RulesAPI rulesAPI;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    protected DataContent dataContent;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    @Getter(value = PROTECTED)
 | 
			
		||||
    protected DataUserAIS dataUser;
 | 
			
		||||
    private final static String title = "Rule to convert document as record";
 | 
			
		||||
 | 
			
		||||
    @BeforeClass (alwaysRun = true)
 | 
			
		||||
    public void setUp()
 | 
			
		||||
    {
 | 
			
		||||
        publicSite = dataSite.usingAdmin().createPublicRandomSite();
 | 
			
		||||
        recordCategory = createRootCategory(getRandomName("recordCategory"));
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    @AlfrescoTest(jira = "RM-1521")
 | 
			
		||||
    public void declareDocsAsRecordsOnUpdateRuleNewVersion() {
 | 
			
		||||
        FolderModel testFolder;
 | 
			
		||||
 | 
			
		||||
        STEP("Create test collaboration site to store documents in.");
 | 
			
		||||
        publicSite = dataSite.usingAdmin().createPublicRandomSite();
 | 
			
		||||
 | 
			
		||||
        STEP("Create a record folder with a DECLARE_AS_RECORD");
 | 
			
		||||
        RecordCategoryChild folderWithRule = createFolder(recordCategory.getId(), getRandomName("recordFolder"));
 | 
			
		||||
        RuleDefinition ruleDefinition = RuleDefinition.createNewRule().title("name").description("description")
 | 
			
		||||
            .applyToChildren(true)
 | 
			
		||||
            .actions(Collections.singletonList(ActionsOnRule.DECLARE_AS_RECORD.getActionValue()));
 | 
			
		||||
        rulesAPI.createRule(getAdminUser().getUsername(), getAdminUser().getPassword(), NODE_PREFIX + folderWithRule.getId(), ruleDefinition);
 | 
			
		||||
 | 
			
		||||
        STEP("Create a document in the collaboration site");
 | 
			
		||||
        FileModel testFile = dataContent.usingSite(publicSite)
 | 
			
		||||
            .usingAdmin()
 | 
			
		||||
            .createContent(CMISUtil.DocumentType.TEXT_PLAIN);
 | 
			
		||||
        assertStatusCode(CREATED);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // verify the declared record is in Unfilled Records folder
 | 
			
		||||
        UnfiledContainerAPI unfiledContainersAPI = getRestAPIFactory().getUnfiledContainersAPI();
 | 
			
		||||
        List<UnfiledContainerChildEntry> matchingRecords = unfiledContainersAPI.getUnfiledContainerChildren(UNFILED_RECORDS_CONTAINER_ALIAS)
 | 
			
		||||
            .getEntries()
 | 
			
		||||
            .stream()
 | 
			
		||||
            .filter(e -> e.getEntry().getId().equals(testFile.getNodeRefWithoutVersion()))
 | 
			
		||||
            .collect(Collectors.toList());
 | 
			
		||||
 | 
			
		||||
        //delete rm items
 | 
			
		||||
        deleteRecordCategory(recordCategory.getId());
 | 
			
		||||
        STEP("Delete the record.");
 | 
			
		||||
        //delete created collaboration site
 | 
			
		||||
        dataSite.deleteSite(publicSite);
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,238 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Records Management Module
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.rm.community.smoke;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.dataprep.CMISUtil;
 | 
			
		||||
import org.alfresco.rest.rm.community.base.BaseRMRestTest;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.recordcategory.RecordCategory;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.recordcategory.RecordCategoryChild;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.recordfolder.RecordFolderCollection;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.user.UserRoles;
 | 
			
		||||
import org.alfresco.rest.v0.RecordCategoriesAPI;
 | 
			
		||||
import org.alfresco.rest.v0.service.RoleService;
 | 
			
		||||
import org.alfresco.test.AlfrescoTest;
 | 
			
		||||
import org.alfresco.utility.Utility;
 | 
			
		||||
import org.alfresco.utility.data.DataContent;
 | 
			
		||||
import org.alfresco.utility.data.DataSite;
 | 
			
		||||
import org.alfresco.utility.model.FileModel;
 | 
			
		||||
import org.alfresco.utility.model.FileType;
 | 
			
		||||
import org.alfresco.utility.model.SiteModel;
 | 
			
		||||
import org.alfresco.utility.model.UserModel;
 | 
			
		||||
import org.json.JSONObject;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.testng.Assert;
 | 
			
		||||
import org.testng.annotations.AfterClass;
 | 
			
		||||
import org.testng.annotations.BeforeClass;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
import java.util.concurrent.atomic.AtomicReference;
 | 
			
		||||
import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentAlias.UNFILED_RECORDS_CONTAINER_ALIAS;
 | 
			
		||||
import static org.alfresco.rest.rm.community.model.user.UserPermissions.PERMISSION_FILING;
 | 
			
		||||
import static org.alfresco.rest.rm.community.util.CommonTestUtils.generateTestPrefix;
 | 
			
		||||
import static org.alfresco.rest.rm.community.utils.CoreUtil.toContentModel;
 | 
			
		||||
import static org.alfresco.utility.report.log.Step.STEP;
 | 
			
		||||
import static org.springframework.test.util.AssertionErrors.assertTrue;
 | 
			
		||||
import static org.testng.Assert.*;
 | 
			
		||||
 | 
			
		||||
public class FileAsRecordTests extends BaseRMRestTest {
 | 
			
		||||
 | 
			
		||||
    private static final String CATEGORY_MANAGER = "catManager" + generateTestPrefix(FileAsRecordTests.class);
 | 
			
		||||
    private static final String CATEGORY_ADMIN = "catAdmin" + generateTestPrefix(FileAsRecordTests.class);
 | 
			
		||||
    private static final String FOLDER_MANAGER = "recordFolder" + generateTestPrefix(FileAsRecordTests.class);
 | 
			
		||||
    private static final String FOLDER_ADMIN = "recordFolder" + generateTestPrefix(FileAsRecordTests.class);
 | 
			
		||||
 | 
			
		||||
    private UserModel nonRMuser,rmManager;
 | 
			
		||||
    private SiteModel testSite;
 | 
			
		||||
    private FileModel document, documentDeclared;
 | 
			
		||||
    private RecordCategory category_manager, category_admin;
 | 
			
		||||
    private RecordCategoryChild folder_admin, folder_manager ;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private DataSite dataSite;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private DataContent dataContent;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RoleService roleService;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RecordCategoriesAPI recordCategoriesAPI;
 | 
			
		||||
    /**
 | 
			
		||||
     * Create preconditions:
 | 
			
		||||
     * <pre>
 | 
			
		||||
     *     1. RM site is created
 | 
			
		||||
     *     2. Two users: user without RM role and a user with RM manager role
 | 
			
		||||
     *     3. Two Record categories with one folder each
 | 
			
		||||
     *     4. User with RM MANAGER role has Filling permission over one category
 | 
			
		||||
     * </pre>
 | 
			
		||||
     */
 | 
			
		||||
    @BeforeClass(alwaysRun = true)
 | 
			
		||||
    public void preconditionForFileAsRecordRecordTests()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Create the RM site if doesn't exist");
 | 
			
		||||
        createRMSiteIfNotExists();
 | 
			
		||||
 | 
			
		||||
        STEP("Create a user");
 | 
			
		||||
        nonRMuser = dataUser.createRandomTestUser("testUser");
 | 
			
		||||
 | 
			
		||||
        STEP("Create a collaboration site");
 | 
			
		||||
        testSite = dataSite.usingUser(nonRMuser).createPublicRandomSite();
 | 
			
		||||
 | 
			
		||||
        STEP("Create a document with the user without RM role");
 | 
			
		||||
        document = dataContent.usingSite(testSite)
 | 
			
		||||
            .usingUser(nonRMuser)
 | 
			
		||||
            .createContent(CMISUtil.DocumentType.TEXT_PLAIN);
 | 
			
		||||
 | 
			
		||||
        STEP("Create two categories with two folders");
 | 
			
		||||
        category_manager = createRootCategory(CATEGORY_MANAGER);
 | 
			
		||||
        category_admin = createRootCategory(CATEGORY_ADMIN);
 | 
			
		||||
        folder_admin = createFolder(category_admin.getId(),FOLDER_ADMIN);
 | 
			
		||||
        folder_manager = createFolder(category_manager.getId(),FOLDER_MANAGER);
 | 
			
		||||
 | 
			
		||||
        STEP("Create an rm user and give filling permission over CATEGORY_MANAGER record category");
 | 
			
		||||
        RecordCategory recordCategory = new RecordCategory().builder()
 | 
			
		||||
            .id(category_manager.getId())
 | 
			
		||||
            .build();
 | 
			
		||||
        rmManager = roleService.createCollaboratorWithRMRoleAndPermission(testSite, recordCategory,
 | 
			
		||||
            UserRoles.ROLE_RM_MANAGER, PERMISSION_FILING);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Given I have selected the record folder I want to file my declared record to
 | 
			
		||||
     * When I confirm the action
 | 
			
		||||
     * Then the dialog closes
 | 
			
		||||
     * And the document is now shown as a record in the collaboration site
 | 
			
		||||
     * And if I navigated to the record folder, as any user who had the right permissions, then I would see the
 | 
			
		||||
     * record filed
 | 
			
		||||
     */
 | 
			
		||||
    @Test
 | 
			
		||||
    @AlfrescoTest(jira = "RM-6780")
 | 
			
		||||
    public void checkFileAsRecordToRecordFolder() throws Exception {
 | 
			
		||||
 | 
			
		||||
        AtomicReference<RecordFolderCollection> apiChildren = new AtomicReference<>();
 | 
			
		||||
        STEP("Create a document with the user with RM role");
 | 
			
		||||
        documentDeclared = dataContent.usingSite(testSite).usingUser(rmManager)
 | 
			
		||||
            .createContent(new FileModel("checkDeclareAndFileToRecordFolder", FileType.TEXT_PLAIN));
 | 
			
		||||
 | 
			
		||||
        STEP("Declare and file into  a record folder the document uploaded");
 | 
			
		||||
 | 
			
		||||
        getRestAPIFactory().getActionsAPI(rmManager).declareAndFile(documentDeclared,
 | 
			
		||||
            Utility.buildPath(CATEGORY_MANAGER, FOLDER_MANAGER));
 | 
			
		||||
 | 
			
		||||
        STEP("Check the file is a record within the collaboration site");
 | 
			
		||||
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            Utility.sleep(1000, 40000, () ->
 | 
			
		||||
            {
 | 
			
		||||
                JSONObject collaboratorSearchJson = getSearchApi().liveSearchForDocuments(rmManager.getUsername(),
 | 
			
		||||
                    rmManager.getPassword(),
 | 
			
		||||
                    documentDeclared.getName());
 | 
			
		||||
                assertTrue("Rm Manager not able to find the document.", collaboratorSearchJson.getJSONArray("items").length() != 0);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        catch (InterruptedException e)
 | 
			
		||||
        {
 | 
			
		||||
            fail("InterruptedException received while waiting for results.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        STEP("Check the record is filed into the record folder.");
 | 
			
		||||
        // Get children from API
 | 
			
		||||
        // List children from API
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            Utility.sleep(1000, 40000, () ->
 | 
			
		||||
            {
 | 
			
		||||
                apiChildren.set((RecordFolderCollection) getRestAPIFactory()
 | 
			
		||||
                    .getRecordFolderAPI(rmManager).getRecordFolderChildren(folder_manager.getId(), "include=properties")
 | 
			
		||||
                    .assertThat().entriesListIsNotEmpty().assertThat().entriesListIsNotEmpty());
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        catch (InterruptedException e)
 | 
			
		||||
        {
 | 
			
		||||
            fail("InterruptedException received while waiting for results.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        assertEquals(apiChildren.get()
 | 
			
		||||
            .getEntries()
 | 
			
		||||
            .get(0)
 | 
			
		||||
            .getEntry()
 | 
			
		||||
            .getProperties()
 | 
			
		||||
            .getOriginalName(),documentDeclared.getName());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Given I have selected the "File As Record" action
 | 
			
		||||
     * When I confirm the action without selecting a location to file to
 | 
			
		||||
     * Then the record is declared in the unfiled folder
 | 
			
		||||
     */
 | 
			
		||||
    @Test
 | 
			
		||||
    @AlfrescoTest (jira = "RM-6780")
 | 
			
		||||
    public void fileAsRecordToUnfiledRecordFolder() throws Exception {
 | 
			
		||||
        STEP("Create a document with the user without RM role");
 | 
			
		||||
        FileModel inplaceRecord = dataContent.usingSite(testSite).usingUser(rmManager)
 | 
			
		||||
            .createContent(new FileModel("declareAndFileToIntoUnfiledRecordFolder",
 | 
			
		||||
                FileType.TEXT_PLAIN));
 | 
			
		||||
 | 
			
		||||
        STEP("Click on Declare and file without selecting a record folder");
 | 
			
		||||
        getRestAPIFactory().getActionsAPI(rmManager).declareAndFile(inplaceRecord,"");
 | 
			
		||||
 | 
			
		||||
        STEP("Check the file is declared in unfiled record folder");
 | 
			
		||||
        Assert.assertTrue(isMatchingRecordInUnfiledRecords(inplaceRecord), "Record should be filed to Unfiled Records folder");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @AfterClass(alwaysRun = true)
 | 
			
		||||
    public void cleanUpForFileAsRecordRecordTests() {
 | 
			
		||||
        STEP("Delete the collaboration site");
 | 
			
		||||
        dataSite.usingUser(nonRMuser).deleteSite(testSite);
 | 
			
		||||
 | 
			
		||||
        STEP("Empty the trashcan.");
 | 
			
		||||
        restClient.authenticateUser(nonRMuser).withCoreAPI().usingTrashcan().deleteNodeFromTrashcan(toContentModel(testSite.getId()));
 | 
			
		||||
 | 
			
		||||
        getRestAPIFactory()
 | 
			
		||||
            .getUnfiledContainersAPI(rmManager)
 | 
			
		||||
            .getUnfiledContainerChildren(UNFILED_RECORDS_CONTAINER_ALIAS)
 | 
			
		||||
            .getEntries()
 | 
			
		||||
            .stream()
 | 
			
		||||
            .forEach(x -> getRestAPIFactory()
 | 
			
		||||
                .getRecordsAPI()
 | 
			
		||||
                .deleteRecord(x.getEntry().getId()));
 | 
			
		||||
 | 
			
		||||
        STEP("Cleanup Documents inside folders");
 | 
			
		||||
 | 
			
		||||
        STEP("Delete folders");
 | 
			
		||||
        getRestAPIFactory().getRecordFolderAPI().deleteRecordFolder(folder_admin.getId());
 | 
			
		||||
        getRestAPIFactory().getRecordFolderAPI().deleteRecordFolder(folder_manager.getId());
 | 
			
		||||
 | 
			
		||||
        STEP("Delete categories");
 | 
			
		||||
        recordCategoriesAPI.deleteCategory(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(), category_manager.getName());
 | 
			
		||||
        recordCategoriesAPI.deleteCategory(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(), category_admin.getName());
 | 
			
		||||
 | 
			
		||||
        STEP("Delete Users");
 | 
			
		||||
        dataUser.deleteUser(nonRMuser);
 | 
			
		||||
        dataUser.deleteUser(rmManager);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,108 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Records Management Module
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.rm.community.smoke;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.rm.community.base.BaseRMRestTest;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.record.Record;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.recordcategory.RecordCategory;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.recordcategory.RecordCategoryChild;
 | 
			
		||||
import org.alfresco.rest.v0.RecordFoldersAPI;
 | 
			
		||||
import org.alfresco.rest.v0.service.DispositionScheduleService;
 | 
			
		||||
import org.alfresco.test.AlfrescoTest;
 | 
			
		||||
import org.json.JSONObject;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.testng.annotations.AfterMethod;
 | 
			
		||||
import org.testng.annotations.BeforeClass;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
import static org.alfresco.rest.rm.community.model.recordcategory.RetentionPeriodProperty.CREATED_DATE;
 | 
			
		||||
import static org.alfresco.rest.rm.community.util.CommonTestUtils.generateTestPrefix;
 | 
			
		||||
import static org.alfresco.utility.data.RandomData.getRandomName;
 | 
			
		||||
import static org.alfresco.utility.report.log.Step.STEP;
 | 
			
		||||
 | 
			
		||||
public class FoldersDispositionScheduleTests extends BaseRMRestTest {
 | 
			
		||||
 | 
			
		||||
    private RecordCategory Category1;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private DispositionScheduleService dispositionScheduleService;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RecordFoldersAPI recordFoldersAPI;
 | 
			
		||||
    private final String TEST_PREFIX = generateTestPrefix(FoldersDispositionScheduleTests.class);
 | 
			
		||||
    private final String folderDisposition = TEST_PREFIX + "RM-2937 folder ghosting";
 | 
			
		||||
    private final String electronicRecord = "RM-2937 electronic 2 record";
 | 
			
		||||
    private final String nonElectronicRecord = "RM-2937 non-electronic record";
 | 
			
		||||
 | 
			
		||||
    @BeforeClass(alwaysRun = true)
 | 
			
		||||
    private void setUp(){
 | 
			
		||||
 | 
			
		||||
        STEP("Create the RM site if doesn't exist");
 | 
			
		||||
        createRMSiteIfNotExists();
 | 
			
		||||
 | 
			
		||||
        STEP("Create record category");
 | 
			
		||||
        Category1 = createRootCategory(getRandomName("Title"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    @AlfrescoTest (jira = "RM-2937")
 | 
			
		||||
    public void foldersDispositionScheduleWithGhosting() {
 | 
			
		||||
 | 
			
		||||
        //create retention schedule
 | 
			
		||||
        dispositionScheduleService.createCategoryRetentionSchedule(Category1.getName(), false);
 | 
			
		||||
 | 
			
		||||
        // add cut off step
 | 
			
		||||
        dispositionScheduleService.addCutOffAfterPeriodStep(Category1.getName(), "day|2", CREATED_DATE);
 | 
			
		||||
 | 
			
		||||
        // add destroy step with ghosting
 | 
			
		||||
        dispositionScheduleService.addDestroyWithGhostingImmediatelyAfterCutOff(Category1.getName());
 | 
			
		||||
 | 
			
		||||
        //create folders
 | 
			
		||||
        RecordCategoryChild FOLDER_DESTROY = createFolder(getAdminUser(),Category1.getId(),folderDisposition);
 | 
			
		||||
 | 
			
		||||
        Record elRecord = createElectronicRecord(FOLDER_DESTROY.getId(),electronicRecord);
 | 
			
		||||
        Record nonElRecord = createNonElectronicRecord(FOLDER_DESTROY.getId(),nonElectronicRecord);
 | 
			
		||||
 | 
			
		||||
        // complete records
 | 
			
		||||
        completeRecord(elRecord.getId());
 | 
			
		||||
        completeRecord(nonElRecord.getId());
 | 
			
		||||
 | 
			
		||||
        // edit disposition date
 | 
			
		||||
        recordFoldersAPI.postFolderAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),editDispositionDateJson(),FOLDER_DESTROY.getName());
 | 
			
		||||
 | 
			
		||||
        // cut off the FOLDER_DESTROY
 | 
			
		||||
        recordFoldersAPI.postFolderAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),new JSONObject().put("name","cutoff"),FOLDER_DESTROY.getName());
 | 
			
		||||
 | 
			
		||||
        // Destroy the FOLDER_DESTROY
 | 
			
		||||
        recordFoldersAPI.postFolderAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),new JSONObject().put("name","destroy"),FOLDER_DESTROY.getName());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @AfterMethod(alwaysRun = true)
 | 
			
		||||
    private  void deletePreconditions() {
 | 
			
		||||
        deleteRecordCategory(Category1.getId());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,116 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Records Management Module
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.rm.community.smoke;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.rm.community.base.BaseRMRestTest;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.record.Record;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.recordcategory.RecordCategory;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.recordcategory.RecordCategoryChild;
 | 
			
		||||
import org.alfresco.rest.v0.RecordFoldersAPI;
 | 
			
		||||
import org.alfresco.rest.v0.service.DispositionScheduleService;
 | 
			
		||||
import org.alfresco.test.AlfrescoTest;
 | 
			
		||||
import org.alfresco.utility.Utility;
 | 
			
		||||
import org.json.JSONObject;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.testng.annotations.AfterMethod;
 | 
			
		||||
import org.testng.annotations.BeforeClass;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
import static org.alfresco.rest.rm.community.model.recordcategory.RetentionPeriodProperty.CREATED_DATE;
 | 
			
		||||
import static org.alfresco.rest.rm.community.model.recordcategory.RetentionPeriodProperty.CUT_OFF_DATE;
 | 
			
		||||
import static org.alfresco.rest.rm.community.util.CommonTestUtils.generateTestPrefix;
 | 
			
		||||
import static org.alfresco.utility.data.RandomData.getRandomName;
 | 
			
		||||
import static org.alfresco.utility.report.log.Step.STEP;
 | 
			
		||||
 | 
			
		||||
public class FoldersDispositionScheduleWithoutGhostRecordTests extends BaseRMRestTest {
 | 
			
		||||
 | 
			
		||||
    private RecordCategory Category1;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private DispositionScheduleService dispositionScheduleService;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RecordFoldersAPI recordFoldersAPI;
 | 
			
		||||
    private final String TEST_PREFIX = generateTestPrefix(FoldersDispositionScheduleWithoutGhostRecordTests.class);
 | 
			
		||||
    private final String folderDisposition = TEST_PREFIX + "RM-2937 folder ghosting";
 | 
			
		||||
    private final String electronicRecord = "RM-2937 electronic 2 record";
 | 
			
		||||
    private final String nonElectronicRecord = "RM-2937 non-electronic record";
 | 
			
		||||
 | 
			
		||||
    @BeforeClass(alwaysRun = true)
 | 
			
		||||
    private void setUp(){
 | 
			
		||||
 | 
			
		||||
        STEP("Create the RM site if doesn't exist");
 | 
			
		||||
        createRMSiteIfNotExists();
 | 
			
		||||
 | 
			
		||||
        STEP("Create record category");
 | 
			
		||||
        Category1 = createRootCategory(getRandomName("Title"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    @AlfrescoTest(jira="RM-2937")
 | 
			
		||||
    public void foldersDispositionScheduleWithoutGhosting() {
 | 
			
		||||
 | 
			
		||||
        //create retention schedule
 | 
			
		||||
        dispositionScheduleService.createCategoryRetentionSchedule(Category1.getName(), false);
 | 
			
		||||
 | 
			
		||||
        // add cut off step
 | 
			
		||||
        dispositionScheduleService.addCutOffAfterPeriodStep(Category1.getName(), "day|2", CREATED_DATE);
 | 
			
		||||
 | 
			
		||||
        // add destroy step with ghosting
 | 
			
		||||
        dispositionScheduleService.addDestroyWithoutGhostingAfterPeriodStep(Category1.getName(), "day|1", CUT_OFF_DATE);
 | 
			
		||||
 | 
			
		||||
        //create folders
 | 
			
		||||
        RecordCategoryChild FOLDER_DESTROY = createFolder(getAdminUser(),Category1.getId(),folderDisposition);
 | 
			
		||||
 | 
			
		||||
        Record elRecord = createElectronicRecord(FOLDER_DESTROY.getId(),electronicRecord);
 | 
			
		||||
        Record nonElRecord = createNonElectronicRecord(FOLDER_DESTROY.getId(),nonElectronicRecord);
 | 
			
		||||
 | 
			
		||||
        // complete records
 | 
			
		||||
        completeRecord(elRecord.getId());
 | 
			
		||||
        completeRecord(nonElRecord.getId());
 | 
			
		||||
 | 
			
		||||
        // edit disposition date
 | 
			
		||||
        recordFoldersAPI.postFolderAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),editDispositionDateJson(),FOLDER_DESTROY.getName());
 | 
			
		||||
 | 
			
		||||
        // cut off the FOLDER_DESTROY
 | 
			
		||||
        recordFoldersAPI.postFolderAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),new JSONObject().put("name","cutoff"),FOLDER_DESTROY.getName());
 | 
			
		||||
 | 
			
		||||
        // edit disposition date
 | 
			
		||||
        recordFoldersAPI.postFolderAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),editDispositionDateJson(),FOLDER_DESTROY.getName());
 | 
			
		||||
 | 
			
		||||
        Utility.waitToLoopTime(5,"Waiting for Edit Disposition to be processed");
 | 
			
		||||
 | 
			
		||||
        // Destroy the FOLDER_DESTROY
 | 
			
		||||
        recordFoldersAPI.postFolderAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),new JSONObject().put("name","destroy"),FOLDER_DESTROY.getName());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @AfterMethod(alwaysRun = true)
 | 
			
		||||
    private  void deletePreconditions() {
 | 
			
		||||
        deleteRecordCategory(Category1.getId());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,202 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Records Management Module
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.rm.community.smoke;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.core.v0.RMEvents;
 | 
			
		||||
import org.alfresco.rest.rm.community.base.BaseRMRestTest;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.record.Record;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.recordcategory.RecordCategory;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.recordcategory.RecordCategoryChild;
 | 
			
		||||
import org.alfresco.rest.v0.RMRolesAndActionsAPI;
 | 
			
		||||
import org.alfresco.rest.v0.RecordFoldersAPI;
 | 
			
		||||
import org.alfresco.rest.v0.RecordsAPI;
 | 
			
		||||
import org.alfresco.rest.v0.service.DispositionScheduleService;
 | 
			
		||||
import org.alfresco.test.AlfrescoTest;
 | 
			
		||||
import org.alfresco.utility.Utility;
 | 
			
		||||
import org.apache.http.HttpEntity;
 | 
			
		||||
import org.apache.http.HttpResponse;
 | 
			
		||||
import org.apache.http.util.EntityUtils;
 | 
			
		||||
import org.json.JSONObject;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.time.Instant;
 | 
			
		||||
import static org.alfresco.rest.rm.community.base.TestData.DEFAULT_PASSWORD;
 | 
			
		||||
import static org.alfresco.rest.rm.community.model.recordcategory.RetentionPeriodProperty.CUT_OFF_DATE;
 | 
			
		||||
import static org.alfresco.rest.rm.community.util.CommonTestUtils.generateTestPrefix;
 | 
			
		||||
import static org.alfresco.utility.report.log.Step.STEP;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Contains recordsDispositionScheduleWithoutGhosting test which checks disposition schedule cut off, transfer and destroy without maintaining metadata steps applied to records
 | 
			
		||||
 * <p/>
 | 
			
		||||
 * Precondition:
 | 
			
		||||
 * <p/>
 | 
			
		||||
 * RM site created, contains an empty category "RM-2801 disposition for records". <p/>
 | 
			
		||||
 * RM user has RM admin role. <p/>
 | 
			
		||||
 * A transfer location named "transferred files" is created to which RM user has access
 | 
			
		||||
 * <p/>
 | 
			
		||||
 * <img src="doc-files/Disposition Schedule without ghosting.png" alt="Records Disposition Schedule without ghosting" />
 | 
			
		||||
 *
 | 
			
		||||
 * @author Kavit Shah
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class RecordsDispositionScheduleTests extends BaseRMRestTest {
 | 
			
		||||
 | 
			
		||||
    /** data prep 6services */
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RMRolesAndActionsAPI rmRolesAndActionsAPI;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RecordsAPI recordsAPI;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RecordFoldersAPI recordFoldersAPI;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private DispositionScheduleService dispositionScheduleService;
 | 
			
		||||
    private RecordCategory Category1;
 | 
			
		||||
    private final String TEST_PREFIX = generateTestPrefix(RecordsDispositionScheduleTests.class);
 | 
			
		||||
    private final String RM_ADMIN = TEST_PREFIX + "rm_admin";
 | 
			
		||||
    private final String recordsCategory = TEST_PREFIX + "RM-2801 category";
 | 
			
		||||
    private final String folderDisposition = TEST_PREFIX + "RM-2801 folder";
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    @AlfrescoTest(jira="RM-2801")
 | 
			
		||||
    public void recordsDispositionScheduleWithoutGhosting() {
 | 
			
		||||
 | 
			
		||||
        // create test precondition
 | 
			
		||||
        createTestPrecondition(recordsCategory);
 | 
			
		||||
 | 
			
		||||
        // create disposition schedule
 | 
			
		||||
        dispositionScheduleService.createCategoryRetentionSchedule(Category1.getName(), true);
 | 
			
		||||
 | 
			
		||||
        // add cut off step
 | 
			
		||||
        dispositionScheduleService.addCutOffImmediatelyStep(Category1.getName());
 | 
			
		||||
 | 
			
		||||
        // add transfer step
 | 
			
		||||
        dispositionScheduleService.addTransferAfterEventStep(Category1.getName(),"transferred records","all_allowances_granted_are_terminated");
 | 
			
		||||
 | 
			
		||||
        // add destroy step without retaining metadata
 | 
			
		||||
        dispositionScheduleService.addDestroyWithoutGhostingAfterPeriodStep(Category1.getName(), "day|1", CUT_OFF_DATE);
 | 
			
		||||
 | 
			
		||||
        // create a folder and an electronic and a non-electronic record in it
 | 
			
		||||
        RecordCategoryChild FOLDER_DESTROY = createFolder(getAdminUser(),Category1.getId(),folderDisposition);
 | 
			
		||||
 | 
			
		||||
        String electronicRecord = "RM-2801 electronic record";
 | 
			
		||||
        Record elRecord = createElectronicRecord(FOLDER_DESTROY.getId(), electronicRecord);
 | 
			
		||||
        String nonElectronicRecord = "RM-2801 non-electronic record";
 | 
			
		||||
        Record nonElRecord = createNonElectronicRecord(FOLDER_DESTROY.getId(), nonElectronicRecord);
 | 
			
		||||
 | 
			
		||||
        // complete records and cut them off
 | 
			
		||||
        String nonElRecordName = recordsAPI.getRecordFullName(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(), folderDisposition, nonElectronicRecord);
 | 
			
		||||
        String elRecordName = recordsAPI.getRecordFullName(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(), folderDisposition, electronicRecord);
 | 
			
		||||
 | 
			
		||||
        // complete records and cut them off
 | 
			
		||||
        completeRecord(elRecord.getId());
 | 
			
		||||
        completeRecord(nonElRecord.getId());
 | 
			
		||||
 | 
			
		||||
        String nonElRecordNameNodeRef = recordsAPI.getRecordNodeRef(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(), nonElRecordName, "/" + Category1.getName() + "/" + folderDisposition);
 | 
			
		||||
        recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),new JSONObject().put("name","cutoff"),nonElRecordNameNodeRef);
 | 
			
		||||
 | 
			
		||||
        String elRecordNameNodeRef = recordsAPI.getRecordNodeRef(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(), elRecordName, "/" + Category1.getName() + "/" + folderDisposition);
 | 
			
		||||
        recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),new JSONObject().put("name","cutoff"),elRecordNameNodeRef);
 | 
			
		||||
 | 
			
		||||
        // ensure the complete event action is displayed for both events
 | 
			
		||||
        rmRolesAndActionsAPI.completeEvent(getAdminUser().getUsername(),
 | 
			
		||||
               getAdminUser().getPassword(), nonElRecordName, RMEvents.ALL_ALLOWANCES_GRANTED_ARE_TERMINATED, Instant.now());
 | 
			
		||||
        rmRolesAndActionsAPI.completeEvent(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(), elRecordName, RMEvents.ALL_ALLOWANCES_GRANTED_ARE_TERMINATED, Instant.now());
 | 
			
		||||
 | 
			
		||||
        // Create and Complete transfer
 | 
			
		||||
        HttpResponse nonElRecordNameHttpResponse = recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),new JSONObject().put("name","transfer"),recordsAPI.getRecordNodeRef(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
                getDataUser().usingAdmin().getAdminUser().getPassword(), nonElRecordName, "/" + Category1.getName() + "/" + folderDisposition));
 | 
			
		||||
 | 
			
		||||
        String nonElRecordNameTransferId = getTransferId(nonElRecordNameHttpResponse,nonElRecordNameNodeRef);
 | 
			
		||||
        recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),new JSONObject().put("name","transferComplete"),nonElRecordNameTransferId);
 | 
			
		||||
 | 
			
		||||
        HttpResponse elRecordNameHttpResponse = recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),new JSONObject().put("name","transfer"),recordsAPI.getRecordNodeRef(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
                getDataUser().usingAdmin().getAdminUser().getPassword(), elRecordName, "/" + Category1.getName() + "/" + folderDisposition));
 | 
			
		||||
 | 
			
		||||
        String elRecordNameTransferId = getTransferId(elRecordNameHttpResponse,elRecordNameNodeRef);
 | 
			
		||||
        recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),new JSONObject().put("name","transferComplete"),elRecordNameTransferId);
 | 
			
		||||
 | 
			
		||||
        // edit the disposition schedule date to current date
 | 
			
		||||
        recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),editDispositionDateJson(),nonElRecordNameNodeRef);
 | 
			
		||||
        recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),editDispositionDateJson(),elRecordNameNodeRef);
 | 
			
		||||
 | 
			
		||||
        Utility.waitToLoopTime(5,"Waiting for Edit Disposition to be processed");
 | 
			
		||||
 | 
			
		||||
        // destroy records
 | 
			
		||||
        recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),new JSONObject().put("name","destroy"),nonElRecordNameNodeRef);
 | 
			
		||||
        recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),new JSONObject().put("name","destroy"),elRecordNameNodeRef);
 | 
			
		||||
 | 
			
		||||
        // delete category
 | 
			
		||||
        deleteRecordCategory(Category1.getId());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void createTestPrecondition(String categoryName) {
 | 
			
		||||
        createRMSiteIfNotExists();
 | 
			
		||||
 | 
			
		||||
        // create "rm admin" user if it does not exist and assign it to RM Administrator role
 | 
			
		||||
        rmRolesAndActionsAPI.createUserAndAssignToRole(
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(),
 | 
			
		||||
            RM_ADMIN, DEFAULT_PASSWORD, "Administrator");
 | 
			
		||||
 | 
			
		||||
        // create category
 | 
			
		||||
        STEP("Create two category");
 | 
			
		||||
        Category1 = createRootCategory(categoryName,"Title");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private String getTransferId(HttpResponse httpResponse,String nodeRef) {
 | 
			
		||||
        HttpEntity entity = httpResponse.getEntity();
 | 
			
		||||
        String responseString = null;
 | 
			
		||||
        try {
 | 
			
		||||
            responseString = EntityUtils.toString(entity, "UTF-8");
 | 
			
		||||
        } catch (IOException e) {
 | 
			
		||||
            throw new RuntimeException(e);
 | 
			
		||||
        }
 | 
			
		||||
        JSONObject result = new JSONObject(responseString);
 | 
			
		||||
        return result
 | 
			
		||||
            .getJSONObject("results")
 | 
			
		||||
            .get(nodeRef)
 | 
			
		||||
            .toString();
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,200 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Records Management Module
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.rm.community.smoke;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.core.v0.RMEvents;
 | 
			
		||||
import org.alfresco.rest.rm.community.base.BaseRMRestTest;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.record.Record;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.recordcategory.RecordCategory;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.recordcategory.RecordCategoryChild;
 | 
			
		||||
import org.alfresco.rest.v0.RMRolesAndActionsAPI;
 | 
			
		||||
import org.alfresco.rest.v0.RecordFoldersAPI;
 | 
			
		||||
import org.alfresco.rest.v0.RecordsAPI;
 | 
			
		||||
import org.alfresco.rest.v0.service.DispositionScheduleService;
 | 
			
		||||
import org.alfresco.test.AlfrescoTest;
 | 
			
		||||
import org.alfresco.utility.Utility;
 | 
			
		||||
import org.apache.http.HttpEntity;
 | 
			
		||||
import org.apache.http.HttpResponse;
 | 
			
		||||
import org.apache.http.util.EntityUtils;
 | 
			
		||||
import org.json.JSONObject;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.time.Instant;
 | 
			
		||||
import static org.alfresco.rest.rm.community.base.TestData.DEFAULT_PASSWORD;
 | 
			
		||||
import static org.alfresco.rest.rm.community.util.CommonTestUtils.generateTestPrefix;
 | 
			
		||||
import static org.alfresco.utility.report.log.Step.STEP;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Contains recordsDispositionScheduleWithGhosting test which checks disposition schedule cut off, transfer and destroy with maintaining record metadata steps applied to records
 | 
			
		||||
 * <p/>
 | 
			
		||||
 * Precondition:
 | 
			
		||||
 * <p/>
 | 
			
		||||
 * RM site created, contains an empty category "RM-2937 disposition for records with ghosting". <p/>
 | 
			
		||||
 * RM user has RM admin role. <p/>
 | 
			
		||||
 * A transfer location named "transferred files with ghosting" is created to which RM user has access
 | 
			
		||||
 * <p/>
 | 
			
		||||
 * <img src="doc-files/Disposition Schedule with ghosting.png" alt="Records Disposition Schedule with ghosting" />
 | 
			
		||||
 *
 | 
			
		||||
 * @author Kavit Shah
 | 
			
		||||
 */
 | 
			
		||||
public class RecordsDispositionScheduleWithGhostingTests extends BaseRMRestTest {
 | 
			
		||||
 | 
			
		||||
    /** data prep 6services */
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RMRolesAndActionsAPI rmRolesAndActionsAPI;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RecordsAPI recordsAPI;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RecordFoldersAPI recordFoldersAPI;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private DispositionScheduleService dispositionScheduleService;
 | 
			
		||||
    private RecordCategory Category1;
 | 
			
		||||
    private final String TEST_PREFIX = generateTestPrefix(RecordsDispositionScheduleTests.class);
 | 
			
		||||
    private final String RM_ADMIN = TEST_PREFIX + "rm_admin";
 | 
			
		||||
    private final String recordsCategory = TEST_PREFIX + "RM-2801 category";
 | 
			
		||||
    private final String folderDisposition = TEST_PREFIX + "RM-2801 folder";
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    @AlfrescoTest(jira="RM-2801")
 | 
			
		||||
    public void recordsDispositionScheduleWithGhosting() {
 | 
			
		||||
 | 
			
		||||
        // create test precondition
 | 
			
		||||
        createTestPrecondition(recordsCategory);
 | 
			
		||||
 | 
			
		||||
        // create disposition schedule
 | 
			
		||||
        dispositionScheduleService.createCategoryRetentionSchedule(Category1.getName(), true);
 | 
			
		||||
 | 
			
		||||
        // add cut off step
 | 
			
		||||
        dispositionScheduleService.addCutOffImmediatelyStep(Category1.getName());
 | 
			
		||||
 | 
			
		||||
        // add transfer step
 | 
			
		||||
        dispositionScheduleService.addTransferAfterEventStep(Category1.getName(),"transferred records","all_allowances_granted_are_terminated");
 | 
			
		||||
 | 
			
		||||
        // add destroy step without retaining metadata
 | 
			
		||||
        dispositionScheduleService.addDestroyWithGhostingImmediatelyAfterCutOff(Category1.getName());
 | 
			
		||||
 | 
			
		||||
        // create a folder and an electronic and a non-electronic record in it
 | 
			
		||||
        RecordCategoryChild FOLDER_DESTROY = createFolder(getAdminUser(),Category1.getId(),folderDisposition);
 | 
			
		||||
 | 
			
		||||
        String electronicRecord = "RM-2801 electronic record";
 | 
			
		||||
        Record elRecord = createElectronicRecord(FOLDER_DESTROY.getId(), electronicRecord);
 | 
			
		||||
        String nonElectronicRecord = "RM-2801 non-electronic record";
 | 
			
		||||
        Record nonElRecord = createNonElectronicRecord(FOLDER_DESTROY.getId(), nonElectronicRecord);
 | 
			
		||||
 | 
			
		||||
        // complete records and cut them off
 | 
			
		||||
        String nonElRecordName = recordsAPI.getRecordFullName(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(), folderDisposition, nonElectronicRecord);
 | 
			
		||||
        String elRecordName = recordsAPI.getRecordFullName(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(), folderDisposition, electronicRecord);
 | 
			
		||||
 | 
			
		||||
        // complete records and cut them off
 | 
			
		||||
        completeRecord(elRecord.getId());
 | 
			
		||||
        completeRecord(nonElRecord.getId());
 | 
			
		||||
 | 
			
		||||
        String nonElRecordNameNodeRef = recordsAPI.getRecordNodeRef(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(), nonElRecordName, "/" + Category1.getName() + "/" + folderDisposition);
 | 
			
		||||
        recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),new JSONObject().put("name","cutoff"),nonElRecordNameNodeRef);
 | 
			
		||||
 | 
			
		||||
        String elRecordNameNodeRef = recordsAPI.getRecordNodeRef(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(), elRecordName, "/" + Category1.getName() + "/" + folderDisposition);
 | 
			
		||||
        recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),new JSONObject().put("name","cutoff"),elRecordNameNodeRef);
 | 
			
		||||
 | 
			
		||||
        // ensure the complete event action is displayed for both events
 | 
			
		||||
        rmRolesAndActionsAPI.completeEvent(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(), nonElRecordName, RMEvents.ALL_ALLOWANCES_GRANTED_ARE_TERMINATED, Instant.now());
 | 
			
		||||
        rmRolesAndActionsAPI.completeEvent(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(), elRecordName, RMEvents.ALL_ALLOWANCES_GRANTED_ARE_TERMINATED, Instant.now());
 | 
			
		||||
 | 
			
		||||
        // Create and Complete transfer
 | 
			
		||||
        HttpResponse nonElRecordNameHttpResponse = recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),new JSONObject().put("name","transfer"),recordsAPI.getRecordNodeRef(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
                getDataUser().usingAdmin().getAdminUser().getPassword(), nonElRecordName, "/" + Category1.getName() + "/" + folderDisposition));
 | 
			
		||||
 | 
			
		||||
        String nonElRecordNameTransferId = getTransferId(nonElRecordNameHttpResponse,nonElRecordNameNodeRef);
 | 
			
		||||
        recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),new JSONObject().put("name","transferComplete"),nonElRecordNameTransferId);
 | 
			
		||||
 | 
			
		||||
        HttpResponse elRecordNameHttpResponse = recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),new JSONObject().put("name","transfer"),recordsAPI.getRecordNodeRef(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
                getDataUser().usingAdmin().getAdminUser().getPassword(), elRecordName, "/" + Category1.getName() + "/" + folderDisposition));
 | 
			
		||||
 | 
			
		||||
        String elRecordNameTransferId = getTransferId(elRecordNameHttpResponse,elRecordNameNodeRef);
 | 
			
		||||
        recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),new JSONObject().put("name","transferComplete"),elRecordNameTransferId);
 | 
			
		||||
 | 
			
		||||
        // edit the disposition schedule date to current date
 | 
			
		||||
        recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),editDispositionDateJson(),nonElRecordNameNodeRef);
 | 
			
		||||
        recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),editDispositionDateJson(),elRecordNameNodeRef);
 | 
			
		||||
 | 
			
		||||
        Utility.waitToLoopTime(5,"Waiting for Edit Disposition to be processed");
 | 
			
		||||
 | 
			
		||||
        // destroy records
 | 
			
		||||
        recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),new JSONObject().put("name","destroy"),nonElRecordNameNodeRef);
 | 
			
		||||
        recordFoldersAPI.postRecordAction(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(),new JSONObject().put("name","destroy"),elRecordNameNodeRef);
 | 
			
		||||
 | 
			
		||||
        // delete category
 | 
			
		||||
        deleteRecordCategory(Category1.getId());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void createTestPrecondition(String categoryName) {
 | 
			
		||||
        createRMSiteIfNotExists();
 | 
			
		||||
 | 
			
		||||
        // create "rm admin" user if it does not exist and assign it to RM Administrator role
 | 
			
		||||
        rmRolesAndActionsAPI.createUserAndAssignToRole(
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(),
 | 
			
		||||
            RM_ADMIN, DEFAULT_PASSWORD, "Administrator");
 | 
			
		||||
 | 
			
		||||
        // create category
 | 
			
		||||
        STEP("Create two category");
 | 
			
		||||
        Category1 = createRootCategory(categoryName,"Title");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private String getTransferId(HttpResponse httpResponse,String nodeRef) {
 | 
			
		||||
        HttpEntity entity = httpResponse.getEntity();
 | 
			
		||||
        String responseString = null;
 | 
			
		||||
        try {
 | 
			
		||||
            responseString = EntityUtils.toString(entity, "UTF-8");
 | 
			
		||||
        } catch (IOException e) {
 | 
			
		||||
            throw new RuntimeException(e);
 | 
			
		||||
        }
 | 
			
		||||
        JSONObject result = new JSONObject(responseString);
 | 
			
		||||
        return result
 | 
			
		||||
            .getJSONObject("results")
 | 
			
		||||
            .get(nodeRef)
 | 
			
		||||
            .toString();
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,124 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Records Management Module
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.rm.community.smoke;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.rm.community.base.BaseRMRestTest;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.record.RecordContent;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.recordcategory.RecordCategory;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.recordcategory.RecordCategoryChild;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.rules.ActionsOnRule;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.rules.RuleDefinition;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.unfiledcontainer.UnfiledContainer;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.unfiledcontainer.UnfiledContainerChild;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.unfiledcontainer.UnfiledContainerChildProperties;
 | 
			
		||||
import org.alfresco.rest.v0.RMRolesAndActionsAPI;
 | 
			
		||||
import org.alfresco.rest.v0.RulesAPI;
 | 
			
		||||
import org.alfresco.test.AlfrescoTest;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import static org.alfresco.rest.core.v0.BaseAPI.NODE_PREFIX;
 | 
			
		||||
import static org.alfresco.rest.rm.community.base.TestData.ELECTRONIC_RECORD_NAME;
 | 
			
		||||
import static org.alfresco.rest.rm.community.base.TestData.NONELECTRONIC_RECORD_NAME;
 | 
			
		||||
import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentAlias.UNFILED_RECORDS_CONTAINER_ALIAS;
 | 
			
		||||
import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentType.*;
 | 
			
		||||
import static org.alfresco.rest.rm.community.util.CommonTestUtils.generateTestPrefix;
 | 
			
		||||
import static org.alfresco.utility.data.RandomData.getRandomName;
 | 
			
		||||
import static org.alfresco.utility.report.log.Step.STEP;
 | 
			
		||||
import static org.springframework.http.HttpStatus.*;
 | 
			
		||||
public class UnfiledRecordsRuleTests extends BaseRMRestTest {
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RMRolesAndActionsAPI rmRolesAndActionsAPI;
 | 
			
		||||
    private final String TEST_PREFIX = generateTestPrefix(CreateCategoriesTests.class);
 | 
			
		||||
    private final String RM_ADMIN = TEST_PREFIX + "rm_admin";
 | 
			
		||||
    private RecordCategory Category2;
 | 
			
		||||
    private RecordCategoryChild Folder2;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RulesAPI rulesAPI;
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    @AlfrescoTest(jira = "RM-2794")
 | 
			
		||||
    public void unfiledRecordsRule() {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        STEP("Create the RM site if doesn't exist");
 | 
			
		||||
        createRMSiteIfNotExists();
 | 
			
		||||
 | 
			
		||||
        STEP("Create RM Admin user");
 | 
			
		||||
        rmRolesAndActionsAPI.createUserAndAssignToRole(getAdminUser().getUsername(), getAdminUser().getPassword(), RM_ADMIN,
 | 
			
		||||
            getAdminUser().getPassword(),
 | 
			
		||||
            "Administrator");
 | 
			
		||||
 | 
			
		||||
        STEP("Create record categories and record folders");
 | 
			
		||||
        Category2 = createRootCategory(getRandomName("recordCategory"));
 | 
			
		||||
        Folder2 = createFolder(Category2.getId(), getRandomName("recordFolder"));
 | 
			
		||||
 | 
			
		||||
        STEP("Get the unfiled records container");
 | 
			
		||||
        UnfiledContainer container = getRestAPIFactory().getUnfiledContainersAPI().getUnfiledContainer(UNFILED_RECORDS_CONTAINER_ALIAS);
 | 
			
		||||
 | 
			
		||||
        // Check the response code
 | 
			
		||||
        assertStatusCode(OK);
 | 
			
		||||
 | 
			
		||||
        //create a rule
 | 
			
		||||
        RuleDefinition ruleDefinition = RuleDefinition.createNewRule().title("name").description("description")
 | 
			
		||||
            .applyToChildren(true)
 | 
			
		||||
            .actions(Collections.singletonList(ActionsOnRule.FILE_TO.getActionValue()));
 | 
			
		||||
        rulesAPI.createRule(getAdminUser().getUsername(), getAdminUser().getPassword(), NODE_PREFIX + container.getId(), ruleDefinition);
 | 
			
		||||
 | 
			
		||||
        //upload an electronic record
 | 
			
		||||
        UnfiledContainerChild electronicRecord = UnfiledContainerChild.builder()
 | 
			
		||||
            .name(ELECTRONIC_RECORD_NAME)
 | 
			
		||||
            .nodeType(CONTENT_TYPE)
 | 
			
		||||
            .content(RecordContent.builder().mimeType("text/plain").build())
 | 
			
		||||
            .build();
 | 
			
		||||
        assertStatusCode(OK);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // create a non-electronic record
 | 
			
		||||
        UnfiledContainerChild nonelectronicRecord = UnfiledContainerChild.builder()
 | 
			
		||||
            .properties(UnfiledContainerChildProperties.builder()
 | 
			
		||||
                .description(NONELECTRONIC_RECORD_NAME)
 | 
			
		||||
                .title("Title")
 | 
			
		||||
                .build())
 | 
			
		||||
            .name(NONELECTRONIC_RECORD_NAME)
 | 
			
		||||
            .nodeType(NON_ELECTRONIC_RECORD_TYPE)
 | 
			
		||||
            .build();
 | 
			
		||||
        assertStatusCode(OK);
 | 
			
		||||
 | 
			
		||||
        //delete the record created, delete the rule from UnfilledRecord page, delete the category created
 | 
			
		||||
        rulesAPI.deleteAllRulesOnContainer(getAdminUser().getUsername(), getAdminUser().getPassword(), NODE_PREFIX + container.getId());
 | 
			
		||||
        deleteRecordCategory(Category2.getId());
 | 
			
		||||
        assertStatusCode(NO_CONTENT);
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
   <parent>
 | 
			
		||||
      <groupId>org.alfresco</groupId>
 | 
			
		||||
      <artifactId>alfresco-governance-services-community-parent</artifactId>
 | 
			
		||||
      <version>17.113</version>
 | 
			
		||||
      <version>17.75-SNAPSHOT</version>
 | 
			
		||||
   </parent>
 | 
			
		||||
 | 
			
		||||
   <modules>
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
   <parent>
 | 
			
		||||
      <groupId>org.alfresco</groupId>
 | 
			
		||||
      <artifactId>alfresco-governance-services-community-repo-parent</artifactId>
 | 
			
		||||
      <version>17.113</version>
 | 
			
		||||
      <version>17.75-SNAPSHOT</version>
 | 
			
		||||
   </parent>
 | 
			
		||||
 | 
			
		||||
   <properties>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-governance-services-community-repo-parent</artifactId>
 | 
			
		||||
        <version>17.113</version>
 | 
			
		||||
        <version>17.75-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <build>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo</artifactId>
 | 
			
		||||
        <version>17.113</version>
 | 
			
		||||
        <version>17.75-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <modules>
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-amps</artifactId>
 | 
			
		||||
        <version>17.113</version>
 | 
			
		||||
        <version>17.75-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <properties>
 | 
			
		||||
 
 | 
			
		||||
@@ -11,7 +11,7 @@ function main()
 | 
			
		||||
   var params =
 | 
			
		||||
   {
 | 
			
		||||
      type: "people",
 | 
			
		||||
      term: args.t + " [hint:useCQ]",
 | 
			
		||||
      term: args.t,
 | 
			
		||||
      maxResults: (args.maxResults !== null) ? parseInt(args.maxResults, 10) : DEFAULT_MAX_RESULTS,
 | 
			
		||||
      startIndex: (args.startIndex !== null) ? parseInt(args.startIndex, 10) : 0
 | 
			
		||||
   };
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright 2005 - 2022 Alfresco Software Limited.
 | 
			
		||||
 * Copyright 2005 - 2020 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.
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
   <parent>
 | 
			
		||||
      <groupId>org.alfresco</groupId>
 | 
			
		||||
      <artifactId>alfresco-community-repo</artifactId>
 | 
			
		||||
      <version>17.113</version>
 | 
			
		||||
      <version>17.75-SNAPSHOT</version>
 | 
			
		||||
   </parent>
 | 
			
		||||
 | 
			
		||||
   <dependencies>
 | 
			
		||||
 
 | 
			
		||||
@@ -25,9 +25,6 @@ package org.alfresco.error;
 | 
			
		||||
 */
 | 
			
		||||
public class ExceptionStackUtil
 | 
			
		||||
{
 | 
			
		||||
    private static final String JAVASCRIPT_EXCEPTION = "org.mozilla.javascript.JavaScriptException";
 | 
			
		||||
    private static final String EXCEPTION_DELIMITER = ":";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Searches through the exception stack of the given throwable to find any instance
 | 
			
		||||
     * of the possible cause.  The top-level throwable will also be tested.
 | 
			
		||||
@@ -41,17 +38,10 @@ public class ExceptionStackUtil
 | 
			
		||||
    {
 | 
			
		||||
        while (throwable != null)
 | 
			
		||||
        {
 | 
			
		||||
            Class<?> throwableClass = throwable.getClass();
 | 
			
		||||
 | 
			
		||||
            boolean isJavaScriptException = throwableClass.getName().contains(JAVASCRIPT_EXCEPTION);
 | 
			
		||||
            String throwableMsg = throwable.getMessage() != null ? throwable.getMessage() : "";
 | 
			
		||||
 | 
			
		||||
            for (Class<?> possibleCauseClass : possibleCauses)
 | 
			
		||||
            {
 | 
			
		||||
                String possibleCauseClassName = possibleCauseClass.getName();
 | 
			
		||||
 | 
			
		||||
                if (possibleCauseClass.isAssignableFrom(throwableClass)
 | 
			
		||||
                        || (isJavaScriptException && throwableMsg.contains(possibleCauseClassName + EXCEPTION_DELIMITER)))
 | 
			
		||||
                Class<?> throwableClass = throwable.getClass();
 | 
			
		||||
                if (possibleCauseClass.isAssignableFrom(throwableClass))
 | 
			
		||||
                {
 | 
			
		||||
                    // We have a match
 | 
			
		||||
                    return throwable;
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo</artifactId>
 | 
			
		||||
        <version>17.113</version>
 | 
			
		||||
        <version>17.75-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <properties>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo</artifactId>
 | 
			
		||||
        <version>17.113</version>
 | 
			
		||||
        <version>17.75-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <dependencies>
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,6 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-packaging</artifactId>
 | 
			
		||||
        <version>17.113</version>
 | 
			
		||||
        <version>17.75-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
</project>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-packaging</artifactId>
 | 
			
		||||
        <version>17.113</version>
 | 
			
		||||
        <version>17.75-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <properties>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo</artifactId>
 | 
			
		||||
        <version>17.113</version>
 | 
			
		||||
        <version>17.75-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <modules>
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-packaging</artifactId>
 | 
			
		||||
        <version>17.113</version>
 | 
			
		||||
        <version>17.75-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <modules>
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-tests</artifactId>
 | 
			
		||||
        <version>17.113</version>
 | 
			
		||||
        <version>17.75-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <developers>
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-tests</artifactId>
 | 
			
		||||
        <version>17.113</version>
 | 
			
		||||
        <version>17.75-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <developers>
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-tests</artifactId>
 | 
			
		||||
        <version>17.113</version>
 | 
			
		||||
        <version>17.75-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <developers>
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-tests</artifactId>
 | 
			
		||||
        <version>17.113</version>
 | 
			
		||||
        <version>17.75-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <developers>
 | 
			
		||||
 
 | 
			
		||||
@@ -27,11 +27,9 @@ package org.alfresco.rest.rules;
 | 
			
		||||
 | 
			
		||||
import static java.util.stream.Collectors.toList;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.rest.rules.RulesTestsUtils.*;
 | 
			
		||||
import static org.alfresco.utility.constants.UserRole.SiteCollaborator;
 | 
			
		||||
import static org.alfresco.utility.constants.UserRole.SiteConsumer;
 | 
			
		||||
import static org.alfresco.utility.constants.UserRole.SiteContributor;
 | 
			
		||||
import static org.alfresco.utility.constants.UserRole.SiteManager;
 | 
			
		||||
import static org.alfresco.rest.rules.RulesTestsUtils.createActionModel;
 | 
			
		||||
import static org.alfresco.rest.rules.RulesTestsUtils.createRuleModel;
 | 
			
		||||
import static org.alfresco.utility.constants.UserRole.*;
 | 
			
		||||
import static org.alfresco.utility.model.FileModel.getRandomFileModel;
 | 
			
		||||
import static org.alfresco.utility.model.FileType.TEXT_PLAIN;
 | 
			
		||||
import static org.alfresco.utility.report.log.Step.STEP;
 | 
			
		||||
@@ -41,15 +39,10 @@ import static org.springframework.http.HttpStatus.CREATED;
 | 
			
		||||
import static org.springframework.http.HttpStatus.FORBIDDEN;
 | 
			
		||||
import static org.springframework.http.HttpStatus.NOT_FOUND;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.stream.IntStream;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.RestTest;
 | 
			
		||||
import org.alfresco.rest.model.RestActionBodyExecTemplateModel;
 | 
			
		||||
import org.alfresco.rest.model.RestCompositeConditionDefinitionModel;
 | 
			
		||||
import org.alfresco.rest.model.RestRuleModel;
 | 
			
		||||
import org.alfresco.rest.model.RestRuleModelsCollection;
 | 
			
		||||
import org.alfresco.utility.constants.UserRole;
 | 
			
		||||
@@ -67,8 +60,6 @@ import org.testng.annotations.Test;
 | 
			
		||||
@Test(groups = {TestGroup.RULES})
 | 
			
		||||
public class CreateRulesTests extends RestTest
 | 
			
		||||
{
 | 
			
		||||
    private static final String IGNORE_ID = "id";
 | 
			
		||||
    private static final String IGNORE_IS_SHARED = "isShared";
 | 
			
		||||
    private UserModel user;
 | 
			
		||||
    private SiteModel site;
 | 
			
		||||
    private FolderModel ruleFolder;
 | 
			
		||||
@@ -81,25 +72,18 @@ public class CreateRulesTests extends RestTest
 | 
			
		||||
        ruleFolder = dataContent.usingUser(user).usingSite(site).createFolder();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check we can create a rule.
 | 
			
		||||
     * <p>
 | 
			
		||||
     * Also check that the isShared field is not returned when not requested.
 | 
			
		||||
     */
 | 
			
		||||
    /** Check we can create a rule. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY })
 | 
			
		||||
    public void createRule()
 | 
			
		||||
    {
 | 
			
		||||
        RestRuleModel ruleModel = createRuleModelWithModifiedValues();
 | 
			
		||||
        RestRuleModel ruleModel = createRuleModel("ruleName");
 | 
			
		||||
 | 
			
		||||
        RestRuleModel rule = restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet()
 | 
			
		||||
                                       .createSingleRule(ruleModel);
 | 
			
		||||
 | 
			
		||||
        RestRuleModel expectedRuleModel = createRuleModelWithModifiedValues();
 | 
			
		||||
        expectedRuleModel.setConditions(createEmptyConditionModel());
 | 
			
		||||
        restClient.assertStatusCodeIs(CREATED);
 | 
			
		||||
        rule.assertThat().isEqualTo(expectedRuleModel, IGNORE_ID, IGNORE_IS_SHARED)
 | 
			
		||||
                .assertThat().field("id").isNotNull()
 | 
			
		||||
                .assertThat().field("isShared").isNull();
 | 
			
		||||
        rule.assertThat().field("id").isNotNull()
 | 
			
		||||
            .assertThat().field("name").is("ruleName");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check creating a rule in a non-existent folder returns an error. */
 | 
			
		||||
@@ -137,7 +121,8 @@ public class CreateRulesTests extends RestTest
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES })
 | 
			
		||||
    public void createRuleWithEmptyName()
 | 
			
		||||
    {
 | 
			
		||||
        RestRuleModel ruleModel = createRuleModel("");
 | 
			
		||||
        RestRuleModel ruleModel = new RestRuleModel();
 | 
			
		||||
        ruleModel.setName("");
 | 
			
		||||
 | 
			
		||||
        restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet().createSingleRule(ruleModel);
 | 
			
		||||
 | 
			
		||||
@@ -256,7 +241,7 @@ public class CreateRulesTests extends RestTest
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Try to create a three rules but the middle one has an error.");
 | 
			
		||||
        RestRuleModel ruleA = createRuleModel("ruleA");
 | 
			
		||||
        RestRuleModel ruleB = createRuleModel("");
 | 
			
		||||
        RestRuleModel ruleB = new RestRuleModel();
 | 
			
		||||
        // Don't set a name for Rule B.
 | 
			
		||||
        RestRuleModel ruleC = createRuleModel("ruleC");
 | 
			
		||||
        List<RestRuleModel> ruleModels = List.of(ruleA, ruleB, ruleC);
 | 
			
		||||
@@ -267,85 +252,6 @@ public class CreateRulesTests extends RestTest
 | 
			
		||||
        restClient.assertLastError().containsSummary("Rule name is a mandatory parameter");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we can create a rule without description. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES })
 | 
			
		||||
    public void createRuleWithoutDescription()
 | 
			
		||||
    {
 | 
			
		||||
        RestRuleModel ruleModel = createRuleModelWithDefaultValues();
 | 
			
		||||
        UserModel admin = dataUser.getAdminUser();
 | 
			
		||||
 | 
			
		||||
        RestRuleModel rule = restClient.authenticateUser(admin).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet()
 | 
			
		||||
            .createSingleRule(ruleModel);
 | 
			
		||||
 | 
			
		||||
        restClient.assertStatusCodeIs(CREATED);
 | 
			
		||||
        rule.assertThat().field("id").isNotNull()
 | 
			
		||||
            .assertThat().field("name").is(RULE_NAME_DEFAULT)
 | 
			
		||||
            .assertThat().field("description").isNull();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we can create a rule without specifying triggers but with the default "inbound" value. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES })
 | 
			
		||||
    public void createRuleWithoutTriggers()
 | 
			
		||||
    {
 | 
			
		||||
        RestRuleModel ruleModel = createRuleModelWithDefaultValues();
 | 
			
		||||
        UserModel admin = dataUser.getAdminUser();
 | 
			
		||||
 | 
			
		||||
        RestRuleModel rule = restClient.authenticateUser(admin).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet()
 | 
			
		||||
            .createSingleRule(ruleModel);
 | 
			
		||||
 | 
			
		||||
        restClient.assertStatusCodeIs(CREATED);
 | 
			
		||||
        rule.assertThat().field("id").isNotNull()
 | 
			
		||||
            .assertThat().field("name").is(RULE_NAME_DEFAULT)
 | 
			
		||||
            .assertThat().field("triggers").is(List.of("inbound"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we can create a rule without error script. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES })
 | 
			
		||||
    public void createRuleWithoutErrorScript()
 | 
			
		||||
    {
 | 
			
		||||
        RestRuleModel ruleModel = createRuleModelWithDefaultValues();
 | 
			
		||||
        UserModel admin = dataUser.getAdminUser();
 | 
			
		||||
 | 
			
		||||
        RestRuleModel rule = restClient.authenticateUser(admin).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet()
 | 
			
		||||
            .createSingleRule(ruleModel);
 | 
			
		||||
 | 
			
		||||
        restClient.assertStatusCodeIs(CREATED);
 | 
			
		||||
        rule.assertThat().field("id").isNotNull()
 | 
			
		||||
            .assertThat().field("name").is(RULE_NAME_DEFAULT)
 | 
			
		||||
            .assertThat().field("errorScript").isNull();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we can create a rule with irrelevant isShared flag, and it doesn't have impact to the process. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES })
 | 
			
		||||
    public void createRuleWithSharedFlag()
 | 
			
		||||
    {
 | 
			
		||||
        RestRuleModel ruleModel = createRuleModelWithDefaultValues();
 | 
			
		||||
        ruleModel.setIsShared(true);
 | 
			
		||||
        UserModel admin = dataUser.getAdminUser();
 | 
			
		||||
 | 
			
		||||
        RestRuleModel rule = restClient.authenticateUser(admin).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet()
 | 
			
		||||
            .createSingleRule(ruleModel);
 | 
			
		||||
 | 
			
		||||
        restClient.assertStatusCodeIs(CREATED);
 | 
			
		||||
        rule.assertThat().field("id").isNotNull()
 | 
			
		||||
            .assertThat().field("name").is(RULE_NAME_DEFAULT)
 | 
			
		||||
            .assertThat().field("isShared").isNull();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we can create a rule. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY })
 | 
			
		||||
    public void createRuleAndIncludeFieldsInResponse()
 | 
			
		||||
    {
 | 
			
		||||
        RestRuleModel ruleModel = createRuleModel("ruleName");
 | 
			
		||||
 | 
			
		||||
        RestRuleModel rule = restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet()
 | 
			
		||||
                                       .include("isShared")
 | 
			
		||||
                                       .createSingleRule(ruleModel);
 | 
			
		||||
 | 
			
		||||
        restClient.assertStatusCodeIs(CREATED);
 | 
			
		||||
        rule.assertThat().field("isShared").isNotNull();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public RestRuleModel testRolePermissionsWith(UserRole userRole)
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Create a user and use them to create a private site containing a folder");
 | 
			
		||||
@@ -355,101 +261,8 @@ public class CreateRulesTests extends RestTest
 | 
			
		||||
        STEP(String.format("Add a user with '%s' role in the private site's folder", userRole.toString()));
 | 
			
		||||
        UserModel userWithRole = dataUser.createRandomTestUser();
 | 
			
		||||
        dataUser.addUserToSite(userWithRole, privateSite, userRole);
 | 
			
		||||
        RestRuleModel ruleModel = createRuleModel("testRule", List.of(createDefaultActionModel()));
 | 
			
		||||
        RestRuleModel ruleModel = createRuleModel("testRule", List.of(createActionModel()));
 | 
			
		||||
 | 
			
		||||
        return restClient.authenticateUser(userWithRole).withCoreAPI().usingNode(privateFolder).usingDefaultRuleSet().createSingleRule(ruleModel);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check we can create a rule with several actions.
 | 
			
		||||
     */
 | 
			
		||||
    @Test(groups = {TestGroup.REST_API, TestGroup.RULES})
 | 
			
		||||
    public void createRuleWithActions()
 | 
			
		||||
    {
 | 
			
		||||
        final Map<String, Serializable> copyParams =
 | 
			
		||||
                Map.of("destination-folder", "dummy-folder-node", "deep-copy", true);
 | 
			
		||||
        final RestActionBodyExecTemplateModel copyAction = createCustomActionModel("copy", copyParams);
 | 
			
		||||
        final Map<String, Serializable> checkOutParams =
 | 
			
		||||
                Map.of("destination-folder", "dummy-folder-node", "assoc-name", "cm:checkout", "assoc-type",
 | 
			
		||||
                        "cm:contains");
 | 
			
		||||
        final RestActionBodyExecTemplateModel checkOutAction = createCustomActionModel("check-out", checkOutParams);
 | 
			
		||||
        final Map<String, Serializable> scriptParams = Map.of("script-ref", "dummy-script-node-id");
 | 
			
		||||
        final RestActionBodyExecTemplateModel scriptAction = createCustomActionModel("script", scriptParams);
 | 
			
		||||
        final RestRuleModel ruleModel = createRuleModelWithDefaultValues();
 | 
			
		||||
        ruleModel.setActions(Arrays.asList(copyAction, checkOutAction, scriptAction));
 | 
			
		||||
 | 
			
		||||
        final UserModel admin = dataUser.getAdminUser();
 | 
			
		||||
 | 
			
		||||
        final RestRuleModel rule = restClient.authenticateUser(admin).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet()
 | 
			
		||||
                .createSingleRule(ruleModel);
 | 
			
		||||
 | 
			
		||||
        final RestRuleModel expectedRuleModel = createRuleModelWithDefaultValues();
 | 
			
		||||
        expectedRuleModel.setActions(Arrays.asList(copyAction, checkOutAction, scriptAction));
 | 
			
		||||
        expectedRuleModel.setConditions(createEmptyConditionModel());
 | 
			
		||||
        expectedRuleModel.setTriggers(List.of("inbound"));
 | 
			
		||||
 | 
			
		||||
        restClient.assertStatusCodeIs(CREATED);
 | 
			
		||||
        rule.assertThat().isEqualTo(expectedRuleModel, IGNORE_ID, IGNORE_IS_SHARED)
 | 
			
		||||
                .assertThat().field("isShared").isNull();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check we can create a rule with multiple conditions
 | 
			
		||||
     */
 | 
			
		||||
    @Test(groups = {TestGroup.REST_API, TestGroup.RULES})
 | 
			
		||||
    public void createRuleWithConditions()
 | 
			
		||||
    {
 | 
			
		||||
        RestRuleModel ruleModel = createRuleModelWithDefaultValues();
 | 
			
		||||
        ruleModel.setConditions(createVariousConditions());
 | 
			
		||||
 | 
			
		||||
        RestRuleModel rule = restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet()
 | 
			
		||||
            .createSingleRule(ruleModel);
 | 
			
		||||
 | 
			
		||||
        RestRuleModel expectedRuleModel = createRuleModelWithDefaultValues();
 | 
			
		||||
        expectedRuleModel.setConditions(createVariousConditions());
 | 
			
		||||
        expectedRuleModel.setTriggers(List.of("inbound"));
 | 
			
		||||
        restClient.assertStatusCodeIs(CREATED);
 | 
			
		||||
        rule.assertThat().isEqualTo(expectedRuleModel, IGNORE_ID, IGNORE_IS_SHARED);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check we can create a rule with empty list as conditions
 | 
			
		||||
     */
 | 
			
		||||
    @Test(groups = {TestGroup.REST_API, TestGroup.RULES})
 | 
			
		||||
    public void createRuleWithConditions_emptyConditionList()
 | 
			
		||||
    {
 | 
			
		||||
        RestRuleModel ruleModel = createRuleModelWithDefaultValues();
 | 
			
		||||
        ruleModel.setConditions(createCompositeCondition(null));
 | 
			
		||||
 | 
			
		||||
        RestRuleModel rule = restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet()
 | 
			
		||||
            .createSingleRule(ruleModel);
 | 
			
		||||
 | 
			
		||||
        RestRuleModel expectedRuleModel = createRuleModelWithDefaultValues();
 | 
			
		||||
        expectedRuleModel.setConditions(createCompositeCondition(null));
 | 
			
		||||
        expectedRuleModel.setTriggers(List.of("inbound"));
 | 
			
		||||
        restClient.assertStatusCodeIs(CREATED);
 | 
			
		||||
        rule.assertThat().isEqualTo(expectedRuleModel, IGNORE_ID, IGNORE_IS_SHARED);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check we can NOT create a rule when category ID in condition is invalid, HTTP status code 400 is expected
 | 
			
		||||
     */
 | 
			
		||||
    @Test(groups = {TestGroup.REST_API, TestGroup.RULES})
 | 
			
		||||
    public void createRuleWithConditions_invalidCategory()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Try to create a rule with non existing category in conditions.");
 | 
			
		||||
        String fakeCategoryId = "bdba5f9f-fake-id22-803b-349bcfd06fd1";
 | 
			
		||||
        RestCompositeConditionDefinitionModel conditions = createCompositeCondition(List.of(
 | 
			
		||||
            createCompositeCondition(!INVERTED, List.of(
 | 
			
		||||
                createSimpleCondition("category", "equals", fakeCategoryId)
 | 
			
		||||
            ))
 | 
			
		||||
        ));
 | 
			
		||||
        RestRuleModel ruleModel = createRuleModelWithDefaultValues();
 | 
			
		||||
        ruleModel.setConditions(conditions);
 | 
			
		||||
 | 
			
		||||
        restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet().createSingleRule(ruleModel);
 | 
			
		||||
 | 
			
		||||
        restClient.assertStatusCodeIs(BAD_REQUEST);
 | 
			
		||||
        restClient.assertLastError().containsSummary("Category in condition is invalid");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,142 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%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.rest.rules;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.rest.rules.RulesTestsUtils.createRuleModelWithModifiedValues;
 | 
			
		||||
import static org.alfresco.utility.report.log.Step.STEP;
 | 
			
		||||
import static org.testng.Assert.assertEquals;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
import java.util.stream.IntStream;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.RestTest;
 | 
			
		||||
import org.alfresco.rest.model.RestRuleModel;
 | 
			
		||||
import org.alfresco.rest.model.RestRuleModelsCollection;
 | 
			
		||||
import org.alfresco.rest.model.RestRuleSetLinkModel;
 | 
			
		||||
import org.alfresco.rest.model.RestRuleSetModel;
 | 
			
		||||
import org.alfresco.rest.model.RestRuleSetModelsCollection;
 | 
			
		||||
import org.alfresco.utility.model.FolderModel;
 | 
			
		||||
import org.alfresco.utility.model.SiteModel;
 | 
			
		||||
import org.alfresco.utility.model.TestGroup;
 | 
			
		||||
import org.alfresco.utility.model.UserModel;
 | 
			
		||||
import org.testng.annotations.BeforeClass;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tests for GET /nodes/{nodeId}/rule-sets/{ruleSetId}/rules with rule inheritance.
 | 
			
		||||
 */
 | 
			
		||||
@Test(groups = {TestGroup.RULES})
 | 
			
		||||
public class GetInheritedRulesTests extends RestTest
 | 
			
		||||
{
 | 
			
		||||
    private UserModel user;
 | 
			
		||||
    private SiteModel site;
 | 
			
		||||
 | 
			
		||||
    @BeforeClass(alwaysRun = true)
 | 
			
		||||
    public void dataPreparation()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Create a user and site");
 | 
			
		||||
        user = dataUser.createRandomTestUser();
 | 
			
		||||
        site = dataSite.usingUser(user).createPublicRandomSite();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check we can get all the rules for the folder by providing the different rule set ids.
 | 
			
		||||
     */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY })
 | 
			
		||||
    public void getInheritedRules()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Create a parent and child folder, each with inheriting rules");
 | 
			
		||||
        FolderModel parent = dataContent.usingUser(user).usingSite(site).createFolder();
 | 
			
		||||
        FolderModel child = dataContent.usingUser(user).usingResource(parent).createFolder();
 | 
			
		||||
        RestRuleModel parentRule = createRuleModelWithModifiedValues();
 | 
			
		||||
        parentRule = restClient.authenticateUser(user).withCoreAPI().usingNode(parent).usingDefaultRuleSet().createSingleRule(parentRule);
 | 
			
		||||
        RestRuleModel childRule = createRuleModelWithModifiedValues();
 | 
			
		||||
        childRule = restClient.authenticateUser(user).withCoreAPI().usingNode(child).usingDefaultRuleSet().createSingleRule(childRule);
 | 
			
		||||
 | 
			
		||||
        STEP("Get the rules in the default rule set for the child folder");
 | 
			
		||||
        RestRuleModelsCollection rules = restClient.authenticateUser(user).withCoreAPI().usingNode(child).usingDefaultRuleSet().getListOfRules();
 | 
			
		||||
        rules.assertThat().entriesListContains("id", childRule.getId())
 | 
			
		||||
             .and().entriesListCountIs(1);
 | 
			
		||||
 | 
			
		||||
        STEP("Get the rules in the inherited rule set for the child folder");
 | 
			
		||||
        RestRuleSetModelsCollection ruleSets = restClient.authenticateUser(user).withCoreAPI().usingNode(child).include("inclusionType").getListOfRuleSets();
 | 
			
		||||
        String inheritedRuleSetId = ruleSets.getEntries().stream()
 | 
			
		||||
                                            .filter(ruleSet -> ruleSet.onModel().getInclusionType().equals("inherited"))
 | 
			
		||||
                                            .findFirst().get().onModel().getId();
 | 
			
		||||
        RestRuleModelsCollection inheritedRules = restClient.authenticateUser(user).withCoreAPI().usingNode(child).usingRuleSet(inheritedRuleSetId).getListOfRules();
 | 
			
		||||
        inheritedRules.assertThat().entriesListContains("id", parentRule.getId())
 | 
			
		||||
                      .and().entriesListCountIs(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check that we only get each rule once with linking and inheritance, and the order is correct.
 | 
			
		||||
     * <p>
 | 
			
		||||
     * The folder structure for this test is as follows:
 | 
			
		||||
     * <pre>
 | 
			
		||||
     *      A --[links]-> DRuleSet
 | 
			
		||||
     *      +-B --[owns]-> BRuleSet
 | 
			
		||||
     *        +-C --[owns]-> CRuleSet
 | 
			
		||||
     *          +-D --[owns]--> DRuleSet
 | 
			
		||||
     * </pre>
 | 
			
		||||
     */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY })
 | 
			
		||||
    public void rulesReturnedAreUnique()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Create four folders with rules");
 | 
			
		||||
        FolderModel folderA = dataContent.usingUser(user).usingSite(site).createFolder();
 | 
			
		||||
        FolderModel folderB = dataContent.usingUser(user).usingResource(folderA).createFolder();
 | 
			
		||||
        FolderModel folderC = dataContent.usingUser(user).usingResource(folderB).createFolder();
 | 
			
		||||
        FolderModel folderD = dataContent.usingUser(user).usingResource(folderC).createFolder();
 | 
			
		||||
        RestRuleModel ruleB = restClient.authenticateUser(user).withCoreAPI().usingNode(folderB).usingDefaultRuleSet().createSingleRule(createRuleModelWithModifiedValues());
 | 
			
		||||
        RestRuleModel ruleC = restClient.authenticateUser(user).withCoreAPI().usingNode(folderC).usingDefaultRuleSet().createSingleRule(createRuleModelWithModifiedValues());
 | 
			
		||||
        RestRuleModel ruleD = restClient.authenticateUser(user).withCoreAPI().usingNode(folderD).usingDefaultRuleSet().createSingleRule(createRuleModelWithModifiedValues());
 | 
			
		||||
        STEP("Link folderA to ruleSetD");
 | 
			
		||||
        RestRuleSetLinkModel linkModel = new RestRuleSetLinkModel();
 | 
			
		||||
        linkModel.setId(folderD.getNodeRef());
 | 
			
		||||
        restClient.authenticateUser(user).withCoreAPI().usingNode(folderA).createRuleLink(linkModel);
 | 
			
		||||
 | 
			
		||||
        STEP("Get the rule sets for the folderD");
 | 
			
		||||
        List<RestRuleSetModel> ruleSets = restClient.authenticateUser(user).withCoreAPI().usingNode(folderD).getListOfRuleSets().getEntries();
 | 
			
		||||
 | 
			
		||||
        STEP("Check the rules for each rule set are as expected");
 | 
			
		||||
        List<RestRuleModel> expectedRuleIds = List.of(ruleD, ruleB, ruleC);
 | 
			
		||||
        IntStream.range(0, 2).forEach(index -> {
 | 
			
		||||
            String ruleSetId = ruleSets.get(index).onModel().getId();
 | 
			
		||||
            List<RestRuleModel> rules = restClient.authenticateUser(user)
 | 
			
		||||
                                                  .withCoreAPI()
 | 
			
		||||
                                                  .usingNode(folderD)
 | 
			
		||||
                                                  .usingRuleSet(ruleSetId)
 | 
			
		||||
                                                  .getListOfRules()
 | 
			
		||||
                                                  .getEntries()
 | 
			
		||||
                                                  .stream()
 | 
			
		||||
                                                  .map(RestRuleModel::onModel)
 | 
			
		||||
                                                  .collect(Collectors.toList());
 | 
			
		||||
            assertEquals(rules, List.of(expectedRuleIds.get(index)), "Unexpected rules found for rule set " + ruleSetId);
 | 
			
		||||
        });
 | 
			
		||||
        assertEquals(ruleSets.size(), 3, "Expected three unique rule sets to be returned but got " + ruleSets);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -33,9 +33,9 @@ import static org.springframework.http.HttpStatus.OK;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.RestTest;
 | 
			
		||||
import org.alfresco.rest.model.RestRuleModel;
 | 
			
		||||
import org.alfresco.rest.model.RestRuleModelsCollection;
 | 
			
		||||
import org.alfresco.rest.model.RestRuleSetModel;
 | 
			
		||||
import org.alfresco.rest.model.RestRuleSetModelsCollection;
 | 
			
		||||
import org.alfresco.rest.model.RestRuleSettingsModel;
 | 
			
		||||
import org.alfresco.utility.model.FolderModel;
 | 
			
		||||
import org.alfresco.utility.model.SiteModel;
 | 
			
		||||
import org.alfresco.utility.model.TestGroup;
 | 
			
		||||
@@ -52,10 +52,7 @@ public class GetRuleSetsTests extends RestTest
 | 
			
		||||
    private UserModel user;
 | 
			
		||||
    private SiteModel site;
 | 
			
		||||
    private FolderModel ruleFolder;
 | 
			
		||||
    private FolderModel inheritingChildFolder;
 | 
			
		||||
    private FolderModel notInheritingChildFolder;
 | 
			
		||||
    private RestRuleModel rule;
 | 
			
		||||
    private String ruleSetId;
 | 
			
		||||
 | 
			
		||||
    @BeforeClass (alwaysRun = true)
 | 
			
		||||
    public void dataPreparation()
 | 
			
		||||
@@ -65,24 +62,10 @@ public class GetRuleSetsTests extends RestTest
 | 
			
		||||
        site = dataSite.usingUser(user).createPublicRandomSite();
 | 
			
		||||
        ruleFolder = dataContent.usingUser(user).usingSite(site).createFolder();
 | 
			
		||||
 | 
			
		||||
        STEP("Create two children of the folder - one that inherits rules and one that doesn't");
 | 
			
		||||
        inheritingChildFolder = dataContent.usingUser(user).usingResource(ruleFolder).createFolder();
 | 
			
		||||
        notInheritingChildFolder = dataContent.usingUser(user).usingResource(ruleFolder).createFolder();
 | 
			
		||||
        RestRuleSettingsModel doesntInherit = new RestRuleSettingsModel();
 | 
			
		||||
        doesntInherit.setValue(false);
 | 
			
		||||
        restClient.authenticateUser(user).withCoreAPI().usingNode(notInheritingChildFolder)
 | 
			
		||||
                  .usingIsInheritanceEnabledRuleSetting().updateSetting(doesntInherit);
 | 
			
		||||
 | 
			
		||||
        STEP("Create a rule in the folder.");
 | 
			
		||||
        RestRuleModel ruleModel = createRuleModel("ruleName");
 | 
			
		||||
        rule = restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet()
 | 
			
		||||
                                       .createSingleRule(ruleModel);
 | 
			
		||||
 | 
			
		||||
        STEP("Get the rule sets for the folder and find the rule set id");
 | 
			
		||||
        RestRuleSetModelsCollection ruleSets = restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder)
 | 
			
		||||
                                                         .getListOfRuleSets();
 | 
			
		||||
        ruleSets.assertThat().entriesListCountIs(1);
 | 
			
		||||
        ruleSetId = ruleSets.getEntries().get(0).onModel().getId();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we can get an empty list of rule sets. */
 | 
			
		||||
@@ -125,74 +108,16 @@ public class GetRuleSetsTests extends RestTest
 | 
			
		||||
        restClient.assertStatusCodeIs(NOT_FOUND);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we can get the id of the folder that owns a list of rule sets. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES })
 | 
			
		||||
    public void getRuleSetsAndOwningFolders()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Get the rule sets and owning folders");
 | 
			
		||||
        RestRuleSetModelsCollection ruleSets = restClient.authenticateUser(user).withCoreAPI()
 | 
			
		||||
                                                 .usingNode(ruleFolder)
 | 
			
		||||
                                                 .include("owningFolder")
 | 
			
		||||
                                                 .getListOfRuleSets();
 | 
			
		||||
 | 
			
		||||
        restClient.assertStatusCodeIs(OK);
 | 
			
		||||
        ruleSets.getEntries().get(0).onModel()
 | 
			
		||||
                .assertThat().field("owningFolder").is(ruleFolder.getNodeRef())
 | 
			
		||||
                .assertThat().field("id").is(ruleSetId);
 | 
			
		||||
        ruleSets.assertThat().entriesListCountIs(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we can get the reason that a rule set is included in the list. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES })
 | 
			
		||||
    public void getRuleSetsAndOwnedInclusionType()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Get the rule sets and inclusion type");
 | 
			
		||||
        RestRuleSetModelsCollection ruleSets = restClient.authenticateUser(user).withCoreAPI()
 | 
			
		||||
                                                         .usingNode(ruleFolder)
 | 
			
		||||
                                                         .include("inclusionType")
 | 
			
		||||
                                                         .getListOfRuleSets();
 | 
			
		||||
 | 
			
		||||
        restClient.assertStatusCodeIs(OK);
 | 
			
		||||
        ruleSets.getEntries().get(0).onModel()
 | 
			
		||||
                .assertThat().field("inclusionType").is("owned")
 | 
			
		||||
                .assertThat().field("id").is(ruleSetId);
 | 
			
		||||
        ruleSets.assertThat().entriesListCountIs(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we can tell that a rule set has been inherited. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES })
 | 
			
		||||
    public void getRuleSetsAndInheritedInclusionType()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Get the rule sets and inclusion type");
 | 
			
		||||
        RestRuleSetModelsCollection ruleSets = restClient.authenticateUser(user).withCoreAPI()
 | 
			
		||||
                                                         .usingNode(inheritingChildFolder)
 | 
			
		||||
                                                         .include("inclusionType")
 | 
			
		||||
                                                         .getListOfRuleSets();
 | 
			
		||||
 | 
			
		||||
        restClient.assertStatusCodeIs(OK);
 | 
			
		||||
        ruleSets.getEntries().get(0).onModel()
 | 
			
		||||
                .assertThat().field("inclusionType").is("inherited")
 | 
			
		||||
                .assertThat().field("id").is(ruleSetId);
 | 
			
		||||
        ruleSets.assertThat().entriesListCountIs(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check that a rule set is not inherited if inheriting is disabled. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES })
 | 
			
		||||
    public void getRuleSetsWithoutInheriting()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Get the rule sets and inclusion type");
 | 
			
		||||
        RestRuleSetModelsCollection ruleSets = restClient.authenticateUser(user).withCoreAPI()
 | 
			
		||||
                                                         .usingNode(notInheritingChildFolder)
 | 
			
		||||
                                                         .getListOfRuleSets();
 | 
			
		||||
 | 
			
		||||
        restClient.assertStatusCodeIs(OK);
 | 
			
		||||
        ruleSets.assertThat().entriesListCountIs(0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we can get a rule set by its id. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY })
 | 
			
		||||
    public void getRuleSetById()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Get the rule sets for the folder and find the rule set id");
 | 
			
		||||
        RestRuleSetModelsCollection ruleSets = restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder)
 | 
			
		||||
                                                         .getListOfRuleSets();
 | 
			
		||||
        ruleSets.assertThat().entriesListCountIs(1);
 | 
			
		||||
        String ruleSetId = ruleSets.getEntries().get(0).onModel().getId();
 | 
			
		||||
 | 
			
		||||
        STEP("Get the rule set using its rule set id");
 | 
			
		||||
        RestRuleSetModel ruleSet = restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder)
 | 
			
		||||
                                             .getRuleSet(ruleSetId);
 | 
			
		||||
@@ -225,27 +150,12 @@ public class GetRuleSetsTests extends RestTest
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we get 404 for a non-existing rule set id. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES })
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY })
 | 
			
		||||
    public void getRuleSetByNonExistingId()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Get the rule set using fake rule set id");
 | 
			
		||||
        String fakeRuleSetId = "fake-rule-set-id";
 | 
			
		||||
        restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).getRuleSet(fakeRuleSetId);
 | 
			
		||||
        String ruleSetId = "fake-rule-set-id";
 | 
			
		||||
        restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).getRuleSet(ruleSetId);
 | 
			
		||||
        restClient.assertStatusCodeIs(NOT_FOUND);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we can get the id of the folder that owns a rule set. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES })
 | 
			
		||||
    public void getRuleSetAndOwningFolder()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Get the rule set and owning folder");
 | 
			
		||||
        RestRuleSetModel ruleSet = restClient.authenticateUser(user).withCoreAPI()
 | 
			
		||||
                                             .usingNode(ruleFolder)
 | 
			
		||||
                                             .include("owningFolder")
 | 
			
		||||
                                             .getRuleSet(ruleSetId);
 | 
			
		||||
 | 
			
		||||
        restClient.assertStatusCodeIs(OK);
 | 
			
		||||
        ruleSet.assertThat().field("owningFolder").is(ruleFolder.getNodeRef())
 | 
			
		||||
               .assertThat().field("id").is(ruleSetId);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -27,14 +27,13 @@ package org.alfresco.rest.rules;
 | 
			
		||||
 | 
			
		||||
import static java.util.stream.Collectors.toList;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.rest.rules.RulesTestsUtils.*;
 | 
			
		||||
import static org.alfresco.rest.rules.RulesTestsUtils.createRuleModel;
 | 
			
		||||
import static org.alfresco.utility.constants.UserRole.SiteCollaborator;
 | 
			
		||||
import static org.alfresco.utility.report.log.Step.STEP;
 | 
			
		||||
import static org.junit.Assert.assertTrue;
 | 
			
		||||
import static org.springframework.http.HttpStatus.FORBIDDEN;
 | 
			
		||||
import static org.springframework.http.HttpStatus.NOT_FOUND;
 | 
			
		||||
import static org.springframework.http.HttpStatus.OK;
 | 
			
		||||
import static org.springframework.http.HttpStatus.CREATED;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.stream.IntStream;
 | 
			
		||||
@@ -61,8 +60,6 @@ public class GetRulesTests extends RestTest
 | 
			
		||||
    private FolderModel ruleFolder;
 | 
			
		||||
    private List<RestRuleModel> createdRules;
 | 
			
		||||
    private RestRuleModel createdRuleA;
 | 
			
		||||
    private static final String IGNORE_ID = "id";
 | 
			
		||||
    private static final String IGNORE_IS_SHARED = "isShared";
 | 
			
		||||
 | 
			
		||||
    @BeforeClass(alwaysRun = true)
 | 
			
		||||
    public void dataPreparation()
 | 
			
		||||
@@ -94,11 +91,7 @@ public class GetRulesTests extends RestTest
 | 
			
		||||
        assertTrue("Expected no rules to be present.", rules.isEmpty());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check we can get all the rules for a folder.
 | 
			
		||||
     * <p>
 | 
			
		||||
     * Also check that the isShared field is not returned when not requested.
 | 
			
		||||
     */
 | 
			
		||||
    /** Check we can get all the rules for a folder. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY })
 | 
			
		||||
    public void getRulesList()
 | 
			
		||||
    {
 | 
			
		||||
@@ -109,9 +102,8 @@ public class GetRulesTests extends RestTest
 | 
			
		||||
        rules.assertThat().entriesListCountIs(createdRules.size());
 | 
			
		||||
        IntStream.range(0, createdRules.size()).forEach(i ->
 | 
			
		||||
                rules.getEntries().get(i).onModel()
 | 
			
		||||
                     .assertThat().field("id").is(createdRules.get(i).getId())
 | 
			
		||||
                     .assertThat().field("name").is(createdRules.get(i).getName())
 | 
			
		||||
                     .assertThat().field("isShared").isNull());
 | 
			
		||||
                         .assertThat().field("id").is(createdRules.get(i).getId())
 | 
			
		||||
                         .assertThat().field("name").is(createdRules.get(i).getName()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we get a 404 if trying to load rules for a folder that doesn't exist. */
 | 
			
		||||
@@ -136,33 +128,7 @@ public class GetRulesTests extends RestTest
 | 
			
		||||
        restClient.assertStatusCodeIs(NOT_FOUND);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we can get all the rules for a folder along with the extra "include" and "other" fields. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY })
 | 
			
		||||
    public void getRulesListWithIncludedFields()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Get the rules that apply to the folder");
 | 
			
		||||
        RestRuleModelsCollection rules = restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet()
 | 
			
		||||
                                                   .include("isShared")
 | 
			
		||||
                                                   .getListOfRules();
 | 
			
		||||
 | 
			
		||||
        rules.assertThat().entriesListCountIs(createdRules.size());
 | 
			
		||||
        IntStream.range(0, createdRules.size()).forEach(i ->
 | 
			
		||||
                rules.getEntries().get(i).onModel()
 | 
			
		||||
                     .assertThat().field("isShared").isNotNull()
 | 
			
		||||
                        .assertThat().field("description").isNull()
 | 
			
		||||
                        .assertThat().field("enabled").is(false)
 | 
			
		||||
                        .assertThat().field("cascade").is(false)
 | 
			
		||||
                        .assertThat().field("asynchronous").is(false)
 | 
			
		||||
                        .assertThat().field("errorScript").isNull()
 | 
			
		||||
                        .assertThat().field("shared").isNull()
 | 
			
		||||
                        .assertThat().field("triggers").is("[inbound]"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check we can get a rule by its id.
 | 
			
		||||
     * <p>
 | 
			
		||||
     * Also check that the isShared field is not returned when not requested.
 | 
			
		||||
     */
 | 
			
		||||
    /** Check we can get a rule by its id. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY })
 | 
			
		||||
    public void getSingleRule()
 | 
			
		||||
    {
 | 
			
		||||
@@ -172,54 +138,7 @@ public class GetRulesTests extends RestTest
 | 
			
		||||
        restClient.assertStatusCodeIs(OK);
 | 
			
		||||
 | 
			
		||||
        rule.assertThat().field("id").is(createdRuleA.getId())
 | 
			
		||||
            .assertThat().field("name").is(createdRuleA.getName())
 | 
			
		||||
            .assertThat().field("isShared").isNull();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we can get rule's other fields */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY })
 | 
			
		||||
    public void getRulesOtherFieldsModified()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Create a rule with all other fields default values modified");
 | 
			
		||||
        RestRuleModel ruleModel = createRuleModelWithModifiedValues();
 | 
			
		||||
        ruleModel.setTriggers(List.of("update"));
 | 
			
		||||
        UserModel admin = dataUser.getAdminUser();
 | 
			
		||||
        FolderModel folder = dataContent.usingUser(user).usingSite(site).createFolder();
 | 
			
		||||
        RestRuleModel rule = restClient.authenticateUser(admin).withCoreAPI().usingNode(folder).usingDefaultRuleSet()
 | 
			
		||||
                .createSingleRule(ruleModel);
 | 
			
		||||
 | 
			
		||||
        RestRuleModel expectedRuleModel = createRuleModelWithModifiedValues();
 | 
			
		||||
        expectedRuleModel.setTriggers(List.of("update"));
 | 
			
		||||
        expectedRuleModel.setConditions(createEmptyConditionModel());
 | 
			
		||||
 | 
			
		||||
        restClient.assertStatusCodeIs(CREATED);
 | 
			
		||||
        rule.assertThat().isEqualTo(expectedRuleModel, IGNORE_ID, IGNORE_IS_SHARED)
 | 
			
		||||
                .assertThat().field("id").isNotNull()
 | 
			
		||||
                .assertThat().field("isShared").isNull();
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we can get rule's "other" fields */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY })
 | 
			
		||||
    public void getRulesDefaultFields()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Create a rule with all other fields default values");
 | 
			
		||||
        RestRuleModel ruleModel = createRuleModelWithDefaultValues();
 | 
			
		||||
        UserModel admin = dataUser.getAdminUser();
 | 
			
		||||
        FolderModel folder = dataContent.usingUser(user).usingSite(site).createFolder();
 | 
			
		||||
        RestRuleModel rule = restClient.authenticateUser(admin).withCoreAPI().usingNode(folder).usingDefaultRuleSet()
 | 
			
		||||
                .createSingleRule(ruleModel);
 | 
			
		||||
 | 
			
		||||
        RestRuleModel expectedRuleModel = createRuleModelWithDefaultValues();
 | 
			
		||||
        expectedRuleModel.setTriggers(List.of("inbound"));
 | 
			
		||||
        expectedRuleModel.setConditions(createEmptyConditionModel());
 | 
			
		||||
 | 
			
		||||
        restClient.assertStatusCodeIs(CREATED);
 | 
			
		||||
 | 
			
		||||
        restClient.assertStatusCodeIs(CREATED);
 | 
			
		||||
        rule.assertThat().isEqualTo(expectedRuleModel, IGNORE_ID, IGNORE_IS_SHARED)
 | 
			
		||||
                .assertThat().field("id").isNotNull()
 | 
			
		||||
                .assertThat().field("isShared").isNull();
 | 
			
		||||
            .assertThat().field("name").is(createdRuleA.getName());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we get a 404 if trying to load a rule from a folder that doesn't exist. */
 | 
			
		||||
@@ -255,18 +174,6 @@ public class GetRulesTests extends RestTest
 | 
			
		||||
        restClient.assertStatusCodeIs(NOT_FOUND);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we can get a rule by its id along with any included fields. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY })
 | 
			
		||||
    public void getSingleRuleWithIncludedFields()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Load a particular rule");
 | 
			
		||||
        RestRuleModel rule = restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet()
 | 
			
		||||
                                       .include("isShared")
 | 
			
		||||
                                       .getSingleRule(createdRuleA.getId());
 | 
			
		||||
 | 
			
		||||
        rule.assertThat().field("isShared").isNotNull();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check that a user without read permission cannot view the folder rules. */
 | 
			
		||||
    public void requireReadPermissionToGetRule()
 | 
			
		||||
    {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,313 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.rules;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.rest.rules.RulesTestsUtils.createRuleModel;
 | 
			
		||||
import static org.alfresco.utility.report.log.Step.STEP;
 | 
			
		||||
import static org.springframework.http.HttpStatus.BAD_REQUEST;
 | 
			
		||||
import static org.springframework.http.HttpStatus.CREATED;
 | 
			
		||||
import static org.springframework.http.HttpStatus.NOT_FOUND;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.dataprep.CMISUtil;
 | 
			
		||||
import org.alfresco.rest.RestTest;
 | 
			
		||||
import org.alfresco.rest.model.RestRuleModel;
 | 
			
		||||
import org.alfresco.rest.model.RestRuleModelsCollection;
 | 
			
		||||
import org.alfresco.rest.model.RestRuleSetLinkModel;
 | 
			
		||||
import org.alfresco.rest.model.RestRuleSetModel;
 | 
			
		||||
import org.alfresco.rest.model.RestRuleSetModelsCollection;
 | 
			
		||||
import org.alfresco.utility.model.FileModel;
 | 
			
		||||
import org.alfresco.utility.model.FolderModel;
 | 
			
		||||
import org.alfresco.utility.model.SiteModel;
 | 
			
		||||
import org.alfresco.utility.model.TestGroup;
 | 
			
		||||
import org.alfresco.utility.model.UserModel;
 | 
			
		||||
import org.testng.annotations.BeforeClass;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tests for /nodes/{nodeId}/rule-set-links.
 | 
			
		||||
 */
 | 
			
		||||
@Test(groups = {TestGroup.RULES})
 | 
			
		||||
public class RuleSetLinksTests extends RestTest
 | 
			
		||||
{
 | 
			
		||||
    private UserModel user;
 | 
			
		||||
    private SiteModel site;
 | 
			
		||||
 | 
			
		||||
    @BeforeClass(alwaysRun = true)
 | 
			
		||||
    public void dataPreparation()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Create a user and site.");
 | 
			
		||||
        user = dataUser.createRandomTestUser();
 | 
			
		||||
        site = dataSite.usingUser(user).createPublicRandomSite();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check we can link to folder containing a rule set.
 | 
			
		||||
     */
 | 
			
		||||
    @Test(groups = {TestGroup.REST_API, TestGroup.RULES})
 | 
			
		||||
    public void linkToFolderContainingRules()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Create folders in existing site");
 | 
			
		||||
        final FolderModel ruleFolder = dataContent.usingUser(user).usingSite(site).createFolder();
 | 
			
		||||
        final FolderModel folder = dataContent.usingUser(user).usingSite(site).createFolder();
 | 
			
		||||
 | 
			
		||||
        STEP("Create a rule in the rule folder.");
 | 
			
		||||
        RestRuleModel ruleModel = createRuleModel("ruleName");
 | 
			
		||||
        RestRuleModel rule = restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet()
 | 
			
		||||
                .createSingleRule(ruleModel);
 | 
			
		||||
 | 
			
		||||
        STEP("Get the rule sets for the folder and find the rule set id");
 | 
			
		||||
        final RestRuleSetModelsCollection ruleSets = restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder)
 | 
			
		||||
                .getListOfRuleSets();
 | 
			
		||||
        ruleSets.assertThat().entriesListCountIs(1);
 | 
			
		||||
        final String ruleSetId = ruleSets.getEntries().get(0).onModel().getId();
 | 
			
		||||
 | 
			
		||||
        STEP("Link to a rule folder");
 | 
			
		||||
        final RestRuleSetLinkModel request = new RestRuleSetLinkModel();
 | 
			
		||||
        request.setId(ruleFolder.getNodeRef());
 | 
			
		||||
        final RestRuleSetLinkModel ruleLink = restClient.authenticateUser(user).withCoreAPI().usingNode(folder).createRuleLink(request);
 | 
			
		||||
 | 
			
		||||
        STEP("Assert link result");
 | 
			
		||||
        restClient.assertStatusCodeIs(CREATED);
 | 
			
		||||
        final RestRuleSetLinkModel expectedLink = new RestRuleSetLinkModel();
 | 
			
		||||
        expectedLink.setId(ruleSetId);
 | 
			
		||||
        ruleLink.assertThat().isEqualTo(expectedLink);
 | 
			
		||||
 | 
			
		||||
        STEP("Check if folder returns same rules");
 | 
			
		||||
        final RestRuleModelsCollection linkedRules = restClient.authenticateUser(user).withCoreAPI()
 | 
			
		||||
                .usingNode(folder)
 | 
			
		||||
                .usingDefaultRuleSet()
 | 
			
		||||
                .getListOfRules();
 | 
			
		||||
        linkedRules.assertThat().entriesListCountIs(1);
 | 
			
		||||
        linkedRules.getEntries().get(0).onModel().assertThat().isEqualTo(rule);
 | 
			
		||||
 | 
			
		||||
        STEP("Check if folder returns rule set with linked inclusionType");
 | 
			
		||||
        final RestRuleSetModelsCollection linkedRuleSets = restClient.authenticateUser(user).withCoreAPI()
 | 
			
		||||
                .usingNode(folder)
 | 
			
		||||
                .include("inclusionType")
 | 
			
		||||
                .getListOfRuleSets();
 | 
			
		||||
        linkedRuleSets.assertThat().entriesListCountIs(1);
 | 
			
		||||
        final RestRuleSetModel expectedRuleSet = new RestRuleSetModel();
 | 
			
		||||
        expectedRuleSet.setId(ruleSetId);
 | 
			
		||||
        expectedRuleSet.setInclusionType("linked");
 | 
			
		||||
        linkedRuleSets.getEntries()
 | 
			
		||||
                .get(0).onModel().assertThat().isEqualTo(expectedRuleSet);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check we can link to a rule set.
 | 
			
		||||
     */
 | 
			
		||||
    @Test(groups = {TestGroup.REST_API, TestGroup.RULES})
 | 
			
		||||
    public void linkToRuleSet()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Create folders in existing site");
 | 
			
		||||
        final FolderModel ruleFolder = dataContent.usingUser(user).usingSite(site).createFolder();
 | 
			
		||||
        final FolderModel folder = dataContent.usingUser(user).usingSite(site).createFolder();
 | 
			
		||||
 | 
			
		||||
        STEP("Create a rule in the rule folder.");
 | 
			
		||||
        RestRuleModel ruleModel = createRuleModel("ruleName");
 | 
			
		||||
        RestRuleModel rule = restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet()
 | 
			
		||||
                .createSingleRule(ruleModel);
 | 
			
		||||
 | 
			
		||||
        STEP("Get the rule sets for the folder and find the rule set id");
 | 
			
		||||
        final RestRuleSetModelsCollection ruleSets = restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder)
 | 
			
		||||
                .getListOfRuleSets();
 | 
			
		||||
        ruleSets.assertThat().entriesListCountIs(1);
 | 
			
		||||
        final String ruleSetId = ruleSets.getEntries().get(0).onModel().getId();
 | 
			
		||||
 | 
			
		||||
        STEP("Link to a rule set");
 | 
			
		||||
        final RestRuleSetLinkModel request = new RestRuleSetLinkModel();
 | 
			
		||||
        request.setId(ruleSetId);
 | 
			
		||||
        final RestRuleSetLinkModel ruleLink = restClient.authenticateUser(user).withCoreAPI().usingNode(folder).createRuleLink(request);
 | 
			
		||||
 | 
			
		||||
        STEP("Assert link result");
 | 
			
		||||
        restClient.assertStatusCodeIs(CREATED);
 | 
			
		||||
        final RestRuleSetLinkModel expectedLink = new RestRuleSetLinkModel();
 | 
			
		||||
        expectedLink.setId(ruleSetId);
 | 
			
		||||
        ruleLink.assertThat().isEqualTo(expectedLink);
 | 
			
		||||
 | 
			
		||||
        STEP("Check if folder returns same rules");
 | 
			
		||||
        final RestRuleModelsCollection linkedRules = restClient.authenticateUser(user).withCoreAPI()
 | 
			
		||||
                .usingNode(folder)
 | 
			
		||||
                .usingDefaultRuleSet()
 | 
			
		||||
                .getListOfRules();
 | 
			
		||||
        linkedRules.assertThat().entriesListCountIs(1);
 | 
			
		||||
        linkedRules.getEntries().get(0).onModel().assertThat().isEqualTo(rule);
 | 
			
		||||
 | 
			
		||||
        STEP("Check if folder returns rule set with linked inclusionType");
 | 
			
		||||
        final RestRuleSetModelsCollection likedRuleSets = restClient.authenticateUser(user).withCoreAPI()
 | 
			
		||||
                .usingNode(folder)
 | 
			
		||||
                .include("inclusionType")
 | 
			
		||||
                .getListOfRuleSets();
 | 
			
		||||
        likedRuleSets.assertThat().entriesListCountIs(1);
 | 
			
		||||
        final RestRuleSetModel expectedRuleSet = new RestRuleSetModel();
 | 
			
		||||
        expectedRuleSet.setId(ruleSetId);
 | 
			
		||||
        expectedRuleSet.setInclusionType("linked");
 | 
			
		||||
        likedRuleSets.getEntries()
 | 
			
		||||
                .get(0).onModel().assertThat().isEqualTo(expectedRuleSet);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check we get 404 when linking to a non-existing rule set/folder.
 | 
			
		||||
     */
 | 
			
		||||
    @Test(groups = {TestGroup.REST_API, TestGroup.RULES})
 | 
			
		||||
    public void linkToNonExistingRuleSet()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Create a folder in existing site");
 | 
			
		||||
        final FolderModel folder = dataContent.usingUser(user).usingSite(site).createFolder();
 | 
			
		||||
 | 
			
		||||
        STEP("Link to non-existing rule set");
 | 
			
		||||
        final RestRuleSetLinkModel request = new RestRuleSetLinkModel();
 | 
			
		||||
        request.setId("dummy-rule-set-id");
 | 
			
		||||
        restClient.authenticateUser(user).withCoreAPI().usingNode(folder).createRuleLink(request);
 | 
			
		||||
 | 
			
		||||
        STEP("Assert link result is 404");
 | 
			
		||||
        restClient.assertStatusCodeIs(NOT_FOUND);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check we get bad request error when linking to a folder without rules.
 | 
			
		||||
     */
 | 
			
		||||
    @Test(groups = {TestGroup.REST_API, TestGroup.RULES})
 | 
			
		||||
    public void linkToFolderWithoutRules()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Create 2 folders without rules in existing site");
 | 
			
		||||
        final FolderModel folder1 = dataContent.usingUser(user).usingSite(site).createFolder();
 | 
			
		||||
        final FolderModel folder2 = dataContent.usingUser(user).usingSite(site).createFolder();
 | 
			
		||||
 | 
			
		||||
        STEP("Link to a folder without rules");
 | 
			
		||||
        final RestRuleSetLinkModel request = new RestRuleSetLinkModel();
 | 
			
		||||
        request.setId(folder2.getNodeRef());
 | 
			
		||||
        restClient.authenticateUser(user).withCoreAPI().usingNode(folder1).createRuleLink(request);
 | 
			
		||||
 | 
			
		||||
        STEP("Assert link result is 400");
 | 
			
		||||
        restClient.assertStatusCodeIs(BAD_REQUEST)
 | 
			
		||||
                .assertLastError().containsSummary("The target node has no rules to link.");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check we get bad request error when linking from a folder which already has rules.
 | 
			
		||||
     */
 | 
			
		||||
    @Test(groups = {TestGroup.REST_API, TestGroup.RULES})
 | 
			
		||||
    public void linkFromFolderWithRules()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Create folders in existing site");
 | 
			
		||||
        final FolderModel folder1 = dataContent.usingUser(user).usingSite(site).createFolder();
 | 
			
		||||
        final FolderModel folder2 = dataContent.usingUser(user).usingSite(site).createFolder();
 | 
			
		||||
 | 
			
		||||
        STEP("Create rules in both folders.");
 | 
			
		||||
        RestRuleModel ruleModel1 = createRuleModel("ruleName1");
 | 
			
		||||
        restClient.authenticateUser(user).withCoreAPI().usingNode(folder1).usingDefaultRuleSet()
 | 
			
		||||
                .createSingleRule(ruleModel1);
 | 
			
		||||
        RestRuleModel ruleModel2 = createRuleModel("ruleName2");
 | 
			
		||||
        restClient.authenticateUser(user).withCoreAPI().usingNode(folder2).usingDefaultRuleSet()
 | 
			
		||||
                .createSingleRule(ruleModel2);
 | 
			
		||||
 | 
			
		||||
        STEP("Link from a folder with rules");
 | 
			
		||||
        final RestRuleSetLinkModel request = new RestRuleSetLinkModel();
 | 
			
		||||
        request.setId(folder2.getNodeRef());
 | 
			
		||||
        restClient.authenticateUser(user).withCoreAPI().usingNode(folder1).createRuleLink(request);
 | 
			
		||||
 | 
			
		||||
        STEP("Assert link result is 400");
 | 
			
		||||
        restClient.assertStatusCodeIs(BAD_REQUEST)
 | 
			
		||||
                .assertLastError().containsSummary(
 | 
			
		||||
                "Unable to link to a rule set because the folder has pre-existing rules or is already linked to a rule set.");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check we get bad request error when linking to a file node.
 | 
			
		||||
     */
 | 
			
		||||
    @Test(groups = {TestGroup.REST_API, TestGroup.RULES})
 | 
			
		||||
    public void linkToFileNode()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Create a folder in existing site");
 | 
			
		||||
        final FolderModel folder = dataContent.usingUser(user).usingSite(site).createFolder();
 | 
			
		||||
        final FileModel fileContent = dataContent.usingUser(user).usingSite(site).createContent(CMISUtil.DocumentType.TEXT_PLAIN);
 | 
			
		||||
 | 
			
		||||
        STEP("Link to a file node");
 | 
			
		||||
        final RestRuleSetLinkModel request = new RestRuleSetLinkModel();
 | 
			
		||||
        request.setId(fileContent.getNodeRef());
 | 
			
		||||
        restClient.authenticateUser(user).withCoreAPI().usingNode(folder).createRuleLink(request);
 | 
			
		||||
 | 
			
		||||
        STEP("Assert link result is 400");
 | 
			
		||||
        restClient.assertStatusCodeIs(BAD_REQUEST)
 | 
			
		||||
                .assertLastError().containsSummary("NodeId of a folder is expected!");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check we can link to a parent folder with rules.
 | 
			
		||||
     */
 | 
			
		||||
    @Test(groups = {TestGroup.REST_API, TestGroup.RULES})
 | 
			
		||||
    public void linkToParentNodeWithRules()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Create parent/child folders in existing site");
 | 
			
		||||
        final FolderModel parentFolder = dataContent.usingUser(user).usingSite(site).createFolder();
 | 
			
		||||
        final FolderModel childFolder = dataContent.usingUser(user).usingSite(site).usingResource(parentFolder).createFolder();
 | 
			
		||||
 | 
			
		||||
        STEP("Create a rule in the parent folder.");
 | 
			
		||||
        RestRuleModel ruleModel = createRuleModel("ruleName");
 | 
			
		||||
        RestRuleModel rule = restClient.authenticateUser(user).withCoreAPI().usingNode(parentFolder).usingDefaultRuleSet()
 | 
			
		||||
                .createSingleRule(ruleModel);
 | 
			
		||||
 | 
			
		||||
        STEP("Get the rule sets for the folder and find the rule set id");
 | 
			
		||||
        final RestRuleSetModelsCollection ruleSets = restClient.authenticateUser(user).withCoreAPI().usingNode(parentFolder)
 | 
			
		||||
                .getListOfRuleSets();
 | 
			
		||||
        ruleSets.assertThat().entriesListCountIs(1);
 | 
			
		||||
        final String ruleSetId = ruleSets.getEntries().get(0).onModel().getId();
 | 
			
		||||
 | 
			
		||||
        STEP("Link to the parent folder");
 | 
			
		||||
        final RestRuleSetLinkModel request = new RestRuleSetLinkModel();
 | 
			
		||||
        request.setId(parentFolder.getNodeRef());
 | 
			
		||||
        final RestRuleSetLinkModel ruleLink = restClient.authenticateUser(user).withCoreAPI().usingNode(childFolder).createRuleLink(request);
 | 
			
		||||
 | 
			
		||||
        STEP("Assert link result");
 | 
			
		||||
        restClient.assertStatusCodeIs(CREATED);
 | 
			
		||||
        final RestRuleSetLinkModel expectedLink = new RestRuleSetLinkModel();
 | 
			
		||||
        expectedLink.setId(ruleSetId);
 | 
			
		||||
        ruleLink.assertThat().isEqualTo(expectedLink);
 | 
			
		||||
 | 
			
		||||
        STEP("Check if child folder returns same rules");
 | 
			
		||||
        final RestRuleModelsCollection linkedRules = restClient.authenticateUser(user).withCoreAPI()
 | 
			
		||||
                .usingNode(childFolder)
 | 
			
		||||
                .usingDefaultRuleSet()
 | 
			
		||||
                .getListOfRules();
 | 
			
		||||
        linkedRules.assertThat().entriesListCountIs(1);
 | 
			
		||||
        linkedRules.getEntries().get(0).onModel().assertThat().isEqualTo(rule);
 | 
			
		||||
 | 
			
		||||
        STEP("Check if child folder returns rule set with linked inclusionType");
 | 
			
		||||
        final RestRuleSetModelsCollection linkedRuleSets = restClient.authenticateUser(user).withCoreAPI()
 | 
			
		||||
                .usingNode(childFolder)
 | 
			
		||||
                .include("inclusionType")
 | 
			
		||||
                .getListOfRuleSets();
 | 
			
		||||
        linkedRuleSets.assertThat().entriesListCountIs(1);
 | 
			
		||||
        final RestRuleSetModel expectedRuleSet = new RestRuleSetModel();
 | 
			
		||||
        expectedRuleSet.setId(ruleSetId);
 | 
			
		||||
        expectedRuleSet.setInclusionType("linked");
 | 
			
		||||
        linkedRuleSets.getEntries()
 | 
			
		||||
                .get(0).onModel().assertThat().isEqualTo(expectedRuleSet);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -25,55 +25,17 @@
 | 
			
		||||
 */
 | 
			
		||||
package org.alfresco.rest.rules;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.model.RestActionBodyExecTemplateModel;
 | 
			
		||||
import org.alfresco.rest.model.RestCompositeConditionDefinitionModel;
 | 
			
		||||
import org.alfresco.rest.model.RestRuleModel;
 | 
			
		||||
import org.alfresco.rest.model.RestSimpleConditionDefinitionModel;
 | 
			
		||||
 | 
			
		||||
public class RulesTestsUtils
 | 
			
		||||
{
 | 
			
		||||
    static final String RULE_NAME_DEFAULT = "ruleName";
 | 
			
		||||
    static final String RULE_DESCRIPTION_DEFAULT = "rule description";
 | 
			
		||||
    static final boolean RULE_ENABLED_DEFAULT = true;
 | 
			
		||||
    static final boolean RULE_CASCADE_DEFAULT = true;
 | 
			
		||||
    static final boolean RULE_ASYNC_DEFAULT = true;
 | 
			
		||||
    static final boolean RULE_SHARED_DEFAULT = false;
 | 
			
		||||
    static final String RULE_ERROR_SCRIPT_DEFAULT = "error-script";
 | 
			
		||||
    static final List<String> ruleTriggersDefault = List.of("inbound", "update", "outbound");
 | 
			
		||||
    static final boolean INVERTED = true;
 | 
			
		||||
    static final String AND = "and";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Create a rule model filled with default values.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The created rule model.
 | 
			
		||||
     */
 | 
			
		||||
    public static RestRuleModel createRuleModelWithModifiedValues()
 | 
			
		||||
    {
 | 
			
		||||
        RestRuleModel ruleModel = createRuleModelWithDefaultValues();
 | 
			
		||||
        ruleModel.setDescription(RULE_DESCRIPTION_DEFAULT);
 | 
			
		||||
        ruleModel.setEnabled(RULE_ENABLED_DEFAULT);
 | 
			
		||||
        ruleModel.setCascade(RULE_CASCADE_DEFAULT);
 | 
			
		||||
        ruleModel.setAsynchronous(RULE_ASYNC_DEFAULT);
 | 
			
		||||
        ruleModel.setIsShared(RULE_SHARED_DEFAULT);
 | 
			
		||||
        ruleModel.setTriggers(ruleTriggersDefault);
 | 
			
		||||
        ruleModel.setErrorScript(RULE_ERROR_SCRIPT_DEFAULT);
 | 
			
		||||
 | 
			
		||||
        return ruleModel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static RestRuleModel createRuleModelWithDefaultValues()
 | 
			
		||||
    {
 | 
			
		||||
        return createRuleModel(RULE_NAME_DEFAULT, List.of(createDefaultActionModel()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static RestRuleModel createRuleModel(String name)
 | 
			
		||||
    {
 | 
			
		||||
        return createRuleModel(name, List.of(createDefaultActionModel()));
 | 
			
		||||
    public static RestRuleModel createRuleModel(String name) {
 | 
			
		||||
        return createRuleModel(name, List.of(createActionModel()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -96,78 +58,11 @@ public class RulesTestsUtils
 | 
			
		||||
     *
 | 
			
		||||
     * @return The created action model.
 | 
			
		||||
     */
 | 
			
		||||
    public static RestActionBodyExecTemplateModel createDefaultActionModel()
 | 
			
		||||
    public static RestActionBodyExecTemplateModel createActionModel()
 | 
			
		||||
    {
 | 
			
		||||
        RestActionBodyExecTemplateModel restActionModel = new RestActionBodyExecTemplateModel();
 | 
			
		||||
        restActionModel.setActionDefinitionId("set-property-value");
 | 
			
		||||
        restActionModel.setParams(Map.of("aspect-name", "cm:audio"));
 | 
			
		||||
        restActionModel.setActionDefinitionId("add-features");
 | 
			
		||||
        restActionModel.setParams(Map.of("aspect-name", "{http://www.alfresco.org/model/audio/1.0}audio", "actionContext", "rule"));
 | 
			
		||||
        return restActionModel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static RestActionBodyExecTemplateModel createCustomActionModel(String actionDefinitionId, Map<String, Serializable> params)
 | 
			
		||||
    {
 | 
			
		||||
        RestActionBodyExecTemplateModel restActionModel = new RestActionBodyExecTemplateModel();
 | 
			
		||||
        restActionModel.setActionDefinitionId(actionDefinitionId);
 | 
			
		||||
        restActionModel.setParams(params);
 | 
			
		||||
        return restActionModel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static RestCompositeConditionDefinitionModel createEmptyConditionModel()
 | 
			
		||||
    {
 | 
			
		||||
        RestCompositeConditionDefinitionModel conditions = new RestCompositeConditionDefinitionModel();
 | 
			
		||||
        conditions.setInverted(!INVERTED);
 | 
			
		||||
        conditions.setBooleanMode(AND);
 | 
			
		||||
        return conditions;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static RestCompositeConditionDefinitionModel createVariousConditions()
 | 
			
		||||
    {
 | 
			
		||||
        return createCompositeCondition(List.of(
 | 
			
		||||
            createCompositeCondition(!INVERTED, List.of(
 | 
			
		||||
                createSimpleCondition("cm:created", "less_than", "2022-09-01T12:59:00.000+02:00"),
 | 
			
		||||
                createSimpleCondition("cm:creator", "ends", "ski"),
 | 
			
		||||
                createSimpleCondition("size", "greater_than", "90000000"),
 | 
			
		||||
                createSimpleCondition("mimetype", "equals", "video/3gpp"),
 | 
			
		||||
                createSimpleCondition("encoding", "equals", "utf-8"),
 | 
			
		||||
                createSimpleCondition("type", "equals", "cm:folder"),
 | 
			
		||||
                createSimpleCondition("tag", "equals", "uat")
 | 
			
		||||
            )),
 | 
			
		||||
            createCompositeCondition(INVERTED, List.of(
 | 
			
		||||
                createSimpleCondition("aspect", "equals", "audio:audio"),
 | 
			
		||||
                createSimpleCondition("cm:modelVersion", "begins", "1.")
 | 
			
		||||
            ))
 | 
			
		||||
        ));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static RestSimpleConditionDefinitionModel createSimpleCondition(String field, String comparator, String parameter)
 | 
			
		||||
    {
 | 
			
		||||
        RestSimpleConditionDefinitionModel simpleCondition = new RestSimpleConditionDefinitionModel();
 | 
			
		||||
        simpleCondition.setField(field);
 | 
			
		||||
        simpleCondition.setComparator(comparator);
 | 
			
		||||
        simpleCondition.setParameter(parameter);
 | 
			
		||||
        return simpleCondition;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static RestCompositeConditionDefinitionModel createCompositeCondition(List<RestCompositeConditionDefinitionModel> compositeConditions)
 | 
			
		||||
    {
 | 
			
		||||
        return createCompositeCondition(AND, !INVERTED, compositeConditions, null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static RestCompositeConditionDefinitionModel createCompositeCondition(boolean inverted,
 | 
			
		||||
        List<RestSimpleConditionDefinitionModel> simpleConditions)
 | 
			
		||||
    {
 | 
			
		||||
        return createCompositeCondition(AND, inverted, null, simpleConditions);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static RestCompositeConditionDefinitionModel createCompositeCondition(String booleanMode, boolean inverted,
 | 
			
		||||
        List<RestCompositeConditionDefinitionModel> compositeConditions, List<RestSimpleConditionDefinitionModel> simpleConditions)
 | 
			
		||||
    {
 | 
			
		||||
        RestCompositeConditionDefinitionModel compositeCondition = new RestCompositeConditionDefinitionModel();
 | 
			
		||||
        compositeCondition.setBooleanMode(booleanMode);
 | 
			
		||||
        compositeCondition.setInverted(inverted);
 | 
			
		||||
        compositeCondition.setCompositeConditions(compositeConditions);
 | 
			
		||||
        compositeCondition.setSimpleConditions(simpleConditions);
 | 
			
		||||
 | 
			
		||||
        return compositeCondition;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,232 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Repository
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.rules;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.rest.requests.RuleSettings.IS_INHERITANCE_ENABLED;
 | 
			
		||||
import static org.alfresco.utility.constants.UserRole.SiteCollaborator;
 | 
			
		||||
import static org.alfresco.utility.report.log.Step.STEP;
 | 
			
		||||
import static org.springframework.http.HttpStatus.BAD_REQUEST;
 | 
			
		||||
import static org.springframework.http.HttpStatus.FORBIDDEN;
 | 
			
		||||
import static org.springframework.http.HttpStatus.NOT_FOUND;
 | 
			
		||||
import static org.springframework.http.HttpStatus.OK;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.RestTest;
 | 
			
		||||
import org.alfresco.rest.model.RestRuleSettingsModel;
 | 
			
		||||
import org.alfresco.utility.model.FolderModel;
 | 
			
		||||
import org.alfresco.utility.model.SiteModel;
 | 
			
		||||
import org.alfresco.utility.model.TestGroup;
 | 
			
		||||
import org.alfresco.utility.model.UserModel;
 | 
			
		||||
import org.testng.annotations.BeforeClass;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tests for GET and PUT /nodes/{nodeId}/rule-settings/{ruleSettingKey}.
 | 
			
		||||
 */
 | 
			
		||||
@Test (groups = { TestGroup.RULES })
 | 
			
		||||
public class SetInheritanceTests extends RestTest
 | 
			
		||||
{
 | 
			
		||||
    private UserModel siteOwner;
 | 
			
		||||
    private SiteModel site;
 | 
			
		||||
 | 
			
		||||
    @BeforeClass (alwaysRun = true)
 | 
			
		||||
    public void dataPreparation()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Create a user, site and folder.");
 | 
			
		||||
        siteOwner = dataUser.createRandomTestUser();
 | 
			
		||||
        site = dataSite.usingUser(siteOwner).createPrivateRandomSite();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we can get the -isInheritanceEnabled- rule setting for the folder. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES })
 | 
			
		||||
    public void getIsInherited()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Create a folder for the test.");
 | 
			
		||||
        FolderModel folder = dataContent.usingUser(siteOwner).usingSite(site).createFolder();
 | 
			
		||||
 | 
			
		||||
        STEP("Get the -isInheritanceEnabled- rule settings for the folder.");
 | 
			
		||||
        RestRuleSettingsModel ruleSettingsModel = restClient.authenticateUser(siteOwner)
 | 
			
		||||
                                                            .withCoreAPI()
 | 
			
		||||
                                                            .usingResource(folder)
 | 
			
		||||
                                                            .usingIsInheritanceEnabledRuleSetting()
 | 
			
		||||
                                                            .retrieveSetting();
 | 
			
		||||
 | 
			
		||||
        restClient.assertStatusCodeIs(OK);
 | 
			
		||||
        RestRuleSettingsModel expected = new RestRuleSettingsModel();
 | 
			
		||||
        expected.setKey(IS_INHERITANCE_ENABLED);
 | 
			
		||||
        expected.setValue(true);
 | 
			
		||||
        ruleSettingsModel.assertThat().isEqualTo(expected);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we get an error when trying to get settings from a non-existent folder. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES })
 | 
			
		||||
    public void getIsInheritedFromNonExistentFolder()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Try to get the -isInheritanceEnabled- rule settings for a fake folder.");
 | 
			
		||||
        FolderModel nonExistentFolder = FolderModel.getRandomFolderModel();
 | 
			
		||||
        nonExistentFolder.setNodeRef("fake-id");
 | 
			
		||||
        restClient.authenticateUser(siteOwner)
 | 
			
		||||
                  .withCoreAPI()
 | 
			
		||||
                  .usingResource(nonExistentFolder)
 | 
			
		||||
                  .usingIsInheritanceEnabledRuleSetting()
 | 
			
		||||
                  .retrieveSetting();
 | 
			
		||||
 | 
			
		||||
        restClient.assertLastError().statusCodeIs(NOT_FOUND)
 | 
			
		||||
                  .containsSummary("The entity with id: fake-id was not found");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we get an error when trying to retrieve a non-existent setting. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES })
 | 
			
		||||
    public void getNonExistentSetting()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Create a folder for the test.");
 | 
			
		||||
        FolderModel folder = dataContent.usingUser(siteOwner).usingSite(site).createFolder();
 | 
			
		||||
 | 
			
		||||
        STEP("Try to get a fake setting from the folder.");
 | 
			
		||||
        restClient.authenticateUser(siteOwner).withCoreAPI().usingResource(folder).usingRuleSetting("-fakeRuleSetting-")
 | 
			
		||||
                  .retrieveSetting();
 | 
			
		||||
 | 
			
		||||
        restClient.assertLastError().statusCodeIs(NOT_FOUND)
 | 
			
		||||
                  .containsSummary("Unrecognised rule setting key -fakeRuleSetting-");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check a user without permission for the folder cannot get the -isInheritanceEnabled- rule setting. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES })
 | 
			
		||||
    public void getIsInheritedWithoutPermission()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Create a folder and a user without permission to access it.");
 | 
			
		||||
        FolderModel folder = dataContent.usingUser(siteOwner).usingSite(site).createFolder();
 | 
			
		||||
        UserModel noPermissionUser = dataUser.createRandomTestUser();
 | 
			
		||||
 | 
			
		||||
        STEP("Try to get the -isInheritanceEnabled- setting without permission.");
 | 
			
		||||
        restClient.authenticateUser(noPermissionUser)
 | 
			
		||||
                  .withCoreAPI()
 | 
			
		||||
                  .usingResource(folder)
 | 
			
		||||
                  .usingIsInheritanceEnabledRuleSetting()
 | 
			
		||||
                  .retrieveSetting();
 | 
			
		||||
 | 
			
		||||
        restClient.assertLastError().statusCodeIs(FORBIDDEN)
 | 
			
		||||
                  .containsSummary("Cannot read from this node");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we can change the -isInheritanceEnabled- rule setting for the folder. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES })
 | 
			
		||||
    public void updateIsInherited()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Create a folder for the test.");
 | 
			
		||||
        FolderModel folder = dataContent.usingUser(siteOwner).usingSite(site).createFolder();
 | 
			
		||||
 | 
			
		||||
        STEP("Set -isInheritanceEnabled- to false.");
 | 
			
		||||
        RestRuleSettingsModel updateBody = new RestRuleSettingsModel();
 | 
			
		||||
        updateBody.setValue(false);
 | 
			
		||||
 | 
			
		||||
        RestRuleSettingsModel ruleSettingsModel = restClient.authenticateUser(siteOwner)
 | 
			
		||||
                                              .withCoreAPI()
 | 
			
		||||
                                              .usingResource(folder)
 | 
			
		||||
                                              .usingIsInheritanceEnabledRuleSetting()
 | 
			
		||||
                                              .updateSetting(updateBody);
 | 
			
		||||
 | 
			
		||||
        restClient.assertStatusCodeIs(OK);
 | 
			
		||||
        RestRuleSettingsModel expected = new RestRuleSettingsModel();
 | 
			
		||||
        expected.setKey(IS_INHERITANCE_ENABLED);
 | 
			
		||||
        expected.setValue(false);
 | 
			
		||||
        ruleSettingsModel.assertThat().isEqualTo(expected);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we get an error when trying to set -isInheritanceEnabled- to something other than a boolean. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES })
 | 
			
		||||
    public void updateInheritedWithBadValue()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Create a folder for the test.");
 | 
			
		||||
        FolderModel folder = dataContent.usingUser(siteOwner).usingSite(site).createFolder();
 | 
			
		||||
 | 
			
		||||
        STEP("Try to set -isInheritanceEnabled- to \"banana\".");
 | 
			
		||||
        RestRuleSettingsModel updateBody = new RestRuleSettingsModel();
 | 
			
		||||
        updateBody.setValue("banana");
 | 
			
		||||
 | 
			
		||||
        restClient.authenticateUser(siteOwner).withCoreAPI().usingResource(folder).usingIsInheritanceEnabledRuleSetting()
 | 
			
		||||
                  .updateSetting(updateBody);
 | 
			
		||||
 | 
			
		||||
        restClient.assertLastError().statusCodeIs(BAD_REQUEST)
 | 
			
		||||
                  .containsSummary("Rule setting " + IS_INHERITANCE_ENABLED + " requires a boolean value.");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we get an error when the folder is not found. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES })
 | 
			
		||||
    public void updateInheritedWithNonExistentFolder()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Try to set -isInheritanceEnabled- against a fake folder.");
 | 
			
		||||
        FolderModel nonExistentFolder = FolderModel.getRandomFolderModel();
 | 
			
		||||
        nonExistentFolder.setNodeRef("fake-id");
 | 
			
		||||
 | 
			
		||||
        RestRuleSettingsModel updateBody = new RestRuleSettingsModel();
 | 
			
		||||
        updateBody.setValue(true);
 | 
			
		||||
 | 
			
		||||
        restClient.authenticateUser(siteOwner).withCoreAPI().usingResource(nonExistentFolder).usingIsInheritanceEnabledRuleSetting()
 | 
			
		||||
                  .updateSetting(updateBody);
 | 
			
		||||
 | 
			
		||||
        restClient.assertLastError().statusCodeIs(NOT_FOUND)
 | 
			
		||||
                  .containsSummary("The entity with id: fake-id was not found");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we get an error when trying to set a non-existent setting. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES })
 | 
			
		||||
    public void updateNonExistentSetting()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Create a folder for the test.");
 | 
			
		||||
        FolderModel folder = dataContent.usingUser(siteOwner).usingSite(site).createFolder();
 | 
			
		||||
 | 
			
		||||
        STEP("Try to set a fake setting on the folder.");
 | 
			
		||||
        RestRuleSettingsModel updateBody = new RestRuleSettingsModel();
 | 
			
		||||
        updateBody.setValue(true);
 | 
			
		||||
 | 
			
		||||
        restClient.authenticateUser(siteOwner).withCoreAPI().usingResource(folder).usingRuleSetting("-fakeRuleSetting-")
 | 
			
		||||
                  .updateSetting(updateBody);
 | 
			
		||||
 | 
			
		||||
        restClient.assertLastError().statusCodeIs(NOT_FOUND)
 | 
			
		||||
                  .containsSummary("Unrecognised rule setting key -fakeRuleSetting-");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check a user without manage permission cannot update the -isInheritanceEnabled- rule setting. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES })
 | 
			
		||||
    public void updateIsInheritedWithoutPermission()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Create a folder and a collaborator.");
 | 
			
		||||
        FolderModel folder = dataContent.usingUser(siteOwner).usingSite(site).createFolder();
 | 
			
		||||
        UserModel collaborator = dataUser.createRandomTestUser();
 | 
			
		||||
        collaborator.setUserRole(SiteCollaborator);
 | 
			
		||||
        restClient.authenticateUser(siteOwner).withCoreAPI().usingSite(site).addPerson(collaborator);
 | 
			
		||||
 | 
			
		||||
        STEP("Try to update the -isInheritanceEnabled- setting without permission.");
 | 
			
		||||
        RestRuleSettingsModel updateBody = new RestRuleSettingsModel();
 | 
			
		||||
        updateBody.setValue(true);
 | 
			
		||||
 | 
			
		||||
        restClient.authenticateUser(collaborator).withCoreAPI().usingResource(folder).usingIsInheritanceEnabledRuleSetting()
 | 
			
		||||
                  .updateSetting(updateBody);
 | 
			
		||||
 | 
			
		||||
        restClient.assertLastError().statusCodeIs(FORBIDDEN)
 | 
			
		||||
                  .containsSummary("Insufficient permissions to manage rules");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -25,7 +25,7 @@
 | 
			
		||||
 */
 | 
			
		||||
package org.alfresco.rest.rules;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.rest.rules.RulesTestsUtils.createDefaultActionModel;
 | 
			
		||||
import static org.alfresco.rest.rules.RulesTestsUtils.createActionModel;
 | 
			
		||||
import static org.alfresco.rest.rules.RulesTestsUtils.createRuleModel;
 | 
			
		||||
import static org.alfresco.utility.constants.UserRole.SiteCollaborator;
 | 
			
		||||
import static org.alfresco.utility.report.log.Step.STEP;
 | 
			
		||||
@@ -36,8 +36,6 @@ import static org.springframework.http.HttpStatus.OK;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import com.google.common.collect.ImmutableMap;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.RestTest;
 | 
			
		||||
import org.alfresco.rest.model.RestActionBodyExecTemplateModel;
 | 
			
		||||
import org.alfresco.rest.model.RestRuleModel;
 | 
			
		||||
@@ -66,11 +64,7 @@ public class UpdateRulesTests extends RestTest
 | 
			
		||||
        ruleFolder = dataContent.usingUser(user).usingSite(site).createFolder();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check we can update a rule.
 | 
			
		||||
     * <p>
 | 
			
		||||
     * Also check that the isShared field is not returned when not requested.
 | 
			
		||||
     */
 | 
			
		||||
    /** Check we can update a rule. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY })
 | 
			
		||||
    public void updateRule()
 | 
			
		||||
    {
 | 
			
		||||
@@ -83,8 +77,7 @@ public class UpdateRulesTests extends RestTest
 | 
			
		||||
 | 
			
		||||
        restClient.assertStatusCodeIs(OK);
 | 
			
		||||
        updatedRule.assertThat().field("id").is(rule.getId())
 | 
			
		||||
                   .assertThat().field("name").is("Updated rule name")
 | 
			
		||||
                   .assertThat().field("isShared").isNull();
 | 
			
		||||
                   .assertThat().field("name").is("Updated rule name");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we get a 404 if trying to update a rule in a folder that doesn't exist. */
 | 
			
		||||
@@ -163,7 +156,8 @@ public class UpdateRulesTests extends RestTest
 | 
			
		||||
        RestRuleModel rule = createAndSaveRule("Rule name");
 | 
			
		||||
 | 
			
		||||
        STEP("Try to update the rule to have no name.");
 | 
			
		||||
        RestRuleModel updatedRuleModel = createRuleModel("");
 | 
			
		||||
        RestRuleModel updatedRuleModel = new RestRuleModel();
 | 
			
		||||
        updatedRuleModel.setName("");
 | 
			
		||||
        restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet().updateRule(rule.getId(), updatedRuleModel);
 | 
			
		||||
 | 
			
		||||
        restClient.assertLastError().statusCodeIs(BAD_REQUEST)
 | 
			
		||||
@@ -185,47 +179,9 @@ public class UpdateRulesTests extends RestTest
 | 
			
		||||
        updatedRule.assertThat().field("id").is(rule.getId());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we can update a rule and get the included fields. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY })
 | 
			
		||||
    public void updateRuleWithIncludedFields()
 | 
			
		||||
    {
 | 
			
		||||
        RestRuleModel rule = createAndSaveRule("Rule name");
 | 
			
		||||
 | 
			
		||||
        STEP("Try to update the rule.");
 | 
			
		||||
        RestRuleModel updatedRuleModel = createRuleModel("Updated rule name");
 | 
			
		||||
        RestRuleModel updatedRule = restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet()
 | 
			
		||||
                                              .include("isShared")
 | 
			
		||||
                                              .updateRule(rule.getId(), updatedRuleModel);
 | 
			
		||||
 | 
			
		||||
        updatedRule.assertThat().field("isShared").isNotNull();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check we can use the POST response to create the new rule. */
 | 
			
		||||
    @Test (groups = { TestGroup.REST_API, TestGroup.RULES, TestGroup.SANITY })
 | 
			
		||||
    public void updateCopyRuleWithResponseFromPOST()
 | 
			
		||||
    {
 | 
			
		||||
        FolderModel destination = dataContent.usingUser(user).usingSite(site).createFolder();
 | 
			
		||||
 | 
			
		||||
        RestActionBodyExecTemplateModel copyAction = new RestActionBodyExecTemplateModel();
 | 
			
		||||
        copyAction.setActionDefinitionId("copy");
 | 
			
		||||
        copyAction.setParams(ImmutableMap.of("destination-folder", destination.getNodeRef()));
 | 
			
		||||
        RestRuleModel rule = createAndSaveRule("Rule name", List.of(copyAction));
 | 
			
		||||
 | 
			
		||||
        STEP("Try to update the rule.");
 | 
			
		||||
        rule.setName("Updated rule name");
 | 
			
		||||
        RestRuleModel updatedRule = restClient.authenticateUser(user).withCoreAPI().usingNode(ruleFolder).usingDefaultRuleSet()
 | 
			
		||||
                                              .include("isShared")
 | 
			
		||||
                                              .updateRule(rule.getId(), rule);
 | 
			
		||||
 | 
			
		||||
        restClient.assertStatusCodeIs(OK);
 | 
			
		||||
        updatedRule.assertThat().field("name").is("Updated rule name")
 | 
			
		||||
                   .assertThat().field("actions.actionDefinitionId").is(List.of("copy"))
 | 
			
		||||
                   .assertThat().field("actions.params").is(List.of(ImmutableMap.of("destination-folder", destination.getNodeRef())));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private RestRuleModel createAndSaveRule(String name)
 | 
			
		||||
    {
 | 
			
		||||
        return createAndSaveRule(name, List.of(createDefaultActionModel()));
 | 
			
		||||
        return createAndSaveRule(name, List.of(createActionModel()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-tests</artifactId>
 | 
			
		||||
        <version>17.113</version>
 | 
			
		||||
        <version>17.75-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <developers>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-packaging</artifactId>
 | 
			
		||||
        <version>17.113</version>
 | 
			
		||||
        <version>17.75-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <properties>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										57
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										57
									
								
								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">
 | 
			
		||||
    <modelVersion>4.0.0</modelVersion>
 | 
			
		||||
    <artifactId>alfresco-community-repo</artifactId>
 | 
			
		||||
    <version>17.113</version>
 | 
			
		||||
    <version>17.75-SNAPSHOT</version>
 | 
			
		||||
    <packaging>pom</packaging>
 | 
			
		||||
    <name>Alfresco Community Repo Parent</name>
 | 
			
		||||
 | 
			
		||||
@@ -45,14 +45,14 @@
 | 
			
		||||
 | 
			
		||||
        <dependency.alfresco-hb-data-sender.version>1.0.12</dependency.alfresco-hb-data-sender.version>
 | 
			
		||||
        <dependency.alfresco-trashcan-cleaner.version>2.4.1</dependency.alfresco-trashcan-cleaner.version>
 | 
			
		||||
        <dependency.alfresco-jlan.version>7.2</dependency.alfresco-jlan.version>
 | 
			
		||||
        <dependency.alfresco-jlan.version>7.1</dependency.alfresco-jlan.version>
 | 
			
		||||
        <dependency.alfresco-server-root.version>6.0.1</dependency.alfresco-server-root.version>
 | 
			
		||||
        <dependency.alfresco-messaging-repo.version>1.2.20</dependency.alfresco-messaging-repo.version>
 | 
			
		||||
        <dependency.alfresco-messaging-repo.version>1.2.19</dependency.alfresco-messaging-repo.version>
 | 
			
		||||
        <dependency.alfresco-log-sanitizer.version>0.2</dependency.alfresco-log-sanitizer.version>
 | 
			
		||||
        <dependency.activiti-engine.version>5.23.0</dependency.activiti-engine.version>
 | 
			
		||||
        <dependency.activiti.version>5.23.0</dependency.activiti.version>
 | 
			
		||||
        <dependency.alfresco-transform-service.version>1.5.4-A3</dependency.alfresco-transform-service.version>
 | 
			
		||||
        <dependency.alfresco-transform-core.version>2.7.0-A1</dependency.alfresco-transform-core.version>
 | 
			
		||||
        <dependency.alfresco-transform-service.version>1.5.3</dependency.alfresco-transform-service.version>
 | 
			
		||||
        <dependency.alfresco-transform-core.version>2.6.0</dependency.alfresco-transform-core.version>
 | 
			
		||||
        <dependency.alfresco-greenmail.version>6.4</dependency.alfresco-greenmail.version>
 | 
			
		||||
        <dependency.acs-event-model.version>0.0.16</dependency.acs-event-model.version>
 | 
			
		||||
 | 
			
		||||
@@ -74,20 +74,17 @@
 | 
			
		||||
        <dependency.httpcore.version>4.4.15</dependency.httpcore.version>
 | 
			
		||||
        <dependency.commons-httpclient.version>3.1-HTTPCLIENT-1265</dependency.commons-httpclient.version>
 | 
			
		||||
        <dependency.xercesImpl.version>2.12.2</dependency.xercesImpl.version>
 | 
			
		||||
        <dependency.slf4j.version>1.7.36</dependency.slf4j.version>
 | 
			
		||||
        <dependency.gytheio.version>0.17</dependency.gytheio.version>
 | 
			
		||||
        <dependency.slf4j.version>1.7.35</dependency.slf4j.version>
 | 
			
		||||
        <dependency.gytheio.version>0.16</dependency.gytheio.version>
 | 
			
		||||
        <dependency.groovy.version>3.0.12</dependency.groovy.version>
 | 
			
		||||
        <dependency.tika.version>2.4.1</dependency.tika.version>
 | 
			
		||||
        <dependency.spring-security.version>5.7.2</dependency.spring-security.version>
 | 
			
		||||
        <dependency.truezip.version>7.7.10</dependency.truezip.version>
 | 
			
		||||
        <dependency.poi.version>5.2.2</dependency.poi.version>
 | 
			
		||||
        <dependency.ooxml-schemas.version>1.4</dependency.ooxml-schemas.version>
 | 
			
		||||
        <dependency.keycloak.version>18.0.0</dependency.keycloak.version>
 | 
			
		||||
        <dependency.keycloak.version>15.0.2</dependency.keycloak.version>
 | 
			
		||||
        <dependency.jboss.logging.version>3.5.0.Final</dependency.jboss.logging.version>
 | 
			
		||||
        <dependency.camel.version>3.18.2</dependency.camel.version> <!-- when bumping this version, please keep track/sync with included netty.io dependencies -->
 | 
			
		||||
        <dependency.netty.version>4.1.79.Final</dependency.netty.version> <!-- must be in sync with camels transitive dependencies, e.g.: netty-common -->
 | 
			
		||||
        <dependency.netty.qpid.version>4.1.72.Final</dependency.netty.qpid.version> <!-- must be in sync with camels transitive dependencies: native-unix-common/native-epoll/native-kqueue -->
 | 
			
		||||
        <dependency.netty-tcnative.version>2.0.53.Final</dependency.netty-tcnative.version> <!-- must be in sync with camels transitive dependencies -->
 | 
			
		||||
        <dependency.camel.version>3.15.0</dependency.camel.version> <!-- when bumping this version, please keep track/sync with included netty.io dependencies (can cause dependency conflicts)-->
 | 
			
		||||
        <dependency.activemq.version>5.17.1</dependency.activemq.version>
 | 
			
		||||
        <dependency.apache-compress.version>1.21</dependency.apache-compress.version>
 | 
			
		||||
        <dependency.apache.taglibs.version>1.2.5</dependency.apache.taglibs.version>
 | 
			
		||||
@@ -110,7 +107,7 @@
 | 
			
		||||
        <dependency.jakarta-json-path.version>2.7.0</dependency.jakarta-json-path.version>
 | 
			
		||||
        <dependency.jakarta-rpc-api.version>1.1.4</dependency.jakarta-rpc-api.version>
 | 
			
		||||
 | 
			
		||||
        <alfresco.googledrive.version>3.2.3-A2</alfresco.googledrive.version>
 | 
			
		||||
        <alfresco.googledrive.version>3.2.2</alfresco.googledrive.version>
 | 
			
		||||
        <alfresco.aos-module.version>1.4.1</alfresco.aos-module.version> 
 | 
			
		||||
        <alfresco.api-explorer.version>7.2.1</alfresco.api-explorer.version> <!-- Also in alfresco-enterprise-share -->
 | 
			
		||||
 | 
			
		||||
@@ -122,12 +119,12 @@
 | 
			
		||||
        <dependency.mysql-image.version>8</dependency.mysql-image.version>
 | 
			
		||||
        <dependency.mariadb.version>2.7.4</dependency.mariadb.version>
 | 
			
		||||
        <dependency.tas-utility.version>3.0.49</dependency.tas-utility.version>
 | 
			
		||||
        <dependency.rest-assured.version>5.1.1</dependency.rest-assured.version>
 | 
			
		||||
        <dependency.tas-restapi.version>1.115</dependency.tas-restapi.version>
 | 
			
		||||
        <dependency.tas-cmis.version>1.32</dependency.tas-cmis.version>
 | 
			
		||||
        <dependency.tas-email.version>1.9</dependency.tas-email.version>
 | 
			
		||||
        <dependency.tas-webdav.version>1.7</dependency.tas-webdav.version>
 | 
			
		||||
        <dependency.tas-ftp.version>1.7</dependency.tas-ftp.version>
 | 
			
		||||
        <dependency.rest-assured.version>3.3.0</dependency.rest-assured.version>
 | 
			
		||||
        <dependency.tas-restapi.version>1.101</dependency.tas-restapi.version>
 | 
			
		||||
        <dependency.tas-cmis.version>1.31</dependency.tas-cmis.version>
 | 
			
		||||
        <dependency.tas-email.version>1.8</dependency.tas-email.version>
 | 
			
		||||
        <dependency.tas-webdav.version>1.6</dependency.tas-webdav.version>
 | 
			
		||||
        <dependency.tas-ftp.version>1.5</dependency.tas-ftp.version>
 | 
			
		||||
        <dependency.tas-dataprep.version>2.6</dependency.tas-dataprep.version>
 | 
			
		||||
 | 
			
		||||
        <!-- AGS properties shared between community and enterprise -->
 | 
			
		||||
@@ -151,7 +148,7 @@
 | 
			
		||||
        <connection>scm:git:https://github.com/Alfresco/alfresco-community-repo.git</connection>
 | 
			
		||||
        <developerConnection>scm:git:https://github.com/Alfresco/alfresco-community-repo.git</developerConnection>
 | 
			
		||||
        <url>https://github.com/Alfresco/alfresco-community-repo</url>
 | 
			
		||||
        <tag>17.113</tag>
 | 
			
		||||
        <tag>HEAD</tag>
 | 
			
		||||
    </scm>
 | 
			
		||||
 | 
			
		||||
    <distributionManagement>
 | 
			
		||||
@@ -619,12 +616,6 @@
 | 
			
		||||
                <groupId>org.slf4j</groupId>
 | 
			
		||||
                <artifactId>slf4j-reload4j</artifactId>
 | 
			
		||||
                <version>${dependency.slf4j.version}</version>
 | 
			
		||||
                <exclusions>
 | 
			
		||||
                    <exclusion>
 | 
			
		||||
                        <groupId>ch.qos.reload4j</groupId>
 | 
			
		||||
                        <artifactId>reload4j</artifactId>
 | 
			
		||||
                    </exclusion>
 | 
			
		||||
                </exclusions>
 | 
			
		||||
            </dependency>
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>xerces</groupId>
 | 
			
		||||
@@ -648,7 +639,7 @@
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>com.github.junrar</groupId>
 | 
			
		||||
                <artifactId>junrar</artifactId>
 | 
			
		||||
                <version>7.5.3</version>
 | 
			
		||||
                <version>7.5.2</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>com.github.fge</groupId>
 | 
			
		||||
@@ -854,18 +845,6 @@
 | 
			
		||||
                <artifactId>camel-mock</artifactId>
 | 
			
		||||
                <version>${dependency.camel.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
            <!-- Netty non-transitive dependencies declared for depending projects usage in conjunction with Camel's other transitive netty dependencies -->
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>io.netty</groupId>
 | 
			
		||||
                <artifactId>netty-handler-proxy</artifactId>
 | 
			
		||||
                <version>${dependency.netty.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>io.netty</groupId>
 | 
			
		||||
                <artifactId>netty-tcnative-classes</artifactId>
 | 
			
		||||
                <version>${dependency.netty-tcnative.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>org.apache.taglibs</groupId>
 | 
			
		||||
                <artifactId>taglibs-standard-spec</artifactId>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo</artifactId>
 | 
			
		||||
        <version>17.113</version>
 | 
			
		||||
        <version>17.75-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <dependencies>
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,6 @@ import java.io.FileOutputStream;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.InputStream;
 | 
			
		||||
import java.io.OutputStream;
 | 
			
		||||
import java.io.UnsupportedEncodingException;
 | 
			
		||||
import java.net.SocketException;
 | 
			
		||||
import java.net.URLEncoder;
 | 
			
		||||
import java.nio.charset.StandardCharsets;
 | 
			
		||||
@@ -60,7 +59,6 @@ import org.alfresco.service.namespace.QName;
 | 
			
		||||
import org.alfresco.util.TempFileProvider;
 | 
			
		||||
import org.apache.commons.logging.Log;
 | 
			
		||||
import org.apache.commons.logging.LogFactory;
 | 
			
		||||
import org.apache.cxf.attachment.Rfc5987Util;
 | 
			
		||||
import org.springframework.context.ResourceLoaderAware;
 | 
			
		||||
import org.springframework.core.io.ResourceLoader;
 | 
			
		||||
import org.springframework.extensions.webscripts.Cache;
 | 
			
		||||
@@ -474,7 +472,7 @@ public class ContentStreamer implements ResourceLoaderAware
 | 
			
		||||
 | 
			
		||||
                if (req == null)
 | 
			
		||||
                {
 | 
			
		||||
                    headerValue += "; filename*=UTF-8''" + encodeFilename(attachFileName)
 | 
			
		||||
                    headerValue += "; filename*=UTF-8''" + URLEncoder.encode(attachFileName, StandardCharsets.UTF_8)
 | 
			
		||||
                            + "; filename=\"" + filterNameForQuotedString(attachFileName) + "\"";
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
@@ -483,12 +481,12 @@ public class ContentStreamer implements ResourceLoaderAware
 | 
			
		||||
                    boolean isLegacy = (null != userAgent) && (userAgent.contains("MSIE 8") || userAgent.contains("MSIE 7"));
 | 
			
		||||
                    if (isLegacy)
 | 
			
		||||
                    {
 | 
			
		||||
                        headerValue += "; filename=\"" + encodeFilename(attachFileName);
 | 
			
		||||
                        headerValue += "; filename=\"" + URLEncoder.encode(attachFileName, StandardCharsets.UTF_8);
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        headerValue += "; filename=\"" + filterNameForQuotedString(attachFileName) + "\"; filename*=UTF-8''"
 | 
			
		||||
                                + encodeFilename(attachFileName);
 | 
			
		||||
                                + URLEncoder.encode(attachFileName, StandardCharsets.UTF_8);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
@@ -498,21 +496,6 @@ public class ContentStreamer implements ResourceLoaderAware
 | 
			
		||||
            res.setHeader("Content-Disposition", headerValue);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private String encodeFilename(String attachFileName)
 | 
			
		||||
    {
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            return Rfc5987Util.encode(attachFileName);
 | 
			
		||||
        }
 | 
			
		||||
        catch (UnsupportedEncodingException e)
 | 
			
		||||
        {
 | 
			
		||||
            if (logger.isInfoEnabled())
 | 
			
		||||
                logger.info(e.getMessage() + " Changing encoder from Rfc5987Util to java.net.URLEncoder.");
 | 
			
		||||
 | 
			
		||||
            return URLEncoder.encode(attachFileName, StandardCharsets.UTF_8);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    protected String filterNameForQuotedString(String s)
 | 
			
		||||
    {
 | 
			
		||||
 
 | 
			
		||||
@@ -78,7 +78,7 @@ public abstract class AbstractRuleWebScript extends DeclarativeWebScript
 | 
			
		||||
    private static final String RULE_OUTBOUND = "outbound";
 | 
			
		||||
    private static final String ACTION_CHECK_OUT = "check-out";
 | 
			
		||||
 | 
			
		||||
    public static final String CANNOT_CREATE_RULE = "cannot.create.rule.checkout.outbound";
 | 
			
		||||
    private static final String CANNOT_CREATE_RULE = "cannot.create.rule.checkout.outbound";
 | 
			
		||||
    
 | 
			
		||||
    protected NodeService nodeService;
 | 
			
		||||
    protected RuleService ruleService;
 | 
			
		||||
 
 | 
			
		||||
@@ -27,8 +27,8 @@ package org.alfresco.rest.api;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.api.model.rules.Rule;
 | 
			
		||||
import org.alfresco.rest.api.model.rules.RuleSet;
 | 
			
		||||
import org.alfresco.rest.api.model.rules.RuleSetLink;
 | 
			
		||||
import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo;
 | 
			
		||||
import org.alfresco.rest.framework.resource.parameters.Paging;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
@@ -58,9 +58,4 @@ public interface RuleSets
 | 
			
		||||
     * @return {@link RuleSet} definition
 | 
			
		||||
     */
 | 
			
		||||
    RuleSet getRuleSetById(String folderNodeId, String ruleSetId, List<String> includes);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Link a rule set to a folder
 | 
			
		||||
     */
 | 
			
		||||
    RuleSetLink linkToRuleSet(String folderNodeId, String linkToNodeId);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,54 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.api;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.api.model.rules.RuleSetting;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Rule settings API.
 | 
			
		||||
 */
 | 
			
		||||
@Experimental
 | 
			
		||||
public interface RuleSettings
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the rule setting with the given key.
 | 
			
		||||
     *
 | 
			
		||||
     * @param folderId Folder node ID
 | 
			
		||||
     * @param ruleSettingKey Rule setting key
 | 
			
		||||
     * @return {@link RuleSetting} The retrieved rule setting object.
 | 
			
		||||
     */
 | 
			
		||||
    RuleSetting getRuleSetting(String folderId, String ruleSettingKey);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set the rule setting against the specified folder.
 | 
			
		||||
     *
 | 
			
		||||
     * @param folderId The folder to update.
 | 
			
		||||
     * @param ruleSetting The new rule setting.
 | 
			
		||||
     * @return The updated rule setting object.
 | 
			
		||||
     */
 | 
			
		||||
    RuleSetting setRuleSetting(String folderId, RuleSetting ruleSetting);
 | 
			
		||||
}
 | 
			
		||||
@@ -26,8 +26,6 @@
 | 
			
		||||
 | 
			
		||||
package org.alfresco.rest.api;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.api.model.rules.Rule;
 | 
			
		||||
import org.alfresco.rest.framework.core.exceptions.InvalidArgumentException;
 | 
			
		||||
import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo;
 | 
			
		||||
@@ -35,6 +33,8 @@ import org.alfresco.rest.framework.resource.parameters.Paging;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.service.cmr.rule.RuleServiceException;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Folder node rules API.
 | 
			
		||||
 *
 | 
			
		||||
@@ -47,11 +47,10 @@ public interface Rules
 | 
			
		||||
     *
 | 
			
		||||
     * @param folderNodeId - folder node ID
 | 
			
		||||
     * @param ruleSetId - rule set ID
 | 
			
		||||
     * @param includes - The list of optional fields to include in the response.
 | 
			
		||||
     * @param paging - {@link Paging} information
 | 
			
		||||
     * @return {@link CollectionWithPagingInfo} containing a list page of folder rules
 | 
			
		||||
     */
 | 
			
		||||
    CollectionWithPagingInfo<Rule> getRules(String folderNodeId, String ruleSetId, List<String> includes, Paging paging);
 | 
			
		||||
    CollectionWithPagingInfo<Rule> getRules(String folderNodeId, String ruleSetId, Paging paging);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get rule for rule's ID and check associations with folder node and rule set node
 | 
			
		||||
@@ -59,10 +58,9 @@ public interface Rules
 | 
			
		||||
     * @param folderNodeId - folder node ID
 | 
			
		||||
     * @param ruleSetId - rule set ID
 | 
			
		||||
     * @param ruleId - rule ID
 | 
			
		||||
     * @param includes - The list of optional fields to include in the response.
 | 
			
		||||
     * @return {@link Rule} definition
 | 
			
		||||
     */
 | 
			
		||||
    Rule getRuleById(String folderNodeId, String ruleSetId, String ruleId, List<String> includes);
 | 
			
		||||
    Rule getRuleById(String folderNodeId, String ruleSetId, String ruleId);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Create new rules (and potentially a rule set if "_default_" is supplied).
 | 
			
		||||
@@ -70,12 +68,11 @@ public interface Rules
 | 
			
		||||
     * @param folderNodeId The node id of a folder.
 | 
			
		||||
     * @param ruleSetId The id of a rule set (or "_default_" to use/create the default rule set for the folder).
 | 
			
		||||
     * @param rule The definition of the rule.
 | 
			
		||||
     * @param includes The list of optional fields to include in the response.
 | 
			
		||||
     * @return The newly created rules.
 | 
			
		||||
     * @throws InvalidArgumentException If the nodes are not the expected types, or the rule set does not correspond to the folder.
 | 
			
		||||
     * @throws RuleServiceException If the folder is already linked to another rule set.
 | 
			
		||||
     */
 | 
			
		||||
    List<Rule> createRules(String folderNodeId, String ruleSetId, List<Rule> rule, List<String> includes);
 | 
			
		||||
    List<Rule> createRules(String folderNodeId, String ruleSetId, List<Rule> rule);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Update a rule.
 | 
			
		||||
@@ -84,10 +81,9 @@ public interface Rules
 | 
			
		||||
     * @param ruleSetId The id of a rule set within the folder (or "_default_" to use the default rule set for the folder).
 | 
			
		||||
     * @param ruleId The rule id.
 | 
			
		||||
     * @param rule The new version of the rule.
 | 
			
		||||
     * @param includes The list of optional fields to include in the response.
 | 
			
		||||
     * @return The newly updated rule.
 | 
			
		||||
     */
 | 
			
		||||
    Rule updateRuleById(String folderNodeId, String ruleSetId, String ruleId, Rule rule, List<String> includes);
 | 
			
		||||
    Rule updateRuleById(String folderNodeId, String ruleSetId, String ruleId, Rule rule);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Delete rule for rule's ID and check associations with folder node and rule set node
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 Alfresco Software Limited
 | 
			
		||||
 * Copyright (C) 2005 - 2021 Alfresco Software Limited
 | 
			
		||||
 * %%
 | 
			
		||||
 * This file is part of the Alfresco software. 
 | 
			
		||||
 * If the software was purchased under a paid Alfresco license, the terms of 
 | 
			
		||||
@@ -713,7 +713,6 @@ public class CustomModelsImpl implements CustomModels
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            NodeRef nodeRef = customModelService.createDownloadNode(modelName, withForm);
 | 
			
		||||
            nodeService.setProperty(nodeRef, ContentModel.PROP_NAME, modelName + DownloadsImpl.DEFAULT_ARCHIVE_EXTENSION);
 | 
			
		||||
            return new CustomModelDownload(nodeRef);
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception ex)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,156 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.api.impl.rules;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.framework.core.exceptions.InvalidArgumentException;
 | 
			
		||||
import org.alfresco.rest.framework.core.exceptions.NotFoundException;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.service.cmr.action.ActionService;
 | 
			
		||||
import org.alfresco.service.cmr.action.ParameterDefinition;
 | 
			
		||||
import org.alfresco.service.cmr.action.ParameterizedItemDefinition;
 | 
			
		||||
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
 | 
			
		||||
import org.alfresco.service.cmr.dictionary.DictionaryException;
 | 
			
		||||
import org.alfresco.service.cmr.dictionary.DictionaryService;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeRef;
 | 
			
		||||
import org.alfresco.service.cmr.repository.StoreRef;
 | 
			
		||||
import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter;
 | 
			
		||||
import org.alfresco.service.namespace.NamespaceService;
 | 
			
		||||
import org.alfresco.service.namespace.QName;
 | 
			
		||||
import org.json.JSONArray;
 | 
			
		||||
import org.json.JSONException;
 | 
			
		||||
 | 
			
		||||
@Experimental
 | 
			
		||||
public class ActionParameterConverter
 | 
			
		||||
{
 | 
			
		||||
    private final DictionaryService dictionaryService;
 | 
			
		||||
    private final ActionService actionService;
 | 
			
		||||
    private final NamespaceService namespaceService;
 | 
			
		||||
 | 
			
		||||
    public ActionParameterConverter(DictionaryService dictionaryService, ActionService actionService,
 | 
			
		||||
                                    NamespaceService namespaceService)
 | 
			
		||||
    {
 | 
			
		||||
        this.dictionaryService = dictionaryService;
 | 
			
		||||
        this.actionService = actionService;
 | 
			
		||||
        this.namespaceService = namespaceService;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Map<String, Serializable> getConvertedParams(Map<String, Serializable> params, String name)
 | 
			
		||||
    {
 | 
			
		||||
        final Map<String, Serializable> parameters = new HashMap<>(params.size());
 | 
			
		||||
        final ParameterizedItemDefinition definition = actionService.getActionDefinition(name);
 | 
			
		||||
        if (definition == null)
 | 
			
		||||
        {
 | 
			
		||||
            throw new NotFoundException(NotFoundException.DEFAULT_MESSAGE_ID, new String[]{name});
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for (Map.Entry<String, Serializable> param : params.entrySet())
 | 
			
		||||
        {
 | 
			
		||||
            final ParameterDefinition paramDef = definition.getParameterDefintion(param.getKey());
 | 
			
		||||
            if (paramDef == null && !definition.getAdhocPropertiesAllowed())
 | 
			
		||||
            {
 | 
			
		||||
                throw new InvalidArgumentException(InvalidArgumentException.DEFAULT_MESSAGE_ID, new String[]{param.getKey(), name});
 | 
			
		||||
            }
 | 
			
		||||
            if (paramDef != null)
 | 
			
		||||
            {
 | 
			
		||||
                final QName typeQName = paramDef.getType();
 | 
			
		||||
                parameters.put(param.getKey(), convertValue(typeQName, param.getValue()));
 | 
			
		||||
            } else
 | 
			
		||||
            {
 | 
			
		||||
                parameters.put(param.getKey(), param.getValue().toString());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return parameters;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Serializable convertParamFromServiceModel(Serializable param)
 | 
			
		||||
    {
 | 
			
		||||
        if (param instanceof QName)
 | 
			
		||||
        {
 | 
			
		||||
            return ((QName) param).toPrefixString(namespaceService);
 | 
			
		||||
        }
 | 
			
		||||
        else if (param instanceof NodeRef) {
 | 
			
		||||
            return ((NodeRef) param).getId();
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            return param;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private Serializable convertValue(QName typeQName, Object propertyValue) throws JSONException
 | 
			
		||||
    {
 | 
			
		||||
        Serializable value;
 | 
			
		||||
 | 
			
		||||
        final DataTypeDefinition typeDef = dictionaryService.getDataType(typeQName);
 | 
			
		||||
        if (typeDef == null)
 | 
			
		||||
        {
 | 
			
		||||
            throw new NotFoundException(NotFoundException.DEFAULT_MESSAGE_ID, new String[]{typeQName.toPrefixString()});
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (propertyValue instanceof JSONArray)
 | 
			
		||||
        {
 | 
			
		||||
            final String javaClassName = typeDef.getJavaClassName();
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                Class.forName(javaClassName);
 | 
			
		||||
            } catch (ClassNotFoundException e)
 | 
			
		||||
            {
 | 
			
		||||
                throw new DictionaryException("Java class " + javaClassName + " of property type " + typeDef.getName() + " is invalid", e);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            final int length = ((JSONArray) propertyValue).length();
 | 
			
		||||
            final List<Serializable> list = new ArrayList<>(length);
 | 
			
		||||
            for (int i = 0; i < length; i++)
 | 
			
		||||
            {
 | 
			
		||||
                list.add(convertValue(typeQName, ((JSONArray) propertyValue).get(i)));
 | 
			
		||||
            }
 | 
			
		||||
            value = (Serializable) list;
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            if (typeQName.equals(DataTypeDefinition.QNAME) && typeQName.toString().contains(":"))
 | 
			
		||||
            {
 | 
			
		||||
                value = QName.createQName(propertyValue.toString(), namespaceService);
 | 
			
		||||
            }
 | 
			
		||||
            else if (typeQName.isMatch(DataTypeDefinition.NODE_REF))
 | 
			
		||||
            {
 | 
			
		||||
                value = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, propertyValue.toString());
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                value = (Serializable) DefaultTypeConverter.INSTANCE.convert(dictionaryService.getDataType(typeQName), propertyValue);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,85 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.api.impl.rules;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.repo.web.scripts.rule.AbstractRuleWebScript.CANNOT_CREATE_RULE;
 | 
			
		||||
import static org.alfresco.service.cmr.rule.RuleType.OUTBOUND;
 | 
			
		||||
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.repo.action.CompositeActionImpl;
 | 
			
		||||
import org.alfresco.repo.action.RuntimeActionService;
 | 
			
		||||
import org.alfresco.repo.action.access.ActionAccessRestriction;
 | 
			
		||||
import org.alfresco.repo.action.executer.CheckOutActionExecuter;
 | 
			
		||||
import org.alfresco.rest.framework.core.exceptions.InvalidArgumentException;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.service.cmr.action.Action;
 | 
			
		||||
import org.alfresco.service.cmr.rule.Rule;
 | 
			
		||||
import org.apache.commons.collections.CollectionUtils;
 | 
			
		||||
 | 
			
		||||
@Experimental
 | 
			
		||||
public class ActionPermissionValidator
 | 
			
		||||
{
 | 
			
		||||
    private final RuntimeActionService runtimeActionService;
 | 
			
		||||
 | 
			
		||||
    public ActionPermissionValidator(RuntimeActionService runtimeActionService)
 | 
			
		||||
    {
 | 
			
		||||
        this.runtimeActionService = runtimeActionService;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Rule validateRulePermissions(Rule rule)
 | 
			
		||||
    {
 | 
			
		||||
        final List<Action> actions = ((CompositeActionImpl) rule.getAction()).getActions();
 | 
			
		||||
 | 
			
		||||
        checkRestrictedAccessActions(actions);
 | 
			
		||||
        checkRuleOutboundHasNoCheckOutAction(rule, actions);
 | 
			
		||||
        return rule;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void checkRestrictedAccessActions(List<Action> actions) {
 | 
			
		||||
        actions.forEach(action -> {
 | 
			
		||||
            ActionAccessRestriction.setActionContext(action, ActionAccessRestriction.RULE_ACTION_CONTEXT);
 | 
			
		||||
            runtimeActionService.verifyActionAccessRestrictions(action);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void checkRuleOutboundHasNoCheckOutAction(Rule rule, List<Action> actions) {
 | 
			
		||||
        //TODO: rule types should never be empty in final implementation
 | 
			
		||||
        if (CollectionUtils.isNotEmpty(rule.getRuleTypes()) && rule.getRuleTypes().contains(OUTBOUND))
 | 
			
		||||
        {
 | 
			
		||||
            for (Action action : actions)
 | 
			
		||||
            {
 | 
			
		||||
                if (action.getActionDefinitionName().equalsIgnoreCase(CheckOutActionExecuter.NAME))
 | 
			
		||||
                {
 | 
			
		||||
                    throw new InvalidArgumentException(CANNOT_CREATE_RULE);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -33,21 +33,16 @@ import java.util.Set;
 | 
			
		||||
import org.alfresco.model.ContentModel;
 | 
			
		||||
import org.alfresco.repo.rule.RuleModel;
 | 
			
		||||
import org.alfresco.rest.api.Nodes;
 | 
			
		||||
import org.alfresco.rest.api.model.Node;
 | 
			
		||||
import org.alfresco.rest.api.model.rules.RuleSet;
 | 
			
		||||
import org.alfresco.rest.framework.core.exceptions.InvalidArgumentException;
 | 
			
		||||
import org.alfresco.rest.framework.core.exceptions.PermissionDeniedException;
 | 
			
		||||
import org.alfresco.rest.framework.core.exceptions.RelationshipResourceNotFoundException;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeRef;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeService;
 | 
			
		||||
import org.alfresco.service.cmr.rule.RuleService;
 | 
			
		||||
import org.alfresco.service.cmr.security.PermissionService;
 | 
			
		||||
import org.alfresco.service.namespace.QName;
 | 
			
		||||
 | 
			
		||||
/** Responsible for validating nodes when working with rules. */
 | 
			
		||||
@Experimental
 | 
			
		||||
public class NodeValidator
 | 
			
		||||
{
 | 
			
		||||
    private static final String RULE_SET_EXPECTED_TYPE_NAME = "rule set";
 | 
			
		||||
@@ -55,7 +50,6 @@ public class NodeValidator
 | 
			
		||||
    private Nodes nodes;
 | 
			
		||||
    private RuleService ruleService;
 | 
			
		||||
    private PermissionService permissionService;
 | 
			
		||||
    private NodeService nodeService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Validates if folder node exists and the user has permission to use it.
 | 
			
		||||
@@ -69,7 +63,20 @@ public class NodeValidator
 | 
			
		||||
    public NodeRef validateFolderNode(final String folderNodeId, boolean requireChangePermission)
 | 
			
		||||
    {
 | 
			
		||||
        final NodeRef nodeRef = nodes.validateOrLookupNode(folderNodeId, null);
 | 
			
		||||
        validatePermission(requireChangePermission, nodeRef);
 | 
			
		||||
        if (requireChangePermission)
 | 
			
		||||
        {
 | 
			
		||||
            if (permissionService.hasPermission(nodeRef, CHANGE_PERMISSIONS) != ALLOWED)
 | 
			
		||||
            {
 | 
			
		||||
                throw new PermissionDeniedException("Insufficient permissions to manage rules.");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            if (permissionService.hasReadPermission(nodeRef) != ALLOWED)
 | 
			
		||||
            {
 | 
			
		||||
                throw new PermissionDeniedException("Cannot read from this node!");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        verifyNodeType(nodeRef, ContentModel.TYPE_FOLDER, null);
 | 
			
		||||
 | 
			
		||||
        return nodeRef;
 | 
			
		||||
@@ -105,15 +112,6 @@ public class NodeValidator
 | 
			
		||||
        return ruleSetNodeRef;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public NodeRef validateRuleSetNode(String linkToNodeId, boolean requireChangePermission)
 | 
			
		||||
    {
 | 
			
		||||
        final Node ruleSetNode = nodes.getNode(linkToNodeId);
 | 
			
		||||
        final ChildAssociationRef primaryParent = nodeService.getPrimaryParent(ruleSetNode.getNodeRef());
 | 
			
		||||
        final NodeRef parentNode = primaryParent.getParentRef();
 | 
			
		||||
        validatePermission(requireChangePermission, parentNode);
 | 
			
		||||
        return parentNode;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Validates if rule node exists and associated rule set node matches.
 | 
			
		||||
@@ -142,24 +140,6 @@ public class NodeValidator
 | 
			
		||||
        return nodeRef;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void validatePermission(boolean requireChangePermission, NodeRef nodeRef)
 | 
			
		||||
    {
 | 
			
		||||
        if (requireChangePermission)
 | 
			
		||||
        {
 | 
			
		||||
            if (permissionService.hasPermission(nodeRef, CHANGE_PERMISSIONS) != ALLOWED)
 | 
			
		||||
            {
 | 
			
		||||
                throw new PermissionDeniedException("Insufficient permissions to manage rules.");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            if (permissionService.hasReadPermission(nodeRef) != ALLOWED)
 | 
			
		||||
            {
 | 
			
		||||
                throw new PermissionDeniedException("Cannot read from this node!");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void verifyNodeType(final NodeRef nodeRef, final QName expectedType, final String expectedTypeName)
 | 
			
		||||
    {
 | 
			
		||||
        final Set<QName> expectedTypes = Set.of(expectedType);
 | 
			
		||||
@@ -170,22 +150,6 @@ public class NodeValidator
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isRuleSetNode(String nodeId) {
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            validateNode(nodeId, ContentModel.TYPE_SYSTEM_FOLDER, RULE_SET_EXPECTED_TYPE_NAME);
 | 
			
		||||
            return true;
 | 
			
		||||
        } catch (InvalidArgumentException e) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Verifies if rule set node or folder node's default rule set is shared
 | 
			
		||||
     * @param ruleSetNodeRef
 | 
			
		||||
     * @param folderNodeRef
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    public boolean isRuleSetNotNullAndShared(final NodeRef ruleSetNodeRef, final NodeRef folderNodeRef)
 | 
			
		||||
    {
 | 
			
		||||
        if (ruleSetNodeRef == null && folderNodeRef != null)
 | 
			
		||||
@@ -218,9 +182,4 @@ public class NodeValidator
 | 
			
		||||
    {
 | 
			
		||||
        this.nodes = nodes;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setNodeService(NodeService nodeService)
 | 
			
		||||
    {
 | 
			
		||||
        this.nodeService = nodeService;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,71 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.api.impl.rules;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.api.model.rules.Rule;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeRef;
 | 
			
		||||
import org.alfresco.service.cmr.rule.RuleService;
 | 
			
		||||
import org.alfresco.service.namespace.NamespaceService;
 | 
			
		||||
 | 
			
		||||
/** Responsible for creating {@link Rule} objects. */
 | 
			
		||||
@Experimental
 | 
			
		||||
public class RuleLoader
 | 
			
		||||
{
 | 
			
		||||
    public static final String IS_SHARED = "isShared";
 | 
			
		||||
    private RuleService ruleService;
 | 
			
		||||
    private NodeValidator nodeValidator;
 | 
			
		||||
    private NamespaceService namespaceService;
 | 
			
		||||
 | 
			
		||||
    public Rule loadRule(org.alfresco.service.cmr.rule.Rule ruleModel, List<String> includes)
 | 
			
		||||
    {
 | 
			
		||||
        Rule rule = Rule.from(ruleModel, namespaceService);
 | 
			
		||||
        if (includes != null && includes.contains(IS_SHARED))
 | 
			
		||||
        {
 | 
			
		||||
            NodeRef ruleSet = ruleService.getRuleSetNode(ruleModel.getNodeRef());
 | 
			
		||||
            boolean isShared = nodeValidator.isRuleSetNotNullAndShared(ruleSet);
 | 
			
		||||
            rule.setIsShared(isShared);
 | 
			
		||||
        }
 | 
			
		||||
        return rule;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setRuleService(RuleService ruleService)
 | 
			
		||||
    {
 | 
			
		||||
        this.ruleService = ruleService;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setNodeValidator(NodeValidator nodeValidator)
 | 
			
		||||
    {
 | 
			
		||||
        this.nodeValidator = nodeValidator;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setNamespaceService(NamespaceService namespaceService)
 | 
			
		||||
    {
 | 
			
		||||
        this.namespaceService = namespaceService;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,90 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.api.impl.rules;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.rest.api.model.rules.InclusionType.INHERITED;
 | 
			
		||||
import static org.alfresco.rest.api.model.rules.InclusionType.LINKED;
 | 
			
		||||
import static org.alfresco.rest.api.model.rules.InclusionType.OWNED;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.api.model.rules.RuleSet;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeRef;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeService;
 | 
			
		||||
 | 
			
		||||
/** Responsible for converting a NodeRef into a {@link RuleSet} object. */
 | 
			
		||||
@Experimental
 | 
			
		||||
public class RuleSetLoader
 | 
			
		||||
{
 | 
			
		||||
    protected static final String OWNING_FOLDER = "owningFolder";
 | 
			
		||||
    protected static final String INCLUSION_TYPE = "inclusionType";
 | 
			
		||||
    private NodeService nodeService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Load a rule set for the given node ref.
 | 
			
		||||
     *
 | 
			
		||||
     * @param ruleSetNodeRef The rule set node.
 | 
			
		||||
     * @param includes A list of fields to include.
 | 
			
		||||
     * @return The rule set object.
 | 
			
		||||
     */
 | 
			
		||||
    public RuleSet loadRuleSet(NodeRef ruleSetNodeRef, NodeRef folderNodeRef, List<String> includes)
 | 
			
		||||
    {
 | 
			
		||||
        String ruleSetId = ruleSetNodeRef.getId();
 | 
			
		||||
        RuleSet ruleSet = RuleSet.of(ruleSetId);
 | 
			
		||||
 | 
			
		||||
        if (includes != null)
 | 
			
		||||
        {
 | 
			
		||||
            NodeRef parentRef = nodeService.getPrimaryParent(ruleSetNodeRef).getParentRef();
 | 
			
		||||
            if (includes.contains(OWNING_FOLDER))
 | 
			
		||||
            {
 | 
			
		||||
                ruleSet.setOwningFolder(parentRef);
 | 
			
		||||
            }
 | 
			
		||||
            if (includes.contains(INCLUSION_TYPE))
 | 
			
		||||
            {
 | 
			
		||||
                // In the case that a rule set applies to the given folder for multiple reasons then priority is given to owned, then linked, then inherited.
 | 
			
		||||
                if (parentRef.equals(folderNodeRef))
 | 
			
		||||
                {
 | 
			
		||||
                    ruleSet.setInclusionType(OWNED);
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    boolean linked = nodeService.getParentAssocs(ruleSetNodeRef)
 | 
			
		||||
                                           .stream().map(ChildAssociationRef::getParentRef)
 | 
			
		||||
                                           .anyMatch(folderNodeRef::equals);
 | 
			
		||||
                    ruleSet.setInclusionType(linked ? LINKED : INHERITED);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return ruleSet;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setNodeService(NodeService nodeService)
 | 
			
		||||
    {
 | 
			
		||||
        this.nodeService = nodeService;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -29,43 +29,32 @@ package org.alfresco.rest.api.impl.rules;
 | 
			
		||||
import static java.util.stream.Collectors.toList;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.repo.rule.RuleModel;
 | 
			
		||||
import org.alfresco.repo.rule.RuntimeRuleService;
 | 
			
		||||
import org.alfresco.rest.api.RuleSets;
 | 
			
		||||
import org.alfresco.rest.api.model.rules.RuleSet;
 | 
			
		||||
import org.alfresco.rest.api.model.rules.RuleSetLink;
 | 
			
		||||
import org.alfresco.rest.framework.core.exceptions.InvalidArgumentException;
 | 
			
		||||
import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo;
 | 
			
		||||
import org.alfresco.rest.framework.resource.parameters.ListPage;
 | 
			
		||||
import org.alfresco.rest.framework.resource.parameters.Paging;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeRef;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeService;
 | 
			
		||||
import org.alfresco.service.cmr.rule.RuleService;
 | 
			
		||||
 | 
			
		||||
@Experimental
 | 
			
		||||
public class RuleSetsImpl implements RuleSets
 | 
			
		||||
{
 | 
			
		||||
    private RuleSetLoader ruleSetLoader;
 | 
			
		||||
    private RuleService ruleService;
 | 
			
		||||
    private NodeValidator validator;
 | 
			
		||||
    private NodeService nodeService;
 | 
			
		||||
    private RuntimeRuleService runtimeRuleService;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public CollectionWithPagingInfo<RuleSet> getRuleSets(String folderNodeId, List<String> includes, Paging paging)
 | 
			
		||||
    {
 | 
			
		||||
        NodeRef folderNode = validator.validateFolderNode(folderNodeId, false);
 | 
			
		||||
 | 
			
		||||
        List<RuleSet> ruleSets = ruleService.getNodesSupplyingRuleSets(folderNode)
 | 
			
		||||
                                            .stream()
 | 
			
		||||
                                            .map(ruleService::getRuleSetNode)
 | 
			
		||||
                                            .filter(Objects::nonNull)
 | 
			
		||||
                                            .map(nodeRef -> ruleSetLoader.loadRuleSet(nodeRef, folderNode, includes))
 | 
			
		||||
                                            .distinct()
 | 
			
		||||
                                            .collect(toList());
 | 
			
		||||
        NodeRef ruleSetNode = ruleService.getRuleSetNode(folderNode);
 | 
			
		||||
        List<RuleSet> ruleSets = Optional.ofNullable(ruleSetNode)
 | 
			
		||||
                                         .map(NodeRef::getId)
 | 
			
		||||
                                         .map(RuleSet::of).stream().collect(toList());
 | 
			
		||||
 | 
			
		||||
        return ListPage.of(ruleSets, paging);
 | 
			
		||||
    }
 | 
			
		||||
@@ -76,43 +65,7 @@ public class RuleSetsImpl implements RuleSets
 | 
			
		||||
        NodeRef folderNode = validator.validateFolderNode(folderNodeId, false);
 | 
			
		||||
        NodeRef ruleSetNode = validator.validateRuleSetNode(ruleSetId, folderNode);
 | 
			
		||||
 | 
			
		||||
        return ruleSetLoader.loadRuleSet(ruleSetNode, folderNode, includes);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public RuleSetLink linkToRuleSet(String folderNodeId, String linkToNodeId)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        final NodeRef folderNodeRef = validator.validateFolderNode(folderNodeId,true);
 | 
			
		||||
        final boolean isRuleSetNode = validator.isRuleSetNode(linkToNodeId);
 | 
			
		||||
        final NodeRef linkToNodeRef = isRuleSetNode
 | 
			
		||||
                ? validator.validateRuleSetNode(linkToNodeId, true)
 | 
			
		||||
                : validator.validateFolderNode(linkToNodeId, true);
 | 
			
		||||
 | 
			
		||||
        //The target node should have pre-existing rules to link to
 | 
			
		||||
        if (!ruleService.hasRules(linkToNodeRef)) {
 | 
			
		||||
            throw new InvalidArgumentException("The target node has no rules to link.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //The folder shouldn't have any pre-existing rules
 | 
			
		||||
        if (ruleService.hasRules(folderNodeRef)) {
 | 
			
		||||
            throw new InvalidArgumentException("Unable to link to a rule set because the folder has pre-existing rules or is already linked to a rule set.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Create the destination folder as a secondary child of the first
 | 
			
		||||
        NodeRef ruleSetNodeRef = runtimeRuleService.getSavedRuleFolderAssoc(linkToNodeRef).getChildRef();
 | 
			
		||||
        // The required aspect will automatically be added to the node
 | 
			
		||||
        nodeService.addChild(folderNodeRef, ruleSetNodeRef, RuleModel.ASSOC_RULE_FOLDER, RuleModel.ASSOC_RULE_FOLDER);
 | 
			
		||||
 | 
			
		||||
        RuleSetLink ruleSetLink = new RuleSetLink();
 | 
			
		||||
        ruleSetLink.setId(ruleSetNodeRef.getId());
 | 
			
		||||
 | 
			
		||||
        return ruleSetLink;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setRuleSetLoader(RuleSetLoader ruleSetLoader)
 | 
			
		||||
    {
 | 
			
		||||
        this.ruleSetLoader = ruleSetLoader;
 | 
			
		||||
        return RuleSet.of(ruleSetNode.getId());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setValidator(NodeValidator validator)
 | 
			
		||||
@@ -124,14 +77,4 @@ public class RuleSetsImpl implements RuleSets
 | 
			
		||||
    {
 | 
			
		||||
        this.ruleService = ruleService;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setNodeService(NodeService nodeService)
 | 
			
		||||
    {
 | 
			
		||||
        this.nodeService = nodeService;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setRuntimeRuleService(RuntimeRuleService runtimeRuleService)
 | 
			
		||||
    {
 | 
			
		||||
        this.runtimeRuleService = runtimeRuleService;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,107 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.api.impl.rules;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.repo.rule.RuleModel.ASPECT_IGNORE_INHERITED_RULES;
 | 
			
		||||
import static org.alfresco.rest.api.model.rules.RuleSetting.IS_INHERITANCE_ENABLED_KEY;
 | 
			
		||||
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.api.RuleSettings;
 | 
			
		||||
import org.alfresco.rest.api.model.rules.RuleSetting;
 | 
			
		||||
import org.alfresco.rest.framework.core.exceptions.NotFoundException;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeRef;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeService;
 | 
			
		||||
 | 
			
		||||
@Experimental
 | 
			
		||||
public class RuleSettingsImpl implements RuleSettings
 | 
			
		||||
{
 | 
			
		||||
    private NodeValidator validator;
 | 
			
		||||
    private NodeService nodeService;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public RuleSetting getRuleSetting(String folderId, String ruleSettingKey)
 | 
			
		||||
    {
 | 
			
		||||
        NodeRef folderNode = validator.validateFolderNode(folderId, false);
 | 
			
		||||
        switch (ruleSettingKey)
 | 
			
		||||
        {
 | 
			
		||||
            case IS_INHERITANCE_ENABLED_KEY:
 | 
			
		||||
                return getIsInheritanceEnabled(folderNode);
 | 
			
		||||
            default:
 | 
			
		||||
                throw new NotFoundException("Unrecognised rule setting key " + ruleSettingKey);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private RuleSetting getIsInheritanceEnabled(NodeRef folderNode)
 | 
			
		||||
    {
 | 
			
		||||
        boolean inheritanceDisabled = nodeService.hasAspect(folderNode, ASPECT_IGNORE_INHERITED_RULES);
 | 
			
		||||
        return RuleSetting.builder().key(IS_INHERITANCE_ENABLED_KEY).value(!inheritanceDisabled).create();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public RuleSetting setRuleSetting(String folderId, RuleSetting ruleSetting)
 | 
			
		||||
    {
 | 
			
		||||
        NodeRef folderNode = validator.validateFolderNode(folderId, true);
 | 
			
		||||
 | 
			
		||||
        switch (ruleSetting.getKey())
 | 
			
		||||
        {
 | 
			
		||||
            case IS_INHERITANCE_ENABLED_KEY:
 | 
			
		||||
                return updateIsInheritanceEnabled(folderNode, ruleSetting.getValue());
 | 
			
		||||
            default:
 | 
			
		||||
                throw new NotFoundException("Unrecognised rule setting key " + ruleSetting.getKey());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private RuleSetting updateIsInheritanceEnabled(NodeRef folderNode, Object value)
 | 
			
		||||
    {
 | 
			
		||||
        if (!(value instanceof Boolean))
 | 
			
		||||
        {
 | 
			
		||||
            throw new IllegalArgumentException("Rule setting " + IS_INHERITANCE_ENABLED_KEY + " requires a boolean value.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ((boolean) value)
 | 
			
		||||
        {
 | 
			
		||||
            nodeService.removeAspect(folderNode, ASPECT_IGNORE_INHERITED_RULES);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            nodeService.addAspect(folderNode, ASPECT_IGNORE_INHERITED_RULES, Collections.emptyMap());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return RuleSetting.builder().key(IS_INHERITANCE_ENABLED_KEY).value(value).create();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setValidator(NodeValidator validator)
 | 
			
		||||
    {
 | 
			
		||||
        this.validator = validator;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setNodeService(NodeService nodeService)
 | 
			
		||||
    {
 | 
			
		||||
        this.nodeService = nodeService;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -27,7 +27,6 @@
 | 
			
		||||
package org.alfresco.rest.api.impl.rules;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.api.Nodes;
 | 
			
		||||
@@ -38,10 +37,8 @@ import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo;
 | 
			
		||||
import org.alfresco.rest.framework.resource.parameters.ListPage;
 | 
			
		||||
import org.alfresco.rest.framework.resource.parameters.Paging;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.service.cmr.action.CompositeAction;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeRef;
 | 
			
		||||
import org.alfresco.service.cmr.rule.RuleService;
 | 
			
		||||
import org.alfresco.service.namespace.NamespaceService;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
 | 
			
		||||
@@ -53,57 +50,47 @@ public class RulesImpl implements Rules
 | 
			
		||||
    private Nodes nodes;
 | 
			
		||||
    private RuleService ruleService;
 | 
			
		||||
    private NodeValidator validator;
 | 
			
		||||
    private RuleLoader ruleLoader;
 | 
			
		||||
    private ActionParameterConverter actionParameterConverter;
 | 
			
		||||
    private ActionPermissionValidator actionPermissionValidator;
 | 
			
		||||
    private NamespaceService namespaceService;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public CollectionWithPagingInfo<Rule> getRules(final String folderNodeId,
 | 
			
		||||
                                                   final String ruleSetId,
 | 
			
		||||
                                                   final List<String> includes,
 | 
			
		||||
                                                   final Paging paging)
 | 
			
		||||
    public CollectionWithPagingInfo<Rule> getRules(final String folderNodeId, final String ruleSetId, final Paging paging)
 | 
			
		||||
    {
 | 
			
		||||
        final NodeRef folderNodeRef = validator.validateFolderNode(folderNodeId, false);
 | 
			
		||||
        NodeRef ruleSetNode = validator.validateRuleSetNode(ruleSetId, folderNodeRef);
 | 
			
		||||
        NodeRef owningFolder = ruleService.getOwningNodeRef(ruleSetNode);
 | 
			
		||||
        final NodeRef ruleSetNodeRef = validator.validateRuleSetNode(ruleSetId, folderNodeRef);
 | 
			
		||||
 | 
			
		||||
        final List<Rule> rules = ruleService.getRules(owningFolder, false).stream()
 | 
			
		||||
                .map(ruleModel -> loadRuleAndConvertActionParams(ruleModel, includes))
 | 
			
		||||
                .collect(Collectors.toList());
 | 
			
		||||
        final boolean isShared = validator.isRuleSetNotNullAndShared(ruleSetNodeRef);
 | 
			
		||||
        final List<Rule> rules = ruleService.getRules(folderNodeRef).stream()
 | 
			
		||||
            .map(ruleModel -> Rule.from(ruleModel, isShared))
 | 
			
		||||
            .collect(Collectors.toList());
 | 
			
		||||
 | 
			
		||||
        return ListPage.of(rules, paging);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Rule getRuleById(final String folderNodeId, final String ruleSetId, final String ruleId, final List<String> includes)
 | 
			
		||||
    public Rule getRuleById(final String folderNodeId, final String ruleSetId, final String ruleId)
 | 
			
		||||
    {
 | 
			
		||||
        final NodeRef folderNodeRef = validator.validateFolderNode(folderNodeId, false);
 | 
			
		||||
        final NodeRef ruleSetNodeRef = validator.validateRuleSetNode(ruleSetId, folderNodeRef);
 | 
			
		||||
        final NodeRef ruleNodeRef = validator.validateRuleNode(ruleId, ruleSetNodeRef);
 | 
			
		||||
 | 
			
		||||
        return loadRuleAndConvertActionParams(ruleService.getRule(ruleNodeRef), includes);
 | 
			
		||||
        return Rule.from(ruleService.getRule(ruleNodeRef), validator.isRuleSetNotNullAndShared(ruleSetNodeRef));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<Rule> createRules(final String folderNodeId, final String ruleSetId, final List<Rule> rules, final List<String> includes)
 | 
			
		||||
    public List<Rule> createRules(final String folderNodeId, final String ruleSetId, final List<Rule> rules)
 | 
			
		||||
    {
 | 
			
		||||
        final NodeRef folderNodeRef = validator.validateFolderNode(folderNodeId, true);
 | 
			
		||||
        // Don't validate the ruleset node if -default- is passed since we may need to create it.
 | 
			
		||||
        if (RuleSet.isNotDefaultId(ruleSetId))
 | 
			
		||||
        {
 | 
			
		||||
            validator.validateRuleSetNode(ruleSetId, folderNodeRef);
 | 
			
		||||
        }
 | 
			
		||||
        final NodeRef ruleSetNodeRef = (RuleSet.isNotDefaultId(ruleSetId)) ? validator.validateRuleSetNode(ruleSetId, folderNodeRef) : null;
 | 
			
		||||
 | 
			
		||||
        return rules.stream()
 | 
			
		||||
                .map(this::mapToServiceModelAndValidateActions)
 | 
			
		||||
                .map(rule -> ruleService.saveRule(folderNodeRef, rule))
 | 
			
		||||
                .map(rule -> loadRuleAndConvertActionParams(rule, includes))
 | 
			
		||||
                .collect(Collectors.toList());
 | 
			
		||||
                    .map(rule -> rule.toServiceModel(nodes))
 | 
			
		||||
                    .map(rule -> ruleService.saveRule(folderNodeRef, rule))
 | 
			
		||||
                    .map(rule -> Rule.from(rule, validator.isRuleSetNotNullAndShared(ruleSetNodeRef, folderNodeRef)))
 | 
			
		||||
                    .collect(Collectors.toList());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Rule updateRuleById(String folderNodeId, String ruleSetId, String ruleId, Rule rule, List<String> includes)
 | 
			
		||||
    public Rule updateRuleById(String folderNodeId, String ruleSetId, String ruleId, Rule rule)
 | 
			
		||||
    {
 | 
			
		||||
        LOGGER.debug("Updating rule in folder {}, rule set {}, rule {} to {}", folderNodeId, ruleSetId, ruleId, rule);
 | 
			
		||||
 | 
			
		||||
@@ -111,7 +98,8 @@ public class RulesImpl implements Rules
 | 
			
		||||
        NodeRef ruleSetNodeRef = validator.validateRuleSetNode(ruleSetId, folderNodeRef);
 | 
			
		||||
        validator.validateRuleNode(ruleId, ruleSetNodeRef);
 | 
			
		||||
 | 
			
		||||
        return ruleLoader.loadRule(ruleService.saveRule(folderNodeRef, mapToServiceModelAndValidateActions(rule)), includes);
 | 
			
		||||
        boolean shared = validator.isRuleSetNotNullAndShared(ruleSetNodeRef, folderNodeRef);
 | 
			
		||||
        return Rule.from(ruleService.saveRule(folderNodeRef, rule.toServiceModel(nodes)), shared);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -124,29 +112,6 @@ public class RulesImpl implements Rules
 | 
			
		||||
        ruleService.removeRule(folderNodeRef, rule);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private org.alfresco.service.cmr.rule.Rule mapToServiceModelAndValidateActions(Rule rule)
 | 
			
		||||
    {
 | 
			
		||||
        final org.alfresco.service.cmr.rule.Rule serviceModelRule = rule.toServiceModel(nodes, namespaceService);
 | 
			
		||||
        final CompositeAction compositeAction = (CompositeAction) serviceModelRule.getAction();
 | 
			
		||||
        compositeAction.getActions().forEach(action -> action.setParameterValues(
 | 
			
		||||
                actionParameterConverter.getConvertedParams(action.getParameterValues(), action.getActionDefinitionName())));
 | 
			
		||||
 | 
			
		||||
        return actionPermissionValidator.validateRulePermissions(serviceModelRule);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private Rule loadRuleAndConvertActionParams(org.alfresco.service.cmr.rule.Rule ruleModel, List<String> includes)
 | 
			
		||||
    {
 | 
			
		||||
        final Rule rule = ruleLoader.loadRule(ruleModel, includes);
 | 
			
		||||
        rule.getActions()
 | 
			
		||||
                .forEach(a -> a.setParams(a.getParams().entrySet()
 | 
			
		||||
                                .stream()
 | 
			
		||||
                                .collect(Collectors
 | 
			
		||||
                                        .toMap(Map.Entry::getKey, e -> actionParameterConverter.convertParamFromServiceModel(e.getValue())))
 | 
			
		||||
                        )
 | 
			
		||||
                );
 | 
			
		||||
        return rule;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setNodes(Nodes nodes)
 | 
			
		||||
    {
 | 
			
		||||
        this.nodes = nodes;
 | 
			
		||||
@@ -161,24 +126,4 @@ public class RulesImpl implements Rules
 | 
			
		||||
    {
 | 
			
		||||
        this.validator = validator;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setRuleLoader(RuleLoader ruleLoader)
 | 
			
		||||
    {
 | 
			
		||||
        this.ruleLoader = ruleLoader;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setActionParameterConverter(ActionParameterConverter actionParameterConverter)
 | 
			
		||||
    {
 | 
			
		||||
        this.actionParameterConverter = actionParameterConverter;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setActionPermissionValidator(ActionPermissionValidator actionPermissionValidator)
 | 
			
		||||
    {
 | 
			
		||||
        this.actionPermissionValidator = actionPermissionValidator;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setNamespaceService(NamespaceService namespaceService)
 | 
			
		||||
    {
 | 
			
		||||
        this.namespaceService = namespaceService;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -26,8 +26,6 @@
 | 
			
		||||
 | 
			
		||||
package org.alfresco.rest.api.model.rules;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.repo.action.access.ActionAccessRestriction.ACTION_CONTEXT_PARAM_NAME;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
@@ -36,6 +34,7 @@ import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.repo.action.ActionImpl;
 | 
			
		||||
import org.alfresco.repo.action.CompositeActionImpl;
 | 
			
		||||
import org.alfresco.repo.action.executer.SetPropertyValueActionExecuter;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeRef;
 | 
			
		||||
import org.alfresco.util.GUID;
 | 
			
		||||
@@ -62,9 +61,7 @@ public class Action
 | 
			
		||||
        final Action.Builder builder = builder().actionDefinitionId(actionModel.getActionDefinitionName());
 | 
			
		||||
        if (actionModel.getParameterValues() != null)
 | 
			
		||||
        {
 | 
			
		||||
            Map<String, Serializable> params = new HashMap<>(actionModel.getParameterValues());
 | 
			
		||||
            params.remove(ACTION_CONTEXT_PARAM_NAME);
 | 
			
		||||
            builder.params(params);
 | 
			
		||||
            builder.params(new HashMap<>(actionModel.getParameterValues()));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return builder.create();
 | 
			
		||||
@@ -78,7 +75,7 @@ public class Action
 | 
			
		||||
     */
 | 
			
		||||
    public org.alfresco.service.cmr.action.Action toServiceModel(final NodeRef nodeRef)
 | 
			
		||||
    {
 | 
			
		||||
        return new ActionImpl(nodeRef, GUID.generate(), this.actionDefinitionId, params);
 | 
			
		||||
        return new ActionImpl(nodeRef, GUID.generate(), SetPropertyValueActionExecuter.NAME, params);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -32,10 +32,8 @@ import java.util.Objects;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.api.Nodes;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.service.cmr.action.ActionCondition;
 | 
			
		||||
import org.alfresco.service.namespace.NamespaceService;
 | 
			
		||||
import org.apache.commons.collections.CollectionUtils;
 | 
			
		||||
 | 
			
		||||
@Experimental
 | 
			
		||||
@@ -52,7 +50,7 @@ public class CompositeCondition
 | 
			
		||||
     * @param actionConditions - list of {@link ActionCondition} service POJOs
 | 
			
		||||
     * @return {@link CompositeCondition} REST model
 | 
			
		||||
     */
 | 
			
		||||
    public static CompositeCondition from(final List<ActionCondition> actionConditions, final NamespaceService namespaceService)
 | 
			
		||||
    public static CompositeCondition from(final List<ActionCondition> actionConditions)
 | 
			
		||||
    {
 | 
			
		||||
        if (actionConditions == null)
 | 
			
		||||
        {
 | 
			
		||||
@@ -64,7 +62,7 @@ public class CompositeCondition
 | 
			
		||||
        // group action conditions by inversion flag
 | 
			
		||||
        actionConditions.stream().filter(Objects::nonNull).collect(Collectors.groupingBy(ActionCondition::getInvertCondition))
 | 
			
		||||
            // map action condition sub lists
 | 
			
		||||
            .forEach((inverted, actionConditionsPart) -> Optional.ofNullable(CompositeCondition.ofActionConditions(actionConditionsPart, namespaceService, inverted, ConditionOperator.AND))
 | 
			
		||||
            .forEach((inverted, actionConditionsPart) -> Optional.ofNullable(CompositeCondition.ofActionConditions(actionConditionsPart, inverted, ConditionOperator.AND))
 | 
			
		||||
                // if composite condition present add to final list
 | 
			
		||||
                .ifPresent(compositeCondition -> conditions.compositeConditions.add(compositeCondition)));
 | 
			
		||||
 | 
			
		||||
@@ -75,14 +73,14 @@ public class CompositeCondition
 | 
			
		||||
        return conditions;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static CompositeCondition ofActionConditions(final List<ActionCondition> actionConditions, final NamespaceService namespaceService, final boolean inverted, final ConditionOperator conditionOperator)
 | 
			
		||||
    private static CompositeCondition ofActionConditions(final List<ActionCondition> actionConditions, final boolean inverted, final ConditionOperator conditionOperator)
 | 
			
		||||
    {
 | 
			
		||||
        if (actionConditions == null)
 | 
			
		||||
        {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return ofSimpleConditions(SimpleCondition.listOf(actionConditions, namespaceService), inverted, conditionOperator);
 | 
			
		||||
        return ofSimpleConditions(SimpleCondition.listOf(actionConditions), inverted, conditionOperator);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -114,21 +112,6 @@ public class CompositeCondition
 | 
			
		||||
            .create();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public List<ActionCondition> toServiceModels(final Nodes nodes, final NamespaceService namespaceService)
 | 
			
		||||
    {
 | 
			
		||||
        final List<ActionCondition> actionConditions = new ArrayList<>();
 | 
			
		||||
        if (CollectionUtils.isNotEmpty(simpleConditions))
 | 
			
		||||
        {
 | 
			
		||||
            simpleConditions.forEach(simpleCondition -> actionConditions.add(simpleCondition.toServiceModel(inverted, nodes, namespaceService)));
 | 
			
		||||
        }
 | 
			
		||||
        if (CollectionUtils.isNotEmpty(compositeConditions))
 | 
			
		||||
        {
 | 
			
		||||
            compositeConditions.forEach(compositeCondition -> actionConditions.addAll(compositeCondition.toServiceModels(nodes, namespaceService)));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return actionConditions;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isInverted()
 | 
			
		||||
    {
 | 
			
		||||
        return inverted;
 | 
			
		||||
@@ -148,14 +131,6 @@ public class CompositeCondition
 | 
			
		||||
        return booleanMode.name().toLowerCase();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setBooleanMode(String booleanMode)
 | 
			
		||||
    {
 | 
			
		||||
        if (booleanMode != null)
 | 
			
		||||
        {
 | 
			
		||||
            this.booleanMode = ConditionOperator.valueOf(booleanMode.toUpperCase());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setBooleanMode(ConditionOperator booleanMode)
 | 
			
		||||
    {
 | 
			
		||||
        this.booleanMode = booleanMode;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,59 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.api.model.rules;
 | 
			
		||||
 | 
			
		||||
import com.fasterxml.jackson.annotation.JsonValue;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
 | 
			
		||||
/** The reason why a rule set applies to a folder. */
 | 
			
		||||
@Experimental
 | 
			
		||||
public enum InclusionType
 | 
			
		||||
{
 | 
			
		||||
    OWNED, INHERITED, LINKED;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Load an InclusionType from a given string (case insensitively).
 | 
			
		||||
     *
 | 
			
		||||
     * @param inclusionType The given string.
 | 
			
		||||
     * @return The inclusion type.
 | 
			
		||||
     */
 | 
			
		||||
    public static InclusionType from(String inclusionType)
 | 
			
		||||
    {
 | 
			
		||||
        return InclusionType.valueOf(inclusionType.toUpperCase());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The lower case version of the inclusion type.
 | 
			
		||||
     *
 | 
			
		||||
     * @return A lowercase string.
 | 
			
		||||
     */
 | 
			
		||||
    @JsonValue
 | 
			
		||||
    public String toString()
 | 
			
		||||
    {
 | 
			
		||||
        return super.toString().toLowerCase();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -30,15 +30,12 @@ import java.util.List;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.repo.action.ActionImpl;
 | 
			
		||||
import org.alfresco.repo.action.executer.ScriptActionExecuter;
 | 
			
		||||
import org.alfresco.rest.api.Nodes;
 | 
			
		||||
import org.alfresco.rest.framework.resource.UniqueId;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.service.cmr.action.CompositeAction;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeRef;
 | 
			
		||||
import org.alfresco.service.namespace.NamespaceService;
 | 
			
		||||
import org.alfresco.util.GUID;
 | 
			
		||||
 | 
			
		||||
@Experimental
 | 
			
		||||
public class Rule
 | 
			
		||||
@@ -49,9 +46,9 @@ public class Rule
 | 
			
		||||
    private boolean enabled;
 | 
			
		||||
    private boolean cascade;
 | 
			
		||||
    private boolean asynchronous;
 | 
			
		||||
    private Boolean isShared;
 | 
			
		||||
    private boolean shared;
 | 
			
		||||
    private String errorScript;
 | 
			
		||||
    private List<RuleTrigger> triggers = List.of(RuleTrigger.INBOUND);
 | 
			
		||||
    private List<RuleTrigger> triggers;
 | 
			
		||||
    private CompositeCondition conditions;
 | 
			
		||||
    private List<Action> actions;
 | 
			
		||||
 | 
			
		||||
@@ -61,7 +58,7 @@ public class Rule
 | 
			
		||||
     * @param ruleModel - {@link org.alfresco.service.cmr.rule.Rule} service POJO
 | 
			
		||||
     * @return {@link Rule} REST model
 | 
			
		||||
     */
 | 
			
		||||
    public static Rule from(final org.alfresco.service.cmr.rule.Rule ruleModel, final NamespaceService namespaceService)
 | 
			
		||||
    public static Rule from(final org.alfresco.service.cmr.rule.Rule ruleModel, final boolean shared)
 | 
			
		||||
    {
 | 
			
		||||
        if (ruleModel == null)
 | 
			
		||||
        {
 | 
			
		||||
@@ -73,7 +70,8 @@ public class Rule
 | 
			
		||||
            .description(ruleModel.getDescription())
 | 
			
		||||
            .enabled(!ruleModel.getRuleDisabled())
 | 
			
		||||
            .cascade(ruleModel.isAppliedToChildren())
 | 
			
		||||
            .asynchronous(ruleModel.getExecuteAsynchronously());
 | 
			
		||||
            .asynchronous(ruleModel.getExecuteAsynchronously())
 | 
			
		||||
            .shared(shared);
 | 
			
		||||
 | 
			
		||||
        if (ruleModel.getNodeRef() != null) {
 | 
			
		||||
            builder.id(ruleModel.getNodeRef().getId());
 | 
			
		||||
@@ -84,7 +82,7 @@ public class Rule
 | 
			
		||||
        }
 | 
			
		||||
        if (ruleModel.getAction() != null)
 | 
			
		||||
        {
 | 
			
		||||
            builder.conditions(CompositeCondition.from(ruleModel.getAction().getActionConditions(), namespaceService));
 | 
			
		||||
            builder.conditions(CompositeCondition.from(ruleModel.getAction().getActionConditions()));
 | 
			
		||||
            if (ruleModel.getAction().getCompensatingAction() != null && ruleModel.getAction().getCompensatingAction().getParameterValue(ScriptActionExecuter.PARAM_SCRIPTREF) != null)
 | 
			
		||||
            {
 | 
			
		||||
                builder.errorScript(ruleModel.getAction().getCompensatingAction().getParameterValue(ScriptActionExecuter.PARAM_SCRIPTREF).toString());
 | 
			
		||||
@@ -104,31 +102,14 @@ public class Rule
 | 
			
		||||
     * @param nodes The nodes API.
 | 
			
		||||
     * @return The rule service POJO.
 | 
			
		||||
     */
 | 
			
		||||
    public org.alfresco.service.cmr.rule.Rule toServiceModel(final Nodes nodes, final NamespaceService namespaceService)
 | 
			
		||||
    public org.alfresco.service.cmr.rule.Rule toServiceModel(Nodes nodes)
 | 
			
		||||
    {
 | 
			
		||||
        final org.alfresco.service.cmr.rule.Rule ruleModel = new org.alfresco.service.cmr.rule.Rule();
 | 
			
		||||
        final NodeRef nodeRef = (id != null) ? nodes.validateOrLookupNode(id, null) : null;
 | 
			
		||||
        ruleModel.setNodeRef(nodeRef);
 | 
			
		||||
        ruleModel.setTitle(name);
 | 
			
		||||
        ruleModel.setDescription(description);
 | 
			
		||||
        ruleModel.setRuleDisabled(!enabled);
 | 
			
		||||
        ruleModel.applyToChildren(cascade);
 | 
			
		||||
        ruleModel.setExecuteAsynchronously(asynchronous);
 | 
			
		||||
        if (triggers != null)
 | 
			
		||||
        {
 | 
			
		||||
            ruleModel.setRuleTypes(triggers.stream().map(RuleTrigger::getValue).collect(Collectors.toList()));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ruleModel.setAction(Action.toCompositeAction(actions));
 | 
			
		||||
        if (errorScript != null)
 | 
			
		||||
        {
 | 
			
		||||
            final org.alfresco.service.cmr.action.Action compensatingAction = new ActionImpl(null, GUID.generate(), ScriptActionExecuter.NAME);
 | 
			
		||||
            compensatingAction.setParameterValue(ScriptActionExecuter.PARAM_SCRIPTREF, errorScript);
 | 
			
		||||
            ruleModel.getAction().setCompensatingAction(compensatingAction);
 | 
			
		||||
        }
 | 
			
		||||
        if (conditions != null)
 | 
			
		||||
        {
 | 
			
		||||
            conditions.toServiceModels(nodes, namespaceService).forEach(condition -> ruleModel.getAction().addActionCondition(condition));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return ruleModel;
 | 
			
		||||
    }
 | 
			
		||||
@@ -204,14 +185,14 @@ public class Rule
 | 
			
		||||
        this.errorScript = errorScript;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Boolean isIsShared()
 | 
			
		||||
    public boolean isShared()
 | 
			
		||||
    {
 | 
			
		||||
        return isShared;
 | 
			
		||||
        return shared;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setIsShared(Boolean shared)
 | 
			
		||||
    public void setShared(boolean shared)
 | 
			
		||||
    {
 | 
			
		||||
        this.isShared = shared;
 | 
			
		||||
        this.shared = shared;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public List<String> getTriggers()
 | 
			
		||||
@@ -223,15 +204,7 @@ public class Rule
 | 
			
		||||
        return triggers.stream().map(RuleTrigger::getValue).collect(Collectors.toList());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setTriggers(List<String> triggers)
 | 
			
		||||
    {
 | 
			
		||||
        if (triggers != null)
 | 
			
		||||
        {
 | 
			
		||||
            this.triggers = triggers.stream().map(RuleTrigger::of).collect(Collectors.toList());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setRuleTriggers(List<RuleTrigger> triggers)
 | 
			
		||||
    public void setTriggers(List<RuleTrigger> triggers)
 | 
			
		||||
    {
 | 
			
		||||
        this.triggers = triggers;
 | 
			
		||||
    }
 | 
			
		||||
@@ -260,7 +233,7 @@ public class Rule
 | 
			
		||||
    public String toString()
 | 
			
		||||
    {
 | 
			
		||||
        return "Rule{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", description='" + description + '\'' + ", enabled=" + enabled + ", cascade=" + cascade
 | 
			
		||||
            + ", asynchronous=" + asynchronous + ", isShared=" + isShared + ", errorScript='" + errorScript + '\'' + ", triggers=" + triggers + ", conditions=" + conditions
 | 
			
		||||
            + ", asynchronous=" + asynchronous + ", shared=" + shared + ", errorScript='" + errorScript + '\'' + ", triggers=" + triggers + ", conditions=" + conditions
 | 
			
		||||
            + ", actions=" + actions + '}';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -272,23 +245,15 @@ public class Rule
 | 
			
		||||
        if (o == null || getClass() != o.getClass())
 | 
			
		||||
            return false;
 | 
			
		||||
        Rule rule = (Rule) o;
 | 
			
		||||
        return enabled == rule.enabled
 | 
			
		||||
                && cascade == rule.cascade
 | 
			
		||||
                && asynchronous == rule.asynchronous
 | 
			
		||||
                && Objects.equals(isShared, rule.isShared)
 | 
			
		||||
                && Objects.equals(id, rule.id)
 | 
			
		||||
                && Objects.equals(name, rule.name)
 | 
			
		||||
                && Objects.equals(description, rule.description)
 | 
			
		||||
                && Objects.equals(errorScript, rule.errorScript)
 | 
			
		||||
                && Objects.equals(triggers, rule.triggers)
 | 
			
		||||
                && Objects.equals(conditions, rule.conditions)
 | 
			
		||||
                && Objects.equals(actions, rule.actions);
 | 
			
		||||
        return enabled == rule.enabled && cascade == rule.cascade && asynchronous == rule.asynchronous && shared == rule.shared && Objects.equals(id, rule.id) && Objects.equals(
 | 
			
		||||
            name, rule.name) && Objects.equals(description, rule.description) && Objects.equals(errorScript, rule.errorScript) && Objects.equals(triggers, rule.triggers)
 | 
			
		||||
            && Objects.equals(conditions, rule.conditions) && Objects.equals(actions, rule.actions);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int hashCode()
 | 
			
		||||
    {
 | 
			
		||||
        return Objects.hash(id, name, description, enabled, cascade, asynchronous, isShared, errorScript, triggers, conditions, actions);
 | 
			
		||||
        return Objects.hash(id, name, description, enabled, cascade, asynchronous, shared, errorScript, triggers, conditions, actions);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Builder builder()
 | 
			
		||||
@@ -305,9 +270,9 @@ public class Rule
 | 
			
		||||
        private boolean enabled;
 | 
			
		||||
        private boolean cascade;
 | 
			
		||||
        private boolean asynchronous;
 | 
			
		||||
        private Boolean isShared;
 | 
			
		||||
        private boolean shared;
 | 
			
		||||
        private String errorScript;
 | 
			
		||||
        private List<RuleTrigger> triggers = List.of(RuleTrigger.INBOUND);
 | 
			
		||||
        private List<RuleTrigger> triggers;
 | 
			
		||||
        private CompositeCondition conditions;
 | 
			
		||||
        private List<Action> actions;
 | 
			
		||||
 | 
			
		||||
@@ -347,9 +312,9 @@ public class Rule
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Builder isShared(Boolean isShared)
 | 
			
		||||
        public Builder shared(boolean shared)
 | 
			
		||||
        {
 | 
			
		||||
            this.isShared = isShared;
 | 
			
		||||
            this.shared = shared;
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -386,9 +351,9 @@ public class Rule
 | 
			
		||||
            rule.setEnabled(enabled);
 | 
			
		||||
            rule.setCascade(cascade);
 | 
			
		||||
            rule.setAsynchronous(asynchronous);
 | 
			
		||||
            rule.setIsShared(isShared);
 | 
			
		||||
            rule.setShared(shared);
 | 
			
		||||
            rule.setErrorScript(errorScript);
 | 
			
		||||
            rule.setRuleTriggers(triggers);
 | 
			
		||||
            rule.setTriggers(triggers);
 | 
			
		||||
            rule.setConditions(conditions);
 | 
			
		||||
            rule.setActions(actions);
 | 
			
		||||
            return rule;
 | 
			
		||||
 
 | 
			
		||||
@@ -27,10 +27,8 @@
 | 
			
		||||
package org.alfresco.rest.api.model.rules;
 | 
			
		||||
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
import java.util.StringJoiner;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeRef;
 | 
			
		||||
 | 
			
		||||
@Experimental
 | 
			
		||||
public class RuleSet
 | 
			
		||||
@@ -38,8 +36,6 @@ public class RuleSet
 | 
			
		||||
    public static final String DEFAULT_ID = "-default-";
 | 
			
		||||
 | 
			
		||||
    private String id;
 | 
			
		||||
    private NodeRef owningFolder;
 | 
			
		||||
    private InclusionType inclusionType;
 | 
			
		||||
 | 
			
		||||
    public static RuleSet of(String id)
 | 
			
		||||
    {
 | 
			
		||||
@@ -66,36 +62,10 @@ public class RuleSet
 | 
			
		||||
        this.id = id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public NodeRef getOwningFolder()
 | 
			
		||||
    {
 | 
			
		||||
        return owningFolder;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setOwningFolder(NodeRef owningFolder)
 | 
			
		||||
    {
 | 
			
		||||
        this.owningFolder = owningFolder;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public InclusionType getInclusionType()
 | 
			
		||||
    {
 | 
			
		||||
        return inclusionType;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setInclusionType(InclusionType inclusionType)
 | 
			
		||||
    {
 | 
			
		||||
        this.inclusionType = inclusionType;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString()
 | 
			
		||||
    {
 | 
			
		||||
        return "RuleSet{"
 | 
			
		||||
                + new StringJoiner(", ")
 | 
			
		||||
                    .add("id='" + id + "'")
 | 
			
		||||
                    .add("owningFolder='" + owningFolder + "'")
 | 
			
		||||
                    .add("inclusionType='" + inclusionType + "'")
 | 
			
		||||
                    .toString()
 | 
			
		||||
                + '}';
 | 
			
		||||
        return "RuleSet{" + "id='" + id + '\'' + '}';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -106,15 +76,13 @@ public class RuleSet
 | 
			
		||||
        if (o == null || getClass() != o.getClass())
 | 
			
		||||
            return false;
 | 
			
		||||
        RuleSet ruleSet = (RuleSet) o;
 | 
			
		||||
        return Objects.equals(id, ruleSet.id)
 | 
			
		||||
                && Objects.equals(owningFolder, ruleSet.owningFolder)
 | 
			
		||||
                && inclusionType == ruleSet.inclusionType;
 | 
			
		||||
        return Objects.equals(id, ruleSet.id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int hashCode()
 | 
			
		||||
    {
 | 
			
		||||
        return Objects.hash(id, owningFolder, inclusionType);
 | 
			
		||||
        return Objects.hash(id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Builder builder()
 | 
			
		||||
@@ -125,8 +93,6 @@ public class RuleSet
 | 
			
		||||
    public static class Builder
 | 
			
		||||
    {
 | 
			
		||||
        private String id;
 | 
			
		||||
        private NodeRef owningFolder;
 | 
			
		||||
        private InclusionType inclusionType;
 | 
			
		||||
 | 
			
		||||
        public Builder id(String id)
 | 
			
		||||
        {
 | 
			
		||||
@@ -134,24 +100,10 @@ public class RuleSet
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Builder owningFolder(NodeRef owningFolder)
 | 
			
		||||
        {
 | 
			
		||||
            this.owningFolder = owningFolder;
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Builder inclusionType(InclusionType inclusionType)
 | 
			
		||||
        {
 | 
			
		||||
            this.inclusionType = inclusionType;
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public RuleSet create()
 | 
			
		||||
        {
 | 
			
		||||
            final RuleSet ruleSet = new RuleSet();
 | 
			
		||||
            ruleSet.setId(id);
 | 
			
		||||
            ruleSet.setOwningFolder(owningFolder);
 | 
			
		||||
            ruleSet.setInclusionType(inclusionType);
 | 
			
		||||
            return ruleSet;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,46 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.api.model.rules;
 | 
			
		||||
 | 
			
		||||
public class RuleSetLink
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This id is referring to the node id of the linked-to-folder which contains the rule set(s)
 | 
			
		||||
     */
 | 
			
		||||
    private String id;
 | 
			
		||||
 | 
			
		||||
    public void setId(String id)
 | 
			
		||||
    {
 | 
			
		||||
        this.id = id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getId()
 | 
			
		||||
    {
 | 
			
		||||
        return id;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,126 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.api.model.rules;
 | 
			
		||||
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
import java.util.StringJoiner;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.framework.resource.UniqueId;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
 | 
			
		||||
@Experimental
 | 
			
		||||
public class RuleSetting
 | 
			
		||||
{
 | 
			
		||||
    public static final String IS_INHERITANCE_ENABLED_KEY = "-isInheritanceEnabled-";
 | 
			
		||||
 | 
			
		||||
    private String key;
 | 
			
		||||
    private Object value;
 | 
			
		||||
 | 
			
		||||
    @UniqueId
 | 
			
		||||
    public String getKey()
 | 
			
		||||
    {
 | 
			
		||||
        return key;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setKey(String key)
 | 
			
		||||
    {
 | 
			
		||||
        this.key = key;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Object getValue()
 | 
			
		||||
    {
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setValue(Object value)
 | 
			
		||||
    {
 | 
			
		||||
        this.value = value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString()
 | 
			
		||||
    {
 | 
			
		||||
        return "RuleSetting{"
 | 
			
		||||
                + new StringJoiner(", ")
 | 
			
		||||
                    .add("key=" + key)
 | 
			
		||||
                    .add("value=" + value.toString())
 | 
			
		||||
                    .toString()
 | 
			
		||||
                + "}";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean equals(Object o)
 | 
			
		||||
    {
 | 
			
		||||
        if (this == o)
 | 
			
		||||
        {
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        if (!(o instanceof RuleSetting))
 | 
			
		||||
        {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        RuleSetting that = (RuleSetting) o;
 | 
			
		||||
        return Objects.equals(key, that.key)
 | 
			
		||||
                && Objects.equals(value, that.value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int hashCode()
 | 
			
		||||
    {
 | 
			
		||||
        return Objects.hash(key, value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static RuleSetting.Builder builder()
 | 
			
		||||
    {
 | 
			
		||||
        return new RuleSetting.Builder();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static class Builder
 | 
			
		||||
    {
 | 
			
		||||
        private String key;
 | 
			
		||||
        private Object value;
 | 
			
		||||
 | 
			
		||||
        public RuleSetting.Builder key(String key)
 | 
			
		||||
        {
 | 
			
		||||
            this.key = key;
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public RuleSetting.Builder value(Object value)
 | 
			
		||||
        {
 | 
			
		||||
            this.value = value;
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public RuleSetting create()
 | 
			
		||||
        {
 | 
			
		||||
            final RuleSetting ruleSetting = new RuleSetting();
 | 
			
		||||
            ruleSetting.setKey(key);
 | 
			
		||||
            ruleSetting.setValue(value);
 | 
			
		||||
            return ruleSetting;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -31,15 +31,31 @@ import org.alfresco.service.Experimental;
 | 
			
		||||
@Experimental
 | 
			
		||||
public enum RuleTrigger
 | 
			
		||||
{
 | 
			
		||||
    INBOUND, UPDATE, OUTBOUND;
 | 
			
		||||
    INBOUND("inbound"),
 | 
			
		||||
    UPDATE("update"),
 | 
			
		||||
    OUTBOUND("outbound");
 | 
			
		||||
 | 
			
		||||
    RuleTrigger(String value)
 | 
			
		||||
    {
 | 
			
		||||
        this.value = value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private final String value;
 | 
			
		||||
 | 
			
		||||
    public String getValue()
 | 
			
		||||
    {
 | 
			
		||||
        return this.name().toLowerCase();
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static RuleTrigger of(final String value)
 | 
			
		||||
    {
 | 
			
		||||
        return RuleTrigger.valueOf(value.toUpperCase());
 | 
			
		||||
        for (RuleTrigger ruleTrigger : values())
 | 
			
		||||
        {
 | 
			
		||||
            if (ruleTrigger.value.equals(value)) {
 | 
			
		||||
                return ruleTrigger;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -26,41 +26,27 @@
 | 
			
		||||
 | 
			
		||||
package org.alfresco.rest.api.model.rules;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.model.ContentModel;
 | 
			
		||||
import org.alfresco.repo.action.ActionConditionImpl;
 | 
			
		||||
import org.alfresco.repo.action.evaluator.CompareMimeTypeEvaluator;
 | 
			
		||||
import org.alfresco.repo.action.evaluator.ComparePropertyValueEvaluator;
 | 
			
		||||
import org.alfresco.repo.action.evaluator.HasAspectEvaluator;
 | 
			
		||||
import org.alfresco.repo.action.evaluator.HasChildEvaluator;
 | 
			
		||||
import org.alfresco.repo.action.evaluator.HasTagEvaluator;
 | 
			
		||||
import org.alfresco.repo.action.evaluator.HasVersionHistoryEvaluator;
 | 
			
		||||
import org.alfresco.repo.action.evaluator.InCategoryEvaluator;
 | 
			
		||||
import org.alfresco.repo.action.evaluator.IsSubTypeEvaluator;
 | 
			
		||||
import org.alfresco.repo.action.evaluator.NoConditionEvaluator;
 | 
			
		||||
import org.alfresco.repo.action.evaluator.compare.ComparePropertyValueOperation;
 | 
			
		||||
import org.alfresco.repo.action.evaluator.compare.ContentPropertyName;
 | 
			
		||||
import org.alfresco.rest.api.Nodes;
 | 
			
		||||
import org.alfresco.rest.framework.core.exceptions.EntityNotFoundException;
 | 
			
		||||
import org.alfresco.rest.framework.core.exceptions.InvalidArgumentException;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.service.cmr.action.ActionCondition;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeRef;
 | 
			
		||||
import org.alfresco.service.namespace.NamespaceService;
 | 
			
		||||
import org.alfresco.service.namespace.QName;
 | 
			
		||||
import org.apache.commons.collections.CollectionUtils;
 | 
			
		||||
 | 
			
		||||
@Experimental
 | 
			
		||||
public class SimpleCondition
 | 
			
		||||
{
 | 
			
		||||
    private static final String CATEGORY_INVALID_MSG = "Category in condition is invalid";
 | 
			
		||||
    public static final String PARAM_CATEGORY = "category";
 | 
			
		||||
    public static final String PARAM_MIMETYPE = "mimetype";
 | 
			
		||||
    private static final String COMPARATOR_EQUALS = "equals";
 | 
			
		||||
 | 
			
		||||
    private String field;
 | 
			
		||||
    private String comparator;
 | 
			
		||||
@@ -72,7 +58,7 @@ public class SimpleCondition
 | 
			
		||||
     * @param actionConditions - list of {@link ActionCondition} service POJOs
 | 
			
		||||
     * @return list of {@link SimpleCondition} REST models
 | 
			
		||||
     */
 | 
			
		||||
    public static List<SimpleCondition> listOf(final List<ActionCondition> actionConditions, final NamespaceService namespaceService)
 | 
			
		||||
    public static List<SimpleCondition> listOf(final List<ActionCondition> actionConditions)
 | 
			
		||||
    {
 | 
			
		||||
        if (CollectionUtils.isEmpty(actionConditions))
 | 
			
		||||
        {
 | 
			
		||||
@@ -80,7 +66,7 @@ public class SimpleCondition
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return actionConditions.stream()
 | 
			
		||||
            .map(actionCondition -> from(actionCondition, namespaceService))
 | 
			
		||||
            .map(SimpleCondition::from)
 | 
			
		||||
            .filter(Objects::nonNull)
 | 
			
		||||
            .collect(Collectors.toList());
 | 
			
		||||
    }
 | 
			
		||||
@@ -91,7 +77,7 @@ public class SimpleCondition
 | 
			
		||||
     * @param actionCondition - {@link ActionCondition} service POJO
 | 
			
		||||
     * @return {@link SimpleCondition} REST model
 | 
			
		||||
     */
 | 
			
		||||
    public static SimpleCondition from(final ActionCondition actionCondition, final NamespaceService namespaceService)
 | 
			
		||||
    public static SimpleCondition from(final ActionCondition actionCondition)
 | 
			
		||||
    {
 | 
			
		||||
        if (actionCondition == null || actionCondition.getActionConditionDefinitionName() == null || actionCondition.getParameterValues() == null)
 | 
			
		||||
        {
 | 
			
		||||
@@ -101,86 +87,27 @@ public class SimpleCondition
 | 
			
		||||
        switch (actionCondition.getActionConditionDefinitionName())
 | 
			
		||||
        {
 | 
			
		||||
        case ComparePropertyValueEvaluator.NAME:
 | 
			
		||||
            return createComparePropertyValueCondition(actionCondition, namespaceService);
 | 
			
		||||
            return createComparePropertyValueCondition(actionCondition);
 | 
			
		||||
        case CompareMimeTypeEvaluator.NAME:
 | 
			
		||||
            return createCompareMimeTypeCondition(actionCondition);
 | 
			
		||||
        case HasAspectEvaluator.NAME:
 | 
			
		||||
            return createHasAspectCondition(actionCondition, namespaceService);
 | 
			
		||||
            return createHasAspectCondition(actionCondition);
 | 
			
		||||
        case HasChildEvaluator.NAME:
 | 
			
		||||
            return createHasChildCondition(actionCondition);
 | 
			
		||||
        case HasTagEvaluator.NAME:
 | 
			
		||||
            return createHasTagCondition(actionCondition);
 | 
			
		||||
        case HasVersionHistoryEvaluator.NAME:
 | 
			
		||||
            return createHasVersionHistoryCondition(actionCondition);
 | 
			
		||||
        case InCategoryEvaluator.NAME:
 | 
			
		||||
            return createInCategoryCondition(actionCondition);
 | 
			
		||||
        case IsSubTypeEvaluator.NAME:
 | 
			
		||||
            return createIsSubtypeCondition(actionCondition, namespaceService);
 | 
			
		||||
            return createIsSubtypeCondition(actionCondition);
 | 
			
		||||
        case NoConditionEvaluator.NAME:
 | 
			
		||||
        default:
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public ActionCondition toServiceModel(final boolean inverted, final Nodes nodes, final NamespaceService namespaceService)
 | 
			
		||||
    {
 | 
			
		||||
        if (field == null)
 | 
			
		||||
        {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Map<String, Serializable> parameterValues = new HashMap<>();
 | 
			
		||||
        String conditionDefinitionId;
 | 
			
		||||
 | 
			
		||||
        switch (field)
 | 
			
		||||
        {
 | 
			
		||||
        case HasAspectEvaluator.PARAM_ASPECT:
 | 
			
		||||
            conditionDefinitionId = HasAspectEvaluator.NAME;
 | 
			
		||||
            parameterValues.put(HasAspectEvaluator.PARAM_ASPECT, QName.createQName(parameter, namespaceService));
 | 
			
		||||
            break;
 | 
			
		||||
        case HasTagEvaluator.PARAM_TAG:
 | 
			
		||||
            conditionDefinitionId = HasTagEvaluator.NAME;
 | 
			
		||||
            parameterValues.put(HasTagEvaluator.PARAM_TAG, parameter);
 | 
			
		||||
            break;
 | 
			
		||||
        case PARAM_CATEGORY:
 | 
			
		||||
            conditionDefinitionId = InCategoryEvaluator.NAME;
 | 
			
		||||
            parameterValues.put(InCategoryEvaluator.PARAM_CATEGORY_ASPECT, ContentModel.ASPECT_GEN_CLASSIFIABLE);
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                parameterValues.put(InCategoryEvaluator.PARAM_CATEGORY_VALUE, nodes.validateOrLookupNode(parameter, null));
 | 
			
		||||
            } catch (EntityNotFoundException e) {
 | 
			
		||||
                throw new InvalidArgumentException(CATEGORY_INVALID_MSG);
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        case IsSubTypeEvaluator.PARAM_TYPE:
 | 
			
		||||
            conditionDefinitionId = IsSubTypeEvaluator.NAME;
 | 
			
		||||
            parameterValues.put(IsSubTypeEvaluator.PARAM_TYPE, QName.createQName(parameter, namespaceService));
 | 
			
		||||
            break;
 | 
			
		||||
        case PARAM_MIMETYPE:
 | 
			
		||||
            conditionDefinitionId = CompareMimeTypeEvaluator.NAME;
 | 
			
		||||
            parameterValues.put(ComparePropertyValueEvaluator.PARAM_PROPERTY, ContentModel.TYPE_CONTENT);
 | 
			
		||||
            parameterValues.put(ComparePropertyValueEvaluator.PARAM_VALUE, parameter);
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            conditionDefinitionId = ComparePropertyValueEvaluator.NAME;
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                // if size or encoding create content property evaluator
 | 
			
		||||
                ContentPropertyName.valueOf(field.toUpperCase());
 | 
			
		||||
                parameterValues.put(ComparePropertyValueEvaluator.PARAM_CONTENT_PROPERTY, field.toUpperCase());
 | 
			
		||||
                parameterValues.put(ComparePropertyValueEvaluator.PARAM_PROPERTY, ContentModel.TYPE_CONTENT);
 | 
			
		||||
            }
 | 
			
		||||
            catch (IllegalArgumentException ignore)
 | 
			
		||||
            {
 | 
			
		||||
                // else create common property evaluator
 | 
			
		||||
                parameterValues.put(ComparePropertyValueEvaluator.PARAM_PROPERTY, QName.createQName(field, namespaceService));
 | 
			
		||||
            }
 | 
			
		||||
            parameterValues.put(ComparePropertyValueEvaluator.PARAM_OPERATION, comparator.toUpperCase());
 | 
			
		||||
            parameterValues.put(ComparePropertyValueEvaluator.PARAM_VALUE, parameter);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        final ActionCondition actionCondition = new ActionConditionImpl(UUID.randomUUID().toString(), conditionDefinitionId, parameterValues);
 | 
			
		||||
        actionCondition.setInvertCondition(inverted);
 | 
			
		||||
        return actionCondition;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getField()
 | 
			
		||||
    {
 | 
			
		||||
        return field;
 | 
			
		||||
@@ -234,14 +161,13 @@ public class SimpleCondition
 | 
			
		||||
        return Objects.hash(field, comparator, parameter);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static SimpleCondition createComparePropertyValueCondition(final ActionCondition actionCondition, final NamespaceService namespaceService)
 | 
			
		||||
    {
 | 
			
		||||
    private static SimpleCondition createComparePropertyValueCondition(final ActionCondition actionCondition) {
 | 
			
		||||
        final SimpleCondition.Builder builder = builder();
 | 
			
		||||
        if (actionCondition.getParameterValues().get(ComparePropertyValueEvaluator.PARAM_CONTENT_PROPERTY) != null)
 | 
			
		||||
        {
 | 
			
		||||
            builder.field(actionCondition.getParameterValues().get(ComparePropertyValueEvaluator.PARAM_CONTENT_PROPERTY).toString().toLowerCase());
 | 
			
		||||
        } else {
 | 
			
		||||
            builder.field(((QName) actionCondition.getParameterValues().get(ComparePropertyValueEvaluator.PARAM_PROPERTY)).toPrefixString(namespaceService));
 | 
			
		||||
            builder.field(actionCondition.getParameterValues().get(ComparePropertyValueEvaluator.PARAM_PROPERTY).toString().toLowerCase());
 | 
			
		||||
        }
 | 
			
		||||
        return builder
 | 
			
		||||
            .comparator(actionCondition.getParameterValues().get(ComparePropertyValueEvaluator.PARAM_OPERATION).toString().toLowerCase())
 | 
			
		||||
@@ -249,48 +175,65 @@ public class SimpleCondition
 | 
			
		||||
            .create();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static SimpleCondition createCompareMimeTypeCondition(final ActionCondition actionCondition)
 | 
			
		||||
    {
 | 
			
		||||
    private static SimpleCondition createCompareMimeTypeCondition(final ActionCondition actionCondition) {
 | 
			
		||||
        return builder()
 | 
			
		||||
            .field(PARAM_MIMETYPE)
 | 
			
		||||
            .comparator(ComparePropertyValueOperation.EQUALS.toString().toLowerCase())
 | 
			
		||||
            .field(actionCondition.getParameterValues().get(ComparePropertyValueEvaluator.PARAM_PROPERTY).toString().toLowerCase())
 | 
			
		||||
            .comparator(COMPARATOR_EQUALS)
 | 
			
		||||
            .parameter(actionCondition.getParameterValues().get(ComparePropertyValueEvaluator.PARAM_VALUE).toString())
 | 
			
		||||
            .create();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static SimpleCondition createHasAspectCondition(final ActionCondition actionCondition, final NamespaceService namespaceService)
 | 
			
		||||
    {
 | 
			
		||||
    private static SimpleCondition createHasAspectCondition(final ActionCondition actionCondition) {
 | 
			
		||||
        return builder()
 | 
			
		||||
            .field(HasAspectEvaluator.PARAM_ASPECT)
 | 
			
		||||
            .comparator(ComparePropertyValueOperation.EQUALS.toString().toLowerCase())
 | 
			
		||||
            .parameter(((QName) actionCondition.getParameterValues().get(HasAspectEvaluator.PARAM_ASPECT)).toPrefixString(namespaceService))
 | 
			
		||||
            .comparator(COMPARATOR_EQUALS)
 | 
			
		||||
            .parameter(actionCondition.getParameterValues().get(HasAspectEvaluator.PARAM_ASPECT).toString())
 | 
			
		||||
            .create();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static SimpleCondition createHasTagCondition(final ActionCondition actionCondition)
 | 
			
		||||
    {
 | 
			
		||||
    private static SimpleCondition createHasChildCondition(final ActionCondition actionCondition) {
 | 
			
		||||
        final SimpleCondition.Builder builder = builder();
 | 
			
		||||
        if (actionCondition.getParameterValues().get(HasChildEvaluator.PARAM_ASSOC_TYPE) != null)
 | 
			
		||||
        {
 | 
			
		||||
            builder.field(actionCondition.getParameterValues().get(HasChildEvaluator.PARAM_ASSOC_TYPE).toString().toLowerCase());
 | 
			
		||||
        } else {
 | 
			
		||||
            builder.field(actionCondition.getParameterValues().get(HasChildEvaluator.PARAM_ASSOC_NAME).toString().toLowerCase());
 | 
			
		||||
        }
 | 
			
		||||
        return builder
 | 
			
		||||
            .comparator(COMPARATOR_EQUALS)
 | 
			
		||||
            .parameter(actionCondition.getParameterValues().get(ComparePropertyValueEvaluator.PARAM_VALUE).toString())
 | 
			
		||||
            .create();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static SimpleCondition createHasTagCondition(final ActionCondition actionCondition) {
 | 
			
		||||
        return builder()
 | 
			
		||||
            .field(HasTagEvaluator.PARAM_TAG)
 | 
			
		||||
            .comparator(ComparePropertyValueOperation.EQUALS.toString().toLowerCase())
 | 
			
		||||
            .comparator(COMPARATOR_EQUALS)
 | 
			
		||||
            .parameter(actionCondition.getParameterValues().get(HasTagEvaluator.PARAM_TAG).toString())
 | 
			
		||||
            .create();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static SimpleCondition createInCategoryCondition(final ActionCondition actionCondition)
 | 
			
		||||
    {
 | 
			
		||||
    private static SimpleCondition createHasVersionHistoryCondition(final ActionCondition actionCondition) {
 | 
			
		||||
        return builder()
 | 
			
		||||
            .field(PARAM_CATEGORY)
 | 
			
		||||
            .comparator(ComparePropertyValueOperation.EQUALS.toString().toLowerCase())
 | 
			
		||||
            .parameter(((NodeRef) actionCondition.getParameterValues().get(InCategoryEvaluator.PARAM_CATEGORY_VALUE)).getId())
 | 
			
		||||
            .field(actionCondition.getParameterValues().get(ComparePropertyValueEvaluator.PARAM_PROPERTY).toString().toLowerCase())
 | 
			
		||||
            .comparator(actionCondition.getParameterValues().get(ComparePropertyValueEvaluator.PARAM_OPERATION).toString().toLowerCase())
 | 
			
		||||
            .parameter(actionCondition.getParameterValues().get(ComparePropertyValueEvaluator.PARAM_VALUE).toString())
 | 
			
		||||
            .create();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static SimpleCondition createIsSubtypeCondition(final ActionCondition actionCondition, final NamespaceService namespaceService)
 | 
			
		||||
    {
 | 
			
		||||
    private static SimpleCondition createInCategoryCondition(final ActionCondition actionCondition) {
 | 
			
		||||
        return builder()
 | 
			
		||||
            .field(actionCondition.getParameterValues().get(InCategoryEvaluator.PARAM_CATEGORY_ASPECT).toString().toLowerCase())
 | 
			
		||||
            .comparator(COMPARATOR_EQUALS)
 | 
			
		||||
            .parameter(actionCondition.getParameterValues().get(InCategoryEvaluator.PARAM_CATEGORY_VALUE).toString())
 | 
			
		||||
            .create();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static SimpleCondition createIsSubtypeCondition(final ActionCondition actionCondition) {
 | 
			
		||||
        return builder()
 | 
			
		||||
            .field(IsSubTypeEvaluator.PARAM_TYPE)
 | 
			
		||||
            .comparator(ComparePropertyValueOperation.EQUALS.toString().toLowerCase())
 | 
			
		||||
            .parameter(((QName) actionCondition.getParameterValues().get(IsSubTypeEvaluator.PARAM_TYPE)).toPrefixString(namespaceService))
 | 
			
		||||
            .comparator(COMPARATOR_EQUALS)
 | 
			
		||||
            .parameter(actionCondition.getParameterValues().get(IsSubTypeEvaluator.PARAM_TYPE).toString())
 | 
			
		||||
            .create();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,74 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.api.nodes;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
import javax.servlet.http.HttpServletResponse;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.api.RuleSets;
 | 
			
		||||
import org.alfresco.rest.api.model.rules.RuleSetLink;
 | 
			
		||||
import org.alfresco.rest.framework.WebApiDescription;
 | 
			
		||||
import org.alfresco.rest.framework.WebApiParam;
 | 
			
		||||
import org.alfresco.rest.framework.core.ResourceParameter;
 | 
			
		||||
import org.alfresco.rest.framework.resource.RelationshipResource;
 | 
			
		||||
import org.alfresco.rest.framework.resource.actions.interfaces.RelationshipResourceAction;
 | 
			
		||||
import org.alfresco.rest.framework.resource.parameters.Parameters;
 | 
			
		||||
import org.alfresco.util.PropertyCheck;
 | 
			
		||||
import org.springframework.beans.factory.InitializingBean;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@RelationshipResource(name = "rule-set-links", entityResource = NodesEntityResource.class, title = "Linking to a rule set")
 | 
			
		||||
public class NodeRuleSetLinksRelation implements InitializingBean, RelationshipResourceAction.Create<RuleSetLink>
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    private final RuleSets ruleSets;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void afterPropertiesSet() throws Exception
 | 
			
		||||
    {
 | 
			
		||||
        PropertyCheck.mandatory(this, "ruleSets", ruleSets);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @WebApiParam(name = "ruleSetLinkRequest", title = "Request body - rule set id",
 | 
			
		||||
            description = "Request body with rule set id", kind = ResourceParameter.KIND.HTTP_BODY_OBJECT)
 | 
			
		||||
    @WebApiDescription(title = "Link a rule set to a folder node",
 | 
			
		||||
            description = "Submits a request to link a rule set to folder",
 | 
			
		||||
            successStatus = HttpServletResponse.SC_CREATED)
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<RuleSetLink> create(String nodeId, List<RuleSetLink> ruleSetLinksBody, Parameters parameters)
 | 
			
		||||
    {
 | 
			
		||||
        return ruleSetLinksBody.stream()
 | 
			
		||||
                .map(r -> ruleSets.linkToRuleSet(nodeId, r.getId()))
 | 
			
		||||
                .collect(Collectors.toList());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public NodeRuleSetLinksRelation(RuleSets ruleSets)
 | 
			
		||||
    {
 | 
			
		||||
        this.ruleSets = ruleSets;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,104 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.api.nodes;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.http.HttpServletResponse;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.api.RuleSettings;
 | 
			
		||||
import org.alfresco.rest.api.model.rules.RuleSetting;
 | 
			
		||||
import org.alfresco.rest.framework.WebApiDescription;
 | 
			
		||||
import org.alfresco.rest.framework.core.exceptions.RelationshipResourceNotFoundException;
 | 
			
		||||
import org.alfresco.rest.framework.resource.RelationshipResource;
 | 
			
		||||
import org.alfresco.rest.framework.resource.actions.interfaces.RelationshipResourceAction;
 | 
			
		||||
import org.alfresco.rest.framework.resource.parameters.Parameters;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.util.PropertyCheck;
 | 
			
		||||
import org.springframework.beans.factory.InitializingBean;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Folder node rule settings (rule inheritance).
 | 
			
		||||
 */
 | 
			
		||||
@Experimental
 | 
			
		||||
@RelationshipResource (name = "rule-settings", entityResource = NodesEntityResource.class, title = "Folder rule settings")
 | 
			
		||||
public class NodeRuleSettingsRelation implements RelationshipResourceAction.ReadById<RuleSetting>,
 | 
			
		||||
                                                 RelationshipResourceAction.Update<RuleSetting>,
 | 
			
		||||
                                                 InitializingBean
 | 
			
		||||
{
 | 
			
		||||
    private RuleSettings ruleSettings;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void afterPropertiesSet() throws Exception
 | 
			
		||||
    {
 | 
			
		||||
        PropertyCheck.mandatory(this, "ruleSettings", ruleSettings);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the given configuration value for the specified folder.
 | 
			
		||||
     * <p>
 | 
			
		||||
     * - GET /nodes/{folderId}/rule-settings/{ruleSettingKey}
 | 
			
		||||
     *
 | 
			
		||||
     * @param folderId The id of the folder.
 | 
			
		||||
     * @param ruleSettingKey The setting to retrieve.
 | 
			
		||||
     * @param parameters Unused.
 | 
			
		||||
     * @return {@link RuleSetting} The current value of the setting.
 | 
			
		||||
     */
 | 
			
		||||
    @WebApiDescription (
 | 
			
		||||
            title = "Get a folder node rule setting",
 | 
			
		||||
            description = "Returns the specified rule setting for the given folder",
 | 
			
		||||
            successStatus = HttpServletResponse.SC_OK
 | 
			
		||||
    )
 | 
			
		||||
    @Override
 | 
			
		||||
    public RuleSetting readById(String folderId, String ruleSettingKey, Parameters parameters) throws RelationshipResourceNotFoundException
 | 
			
		||||
    {
 | 
			
		||||
        return ruleSettings.getRuleSetting(folderId, ruleSettingKey);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set the value of a rule setting for the specified folder.
 | 
			
		||||
     * <p>
 | 
			
		||||
     * PUT /nodes/{folderId}/rule-settings/{ruleSettingKey}
 | 
			
		||||
     *
 | 
			
		||||
     * @param folderId The id of the folder.
 | 
			
		||||
     * @param ruleSetting The new value of the rule setting.
 | 
			
		||||
     * @param parameters Unused.
 | 
			
		||||
     * @return The updated rule setting.
 | 
			
		||||
     */
 | 
			
		||||
    @WebApiDescription (
 | 
			
		||||
            title = "Update folder node rule setting",
 | 
			
		||||
            description = "Update a rule setting for given node",
 | 
			
		||||
            successStatus = HttpServletResponse.SC_OK
 | 
			
		||||
    )
 | 
			
		||||
    @Override
 | 
			
		||||
    public RuleSetting update(String folderId, RuleSetting ruleSetting, Parameters parameters)
 | 
			
		||||
    {
 | 
			
		||||
        return ruleSettings.setRuleSetting(folderId, ruleSetting);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setRuleSettings(RuleSettings ruleSettings)
 | 
			
		||||
    {
 | 
			
		||||
        this.ruleSettings = ruleSettings;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -26,9 +26,6 @@
 | 
			
		||||
 | 
			
		||||
package org.alfresco.rest.api.nodes;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.http.HttpServletResponse;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.api.Rules;
 | 
			
		||||
import org.alfresco.rest.api.model.rules.Rule;
 | 
			
		||||
import org.alfresco.rest.framework.WebApiDescription;
 | 
			
		||||
@@ -41,6 +38,9 @@ import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.util.PropertyCheck;
 | 
			
		||||
import org.springframework.beans.factory.InitializingBean;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.http.HttpServletResponse;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Folder node's rules.
 | 
			
		||||
 *
 | 
			
		||||
@@ -65,7 +65,7 @@ public class NodeRulesRelation implements RelationshipResourceAction.Read<Rule>,
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * List folder rules for given folder node's and rule set's IDs as a page.
 | 
			
		||||
     * <p>
 | 
			
		||||
     *
 | 
			
		||||
     * - GET /nodes/{folderNodeId}/rule-sets/{ruleSetId}/rules
 | 
			
		||||
     *
 | 
			
		||||
     * @param folderNodeId - entity resource context for this relationship
 | 
			
		||||
@@ -82,12 +82,12 @@ public class NodeRulesRelation implements RelationshipResourceAction.Read<Rule>,
 | 
			
		||||
    {
 | 
			
		||||
        final String ruleSetId = parameters.getRelationshipId();
 | 
			
		||||
 | 
			
		||||
        return rules.getRules(folderNodeId, ruleSetId, parameters.getInclude(), parameters.getPaging());
 | 
			
		||||
        return rules.getRules(folderNodeId, ruleSetId, parameters.getPaging());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get single folder rule for given node's, rule set's and rule's IDs.
 | 
			
		||||
     * <p>
 | 
			
		||||
     *
 | 
			
		||||
     * - GET /nodes/{folderNodeId}/rule-sets/{ruleSetId}/rules/{ruleId}
 | 
			
		||||
     *
 | 
			
		||||
     * @param folderNodeId - entity resource context for this relationship
 | 
			
		||||
@@ -106,7 +106,7 @@ public class NodeRulesRelation implements RelationshipResourceAction.Read<Rule>,
 | 
			
		||||
    {
 | 
			
		||||
        final String ruleId = parameters.getRelationship2Id();
 | 
			
		||||
 | 
			
		||||
        return rules.getRuleById(folderNodeId, ruleSetId, ruleId, parameters.getInclude());
 | 
			
		||||
        return rules.getRuleById(folderNodeId, ruleSetId, ruleId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -129,7 +129,7 @@ public class NodeRulesRelation implements RelationshipResourceAction.Read<Rule>,
 | 
			
		||||
    {
 | 
			
		||||
        final String ruleSetId = parameters.getRelationshipId();
 | 
			
		||||
 | 
			
		||||
        return rules.createRules(folderNodeId, ruleSetId, ruleList, parameters.getInclude());
 | 
			
		||||
        return rules.createRules(folderNodeId, ruleSetId, ruleList);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -153,12 +153,12 @@ public class NodeRulesRelation implements RelationshipResourceAction.Read<Rule>,
 | 
			
		||||
    {
 | 
			
		||||
        String ruleSetId = parameters.getRelationshipId();
 | 
			
		||||
        String ruleId = parameters.getRelationship2Id();
 | 
			
		||||
        return rules.updateRuleById(folderNodeId, ruleSetId, ruleId, rule, parameters.getInclude());
 | 
			
		||||
        return rules.updateRuleById(folderNodeId, ruleSetId, ruleId, rule);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Delete single folder rule for given node's, rule set's and rule's IDs.
 | 
			
		||||
     * <p>
 | 
			
		||||
     *
 | 
			
		||||
     * - DELETE /nodes/{folderNodeId}/rule-sets/{ruleSetId}/rules/{ruleId}
 | 
			
		||||
     *
 | 
			
		||||
     * @param folderNodeId - entity resource context for this relationship
 | 
			
		||||
 
 | 
			
		||||
@@ -854,23 +854,15 @@
 | 
			
		||||
        <property name="nodes" ref="Nodes" />
 | 
			
		||||
        <property name="permissionService" ref="PermissionService" />
 | 
			
		||||
        <property name="ruleService" ref="RuleService" />
 | 
			
		||||
        <property name="nodeService" ref="NodeService"/>
 | 
			
		||||
    </bean>
 | 
			
		||||
 | 
			
		||||
    <bean class="org.alfresco.rest.api.nodes.NodeRulesRelation">
 | 
			
		||||
        <property name="rules" ref="Rules" />
 | 
			
		||||
    </bean>
 | 
			
		||||
 | 
			
		||||
    <bean id="ruleSetLoader" class="org.alfresco.rest.api.impl.rules.RuleSetLoader">
 | 
			
		||||
        <property name="nodeService" ref="NodeService" />
 | 
			
		||||
    </bean>
 | 
			
		||||
 | 
			
		||||
    <bean id="ruleSets" class="org.alfresco.rest.api.impl.rules.RuleSetsImpl">
 | 
			
		||||
        <property name="ruleSetLoader" ref="ruleSetLoader" />
 | 
			
		||||
        <property name="validator" ref="nodeValidator" />
 | 
			
		||||
        <property name="ruleService" ref="RuleService" />
 | 
			
		||||
        <property name="nodeService" ref="NodeService"/>
 | 
			
		||||
        <property name="runtimeRuleService" ref="ruleService"/>
 | 
			
		||||
    </bean>
 | 
			
		||||
 | 
			
		||||
    <bean id="RuleSets" class="org.springframework.aop.framework.ProxyFactoryBean">
 | 
			
		||||
@@ -883,34 +875,14 @@
 | 
			
		||||
        </property>
 | 
			
		||||
    </bean>
 | 
			
		||||
 | 
			
		||||
    <bean id="ruleLoader" class="org.alfresco.rest.api.impl.rules.RuleLoader">
 | 
			
		||||
        <property name="ruleService" ref="RuleService" />
 | 
			
		||||
        <property name="nodeValidator" ref="nodeValidator" />
 | 
			
		||||
        <property name="namespaceService" ref="NamespaceService"/>
 | 
			
		||||
    </bean>
 | 
			
		||||
 | 
			
		||||
    <bean class="org.alfresco.rest.api.nodes.NodeRuleSetsRelation">
 | 
			
		||||
        <property name="ruleSets" ref="RuleSets" />
 | 
			
		||||
    </bean>
 | 
			
		||||
 | 
			
		||||
    <bean id="actionParameterConverter" class="org.alfresco.rest.api.impl.rules.ActionParameterConverter">
 | 
			
		||||
        <constructor-arg name="actionService" ref="ActionService"/>
 | 
			
		||||
        <constructor-arg name="dictionaryService" ref="DictionaryService"/>
 | 
			
		||||
        <constructor-arg name="namespaceService" ref="NamespaceService"/>
 | 
			
		||||
    </bean>
 | 
			
		||||
 | 
			
		||||
    <bean id="actionPermissionValidator" class="org.alfresco.rest.api.impl.rules.ActionPermissionValidator">
 | 
			
		||||
        <constructor-arg name="runtimeActionService" ref="actionService"/>
 | 
			
		||||
    </bean>
 | 
			
		||||
 | 
			
		||||
    <bean id="rules" class="org.alfresco.rest.api.impl.rules.RulesImpl">
 | 
			
		||||
        <property name="nodes" ref="Nodes" />
 | 
			
		||||
        <property name="validator" ref="nodeValidator"/>
 | 
			
		||||
        <property name="ruleService" ref="RuleService" />
 | 
			
		||||
        <property name="ruleLoader" ref="ruleLoader"/>
 | 
			
		||||
        <property name="actionParameterConverter" ref="actionParameterConverter"/>
 | 
			
		||||
        <property name="actionPermissionValidator" ref="actionPermissionValidator"/>
 | 
			
		||||
        <property name="namespaceService" ref="NamespaceService"/>
 | 
			
		||||
    </bean>
 | 
			
		||||
 | 
			
		||||
    <bean id="Rules" class="org.springframework.aop.framework.ProxyFactoryBean">
 | 
			
		||||
@@ -923,29 +895,6 @@
 | 
			
		||||
        </property>
 | 
			
		||||
    </bean>
 | 
			
		||||
 | 
			
		||||
    <bean class="org.alfresco.rest.api.nodes.NodeRuleSetLinksRelation">
 | 
			
		||||
        <constructor-arg name="ruleSets" ref="RuleSets" />
 | 
			
		||||
    </bean>
 | 
			
		||||
 | 
			
		||||
    <bean id="ruleSettings" class="org.alfresco.rest.api.impl.rules.RuleSettingsImpl">
 | 
			
		||||
        <property name="validator" ref="nodeValidator" />
 | 
			
		||||
        <property name="nodeService" ref="NodeService" />
 | 
			
		||||
    </bean>
 | 
			
		||||
 | 
			
		||||
    <bean id="RuleSettings" class="org.springframework.aop.framework.ProxyFactoryBean">
 | 
			
		||||
        <property name="proxyInterfaces" value="org.alfresco.rest.api.RuleSettings" />
 | 
			
		||||
        <property name="target" ref="ruleSettings" />
 | 
			
		||||
        <property name="interceptorNames">
 | 
			
		||||
            <list>
 | 
			
		||||
                <idref bean="legacyExceptionInterceptor" />
 | 
			
		||||
            </list>
 | 
			
		||||
        </property>
 | 
			
		||||
    </bean>
 | 
			
		||||
 | 
			
		||||
    <bean class="org.alfresco.rest.api.nodes.NodeRuleSettingsRelation">
 | 
			
		||||
        <property name="ruleSettings" ref="RuleSettings" />
 | 
			
		||||
    </bean>
 | 
			
		||||
 | 
			
		||||
    <bean id="publicapi.mimeTypePropertyLookup" class="org.alfresco.rest.api.lookups.MimeTypePropertyLookup">
 | 
			
		||||
        <property name="serviceRegistry" ref="ServiceRegistry"/>
 | 
			
		||||
        <property name="supported">
 | 
			
		||||
 
 | 
			
		||||
@@ -309,7 +309,7 @@ function sortByName(a, b)
 | 
			
		||||
 | 
			
		||||
function findUsers(searchTerm, maxResults, results)
 | 
			
		||||
{
 | 
			
		||||
   var personRefs = people.getPeople(searchTerm+ " [hint:useCQ]", maxResults, "lastName", true);
 | 
			
		||||
   var personRefs = people.getPeople(searchTerm, maxResults, "lastName", true);
 | 
			
		||||
   
 | 
			
		||||
   // create person object for each result
 | 
			
		||||
   for each(var personRef in personRefs)
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Share Services AMP
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 Alfresco Software Limited
 | 
			
		||||
 * 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 
 | 
			
		||||
 
 | 
			
		||||
@@ -55,14 +55,10 @@ public class PreferenceServiceTest extends BaseWebScriptTest
 | 
			
		||||
    private PersonService personService;
 | 
			
		||||
 | 
			
		||||
    private static final String USER_ONE = "PreferenceTestOne" + System.currentTimeMillis();
 | 
			
		||||
    private static final String USER_TWO = "PreferenceTestTwo" + System.currentTimeMillis();
 | 
			
		||||
 | 
			
		||||
    private static final String USER_BAD = "PreferenceTestBad" + System.currentTimeMillis();
 | 
			
		||||
 | 
			
		||||
    private static final String URL = "/api/people/" + USER_ONE + "/preferences";
 | 
			
		||||
    private static final String URL2 = "/api/people/" + USER_TWO + "/preferences";
 | 
			
		||||
 | 
			
		||||
    private static final int NUM_THREADS = 3;
 | 
			
		||||
    private static Integer THREADS_FINISHED = 0;
 | 
			
		||||
    private static final String URL = "/api/people/" + USER_ONE + "/preferences";;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void setUp() throws Exception
 | 
			
		||||
@@ -79,7 +75,6 @@ public class PreferenceServiceTest extends BaseWebScriptTest
 | 
			
		||||
 | 
			
		||||
        // Create users
 | 
			
		||||
        createUser(USER_ONE);
 | 
			
		||||
        createUser(USER_TWO);
 | 
			
		||||
        createUser(USER_BAD);
 | 
			
		||||
 | 
			
		||||
        // Do tests as user one
 | 
			
		||||
@@ -108,6 +103,7 @@ public class PreferenceServiceTest extends BaseWebScriptTest
 | 
			
		||||
    {
 | 
			
		||||
        super.tearDown();
 | 
			
		||||
        this.authenticationComponent.setCurrentUser(AuthenticationUtil.getAdminUserName());
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void testPreferences() throws Exception
 | 
			
		||||
@@ -197,64 +193,6 @@ public class PreferenceServiceTest extends BaseWebScriptTest
 | 
			
		||||
        sendRequest(new GetRequest("/api/people/noExistUser/preferences"), 404);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void testPreferencesMNT21901() throws Exception
 | 
			
		||||
    {
 | 
			
		||||
        String[] body = {
 | 
			
		||||
                "{\"org\":{\"alfresco\":{\"share\":{\"forum\":{\"summary\":{\"dashlet\":{\"component-1-5\":{\"topics\":\"mine\"}}}}}}}}",
 | 
			
		||||
                "{\"org\":{\"alfresco\":{\"share\":{\"forum\":{\"summary\":{\"dashlet\":{\"component-2-5\":{\"topics\":\"mine\"}}}}}}}}",
 | 
			
		||||
                "{\"org\":{\"alfresco\":{\"share\":{\"forum\":{\"summary\":{\"dashlet\":{\"component-2-5\":{\"history\":\"1\"}}}}}}}}" 
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        Thread[] threads = new Thread[NUM_THREADS];
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < NUM_THREADS; i++)
 | 
			
		||||
        {
 | 
			
		||||
            UpdatePreferencesThread t = new UpdatePreferencesThread(i, body[i]);
 | 
			
		||||
            threads[i] = t;
 | 
			
		||||
            t.start();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < threads.length; i++)
 | 
			
		||||
        {
 | 
			
		||||
            threads[i].join();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        authenticationComponent.setCurrentUser(USER_ONE);
 | 
			
		||||
 | 
			
		||||
        if (THREADS_FINISHED != NUM_THREADS)
 | 
			
		||||
        {
 | 
			
		||||
            fail("An error has occurred when updating preferences in concurrency context");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private class UpdatePreferencesThread extends Thread
 | 
			
		||||
    {
 | 
			
		||||
        private String body;
 | 
			
		||||
 | 
			
		||||
        UpdatePreferencesThread(int threadNum, String body)
 | 
			
		||||
        {
 | 
			
		||||
            super(UpdatePreferencesThread.class.getSimpleName() + "-" + threadNum);
 | 
			
		||||
            this.body = body;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void run()
 | 
			
		||||
        {
 | 
			
		||||
            authenticationComponent.setCurrentUser(USER_TWO);
 | 
			
		||||
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                Response resp = sendRequest(new PostRequest(URL2, body, "application/json"), 200);
 | 
			
		||||
                assertEquals(0, resp.getContentLength());
 | 
			
		||||
                THREADS_FINISHED++;
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception e)
 | 
			
		||||
            {
 | 
			
		||||
                // Intentionally empty
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private JSONObject getPreferenceObj() throws JSONException
 | 
			
		||||
    {
 | 
			
		||||
        JSONObject jsonObject = new JSONObject();
 | 
			
		||||
@@ -270,4 +208,5 @@ public class PreferenceServiceTest extends BaseWebScriptTest
 | 
			
		||||
        assertEquals(10, jsonObject.get("numberValue"));
 | 
			
		||||
        assertEquals(BigDecimal.valueOf(3.142), jsonObject.get("numberValue2"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,6 @@
 | 
			
		||||
package org.alfresco.rest.api;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.api.impl.rules.NodeValidatorTest;
 | 
			
		||||
import org.alfresco.rest.api.impl.rules.RuleSetsImplTest;
 | 
			
		||||
import org.alfresco.rest.api.model.rules.ActionTest;
 | 
			
		||||
import org.alfresco.rest.api.model.rules.CompositeConditionTest;
 | 
			
		||||
import org.alfresco.rest.api.impl.rules.RulesImplTest;
 | 
			
		||||
@@ -43,7 +42,6 @@ import org.junit.runners.Suite;
 | 
			
		||||
@Suite.SuiteClasses({
 | 
			
		||||
    NodeRulesRelationTest.class,
 | 
			
		||||
    RulesImplTest.class,
 | 
			
		||||
    RuleSetsImplTest.class,
 | 
			
		||||
    NodeValidatorTest.class,
 | 
			
		||||
    RuleTest.class,
 | 
			
		||||
    ActionTest.class,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,592 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.api.impl.rules;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.service.cmr.repository.StoreRef.STORE_REF_WORKSPACE_SPACESSTORE;
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
import static org.junit.Assert.assertEquals;
 | 
			
		||||
import static org.junit.Assert.assertTrue;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.any;
 | 
			
		||||
import static org.mockito.BDDMockito.given;
 | 
			
		||||
import static org.mockito.BDDMockito.then;
 | 
			
		||||
import static org.mockito.Mockito.times;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.repo.action.executer.AddFeaturesActionExecuter;
 | 
			
		||||
import org.alfresco.repo.action.executer.CheckInActionExecuter;
 | 
			
		||||
import org.alfresco.repo.action.executer.CheckOutActionExecuter;
 | 
			
		||||
import org.alfresco.repo.action.executer.CopyActionExecuter;
 | 
			
		||||
import org.alfresco.repo.action.executer.LinkCategoryActionExecuter;
 | 
			
		||||
import org.alfresco.repo.action.executer.MoveActionExecuter;
 | 
			
		||||
import org.alfresco.repo.action.executer.RemoveFeaturesActionExecuter;
 | 
			
		||||
import org.alfresco.repo.action.executer.ScriptActionExecuter;
 | 
			
		||||
import org.alfresco.repo.action.executer.SetPropertyValueActionExecuter;
 | 
			
		||||
import org.alfresco.repo.action.executer.SimpleWorkflowActionExecuter;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.service.cmr.action.ActionDefinition;
 | 
			
		||||
import org.alfresco.service.cmr.action.ActionService;
 | 
			
		||||
import org.alfresco.service.cmr.action.ParameterDefinition;
 | 
			
		||||
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
 | 
			
		||||
import org.alfresco.service.cmr.dictionary.DictionaryService;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeRef;
 | 
			
		||||
import org.alfresco.service.namespace.NamespaceService;
 | 
			
		||||
import org.alfresco.service.namespace.QName;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
import org.junit.runner.RunWith;
 | 
			
		||||
import org.mockito.InjectMocks;
 | 
			
		||||
import org.mockito.Mock;
 | 
			
		||||
import org.mockito.junit.MockitoJUnitRunner;
 | 
			
		||||
 | 
			
		||||
@Experimental
 | 
			
		||||
@RunWith(MockitoJUnitRunner.class)
 | 
			
		||||
public class ActionParameterConverterTest
 | 
			
		||||
{
 | 
			
		||||
    private static final String VERSIONABLE = "versionable";
 | 
			
		||||
    private static final String VERSIONABLE_ASPECT = NamespaceService.CONTENT_MODEL_PREFIX + QName.NAMESPACE_PREFIX + VERSIONABLE;
 | 
			
		||||
    private static final String CHECKOUT = "checkout";
 | 
			
		||||
    private static final String CHECKOUT_ASPECT = NamespaceService.CONTENT_MODEL_PREFIX + QName.NAMESPACE_PREFIX + CHECKOUT;
 | 
			
		||||
    private static final String CONTAINS = "contains";
 | 
			
		||||
    private static final String CONTAINS_ASPECT = NamespaceService.CONTENT_MODEL_PREFIX + QName.NAMESPACE_PREFIX + CONTAINS;
 | 
			
		||||
    private static final String CLASSIFIABLE = "generalclassifiable";
 | 
			
		||||
    private static final String CLASSIFIABLE_ASPECT = NamespaceService.CONTENT_MODEL_PREFIX + QName.NAMESPACE_PREFIX + CLASSIFIABLE;
 | 
			
		||||
    private static final String IDENTIFIER = "identifier";
 | 
			
		||||
    private static final String IDENTIFIER_ASPECT = NamespaceService.CONTENT_MODEL_PREFIX + QName.NAMESPACE_PREFIX + IDENTIFIER;
 | 
			
		||||
 | 
			
		||||
    private static final String DUMMY_FOLDER_NODE_ID = "dummy-folder-node";
 | 
			
		||||
    private static final String DUMMY_SCRIPT_NODE_ID = "dummy-script-ref";
 | 
			
		||||
 | 
			
		||||
    @Mock
 | 
			
		||||
    private DictionaryService dictionaryService;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private ActionService actionService;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private NamespaceService namespaceService;
 | 
			
		||||
 | 
			
		||||
    @Mock
 | 
			
		||||
    private ActionDefinition actionDefinition;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private ParameterDefinition actionDefinitionParam1;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private ParameterDefinition actionDefinitionParam2;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private ParameterDefinition actionDefinitionParam3;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private DataTypeDefinition dataTypeDefinition1;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private DataTypeDefinition dataTypeDefinition2;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private DataTypeDefinition dataTypeDefinition3;
 | 
			
		||||
 | 
			
		||||
    @InjectMocks
 | 
			
		||||
    private ActionParameterConverter objectUnderTest;
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testAddAspectConversion()
 | 
			
		||||
    {
 | 
			
		||||
        final String name = AddFeaturesActionExecuter.NAME;
 | 
			
		||||
        final String aspectNameKey = AddFeaturesActionExecuter.PARAM_ASPECT_NAME;
 | 
			
		||||
        final Map<String, Serializable> params = Map.of(aspectNameKey, VERSIONABLE_ASPECT);
 | 
			
		||||
 | 
			
		||||
        given(actionService.getActionDefinition(name)).willReturn(actionDefinition);
 | 
			
		||||
        given(actionDefinition.getParameterDefintion(aspectNameKey)).willReturn(actionDefinitionParam1);
 | 
			
		||||
        final QName qname = DataTypeDefinition.QNAME;
 | 
			
		||||
        given(actionDefinitionParam1.getType()).willReturn(qname);
 | 
			
		||||
        given(dictionaryService.getDataType(qname)).willReturn(dataTypeDefinition1);
 | 
			
		||||
        given(namespaceService.getNamespaceURI(any())).willReturn(NamespaceService.DICTIONARY_MODEL_1_0_URI);
 | 
			
		||||
 | 
			
		||||
        //when
 | 
			
		||||
        final Map<String, Serializable> convertedParams = objectUnderTest.getConvertedParams(params, name);
 | 
			
		||||
 | 
			
		||||
        then(actionService).should().getActionDefinition(name);
 | 
			
		||||
        then(actionService).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(actionDefinition).should().getParameterDefintion(aspectNameKey);
 | 
			
		||||
        then(actionDefinition).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(dictionaryService).should().getDataType(qname);
 | 
			
		||||
        then(dictionaryService).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(namespaceService).should().getNamespaceURI(any());
 | 
			
		||||
        then(namespaceService).shouldHaveNoMoreInteractions();
 | 
			
		||||
 | 
			
		||||
        final Serializable convertedParam = convertedParams.get(aspectNameKey);
 | 
			
		||||
        assertTrue(convertedParam instanceof QName);
 | 
			
		||||
        assertEquals(VERSIONABLE, ((QName) convertedParam).getLocalName());
 | 
			
		||||
        assertEquals(VERSIONABLE_ASPECT, ((QName) convertedParam).getPrefixString());
 | 
			
		||||
        assertEquals(NamespaceService.DICTIONARY_MODEL_1_0_URI, ((QName) convertedParam).getNamespaceURI());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testCopyConversion()
 | 
			
		||||
    {
 | 
			
		||||
        final String name = CopyActionExecuter.NAME;
 | 
			
		||||
        final String destinationFolderKey = CopyActionExecuter.PARAM_DESTINATION_FOLDER;
 | 
			
		||||
        final String deepCopyKey = CopyActionExecuter.PARAM_DEEP_COPY;
 | 
			
		||||
        final Map<String, Serializable> params = Map.of(destinationFolderKey, DUMMY_FOLDER_NODE_ID, deepCopyKey, true);
 | 
			
		||||
 | 
			
		||||
        given(actionService.getActionDefinition(name)).willReturn(actionDefinition);
 | 
			
		||||
        given(actionDefinition.getParameterDefintion(destinationFolderKey)).willReturn(actionDefinitionParam1);
 | 
			
		||||
        given(actionDefinition.getParameterDefintion(deepCopyKey)).willReturn(actionDefinitionParam2);
 | 
			
		||||
        final QName nodeRef = DataTypeDefinition.NODE_REF;
 | 
			
		||||
        given(actionDefinitionParam1.getType()).willReturn(nodeRef);
 | 
			
		||||
        final QName bool = DataTypeDefinition.BOOLEAN;
 | 
			
		||||
        given(actionDefinitionParam2.getType()).willReturn(bool);
 | 
			
		||||
 | 
			
		||||
        given(dictionaryService.getDataType(nodeRef)).willReturn(dataTypeDefinition1);
 | 
			
		||||
        given(dictionaryService.getDataType(bool)).willReturn(dataTypeDefinition2);
 | 
			
		||||
        given(dataTypeDefinition2.getJavaClassName()).willReturn(Boolean.class.getName());
 | 
			
		||||
 | 
			
		||||
        //when
 | 
			
		||||
        final Map<String, Serializable> convertedParams = objectUnderTest.getConvertedParams(params, name);
 | 
			
		||||
 | 
			
		||||
        then(actionService).should().getActionDefinition(name);
 | 
			
		||||
        then(actionService).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(actionDefinition).should().getParameterDefintion(destinationFolderKey);
 | 
			
		||||
        then(actionDefinition).should().getParameterDefintion(deepCopyKey);
 | 
			
		||||
        then(actionDefinition).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(dictionaryService).should(times(2)).getDataType(bool);
 | 
			
		||||
        then(dictionaryService).should().getDataType(nodeRef);
 | 
			
		||||
        then(dictionaryService).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(namespaceService).shouldHaveNoInteractions();
 | 
			
		||||
 | 
			
		||||
        final Serializable convertedCopyParam = convertedParams.get(destinationFolderKey);
 | 
			
		||||
        assertTrue(convertedCopyParam instanceof NodeRef);
 | 
			
		||||
        assertEquals(STORE_REF_WORKSPACE_SPACESSTORE, ((NodeRef) convertedCopyParam).getStoreRef());
 | 
			
		||||
        assertEquals(DUMMY_FOLDER_NODE_ID, ((NodeRef) convertedCopyParam).getId());
 | 
			
		||||
        final Serializable convertedDeepCopyParam = convertedParams.get(deepCopyKey);
 | 
			
		||||
        assertThat(convertedDeepCopyParam instanceof Boolean).isTrue();
 | 
			
		||||
        assertTrue(((Boolean) convertedDeepCopyParam));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testExecuteScriptConversion()
 | 
			
		||||
    {
 | 
			
		||||
        final String name = ScriptActionExecuter.NAME;
 | 
			
		||||
        final String executeScriptKey = ScriptActionExecuter.PARAM_SCRIPTREF;
 | 
			
		||||
        final Map<String, Serializable> params = Map.of(executeScriptKey, DUMMY_SCRIPT_NODE_ID);
 | 
			
		||||
 | 
			
		||||
        given(actionService.getActionDefinition(name)).willReturn(actionDefinition);
 | 
			
		||||
        given(actionDefinition.getParameterDefintion(executeScriptKey)).willReturn(actionDefinitionParam1);
 | 
			
		||||
        final QName scriptNodeRef = DataTypeDefinition.NODE_REF;
 | 
			
		||||
        given(actionDefinitionParam1.getType()).willReturn(scriptNodeRef);
 | 
			
		||||
 | 
			
		||||
        given(dictionaryService.getDataType(scriptNodeRef)).willReturn(dataTypeDefinition1);
 | 
			
		||||
 | 
			
		||||
        //when
 | 
			
		||||
        final Map<String, Serializable> convertedParams = objectUnderTest.getConvertedParams(params, name);
 | 
			
		||||
 | 
			
		||||
        then(actionService).should().getActionDefinition(name);
 | 
			
		||||
        then(actionService).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(actionDefinition).should().getParameterDefintion(executeScriptKey);
 | 
			
		||||
        then(actionDefinition).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(dictionaryService).should().getDataType(scriptNodeRef);
 | 
			
		||||
        then(dictionaryService).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(namespaceService).shouldHaveNoInteractions();
 | 
			
		||||
 | 
			
		||||
        final Serializable convertedCopyParam = convertedParams.get(executeScriptKey);
 | 
			
		||||
        assertTrue(convertedCopyParam instanceof NodeRef);
 | 
			
		||||
        assertEquals(STORE_REF_WORKSPACE_SPACESSTORE, ((NodeRef) convertedCopyParam).getStoreRef());
 | 
			
		||||
        assertEquals(DUMMY_SCRIPT_NODE_ID, ((NodeRef) convertedCopyParam).getId());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testMoveConversion()
 | 
			
		||||
    {
 | 
			
		||||
        final String name = MoveActionExecuter.NAME;
 | 
			
		||||
        final String destinationFolderKey = MoveActionExecuter.PARAM_DESTINATION_FOLDER;
 | 
			
		||||
        final Map<String, Serializable> params = Map.of(destinationFolderKey, DUMMY_FOLDER_NODE_ID);
 | 
			
		||||
 | 
			
		||||
        given(actionService.getActionDefinition(name)).willReturn(actionDefinition);
 | 
			
		||||
        given(actionDefinition.getParameterDefintion(destinationFolderKey)).willReturn(actionDefinitionParam1);
 | 
			
		||||
        final QName nodeRef = DataTypeDefinition.NODE_REF;
 | 
			
		||||
        given(actionDefinitionParam1.getType()).willReturn(nodeRef);
 | 
			
		||||
 | 
			
		||||
        given(dictionaryService.getDataType(nodeRef)).willReturn(dataTypeDefinition1);
 | 
			
		||||
 | 
			
		||||
        //when
 | 
			
		||||
        final Map<String, Serializable> convertedParams = objectUnderTest.getConvertedParams(params, name);
 | 
			
		||||
 | 
			
		||||
        then(actionService).should().getActionDefinition(name);
 | 
			
		||||
        then(actionService).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(actionDefinition).should().getParameterDefintion(destinationFolderKey);
 | 
			
		||||
        then(actionDefinition).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(dictionaryService).should().getDataType(nodeRef);
 | 
			
		||||
        then(dictionaryService).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(namespaceService).shouldHaveNoInteractions();
 | 
			
		||||
 | 
			
		||||
        final Serializable convertedCopyParam = convertedParams.get(destinationFolderKey);
 | 
			
		||||
        assertTrue(convertedCopyParam instanceof NodeRef);
 | 
			
		||||
        assertEquals(STORE_REF_WORKSPACE_SPACESSTORE, ((NodeRef) convertedCopyParam).getStoreRef());
 | 
			
		||||
        assertEquals(DUMMY_FOLDER_NODE_ID, ((NodeRef) convertedCopyParam).getId());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testCheckInConversion()
 | 
			
		||||
    {
 | 
			
		||||
        final String name = CheckInActionExecuter.NAME;
 | 
			
		||||
        final String descriptionKey = CheckInActionExecuter.PARAM_DESCRIPTION;
 | 
			
		||||
        final String minorChangeKey = CheckInActionExecuter.PARAM_MINOR_CHANGE;
 | 
			
		||||
        String description = "dummy description";
 | 
			
		||||
        final Map<String, Serializable> params = Map.of(descriptionKey, description, minorChangeKey, true);
 | 
			
		||||
 | 
			
		||||
        given(actionService.getActionDefinition(name)).willReturn(actionDefinition);
 | 
			
		||||
        given(actionDefinition.getParameterDefintion(descriptionKey)).willReturn(actionDefinitionParam1);
 | 
			
		||||
        given(actionDefinition.getParameterDefintion(minorChangeKey)).willReturn(actionDefinitionParam2);
 | 
			
		||||
        final QName text = DataTypeDefinition.TEXT;
 | 
			
		||||
        given(actionDefinitionParam1.getType()).willReturn(text);
 | 
			
		||||
        final QName bool = DataTypeDefinition.BOOLEAN;
 | 
			
		||||
        given(actionDefinitionParam2.getType()).willReturn(bool);
 | 
			
		||||
 | 
			
		||||
        given(dictionaryService.getDataType(text)).willReturn(dataTypeDefinition1);
 | 
			
		||||
        given(dataTypeDefinition1.getJavaClassName()).willReturn(String.class.getName());
 | 
			
		||||
        given(dictionaryService.getDataType(bool)).willReturn(dataTypeDefinition2);
 | 
			
		||||
        given(dataTypeDefinition2.getJavaClassName()).willReturn(Boolean.class.getName());
 | 
			
		||||
 | 
			
		||||
        //when
 | 
			
		||||
        final Map<String, Serializable> convertedParams = objectUnderTest.getConvertedParams(params, name);
 | 
			
		||||
 | 
			
		||||
        then(actionService).should().getActionDefinition(name);
 | 
			
		||||
        then(actionService).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(actionDefinition).should().getParameterDefintion(descriptionKey);
 | 
			
		||||
        then(actionDefinition).should().getParameterDefintion(minorChangeKey);
 | 
			
		||||
        then(actionDefinition).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(dictionaryService).should(times(2)).getDataType(bool);
 | 
			
		||||
        then(dictionaryService).should(times(2)).getDataType(text);
 | 
			
		||||
        then(dictionaryService).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(namespaceService).shouldHaveNoInteractions();
 | 
			
		||||
 | 
			
		||||
        final Serializable convertedDescriptionParam = convertedParams.get(descriptionKey);
 | 
			
		||||
        assertTrue(convertedDescriptionParam instanceof String);
 | 
			
		||||
        assertEquals(description, convertedDescriptionParam);
 | 
			
		||||
        final Serializable convertedMinorChangeParam = convertedParams.get(minorChangeKey);
 | 
			
		||||
        assertTrue(convertedMinorChangeParam instanceof Boolean);
 | 
			
		||||
        assertTrue((Boolean) convertedMinorChangeParam);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testCheckOutConversion()
 | 
			
		||||
    {
 | 
			
		||||
        final String name = CheckOutActionExecuter.NAME;
 | 
			
		||||
        final String destinationFolderKey = CheckOutActionExecuter.PARAM_DESTINATION_FOLDER;
 | 
			
		||||
        final String assocNameKey = CheckOutActionExecuter.PARAM_ASSOC_QNAME;
 | 
			
		||||
        final String assocTypeKey = CheckOutActionExecuter.PARAM_ASSOC_TYPE_QNAME;
 | 
			
		||||
        final Map<String, Serializable> params =
 | 
			
		||||
                Map.of(destinationFolderKey, DUMMY_FOLDER_NODE_ID, assocNameKey, CHECKOUT_ASPECT, assocTypeKey, CONTAINS_ASPECT);
 | 
			
		||||
 | 
			
		||||
        given(actionService.getActionDefinition(name)).willReturn(actionDefinition);
 | 
			
		||||
        given(actionDefinition.getParameterDefintion(destinationFolderKey)).willReturn(actionDefinitionParam1);
 | 
			
		||||
        final QName nodeRef = DataTypeDefinition.NODE_REF;
 | 
			
		||||
        given(actionDefinitionParam1.getType()).willReturn(nodeRef);
 | 
			
		||||
        given(actionDefinition.getParameterDefintion(assocNameKey)).willReturn(actionDefinitionParam2);
 | 
			
		||||
        final QName qname = DataTypeDefinition.QNAME;
 | 
			
		||||
        given(actionDefinitionParam2.getType()).willReturn(qname);
 | 
			
		||||
        given(actionDefinition.getParameterDefintion(assocTypeKey)).willReturn(actionDefinitionParam3);
 | 
			
		||||
        given(actionDefinitionParam3.getType()).willReturn(qname);
 | 
			
		||||
 | 
			
		||||
        given(dictionaryService.getDataType(nodeRef)).willReturn(dataTypeDefinition1);
 | 
			
		||||
        given(dictionaryService.getDataType(qname)).willReturn(dataTypeDefinition2);
 | 
			
		||||
        given(namespaceService.getNamespaceURI(any())).willReturn(NamespaceService.DICTIONARY_MODEL_1_0_URI);
 | 
			
		||||
 | 
			
		||||
        //when
 | 
			
		||||
        final Map<String, Serializable> convertedParams = objectUnderTest.getConvertedParams(params, name);
 | 
			
		||||
 | 
			
		||||
        then(actionService).should().getActionDefinition(name);
 | 
			
		||||
        then(actionService).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(actionDefinition).should().getParameterDefintion(destinationFolderKey);
 | 
			
		||||
        then(actionDefinition).should().getParameterDefintion(assocNameKey);
 | 
			
		||||
        then(actionDefinition).should().getParameterDefintion(assocTypeKey);
 | 
			
		||||
        then(actionDefinition).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(dictionaryService).should(times(2)).getDataType(qname);
 | 
			
		||||
        then(dictionaryService).should().getDataType(nodeRef);
 | 
			
		||||
        then(dictionaryService).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(namespaceService).should(times(2)).getNamespaceURI(any());
 | 
			
		||||
        then(namespaceService).shouldHaveNoMoreInteractions();
 | 
			
		||||
 | 
			
		||||
        final Serializable convertedDestinationParam = convertedParams.get(destinationFolderKey);
 | 
			
		||||
        assertTrue(convertedDestinationParam instanceof NodeRef);
 | 
			
		||||
        assertEquals(STORE_REF_WORKSPACE_SPACESSTORE, ((NodeRef) convertedDestinationParam).getStoreRef());
 | 
			
		||||
        assertEquals(DUMMY_FOLDER_NODE_ID, ((NodeRef) convertedDestinationParam).getId());
 | 
			
		||||
        final Serializable convertedAssocNameParam = convertedParams.get(assocNameKey);
 | 
			
		||||
        assertTrue(convertedAssocNameParam instanceof QName);
 | 
			
		||||
        assertEquals(CHECKOUT, ((QName) convertedAssocNameParam).getLocalName());
 | 
			
		||||
        assertEquals(CHECKOUT_ASPECT, ((QName) convertedAssocNameParam).getPrefixString());
 | 
			
		||||
        assertEquals(NamespaceService.DICTIONARY_MODEL_1_0_URI, ((QName) convertedAssocNameParam).getNamespaceURI());
 | 
			
		||||
        final Serializable convertedAssocTypeParam = convertedParams.get(assocTypeKey);
 | 
			
		||||
        assertTrue(convertedAssocTypeParam instanceof QName);
 | 
			
		||||
        assertEquals(CONTAINS, ((QName) convertedAssocTypeParam).getLocalName());
 | 
			
		||||
        assertEquals(CONTAINS_ASPECT, ((QName) convertedAssocTypeParam).getPrefixString());
 | 
			
		||||
        assertEquals(NamespaceService.DICTIONARY_MODEL_1_0_URI, ((QName) convertedAssocTypeParam).getNamespaceURI());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testCategoryLinkConversion()
 | 
			
		||||
    {
 | 
			
		||||
        final String name = LinkCategoryActionExecuter.NAME;
 | 
			
		||||
        final String categoryAspectKey = LinkCategoryActionExecuter.PARAM_CATEGORY_ASPECT;
 | 
			
		||||
        final String categoryValueKey = LinkCategoryActionExecuter.PARAM_CATEGORY_VALUE;
 | 
			
		||||
        final Map<String, Serializable> params = Map.of(categoryAspectKey, CLASSIFIABLE_ASPECT, categoryValueKey, DUMMY_FOLDER_NODE_ID);
 | 
			
		||||
 | 
			
		||||
        given(actionService.getActionDefinition(name)).willReturn(actionDefinition);
 | 
			
		||||
        given(actionDefinition.getParameterDefintion(categoryAspectKey)).willReturn(actionDefinitionParam1);
 | 
			
		||||
        final QName qname = DataTypeDefinition.QNAME;
 | 
			
		||||
        given(actionDefinitionParam1.getType()).willReturn(qname);
 | 
			
		||||
        given(actionDefinition.getParameterDefintion(categoryValueKey)).willReturn(actionDefinitionParam2);
 | 
			
		||||
        final QName nodeRef = DataTypeDefinition.NODE_REF;
 | 
			
		||||
        given(actionDefinitionParam2.getType()).willReturn(nodeRef);
 | 
			
		||||
 | 
			
		||||
        given(dictionaryService.getDataType(nodeRef)).willReturn(dataTypeDefinition1);
 | 
			
		||||
        given(dictionaryService.getDataType(qname)).willReturn(dataTypeDefinition2);
 | 
			
		||||
        given(namespaceService.getNamespaceURI(any())).willReturn(NamespaceService.DICTIONARY_MODEL_1_0_URI);
 | 
			
		||||
 | 
			
		||||
        //when
 | 
			
		||||
        final Map<String, Serializable> convertedParams = objectUnderTest.getConvertedParams(params, name);
 | 
			
		||||
 | 
			
		||||
        then(actionService).should().getActionDefinition(name);
 | 
			
		||||
        then(actionService).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(actionDefinition).should().getParameterDefintion(categoryAspectKey);
 | 
			
		||||
        then(actionDefinition).should().getParameterDefintion(categoryValueKey);
 | 
			
		||||
        then(actionDefinition).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(dictionaryService).should().getDataType(qname);
 | 
			
		||||
        then(dictionaryService).should().getDataType(nodeRef);
 | 
			
		||||
        then(dictionaryService).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(namespaceService).should().getNamespaceURI(any());
 | 
			
		||||
        then(namespaceService).shouldHaveNoMoreInteractions();
 | 
			
		||||
 | 
			
		||||
        final Serializable convertedCatValueParam = convertedParams.get(categoryAspectKey);
 | 
			
		||||
        assertTrue(convertedCatValueParam instanceof QName);
 | 
			
		||||
        assertEquals(CLASSIFIABLE, ((QName) convertedCatValueParam).getLocalName());
 | 
			
		||||
        assertEquals(CLASSIFIABLE_ASPECT, ((QName) convertedCatValueParam).getPrefixString());
 | 
			
		||||
        assertEquals(NamespaceService.DICTIONARY_MODEL_1_0_URI, ((QName) convertedCatValueParam).getNamespaceURI());
 | 
			
		||||
        final Serializable convertedDestinationParam = convertedParams.get(categoryValueKey);
 | 
			
		||||
        assertTrue(convertedDestinationParam instanceof NodeRef);
 | 
			
		||||
        assertEquals(STORE_REF_WORKSPACE_SPACESSTORE, ((NodeRef) convertedDestinationParam).getStoreRef());
 | 
			
		||||
        assertEquals(DUMMY_FOLDER_NODE_ID, ((NodeRef) convertedDestinationParam).getId());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testRemoveAspectConversion()
 | 
			
		||||
    {
 | 
			
		||||
        final String name = RemoveFeaturesActionExecuter.NAME;
 | 
			
		||||
        final String aspectNameKey = RemoveFeaturesActionExecuter.PARAM_ASPECT_NAME;
 | 
			
		||||
        final Map<String, Serializable> params = Map.of(aspectNameKey, VERSIONABLE_ASPECT);
 | 
			
		||||
 | 
			
		||||
        given(actionService.getActionDefinition(name)).willReturn(actionDefinition);
 | 
			
		||||
        given(actionDefinition.getParameterDefintion(aspectNameKey)).willReturn(actionDefinitionParam1);
 | 
			
		||||
        final QName qname = DataTypeDefinition.QNAME;
 | 
			
		||||
        given(actionDefinitionParam1.getType()).willReturn(qname);
 | 
			
		||||
        given(dictionaryService.getDataType(qname)).willReturn(dataTypeDefinition1);
 | 
			
		||||
        given(namespaceService.getNamespaceURI(any())).willReturn(NamespaceService.DICTIONARY_MODEL_1_0_URI);
 | 
			
		||||
 | 
			
		||||
        //when
 | 
			
		||||
        final Map<String, Serializable> convertedParams = objectUnderTest.getConvertedParams(params, name);
 | 
			
		||||
 | 
			
		||||
        then(actionService).should().getActionDefinition(name);
 | 
			
		||||
        then(actionService).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(actionDefinition).should().getParameterDefintion(aspectNameKey);
 | 
			
		||||
        then(actionDefinition).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(dictionaryService).should().getDataType(qname);
 | 
			
		||||
        then(dictionaryService).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(namespaceService).should().getNamespaceURI(any());
 | 
			
		||||
        then(namespaceService).shouldHaveNoMoreInteractions();
 | 
			
		||||
 | 
			
		||||
        final Serializable convertedParam = convertedParams.get(aspectNameKey);
 | 
			
		||||
        assertTrue(convertedParam instanceof QName);
 | 
			
		||||
        assertEquals(VERSIONABLE, ((QName) convertedParam).getLocalName());
 | 
			
		||||
        assertEquals(VERSIONABLE_ASPECT, ((QName) convertedParam).getPrefixString());
 | 
			
		||||
        assertEquals(NamespaceService.DICTIONARY_MODEL_1_0_URI, ((QName) convertedParam).getNamespaceURI());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testAddWorkflowConversion()
 | 
			
		||||
    {
 | 
			
		||||
        final String name = SimpleWorkflowActionExecuter.NAME;
 | 
			
		||||
        final String approveStepKey = SimpleWorkflowActionExecuter.PARAM_APPROVE_STEP;
 | 
			
		||||
        final String approveFolderKey = SimpleWorkflowActionExecuter.PARAM_APPROVE_FOLDER;
 | 
			
		||||
        final String approveMoveKey = SimpleWorkflowActionExecuter.PARAM_APPROVE_MOVE;
 | 
			
		||||
        final String rejectStepKey = SimpleWorkflowActionExecuter.PARAM_REJECT_STEP;
 | 
			
		||||
        final String rejectFolderKey = SimpleWorkflowActionExecuter.PARAM_REJECT_FOLDER;
 | 
			
		||||
        final String rejectMoveKey = SimpleWorkflowActionExecuter.PARAM_REJECT_MOVE;
 | 
			
		||||
        final String approve = "Approve";
 | 
			
		||||
        final String reject = "Reject";
 | 
			
		||||
        final Map<String, Serializable> params =
 | 
			
		||||
                Map.of(approveStepKey, approve, approveFolderKey, DUMMY_FOLDER_NODE_ID, approveMoveKey, true,
 | 
			
		||||
                        rejectStepKey, reject, rejectFolderKey, DUMMY_FOLDER_NODE_ID, rejectMoveKey, true);
 | 
			
		||||
 | 
			
		||||
        given(actionService.getActionDefinition(name)).willReturn(actionDefinition);
 | 
			
		||||
        given(actionDefinition.getParameterDefintion(rejectStepKey)).willReturn(actionDefinitionParam1);
 | 
			
		||||
        given(actionDefinition.getParameterDefintion(approveStepKey)).willReturn(actionDefinitionParam1);
 | 
			
		||||
        final QName text = DataTypeDefinition.TEXT;
 | 
			
		||||
        given(actionDefinitionParam1.getType()).willReturn(text, text);
 | 
			
		||||
        given(actionDefinition.getParameterDefintion(rejectFolderKey)).willReturn(actionDefinitionParam2);
 | 
			
		||||
        given(actionDefinition.getParameterDefintion(approveFolderKey)).willReturn(actionDefinitionParam2);
 | 
			
		||||
        final QName nodeRef = DataTypeDefinition.NODE_REF;
 | 
			
		||||
        given(actionDefinitionParam2.getType()).willReturn(nodeRef, nodeRef);
 | 
			
		||||
        given(actionDefinition.getParameterDefintion(rejectMoveKey)).willReturn(actionDefinitionParam3);
 | 
			
		||||
        given(actionDefinition.getParameterDefintion(approveMoveKey)).willReturn(actionDefinitionParam3);
 | 
			
		||||
        final QName bool = DataTypeDefinition.BOOLEAN;
 | 
			
		||||
        given(actionDefinitionParam3.getType()).willReturn(bool, bool);
 | 
			
		||||
 | 
			
		||||
        given(dictionaryService.getDataType(nodeRef)).willReturn(dataTypeDefinition1);
 | 
			
		||||
        given(dictionaryService.getDataType(text)).willReturn(dataTypeDefinition2);
 | 
			
		||||
        given(dataTypeDefinition2.getJavaClassName()).willReturn(String.class.getName());
 | 
			
		||||
        given(dictionaryService.getDataType(bool)).willReturn(dataTypeDefinition3);
 | 
			
		||||
        given(dataTypeDefinition3.getJavaClassName()).willReturn(Boolean.class.getName());
 | 
			
		||||
 | 
			
		||||
        //when
 | 
			
		||||
        final Map<String, Serializable> convertedParams = objectUnderTest.getConvertedParams(params, name);
 | 
			
		||||
 | 
			
		||||
        then(actionService).should().getActionDefinition(name);
 | 
			
		||||
        then(actionService).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(actionDefinition).should().getParameterDefintion(approveStepKey);
 | 
			
		||||
        then(actionDefinition).should().getParameterDefintion(approveFolderKey);
 | 
			
		||||
        then(actionDefinition).should().getParameterDefintion(approveMoveKey);
 | 
			
		||||
        then(actionDefinition).should().getParameterDefintion(rejectStepKey);
 | 
			
		||||
        then(actionDefinition).should().getParameterDefintion(rejectFolderKey);
 | 
			
		||||
        then(actionDefinition).should().getParameterDefintion(rejectMoveKey);
 | 
			
		||||
        then(actionDefinition).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(dictionaryService).should(times(4)).getDataType(text);
 | 
			
		||||
        then(dictionaryService).should(times(2)).getDataType(nodeRef);
 | 
			
		||||
        then(dictionaryService).should(times(4)).getDataType(bool);
 | 
			
		||||
        then(dictionaryService).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(namespaceService).shouldHaveNoInteractions();
 | 
			
		||||
 | 
			
		||||
        final Serializable convertedApproveStepParam = convertedParams.get(approveStepKey);
 | 
			
		||||
        assertTrue(convertedApproveStepParam instanceof String);
 | 
			
		||||
        assertEquals(approve, convertedApproveStepParam);
 | 
			
		||||
        final Serializable convertedRejectStepParam = convertedParams.get(rejectStepKey);
 | 
			
		||||
        assertTrue(convertedRejectStepParam instanceof String);
 | 
			
		||||
        assertEquals(reject, convertedRejectStepParam);
 | 
			
		||||
        final Serializable convertedApproveFolderParam = convertedParams.get(approveFolderKey);
 | 
			
		||||
        assertTrue(convertedApproveFolderParam instanceof NodeRef);
 | 
			
		||||
        assertEquals(STORE_REF_WORKSPACE_SPACESSTORE, ((NodeRef) convertedApproveFolderParam).getStoreRef());
 | 
			
		||||
        assertEquals(DUMMY_FOLDER_NODE_ID, ((NodeRef) convertedApproveFolderParam).getId());
 | 
			
		||||
        final Serializable convertedRejectFolderParam = convertedParams.get(rejectFolderKey);
 | 
			
		||||
        assertTrue(convertedRejectFolderParam instanceof NodeRef);
 | 
			
		||||
        assertEquals(STORE_REF_WORKSPACE_SPACESSTORE, ((NodeRef) convertedRejectFolderParam).getStoreRef());
 | 
			
		||||
        assertEquals(DUMMY_FOLDER_NODE_ID, ((NodeRef) convertedRejectFolderParam).getId());
 | 
			
		||||
        final Serializable convertedApproveMoveParam = convertedParams.get(approveMoveKey);
 | 
			
		||||
        assertTrue(convertedApproveMoveParam instanceof Boolean);
 | 
			
		||||
        assertTrue((Boolean) convertedApproveMoveParam);
 | 
			
		||||
        final Serializable convertedRejectMoveParam = convertedParams.get(rejectMoveKey);
 | 
			
		||||
        assertTrue(convertedRejectMoveParam instanceof Boolean);
 | 
			
		||||
        assertTrue((Boolean) convertedRejectMoveParam);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testSetPropertyConversion()
 | 
			
		||||
    {
 | 
			
		||||
        final String name = SetPropertyValueActionExecuter.NAME;
 | 
			
		||||
        final String propertyNameKey = SetPropertyValueActionExecuter.PARAM_PROPERTY;
 | 
			
		||||
        final String propertyValueKey = SetPropertyValueActionExecuter.PARAM_VALUE;
 | 
			
		||||
        final String propertyTypeKey = "prop_type";
 | 
			
		||||
        final String dummy_key_value = "dummy_key_value";
 | 
			
		||||
        final String propType = "d:text";
 | 
			
		||||
        final Map<String, Serializable> params =
 | 
			
		||||
                Map.of(propertyNameKey, IDENTIFIER_ASPECT, propertyValueKey, dummy_key_value, propertyTypeKey, propType);
 | 
			
		||||
 | 
			
		||||
        given(actionService.getActionDefinition(name)).willReturn(actionDefinition);
 | 
			
		||||
        given(actionDefinition.getParameterDefintion(propertyNameKey)).willReturn(actionDefinitionParam1);
 | 
			
		||||
        final QName qname = DataTypeDefinition.QNAME;
 | 
			
		||||
        given(actionDefinitionParam1.getType()).willReturn(qname);
 | 
			
		||||
        given(actionDefinition.getParameterDefintion(propertyValueKey)).willReturn(actionDefinitionParam2);
 | 
			
		||||
        final QName any = DataTypeDefinition.ANY;
 | 
			
		||||
        given(actionDefinitionParam2.getType()).willReturn(any);
 | 
			
		||||
        given(actionDefinition.getParameterDefintion(propertyTypeKey)).willReturn(null);
 | 
			
		||||
        given(actionDefinition.getAdhocPropertiesAllowed()).willReturn(true);
 | 
			
		||||
 | 
			
		||||
        given(dictionaryService.getDataType(qname)).willReturn(dataTypeDefinition1);
 | 
			
		||||
        given(dictionaryService.getDataType(any)).willReturn(dataTypeDefinition2);
 | 
			
		||||
        given(dataTypeDefinition2.getJavaClassName()).willReturn(Object.class.getName());
 | 
			
		||||
        given(namespaceService.getNamespaceURI(any())).willReturn(NamespaceService.DICTIONARY_MODEL_1_0_URI);
 | 
			
		||||
 | 
			
		||||
        //when
 | 
			
		||||
        final Map<String, Serializable> convertedParams = objectUnderTest.getConvertedParams(params, name);
 | 
			
		||||
 | 
			
		||||
        then(actionService).should().getActionDefinition(name);
 | 
			
		||||
        then(actionService).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(actionDefinition).should().getParameterDefintion(propertyNameKey);
 | 
			
		||||
        then(actionDefinition).should().getParameterDefintion(propertyValueKey);
 | 
			
		||||
        then(actionDefinition).should().getParameterDefintion(propertyTypeKey);
 | 
			
		||||
        then(actionDefinition).should().getAdhocPropertiesAllowed();
 | 
			
		||||
        then(actionDefinition).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(dictionaryService).should().getDataType(qname);
 | 
			
		||||
        then(dictionaryService).should(times(2)).getDataType(any);
 | 
			
		||||
        then(dictionaryService).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(namespaceService).should().getNamespaceURI(any());
 | 
			
		||||
        then(namespaceService).shouldHaveNoMoreInteractions();
 | 
			
		||||
 | 
			
		||||
        final Serializable convertedPropNameParam = convertedParams.get(propertyNameKey);
 | 
			
		||||
        assertTrue(convertedPropNameParam instanceof QName);
 | 
			
		||||
        assertEquals(IDENTIFIER, ((QName) convertedPropNameParam).getLocalName());
 | 
			
		||||
        assertEquals(IDENTIFIER_ASPECT, ((QName) convertedPropNameParam).getPrefixString());
 | 
			
		||||
        assertEquals(NamespaceService.DICTIONARY_MODEL_1_0_URI, ((QName) convertedPropNameParam).getNamespaceURI());
 | 
			
		||||
 | 
			
		||||
        final Serializable convertedPropValParam = convertedParams.get(propertyValueKey);
 | 
			
		||||
        assertTrue(convertedPropValParam instanceof String);
 | 
			
		||||
        assertEquals(dummy_key_value, convertedPropValParam);
 | 
			
		||||
        final Serializable convertedPropTypeParam = convertedParams.get(propertyTypeKey);
 | 
			
		||||
        assertTrue(convertedPropTypeParam instanceof String);
 | 
			
		||||
        assertEquals(propType, convertedPropTypeParam);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testQnameServiceModelParamConversion() {
 | 
			
		||||
        given(namespaceService.getPrefixes(any())).willReturn(List.of("cm"));
 | 
			
		||||
        final String qname = "{cm-dummy-prefix}audio";
 | 
			
		||||
        final Serializable qnameParam = QName.createQName(qname);
 | 
			
		||||
 | 
			
		||||
        //when
 | 
			
		||||
        final Serializable convertedParam = objectUnderTest.convertParamFromServiceModel(qnameParam);
 | 
			
		||||
 | 
			
		||||
        then(namespaceService).should().getPrefixes(any());
 | 
			
		||||
        then(namespaceService).shouldHaveNoMoreInteractions();
 | 
			
		||||
        assertEquals("cm:audio", convertedParam);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testNodeRefServiceModelParamConversion() {
 | 
			
		||||
        //given
 | 
			
		||||
        final Serializable nodeRefParam = new NodeRef(STORE_REF_WORKSPACE_SPACESSTORE, DUMMY_FOLDER_NODE_ID);
 | 
			
		||||
 | 
			
		||||
        //when
 | 
			
		||||
        final Serializable convertedParam = objectUnderTest.convertParamFromServiceModel(nodeRefParam);
 | 
			
		||||
 | 
			
		||||
        then(namespaceService).shouldHaveNoInteractions();
 | 
			
		||||
        assertEquals(DUMMY_FOLDER_NODE_ID, convertedParam);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testOtherServiceModelParamConversion() {
 | 
			
		||||
        //given
 | 
			
		||||
        final Serializable dummyStringParam = "dummy-param";
 | 
			
		||||
        //when
 | 
			
		||||
        final Serializable convertedParam = objectUnderTest.convertParamFromServiceModel(dummyStringParam);
 | 
			
		||||
 | 
			
		||||
        then(namespaceService).shouldHaveNoInteractions();
 | 
			
		||||
        assertEquals(dummyStringParam, convertedParam);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,117 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.api.impl.rules;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.service.cmr.rule.RuleType.INBOUND;
 | 
			
		||||
import static org.alfresco.service.cmr.rule.RuleType.OUTBOUND;
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
 | 
			
		||||
import static org.mockito.BDDMockito.then;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import junit.framework.TestCase;
 | 
			
		||||
import org.alfresco.repo.action.ActionImpl;
 | 
			
		||||
import org.alfresco.repo.action.CompositeActionImpl;
 | 
			
		||||
import org.alfresco.repo.action.RuntimeActionService;
 | 
			
		||||
import org.alfresco.repo.action.executer.CheckOutActionExecuter;
 | 
			
		||||
import org.alfresco.repo.action.executer.CopyActionExecuter;
 | 
			
		||||
import org.alfresco.rest.framework.core.exceptions.InvalidArgumentException;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.service.cmr.action.Action;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeRef;
 | 
			
		||||
import org.alfresco.service.cmr.repository.StoreRef;
 | 
			
		||||
import org.alfresco.service.cmr.rule.Rule;
 | 
			
		||||
import org.assertj.core.api.Assertions;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
import org.junit.runner.RunWith;
 | 
			
		||||
import org.mockito.InjectMocks;
 | 
			
		||||
import org.mockito.Mock;
 | 
			
		||||
import org.mockito.junit.MockitoJUnitRunner;
 | 
			
		||||
 | 
			
		||||
@Experimental
 | 
			
		||||
@RunWith(MockitoJUnitRunner.class)
 | 
			
		||||
public class ActionPermissionValidatorTest extends TestCase
 | 
			
		||||
{
 | 
			
		||||
    private static final String DUMMY_NODE_ID = "dummy-node-id";
 | 
			
		||||
    @Mock
 | 
			
		||||
    private RuntimeActionService runtimeActionService;
 | 
			
		||||
 | 
			
		||||
    @InjectMocks
 | 
			
		||||
    private ActionPermissionValidator objectUnderTest;
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testPositiveRulePermissionValidation()
 | 
			
		||||
    {
 | 
			
		||||
        //given
 | 
			
		||||
        final CompositeActionImpl compositeAction =
 | 
			
		||||
                new CompositeActionImpl(new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, DUMMY_NODE_ID), "composite-id");
 | 
			
		||||
        final Action action1 = new ActionImpl(new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, DUMMY_NODE_ID), "id-1",
 | 
			
		||||
                CopyActionExecuter.NAME);
 | 
			
		||||
        compositeAction.addAction(action1);
 | 
			
		||||
        final Action action2 = new ActionImpl(new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, DUMMY_NODE_ID), "id-2",
 | 
			
		||||
                CheckOutActionExecuter.NAME);
 | 
			
		||||
        compositeAction.addAction(action2);
 | 
			
		||||
        final Rule inputRule = new Rule();
 | 
			
		||||
        inputRule.setAction(compositeAction);
 | 
			
		||||
        inputRule.setRuleTypes(List.of(INBOUND));
 | 
			
		||||
 | 
			
		||||
        //when
 | 
			
		||||
        final Rule validatedRule = objectUnderTest.validateRulePermissions(inputRule);
 | 
			
		||||
 | 
			
		||||
        then(runtimeActionService).should().verifyActionAccessRestrictions(action1);
 | 
			
		||||
        then(runtimeActionService).should().verifyActionAccessRestrictions(action2);
 | 
			
		||||
        then(runtimeActionService).shouldHaveNoMoreInteractions();
 | 
			
		||||
 | 
			
		||||
        ((CompositeActionImpl) validatedRule.getAction()).getActions()
 | 
			
		||||
                .forEach(action -> Assertions.assertThat(action.getParameterValue("actionContext")).isEqualTo("rule"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testNegativeRulePermissionValidation()
 | 
			
		||||
    {
 | 
			
		||||
        //given
 | 
			
		||||
        final CompositeActionImpl compositeAction =
 | 
			
		||||
                new CompositeActionImpl(new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, DUMMY_NODE_ID), "composite-id");
 | 
			
		||||
        final Action action1 = new ActionImpl(new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, DUMMY_NODE_ID), "id-1",
 | 
			
		||||
                CopyActionExecuter.NAME);
 | 
			
		||||
        compositeAction.addAction(action1);
 | 
			
		||||
        final Action action2 = new ActionImpl(new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, DUMMY_NODE_ID), "id-2",
 | 
			
		||||
                CheckOutActionExecuter.NAME);
 | 
			
		||||
        compositeAction.addAction(action2);
 | 
			
		||||
        final Rule inputRule = new Rule();
 | 
			
		||||
        inputRule.setAction(compositeAction);
 | 
			
		||||
        inputRule.setRuleTypes(List.of(OUTBOUND));
 | 
			
		||||
 | 
			
		||||
        //when
 | 
			
		||||
        assertThatExceptionOfType(InvalidArgumentException.class).isThrownBy(() -> objectUnderTest.validateRulePermissions(inputRule));
 | 
			
		||||
 | 
			
		||||
        then(runtimeActionService).should().verifyActionAccessRestrictions(action1);
 | 
			
		||||
        then(runtimeActionService).should().verifyActionAccessRestrictions(action2);
 | 
			
		||||
        then(runtimeActionService).shouldHaveNoMoreInteractions();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -39,24 +39,18 @@ import static org.mockito.ArgumentMatchers.any;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.eq;
 | 
			
		||||
import static org.mockito.BDDMockito.given;
 | 
			
		||||
import static org.mockito.BDDMockito.then;
 | 
			
		||||
import static org.mockito.Mockito.reset;
 | 
			
		||||
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.model.ContentModel;
 | 
			
		||||
import org.alfresco.rest.api.Nodes;
 | 
			
		||||
import org.alfresco.rest.api.model.Node;
 | 
			
		||||
import org.alfresco.rest.framework.core.exceptions.EntityNotFoundException;
 | 
			
		||||
import org.alfresco.rest.framework.core.exceptions.InvalidArgumentException;
 | 
			
		||||
import org.alfresco.rest.framework.core.exceptions.PermissionDeniedException;
 | 
			
		||||
import org.alfresco.rest.framework.core.exceptions.RelationshipResourceNotFoundException;
 | 
			
		||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeRef;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeService;
 | 
			
		||||
import org.alfresco.service.cmr.repository.StoreRef;
 | 
			
		||||
import org.alfresco.service.cmr.rule.RuleService;
 | 
			
		||||
import org.alfresco.service.cmr.security.PermissionService;
 | 
			
		||||
import org.junit.Assert;
 | 
			
		||||
import org.junit.Before;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
import org.mockito.InjectMocks;
 | 
			
		||||
@@ -67,33 +61,21 @@ public class NodeValidatorTest
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    private static final String FOLDER_NODE_ID = "dummy-folder-node-id";
 | 
			
		||||
    private static final String LINK_TO_NODE_ID = "dummy-link-to-node-id";
 | 
			
		||||
    private static final String RULE_SET_ID = "dummy-rule-set-id";
 | 
			
		||||
    private static final String RULE_ID = "dummy-rule-id";
 | 
			
		||||
    private static final String PARENT_NODE_ID = "dummy-parent-node-id";
 | 
			
		||||
    private static final NodeRef folderNodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, FOLDER_NODE_ID);
 | 
			
		||||
    private static final NodeRef ruleSetNodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, RULE_SET_ID);
 | 
			
		||||
    private static final NodeRef ruleNodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, RULE_ID);
 | 
			
		||||
    private static final NodeRef parentNodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, PARENT_NODE_ID);
 | 
			
		||||
 | 
			
		||||
    @Mock
 | 
			
		||||
    private Nodes nodesMock;
 | 
			
		||||
 | 
			
		||||
    @Mock
 | 
			
		||||
    private Node ruleSetNodeMock;
 | 
			
		||||
 | 
			
		||||
    @Mock
 | 
			
		||||
    private PermissionService permissionServiceMock;
 | 
			
		||||
 | 
			
		||||
    @Mock
 | 
			
		||||
    private RuleService ruleServiceMock;
 | 
			
		||||
 | 
			
		||||
    @Mock
 | 
			
		||||
    private NodeService nodeServiceMock;
 | 
			
		||||
 | 
			
		||||
    @Mock
 | 
			
		||||
    private ChildAssociationRef primaryParentMock;
 | 
			
		||||
 | 
			
		||||
    @InjectMocks
 | 
			
		||||
    private NodeValidator nodeValidator;
 | 
			
		||||
 | 
			
		||||
@@ -200,20 +182,6 @@ public class NodeValidatorTest
 | 
			
		||||
        assertThat(nodeRef).isNotNull().isEqualTo(ruleSetNodeRef);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testValidateRuleSetNodeNoParentId()
 | 
			
		||||
    {
 | 
			
		||||
        given(nodesMock.getNode(any())).willReturn(ruleSetNodeMock);
 | 
			
		||||
        given(nodeServiceMock.getPrimaryParent(any())).willReturn(primaryParentMock);
 | 
			
		||||
        given(primaryParentMock.getParentRef()).willReturn(parentNodeRef);
 | 
			
		||||
 | 
			
		||||
        //when
 | 
			
		||||
        final NodeRef nodeRef = nodeValidator.validateRuleSetNode(LINK_TO_NODE_ID,true);
 | 
			
		||||
 | 
			
		||||
        assertThat(nodeRef).isNotNull().isEqualTo(parentNodeRef);
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void validateRuleSetNode_defaultId()
 | 
			
		||||
    {
 | 
			
		||||
@@ -361,28 +329,6 @@ public class NodeValidatorTest
 | 
			
		||||
        then(ruleServiceMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testIsRuleSetNode()
 | 
			
		||||
    {
 | 
			
		||||
        //resetting mock to bypass setup method
 | 
			
		||||
        resetNodesMock();
 | 
			
		||||
 | 
			
		||||
        boolean actual = nodeValidator.isRuleSetNode(RULE_SET_ID);
 | 
			
		||||
        Assert.assertTrue(actual);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testIsNotRuleSetNode()
 | 
			
		||||
    {
 | 
			
		||||
        //resetting mock to bypass setup method
 | 
			
		||||
        resetNodesMock();
 | 
			
		||||
 | 
			
		||||
        //using an id that doesn't belong to a ruleset node
 | 
			
		||||
        boolean actual = nodeValidator.isRuleSetNode(FOLDER_NODE_ID);
 | 
			
		||||
        Assert.assertFalse(actual);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testIsRuleSetNotNullAndShared()
 | 
			
		||||
    {
 | 
			
		||||
@@ -430,12 +376,4 @@ public class NodeValidatorTest
 | 
			
		||||
        then(ruleServiceMock).should().isRuleSetShared(ruleSetNodeRef);
 | 
			
		||||
        then(ruleServiceMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void resetNodesMock() {
 | 
			
		||||
        reset(nodesMock);
 | 
			
		||||
        given(nodesMock.validateOrLookupNode(eq(FOLDER_NODE_ID), any())).willReturn(folderNodeRef);
 | 
			
		||||
        given(nodesMock.validateNode(RULE_SET_ID)).willReturn(ruleSetNodeRef);
 | 
			
		||||
        given(nodesMock.validateNode(RULE_ID)).willReturn(ruleNodeRef);
 | 
			
		||||
        given(nodesMock.nodeMatches(ruleSetNodeRef, Set.of(ContentModel.TYPE_SYSTEM_FOLDER), null)).willReturn(true);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,121 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.api.impl.rules;
 | 
			
		||||
 | 
			
		||||
import static java.util.Collections.emptyList;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.rest.api.impl.rules.RuleLoader.IS_SHARED;
 | 
			
		||||
import static org.alfresco.rest.api.model.rules.RuleTrigger.OUTBOUND;
 | 
			
		||||
import static org.alfresco.rest.api.model.rules.RuleTrigger.UPDATE;
 | 
			
		||||
import static org.alfresco.service.cmr.repository.StoreRef.STORE_REF_WORKSPACE_SPACESSTORE;
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
import static org.mockito.BDDMockito.given;
 | 
			
		||||
import static org.mockito.MockitoAnnotations.openMocks;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.api.model.rules.Rule;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeRef;
 | 
			
		||||
import org.alfresco.service.cmr.rule.RuleService;
 | 
			
		||||
import org.junit.Before;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
import org.mockito.InjectMocks;
 | 
			
		||||
import org.mockito.Mock;
 | 
			
		||||
 | 
			
		||||
/** Unit tests for {@link RuleLoader}. */
 | 
			
		||||
public class RuleLoaderTest
 | 
			
		||||
{
 | 
			
		||||
    private static final String NODE_ID = "node-id";
 | 
			
		||||
    private static final NodeRef NODE_REF = new NodeRef(STORE_REF_WORKSPACE_SPACESSTORE, NODE_ID);
 | 
			
		||||
    private static final String TITLE = "title";
 | 
			
		||||
    private static final String DESCRIPTION = "description";
 | 
			
		||||
    private static final boolean ENABLED = true;
 | 
			
		||||
    private static final boolean CASCADE = true;
 | 
			
		||||
    private static final boolean EXECUTE_ASYNCHRONOUSLY = false;
 | 
			
		||||
    private static final List<String> TRIGGERS = List.of("update", "outbound");
 | 
			
		||||
    private static final NodeRef RULE_SET_NODE = new NodeRef("rule://set/");
 | 
			
		||||
 | 
			
		||||
    @InjectMocks
 | 
			
		||||
    private RuleLoader ruleLoader;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private RuleService ruleServiceMock;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private NodeValidator nodeValidatorMock;
 | 
			
		||||
    private org.alfresco.service.cmr.rule.Rule serviceRule = createServiceRule();
 | 
			
		||||
 | 
			
		||||
    @Before
 | 
			
		||||
    public void setUp()
 | 
			
		||||
    {
 | 
			
		||||
        openMocks(this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testLoadRule()
 | 
			
		||||
    {
 | 
			
		||||
        Rule rule = ruleLoader.loadRule(serviceRule, emptyList());
 | 
			
		||||
 | 
			
		||||
        Rule expected = Rule.builder().id(NODE_ID)
 | 
			
		||||
                            .name(TITLE)
 | 
			
		||||
                            .description(DESCRIPTION)
 | 
			
		||||
                            .enabled(ENABLED)
 | 
			
		||||
                            .cascade(CASCADE)
 | 
			
		||||
                            .asynchronous(EXECUTE_ASYNCHRONOUSLY)
 | 
			
		||||
                            .triggers(List.of(UPDATE, OUTBOUND)).create();
 | 
			
		||||
        assertThat(rule).isEqualTo(expected);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testLoadRule_noExceptionWithNullInclude()
 | 
			
		||||
    {
 | 
			
		||||
        ruleLoader.loadRule(serviceRule, null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testLoadRule_includeIsShared()
 | 
			
		||||
    {
 | 
			
		||||
        // Simulate the rule set being shared.
 | 
			
		||||
        given(ruleServiceMock.getRuleSetNode(NODE_REF)).willReturn(RULE_SET_NODE);
 | 
			
		||||
        given(nodeValidatorMock.isRuleSetNotNullAndShared(RULE_SET_NODE)).willReturn(true);
 | 
			
		||||
 | 
			
		||||
        Rule rule = ruleLoader.loadRule(serviceRule, List.of(IS_SHARED));
 | 
			
		||||
 | 
			
		||||
        assertThat(rule).extracting("isShared").isEqualTo(true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private org.alfresco.service.cmr.rule.Rule createServiceRule()
 | 
			
		||||
    {
 | 
			
		||||
        org.alfresco.service.cmr.rule.Rule rule = new org.alfresco.service.cmr.rule.Rule();
 | 
			
		||||
        rule.setNodeRef(NODE_REF);
 | 
			
		||||
        rule.setTitle(TITLE);
 | 
			
		||||
        rule.setDescription(DESCRIPTION);
 | 
			
		||||
        rule.setRuleDisabled(!ENABLED);
 | 
			
		||||
        rule.applyToChildren(CASCADE);
 | 
			
		||||
        rule.setExecuteAsynchronously(EXECUTE_ASYNCHRONOUSLY);
 | 
			
		||||
        rule.setRuleTypes(TRIGGERS);
 | 
			
		||||
        return rule;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,133 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.api.impl.rules;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.rest.api.impl.rules.RuleSetLoader.INCLUSION_TYPE;
 | 
			
		||||
import static org.alfresco.rest.api.impl.rules.RuleSetLoader.OWNING_FOLDER;
 | 
			
		||||
import static org.alfresco.rest.api.model.rules.InclusionType.INHERITED;
 | 
			
		||||
import static org.alfresco.rest.api.model.rules.InclusionType.LINKED;
 | 
			
		||||
import static org.alfresco.rest.api.model.rules.InclusionType.OWNED;
 | 
			
		||||
import static org.alfresco.service.cmr.repository.StoreRef.STORE_REF_WORKSPACE_SPACESSTORE;
 | 
			
		||||
import static org.mockito.BDDMockito.given;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import junit.framework.TestCase;
 | 
			
		||||
import org.alfresco.rest.api.model.rules.RuleSet;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeRef;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeService;
 | 
			
		||||
import org.junit.Before;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
import org.junit.runner.RunWith;
 | 
			
		||||
import org.mockito.InjectMocks;
 | 
			
		||||
import org.mockito.Mock;
 | 
			
		||||
import org.mockito.junit.MockitoJUnitRunner;
 | 
			
		||||
 | 
			
		||||
/** Unit tests for {@link RuleSetLoader}. */
 | 
			
		||||
@Experimental
 | 
			
		||||
@RunWith (MockitoJUnitRunner.class)
 | 
			
		||||
public class RuleSetLoaderTest extends TestCase
 | 
			
		||||
{
 | 
			
		||||
    private static final String FOLDER_ID = "dummy-folder-id";
 | 
			
		||||
    private static final String RULE_SET_ID = "dummy-rule-set-id";
 | 
			
		||||
    private static final NodeRef FOLDER_NODE = new NodeRef(STORE_REF_WORKSPACE_SPACESSTORE, FOLDER_ID);
 | 
			
		||||
    private static final NodeRef RULE_SET_NODE = new NodeRef(STORE_REF_WORKSPACE_SPACESSTORE, RULE_SET_ID);
 | 
			
		||||
    private static final String LINKING_FOLDER_ID = "linking-folder";
 | 
			
		||||
    private static final NodeRef LINKING_FOLDER = new NodeRef(STORE_REF_WORKSPACE_SPACESSTORE, LINKING_FOLDER_ID);
 | 
			
		||||
    private static final NodeRef INHERITING_FOLDER = new NodeRef("inheriting://folder/");
 | 
			
		||||
 | 
			
		||||
    @InjectMocks
 | 
			
		||||
    private RuleSetLoader ruleSetLoader;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private NodeService nodeServiceMock;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private ChildAssociationRef ruleSetAssociationMock;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private ChildAssociationRef linkAssociationMock;
 | 
			
		||||
 | 
			
		||||
    @Before
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setUp()
 | 
			
		||||
    {
 | 
			
		||||
        given(ruleSetAssociationMock.getParentRef()).willReturn(FOLDER_NODE);
 | 
			
		||||
        given(nodeServiceMock.getPrimaryParent(RULE_SET_NODE)).willReturn(ruleSetAssociationMock);
 | 
			
		||||
 | 
			
		||||
        given(linkAssociationMock.getParentRef()).willReturn(LINKING_FOLDER);
 | 
			
		||||
        given(nodeServiceMock.getParentAssocs(RULE_SET_NODE)).willReturn(List.of(ruleSetAssociationMock, linkAssociationMock));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testLoadRuleSet_noIncludes()
 | 
			
		||||
    {
 | 
			
		||||
        // Call the method under test.
 | 
			
		||||
        RuleSet actual = ruleSetLoader.loadRuleSet(RULE_SET_NODE, FOLDER_NODE, null);
 | 
			
		||||
 | 
			
		||||
        RuleSet expected = RuleSet.builder().id(RULE_SET_ID).create();
 | 
			
		||||
        assertEquals(expected, actual);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testLoadRuleSet_includeOwningFolder()
 | 
			
		||||
    {
 | 
			
		||||
        // Call the method under test.
 | 
			
		||||
        RuleSet actual = ruleSetLoader.loadRuleSet(RULE_SET_NODE, FOLDER_NODE, List.of(OWNING_FOLDER));
 | 
			
		||||
 | 
			
		||||
        RuleSet expected = RuleSet.builder().id(RULE_SET_ID).owningFolder(FOLDER_NODE).create();
 | 
			
		||||
        assertEquals(expected, actual);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testLoadRuleSet_includeInclusionType()
 | 
			
		||||
    {
 | 
			
		||||
        // Call the method under test.
 | 
			
		||||
        RuleSet actual = ruleSetLoader.loadRuleSet(RULE_SET_NODE, FOLDER_NODE, List.of(INCLUSION_TYPE));
 | 
			
		||||
 | 
			
		||||
        RuleSet expected = RuleSet.builder().id(RULE_SET_ID).inclusionType(OWNED).create();
 | 
			
		||||
        assertEquals(expected, actual);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testLoadRuleSet_linkedInclusionType()
 | 
			
		||||
    {
 | 
			
		||||
        // Call the method under test.
 | 
			
		||||
        RuleSet actual = ruleSetLoader.loadRuleSet(RULE_SET_NODE, LINKING_FOLDER, List.of(INCLUSION_TYPE));
 | 
			
		||||
 | 
			
		||||
        RuleSet expected = RuleSet.builder().id(RULE_SET_ID).inclusionType(LINKED).create();
 | 
			
		||||
        assertEquals(expected, actual);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testLoadRuleSet_inheritedInclusionType()
 | 
			
		||||
    {
 | 
			
		||||
        // Call the method under test.
 | 
			
		||||
        RuleSet actual = ruleSetLoader.loadRuleSet(RULE_SET_NODE, INHERITING_FOLDER, List.of(INCLUSION_TYPE));
 | 
			
		||||
 | 
			
		||||
        RuleSet expected = RuleSet.builder().id(RULE_SET_ID).inclusionType(INHERITED).create();
 | 
			
		||||
        assertEquals(expected, actual);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -27,28 +27,20 @@ package org.alfresco.rest.api.impl.rules;
 | 
			
		||||
 | 
			
		||||
import static java.util.Collections.emptyList;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.any;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.anyBoolean;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.eq;
 | 
			
		||||
import static org.mockito.BDDMockito.given;
 | 
			
		||||
import static org.mockito.BDDMockito.then;
 | 
			
		||||
import static org.mockito.Mockito.mock;
 | 
			
		||||
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import junit.framework.TestCase;
 | 
			
		||||
import org.alfresco.repo.rule.RuleModel;
 | 
			
		||||
import org.alfresco.repo.rule.RuntimeRuleService;
 | 
			
		||||
import org.alfresco.rest.api.model.rules.RuleSet;
 | 
			
		||||
import org.alfresco.rest.framework.core.exceptions.InvalidArgumentException;
 | 
			
		||||
import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo;
 | 
			
		||||
import org.alfresco.rest.framework.resource.parameters.Paging;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeRef;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeService;
 | 
			
		||||
import org.alfresco.service.cmr.repository.StoreRef;
 | 
			
		||||
import org.alfresco.service.cmr.rule.RuleService;
 | 
			
		||||
import org.junit.Before;
 | 
			
		||||
@@ -65,30 +57,17 @@ import org.mockito.junit.MockitoJUnitRunner;
 | 
			
		||||
public class RuleSetsImplTest extends TestCase
 | 
			
		||||
{
 | 
			
		||||
    private static final String FOLDER_ID = "dummy-folder-id";
 | 
			
		||||
    private static final String LINK_TO_NODE_ID = "dummy-link-to-node-id";
 | 
			
		||||
    private static final String RULE_SET_ID = "dummy-rule-set-id";
 | 
			
		||||
    private static final NodeRef FOLDER_NODE = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, FOLDER_ID);
 | 
			
		||||
    private static final NodeRef LINK_TO_NODE = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, LINK_TO_NODE_ID);
 | 
			
		||||
    private static final NodeRef RULE_SET_NODE = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, RULE_SET_ID);
 | 
			
		||||
    private static final Paging PAGING = Paging.DEFAULT;
 | 
			
		||||
    private static final List<String> INCLUDES = List.of("dummy-includes");
 | 
			
		||||
 | 
			
		||||
    @InjectMocks
 | 
			
		||||
    private RuleSetsImpl ruleSets;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private RuleSetLoader ruleSetLoaderMock;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private NodeValidator nodeValidatorMock;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private NodeService nodeServiceMock;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private RuleService ruleServiceMock;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private RuntimeRuleService runtimeRuleServiceMock;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private RuleSet ruleSetMock;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private ChildAssociationRef assocRef;
 | 
			
		||||
 | 
			
		||||
    @Before
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -96,31 +75,26 @@ public class RuleSetsImplTest extends TestCase
 | 
			
		||||
    {
 | 
			
		||||
        MockitoAnnotations.openMocks(this);
 | 
			
		||||
 | 
			
		||||
        given(nodeValidatorMock.validateFolderNode(eq(LINK_TO_NODE_ID), anyBoolean())).willReturn(LINK_TO_NODE);
 | 
			
		||||
        given(nodeValidatorMock.validateRuleSetNode(LINK_TO_NODE_ID,true)).willReturn(LINK_TO_NODE);
 | 
			
		||||
        given(nodeValidatorMock.validateFolderNode(eq(FOLDER_ID), anyBoolean())).willReturn(FOLDER_NODE);
 | 
			
		||||
        //given(nodeValidatorMock.validateFolderNode(eq(RULE_SET_ID), anyBoolean())).willReturn(RULE_SET_NODE);
 | 
			
		||||
        given(nodeValidatorMock.validateRuleSetNode(RULE_SET_ID, FOLDER_NODE)).willReturn(RULE_SET_NODE);
 | 
			
		||||
 | 
			
		||||
        given(ruleServiceMock.getRuleSetNode(FOLDER_NODE)).willReturn(RULE_SET_NODE);
 | 
			
		||||
        given(ruleServiceMock.getNodesSupplyingRuleSets(FOLDER_NODE)).willReturn(List.of(FOLDER_NODE));
 | 
			
		||||
 | 
			
		||||
        given(ruleSetLoaderMock.loadRuleSet(RULE_SET_NODE, FOLDER_NODE, INCLUDES)).willReturn(ruleSetMock);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testGetRuleSets()
 | 
			
		||||
    {
 | 
			
		||||
        // Call the method under test.
 | 
			
		||||
        CollectionWithPagingInfo<RuleSet> actual = ruleSets.getRuleSets(FOLDER_ID, INCLUDES, PAGING);
 | 
			
		||||
        CollectionWithPagingInfo<RuleSet> actual = ruleSets.getRuleSets(FOLDER_ID, null, PAGING);
 | 
			
		||||
 | 
			
		||||
        then(nodeValidatorMock).should().validateFolderNode(FOLDER_ID, false);
 | 
			
		||||
        then(nodeValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
 | 
			
		||||
        then(ruleServiceMock).should().getNodesSupplyingRuleSets(FOLDER_NODE);
 | 
			
		||||
        then(ruleServiceMock).should().getRuleSetNode(FOLDER_NODE);
 | 
			
		||||
        then(ruleServiceMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
 | 
			
		||||
        Collection<RuleSet> expected = List.of(ruleSetMock);
 | 
			
		||||
        Collection<RuleSet> expected = List.of(RuleSet.of(RULE_SET_ID));
 | 
			
		||||
        assertEquals(expected, actual.getCollection());
 | 
			
		||||
        assertEquals(PAGING, actual.getPaging());
 | 
			
		||||
    }
 | 
			
		||||
@@ -132,12 +106,11 @@ public class RuleSetsImplTest extends TestCase
 | 
			
		||||
        given(ruleServiceMock.getRuleSetNode(FOLDER_NODE)).willReturn(null);
 | 
			
		||||
 | 
			
		||||
        // Call the method under test.
 | 
			
		||||
        CollectionWithPagingInfo<RuleSet> actual = ruleSets.getRuleSets(FOLDER_ID, INCLUDES, PAGING);
 | 
			
		||||
        CollectionWithPagingInfo<RuleSet> actual = ruleSets.getRuleSets(FOLDER_ID, null, PAGING);
 | 
			
		||||
 | 
			
		||||
        then(nodeValidatorMock).should().validateFolderNode(FOLDER_ID, false);
 | 
			
		||||
        then(nodeValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
 | 
			
		||||
        then(ruleServiceMock).should().getNodesSupplyingRuleSets(FOLDER_NODE);
 | 
			
		||||
        then(ruleServiceMock).should().getRuleSetNode(FOLDER_NODE);
 | 
			
		||||
        then(ruleServiceMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
 | 
			
		||||
@@ -145,153 +118,16 @@ public class RuleSetsImplTest extends TestCase
 | 
			
		||||
        assertEquals(PAGING, actual.getPaging());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check that a folder with a parent and grandparent can inherit rule sets from the grandparent, even if the parent has no rules. */
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testGetInheritedRuleSets()
 | 
			
		||||
    {
 | 
			
		||||
        // Simulate a parent node without a rule set.
 | 
			
		||||
        NodeRef parentNode = new NodeRef("parent://node/");
 | 
			
		||||
        // Simulate a grandparent node providing a rule set.
 | 
			
		||||
        NodeRef grandparentNode = new NodeRef("grandparent://node/");
 | 
			
		||||
        RuleSet grandparentRuleSet = mock(RuleSet.class);
 | 
			
		||||
        NodeRef grandparentRuleSetNode = new NodeRef("grandparent://rule-set/");
 | 
			
		||||
        given(ruleServiceMock.getRuleSetNode(grandparentNode)).willReturn(grandparentRuleSetNode);
 | 
			
		||||
        given(ruleSetLoaderMock.loadRuleSet(grandparentRuleSetNode, FOLDER_NODE, INCLUDES)).willReturn(grandparentRuleSet);
 | 
			
		||||
        // These should be returned with the highest in hierarchy first.
 | 
			
		||||
        given(ruleServiceMock.getNodesSupplyingRuleSets(FOLDER_NODE)).willReturn(List.of(grandparentNode, parentNode, FOLDER_NODE));
 | 
			
		||||
 | 
			
		||||
        // Call the method under test.
 | 
			
		||||
        CollectionWithPagingInfo<RuleSet> actual = ruleSets.getRuleSets(FOLDER_ID, INCLUDES, PAGING);
 | 
			
		||||
 | 
			
		||||
        then(nodeValidatorMock).should().validateFolderNode(FOLDER_ID, false);
 | 
			
		||||
        then(nodeValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
 | 
			
		||||
        then(ruleServiceMock).should().getNodesSupplyingRuleSets(FOLDER_NODE);
 | 
			
		||||
        then(ruleServiceMock).should().getRuleSetNode(grandparentNode);
 | 
			
		||||
        then(ruleServiceMock).should().getRuleSetNode(parentNode);
 | 
			
		||||
        then(ruleServiceMock).should().getRuleSetNode(FOLDER_NODE);
 | 
			
		||||
        then(ruleServiceMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
 | 
			
		||||
        Collection<RuleSet> expected = List.of(grandparentRuleSet, ruleSetMock);
 | 
			
		||||
        assertEquals(expected, actual.getCollection());
 | 
			
		||||
        assertEquals(PAGING, actual.getPaging());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** When getting rule sets then only the first instance of each rule set should be included (ancestor first). */
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testGetDuplicateRuleSets()
 | 
			
		||||
    {
 | 
			
		||||
        // Simulate a grandparent, parent and child with the grandparent linking to the child's rule set.
 | 
			
		||||
        NodeRef grandparentNode = new NodeRef("grandparent://node/");
 | 
			
		||||
        given(ruleServiceMock.getRuleSetNode(grandparentNode)).willReturn(RULE_SET_NODE);
 | 
			
		||||
        NodeRef parentNode = new NodeRef("parent://node/");
 | 
			
		||||
        RuleSet parentRuleSet = mock(RuleSet.class);
 | 
			
		||||
        NodeRef parentRuleSetNode = new NodeRef("parent://rule-set/");
 | 
			
		||||
        given(ruleServiceMock.getRuleSetNode(parentNode)).willReturn(parentRuleSetNode);
 | 
			
		||||
        given(ruleSetLoaderMock.loadRuleSet(parentRuleSetNode, FOLDER_NODE, INCLUDES)).willReturn(parentRuleSet);
 | 
			
		||||
        // These should be returned with the highest in hierarchy first.
 | 
			
		||||
        given(ruleServiceMock.getNodesSupplyingRuleSets(FOLDER_NODE)).willReturn(List.of(grandparentNode, parentNode, FOLDER_NODE));
 | 
			
		||||
 | 
			
		||||
        // Call the method under test.
 | 
			
		||||
        CollectionWithPagingInfo<RuleSet> actual = ruleSets.getRuleSets(FOLDER_ID, INCLUDES, PAGING);
 | 
			
		||||
 | 
			
		||||
        // The grandparent's linked rule set should be first and only appear once.
 | 
			
		||||
        Collection<RuleSet> expected = List.of(ruleSetMock, parentRuleSet);
 | 
			
		||||
        assertEquals(expected, actual.getCollection());
 | 
			
		||||
        assertEquals(PAGING, actual.getPaging());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testGetRuleSetById()
 | 
			
		||||
    {
 | 
			
		||||
        // Call the method under test.
 | 
			
		||||
        RuleSet actual = ruleSets.getRuleSetById(FOLDER_ID, RULE_SET_ID, INCLUDES);
 | 
			
		||||
        RuleSet actual = ruleSets.getRuleSetById(FOLDER_ID, RULE_SET_ID, null);
 | 
			
		||||
 | 
			
		||||
        then(nodeValidatorMock).should().validateFolderNode(FOLDER_ID, false);
 | 
			
		||||
        then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE);
 | 
			
		||||
        then(nodeValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
 | 
			
		||||
        assertEquals(ruleSetMock, actual);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testLinkToFolderRuleSet()
 | 
			
		||||
    {
 | 
			
		||||
        NodeRef childNodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, "dummy-child-id");
 | 
			
		||||
 | 
			
		||||
        given(ruleServiceMock.hasRules(any(NodeRef.class))).willReturn(true, false);
 | 
			
		||||
        given(runtimeRuleServiceMock.getSavedRuleFolderAssoc(any(NodeRef.class))).willReturn(assocRef);
 | 
			
		||||
        given(assocRef.getChildRef()).willReturn(childNodeRef);
 | 
			
		||||
 | 
			
		||||
        //when
 | 
			
		||||
        String actual = ruleSets.linkToRuleSet(FOLDER_ID,LINK_TO_NODE_ID).getId();
 | 
			
		||||
 | 
			
		||||
        then(ruleServiceMock).should().hasRules(LINK_TO_NODE);
 | 
			
		||||
        then(ruleServiceMock).should().hasRules(FOLDER_NODE);
 | 
			
		||||
        then(runtimeRuleServiceMock).should().getSavedRuleFolderAssoc(LINK_TO_NODE);
 | 
			
		||||
        then(runtimeRuleServiceMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(nodeServiceMock).should().addChild(FOLDER_NODE, childNodeRef, RuleModel.ASSOC_RULE_FOLDER, RuleModel.ASSOC_RULE_FOLDER);
 | 
			
		||||
        then(nodeServiceMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
 | 
			
		||||
        assertEquals(childNodeRef.getId(),actual);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testLinkToRuleSet()
 | 
			
		||||
    {
 | 
			
		||||
        NodeRef childNodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, "dummy-child-id");
 | 
			
		||||
 | 
			
		||||
        given(nodeValidatorMock.isRuleSetNode(any())).willReturn(true);
 | 
			
		||||
        given(ruleServiceMock.hasRules(any(NodeRef.class))).willReturn(true, false);
 | 
			
		||||
        given(runtimeRuleServiceMock.getSavedRuleFolderAssoc(any(NodeRef.class))).willReturn(assocRef);
 | 
			
		||||
        given(assocRef.getChildRef()).willReturn(childNodeRef);
 | 
			
		||||
 | 
			
		||||
        //when
 | 
			
		||||
        String actual = ruleSets.linkToRuleSet(FOLDER_ID,LINK_TO_NODE_ID).getId();
 | 
			
		||||
 | 
			
		||||
        then(nodeValidatorMock).should().validateFolderNode(FOLDER_ID,true);
 | 
			
		||||
        then(nodeValidatorMock).should().isRuleSetNode(LINK_TO_NODE_ID);
 | 
			
		||||
        then(nodeValidatorMock).should().validateRuleSetNode(LINK_TO_NODE_ID,true);
 | 
			
		||||
        then(nodeValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(ruleServiceMock).should().hasRules(LINK_TO_NODE);
 | 
			
		||||
        then(ruleServiceMock).should().hasRules(FOLDER_NODE);
 | 
			
		||||
        then(runtimeRuleServiceMock).should().getSavedRuleFolderAssoc(LINK_TO_NODE);
 | 
			
		||||
        then(runtimeRuleServiceMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(nodeServiceMock).should().addChild(FOLDER_NODE, childNodeRef, RuleModel.ASSOC_RULE_FOLDER, RuleModel.ASSOC_RULE_FOLDER);
 | 
			
		||||
        then(nodeServiceMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
 | 
			
		||||
        assertEquals(childNodeRef.getId(),actual);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testLinkToRuleSet_targetFolderHasNoRules()
 | 
			
		||||
    {
 | 
			
		||||
        given(ruleServiceMock.hasRules(LINK_TO_NODE)).willReturn(false);
 | 
			
		||||
 | 
			
		||||
        //when
 | 
			
		||||
        assertThatExceptionOfType(InvalidArgumentException.class).isThrownBy(
 | 
			
		||||
                () -> ruleSets.linkToRuleSet(FOLDER_ID, LINK_TO_NODE_ID)
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        then(nodeServiceMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(ruleServiceMock).should().hasRules(LINK_TO_NODE);
 | 
			
		||||
        then(ruleServiceMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(runtimeRuleServiceMock).shouldHaveNoInteractions();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testLinkToRuleSet_folderShouldntHavePreExistingRules()
 | 
			
		||||
    {
 | 
			
		||||
        given(ruleServiceMock.hasRules(any(NodeRef.class))).willReturn(true, true);
 | 
			
		||||
 | 
			
		||||
        //when
 | 
			
		||||
        assertThatExceptionOfType(InvalidArgumentException.class).isThrownBy(
 | 
			
		||||
                () -> ruleSets.linkToRuleSet(FOLDER_ID, LINK_TO_NODE_ID));
 | 
			
		||||
 | 
			
		||||
        then(nodeServiceMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(ruleServiceMock).should().hasRules(LINK_TO_NODE);
 | 
			
		||||
        then(ruleServiceMock).should().hasRules(FOLDER_NODE);
 | 
			
		||||
        then(ruleServiceMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(runtimeRuleServiceMock).shouldHaveNoInteractions();
 | 
			
		||||
        assertEquals(RuleSet.of(RULE_SET_ID), actual);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,145 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.api.impl.rules;
 | 
			
		||||
 | 
			
		||||
import static java.util.Collections.emptyMap;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.repo.rule.RuleModel.ASPECT_IGNORE_INHERITED_RULES;
 | 
			
		||||
import static org.alfresco.rest.api.model.rules.RuleSetting.IS_INHERITANCE_ENABLED_KEY;
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.anyBoolean;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.eq;
 | 
			
		||||
import static org.mockito.BDDMockito.given;
 | 
			
		||||
import static org.mockito.BDDMockito.then;
 | 
			
		||||
 | 
			
		||||
import junit.framework.TestCase;
 | 
			
		||||
import org.alfresco.rest.api.model.rules.RuleSetting;
 | 
			
		||||
import org.alfresco.rest.framework.core.exceptions.NotFoundException;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeRef;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeService;
 | 
			
		||||
import org.alfresco.service.cmr.repository.StoreRef;
 | 
			
		||||
import org.junit.Before;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
import org.junit.runner.RunWith;
 | 
			
		||||
import org.mockito.InjectMocks;
 | 
			
		||||
import org.mockito.Mock;
 | 
			
		||||
import org.mockito.junit.MockitoJUnitRunner;
 | 
			
		||||
 | 
			
		||||
/** Unit tests for {@link RuleSettingsImpl}. */
 | 
			
		||||
@Experimental
 | 
			
		||||
@RunWith (MockitoJUnitRunner.class)
 | 
			
		||||
public class RuleSettingsImplTest extends TestCase
 | 
			
		||||
{
 | 
			
		||||
    private static final String FOLDER_ID = "dummy-folder-id";
 | 
			
		||||
    private static final NodeRef FOLDER_NODE = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, FOLDER_ID);
 | 
			
		||||
 | 
			
		||||
    @InjectMocks
 | 
			
		||||
    private RuleSettingsImpl ruleSettings;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private NodeValidator nodeValidatorMock;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private NodeService nodeServiceMock;
 | 
			
		||||
 | 
			
		||||
    @Before
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setUp()
 | 
			
		||||
    {
 | 
			
		||||
        given(nodeValidatorMock.validateFolderNode(eq(FOLDER_ID), anyBoolean())).willReturn(FOLDER_NODE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testGetRuleSetting_disabled()
 | 
			
		||||
    {
 | 
			
		||||
        given(nodeServiceMock.hasAspect(FOLDER_NODE, ASPECT_IGNORE_INHERITED_RULES)).willReturn(true);
 | 
			
		||||
 | 
			
		||||
        // Call the method under test.
 | 
			
		||||
        RuleSetting ruleSetting = ruleSettings.getRuleSetting(FOLDER_ID, IS_INHERITANCE_ENABLED_KEY);
 | 
			
		||||
 | 
			
		||||
        RuleSetting expected = RuleSetting.builder().key(IS_INHERITANCE_ENABLED_KEY).value(false).create();
 | 
			
		||||
        assertEquals(expected, ruleSetting);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testGetRuleSetting_enabled()
 | 
			
		||||
    {
 | 
			
		||||
        given(nodeServiceMock.hasAspect(FOLDER_NODE, ASPECT_IGNORE_INHERITED_RULES)).willReturn(false);
 | 
			
		||||
 | 
			
		||||
        // Call the method under test.
 | 
			
		||||
        RuleSetting ruleSetting = ruleSettings.getRuleSetting(FOLDER_ID, IS_INHERITANCE_ENABLED_KEY);
 | 
			
		||||
 | 
			
		||||
        RuleSetting expected = RuleSetting.builder().key(IS_INHERITANCE_ENABLED_KEY).value(true).create();
 | 
			
		||||
        assertEquals(expected, ruleSetting);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testGetRuleSetting_unrecognisedKey()
 | 
			
		||||
    {
 | 
			
		||||
        assertThatExceptionOfType(NotFoundException.class)
 | 
			
		||||
                .isThrownBy(() -> ruleSettings.getRuleSetting(FOLDER_ID, "-fakeSetting-"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testSetRuleSetting_enable()
 | 
			
		||||
    {
 | 
			
		||||
        RuleSetting ruleSetting = RuleSetting.builder().key(IS_INHERITANCE_ENABLED_KEY).value(true).create();
 | 
			
		||||
 | 
			
		||||
        // Call the method under test.
 | 
			
		||||
        RuleSetting actual = ruleSettings.setRuleSetting(FOLDER_ID, ruleSetting);
 | 
			
		||||
 | 
			
		||||
        assertEquals(ruleSetting, actual);
 | 
			
		||||
        then(nodeServiceMock).should().removeAspect(FOLDER_NODE, ASPECT_IGNORE_INHERITED_RULES);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testSetRuleSetting_disable()
 | 
			
		||||
    {
 | 
			
		||||
        RuleSetting ruleSetting = RuleSetting.builder().key(IS_INHERITANCE_ENABLED_KEY).value(false).create();
 | 
			
		||||
 | 
			
		||||
        // Call the method under test.
 | 
			
		||||
        RuleSetting actual = ruleSettings.setRuleSetting(FOLDER_ID, ruleSetting);
 | 
			
		||||
 | 
			
		||||
        assertEquals(ruleSetting, actual);
 | 
			
		||||
        then(nodeServiceMock).should().addAspect(FOLDER_NODE, ASPECT_IGNORE_INHERITED_RULES, emptyMap());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testSetRuleSetting_unrecognisedKey()
 | 
			
		||||
    {
 | 
			
		||||
        RuleSetting ruleSetting = RuleSetting.builder().key("-fakeSetting-").value(true).create();
 | 
			
		||||
        assertThatExceptionOfType(NotFoundException.class)
 | 
			
		||||
                .isThrownBy(() -> ruleSettings.setRuleSetting(FOLDER_ID, ruleSetting));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testSetRuleSetting_nonBooleanValue()
 | 
			
		||||
    {
 | 
			
		||||
        RuleSetting ruleSetting = RuleSetting.builder().key(IS_INHERITANCE_ENABLED_KEY).value(123456).create();
 | 
			
		||||
 | 
			
		||||
        assertThatExceptionOfType(IllegalArgumentException.class)
 | 
			
		||||
                .isThrownBy(() -> ruleSettings.setRuleSetting(FOLDER_ID, ruleSetting));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -38,17 +38,14 @@ import static org.mockito.BDDMockito.then;
 | 
			
		||||
import static org.mockito.Mockito.mock;
 | 
			
		||||
import static org.mockito.Mockito.times;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.stream.IntStream;
 | 
			
		||||
 | 
			
		||||
import junit.framework.TestCase;
 | 
			
		||||
import org.alfresco.repo.action.ActionImpl;
 | 
			
		||||
import org.alfresco.repo.action.CompositeActionImpl;
 | 
			
		||||
import org.alfresco.rest.api.Nodes;
 | 
			
		||||
import org.alfresco.rest.api.model.rules.CompositeCondition;
 | 
			
		||||
import org.alfresco.rest.api.model.rules.Rule;
 | 
			
		||||
import org.alfresco.rest.framework.core.exceptions.EntityNotFoundException;
 | 
			
		||||
import org.alfresco.rest.framework.core.exceptions.InvalidArgumentException;
 | 
			
		||||
@@ -57,17 +54,17 @@ import org.alfresco.rest.framework.core.exceptions.RelationshipResourceNotFoundE
 | 
			
		||||
import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo;
 | 
			
		||||
import org.alfresco.rest.framework.resource.parameters.Paging;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.service.cmr.action.CompositeAction;
 | 
			
		||||
import org.alfresco.service.cmr.action.Action;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeRef;
 | 
			
		||||
import org.alfresco.service.cmr.repository.StoreRef;
 | 
			
		||||
import org.alfresco.service.cmr.rule.RuleService;
 | 
			
		||||
import org.alfresco.service.namespace.NamespaceService;
 | 
			
		||||
import org.junit.Before;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
import org.junit.runner.RunWith;
 | 
			
		||||
import org.mockito.InjectMocks;
 | 
			
		||||
import org.mockito.Mock;
 | 
			
		||||
import org.mockito.Mockito;
 | 
			
		||||
import org.mockito.MockitoAnnotations;
 | 
			
		||||
import org.mockito.junit.MockitoJUnitRunner;
 | 
			
		||||
 | 
			
		||||
@Experimental
 | 
			
		||||
@@ -77,34 +74,20 @@ public class RulesImplTest extends TestCase
 | 
			
		||||
    private static final String FOLDER_NODE_ID = "dummy-folder-node-id";
 | 
			
		||||
    private static final String RULE_SET_ID = "dummy-rule-set-id";
 | 
			
		||||
    private static final String RULE_ID = "dummy-rule-id";
 | 
			
		||||
    private static final NodeRef FOLDER_NODE_REF = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, FOLDER_NODE_ID);
 | 
			
		||||
    private static final NodeRef RULE_SET_NODE_REF = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, RULE_SET_ID);
 | 
			
		||||
    private static final NodeRef RULE_NODE_REF = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, RULE_ID);
 | 
			
		||||
    private static final Paging PAGING = Paging.DEFAULT;
 | 
			
		||||
    private static final List<String> INCLUDE = emptyList();
 | 
			
		||||
    private static final String ACTION_DEFINITION_NAME = "actionDefinitionName";
 | 
			
		||||
    private static final Map<String, Serializable> DUMMY_PARAMS = Map.of("dummy-key", "dummy-value");
 | 
			
		||||
    private static final NodeRef folderNodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, FOLDER_NODE_ID);
 | 
			
		||||
    private static final NodeRef ruleSetNodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, RULE_SET_ID);
 | 
			
		||||
    private static final NodeRef ruleNodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, RULE_ID);
 | 
			
		||||
    private static final Paging paging = Paging.DEFAULT;
 | 
			
		||||
    private static final Action action = new ActionImpl(folderNodeRef, "actionId", "actionDefinitionName");
 | 
			
		||||
 | 
			
		||||
    @Mock
 | 
			
		||||
    private Nodes nodesMock;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private NamespaceService namespaceService;
 | 
			
		||||
 | 
			
		||||
    @Mock
 | 
			
		||||
    private NodeValidator nodeValidatorMock;
 | 
			
		||||
 | 
			
		||||
    @Mock
 | 
			
		||||
    private RuleService ruleServiceMock;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private RuleLoader ruleLoaderMock;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private ActionParameterConverter actionParameterConverterMock;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private ActionPermissionValidator actionPermissionValidatorMock;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private org.alfresco.service.cmr.rule.Rule serviceRuleMock;
 | 
			
		||||
    @Mock
 | 
			
		||||
    private Rule ruleMock;
 | 
			
		||||
    private org.alfresco.service.cmr.rule.Rule ruleModel = createRule(RULE_ID);
 | 
			
		||||
    private CompositeAction compositeAction = new CompositeActionImpl(RULE_NODE_REF, "compositeActionId");
 | 
			
		||||
 | 
			
		||||
    @InjectMocks
 | 
			
		||||
    private RulesImpl rules;
 | 
			
		||||
@@ -113,61 +96,54 @@ public class RulesImplTest extends TestCase
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setUp() throws Exception
 | 
			
		||||
    {
 | 
			
		||||
        given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(FOLDER_NODE_REF);
 | 
			
		||||
        given(nodeValidatorMock.validateRuleSetNode(any(), any())).willReturn(RULE_SET_NODE_REF);
 | 
			
		||||
        given(nodeValidatorMock.validateRuleNode(any(), any())).willReturn(RULE_NODE_REF);
 | 
			
		||||
 | 
			
		||||
        given(ruleServiceMock.getRule(RULE_NODE_REF)).willReturn(ruleModel);
 | 
			
		||||
        given(ruleServiceMock.getRules(FOLDER_NODE_REF, false)).willReturn(List.of(ruleModel));
 | 
			
		||||
        given(ruleServiceMock.getOwningNodeRef(RULE_SET_NODE_REF)).willReturn(FOLDER_NODE_REF);
 | 
			
		||||
 | 
			
		||||
        given(ruleLoaderMock.loadRule(ruleModel, INCLUDE)).willReturn(ruleMock);
 | 
			
		||||
 | 
			
		||||
        compositeAction.addAction(new ActionImpl(FOLDER_NODE_REF, "actionId", ACTION_DEFINITION_NAME, DUMMY_PARAMS));
 | 
			
		||||
        MockitoAnnotations.openMocks(this);
 | 
			
		||||
        given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(folderNodeRef);
 | 
			
		||||
        given(nodeValidatorMock.validateRuleSetNode(any(), any())).willReturn(ruleSetNodeRef);
 | 
			
		||||
        given(nodeValidatorMock.validateRuleNode(any(), any())).willReturn(ruleNodeRef);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testGetRules()
 | 
			
		||||
    {
 | 
			
		||||
        given(ruleLoaderMock.loadRule(ruleModel, emptyList())).willReturn(ruleMock);
 | 
			
		||||
        given(ruleServiceMock.getRules(any())).willReturn(List.of(createRule(RULE_ID)));
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        final CollectionWithPagingInfo<Rule> rulesPage = rules.getRules(FOLDER_NODE_ID, RULE_SET_ID, INCLUDE, PAGING);
 | 
			
		||||
        final CollectionWithPagingInfo<Rule> rulesPage = rules.getRules(FOLDER_NODE_ID, RULE_SET_ID, paging);
 | 
			
		||||
 | 
			
		||||
        then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, false);
 | 
			
		||||
        then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
 | 
			
		||||
        then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef);
 | 
			
		||||
        then(nodeValidatorMock).should().isRuleSetNotNullAndShared(ruleSetNodeRef);
 | 
			
		||||
        then(nodeValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(ruleServiceMock).should().getOwningNodeRef(RULE_SET_NODE_REF);
 | 
			
		||||
        then(ruleServiceMock).should().getRules(FOLDER_NODE_REF, false);
 | 
			
		||||
        then(ruleServiceMock).should().getRules(folderNodeRef);
 | 
			
		||||
        then(ruleServiceMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(ruleLoaderMock).should().loadRule(ruleModel, emptyList());
 | 
			
		||||
        then(ruleLoaderMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        assertThat(rulesPage)
 | 
			
		||||
                .isNotNull()
 | 
			
		||||
                .extracting(CollectionWithPagingInfo::getCollection)
 | 
			
		||||
            .extracting(CollectionWithPagingInfo::getCollection)
 | 
			
		||||
                .isNotNull()
 | 
			
		||||
                .extracting(Collection::size)
 | 
			
		||||
            .extracting(Collection::size)
 | 
			
		||||
                .isEqualTo(1);
 | 
			
		||||
        assertThat(rulesPage.getCollection().stream().findFirst().get()).isEqualTo(ruleMock);
 | 
			
		||||
        assertThat(rulesPage.getCollection().stream().findFirst().orElse(null))
 | 
			
		||||
                .isNotNull()
 | 
			
		||||
            .extracting(Rule::getId)
 | 
			
		||||
                .isEqualTo(RULE_ID);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testGetRules_emptyResult()
 | 
			
		||||
    {
 | 
			
		||||
        given(ruleServiceMock.getRules(FOLDER_NODE_REF, false)).willReturn(emptyList());
 | 
			
		||||
        given(ruleServiceMock.getRules(any())).willReturn(emptyList());
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        final CollectionWithPagingInfo<Rule> rulesPage = rules.getRules(FOLDER_NODE_ID, RULE_SET_ID, INCLUDE, PAGING);
 | 
			
		||||
        final CollectionWithPagingInfo<Rule> rulesPage = rules.getRules(FOLDER_NODE_ID, RULE_SET_ID, paging);
 | 
			
		||||
 | 
			
		||||
        then(ruleServiceMock).should().getOwningNodeRef(RULE_SET_NODE_REF);
 | 
			
		||||
        then(ruleServiceMock).should().getRules(FOLDER_NODE_REF, false);
 | 
			
		||||
        then(ruleServiceMock).should().getRules(folderNodeRef);
 | 
			
		||||
        then(ruleServiceMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        assertThat(rulesPage)
 | 
			
		||||
                .isNotNull()
 | 
			
		||||
                .extracting(CollectionWithPagingInfo::getCollection)
 | 
			
		||||
                .isNotNull()
 | 
			
		||||
                .extracting(Collection::isEmpty)
 | 
			
		||||
                .isEqualTo(true);
 | 
			
		||||
            .isNotNull()
 | 
			
		||||
            .extracting(CollectionWithPagingInfo::getCollection)
 | 
			
		||||
            .isNotNull()
 | 
			
		||||
            .extracting(Collection::isEmpty)
 | 
			
		||||
            .isEqualTo(true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
@@ -180,7 +156,7 @@ public class RulesImplTest extends TestCase
 | 
			
		||||
 | 
			
		||||
            // when
 | 
			
		||||
            assertThatExceptionOfType(exception.getClass()).isThrownBy(
 | 
			
		||||
                    () -> rules.getRules(FOLDER_NODE_ID, RULE_SET_ID, INCLUDE, PAGING));
 | 
			
		||||
                () -> rules.getRules(FOLDER_NODE_ID, RULE_SET_ID, paging));
 | 
			
		||||
 | 
			
		||||
            then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, false);
 | 
			
		||||
            then(nodeValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
@@ -194,15 +170,15 @@ public class RulesImplTest extends TestCase
 | 
			
		||||
        for (Exception exception : ruleSetValidationExceptions())
 | 
			
		||||
        {
 | 
			
		||||
            Mockito.reset(nodeValidatorMock);
 | 
			
		||||
            given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(FOLDER_NODE_REF);
 | 
			
		||||
            given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(folderNodeRef);
 | 
			
		||||
            given(nodeValidatorMock.validateRuleSetNode(any(), any())).willThrow(exception);
 | 
			
		||||
 | 
			
		||||
            // when
 | 
			
		||||
            assertThatExceptionOfType(exception.getClass()).isThrownBy(
 | 
			
		||||
                    () -> rules.getRules(FOLDER_NODE_ID, RULE_SET_ID, INCLUDE, PAGING));
 | 
			
		||||
                () -> rules.getRules(FOLDER_NODE_ID, RULE_SET_ID, paging));
 | 
			
		||||
 | 
			
		||||
            then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, false);
 | 
			
		||||
            then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
 | 
			
		||||
            then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef);
 | 
			
		||||
            then(nodeValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
            then(ruleServiceMock).shouldHaveNoInteractions();
 | 
			
		||||
        }
 | 
			
		||||
@@ -211,17 +187,23 @@ public class RulesImplTest extends TestCase
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testGetRuleById()
 | 
			
		||||
    {
 | 
			
		||||
        given(ruleServiceMock.getRule(any())).willReturn(createRule(RULE_ID));
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        final Rule rule = rules.getRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID, INCLUDE);
 | 
			
		||||
        final Rule rule = rules.getRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID);
 | 
			
		||||
 | 
			
		||||
        then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, false);
 | 
			
		||||
        then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
 | 
			
		||||
        then(nodeValidatorMock).should().validateRuleNode(RULE_ID, RULE_SET_NODE_REF);
 | 
			
		||||
        then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef);
 | 
			
		||||
        then(nodeValidatorMock).should().validateRuleNode(RULE_ID, ruleSetNodeRef);
 | 
			
		||||
        then(nodeValidatorMock).should().isRuleSetNotNullAndShared(ruleSetNodeRef);
 | 
			
		||||
        then(nodeValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(nodesMock).shouldHaveNoInteractions();
 | 
			
		||||
        then(ruleServiceMock).should().getRule(RULE_NODE_REF);
 | 
			
		||||
        then(ruleServiceMock).should().getRule(ruleNodeRef);
 | 
			
		||||
        then(ruleServiceMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        assertThat(rule).isEqualTo(ruleMock);
 | 
			
		||||
        assertThat(rule)
 | 
			
		||||
                .isNotNull()
 | 
			
		||||
            .extracting(Rule::getId)
 | 
			
		||||
                .isEqualTo(RULE_ID);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
@@ -234,7 +216,7 @@ public class RulesImplTest extends TestCase
 | 
			
		||||
 | 
			
		||||
            // when
 | 
			
		||||
            assertThatExceptionOfType(exception.getClass()).isThrownBy(
 | 
			
		||||
                    () -> rules.getRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID, INCLUDE));
 | 
			
		||||
                () -> rules.getRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID));
 | 
			
		||||
 | 
			
		||||
            then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, false);
 | 
			
		||||
            then(nodeValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
@@ -248,15 +230,15 @@ public class RulesImplTest extends TestCase
 | 
			
		||||
        for (Exception exception : ruleSetValidationExceptions())
 | 
			
		||||
        {
 | 
			
		||||
            Mockito.reset(nodeValidatorMock);
 | 
			
		||||
            given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(FOLDER_NODE_REF);
 | 
			
		||||
            given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(folderNodeRef);
 | 
			
		||||
            given(nodeValidatorMock.validateRuleSetNode(any(), any())).willThrow(exception);
 | 
			
		||||
 | 
			
		||||
            // when
 | 
			
		||||
            assertThatExceptionOfType(exception.getClass()).isThrownBy(
 | 
			
		||||
                    () -> rules.getRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID, INCLUDE));
 | 
			
		||||
                () -> rules.getRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID));
 | 
			
		||||
 | 
			
		||||
            then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, false);
 | 
			
		||||
            then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
 | 
			
		||||
            then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef);
 | 
			
		||||
            then(nodeValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
            then(ruleServiceMock).shouldHaveNoInteractions();
 | 
			
		||||
        }
 | 
			
		||||
@@ -268,76 +250,71 @@ public class RulesImplTest extends TestCase
 | 
			
		||||
        for (Exception exception : ruleValidationExceptions())
 | 
			
		||||
        {
 | 
			
		||||
            Mockito.reset(nodeValidatorMock);
 | 
			
		||||
            given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(FOLDER_NODE_REF);
 | 
			
		||||
            given(nodeValidatorMock.validateRuleSetNode(any(), any())).willReturn(RULE_SET_NODE_REF);
 | 
			
		||||
            given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(folderNodeRef);
 | 
			
		||||
            given(nodeValidatorMock.validateRuleSetNode(any(), any())).willReturn(ruleSetNodeRef);
 | 
			
		||||
            given(nodeValidatorMock.validateRuleNode(any(), any())).willThrow(exception);
 | 
			
		||||
 | 
			
		||||
            // when
 | 
			
		||||
            assertThatExceptionOfType(exception.getClass()).isThrownBy(
 | 
			
		||||
                    () -> rules.getRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID, INCLUDE));
 | 
			
		||||
                () -> rules.getRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID));
 | 
			
		||||
 | 
			
		||||
            then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, false);
 | 
			
		||||
            then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
 | 
			
		||||
            then(nodeValidatorMock).should().validateRuleNode(RULE_ID, RULE_SET_NODE_REF);
 | 
			
		||||
            then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef);
 | 
			
		||||
            then(nodeValidatorMock).should().validateRuleNode(RULE_ID, ruleSetNodeRef);
 | 
			
		||||
            then(nodeValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
            then(ruleServiceMock).shouldHaveNoInteractions();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Create a single rule.
 | 
			
		||||
     */
 | 
			
		||||
    /** Create a single rule. */
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testCreateRules()
 | 
			
		||||
    {
 | 
			
		||||
        List<Rule> ruleList = List.of(ruleMock);
 | 
			
		||||
        given(ruleMock.toServiceModel(nodesMock, namespaceService)).willReturn(serviceRuleMock);
 | 
			
		||||
        given(serviceRuleMock.getAction()).willReturn(compositeAction);
 | 
			
		||||
        given(ruleServiceMock.saveRule(FOLDER_NODE_REF, serviceRuleMock)).willAnswer(arg -> arg.getArguments()[1]);
 | 
			
		||||
        given(ruleLoaderMock.loadRule(serviceRuleMock, INCLUDE)).willReturn(ruleMock);
 | 
			
		||||
        given(actionPermissionValidatorMock.validateRulePermissions(any())).willAnswer(arg -> arg.getArguments()[0]);
 | 
			
		||||
        Rule ruleBody = mock(Rule.class);
 | 
			
		||||
        List<Rule> ruleList = List.of(ruleBody);
 | 
			
		||||
        org.alfresco.service.cmr.rule.Rule serviceRuleBody = mock(org.alfresco.service.cmr.rule.Rule.class);
 | 
			
		||||
        given(ruleBody.toServiceModel(nodesMock)).willReturn(serviceRuleBody);
 | 
			
		||||
        org.alfresco.service.cmr.rule.Rule serviceRule = mock(org.alfresco.service.cmr.rule.Rule.class);
 | 
			
		||||
        given(ruleServiceMock.saveRule(folderNodeRef, serviceRuleBody)).willReturn(serviceRule);
 | 
			
		||||
        given(serviceRule.getNodeRef()).willReturn(ruleNodeRef);
 | 
			
		||||
        given(serviceRule.getAction()).willReturn(action);
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        List<Rule> actual = rules.createRules(FOLDER_NODE_REF.getId(), RULE_SET_NODE_REF.getId(), ruleList, INCLUDE);
 | 
			
		||||
        List<Rule> actual = rules.createRules(folderNodeRef.getId(), ruleSetNodeRef.getId(), ruleList);
 | 
			
		||||
 | 
			
		||||
        then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true);
 | 
			
		||||
        then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
 | 
			
		||||
        then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef);
 | 
			
		||||
        then(nodeValidatorMock).should().isRuleSetNotNullAndShared(ruleSetNodeRef, folderNodeRef);
 | 
			
		||||
        then(nodeValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(actionParameterConverterMock).should().getConvertedParams(DUMMY_PARAMS, ACTION_DEFINITION_NAME);
 | 
			
		||||
        then(actionParameterConverterMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(actionPermissionValidatorMock).should().validateRulePermissions(serviceRuleMock);
 | 
			
		||||
        then(actionPermissionValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(ruleServiceMock).should().saveRule(FOLDER_NODE_REF, ruleMock.toServiceModel(nodesMock, namespaceService));
 | 
			
		||||
        then(nodeValidatorMock).should().isRuleSetNotNullAndShared(ruleSetNodeRef, folderNodeRef);
 | 
			
		||||
        then(ruleServiceMock).should().saveRule(folderNodeRef, ruleBody.toServiceModel(nodesMock));
 | 
			
		||||
        then(ruleServiceMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        List<Rule> expected = List.of(ruleMock);
 | 
			
		||||
        List<Rule> expected = List.of(Rule.from(serviceRule, false));
 | 
			
		||||
        assertThat(actual).isEqualTo(expected);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check that when passing the default rule set then we don't perform any validation around the rule set node.
 | 
			
		||||
     */
 | 
			
		||||
    /** Check that when passing the default rule set then we don't perform any validation around the rule set node. */
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testCreateRules_defaultRuleSet()
 | 
			
		||||
    {
 | 
			
		||||
        List<Rule> ruleList = List.of(ruleMock);
 | 
			
		||||
        given(ruleMock.toServiceModel(nodesMock, namespaceService)).willReturn(serviceRuleMock);
 | 
			
		||||
        given(ruleServiceMock.saveRule(FOLDER_NODE_REF, serviceRuleMock)).willAnswer(arg -> arg.getArguments()[1]);
 | 
			
		||||
        given(ruleLoaderMock.loadRule(serviceRuleMock, INCLUDE)).willReturn(ruleMock);
 | 
			
		||||
        given(serviceRuleMock.getAction()).willReturn(compositeAction);
 | 
			
		||||
        given(actionPermissionValidatorMock.validateRulePermissions(any())).willAnswer(arg -> arg.getArguments()[0]);
 | 
			
		||||
        Rule ruleBody = mock(Rule.class);
 | 
			
		||||
        List<Rule> ruleList = List.of(ruleBody);
 | 
			
		||||
        org.alfresco.service.cmr.rule.Rule serviceRuleBody = mock(org.alfresco.service.cmr.rule.Rule.class);
 | 
			
		||||
        given(ruleBody.toServiceModel(nodesMock)).willReturn(serviceRuleBody);
 | 
			
		||||
        org.alfresco.service.cmr.rule.Rule serviceRule = mock(org.alfresco.service.cmr.rule.Rule.class);
 | 
			
		||||
        given(ruleServiceMock.saveRule(folderNodeRef, serviceRuleBody)).willReturn(serviceRule);
 | 
			
		||||
        given(serviceRule.getNodeRef()).willReturn(ruleNodeRef);
 | 
			
		||||
        given(serviceRule.getAction()).willReturn(action);
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        List<Rule> actual = rules.createRules(FOLDER_NODE_REF.getId(), DEFAULT_ID, ruleList, INCLUDE);
 | 
			
		||||
        List<Rule> actual = rules.createRules(folderNodeRef.getId(), DEFAULT_ID, ruleList);
 | 
			
		||||
 | 
			
		||||
        then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true);
 | 
			
		||||
        then(nodeValidatorMock).should().isRuleSetNotNullAndShared(null, folderNodeRef);
 | 
			
		||||
        then(nodeValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(actionParameterConverterMock).should().getConvertedParams(DUMMY_PARAMS, ACTION_DEFINITION_NAME);
 | 
			
		||||
        then(actionParameterConverterMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(actionPermissionValidatorMock).should().validateRulePermissions(serviceRuleMock);
 | 
			
		||||
        then(actionPermissionValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(ruleServiceMock).should().saveRule(FOLDER_NODE_REF, ruleMock.toServiceModel(nodesMock, namespaceService));
 | 
			
		||||
        then(ruleServiceMock).should().saveRule(folderNodeRef, ruleBody.toServiceModel(nodesMock));
 | 
			
		||||
        then(ruleServiceMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        List<Rule> expected = List.of(ruleMock);
 | 
			
		||||
        List<Rule> expected = List.of(Rule.from(serviceRule, false));
 | 
			
		||||
        assertThat(actual).isEqualTo(expected);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -347,49 +324,43 @@ public class RulesImplTest extends TestCase
 | 
			
		||||
        List<Rule> ruleList = emptyList();
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        List<Rule> actual = rules.createRules(FOLDER_NODE_REF.getId(), RULE_SET_NODE_REF.getId(), ruleList, INCLUDE);
 | 
			
		||||
        List<Rule> actual = rules.createRules(folderNodeRef.getId(), ruleSetNodeRef.getId(), ruleList);
 | 
			
		||||
 | 
			
		||||
        then(ruleServiceMock).shouldHaveNoInteractions();
 | 
			
		||||
        assertThat(actual).isEqualTo(emptyList());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Create three rules in a single call and check they are all passed to the RuleService.
 | 
			
		||||
     */
 | 
			
		||||
    /** Create three rules in a single call and check they are all passed to the RuleService. */
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testCreateRules_createMultipleRules()
 | 
			
		||||
    {
 | 
			
		||||
        List<Rule> ruleBodyList = new ArrayList<>();
 | 
			
		||||
        List<Rule> expected = new ArrayList<>();
 | 
			
		||||
        IntStream.range(0, 3).forEach(i -> {
 | 
			
		||||
            Rule ruleBodyMock = mock(Rule.class);
 | 
			
		||||
            ruleBodyList.add(ruleBodyMock);
 | 
			
		||||
            org.alfresco.service.cmr.rule.Rule serviceRuleMockInner = mock(org.alfresco.service.cmr.rule.Rule.class);
 | 
			
		||||
            given(ruleBodyMock.toServiceModel(nodesMock, namespaceService)).willReturn(serviceRuleMockInner);
 | 
			
		||||
            final CompositeAction compositeActionInner = new CompositeActionImpl(RULE_NODE_REF, "compositeActionInnerId");
 | 
			
		||||
            compositeActionInner.addAction(new ActionImpl(FOLDER_NODE_REF, "actionInnerId", ACTION_DEFINITION_NAME, DUMMY_PARAMS));
 | 
			
		||||
            given(serviceRuleMockInner.getAction()).willReturn(compositeActionInner);
 | 
			
		||||
            given(ruleServiceMock.saveRule(FOLDER_NODE_REF, serviceRuleMockInner)).willAnswer(arg -> arg.getArguments()[1]);
 | 
			
		||||
            Rule ruleMockInner = mock(Rule.class);
 | 
			
		||||
            given(ruleLoaderMock.loadRule(serviceRuleMockInner, INCLUDE)).willReturn(ruleMockInner);
 | 
			
		||||
            expected.add(ruleMockInner);
 | 
			
		||||
            given(actionPermissionValidatorMock.validateRulePermissions(any())).willAnswer(arg -> arg.getArguments()[0]);
 | 
			
		||||
        });
 | 
			
		||||
        for (String ruleId : List.of("A", "B", "C"))
 | 
			
		||||
        {
 | 
			
		||||
            Rule ruleBody = mock(Rule.class);
 | 
			
		||||
            ruleBodyList.add(ruleBody);
 | 
			
		||||
            org.alfresco.service.cmr.rule.Rule serviceRuleBody = mock(org.alfresco.service.cmr.rule.Rule.class);
 | 
			
		||||
            given(ruleBody.toServiceModel(nodesMock)).willReturn(serviceRuleBody);
 | 
			
		||||
            org.alfresco.service.cmr.rule.Rule serviceRule = mock(org.alfresco.service.cmr.rule.Rule.class);
 | 
			
		||||
            given(ruleServiceMock.saveRule(folderNodeRef, serviceRuleBody)).willReturn(serviceRule);
 | 
			
		||||
            NodeRef ruleNodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, ruleId);
 | 
			
		||||
            given(serviceRule.getNodeRef()).willReturn(ruleNodeRef);
 | 
			
		||||
            given(serviceRule.getAction()).willReturn(action);
 | 
			
		||||
            expected.add(Rule.from(serviceRule, false));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        List<Rule> actual = rules.createRules(FOLDER_NODE_REF.getId(), RULE_SET_NODE_REF.getId(), ruleBodyList, INCLUDE);
 | 
			
		||||
        List<Rule> actual = rules.createRules(folderNodeRef.getId(), ruleSetNodeRef.getId(), ruleBodyList);
 | 
			
		||||
 | 
			
		||||
        then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true);
 | 
			
		||||
        then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
 | 
			
		||||
        then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef);
 | 
			
		||||
        then(nodeValidatorMock).should(times(ruleBodyList.size())).isRuleSetNotNullAndShared(ruleSetNodeRef, folderNodeRef);
 | 
			
		||||
        then(nodeValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        for (Rule ruleBody : ruleBodyList)
 | 
			
		||||
        {
 | 
			
		||||
            then(actionPermissionValidatorMock).should().validateRulePermissions(ruleBody.toServiceModel(nodesMock, namespaceService));
 | 
			
		||||
            then(ruleServiceMock).should().saveRule(FOLDER_NODE_REF, ruleBody.toServiceModel(nodesMock, namespaceService));
 | 
			
		||||
            then(ruleServiceMock).should().saveRule(folderNodeRef, ruleBody.toServiceModel(nodesMock));
 | 
			
		||||
        }
 | 
			
		||||
        then(actionParameterConverterMock).should(times(3)).getConvertedParams(DUMMY_PARAMS, ACTION_DEFINITION_NAME);
 | 
			
		||||
        then(actionParameterConverterMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(actionPermissionValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(ruleServiceMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        assertThat(actual).isEqualTo(expected);
 | 
			
		||||
    }
 | 
			
		||||
@@ -404,7 +375,7 @@ public class RulesImplTest extends TestCase
 | 
			
		||||
 | 
			
		||||
            // when
 | 
			
		||||
            assertThatExceptionOfType(exception.getClass()).isThrownBy(
 | 
			
		||||
                    () -> rules.createRules(FOLDER_NODE_REF.getId(), RULE_SET_NODE_REF.getId(), emptyList(), INCLUDE));
 | 
			
		||||
                () -> rules.createRules(folderNodeRef.getId(), ruleSetNodeRef.getId(), emptyList()));
 | 
			
		||||
 | 
			
		||||
            then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true);
 | 
			
		||||
            then(nodeValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
@@ -418,46 +389,52 @@ public class RulesImplTest extends TestCase
 | 
			
		||||
        for (Exception exception : ruleSetValidationExceptions())
 | 
			
		||||
        {
 | 
			
		||||
            Mockito.reset(nodeValidatorMock);
 | 
			
		||||
            given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(FOLDER_NODE_REF);
 | 
			
		||||
            given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(folderNodeRef);
 | 
			
		||||
            given(nodeValidatorMock.validateRuleSetNode(any(), any())).willThrow(exception);
 | 
			
		||||
 | 
			
		||||
            // when
 | 
			
		||||
            assertThatExceptionOfType(exception.getClass()).isThrownBy(
 | 
			
		||||
                    () -> rules.createRules(FOLDER_NODE_REF.getId(), RULE_SET_NODE_REF.getId(), emptyList(), INCLUDE));
 | 
			
		||||
                () -> rules.createRules(folderNodeRef.getId(), ruleSetNodeRef.getId(), emptyList()));
 | 
			
		||||
 | 
			
		||||
            then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true);
 | 
			
		||||
            then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
 | 
			
		||||
            then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef);
 | 
			
		||||
            then(nodeValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
            then(ruleServiceMock).shouldHaveNoInteractions();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check that we can update a rule.
 | 
			
		||||
     */
 | 
			
		||||
    /** Check that we can update a rule. */
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testUpdateRuleById()
 | 
			
		||||
    {
 | 
			
		||||
        given(ruleMock.toServiceModel(nodesMock, namespaceService)).willReturn(serviceRuleMock);
 | 
			
		||||
        given(ruleServiceMock.saveRule(FOLDER_NODE_REF, serviceRuleMock)).willAnswer(a -> a.getArguments()[1]);
 | 
			
		||||
        given(serviceRuleMock.getAction()).willReturn(compositeAction);
 | 
			
		||||
        given(ruleLoaderMock.loadRule(serviceRuleMock, INCLUDE)).willReturn(ruleMock);
 | 
			
		||||
        given(actionPermissionValidatorMock.validateRulePermissions(any())).willAnswer(arg -> arg.getArguments()[0]);
 | 
			
		||||
        Rule ruleBody = mock(Rule.class);
 | 
			
		||||
        given(nodeValidatorMock.isRuleSetNotNullAndShared(any(), any())).willReturn(true);
 | 
			
		||||
        org.alfresco.service.cmr.rule.Rule serviceRuleBody = mock(org.alfresco.service.cmr.rule.Rule.class);
 | 
			
		||||
        given(ruleBody.toServiceModel(nodesMock)).willReturn(serviceRuleBody);
 | 
			
		||||
        org.alfresco.service.cmr.rule.Rule serviceRule = mock(org.alfresco.service.cmr.rule.Rule.class);
 | 
			
		||||
        given(ruleServiceMock.saveRule(folderNodeRef, serviceRuleBody)).willReturn(serviceRule);
 | 
			
		||||
        given(serviceRule.getNodeRef()).willReturn(ruleNodeRef);
 | 
			
		||||
        given(serviceRule.getAction()).willReturn(action);
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        Rule updatedRule = rules.updateRuleById(FOLDER_NODE_REF.getId(), RULE_SET_NODE_REF.getId(), RULE_ID, ruleMock, INCLUDE);
 | 
			
		||||
        Rule updatedRule = rules.updateRuleById(folderNodeRef.getId(), ruleSetNodeRef.getId(), RULE_ID, ruleBody);
 | 
			
		||||
 | 
			
		||||
        then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true);
 | 
			
		||||
        then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
 | 
			
		||||
        then(nodeValidatorMock).should().validateRuleNode(RULE_ID, RULE_SET_NODE_REF);
 | 
			
		||||
        then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef);
 | 
			
		||||
        then(nodeValidatorMock).should().validateRuleNode(RULE_ID, ruleSetNodeRef);
 | 
			
		||||
        then(nodeValidatorMock).should().isRuleSetNotNullAndShared(ruleSetNodeRef, folderNodeRef);
 | 
			
		||||
        then(nodeValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(ruleServiceMock).should().saveRule(FOLDER_NODE_REF, serviceRuleMock);
 | 
			
		||||
        then(ruleServiceMock).should().saveRule(folderNodeRef, serviceRuleBody);
 | 
			
		||||
        then(ruleServiceMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(actionParameterConverterMock).should().getConvertedParams(DUMMY_PARAMS, ACTION_DEFINITION_NAME);
 | 
			
		||||
        then(actionParameterConverterMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(actionPermissionValidatorMock).should().validateRulePermissions(serviceRuleMock);
 | 
			
		||||
        then(actionPermissionValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        assertThat(updatedRule).isEqualTo(ruleMock);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        Rule expected = Rule.builder().id(RULE_ID)
 | 
			
		||||
                                      .enabled(true)
 | 
			
		||||
                                      .shared(true)
 | 
			
		||||
                                      .triggers(emptyList())
 | 
			
		||||
                                      .conditions(CompositeCondition.builder().inverted(false).create())
 | 
			
		||||
                                      .create();
 | 
			
		||||
        assertThat(updatedRule).isEqualTo(expected);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
@@ -470,7 +447,7 @@ public class RulesImplTest extends TestCase
 | 
			
		||||
 | 
			
		||||
            // when
 | 
			
		||||
            assertThatExceptionOfType(exception.getClass()).isThrownBy(
 | 
			
		||||
                    () -> rules.updateRuleById(FOLDER_NODE_REF.getId(), RULE_SET_NODE_REF.getId(), RULE_ID, mock(Rule.class), INCLUDE));
 | 
			
		||||
                () -> rules.updateRuleById(folderNodeRef.getId(), ruleSetNodeRef.getId(), RULE_ID, mock(Rule.class)));
 | 
			
		||||
 | 
			
		||||
            then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true);
 | 
			
		||||
            then(nodeValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
@@ -484,15 +461,15 @@ public class RulesImplTest extends TestCase
 | 
			
		||||
        for (Exception exception : ruleSetValidationExceptions())
 | 
			
		||||
        {
 | 
			
		||||
            Mockito.reset(nodeValidatorMock);
 | 
			
		||||
            given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(FOLDER_NODE_REF);
 | 
			
		||||
            given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(folderNodeRef);
 | 
			
		||||
            given(nodeValidatorMock.validateRuleSetNode(any(), any())).willThrow(exception);
 | 
			
		||||
 | 
			
		||||
            // when
 | 
			
		||||
            assertThatExceptionOfType(exception.getClass()).isThrownBy(
 | 
			
		||||
                    () -> rules.updateRuleById(FOLDER_NODE_REF.getId(), RULE_SET_NODE_REF.getId(), RULE_ID, mock(Rule.class), INCLUDE));
 | 
			
		||||
                () -> rules.updateRuleById(folderNodeRef.getId(), ruleSetNodeRef.getId(), RULE_ID, mock(Rule.class)));
 | 
			
		||||
 | 
			
		||||
            then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true);
 | 
			
		||||
            then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
 | 
			
		||||
            then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef);
 | 
			
		||||
            then(nodeValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
            then(ruleServiceMock).shouldHaveNoInteractions();
 | 
			
		||||
        }
 | 
			
		||||
@@ -504,35 +481,37 @@ public class RulesImplTest extends TestCase
 | 
			
		||||
        for (Exception exception : ruleValidationExceptions())
 | 
			
		||||
        {
 | 
			
		||||
            Mockito.reset(nodeValidatorMock);
 | 
			
		||||
            given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(FOLDER_NODE_REF);
 | 
			
		||||
            given(nodeValidatorMock.validateRuleSetNode(any(), any())).willReturn(RULE_SET_NODE_REF);
 | 
			
		||||
            given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(folderNodeRef);
 | 
			
		||||
            given(nodeValidatorMock.validateRuleSetNode(any(), any())).willReturn(ruleSetNodeRef);
 | 
			
		||||
            given(nodeValidatorMock.validateRuleNode(any(), any())).willThrow(exception);
 | 
			
		||||
 | 
			
		||||
            // when
 | 
			
		||||
            assertThatExceptionOfType(exception.getClass()).isThrownBy(
 | 
			
		||||
                    () -> rules.updateRuleById(FOLDER_NODE_REF.getId(), RULE_SET_NODE_REF.getId(), RULE_ID, mock(Rule.class), INCLUDE));
 | 
			
		||||
                () -> rules.updateRuleById(folderNodeRef.getId(), ruleSetNodeRef.getId(), RULE_ID, mock(Rule.class)));
 | 
			
		||||
 | 
			
		||||
            then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true);
 | 
			
		||||
            then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
 | 
			
		||||
            then(nodeValidatorMock).should().validateRuleNode(RULE_ID, RULE_SET_NODE_REF);
 | 
			
		||||
            then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef);
 | 
			
		||||
            then(nodeValidatorMock).should().validateRuleNode(RULE_ID, ruleSetNodeRef);
 | 
			
		||||
            then(nodeValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
            then(ruleServiceMock).shouldHaveNoInteractions();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testDeleteRuleById()
 | 
			
		||||
    {
 | 
			
		||||
    public void testDeleteRuleById() {
 | 
			
		||||
        org.alfresco.service.cmr.rule.Rule rule = createRule(RULE_ID);
 | 
			
		||||
        given(ruleServiceMock.getRule(any())).willReturn(rule);
 | 
			
		||||
 | 
			
		||||
        //when
 | 
			
		||||
        rules.deleteRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID);
 | 
			
		||||
 | 
			
		||||
        then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true);
 | 
			
		||||
        then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
 | 
			
		||||
        then(nodeValidatorMock).should().validateRuleNode(RULE_ID, RULE_SET_NODE_REF);
 | 
			
		||||
        then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef);
 | 
			
		||||
        then(nodeValidatorMock).should().validateRuleNode(RULE_ID, ruleSetNodeRef);
 | 
			
		||||
        then(nodeValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        then(nodesMock).shouldHaveNoInteractions();
 | 
			
		||||
        then(ruleServiceMock).should().getRule(RULE_NODE_REF);
 | 
			
		||||
        then(ruleServiceMock).should().removeRule(FOLDER_NODE_REF, ruleModel);
 | 
			
		||||
        then(ruleServiceMock).should().getRule(ruleNodeRef);
 | 
			
		||||
        then(ruleServiceMock).should().removeRule(folderNodeRef, rule);
 | 
			
		||||
        then(ruleServiceMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -546,7 +525,7 @@ public class RulesImplTest extends TestCase
 | 
			
		||||
 | 
			
		||||
            // when
 | 
			
		||||
            assertThatExceptionOfType(exception.getClass()).isThrownBy(
 | 
			
		||||
                    () -> rules.deleteRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID));
 | 
			
		||||
                () -> rules.deleteRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID));
 | 
			
		||||
 | 
			
		||||
            then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true);
 | 
			
		||||
            then(nodeValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
@@ -560,15 +539,15 @@ public class RulesImplTest extends TestCase
 | 
			
		||||
        for (Exception exception : ruleSetValidationExceptions())
 | 
			
		||||
        {
 | 
			
		||||
            Mockito.reset(nodeValidatorMock);
 | 
			
		||||
            given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(FOLDER_NODE_REF);
 | 
			
		||||
            given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(folderNodeRef);
 | 
			
		||||
            given(nodeValidatorMock.validateRuleSetNode(any(), any())).willThrow(exception);
 | 
			
		||||
 | 
			
		||||
            // when
 | 
			
		||||
            assertThatExceptionOfType(exception.getClass()).isThrownBy(
 | 
			
		||||
                    () -> rules.deleteRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID));
 | 
			
		||||
                () -> rules.deleteRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID));
 | 
			
		||||
 | 
			
		||||
            then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true);
 | 
			
		||||
            then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
 | 
			
		||||
            then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef);
 | 
			
		||||
            then(nodeValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
            then(ruleServiceMock).shouldHaveNoInteractions();
 | 
			
		||||
        }
 | 
			
		||||
@@ -580,28 +559,28 @@ public class RulesImplTest extends TestCase
 | 
			
		||||
        for (Exception exception : ruleValidationExceptions())
 | 
			
		||||
        {
 | 
			
		||||
            Mockito.reset(nodeValidatorMock);
 | 
			
		||||
            given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(FOLDER_NODE_REF);
 | 
			
		||||
            given(nodeValidatorMock.validateRuleSetNode(any(), any())).willReturn(RULE_SET_NODE_REF);
 | 
			
		||||
            given(nodeValidatorMock.validateFolderNode(any(), anyBoolean())).willReturn(folderNodeRef);
 | 
			
		||||
            given(nodeValidatorMock.validateRuleSetNode(any(), any())).willReturn(ruleSetNodeRef);
 | 
			
		||||
            given(nodeValidatorMock.validateRuleNode(any(), any())).willThrow(exception);
 | 
			
		||||
 | 
			
		||||
            // when
 | 
			
		||||
            assertThatExceptionOfType(exception.getClass()).isThrownBy(
 | 
			
		||||
                    () -> rules.deleteRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID));
 | 
			
		||||
                () -> rules.deleteRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID));
 | 
			
		||||
 | 
			
		||||
            then(nodeValidatorMock).should().validateFolderNode(FOLDER_NODE_ID, true);
 | 
			
		||||
            then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, FOLDER_NODE_REF);
 | 
			
		||||
            then(nodeValidatorMock).should().validateRuleNode(RULE_ID, RULE_SET_NODE_REF);
 | 
			
		||||
            then(nodeValidatorMock).should().validateRuleSetNode(RULE_SET_ID, folderNodeRef);
 | 
			
		||||
            then(nodeValidatorMock).should().validateRuleNode(RULE_ID, ruleSetNodeRef);
 | 
			
		||||
            then(nodeValidatorMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
            then(ruleServiceMock).shouldHaveNoInteractions();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static org.alfresco.service.cmr.rule.Rule createRule(final String id)
 | 
			
		||||
    {
 | 
			
		||||
    private static org.alfresco.service.cmr.rule.Rule createRule(final String id) {
 | 
			
		||||
        final NodeRef nodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, id);
 | 
			
		||||
        final org.alfresco.service.cmr.rule.Rule rule = new org.alfresco.service.cmr.rule.Rule();
 | 
			
		||||
        rule.setNodeRef(nodeRef);
 | 
			
		||||
        rule.setRuleType("ruleType");
 | 
			
		||||
        rule.setAction(action);
 | 
			
		||||
 | 
			
		||||
        return rule;
 | 
			
		||||
    }
 | 
			
		||||
@@ -609,27 +588,27 @@ public class RulesImplTest extends TestCase
 | 
			
		||||
    private static List<Exception> folderValidationExceptions()
 | 
			
		||||
    {
 | 
			
		||||
        return List.of(
 | 
			
		||||
                new EntityNotFoundException(FOLDER_NODE_ID),
 | 
			
		||||
                new InvalidArgumentException(),
 | 
			
		||||
                new PermissionDeniedException()
 | 
			
		||||
            new EntityNotFoundException(FOLDER_NODE_ID),
 | 
			
		||||
            new InvalidArgumentException(),
 | 
			
		||||
            new PermissionDeniedException()
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static List<Exception> ruleSetValidationExceptions()
 | 
			
		||||
    {
 | 
			
		||||
        return List.of(
 | 
			
		||||
                new EntityNotFoundException(RULE_SET_ID),
 | 
			
		||||
                new InvalidArgumentException(),
 | 
			
		||||
                new RelationshipResourceNotFoundException(RULE_SET_ID, "fake-relationship-id")
 | 
			
		||||
            new EntityNotFoundException(RULE_SET_ID),
 | 
			
		||||
            new InvalidArgumentException(),
 | 
			
		||||
            new RelationshipResourceNotFoundException(RULE_SET_ID, "fake-relationship-id")
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static List<Exception> ruleValidationExceptions()
 | 
			
		||||
    {
 | 
			
		||||
        return List.of(
 | 
			
		||||
                new EntityNotFoundException(RULE_ID),
 | 
			
		||||
                new InvalidArgumentException(),
 | 
			
		||||
                new RelationshipResourceNotFoundException(RULE_ID, "fake-relationship-id")
 | 
			
		||||
            new EntityNotFoundException(RULE_ID),
 | 
			
		||||
            new InvalidArgumentException(),
 | 
			
		||||
            new RelationshipResourceNotFoundException(RULE_ID, "fake-relationship-id")
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,6 @@
 | 
			
		||||
package org.alfresco.rest.api.model.rules;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
import static org.mockito.Mockito.mock;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
@@ -40,18 +39,12 @@ import org.alfresco.repo.action.ActionConditionImpl;
 | 
			
		||||
import org.alfresco.repo.action.evaluator.ComparePropertyValueEvaluator;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.service.cmr.action.ActionCondition;
 | 
			
		||||
import org.alfresco.service.namespace.NamespaceService;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
import org.junit.runner.RunWith;
 | 
			
		||||
import org.mockito.junit.MockitoJUnitRunner;
 | 
			
		||||
 | 
			
		||||
@Experimental
 | 
			
		||||
@RunWith(MockitoJUnitRunner.class)
 | 
			
		||||
public class CompositeConditionTest
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    private final NamespaceService namespaceService = mock(NamespaceService.class);
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testFrom()
 | 
			
		||||
    {
 | 
			
		||||
@@ -71,7 +64,7 @@ public class CompositeConditionTest
 | 
			
		||||
        ));
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        final CompositeCondition actualCompositeCondition = CompositeCondition.from(actionConditions, namespaceService);
 | 
			
		||||
        final CompositeCondition actualCompositeCondition = CompositeCondition.from(actionConditions);
 | 
			
		||||
 | 
			
		||||
        assertThat(actualCompositeCondition).isNotNull().usingRecursiveComparison().isEqualTo(expectedCompositeCondition);
 | 
			
		||||
    }
 | 
			
		||||
@@ -83,7 +76,7 @@ public class CompositeConditionTest
 | 
			
		||||
        final CompositeCondition expectedCompositeCondition = CompositeCondition.builder().create();
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        final CompositeCondition actualCompositeCondition = CompositeCondition.from(actionConditions, namespaceService);
 | 
			
		||||
        final CompositeCondition actualCompositeCondition = CompositeCondition.from(actionConditions);
 | 
			
		||||
 | 
			
		||||
        assertThat(actualCompositeCondition).isNotNull().usingRecursiveComparison().isEqualTo(expectedCompositeCondition);
 | 
			
		||||
    }
 | 
			
		||||
@@ -92,7 +85,7 @@ public class CompositeConditionTest
 | 
			
		||||
    public void testFromNullValue()
 | 
			
		||||
    {
 | 
			
		||||
        // when
 | 
			
		||||
        final CompositeCondition actualCompositeCondition = CompositeCondition.from(null, namespaceService);
 | 
			
		||||
        final CompositeCondition actualCompositeCondition = CompositeCondition.from(null);
 | 
			
		||||
 | 
			
		||||
        assertThat(actualCompositeCondition).isNull();
 | 
			
		||||
    }
 | 
			
		||||
@@ -105,7 +98,7 @@ public class CompositeConditionTest
 | 
			
		||||
        final CompositeCondition expectedCompositeCondition = CompositeCondition.builder().create();
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        final CompositeCondition actualCompositeCondition = CompositeCondition.from(actionConditions, namespaceService);
 | 
			
		||||
        final CompositeCondition actualCompositeCondition = CompositeCondition.from(actionConditions);
 | 
			
		||||
 | 
			
		||||
        assertThat(actualCompositeCondition).isNotNull().usingRecursiveComparison().isEqualTo(expectedCompositeCondition);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -27,8 +27,6 @@
 | 
			
		||||
package org.alfresco.rest.api.model.rules;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
import static org.mockito.BDDMockito.then;
 | 
			
		||||
import static org.mockito.Mockito.mock;
 | 
			
		||||
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
@@ -36,19 +34,15 @@ import java.util.List;
 | 
			
		||||
import org.alfresco.repo.action.ActionConditionImpl;
 | 
			
		||||
import org.alfresco.repo.action.ActionImpl;
 | 
			
		||||
import org.alfresco.repo.action.executer.ScriptActionExecuter;
 | 
			
		||||
import org.alfresco.rest.api.Nodes;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.service.cmr.action.Action;
 | 
			
		||||
import org.alfresco.service.cmr.action.ActionCondition;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeRef;
 | 
			
		||||
import org.alfresco.service.cmr.repository.StoreRef;
 | 
			
		||||
import org.alfresco.service.cmr.rule.RuleType;
 | 
			
		||||
import org.alfresco.service.namespace.NamespaceService;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
import org.junit.runner.RunWith;
 | 
			
		||||
import org.mockito.junit.MockitoJUnitRunner;
 | 
			
		||||
 | 
			
		||||
@Experimental
 | 
			
		||||
@RunWith(MockitoJUnitRunner.class)
 | 
			
		||||
public class RuleTest
 | 
			
		||||
{
 | 
			
		||||
    private static final String RULE_ID = "fake-rule-id";
 | 
			
		||||
@@ -58,11 +52,8 @@ public class RuleTest
 | 
			
		||||
    private static final boolean RULE_CASCADE = true;
 | 
			
		||||
    private static final boolean RULE_ASYNC = true;
 | 
			
		||||
    private static final boolean RULE_SHARED = true;
 | 
			
		||||
    private static final String ACTION_DEFINITION_NAME = "action-def-name";
 | 
			
		||||
    private static final String ERROR_SCRIPT = "error-script-ref";
 | 
			
		||||
 | 
			
		||||
    private final NamespaceService namespaceService = mock(NamespaceService.class);
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testFrom()
 | 
			
		||||
    {
 | 
			
		||||
@@ -70,7 +61,7 @@ public class RuleTest
 | 
			
		||||
        final Rule expectedRule = createRuleWithDefaultValues();
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        final Rule actualRule = Rule.from(ruleModel, namespaceService);
 | 
			
		||||
        final Rule actualRule = Rule.from(ruleModel, RULE_SHARED);
 | 
			
		||||
 | 
			
		||||
        assertThat(actualRule).isNotNull().usingRecursiveComparison().isEqualTo(expectedRule);
 | 
			
		||||
 | 
			
		||||
@@ -83,71 +74,12 @@ public class RuleTest
 | 
			
		||||
        final Rule expectedRule = Rule.builder().enabled(true).create();
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        final Rule actualRule = Rule.from(ruleModel, namespaceService);
 | 
			
		||||
        final Rule actualRule = Rule.from(ruleModel, false);
 | 
			
		||||
 | 
			
		||||
        assertThat(actualRule).isNotNull().usingRecursiveComparison().isEqualTo(expectedRule);
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testToServiceModel()
 | 
			
		||||
    {
 | 
			
		||||
        final Nodes nodesMock = mock(Nodes.class);
 | 
			
		||||
        final Rule rule = createRuleWithDefaultValues();
 | 
			
		||||
        rule.setActions(List.of(Action.builder().actionDefinitionId(ACTION_DEFINITION_NAME).create()));
 | 
			
		||||
        final org.alfresco.service.cmr.rule.Rule expectedRuleModel = createRuleModel();
 | 
			
		||||
        final org.alfresco.service.cmr.action.Action expectedCompensatingActionModel = createCompensatingActionModel();
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        final org.alfresco.service.cmr.rule.Rule actualRuleModel = rule.toServiceModel(nodesMock, namespaceService);
 | 
			
		||||
 | 
			
		||||
        then(nodesMock).should().validateOrLookupNode(RULE_ID, null);
 | 
			
		||||
        then(nodesMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
        assertThat(actualRuleModel)
 | 
			
		||||
            .isNotNull()
 | 
			
		||||
            .usingRecursiveComparison().ignoringFields("nodeRef", "action")
 | 
			
		||||
            .isEqualTo(expectedRuleModel);
 | 
			
		||||
        assertThat(actualRuleModel.getAction())
 | 
			
		||||
            .isNotNull();
 | 
			
		||||
        assertThat(actualRuleModel.getAction().getCompensatingAction())
 | 
			
		||||
            .isNotNull()
 | 
			
		||||
            .usingRecursiveComparison().ignoringFields("id")
 | 
			
		||||
            .isEqualTo(expectedCompensatingActionModel);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testToServiceModel_withNullValues()
 | 
			
		||||
    {
 | 
			
		||||
        final Nodes nodesMock = mock(Nodes.class);
 | 
			
		||||
        final Rule rule = new Rule();
 | 
			
		||||
        final org.alfresco.service.cmr.rule.Rule expectedRuleModel = new org.alfresco.service.cmr.rule.Rule();
 | 
			
		||||
        expectedRuleModel.setRuleDisabled(true);
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        final org.alfresco.service.cmr.rule.Rule actualRuleModel = rule.toServiceModel(nodesMock, namespaceService);
 | 
			
		||||
 | 
			
		||||
        then(nodesMock).shouldHaveNoInteractions();
 | 
			
		||||
        assertThat(actualRuleModel)
 | 
			
		||||
            .isNotNull()
 | 
			
		||||
            .usingRecursiveComparison()
 | 
			
		||||
            .ignoringFields("ruleTypes")
 | 
			
		||||
            .isEqualTo(expectedRuleModel);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private Rule createRuleWithDefaultValues() {
 | 
			
		||||
        return Rule.builder()
 | 
			
		||||
            .id(RULE_ID)
 | 
			
		||||
            .name(RULE_NAME)
 | 
			
		||||
            .description(RULE_DESCRIPTION)
 | 
			
		||||
            .enabled(RULE_ENABLED)
 | 
			
		||||
            .cascade(RULE_CASCADE)
 | 
			
		||||
            .asynchronous(RULE_ASYNC)
 | 
			
		||||
            .triggers(List.of(RuleTrigger.INBOUND, RuleTrigger.UPDATE))
 | 
			
		||||
            .errorScript(ERROR_SCRIPT)
 | 
			
		||||
            .conditions(CompositeCondition.from(Collections.emptyList(), namespaceService))
 | 
			
		||||
            .create();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static org.alfresco.service.cmr.rule.Rule createRuleModel() {
 | 
			
		||||
        final NodeRef nodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, RULE_ID);
 | 
			
		||||
        final org.alfresco.service.cmr.rule.Rule ruleModel = new org.alfresco.service.cmr.rule.Rule(nodeRef);
 | 
			
		||||
@@ -157,24 +89,29 @@ public class RuleTest
 | 
			
		||||
        ruleModel.applyToChildren(RULE_CASCADE);
 | 
			
		||||
        ruleModel.setExecuteAsynchronously(RULE_ASYNC);
 | 
			
		||||
        ruleModel.setRuleTypes(List.of(RuleType.INBOUND, RuleType.UPDATE));
 | 
			
		||||
        ruleModel.setAction(createActionModel());
 | 
			
		||||
        final Action compensatingAction = new ActionImpl(nodeRef, "compensatingActionId", "compensatingActionDefName");
 | 
			
		||||
        compensatingAction.setParameterValue(ScriptActionExecuter.PARAM_SCRIPTREF, ERROR_SCRIPT);
 | 
			
		||||
        final ActionCondition actionCondition = new ActionConditionImpl("actionConditionId", "actionConditionDefName");
 | 
			
		||||
        final Action action = new ActionImpl(nodeRef, "actionId", "actionDefName");
 | 
			
		||||
        action.setCompensatingAction(compensatingAction);
 | 
			
		||||
        action.addActionCondition(actionCondition);
 | 
			
		||||
        ruleModel.setAction(action);
 | 
			
		||||
 | 
			
		||||
        return ruleModel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static org.alfresco.service.cmr.action.Action createActionModel() {
 | 
			
		||||
        final ActionCondition actionCondition = new ActionConditionImpl("action-condition-id", "action-condition-def-name");
 | 
			
		||||
        final org.alfresco.service.cmr.action.Action actionModel = new ActionImpl(null, "action-id", ACTION_DEFINITION_NAME);
 | 
			
		||||
        actionModel.setCompensatingAction(createCompensatingActionModel());
 | 
			
		||||
        actionModel.addActionCondition(actionCondition);
 | 
			
		||||
 | 
			
		||||
        return actionModel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static org.alfresco.service.cmr.action.Action createCompensatingActionModel() {
 | 
			
		||||
        final org.alfresco.service.cmr.action.Action compensatingActionModel = new ActionImpl(null, "compensating-action-id", ScriptActionExecuter.NAME);
 | 
			
		||||
        compensatingActionModel.setParameterValue(ScriptActionExecuter.PARAM_SCRIPTREF, ERROR_SCRIPT);
 | 
			
		||||
 | 
			
		||||
        return compensatingActionModel;
 | 
			
		||||
    private static Rule createRuleWithDefaultValues() {
 | 
			
		||||
        return Rule.builder()
 | 
			
		||||
            .id(RULE_ID)
 | 
			
		||||
            .name(RULE_NAME)
 | 
			
		||||
            .description(RULE_DESCRIPTION)
 | 
			
		||||
            .enabled(RULE_ENABLED)
 | 
			
		||||
            .cascade(RULE_CASCADE)
 | 
			
		||||
            .asynchronous(RULE_ASYNC)
 | 
			
		||||
            .shared(RULE_SHARED)
 | 
			
		||||
            .triggers(List.of(RuleTrigger.INBOUND, RuleTrigger.UPDATE))
 | 
			
		||||
            .errorScript(ERROR_SCRIPT)
 | 
			
		||||
            .conditions(CompositeCondition.from(Collections.emptyList()))
 | 
			
		||||
            .create();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -27,8 +27,6 @@
 | 
			
		||||
package org.alfresco.rest.api.model.rules;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
import static org.mockito.BDDMockito.given;
 | 
			
		||||
import static org.mockito.Mockito.mock;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
@@ -38,7 +36,6 @@ import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.model.ContentModel;
 | 
			
		||||
import org.alfresco.repo.action.ActionConditionImpl;
 | 
			
		||||
import org.alfresco.repo.action.evaluator.CompareMimeTypeEvaluator;
 | 
			
		||||
import org.alfresco.repo.action.evaluator.ComparePropertyValueEvaluator;
 | 
			
		||||
@@ -49,54 +46,28 @@ import org.alfresco.repo.action.evaluator.HasVersionHistoryEvaluator;
 | 
			
		||||
import org.alfresco.repo.action.evaluator.InCategoryEvaluator;
 | 
			
		||||
import org.alfresco.repo.action.evaluator.IsSubTypeEvaluator;
 | 
			
		||||
import org.alfresco.repo.action.evaluator.NoConditionEvaluator;
 | 
			
		||||
import org.alfresco.repo.action.evaluator.compare.ComparePropertyValueOperation;
 | 
			
		||||
import org.alfresco.repo.action.evaluator.compare.ContentPropertyName;
 | 
			
		||||
import org.alfresco.rest.api.Nodes;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.service.cmr.action.ActionCondition;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeRef;
 | 
			
		||||
import org.alfresco.service.cmr.repository.StoreRef;
 | 
			
		||||
import org.alfresco.service.namespace.NamespaceService;
 | 
			
		||||
import org.alfresco.service.namespace.QName;
 | 
			
		||||
import org.junit.Before;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
import org.junit.runner.RunWith;
 | 
			
		||||
import org.mockito.junit.MockitoJUnitRunner;
 | 
			
		||||
 | 
			
		||||
@Experimental
 | 
			
		||||
@RunWith(MockitoJUnitRunner.class)
 | 
			
		||||
public class SimpleConditionTest
 | 
			
		||||
{
 | 
			
		||||
    private static final boolean NULL_RESULT = true;
 | 
			
		||||
    private static final boolean NOT_INVERTED = false;
 | 
			
		||||
    private static final String PARAMETER_DEFAULT = "value";
 | 
			
		||||
 | 
			
		||||
    private final Nodes nodes = mock(Nodes.class);
 | 
			
		||||
    private final NamespaceService namespaceService = mock(NamespaceService.class);
 | 
			
		||||
 | 
			
		||||
    @Before
 | 
			
		||||
    public void setUp() throws Exception
 | 
			
		||||
    {
 | 
			
		||||
        given(namespaceService.getPrefixes(NamespaceService.CONTENT_MODEL_1_0_URI)).willReturn(List.of(NamespaceService.CONTENT_MODEL_PREFIX));
 | 
			
		||||
        given(namespaceService.getNamespaceURI(NamespaceService.CONTENT_MODEL_PREFIX)).willReturn(NamespaceService.CONTENT_MODEL_1_0_URI);
 | 
			
		||||
        given(namespaceService.getPrefixes(NamespaceService.AUDIO_MODEL_1_0_URI)).willReturn(List.of(NamespaceService.AUDIO_MODEL_PREFIX));
 | 
			
		||||
        given(namespaceService.getNamespaceURI(NamespaceService.AUDIO_MODEL_PREFIX)).willReturn(NamespaceService.AUDIO_MODEL_1_0_URI);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static List<TestData> getTestData() {
 | 
			
		||||
        return List.of(
 | 
			
		||||
            TestData.of(ComparePropertyValueEvaluator.NAME),
 | 
			
		||||
            TestData.of(CompareMimeTypeEvaluator.NAME),
 | 
			
		||||
            TestData.of(HasAspectEvaluator.NAME),
 | 
			
		||||
            TestData.of(HasChildEvaluator.NAME, NULL_RESULT),
 | 
			
		||||
            TestData.of(HasChildEvaluator.NAME),
 | 
			
		||||
            TestData.of(HasTagEvaluator.NAME),
 | 
			
		||||
            TestData.of(HasVersionHistoryEvaluator.NAME, NULL_RESULT),
 | 
			
		||||
            TestData.of(HasVersionHistoryEvaluator.NAME),
 | 
			
		||||
            TestData.of(InCategoryEvaluator.NAME),
 | 
			
		||||
            TestData.of(IsSubTypeEvaluator.NAME),
 | 
			
		||||
            TestData.of(NoConditionEvaluator.NAME, NULL_RESULT),
 | 
			
		||||
            TestData.of("fake-definition-name", NULL_RESULT),
 | 
			
		||||
            TestData.of("", NULL_RESULT),
 | 
			
		||||
            TestData.of(null, NULL_RESULT)
 | 
			
		||||
            TestData.of(NoConditionEvaluator.NAME, true),
 | 
			
		||||
            TestData.of("fake-definition-name", true),
 | 
			
		||||
            TestData.of("", true),
 | 
			
		||||
            TestData.of(null, true)
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -105,10 +76,10 @@ public class SimpleConditionTest
 | 
			
		||||
    {
 | 
			
		||||
        for (TestData testData : getTestData())
 | 
			
		||||
        {
 | 
			
		||||
            final ActionCondition actionCondition = createActionCondition(testData.conditionDefinitionName);
 | 
			
		||||
            final ActionCondition actionCondition = createActionCondition(testData.actionDefinitionName);
 | 
			
		||||
 | 
			
		||||
            // when
 | 
			
		||||
            final SimpleCondition actualSimpleCondition = SimpleCondition.from(actionCondition, namespaceService);
 | 
			
		||||
            final SimpleCondition actualSimpleCondition = SimpleCondition.from(actionCondition);
 | 
			
		||||
 | 
			
		||||
            assertThat(Objects.isNull(actualSimpleCondition)).isEqualTo(testData.isNullResult);
 | 
			
		||||
            if (!testData.isNullResult)
 | 
			
		||||
@@ -124,7 +95,7 @@ public class SimpleConditionTest
 | 
			
		||||
    public void testFromNullValue()
 | 
			
		||||
    {
 | 
			
		||||
        // when
 | 
			
		||||
        final SimpleCondition actualSimpleCondition = SimpleCondition.from(null, namespaceService);
 | 
			
		||||
        final SimpleCondition actualSimpleCondition = SimpleCondition.from(null);
 | 
			
		||||
 | 
			
		||||
        assertThat(actualSimpleCondition).isNull();
 | 
			
		||||
    }
 | 
			
		||||
@@ -135,7 +106,7 @@ public class SimpleConditionTest
 | 
			
		||||
        final ActionCondition actionCondition = new ActionConditionImpl("fake-id", null, createParameterValues());
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        final SimpleCondition actualSimpleCondition = SimpleCondition.from(actionCondition, namespaceService);
 | 
			
		||||
        final SimpleCondition actualSimpleCondition = SimpleCondition.from(actionCondition);
 | 
			
		||||
 | 
			
		||||
        assertThat(actualSimpleCondition).isNull();
 | 
			
		||||
    }
 | 
			
		||||
@@ -146,7 +117,7 @@ public class SimpleConditionTest
 | 
			
		||||
        final ActionCondition actionCondition = new ActionConditionImpl("fake-id", "fake-def-name", null);
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        final SimpleCondition actualSimpleCondition = SimpleCondition.from(actionCondition, namespaceService);
 | 
			
		||||
        final SimpleCondition actualSimpleCondition = SimpleCondition.from(actionCondition);
 | 
			
		||||
 | 
			
		||||
        assertThat(actualSimpleCondition).isNull();
 | 
			
		||||
    }
 | 
			
		||||
@@ -158,22 +129,14 @@ public class SimpleConditionTest
 | 
			
		||||
            createActionCondition(ComparePropertyValueEvaluator.NAME),
 | 
			
		||||
            createActionCondition(CompareMimeTypeEvaluator.NAME)
 | 
			
		||||
        );
 | 
			
		||||
        final List<SimpleCondition> expectedSimpleConditions = List.of(
 | 
			
		||||
            SimpleCondition.builder().field("content-property").comparator("operation").parameter("value").create(),
 | 
			
		||||
            SimpleCondition.builder().field("property").comparator("equals").parameter("value").create()
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        final List<SimpleCondition> actualSimpleConditions = SimpleCondition.listOf(actionConditions, namespaceService);
 | 
			
		||||
        final List<SimpleCondition> actualSimpleConditions = SimpleCondition.listOf(actionConditions);
 | 
			
		||||
 | 
			
		||||
        final List<SimpleCondition> expectedSimpleConditions = List.of(
 | 
			
		||||
            SimpleCondition.builder()
 | 
			
		||||
                .field("content-property")
 | 
			
		||||
                .comparator("operation")
 | 
			
		||||
                .parameter("value")
 | 
			
		||||
                .create(),
 | 
			
		||||
            SimpleCondition.builder()
 | 
			
		||||
                .field(SimpleCondition.PARAM_MIMETYPE)
 | 
			
		||||
                .comparator(ComparePropertyValueOperation.EQUALS.toString().toLowerCase())
 | 
			
		||||
                .parameter("value")
 | 
			
		||||
                .create()
 | 
			
		||||
        );
 | 
			
		||||
        assertThat(actualSimpleConditions)
 | 
			
		||||
            .isNotNull()
 | 
			
		||||
            .containsExactlyElementsOf(expectedSimpleConditions);
 | 
			
		||||
@@ -182,8 +145,7 @@ public class SimpleConditionTest
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testListOfEmptyActionConditions()
 | 
			
		||||
    {
 | 
			
		||||
        // when
 | 
			
		||||
        final List<SimpleCondition> actualSimpleConditions = SimpleCondition.listOf(Collections.emptyList(), namespaceService);
 | 
			
		||||
        final List<SimpleCondition> actualSimpleConditions = SimpleCondition.listOf(Collections.emptyList());
 | 
			
		||||
 | 
			
		||||
        assertThat(actualSimpleConditions).isNull();
 | 
			
		||||
    }
 | 
			
		||||
@@ -191,8 +153,7 @@ public class SimpleConditionTest
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testListOfNullActionConditions()
 | 
			
		||||
    {
 | 
			
		||||
        // when
 | 
			
		||||
        final List<SimpleCondition> actualSimpleConditions = SimpleCondition.listOf(null, namespaceService);
 | 
			
		||||
        final List<SimpleCondition> actualSimpleConditions = SimpleCondition.listOf(null);
 | 
			
		||||
 | 
			
		||||
        assertThat(actualSimpleConditions).isNull();
 | 
			
		||||
    }
 | 
			
		||||
@@ -203,207 +164,50 @@ public class SimpleConditionTest
 | 
			
		||||
        final List<ActionCondition> actionConditions = new ArrayList<>();
 | 
			
		||||
        actionConditions.add(null);
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        final List<SimpleCondition> actualSimpleConditions = SimpleCondition.listOf(actionConditions, namespaceService);
 | 
			
		||||
        final List<SimpleCondition> actualSimpleConditions = SimpleCondition.listOf(actionConditions);
 | 
			
		||||
 | 
			
		||||
        assertThat(actualSimpleConditions).isNotNull().isEmpty();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testToServiceModel_withSizeContentProperty()
 | 
			
		||||
    {
 | 
			
		||||
        final SimpleCondition simpleCondition = createSimpleCondition(ContentPropertyName.SIZE.toString().toLowerCase());
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        final ActionCondition actualActionCondition = simpleCondition.toServiceModel(NOT_INVERTED, nodes, namespaceService);
 | 
			
		||||
 | 
			
		||||
        final Map<String, Serializable> expectedParameterValues = new HashMap<>();
 | 
			
		||||
        expectedParameterValues.put(ComparePropertyValueEvaluator.PARAM_CONTENT_PROPERTY, ContentPropertyName.SIZE.toString());
 | 
			
		||||
        expectedParameterValues.put(ComparePropertyValueEvaluator.PARAM_PROPERTY, ContentModel.TYPE_CONTENT);
 | 
			
		||||
        expectedParameterValues.put(ComparePropertyValueEvaluator.PARAM_OPERATION, ComparePropertyValueOperation.EQUALS.toString());
 | 
			
		||||
        expectedParameterValues.put(ComparePropertyValueEvaluator.PARAM_VALUE, PARAMETER_DEFAULT);
 | 
			
		||||
        ActionCondition expectedActionCondition = new ActionConditionImpl(null, ComparePropertyValueEvaluator.NAME, expectedParameterValues);
 | 
			
		||||
        assertThat(actualActionCondition)
 | 
			
		||||
            .isNotNull().usingRecursiveComparison().ignoringFields("id")
 | 
			
		||||
            .isEqualTo(expectedActionCondition);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testToServiceModel_withoutContentProperty()
 | 
			
		||||
    {
 | 
			
		||||
        final SimpleCondition simpleCondition = createSimpleCondition(ContentModel.PROP_DESCRIPTION.toPrefixString(namespaceService));
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        final ActionCondition actualActionCondition = simpleCondition.toServiceModel(NOT_INVERTED, nodes, namespaceService);
 | 
			
		||||
 | 
			
		||||
        final Map<String, Serializable> expectedParameterValues = new HashMap<>();
 | 
			
		||||
        expectedParameterValues.put(ComparePropertyValueEvaluator.PARAM_PROPERTY, ContentModel.PROP_DESCRIPTION);
 | 
			
		||||
        expectedParameterValues.put(ComparePropertyValueEvaluator.PARAM_OPERATION, ComparePropertyValueOperation.EQUALS.toString());
 | 
			
		||||
        expectedParameterValues.put(ComparePropertyValueEvaluator.PARAM_VALUE, PARAMETER_DEFAULT);
 | 
			
		||||
        final ActionCondition expectedActionCondition = new ActionConditionImpl(null, ComparePropertyValueEvaluator.NAME, expectedParameterValues);
 | 
			
		||||
        assertThat(actualActionCondition)
 | 
			
		||||
            .isNotNull().usingRecursiveComparison().ignoringFields("id", "parameterValues.property.prefix")
 | 
			
		||||
            .isEqualTo(expectedActionCondition);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testToServiceModel_compareMimetype()
 | 
			
		||||
    {
 | 
			
		||||
        final SimpleCondition simpleCondition = createSimpleCondition(SimpleCondition.PARAM_MIMETYPE);
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        final ActionCondition actualActionCondition = simpleCondition.toServiceModel(NOT_INVERTED, nodes, namespaceService);
 | 
			
		||||
 | 
			
		||||
        final Map<String, Serializable> expectedParameterValues = new HashMap<>();
 | 
			
		||||
        expectedParameterValues.put(ComparePropertyValueEvaluator.PARAM_PROPERTY, ContentModel.TYPE_CONTENT);
 | 
			
		||||
        expectedParameterValues.put(ComparePropertyValueEvaluator.PARAM_VALUE, PARAMETER_DEFAULT);
 | 
			
		||||
        final ActionCondition expectedActionCondition = new ActionConditionImpl(null, CompareMimeTypeEvaluator.NAME, expectedParameterValues);
 | 
			
		||||
        assertThat(actualActionCondition)
 | 
			
		||||
            .isNotNull().usingRecursiveComparison().ignoringFields("id")
 | 
			
		||||
            .isEqualTo(expectedActionCondition);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testToServiceModel_hasAspect()
 | 
			
		||||
    {
 | 
			
		||||
        final QName audioAspect = QName.createQName(NamespaceService.AUDIO_MODEL_1_0_URI, NamespaceService.AUDIO_MODEL_PREFIX);
 | 
			
		||||
        final SimpleCondition simpleCondition = createSimpleCondition(HasAspectEvaluator.PARAM_ASPECT, audioAspect.toPrefixString(namespaceService));
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        final ActionCondition actualActionCondition = simpleCondition.toServiceModel(NOT_INVERTED, nodes, namespaceService);
 | 
			
		||||
 | 
			
		||||
        final Map<String, Serializable> expectedParameterValues = new HashMap<>();
 | 
			
		||||
        expectedParameterValues.put(HasAspectEvaluator.PARAM_ASPECT, audioAspect);
 | 
			
		||||
        final ActionCondition expectedActionCondition = new ActionConditionImpl(null, HasAspectEvaluator.NAME, expectedParameterValues);
 | 
			
		||||
        assertThat(actualActionCondition)
 | 
			
		||||
            .isNotNull().usingRecursiveComparison().ignoringFields("id", "parameterValues.aspect.prefix")
 | 
			
		||||
            .isEqualTo(expectedActionCondition);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testToServiceModel_hasTag()
 | 
			
		||||
    {
 | 
			
		||||
        final String tag = "some tag";
 | 
			
		||||
        final SimpleCondition simpleCondition = createSimpleCondition(HasTagEvaluator.PARAM_TAG, tag);
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        final ActionCondition actualActionCondition = simpleCondition.toServiceModel(NOT_INVERTED, nodes, namespaceService);
 | 
			
		||||
 | 
			
		||||
        final Map<String, Serializable> expectedParameterValues = new HashMap<>();
 | 
			
		||||
        expectedParameterValues.put(HasTagEvaluator.PARAM_TAG, tag);
 | 
			
		||||
        final ActionCondition expectedActionCondition = new ActionConditionImpl(null, HasTagEvaluator.NAME, expectedParameterValues);
 | 
			
		||||
        assertThat(actualActionCondition)
 | 
			
		||||
            .isNotNull().usingRecursiveComparison().ignoringFields("id")
 | 
			
		||||
            .isEqualTo(expectedActionCondition);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testToServiceModel_inCategory()
 | 
			
		||||
    {
 | 
			
		||||
        final SimpleCondition simpleCondition = createSimpleCondition(SimpleCondition.PARAM_CATEGORY);
 | 
			
		||||
        final NodeRef defaultNodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, PARAMETER_DEFAULT);
 | 
			
		||||
        given(nodes.validateOrLookupNode(PARAMETER_DEFAULT, null)).willReturn(defaultNodeRef);
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        final ActionCondition actualActionCondition = simpleCondition.toServiceModel(NOT_INVERTED, nodes, namespaceService);
 | 
			
		||||
 | 
			
		||||
        final Map<String, Serializable> expectedParameterValues = new HashMap<>();
 | 
			
		||||
        expectedParameterValues.put(InCategoryEvaluator.PARAM_CATEGORY_ASPECT, ContentModel.ASPECT_GEN_CLASSIFIABLE);
 | 
			
		||||
        expectedParameterValues.put(InCategoryEvaluator.PARAM_CATEGORY_VALUE, defaultNodeRef);
 | 
			
		||||
        final ActionCondition expectedActionCondition = new ActionConditionImpl(null, InCategoryEvaluator.NAME, expectedParameterValues);
 | 
			
		||||
        assertThat(actualActionCondition)
 | 
			
		||||
            .isNotNull().usingRecursiveComparison().ignoringFields("id")
 | 
			
		||||
            .isEqualTo(expectedActionCondition);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testToServiceModel_isSubType()
 | 
			
		||||
    {
 | 
			
		||||
        final SimpleCondition simpleCondition = createSimpleCondition(IsSubTypeEvaluator.PARAM_TYPE, ContentModel.TYPE_FOLDER.toPrefixString(namespaceService));
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        final ActionCondition actualActionCondition = simpleCondition.toServiceModel(NOT_INVERTED, nodes, namespaceService);
 | 
			
		||||
 | 
			
		||||
        final Map<String, Serializable> expectedParameterValues = new HashMap<>();
 | 
			
		||||
        expectedParameterValues.put(IsSubTypeEvaluator.PARAM_TYPE, ContentModel.TYPE_FOLDER);
 | 
			
		||||
        final ActionCondition expectedActionCondition = new ActionConditionImpl(null, IsSubTypeEvaluator.NAME, expectedParameterValues);
 | 
			
		||||
        assertThat(actualActionCondition)
 | 
			
		||||
            .isNotNull().usingRecursiveComparison().ignoringFields("id", "parameterValues.type.prefix")
 | 
			
		||||
            .isEqualTo(expectedActionCondition);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testToServiceModel_inverted()
 | 
			
		||||
    {
 | 
			
		||||
        final SimpleCondition simpleCondition = createSimpleCondition(ContentModel.PROP_DESCRIPTION.toPrefixString(namespaceService));
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        final ActionCondition actualActionCondition = simpleCondition.toServiceModel(!NOT_INVERTED, nodes, namespaceService);
 | 
			
		||||
 | 
			
		||||
        final Map<String, Serializable> expectedParameterValues = new HashMap<>();
 | 
			
		||||
        expectedParameterValues.put(ComparePropertyValueEvaluator.PARAM_PROPERTY, ContentModel.PROP_DESCRIPTION);
 | 
			
		||||
        expectedParameterValues.put(ComparePropertyValueEvaluator.PARAM_OPERATION, ComparePropertyValueOperation.EQUALS.toString());
 | 
			
		||||
        expectedParameterValues.put(ComparePropertyValueEvaluator.PARAM_VALUE, PARAMETER_DEFAULT);
 | 
			
		||||
        final ActionCondition expectedActionCondition = new ActionConditionImpl(null, ComparePropertyValueEvaluator.NAME, expectedParameterValues);
 | 
			
		||||
        expectedActionCondition.setInvertCondition(!NOT_INVERTED);
 | 
			
		||||
        assertThat(actualActionCondition)
 | 
			
		||||
            .isNotNull().usingRecursiveComparison().ignoringFields("id", "parameterValues.property.prefix")
 | 
			
		||||
            .isEqualTo(expectedActionCondition);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static SimpleCondition createSimpleCondition(final String field)
 | 
			
		||||
    {
 | 
			
		||||
        return createSimpleCondition(field, PARAMETER_DEFAULT);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static SimpleCondition createSimpleCondition(final String field, final String parameter)
 | 
			
		||||
    {
 | 
			
		||||
        return SimpleCondition.builder()
 | 
			
		||||
            .field(field)
 | 
			
		||||
            .comparator(ComparePropertyValueOperation.EQUALS.toString().toLowerCase())
 | 
			
		||||
            .parameter(parameter)
 | 
			
		||||
            .create();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static ActionCondition createActionCondition(final String actionDefinitionName)
 | 
			
		||||
    {
 | 
			
		||||
        return new ActionConditionImpl("fake-id", actionDefinitionName, createParameterValues());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static Map<String, Serializable> createParameterValues() {
 | 
			
		||||
        final QName audioAspect = QName.createQName(NamespaceService.AUDIO_MODEL_1_0_URI, NamespaceService.AUDIO_MODEL_PREFIX);
 | 
			
		||||
        final NodeRef defaultNodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, PARAMETER_DEFAULT);
 | 
			
		||||
        final Map<String, Serializable> parameterValues = new HashMap<>();
 | 
			
		||||
        parameterValues.put(ComparePropertyValueEvaluator.PARAM_CONTENT_PROPERTY, "content-property");
 | 
			
		||||
        parameterValues.put(ComparePropertyValueEvaluator.PARAM_PROPERTY, ContentModel.TYPE_CONTENT);
 | 
			
		||||
        parameterValues.put(HasChildEvaluator.PARAM_ASSOC_TYPE, "assoc-type");
 | 
			
		||||
        parameterValues.put(ComparePropertyValueEvaluator.PARAM_PROPERTY, "property");
 | 
			
		||||
        parameterValues.put(ComparePropertyValueEvaluator.PARAM_OPERATION, "operation");
 | 
			
		||||
        parameterValues.put(ComparePropertyValueEvaluator.PARAM_VALUE, "value");
 | 
			
		||||
        parameterValues.put(HasAspectEvaluator.PARAM_ASPECT, audioAspect);
 | 
			
		||||
        parameterValues.put(HasAspectEvaluator.PARAM_ASPECT, "aspect");
 | 
			
		||||
        parameterValues.put(HasChildEvaluator.PARAM_ASSOC_NAME, "assoc-name");
 | 
			
		||||
        parameterValues.put(HasTagEvaluator.PARAM_TAG, "tag");
 | 
			
		||||
        parameterValues.put(InCategoryEvaluator.PARAM_CATEGORY_ASPECT, "category-aspect");
 | 
			
		||||
        parameterValues.put(InCategoryEvaluator.PARAM_CATEGORY_VALUE, defaultNodeRef);
 | 
			
		||||
        parameterValues.put(IsSubTypeEvaluator.PARAM_TYPE, ContentModel.TYPE_FOLDER);
 | 
			
		||||
        parameterValues.put(InCategoryEvaluator.PARAM_CATEGORY_VALUE, "category-value");
 | 
			
		||||
        parameterValues.put(IsSubTypeEvaluator.PARAM_TYPE, "type");
 | 
			
		||||
 | 
			
		||||
        return parameterValues;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static class TestData
 | 
			
		||||
    {
 | 
			
		||||
        String conditionDefinitionName;
 | 
			
		||||
        String actionDefinitionName;
 | 
			
		||||
        boolean isNullResult;
 | 
			
		||||
 | 
			
		||||
        public TestData(String conditionDefinitionName, boolean isNullResult)
 | 
			
		||||
        public TestData(String actionDefinitionName, boolean isNullResult)
 | 
			
		||||
        {
 | 
			
		||||
            this.conditionDefinitionName = conditionDefinitionName;
 | 
			
		||||
            this.actionDefinitionName = actionDefinitionName;
 | 
			
		||||
            this.isNullResult = isNullResult;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static TestData of(String conditionDefinitionName) {
 | 
			
		||||
            return new TestData(conditionDefinitionName, false);
 | 
			
		||||
        public static TestData of(String actionDefinitionName) {
 | 
			
		||||
            return new TestData(actionDefinitionName, false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static TestData of(String conditionDefinitionName, boolean isNullResult) {
 | 
			
		||||
            return new TestData(conditionDefinitionName, isNullResult);
 | 
			
		||||
        public static TestData of(String actionDefinitionName, boolean isNullResult) {
 | 
			
		||||
            return new TestData(actionDefinitionName, isNullResult);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,75 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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.rest.api.nodes;
 | 
			
		||||
 | 
			
		||||
import junit.framework.TestCase;
 | 
			
		||||
import org.alfresco.rest.api.RuleSets;
 | 
			
		||||
import org.alfresco.rest.api.model.rules.RuleSetLink;
 | 
			
		||||
import org.alfresco.rest.framework.resource.parameters.Parameters;
 | 
			
		||||
import org.junit.Assert;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
import org.junit.runner.RunWith;
 | 
			
		||||
import org.mockito.InjectMocks;
 | 
			
		||||
import org.mockito.Mock;
 | 
			
		||||
import org.mockito.junit.MockitoJUnitRunner;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import static org.mockito.Mockito.when;
 | 
			
		||||
 | 
			
		||||
@RunWith(MockitoJUnitRunner.class)
 | 
			
		||||
public class NodeRuleSetsRelationTest extends TestCase
 | 
			
		||||
{
 | 
			
		||||
    private static final String FOLDER_NODE_ID = "dummy-folder-node-id";
 | 
			
		||||
    private static final String LINK_TO_NODE_ID = "dummy-link-to-node-id";
 | 
			
		||||
 | 
			
		||||
    @Mock
 | 
			
		||||
    private RuleSets ruleSets;
 | 
			
		||||
 | 
			
		||||
    @Mock
 | 
			
		||||
    private Parameters parameters;
 | 
			
		||||
 | 
			
		||||
    @InjectMocks
 | 
			
		||||
    private NodeRuleSetLinksRelation nodeRuleSetLinksRelation;
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void shouldProperlyCreateLink()
 | 
			
		||||
    {
 | 
			
		||||
        RuleSetLink ruleSetLink = new RuleSetLink();
 | 
			
		||||
        List<RuleSetLink> ruleResult = List.of(ruleSetLink);
 | 
			
		||||
 | 
			
		||||
        RuleSetLink requestBody = new RuleSetLink();
 | 
			
		||||
        requestBody.setId(LINK_TO_NODE_ID);
 | 
			
		||||
 | 
			
		||||
        when(ruleSets.linkToRuleSet(FOLDER_NODE_ID, LINK_TO_NODE_ID)).thenReturn(ruleSetLink);
 | 
			
		||||
 | 
			
		||||
        List<RuleSetLink> actual = nodeRuleSetLinksRelation.create(FOLDER_NODE_ID,List.of(requestBody), parameters);
 | 
			
		||||
        Assert.assertEquals(ruleResult, actual);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -26,10 +26,6 @@
 | 
			
		||||
 | 
			
		||||
package org.alfresco.rest.api.nodes;
 | 
			
		||||
 | 
			
		||||
import static org.mockito.BDDMockito.then;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import junit.framework.TestCase;
 | 
			
		||||
import org.alfresco.rest.api.Rules;
 | 
			
		||||
import org.alfresco.rest.framework.resource.parameters.Paging;
 | 
			
		||||
@@ -44,15 +40,17 @@ import org.mockito.Mock;
 | 
			
		||||
import org.mockito.MockitoAnnotations;
 | 
			
		||||
import org.mockito.junit.MockitoJUnitRunner;
 | 
			
		||||
 | 
			
		||||
import static org.mockito.ArgumentMatchers.eq;
 | 
			
		||||
import static org.mockito.BDDMockito.then;
 | 
			
		||||
 | 
			
		||||
@Experimental
 | 
			
		||||
@RunWith(MockitoJUnitRunner.class)
 | 
			
		||||
public class NodeRulesRelationTest extends TestCase
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    private static final String FOLDER_NODE_ID = "dummy-node-id";
 | 
			
		||||
    private static final String RULE_SET_ID = "dummy-rule-set-id";
 | 
			
		||||
    private static final String RULE_ID = "dummy-rule-id";
 | 
			
		||||
    private static final List<String> INCLUDE = List.of("include-field");
 | 
			
		||||
    private static final Paging PAGING = Paging.DEFAULT;
 | 
			
		||||
 | 
			
		||||
    @Mock
 | 
			
		||||
    private Rules rulesMock;
 | 
			
		||||
@@ -70,34 +68,35 @@ public class NodeRulesRelationTest extends TestCase
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testReadAll()
 | 
			
		||||
    {
 | 
			
		||||
        final Parameters parameters = ParamsExtender.valueOf(PAGING, FOLDER_NODE_ID, RULE_SET_ID, null, INCLUDE);
 | 
			
		||||
        final Paging paging = Paging.DEFAULT;
 | 
			
		||||
        final Parameters parameters = ParamsExtender.valueOf(paging, FOLDER_NODE_ID, RULE_SET_ID, null);
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        nodeRulesRelation.readAll(FOLDER_NODE_ID, parameters);
 | 
			
		||||
 | 
			
		||||
        then(rulesMock).should().getRules(FOLDER_NODE_ID, RULE_SET_ID, INCLUDE, PAGING);
 | 
			
		||||
        then(rulesMock).should().getRules(eq(FOLDER_NODE_ID), eq(RULE_SET_ID), eq(paging));
 | 
			
		||||
        then(rulesMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testReadById()
 | 
			
		||||
    {
 | 
			
		||||
        final Parameters parameters = ParamsExtender.valueOf(null, FOLDER_NODE_ID, RULE_SET_ID, RULE_ID, INCLUDE);
 | 
			
		||||
        final Parameters parameters = ParamsExtender.valueOf(null, FOLDER_NODE_ID, RULE_SET_ID, RULE_ID);
 | 
			
		||||
 | 
			
		||||
        // when
 | 
			
		||||
        nodeRulesRelation.readById(FOLDER_NODE_ID, RULE_SET_ID, parameters);
 | 
			
		||||
 | 
			
		||||
        then(rulesMock).should().getRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID, INCLUDE);
 | 
			
		||||
        then(rulesMock).should().getRuleById(eq(FOLDER_NODE_ID), eq(RULE_SET_ID), eq(RULE_ID));
 | 
			
		||||
        then(rulesMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testDeleteById() {
 | 
			
		||||
        final Parameters parameters = ParamsExtender.valueOf(null, FOLDER_NODE_ID, RULE_SET_ID, RULE_ID, INCLUDE);
 | 
			
		||||
        final Parameters parameters = ParamsExtender.valueOf(null, FOLDER_NODE_ID, RULE_SET_ID, RULE_ID);
 | 
			
		||||
        // when
 | 
			
		||||
        nodeRulesRelation.delete(FOLDER_NODE_ID, RULE_SET_ID, parameters);
 | 
			
		||||
 | 
			
		||||
        then(rulesMock).should().deleteRuleById(FOLDER_NODE_ID, RULE_SET_ID, RULE_ID);
 | 
			
		||||
        then(rulesMock).should().deleteRuleById(eq(FOLDER_NODE_ID), eq(RULE_SET_ID), eq(RULE_ID));
 | 
			
		||||
        then(rulesMock).shouldHaveNoMoreInteractions();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -106,7 +106,6 @@ import org.apache.commons.collections.map.MultiValueMap;
 | 
			
		||||
import org.json.simple.JSONObject;
 | 
			
		||||
import org.junit.After;
 | 
			
		||||
import org.junit.Before;
 | 
			
		||||
import org.junit.Ignore;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -3612,7 +3611,6 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest
 | 
			
		||||
     * {@literal <host>:<port>/alfresco/api/-default-/public/alfresco/versions/1/nodes/<nodeId>/content}
 | 
			
		||||
     */
 | 
			
		||||
    @Test
 | 
			
		||||
    @Ignore("ACS-3531 Frequent intermittent failure")
 | 
			
		||||
    public void testDownloadFileContent() throws Exception
 | 
			
		||||
    {
 | 
			
		||||
        setRequestContext(user1);
 | 
			
		||||
@@ -3723,50 +3721,6 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest
 | 
			
		||||
        getSingle(getNodeContentUrl(contentNodeId), null, null, headers, 304);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Tests download of file/content name.
 | 
			
		||||
     * <p>GET:</p>
 | 
			
		||||
     * {@literal <host>:<port>/alfresco/api/-default-/public/alfresco/versions/1/nodes/<nodeId>/content}
 | 
			
		||||
     */
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testDownloadFileContentName() throws Exception
 | 
			
		||||
    {
 | 
			
		||||
        setRequestContext(user1);
 | 
			
		||||
 | 
			
		||||
        //
 | 
			
		||||
        // Test plain text
 | 
			
		||||
        //
 | 
			
		||||
 | 
			
		||||
        String fileName = "Test Download (1).txt";
 | 
			
		||||
        File file = getResourceFile(fileName);
 | 
			
		||||
 | 
			
		||||
        MultiPartBuilder multiPartBuilder = MultiPartBuilder.create()
 | 
			
		||||
                                                            .setFileData(new FileData(fileName, file));
 | 
			
		||||
        MultiPartRequest reqBody = multiPartBuilder.build();
 | 
			
		||||
 | 
			
		||||
        // Upload text content
 | 
			
		||||
        HttpResponse response = post(getNodeChildrenUrl(Nodes.PATH_MY), reqBody.getBody(), null, reqBody.getContentType(), 201);
 | 
			
		||||
        Document document = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class);
 | 
			
		||||
 | 
			
		||||
        String contentNodeId = document.getId();
 | 
			
		||||
 | 
			
		||||
        // Check the upload response
 | 
			
		||||
        assertEquals(fileName, document.getName());
 | 
			
		||||
        ContentInfo contentInfo = document.getContent();
 | 
			
		||||
        assertNotNull(contentInfo);
 | 
			
		||||
        assertEquals(MimetypeMap.MIMETYPE_TEXT_PLAIN, contentInfo.getMimeType());
 | 
			
		||||
 | 
			
		||||
        // Download text content - by default with Content-Disposition header
 | 
			
		||||
        response = getSingle(NodesEntityResource.class, contentNodeId + "/content", null, 200);
 | 
			
		||||
 | 
			
		||||
        String textContent = response.getResponse();
 | 
			
		||||
        assertEquals("The quick brown fox jumps over the lazy dog", textContent);
 | 
			
		||||
        Map<String, String> responseHeaders = response.getHeaders();
 | 
			
		||||
        assertNotNull(responseHeaders);
 | 
			
		||||
        assertEquals("attachment; filename=\"Test Download (1).txt\"; filename*=UTF-8''Test%20Download%20%281%29.txt", responseHeaders.get("Content-Disposition"));
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Tests download of file/content using backed temp file for streaming.
 | 
			
		||||
     * <p>
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,6 @@ package org.alfresco.rest.framework.tests.core;
 | 
			
		||||
import static org.mockito.Mockito.mock;
 | 
			
		||||
 | 
			
		||||
import java.io.InputStream;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.framework.jacksonextensions.BeanPropertiesFilter;
 | 
			
		||||
@@ -73,9 +72,4 @@ public class ParamsExtender extends Params
 | 
			
		||||
    {
 | 
			
		||||
        return new ParamsExtender(entityId, relationshipId, relationship2Id, null, null, null, new Params.RecognizedParams(null, paging, null, null, null, null, null, null, false));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Params valueOf(Paging paging, String entityId, String relationshipId, String relationship2Id, List<String> include)
 | 
			
		||||
    {
 | 
			
		||||
        return new ParamsExtender(entityId, relationshipId, relationship2Id, null, null, null, new Params.RecognizedParams(null, paging, null, null, include, null, null, null, false));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
The quick brown fox jumps over the lazy dog
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo</artifactId>
 | 
			
		||||
        <version>17.113</version>
 | 
			
		||||
        <version>17.75-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <dependencies>
 | 
			
		||||
@@ -691,16 +691,6 @@
 | 
			
		||||
            <artifactId>camel-mock</artifactId>
 | 
			
		||||
            <scope>test</scope>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <!-- Netty non-transitive dependencies declared for depending projects usage in conjunction with Camel's other transitive netty dependencies -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>io.netty</groupId>
 | 
			
		||||
            <artifactId>netty-handler-proxy</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>io.netty</groupId>
 | 
			
		||||
            <artifactId>netty-tcnative-classes</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.apache.activemq</groupId>
 | 
			
		||||
            <artifactId>activemq-client</artifactId>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,34 +1,33 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%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%
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 * #%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.action;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.service.cmr.action.ParameterizedItem;
 | 
			
		||||
 | 
			
		||||
@@ -39,8 +38,8 @@ import org.alfresco.service.cmr.action.ParameterizedItem;
 | 
			
		||||
 */
 | 
			
		||||
public abstract class ParameterizedItemImpl implements ParameterizedItem, Serializable
 | 
			
		||||
{
 | 
			
		||||
    private static final long serialVersionUID = 3578052215076397741L;
 | 
			
		||||
 | 
			
		||||
    private static final long serialVersionUID = 3578052215076397741L;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The id
 | 
			
		||||
     */
 | 
			
		||||
@@ -51,23 +50,23 @@ public abstract class ParameterizedItemImpl implements ParameterizedItem, Serial
 | 
			
		||||
     */
 | 
			
		||||
    private Map<String, Serializable> parameterValues = new HashMap<String, Serializable>();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructor
 | 
			
		||||
     * 
 | 
			
		||||
     * @param id  the id
 | 
			
		||||
     */
 | 
			
		||||
    public ParameterizedItemImpl(String id)
 | 
			
		||||
    {
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructor
 | 
			
		||||
     * 
 | 
			
		||||
     * @param id  the id
 | 
			
		||||
     */
 | 
			
		||||
    public ParameterizedItemImpl(String id)
 | 
			
		||||
    {
 | 
			
		||||
        this(id, null);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructor
 | 
			
		||||
     * 
 | 
			
		||||
     * @param id          the rule item
 | 
			
		||||
     * @param parameterValues   the parameter values
 | 
			
		||||
     */
 | 
			
		||||
    public ParameterizedItemImpl(String id, Map<String, Serializable> parameterValues)
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructor
 | 
			
		||||
     * 
 | 
			
		||||
     * @param id          the rule item
 | 
			
		||||
     * @param parameterValues   the parameter values
 | 
			
		||||
     */
 | 
			
		||||
    public ParameterizedItemImpl(String id, Map<String, Serializable> parameterValues)
 | 
			
		||||
    {     
 | 
			
		||||
        // Set the action id
 | 
			
		||||
        this.id = id;
 | 
			
		||||
@@ -136,7 +135,7 @@ public abstract class ParameterizedItemImpl implements ParameterizedItem, Serial
 | 
			
		||||
    @Override
 | 
			
		||||
    public int hashCode()
 | 
			
		||||
    {
 | 
			
		||||
        return Objects.hashCode(this.id);
 | 
			
		||||
        return this.id.hashCode(); 
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -220,7 +220,6 @@ public class DeleteNotExistsExecutor implements StatementExecutor
 | 
			
		||||
                {
 | 
			
		||||
                    // Process batch
 | 
			
		||||
                    primaryId = processPrimaryTableResultSet(primaryPrepStmt, secondaryPrepStmts, deletePrepStmt, deleteIds, primaryTableName, primaryColumnName, tableColumn);
 | 
			
		||||
                    connection.commit();
 | 
			
		||||
 | 
			
		||||
                    if (primaryId == null)
 | 
			
		||||
                    {
 | 
			
		||||
@@ -299,6 +298,7 @@ public class DeleteNotExistsExecutor implements StatementExecutor
 | 
			
		||||
                    if (deleteIds.size() == deleteBatchSize)
 | 
			
		||||
                    {
 | 
			
		||||
                        deleteFromPrimaryTable(deletePrepStmt, deleteIds, primaryTableName);
 | 
			
		||||
                        connection.commit();
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if (!resultSet.next())
 | 
			
		||||
 
 | 
			
		||||
@@ -117,7 +117,6 @@ public class MySQLDeleteNotExistsExecutor extends DeleteNotExistsExecutor
 | 
			
		||||
                {
 | 
			
		||||
                    // Process batch
 | 
			
		||||
                    primaryId = processPrimaryTableResultSet(primaryPrepStmt, secondaryPrepStmts, deletePrepStmt, deleteIds, primaryTableName, primaryColumnName, tableColumn);
 | 
			
		||||
                    connection.commit();
 | 
			
		||||
 | 
			
		||||
                    if (primaryId == null)
 | 
			
		||||
                    {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,28 +1,28 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Repository
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 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%
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 * #%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.exporter;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
@@ -39,7 +39,6 @@ import java.util.List;
 | 
			
		||||
import java.util.Locale;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.model.ContentModel;
 | 
			
		||||
import org.alfresco.repo.node.MLPropertyInterceptor;
 | 
			
		||||
@@ -78,7 +77,6 @@ import org.alfresco.service.descriptor.DescriptorService;
 | 
			
		||||
import org.alfresco.service.namespace.NamespaceService;
 | 
			
		||||
import org.alfresco.service.namespace.QName;
 | 
			
		||||
import org.alfresco.service.namespace.RegexQNamePattern;
 | 
			
		||||
import org.apache.commons.lang3.math.NumberUtils;
 | 
			
		||||
import org.dom4j.io.OutputFormat;
 | 
			
		||||
import org.dom4j.io.XMLWriter;
 | 
			
		||||
import org.springframework.extensions.surf.util.ParameterCheck;
 | 
			
		||||
@@ -101,8 +99,6 @@ public class ExporterComponent
 | 
			
		||||
    private DescriptorService descriptorService;
 | 
			
		||||
    private AuthenticationService authenticationService;
 | 
			
		||||
    private PermissionService permissionService;
 | 
			
		||||
 | 
			
		||||
    private String exportChunkSize;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /** Indent Size */
 | 
			
		||||
@@ -182,14 +178,6 @@ public class ExporterComponent
 | 
			
		||||
    {
 | 
			
		||||
        this.exportSecondaryNodes = exportSecondaryNodes;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @param exportChunkSize  the exportChunkSize
 | 
			
		||||
     */
 | 
			
		||||
    public void setExportChunkSize(String exportChunkSize)
 | 
			
		||||
    {
 | 
			
		||||
        this.exportChunkSize = exportChunkSize;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /* (non-Javadoc)
 | 
			
		||||
     * @see org.alfresco.service.cmr.view.ExporterService#exportView(java.io.OutputStream, org.alfresco.service.cmr.view.ExporterCrawlerParameters, org.alfresco.service.cmr.view.Exporter)
 | 
			
		||||
@@ -955,21 +943,26 @@ public class ExporterComponent
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                // Current strategy is to determine if node is a child of the root exported node
 | 
			
		||||
                if (context.getExportMap() != null)
 | 
			
		||||
                for (NodeRef exportRoot : context.getExportList())
 | 
			
		||||
                {
 | 
			
		||||
                    for (NodeRef[] listNodeRef : context.getExportMap().values())
 | 
			
		||||
                    if (nodeRef.equals(exportRoot) && parameters.isCrawlSelf() == true)
 | 
			
		||||
                    {
 | 
			
		||||
                        for (NodeRef exportRoot : listNodeRef)
 | 
			
		||||
                        {
 | 
			
		||||
                            isWithin = checkIsWithin(nodeRef, exportRoot, parameters);
 | 
			
		||||
                        }
 | 
			
		||||
                        // node to export is the root export node (and root is to be exported)
 | 
			
		||||
                        isWithin = true;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    for (NodeRef exportRoot : context.getExportList())
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        isWithin = checkIsWithin(nodeRef, exportRoot, parameters);
 | 
			
		||||
                        // locate export root in primary parent path of node
 | 
			
		||||
                        Path nodePath = nodeService.getPath(nodeRef);
 | 
			
		||||
                        for (int i = nodePath.size() - 1; i >= 0; i--)
 | 
			
		||||
                        {
 | 
			
		||||
                            Path.ChildAssocElement pathElement = (Path.ChildAssocElement) nodePath.get(i);
 | 
			
		||||
                            if (pathElement.getRef().getChildRef().equals(exportRoot))
 | 
			
		||||
                            {
 | 
			
		||||
                                isWithin = true;
 | 
			
		||||
                                break;
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
@@ -986,28 +979,6 @@ public class ExporterComponent
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private boolean checkIsWithin(NodeRef nodeRef, NodeRef exportRoot, ExporterCrawlerParameters parameters){
 | 
			
		||||
        if (nodeRef.equals(exportRoot) && parameters.isCrawlSelf() == true)
 | 
			
		||||
        {
 | 
			
		||||
            // node to export is the root export node (and root is to be exported)
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            // locate export root in primary parent path of node
 | 
			
		||||
            Path nodePath = nodeService.getPath(nodeRef);
 | 
			
		||||
            for (int i = nodePath.size() - 1; i >= 0; i--)
 | 
			
		||||
            {
 | 
			
		||||
                Path.ChildAssocElement pathElement = (Path.ChildAssocElement) nodePath.get(i);
 | 
			
		||||
                if (pathElement.getRef().getChildRef().equals(exportRoot))
 | 
			
		||||
                {
 | 
			
		||||
                    return true;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Exporter Context
 | 
			
		||||
@@ -1015,9 +986,7 @@ public class ExporterComponent
 | 
			
		||||
    private class ExporterContextImpl implements ExporterContext
 | 
			
		||||
    {
 | 
			
		||||
        private NodeRef[] exportList;
 | 
			
		||||
        private Map<Integer,NodeRef[]> exportListMap;
 | 
			
		||||
        private NodeRef[] parentList;
 | 
			
		||||
        private Map<Integer,NodeRef[]> parentListMap;
 | 
			
		||||
        private String exportedBy;
 | 
			
		||||
        private Date exportedDate;
 | 
			
		||||
        private String exporterVersion;
 | 
			
		||||
@@ -1026,10 +995,8 @@ public class ExporterComponent
 | 
			
		||||
        private Map<Integer, Set<NodeRef>> nodesWithAssociations = new HashMap<Integer, Set<NodeRef>>();
 | 
			
		||||
        
 | 
			
		||||
        private int index;
 | 
			
		||||
        private int indexSubList;
 | 
			
		||||
        private int chunkSize;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
        
 | 
			
		||||
        /**
 | 
			
		||||
         * Construct
 | 
			
		||||
         * 
 | 
			
		||||
@@ -1038,17 +1005,7 @@ public class ExporterComponent
 | 
			
		||||
        public ExporterContextImpl(ExporterCrawlerParameters parameters)
 | 
			
		||||
        {
 | 
			
		||||
            index = 0;
 | 
			
		||||
            indexSubList = 0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            if(!NumberUtils.isParsable(exportChunkSize)){
 | 
			
		||||
                chunkSize = 10;
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                chunkSize = Integer.parseInt(exportChunkSize);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            
 | 
			
		||||
            // get current user performing export
 | 
			
		||||
            String currentUserName = authenticationService.getCurrentUserName();
 | 
			
		||||
            exportedBy = (currentUserName == null) ? "unknown" : currentUserName;
 | 
			
		||||
@@ -1065,80 +1022,24 @@ public class ExporterComponent
 | 
			
		||||
                NodeRef exportOf = getNodeRef(parameters.getExportFrom());
 | 
			
		||||
                exportList[0] = exportOf;
 | 
			
		||||
            }
 | 
			
		||||
            if(exportList.length > chunkSize)
 | 
			
		||||
            parentList = new NodeRef[exportList.length];
 | 
			
		||||
            for (int i = 0; i < exportList.length; i++)
 | 
			
		||||
            {
 | 
			
		||||
                exportListMap = splitArray(exportList);
 | 
			
		||||
 | 
			
		||||
                parentListMap = new HashMap<>();
 | 
			
		||||
                for(Map.Entry<Integer, NodeRef[]> exportEntrySet : exportListMap.entrySet())
 | 
			
		||||
                {
 | 
			
		||||
                    parentList= new NodeRef[exportEntrySet.getValue().length];
 | 
			
		||||
                    for (int i = 0; i < exportEntrySet.getValue().length; i++)
 | 
			
		||||
                    {
 | 
			
		||||
                        parentList[i] = getParent(exportEntrySet.getValue()[i], parameters.isCrawlSelf());
 | 
			
		||||
                    }
 | 
			
		||||
                    parentListMap.put(exportEntrySet.getKey(), parentList);
 | 
			
		||||
                }
 | 
			
		||||
                parentList[i] = getParent(exportList[i], parameters.isCrawlSelf());
 | 
			
		||||
            }
 | 
			
		||||
            else{
 | 
			
		||||
                parentList = new NodeRef[exportList.length];
 | 
			
		||||
                for (int i = 0; i < exportList.length; i++)
 | 
			
		||||
                {
 | 
			
		||||
                    parentList[i] = getParent(exportList[i], parameters.isCrawlSelf());
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            
 | 
			
		||||
            // get exporter version
 | 
			
		||||
            exporterVersion = descriptorService.getServerDescriptor().getVersion();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Map<Integer, NodeRef[]> splitArray(NodeRef[] arrayToSplit){
 | 
			
		||||
            if(chunkSize <= 0){
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
            int rest = arrayToSplit.length % chunkSize;
 | 
			
		||||
            int chunks = arrayToSplit.length / chunkSize + (rest > 0 ? 1 : 0);
 | 
			
		||||
            Map<Integer, NodeRef[]> arrays = new HashMap<>() ;
 | 
			
		||||
            for(Integer i = 0; i < (rest > 0 ? chunks - 1 : chunks); i++){
 | 
			
		||||
                arrays.put(i, Arrays.copyOfRange(arrayToSplit, i * chunkSize, i * chunkSize + chunkSize));
 | 
			
		||||
            }
 | 
			
		||||
            if(rest > 0){
 | 
			
		||||
                arrays.put(chunks - 1, Arrays.copyOfRange(arrayToSplit, (chunks - 1) * chunkSize, (chunks - 1) * chunkSize + rest));
 | 
			
		||||
            }
 | 
			
		||||
            return arrays;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        public boolean canRetrieve()
 | 
			
		||||
        {
 | 
			
		||||
            if(exportListMap != null)
 | 
			
		||||
            {
 | 
			
		||||
                if (exportListMap.containsKey(indexSubList))
 | 
			
		||||
                {
 | 
			
		||||
                    return index < exportListMap.get(indexSubList).length;
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    return false;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                return index < exportList.length;
 | 
			
		||||
            }
 | 
			
		||||
            return index < exportList.length;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        public int setNextValue()
 | 
			
		||||
        {
 | 
			
		||||
            if(exportListMap != null && (index == exportListMap.get(indexSubList).length-1)){
 | 
			
		||||
                resetContext();
 | 
			
		||||
                if(indexSubList <= exportListMap.size())
 | 
			
		||||
                {
 | 
			
		||||
                    ++indexSubList;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            else{
 | 
			
		||||
                ++index;
 | 
			
		||||
            }
 | 
			
		||||
            return index;
 | 
			
		||||
            return ++index;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        public void resetContext()
 | 
			
		||||
@@ -1177,13 +1078,7 @@ public class ExporterComponent
 | 
			
		||||
        {
 | 
			
		||||
            if (canRetrieve())
 | 
			
		||||
            {
 | 
			
		||||
                if(exportListMap!=null)
 | 
			
		||||
                {
 | 
			
		||||
                    return exportListMap.get(indexSubList)[index];
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    return exportList[index];
 | 
			
		||||
                }
 | 
			
		||||
                return exportList[index];
 | 
			
		||||
            }
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
@@ -1196,13 +1091,7 @@ public class ExporterComponent
 | 
			
		||||
        {
 | 
			
		||||
            if (canRetrieve())
 | 
			
		||||
            {
 | 
			
		||||
                if(parentListMap!=null)
 | 
			
		||||
                {
 | 
			
		||||
                    return parentListMap.get(indexSubList)[index];
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    return parentList[index];
 | 
			
		||||
                }
 | 
			
		||||
                return parentList[index];
 | 
			
		||||
            }
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
@@ -1216,11 +1105,6 @@ public class ExporterComponent
 | 
			
		||||
            return exportList;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Map<Integer, NodeRef[]> getExportMap()
 | 
			
		||||
        {
 | 
			
		||||
            return exportListMap;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /*
 | 
			
		||||
         * (non-Javadoc)
 | 
			
		||||
         * @see org.alfresco.service.cmr.view.ExporterContext#getExportParentList()
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user