mirror of
				https://github.com/Alfresco/alfresco-community-repo.git
				synced 2025-10-29 15:21:53 +00:00 
			
		
		
		
	Compare commits
	
		
			1 Commits
		
	
	
		
			17.48
			...
			fix/REPO-5
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					02decc91d4 | 
@@ -180,6 +180,14 @@ jobs:
 | 
			
		||||
        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.16.1
 | 
			
		||||
      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 5.7.23 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 -e MYSQL_ROOT_PASSWORD=alfresco -e MYSQL_USER=alfresco -e MYSQL_DATABASE=alfresco -e MYSQL_PASSWORD=alfresco  mysql:5.7.23 --transaction-isolation='READ-COMMITTED' --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
 | 
			
		||||
        - docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.16.1
 | 
			
		||||
      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 - 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\]/
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
   <parent>
 | 
			
		||||
      <groupId>org.alfresco</groupId>
 | 
			
		||||
      <artifactId>alfresco-community-repo-amps</artifactId>
 | 
			
		||||
      <version>17.48</version>
 | 
			
		||||
      <version>23.1.0.23-SNAPSHOT</version>
 | 
			
		||||
   </parent>
 | 
			
		||||
 | 
			
		||||
   <modules>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
   <parent>
 | 
			
		||||
      <groupId>org.alfresco</groupId>
 | 
			
		||||
      <artifactId>alfresco-governance-services-community-parent</artifactId>
 | 
			
		||||
      <version>17.48</version>
 | 
			
		||||
      <version>23.1.0.23-SNAPSHOT</version>
 | 
			
		||||
   </parent>
 | 
			
		||||
 | 
			
		||||
   <modules>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
   <parent>
 | 
			
		||||
      <groupId>org.alfresco</groupId>
 | 
			
		||||
      <artifactId>alfresco-governance-services-automation-community-repo</artifactId>
 | 
			
		||||
      <version>17.48</version>
 | 
			
		||||
      <version>23.1.0.23-SNAPSHOT</version>
 | 
			
		||||
   </parent>
 | 
			
		||||
 | 
			
		||||
   <build>
 | 
			
		||||
@@ -87,7 +87,7 @@
 | 
			
		||||
      <dependency>
 | 
			
		||||
         <groupId>com.github.docker-java</groupId>
 | 
			
		||||
         <artifactId>docker-java</artifactId>
 | 
			
		||||
         <version>3.2.13</version>
 | 
			
		||||
         <version>3.2.12</version>
 | 
			
		||||
      </dependency>
 | 
			
		||||
   </dependencies>
 | 
			
		||||
</project>
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,8 @@
 | 
			
		||||
 */
 | 
			
		||||
package org.alfresco.rest.v0;
 | 
			
		||||
 | 
			
		||||
import static org.testng.AssertJUnit.assertTrue;
 | 
			
		||||
 | 
			
		||||
import java.text.MessageFormat;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.core.v0.BaseAPI;
 | 
			
		||||
@@ -36,9 +38,7 @@ import org.json.JSONObject;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
import static org.testng.AssertJUnit.assertTrue;
 | 
			
		||||
import static org.testng.AssertJUnit.assertEquals;
 | 
			
		||||
import static org.testng.AssertJUnit.assertNotNull;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Methods to make API requests using v0 API on Records Management Custom Model Reference Definitions
 | 
			
		||||
 *
 | 
			
		||||
@@ -57,8 +57,6 @@ public class CustomDefinitionsAPI extends BaseAPI
 | 
			
		||||
     * create reference endpoint
 | 
			
		||||
     */
 | 
			
		||||
    private static final String CREATE_RELATIONSHIP_API_ENDPOINT = "{0}node/{1}/customreferences";
 | 
			
		||||
    private static final String GET_RELATIONSHIP_API_ENDPOINT = "{0}node/{1}/relationships";
 | 
			
		||||
    private static final String DELETE_RELATIONSHIP_API_ENDPOINT = "{0}node/{1}/targetnode/{2}/uniqueName/{3}";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * logger
 | 
			
		||||
@@ -143,48 +141,4 @@ public class CustomDefinitionsAPI extends BaseAPI
 | 
			
		||||
        assertTrue("Creating relationship from " + recordNodeIdFrom + " to " + recordNodeIdTo + " failed.", success);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void createRelationship(
 | 
			
		||||
        String adminUser,
 | 
			
		||||
        String adminPassword,
 | 
			
		||||
        int expectedStatus,
 | 
			
		||||
        String recordNodeIdFrom,
 | 
			
		||||
        String recordNodeIdTo,
 | 
			
		||||
        CustomDefinitions relationshipType) {
 | 
			
		||||
        //create the request body
 | 
			
		||||
        JSONObject requestParams = new JSONObject();
 | 
			
		||||
        requestParams.put("toNode", NODE_REF_WORKSPACE_SPACES_STORE + recordNodeIdTo);
 | 
			
		||||
        requestParams.put("refId", getCustomReferenceId(adminUser, adminPassword, relationshipType
 | 
			
		||||
            .getDefinition()));
 | 
			
		||||
        //send the API request to create the relationship
 | 
			
		||||
        JSONObject setRelationshipStatus = doPostRequest(adminUser, adminPassword, requestParams,
 | 
			
		||||
            MessageFormat.format(CREATE_RELATIONSHIP_API_ENDPOINT, "{0}", NODE_PREFIX + recordNodeIdFrom));
 | 
			
		||||
        //check the response
 | 
			
		||||
        assertEquals("POST request for createRelationship was not successful.", expectedStatus, setRelationshipStatus.getJSONObject("status").get("code"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public JSONObject getRelationshipDetails(
 | 
			
		||||
        String adminUser,
 | 
			
		||||
        String adminPassword,
 | 
			
		||||
        String nodeRef) {
 | 
			
		||||
        //send the API request to create the relationship
 | 
			
		||||
        JSONObject relationshipDetails = doGetRequest(adminUser, adminPassword,
 | 
			
		||||
            MessageFormat.format(GET_RELATIONSHIP_API_ENDPOINT, "{0}", NODE_PREFIX + nodeRef));
 | 
			
		||||
        //check the response
 | 
			
		||||
        assertNotNull("The Relationship detail is not found for the Noderef " + nodeRef, relationshipDetails);
 | 
			
		||||
        return relationshipDetails;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void deleteRelationship(
 | 
			
		||||
        String adminUser,
 | 
			
		||||
        String adminPassword,
 | 
			
		||||
        String recordNodeIdFrom,
 | 
			
		||||
        String recordNodeIdTo,
 | 
			
		||||
        String relationshipUniqueName) {
 | 
			
		||||
        //send the API request to create the relationship
 | 
			
		||||
        JSONObject setRelationshipStatus = doDeleteRequest(adminUser, adminPassword,
 | 
			
		||||
            MessageFormat.format(DELETE_RELATIONSHIP_API_ENDPOINT, "{0}", NODE_PREFIX + recordNodeIdFrom,NODE_PREFIX + recordNodeIdTo,relationshipUniqueName));
 | 
			
		||||
        //check the response
 | 
			
		||||
        boolean success = (setRelationshipStatus != null) && setRelationshipStatus.getBoolean("success");
 | 
			
		||||
        assertTrue("Deleting relationship from " + recordNodeIdFrom + " to " + recordNodeIdTo + " failed.", success);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -73,7 +73,6 @@ import org.testng.annotations.BeforeClass;
 | 
			
		||||
import org.testng.annotations.BeforeMethod;
 | 
			
		||||
import org.testng.annotations.DataProvider;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
import org.alfresco.utility.model.TestGroup;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * API tests for declaring document as record and filing it immediately to a record folder location within the file plan
 | 
			
		||||
@@ -258,7 +257,7 @@ public class DeclareAndFileDocumentAsRecordTests extends BaseRMRestTest
 | 
			
		||||
     * Then I receive an error indicating that I have attempted to declare and file a document into an invalid record folder
 | 
			
		||||
     * And the document is not declared as a record
 | 
			
		||||
     */
 | 
			
		||||
    @Test (dataProvider = "invalidDestinationPaths",groups = { TestGroup.NOT_SUPPORTED_ON_SINGLE_PIPELINE })
 | 
			
		||||
    @Test (dataProvider = "invalidDestinationPaths")
 | 
			
		||||
    public void declareAndFileToInvalidLocationUsingActionsAPI(String containerPath, String expectedException) throws Exception
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Declare document as record with an invalid location parameter value");
 | 
			
		||||
 
 | 
			
		||||
@@ -62,7 +62,6 @@ import org.testng.annotations.BeforeClass;
 | 
			
		||||
import org.testng.annotations.BeforeMethod;
 | 
			
		||||
import org.testng.annotations.DataProvider;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
import org.alfresco.utility.model.TestGroup;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * API tests for declaring a document version as record and filing to a record folder location within the file plan
 | 
			
		||||
@@ -208,7 +207,7 @@ public class FileVersionAsRecordTests extends BaseRMRestTest
 | 
			
		||||
     * record folder
 | 
			
		||||
     * And the document is not declared as a version record
 | 
			
		||||
     */
 | 
			
		||||
    @Test (dataProvider = "invalidDestinationPaths", groups = { TestGroup.NOT_SUPPORTED_ON_SINGLE_PIPELINE })
 | 
			
		||||
    @Test (dataProvider = "invalidDestinationPaths")
 | 
			
		||||
    public void declareVersionAndFileToInvalidLocationUsingActionsAPI(String containerPath, String expectedException) throws Exception
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Declare document as record version with an invalid location parameter value");
 | 
			
		||||
 
 | 
			
		||||
@@ -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.records;
 | 
			
		||||
import static org.alfresco.rest.core.v0.BaseAPI.RM_SITE_ID;
 | 
			
		||||
import static org.alfresco.rest.rm.community.base.TestData.HOLD_DESCRIPTION;
 | 
			
		||||
import static org.alfresco.rest.rm.community.base.TestData.HOLD_REASON;
 | 
			
		||||
import static org.alfresco.rest.rm.community.util.CommonTestUtils.generateTestPrefix;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import org.alfresco.rest.rm.community.base.BaseRMRestTest;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.custom.CustomDefinitions;
 | 
			
		||||
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.CustomDefinitionsAPI;
 | 
			
		||||
import org.alfresco.rest.v0.HoldsAPI;
 | 
			
		||||
import org.alfresco.rest.v0.RMRolesAndActionsAPI;
 | 
			
		||||
import org.alfresco.rest.v0.RecordsAPI;
 | 
			
		||||
import org.alfresco.rest.v0.RecordCategoriesAPI;
 | 
			
		||||
import org.alfresco.test.AlfrescoTest;
 | 
			
		||||
import org.apache.commons.lang.StringUtils;
 | 
			
		||||
import org.json.JSONObject;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
import static org.apache.commons.httpclient.HttpStatus.SC_INTERNAL_SERVER_ERROR;
 | 
			
		||||
import static org.apache.commons.httpclient.HttpStatus.SC_OK;
 | 
			
		||||
/**
 | 
			
		||||
 * Add Relationship tests
 | 
			
		||||
 * @author Kavit Shah
 | 
			
		||||
 */
 | 
			
		||||
public class AddRelationshipTests extends BaseRMRestTest
 | 
			
		||||
{
 | 
			
		||||
    private final String TEST_PREFIX = generateTestPrefix(AddRelationshipTests.class);
 | 
			
		||||
    private final String CATEGORY = TEST_PREFIX + "category";
 | 
			
		||||
    private final String HOLD1 = TEST_PREFIX + "hold1";
 | 
			
		||||
    private final String FOLDER = TEST_PREFIX + "RM_2709_1814_FOLDER";
 | 
			
		||||
    private final String RECORD1 = TEST_PREFIX + "RM_2709_1814_RECORD_ONE";
 | 
			
		||||
    private final String RECORD2 = TEST_PREFIX + "RM_1814_RECORD_TWO";
 | 
			
		||||
    private String hold1NodeRef;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private HoldsAPI holdsAPI;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RecordsAPI recordsAPI;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private CustomDefinitionsAPI customDefinitionsAPI;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RMRolesAndActionsAPI rmRolesAndActionsAPI;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RecordCategoriesAPI recordCategoriesAPI;
 | 
			
		||||
 | 
			
		||||
    @Test (priority = 1)
 | 
			
		||||
    @AlfrescoTest (jira = "RM-1814")
 | 
			
		||||
    public void addRelationshipToHoldRecord()
 | 
			
		||||
    {
 | 
			
		||||
        String CATEGORY_RELATIONSHIP = CATEGORY + "To Hold";
 | 
			
		||||
        //create RM site
 | 
			
		||||
        createRMSiteIfNotExists();
 | 
			
		||||
        //create record category, record folder and records
 | 
			
		||||
        RecordCategory recordCategory = createCategoryIfDoesNotExist(CATEGORY_RELATIONSHIP);
 | 
			
		||||
        RecordCategoryChild recordCategoryChild = createRecordFolderInCategory(FOLDER, recordCategory);
 | 
			
		||||
 | 
			
		||||
        createRecordItems(recordCategoryChild, RECORD1);
 | 
			
		||||
        Record record2 = createRecordItems(recordCategoryChild, RECORD2);
 | 
			
		||||
 | 
			
		||||
        //create Hold
 | 
			
		||||
        hold1NodeRef = holdsAPI.createHoldAndGetNodeRef(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(), HOLD1, HOLD_REASON, HOLD_DESCRIPTION);
 | 
			
		||||
        //add RECORD2 to holds
 | 
			
		||||
        holdsAPI.addItemsToHolds(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(),
 | 
			
		||||
            SC_OK, Collections.singletonList(record2.getId()),
 | 
			
		||||
            Collections.singletonList(hold1NodeRef));
 | 
			
		||||
 | 
			
		||||
        // get records nodeRefs
 | 
			
		||||
        String elRecordFullName1 = recordsAPI.getRecordFullName(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(), FOLDER, RECORD1);
 | 
			
		||||
        String elRecordNodeRef1 = recordsAPI.getRecordNodeRef(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(), elRecordFullName1, "/" + CATEGORY_RELATIONSHIP + "/" + FOLDER);
 | 
			
		||||
 | 
			
		||||
        String elRecordFullName2 = recordsAPI.getRecordFullName(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(), FOLDER, RECORD2);
 | 
			
		||||
        String elRecordNodeRef2 = recordsAPI.getRecordNodeRef(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(), elRecordFullName2, "/" + CATEGORY_RELATIONSHIP + "/" + FOLDER);
 | 
			
		||||
 | 
			
		||||
        // create Relationship
 | 
			
		||||
        customDefinitionsAPI.createRelationship(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(),
 | 
			
		||||
            SC_INTERNAL_SERVER_ERROR,
 | 
			
		||||
            formatNodeRef(elRecordNodeRef1),
 | 
			
		||||
            formatNodeRef(elRecordNodeRef2),
 | 
			
		||||
            CustomDefinitions.ATTACHMENT);
 | 
			
		||||
 | 
			
		||||
        //delete preconditions
 | 
			
		||||
        deletePrecondition();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test (priority = 2)
 | 
			
		||||
    @AlfrescoTest (jira = "RM-1874")
 | 
			
		||||
    public void deleteRelationship()
 | 
			
		||||
    {
 | 
			
		||||
        String CATEGORY_RELATIONSHIP = CATEGORY + "deleteRelationship";
 | 
			
		||||
        // create RM site
 | 
			
		||||
        createRMSiteIfNotExists();
 | 
			
		||||
        // create record category, record folder and records
 | 
			
		||||
        RecordCategory recordCategory = createCategoryIfDoesNotExist(CATEGORY_RELATIONSHIP);
 | 
			
		||||
        RecordCategoryChild recordCategoryChild = createRecordFolderInCategory(FOLDER, recordCategory);
 | 
			
		||||
 | 
			
		||||
        createRecordItems(recordCategoryChild, RECORD1);
 | 
			
		||||
        createRecordItems(recordCategoryChild, RECORD2);
 | 
			
		||||
 | 
			
		||||
        // Add Relationship
 | 
			
		||||
        String elRecordFullName1 = recordsAPI.getRecordFullName(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(), FOLDER, RECORD1);
 | 
			
		||||
        String elRecordNodeRef1 = recordsAPI.getRecordNodeRef(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(), elRecordFullName1, "/" + CATEGORY_RELATIONSHIP + "/" + FOLDER);
 | 
			
		||||
 | 
			
		||||
        String elRecordFullName2 = recordsAPI.getRecordFullName(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(), FOLDER, RECORD2);
 | 
			
		||||
        String elRecordNodeRef2 = recordsAPI.getRecordNodeRef(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(), elRecordFullName2, "/" + CATEGORY_RELATIONSHIP + "/" + FOLDER);
 | 
			
		||||
 | 
			
		||||
        customDefinitionsAPI.createRelationship(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(),
 | 
			
		||||
            formatNodeRef(elRecordNodeRef1),
 | 
			
		||||
            formatNodeRef(elRecordNodeRef2),
 | 
			
		||||
            CustomDefinitions.ATTACHMENT);
 | 
			
		||||
 | 
			
		||||
        // Get RelationshipDetails
 | 
			
		||||
        JSONObject relationshipDetails = customDefinitionsAPI.getRelationshipDetails(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(),
 | 
			
		||||
            formatNodeRef(elRecordNodeRef1));
 | 
			
		||||
 | 
			
		||||
        // Delete RelationshipDetails
 | 
			
		||||
        customDefinitionsAPI.deleteRelationship(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(),
 | 
			
		||||
            formatNodeRef(elRecordNodeRef1),
 | 
			
		||||
            formatNodeRef(elRecordNodeRef2),
 | 
			
		||||
            relationshipUniqueName(relationshipDetails));
 | 
			
		||||
 | 
			
		||||
        // delete category
 | 
			
		||||
        tearDown(CATEGORY_RELATIONSHIP);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void deletePrecondition()
 | 
			
		||||
    {
 | 
			
		||||
        holdsAPI.deleteHold(getAdminUser(), hold1NodeRef);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private Record createRecordItems(RecordCategoryChild recordCategoryChild, String record) {
 | 
			
		||||
        return createElectronicRecord(recordCategoryChild.getId(), record);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private RecordCategory createCategoryIfDoesNotExist(String CATEGORY_ALL) {
 | 
			
		||||
        return createRootCategory(getDataUser().usingAdmin().getAdminUser(), CATEGORY_ALL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private RecordCategoryChild createRecordFolderInCategory(String FOLDER_SEARCH, RecordCategory recordCategory) {
 | 
			
		||||
        return createFolder(getDataUser().usingAdmin().getAdminUser(), recordCategory.getId(), FOLDER_SEARCH);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private String formatNodeRef(String nodeRef) {
 | 
			
		||||
        return StringUtils.remove(nodeRef,"workspace://SpacesStore/");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void tearDown(String category) {
 | 
			
		||||
        rmRolesAndActionsAPI.deleteAllItemsInContainer(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(), RM_SITE_ID, FOLDER);
 | 
			
		||||
        rmRolesAndActionsAPI.deleteAllItemsInContainer(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(), RM_SITE_ID, category);
 | 
			
		||||
        recordCategoriesAPI.deleteCategory(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(), category);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private String relationshipUniqueName(JSONObject relationshipDetails) {
 | 
			
		||||
        return relationshipDetails.getJSONObject("data").getJSONArray("items").getJSONObject(0).getJSONObject("node")
 | 
			
		||||
            .get("relationshipUniqueName").toString();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,148 +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.records;
 | 
			
		||||
 | 
			
		||||
import static java.util.Arrays.asList;
 | 
			
		||||
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.rest.rm.community.utils.FilePlanComponentsUtil.createElectronicRecordModel;
 | 
			
		||||
import static org.alfresco.rest.rm.community.utils.FilePlanComponentsUtil.getFile;
 | 
			
		||||
import static org.alfresco.rest.rm.community.utils.FilePlanComponentsUtil.IMAGE_FILE;
 | 
			
		||||
import static org.alfresco.rest.rm.community.utils.FilePlanComponentsUtil.createRecordModel;
 | 
			
		||||
import static org.alfresco.utility.data.RandomData.getRandomName;
 | 
			
		||||
import static org.alfresco.utility.report.log.Step.STEP;
 | 
			
		||||
import static org.springframework.http.HttpStatus.CREATED;
 | 
			
		||||
import static org.springframework.http.HttpStatus.OK;
 | 
			
		||||
import org.alfresco.rest.model.RestNodeModel;
 | 
			
		||||
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.requests.gscore.api.RecordFolderAPI;
 | 
			
		||||
import org.alfresco.test.AlfrescoTest;
 | 
			
		||||
import org.alfresco.utility.model.UserModel;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.testng.annotations.AfterClass;
 | 
			
		||||
import org.testng.annotations.BeforeClass;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
import org.alfresco.rest.v0.RMRolesAndActionsAPI;
 | 
			
		||||
/**
 | 
			
		||||
 * This class contains the tests for
 | 
			
		||||
 * CreateElectronicRecordsTests Action REST API
 | 
			
		||||
 *
 | 
			
		||||
 * @author Shishuraj Bisht
 | 
			
		||||
 */
 | 
			
		||||
public class CreateElectronicRecordsTests extends BaseRMRestTest {
 | 
			
		||||
 | 
			
		||||
    private RecordCategory rootCategory;
 | 
			
		||||
    private UserModel updateUser;
 | 
			
		||||
    /**
 | 
			
		||||
     * data prep services
 | 
			
		||||
     */
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RMRolesAndActionsAPI rmRolesAndActionsAPI;
 | 
			
		||||
 | 
			
		||||
    private final String TEST_PREFIX = generateTestPrefix(CreateElectronicRecordsTests.class);
 | 
			
		||||
    private final String RM_ADMIN = TEST_PREFIX + "rm_admin";
 | 
			
		||||
 | 
			
		||||
    @BeforeClass (alwaysRun = true)
 | 
			
		||||
    public void preConditions()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Create RM Site");
 | 
			
		||||
        createRMSiteIfNotExists();
 | 
			
		||||
 | 
			
		||||
        STEP("Create RM Admin user");
 | 
			
		||||
        rmRolesAndActionsAPI.createUserAndAssignToRole(getAdminUser().getUsername(), getAdminUser().getPassword(), RM_ADMIN,
 | 
			
		||||
            getAdminUser().getPassword(),
 | 
			
		||||
            "Administrator");
 | 
			
		||||
 | 
			
		||||
        STEP("Create root level category");
 | 
			
		||||
        rootCategory = createRootCategory(getRandomName("Category"));
 | 
			
		||||
 | 
			
		||||
        STEP("Create the record folder1 inside the rootCategory");
 | 
			
		||||
        String recordFolder1 = createCategoryFolderInFilePlan().getId();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Test v0 methods to create and get electronic records.
 | 
			
		||||
     */
 | 
			
		||||
    @Test
 | 
			
		||||
    @AlfrescoTest (jira = "RM-2768")
 | 
			
		||||
    public void createElectronicRecordTest() throws Exception {
 | 
			
		||||
 | 
			
		||||
        //create electronic record in record folder
 | 
			
		||||
        String recordFolder1 = createRecordFolder(rootCategory.getId(), getRandomName("recFolder")).getId();
 | 
			
		||||
        RecordFolderAPI recordFolderAPI = getRestAPIFactory().getRecordFolderAPI();
 | 
			
		||||
 | 
			
		||||
        Record electronicRecord = recordFolderAPI.createRecord(createElectronicRecordModel(), recordFolder1, getFile(IMAGE_FILE));
 | 
			
		||||
        assertStatusCode(CREATED);
 | 
			
		||||
        STEP("Check the electronic record has been created");
 | 
			
		||||
        assertStatusCode(CREATED);
 | 
			
		||||
 | 
			
		||||
        // Get recordsAPI instance initialised to updateUser
 | 
			
		||||
        org.alfresco.rest.rm.community.requests.gscore.api.RecordsAPI recordsAPI = getRestAPIFactory().getRecordsAPI(updateUser);
 | 
			
		||||
 | 
			
		||||
        for (Record record: asList(electronicRecord)) {
 | 
			
		||||
            recordsAPI.getRecord(record.getId());
 | 
			
		||||
            assertStatusCode(OK);
 | 
			
		||||
 | 
			
		||||
            // Generate update metadata
 | 
			
		||||
            String newName = getModifiedPropertyValue(record.getName());
 | 
			
		||||
            String newTitle = getModifiedPropertyValue(record.getProperties().getTitle());
 | 
			
		||||
            String newDescription = getModifiedPropertyValue(record.getProperties().getDescription());
 | 
			
		||||
 | 
			
		||||
            // Update record
 | 
			
		||||
            recordsAPI.updateRecord(createRecordModel(newName, newDescription, newTitle), record.getId());
 | 
			
		||||
            assertStatusCode(OK);
 | 
			
		||||
        }
 | 
			
		||||
        // move the record from one folder1 to folder2
 | 
			
		||||
        STEP("Create the record folder2 inside the rootCategory");
 | 
			
		||||
        String recordFolder2 = createCategoryFolderInFilePlan().getId();
 | 
			
		||||
 | 
			
		||||
        STEP("Move record from folder1 to folder2");
 | 
			
		||||
        RestNodeModel electronicDocRestNodeModel = getRestAPIFactory()
 | 
			
		||||
            .getNodeAPI(toContentModel(electronicRecord.getId()))
 | 
			
		||||
            .move(createBodyForMoveCopy(recordFolder2));
 | 
			
		||||
        assertStatusCode(OK);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private String getModifiedPropertyValue(String originalValue) {
 | 
			
		||||
        /* to be used to append to modifications */
 | 
			
		||||
        String MODIFIED_PREFIX = "modified_";
 | 
			
		||||
        return MODIFIED_PREFIX + originalValue;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @AfterClass (alwaysRun = true)
 | 
			
		||||
    public void deletePreConditions() {
 | 
			
		||||
        STEP("Delete the created rootCategory along with corresponding record folders/records present in it");
 | 
			
		||||
        getRestAPIFactory().getRecordCategoryAPI().deleteRecordCategory(rootCategory.getId());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -1,145 +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.records;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.dataprep.CMISUtil;
 | 
			
		||||
import org.alfresco.rest.rm.community.base.BaseRMRestTest;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.record.Record;
 | 
			
		||||
import org.alfresco.rest.v0.RMRolesAndActionsAPI;
 | 
			
		||||
import org.alfresco.rest.v0.RecordsAPI;
 | 
			
		||||
import org.alfresco.test.AlfrescoTest;
 | 
			
		||||
import org.alfresco.utility.constants.UserRole;
 | 
			
		||||
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.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.testng.annotations.AfterClass;
 | 
			
		||||
import org.testng.annotations.BeforeClass;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentAlias.UNFILED_RECORDS_CONTAINER_ALIAS;
 | 
			
		||||
import static org.alfresco.rest.rm.community.util.CommonTestUtils.generateTestPrefix;
 | 
			
		||||
import static org.alfresco.utility.report.log.Step.STEP;
 | 
			
		||||
import static org.springframework.http.HttpStatus.CREATED;
 | 
			
		||||
import static org.testng.Assert.assertTrue;
 | 
			
		||||
/**
 | 
			
		||||
 * This class contains the tests for
 | 
			
		||||
 * Create the Document, marking them as Record, Hiding them using Site Collaborator
 | 
			
		||||
 * The Rm_Admin user then verofy if he is able to access the documents using Rest Api
 | 
			
		||||
 *
 | 
			
		||||
 * @author Kavit Shah
 | 
			
		||||
 */
 | 
			
		||||
public class DeclareInPlaceRecordTests extends BaseRMRestTest {
 | 
			
		||||
 | 
			
		||||
    private final String TEST_PREFIX = generateTestPrefix(DeclareInPlaceRecordTests.class);
 | 
			
		||||
    private final String RM_ADMIN = TEST_PREFIX + "rm_admin";
 | 
			
		||||
    private UserModel testUser;
 | 
			
		||||
    private UserModel RmAdminUser;
 | 
			
		||||
    private SiteModel testSite;
 | 
			
		||||
    private FolderModel testFolder;
 | 
			
		||||
    /**
 | 
			
		||||
     * data prep services
 | 
			
		||||
     */
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RMRolesAndActionsAPI rmRolesAndActionsAPI;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RecordsAPI recordsAPI;
 | 
			
		||||
 | 
			
		||||
    @BeforeClass(alwaysRun = true)
 | 
			
		||||
    public void preConditions() {
 | 
			
		||||
        STEP("Create RM Site");
 | 
			
		||||
        createRMSiteIfNotExists();
 | 
			
		||||
 | 
			
		||||
        STEP("Create RM Admin user");
 | 
			
		||||
        rmRolesAndActionsAPI.createUserAndAssignToRole(getAdminUser().getUsername(), getAdminUser().getPassword(), RM_ADMIN,
 | 
			
		||||
            getAdminUser().getPassword(),
 | 
			
		||||
            "Administrator");
 | 
			
		||||
 | 
			
		||||
        RmAdminUser = new UserModel(RM_ADMIN,getAdminUser().getPassword());
 | 
			
		||||
 | 
			
		||||
        STEP("Create collab_user user");
 | 
			
		||||
        testUser = getDataUser().createRandomTestUser();
 | 
			
		||||
        testSite = dataSite.usingAdmin().createPublicRandomSite();
 | 
			
		||||
 | 
			
		||||
        // invite collab_user to Collaboration site with Contributor role
 | 
			
		||||
        getDataUser().addUserToSite(testUser, testSite, UserRole.SiteContributor);
 | 
			
		||||
 | 
			
		||||
        testFolder = dataContent.usingSite(testSite).usingUser(testUser).createFolder();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    @AlfrescoTest(jira = "RM-2366")
 | 
			
		||||
    public void declareInplaceRecord() {
 | 
			
		||||
 | 
			
		||||
        // Upload document in a folder in a collaboration site
 | 
			
		||||
        FileModel uploadedDocHidden = dataContent.usingSite(testSite)
 | 
			
		||||
            .usingUser(testUser)
 | 
			
		||||
            .usingResource(testFolder)
 | 
			
		||||
            .createContent(CMISUtil.DocumentType.TEXT_PLAIN);
 | 
			
		||||
 | 
			
		||||
        // declare uploadedDocument as record
 | 
			
		||||
        Record uploadedRecordHidden = getRestAPIFactory().getFilesAPI(testUser).declareAsRecord(uploadedDocHidden.getNodeRefWithoutVersion());
 | 
			
		||||
        assertStatusCode(CREATED);
 | 
			
		||||
 | 
			
		||||
        recordsAPI.hideRecord(testUser.getUsername(),testUser.getPassword(),uploadedRecordHidden.getId());
 | 
			
		||||
 | 
			
		||||
        // Upload document in a folder in a collaboration site
 | 
			
		||||
        FileModel uploadedDocWithoutHidden = dataContent.usingSite(testSite)
 | 
			
		||||
            .usingUser(testUser)
 | 
			
		||||
            .usingResource(testFolder)
 | 
			
		||||
            .createContent(CMISUtil.DocumentType.TEXT_PLAIN);
 | 
			
		||||
 | 
			
		||||
        Record uploadedRecordWithoutHidden = getRestAPIFactory().getFilesAPI(testUser).declareAsRecord(uploadedDocWithoutHidden.getNodeRefWithoutVersion());
 | 
			
		||||
        assertStatusCode(CREATED);
 | 
			
		||||
 | 
			
		||||
        assertTrue(isRecordChildOfUnfiledContainer(uploadedRecordHidden.getId()), uploadedRecordHidden.getId() + " doesn't exist in Unfiled Records");
 | 
			
		||||
        assertTrue(isRecordChildOfUnfiledContainer(uploadedRecordWithoutHidden.getId()), uploadedRecordWithoutHidden.getId() + " doesn't exist in Unfiled Records");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @AfterClass(alwaysRun = true)
 | 
			
		||||
    public void deletePreConditions() {
 | 
			
		||||
        STEP("Delete the records created in the test");
 | 
			
		||||
        getRestAPIFactory()
 | 
			
		||||
            .getUnfiledContainersAPI(RmAdminUser)
 | 
			
		||||
            .getUnfiledContainerChildren(UNFILED_RECORDS_CONTAINER_ALIAS)
 | 
			
		||||
            .getEntries()
 | 
			
		||||
            .stream()
 | 
			
		||||
                .forEach(x -> getRestAPIFactory()
 | 
			
		||||
                    .getRecordsAPI()
 | 
			
		||||
                    .deleteRecord(x.getEntry().getId()));
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private boolean isRecordChildOfUnfiledContainer(String recordId) {
 | 
			
		||||
        return getRestAPIFactory()
 | 
			
		||||
            .getUnfiledContainersAPI(RmAdminUser)
 | 
			
		||||
            .getUnfiledContainerChildren(UNFILED_RECORDS_CONTAINER_ALIAS)
 | 
			
		||||
            .getEntries()
 | 
			
		||||
            .stream()
 | 
			
		||||
            .anyMatch(c -> c.getEntry().getId().equals(recordId));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,226 +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.records;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.dataprep.CMISUtil;
 | 
			
		||||
import org.alfresco.rest.core.v0.BaseAPI;
 | 
			
		||||
import org.alfresco.rest.model.RestNodeModel;
 | 
			
		||||
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.rm.community.requests.gscore.api.RecordFolderAPI;
 | 
			
		||||
import org.alfresco.rest.rm.community.requests.gscore.api.UnfiledRecordFolderAPI;
 | 
			
		||||
import org.alfresco.rest.v0.RMRolesAndActionsAPI;
 | 
			
		||||
import org.alfresco.rest.v0.RecordsAPI;
 | 
			
		||||
import org.alfresco.test.AlfrescoTest;
 | 
			
		||||
import org.alfresco.utility.constants.UserRole;
 | 
			
		||||
import org.alfresco.utility.model.FileModel;
 | 
			
		||||
import org.alfresco.utility.model.SiteModel;
 | 
			
		||||
import org.alfresco.utility.model.UserModel;
 | 
			
		||||
import org.apache.chemistry.opencmis.client.api.CmisObject;
 | 
			
		||||
import org.apache.http.HttpResponse;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.testng.annotations.AfterClass;
 | 
			
		||||
import org.testng.annotations.BeforeClass;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.rest.core.v0.APIUtils.convertHTTPResponseToJSON;
 | 
			
		||||
import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentAlias.UNFILED_RECORDS_CONTAINER_ALIAS;
 | 
			
		||||
import static org.alfresco.rest.rm.community.model.fileplancomponents.FilePlanComponentType.UNFILED_RECORD_FOLDER_TYPE;
 | 
			
		||||
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.CREATED;
 | 
			
		||||
 | 
			
		||||
public class FileUnfiledRecordsTests extends BaseRMRestTest {
 | 
			
		||||
 | 
			
		||||
    private final String TEST_PREFIX = generateTestPrefix(FileUnfiledRecordsTests.class);
 | 
			
		||||
    private final String RM_ADMIN = TEST_PREFIX + "rm_admin";
 | 
			
		||||
    public static final String NODE_REF_WORKSPACE_SPACES_STORE = "workspace://SpacesStore/";
 | 
			
		||||
    private UserModel testUser;
 | 
			
		||||
    private SiteModel testSite;
 | 
			
		||||
    private String unfiledRecordFolderId;
 | 
			
		||||
    private UserModel RmAdminUser;
 | 
			
		||||
    private RecordCategory rootCategory;
 | 
			
		||||
    private RecordCategoryChild recordFolder;
 | 
			
		||||
    private final String recordName = "RM-2790 record";
 | 
			
		||||
    private final String recordTitle = recordName + " title";
 | 
			
		||||
    private final String recordDescription = recordName + " description";
 | 
			
		||||
    /**
 | 
			
		||||
     * data prep services
 | 
			
		||||
     */
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RMRolesAndActionsAPI rmRolesAndActionsAPI;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RecordsAPI recordsAPI;
 | 
			
		||||
 | 
			
		||||
    @BeforeClass(alwaysRun = true)
 | 
			
		||||
    public void preConditions() {
 | 
			
		||||
 | 
			
		||||
        STEP("Create RM Site");
 | 
			
		||||
        createRMSiteIfNotExists();
 | 
			
		||||
 | 
			
		||||
        STEP("Create RM Admin user");
 | 
			
		||||
        rmRolesAndActionsAPI.createUserAndAssignToRole(getAdminUser().getUsername(), getAdminUser().getPassword(), RM_ADMIN,
 | 
			
		||||
            getAdminUser().getPassword(),
 | 
			
		||||
            "Administrator");
 | 
			
		||||
 | 
			
		||||
        RmAdminUser = new UserModel(RM_ADMIN, getAdminUser().getPassword());
 | 
			
		||||
 | 
			
		||||
        STEP("Create collab_user user");
 | 
			
		||||
        testUser = getDataUser().createRandomTestUser();
 | 
			
		||||
        testSite = dataSite.usingAdmin().createPublicRandomSite();
 | 
			
		||||
 | 
			
		||||
        // invite collab_user to Collaboration site with Contributor role
 | 
			
		||||
        getDataUser().addUserToSite(testUser, testSite, UserRole.SiteContributor);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    @AlfrescoTest(jira = "RM-2790")
 | 
			
		||||
    public void fileUnfiledRecords() throws Exception {
 | 
			
		||||
 | 
			
		||||
        STEP("Upload the document to test site and then make it reacord");
 | 
			
		||||
        // Upload document in a folder in a collaboration site
 | 
			
		||||
        FileModel uploadedDocbyCollabUser = dataContent.usingSite(testSite)
 | 
			
		||||
            .usingUser(testUser)
 | 
			
		||||
            .createContent(CMISUtil.DocumentType.TEXT_PLAIN);
 | 
			
		||||
 | 
			
		||||
        // declare uploadedDocument as record
 | 
			
		||||
        Record uploadedDocRecordbyCollabUser = getRestAPIFactory().getFilesAPI(testUser)
 | 
			
		||||
            .declareAsRecord(uploadedDocbyCollabUser.getNodeRefWithoutVersion());
 | 
			
		||||
        assertStatusCode(CREATED);
 | 
			
		||||
 | 
			
		||||
        STEP("Create root level category");
 | 
			
		||||
        rootCategory = createRootCategory(RmAdminUser, getRandomName("Category"));
 | 
			
		||||
 | 
			
		||||
        STEP("Create the record folder inside the rootCategory");
 | 
			
		||||
        recordFolder = createFolder(RmAdminUser, rootCategory.getId(), getRandomName("Folder"));
 | 
			
		||||
 | 
			
		||||
        STEP("Create a non-electronic record by completing some of the fields");
 | 
			
		||||
        Map<Enum<?>, String> non_electronic_records_properties = new HashMap<>();
 | 
			
		||||
        non_electronic_records_properties.put(BaseAPI.RMProperty.TITLE, recordTitle);
 | 
			
		||||
        non_electronic_records_properties.put(BaseAPI.RMProperty.DESCRIPTION, recordDescription);
 | 
			
		||||
        non_electronic_records_properties.put(BaseAPI.RMProperty.NAME, recordName);
 | 
			
		||||
        non_electronic_records_properties.put(BaseAPI.RMProperty.PHYSICAL_SIZE, "");
 | 
			
		||||
        non_electronic_records_properties.put(BaseAPI.RMProperty.NUMBER_OF_COPIES, "");
 | 
			
		||||
        non_electronic_records_properties.put(BaseAPI.RMProperty.SHELF, "");
 | 
			
		||||
        non_electronic_records_properties.put(BaseAPI.RMProperty.STORAGE_LOCATION, "");
 | 
			
		||||
        non_electronic_records_properties.put(BaseAPI.RMProperty.BOX, "");
 | 
			
		||||
        non_electronic_records_properties.put(BaseAPI.RMProperty.FILE, "");
 | 
			
		||||
 | 
			
		||||
        HttpResponse nonElectronicRecordHttpResponse = recordsAPI.createNonElectronicRecord(getAdminUser().getUsername(),
 | 
			
		||||
            getAdminUser().getPassword(), non_electronic_records_properties, rootCategory.getName(), recordFolder.getName());
 | 
			
		||||
 | 
			
		||||
        String nonElectronicRecordId = getNodeRef(nonElectronicRecordHttpResponse);
 | 
			
		||||
 | 
			
		||||
        STEP("Check the non-electronic record has been created");
 | 
			
		||||
        assertStatusCode(CREATED);
 | 
			
		||||
 | 
			
		||||
        STEP("Create a electronic record by completing some of the fields");
 | 
			
		||||
        Map<BaseAPI.RMProperty, String> electronic_records_properties = new HashMap<>();
 | 
			
		||||
        electronic_records_properties.put(BaseAPI.RMProperty.DESCRIPTION, recordDescription);
 | 
			
		||||
        electronic_records_properties.put(BaseAPI.RMProperty.NAME, recordName);
 | 
			
		||||
 | 
			
		||||
        recordsAPI.uploadElectronicRecord(RmAdminUser.getUsername(),
 | 
			
		||||
            RmAdminUser.getPassword(), electronic_records_properties, recordFolder.getName(), CMISUtil.DocumentType.TEXT_PLAIN);
 | 
			
		||||
 | 
			
		||||
        CmisObject electronicRecord = recordsAPI.getRecord(RmAdminUser.getUsername(),
 | 
			
		||||
            RmAdminUser.getPassword(),recordFolder.getName(), electronic_records_properties.get(BaseAPI.RMProperty.NAME));
 | 
			
		||||
 | 
			
		||||
        STEP("Check the electronic record has been created");
 | 
			
		||||
        assertStatusCode(CREATED);
 | 
			
		||||
 | 
			
		||||
        STEP("Create a root folder under FilePlan - Unfiled");
 | 
			
		||||
        String unFiledFolder = createUnFileFolder();
 | 
			
		||||
 | 
			
		||||
        STEP("Move all the Unfiled Records to unFiledFolder");
 | 
			
		||||
        RestNodeModel uploadDocRestNodeModel = getRestAPIFactory()
 | 
			
		||||
            .getNodeAPI(toContentModel(uploadedDocRecordbyCollabUser.getId()))
 | 
			
		||||
            .move(createBodyForMoveCopy(unFiledFolder));
 | 
			
		||||
 | 
			
		||||
        RestNodeModel nonElectronicDocRestNodeModel = getRestAPIFactory()
 | 
			
		||||
            .getNodeAPI(toContentModel(nonElectronicRecordId))
 | 
			
		||||
            .move(createBodyForMoveCopy(unFiledFolder));
 | 
			
		||||
 | 
			
		||||
        RestNodeModel electronicDocRestNodeModel = getRestAPIFactory()
 | 
			
		||||
            .getNodeAPI(toContentModel(electronicRecord.getId()))
 | 
			
		||||
            .move(createBodyForMoveCopy(unFiledFolder));
 | 
			
		||||
 | 
			
		||||
        STEP("Move all the Record present in the unFiledFolder to Folder inside Root Category");
 | 
			
		||||
 | 
			
		||||
        getRestAPIFactory()
 | 
			
		||||
            .getNodeAPI(toContentModel(uploadDocRestNodeModel.getId()))
 | 
			
		||||
            .move(createBodyForMoveCopy(recordFolder.getId()));
 | 
			
		||||
 | 
			
		||||
        getRestAPIFactory()
 | 
			
		||||
            .getNodeAPI(toContentModel(nonElectronicDocRestNodeModel.getId()))
 | 
			
		||||
            .move(createBodyForMoveCopy(recordFolder.getId()));
 | 
			
		||||
 | 
			
		||||
        getRestAPIFactory()
 | 
			
		||||
            .getNodeAPI(toContentModel(electronicDocRestNodeModel.getId()))
 | 
			
		||||
            .move(createBodyForMoveCopy(recordFolder.getId()));
 | 
			
		||||
 | 
			
		||||
        getRestAPIFactory().getRecordsAPI().deleteRecord(uploadDocRestNodeModel.getId());
 | 
			
		||||
        getRestAPIFactory().getRecordsAPI().deleteRecord(nonElectronicDocRestNodeModel.getId());
 | 
			
		||||
        getRestAPIFactory().getRecordsAPI().deleteRecord(electronicDocRestNodeModel.getId());
 | 
			
		||||
 | 
			
		||||
        UnfiledRecordFolderAPI unfiledRecordFoldersAPI = getRestAPIFactory().getUnfiledRecordFoldersAPI();
 | 
			
		||||
        unfiledRecordFoldersAPI.deleteUnfiledRecordFolder(unFiledFolder);
 | 
			
		||||
 | 
			
		||||
        RecordFolderAPI recordFolderAPI = getRestAPIFactory().getRecordFolderAPI();
 | 
			
		||||
        String recordFolderId = recordFolder.getId();
 | 
			
		||||
        recordFolderAPI.deleteRecordFolder(recordFolderId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @AfterClass (alwaysRun = true)
 | 
			
		||||
    public void deletePreConditions()
 | 
			
		||||
    {
 | 
			
		||||
        STEP("Delete the created rootCategory along with corresponding record folders/records present in it");
 | 
			
		||||
        getRestAPIFactory().getRecordCategoryAPI().deleteRecordCategory(rootCategory.getId());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private String createUnFileFolder() {
 | 
			
		||||
        String categoryName = "RM-2790 record Category name " + getRandomAlphanumeric();
 | 
			
		||||
 | 
			
		||||
        unfiledRecordFolderId = createUnfiledContainerChild(UNFILED_RECORDS_CONTAINER_ALIAS,
 | 
			
		||||
            categoryName + getRandomAlphanumeric(), UNFILED_RECORD_FOLDER_TYPE).getId();
 | 
			
		||||
        return unfiledRecordFolderId;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private String getNodeRef(HttpResponse httpResponse) {
 | 
			
		||||
            return convertHTTPResponseToJSON(httpResponse).getString("persistedObject")
 | 
			
		||||
                .replace(NODE_REF_WORKSPACE_SPACES_STORE, "");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,179 +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.records;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.dataprep.CMISUtil;
 | 
			
		||||
import org.alfresco.rest.rm.community.base.BaseRMRestTest;
 | 
			
		||||
import org.alfresco.rest.rm.community.model.record.Record;
 | 
			
		||||
import org.alfresco.rest.v0.RecordsAPI;
 | 
			
		||||
import org.alfresco.utility.Utility;
 | 
			
		||||
import org.alfresco.utility.constants.UserRole;
 | 
			
		||||
import org.alfresco.utility.model.FileModel;
 | 
			
		||||
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.annotations.AfterClass;
 | 
			
		||||
import org.testng.annotations.BeforeClass;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.utility.report.log.Step.STEP;
 | 
			
		||||
import static org.junit.Assert.assertNotNull;
 | 
			
		||||
import static org.springframework.http.HttpStatus.CREATED;
 | 
			
		||||
import static org.springframework.test.util.AssertionErrors.assertTrue;
 | 
			
		||||
import static org.testng.Assert.fail;
 | 
			
		||||
 | 
			
		||||
public class InplaceRecordSearchTests extends BaseRMRestTest {
 | 
			
		||||
 | 
			
		||||
    private UserModel siteCollaborator, siteConsumer, nonSiteMember;
 | 
			
		||||
    private SiteModel privateSite;
 | 
			
		||||
    private Record uploadedDocRecordbyCollabUser;
 | 
			
		||||
    private FileModel uploadedDocbyCollabUser;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RecordsAPI recordsAPI;
 | 
			
		||||
 | 
			
		||||
    @BeforeClass(alwaysRun = true)
 | 
			
		||||
    public void preConditions() {
 | 
			
		||||
 | 
			
		||||
        STEP("Create RM Site");
 | 
			
		||||
        createRMSiteIfNotExists();
 | 
			
		||||
 | 
			
		||||
        // And a private collaboration site
 | 
			
		||||
        privateSite = dataSite.usingAdmin().createPrivateRandomSite();
 | 
			
		||||
 | 
			
		||||
        // And a site collaborator
 | 
			
		||||
        siteCollaborator = getDataUser().createRandomTestUser();
 | 
			
		||||
        getDataUser().addUserToSite(siteCollaborator, privateSite, UserRole.SiteCollaborator);
 | 
			
		||||
 | 
			
		||||
        // And a site consumer
 | 
			
		||||
        siteConsumer = getDataUser().createRandomTestUser();
 | 
			
		||||
        getDataUser().addUserToSite(siteConsumer, privateSite, UserRole.SiteConsumer);
 | 
			
		||||
 | 
			
		||||
        nonSiteMember = getDataUser().createRandomTestUser();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Given a RM site
 | 
			
		||||
     * And a private collaboration site
 | 
			
		||||
     * And a site collaborator
 | 
			
		||||
     * And a site consumer
 | 
			
		||||
     * And a user who is not a member of the site
 | 
			
		||||
     * And a document that isn't a record
 | 
			
		||||
     * When the collaborator declares it as a record
 | 
			
		||||
     * Then the collaborator can browse to the record in the document library
 | 
			
		||||
     * And can find the record using live search
 | 
			
		||||
     * And can find the record using advanced search
 | 
			
		||||
     * And the consumer can browse to the record in the document library
 | 
			
		||||
     * And can find the record using live search
 | 
			
		||||
     * And can find the record using advanced search
 | 
			
		||||
     * And the user who is not a member of the site can't find the record using live search
 | 
			
		||||
     * And can't find the record using advanced search
 | 
			
		||||
     */
 | 
			
		||||
    @Test
 | 
			
		||||
    public void searchForInplaceRecord() {
 | 
			
		||||
        // And a document that isn't a record
 | 
			
		||||
        uploadedDocbyCollabUser = dataContent.usingSite(privateSite)
 | 
			
		||||
            .usingUser(siteCollaborator)
 | 
			
		||||
            .createContent(CMISUtil.DocumentType.TEXT_PLAIN);
 | 
			
		||||
 | 
			
		||||
        assertNotNull(uploadedDocbyCollabUser.getNodeRef());
 | 
			
		||||
 | 
			
		||||
        // declare uploadedDocument as record
 | 
			
		||||
        uploadedDocRecordbyCollabUser = getRestAPIFactory().getFilesAPI(siteCollaborator)
 | 
			
		||||
            .declareAsRecord(uploadedDocbyCollabUser.getNodeRefWithoutVersion());
 | 
			
		||||
        assertStatusCode(CREATED);
 | 
			
		||||
 | 
			
		||||
        assertNotNull(uploadedDocRecordbyCollabUser.getId());
 | 
			
		||||
 | 
			
		||||
        STEP("Allow the Document to be index for it to be available");
 | 
			
		||||
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            Utility.sleep(1000, 40000, () ->
 | 
			
		||||
            {
 | 
			
		||||
                JSONObject siteConsumerSearchJson = getSearchApi().liveSearchForDocuments(siteConsumer.getUsername(),
 | 
			
		||||
                    siteConsumer.getPassword(),
 | 
			
		||||
                    uploadedDocbyCollabUser.getName());
 | 
			
		||||
                assertTrue("Site Consumer not able to find the document.",siteConsumerSearchJson.getJSONArray("items").length() != 0);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        catch (InterruptedException e)
 | 
			
		||||
        {
 | 
			
		||||
            fail("InterruptedException received while waiting for results.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            Utility.sleep(1000, 40000, () ->
 | 
			
		||||
                {
 | 
			
		||||
                    JSONObject siteCollaboratorSearchJson = getSearchApi().liveSearchForDocuments(siteCollaborator.getUsername(),
 | 
			
		||||
                    siteCollaborator.getPassword(),
 | 
			
		||||
                    uploadedDocbyCollabUser.getName());
 | 
			
		||||
                    assertTrue("Site Collaborator not able to find the document.",siteCollaboratorSearchJson.getJSONArray("items").length() != 0);
 | 
			
		||||
                });
 | 
			
		||||
        }
 | 
			
		||||
        catch (InterruptedException e)
 | 
			
		||||
        {
 | 
			
		||||
            fail("InterruptedException received while waiting for results.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        JSONObject nonSiteMemberSearchJson = getSearchApi().liveSearchForDocuments(nonSiteMember.getUsername(),
 | 
			
		||||
            nonSiteMember.getPassword(),
 | 
			
		||||
            uploadedDocbyCollabUser.getName());
 | 
			
		||||
 | 
			
		||||
        assertTrue("Non Site Member is able to access restricted document.",nonSiteMemberSearchJson.getJSONArray("items").isEmpty());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Given @see {@link #searchForInplaceRecord()}
 | 
			
		||||
     * When the collaboration user hides the record in the collaboration site
 | 
			
		||||
     * Then the collaborator can not browse to the record in the document library
 | 
			
		||||
     * And can't find the record using live search
 | 
			
		||||
     * And can't find the record using advanced search
 | 
			
		||||
     */
 | 
			
		||||
    @Test(dependsOnMethods = {"searchForInplaceRecord"})
 | 
			
		||||
    public void usersCantFindRecordAfterHide() {
 | 
			
		||||
        recordsAPI.hideRecord(siteCollaborator.getUsername(),siteCollaborator.getPassword(),uploadedDocRecordbyCollabUser.getId());
 | 
			
		||||
 | 
			
		||||
        JSONObject siteCollaboratorSearchJson = getSearchApi().liveSearchForDocuments(siteCollaborator.getUsername(),
 | 
			
		||||
            siteCollaborator.getPassword(),
 | 
			
		||||
            uploadedDocbyCollabUser.getName());
 | 
			
		||||
        assertTrue("Site Collaborator able to find the document after it is hidden.",siteCollaboratorSearchJson.getJSONArray("items").isEmpty());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @AfterClass
 | 
			
		||||
    public void tearDown() {
 | 
			
		||||
        // clean-up collab site
 | 
			
		||||
        dataSite.usingAdmin().deleteSite(privateSite);
 | 
			
		||||
 | 
			
		||||
        // clean-up users siteCollaborator, siteConsumer, nonSiteMember
 | 
			
		||||
        dataUser.deleteUser(siteCollaborator);
 | 
			
		||||
        dataUser.deleteUser(siteConsumer);
 | 
			
		||||
        dataUser.deleteUser(nonSiteMember);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,539 +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.records;
 | 
			
		||||
 | 
			
		||||
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.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.unfiledcontainer.UnfiledContainerChild;
 | 
			
		||||
import org.alfresco.rest.rm.community.requests.gscore.api.UnfiledContainerAPI;
 | 
			
		||||
import org.alfresco.rest.v0.RMRolesAndActionsAPI;
 | 
			
		||||
import org.alfresco.rest.v0.RecordsAPI;
 | 
			
		||||
import org.alfresco.rest.v0.SearchAPI;
 | 
			
		||||
import org.alfresco.utility.Utility;
 | 
			
		||||
import org.alfresco.utility.model.UserModel;
 | 
			
		||||
import org.apache.http.HttpResponse;
 | 
			
		||||
import org.json.JSONObject;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.testng.annotations.AfterClass;
 | 
			
		||||
import org.testng.annotations.BeforeClass;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
import org.json.JSONArray;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.concurrent.atomic.AtomicBoolean;
 | 
			
		||||
import java.util.concurrent.atomic.AtomicReference;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
import java.util.stream.IntStream;
 | 
			
		||||
import static org.alfresco.rest.rm.community.base.TestData.ELECTRONIC_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.CONTENT_TYPE;
 | 
			
		||||
import static org.alfresco.rest.rm.community.model.user.UserPermissions.*;
 | 
			
		||||
import static org.alfresco.rest.rm.community.util.CommonTestUtils.generateTestPrefix;
 | 
			
		||||
import static org.alfresco.rest.rm.community.utils.FilePlanComponentsUtil.createTempFile;
 | 
			
		||||
import static org.alfresco.utility.report.log.Step.STEP;
 | 
			
		||||
import static org.junit.Assert.assertFalse;
 | 
			
		||||
import static org.junit.Assert.fail;
 | 
			
		||||
import static org.testng.Assert.assertTrue;
 | 
			
		||||
/**
 | 
			
		||||
 * Tests the search of records in Records Search page
 | 
			
		||||
 * @author Kavit Shah
 | 
			
		||||
 */
 | 
			
		||||
public class SearchRecordsTests extends BaseRMRestTest {
 | 
			
		||||
 | 
			
		||||
    private Optional<UserModel> nonRmSiteUser, rm_user_search, rm_manager, rm_admin_search;
 | 
			
		||||
 | 
			
		||||
    /** The default password used when creating test users. */
 | 
			
		||||
    public static final String ROLE_RM_MANAGER = "RecordsManager";
 | 
			
		||||
    private final String TEST_PREFIX = generateTestPrefix(SearchRecordsTests.class);
 | 
			
		||||
    private final String CATEGORY_ALL = TEST_PREFIX + "everybody's category";
 | 
			
		||||
    private final String FOLDER_SEARCH = TEST_PREFIX + "basic search folder";
 | 
			
		||||
    private final String FOLDER_ADMIN_ONLY = TEST_PREFIX + "rm admin category";
 | 
			
		||||
    private final String CATEGORY_ADMIN_ONLY = TEST_PREFIX + "rm admin category";
 | 
			
		||||
    public static final String ROLE_RM_USER = "User";
 | 
			
		||||
    public static final String ADMIN = "Administrator";
 | 
			
		||||
    private final String ELECTRONIC_RECORD = TEST_PREFIX + " Electronic";
 | 
			
		||||
    private final String UNFILED_ELECTRONIC_RECORD = TEST_PREFIX + " Unfiled Electronic";
 | 
			
		||||
    private final String NON_ELECTRONIC_RECORD = TEST_PREFIX + " Non-Electronic";
 | 
			
		||||
    private final String ADMIN_ELECTRONIC_RECORD = TEST_PREFIX + " admin Electronic";
 | 
			
		||||
    public static final String TITLE = "Title";
 | 
			
		||||
    public static final String DESCRIPTION = "Description";
 | 
			
		||||
    public static final String TEST_CONTENT = "This is some test content";
 | 
			
		||||
    private RecordCategory categoryAll, category_Admin_Only;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RMRolesAndActionsAPI rmRolesAndActionsAPI;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private SearchAPI searchAPI;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RecordsAPI recordsAPI;
 | 
			
		||||
 | 
			
		||||
    @BeforeClass (alwaysRun = true)
 | 
			
		||||
    public void createRecordsForSearch()
 | 
			
		||||
    {
 | 
			
		||||
        createRMSiteIfNotExists();
 | 
			
		||||
        nonRmSiteUser = Optional.ofNullable(getDataUser().createRandomTestUser());
 | 
			
		||||
        // create RM manager and RM user
 | 
			
		||||
        createRMManager();
 | 
			
		||||
        createRMUser();
 | 
			
		||||
        createRMAdmin();
 | 
			
		||||
        categoryAll = createCategoryIfDoesNotExist(CATEGORY_ALL);
 | 
			
		||||
        createRecordFolderInCategory(FOLDER_SEARCH, categoryAll);
 | 
			
		||||
 | 
			
		||||
        category_Admin_Only = createCategoryIfDoesNotExist(CATEGORY_ADMIN_ONLY);
 | 
			
		||||
        createRecordFolderInCategory(FOLDER_ADMIN_ONLY,category_Admin_Only);
 | 
			
		||||
 | 
			
		||||
        // upload records in folder in category and in Unfiled Records
 | 
			
		||||
        uploadElectronicRecordInContainer(ELECTRONIC_RECORD, FOLDER_SEARCH);
 | 
			
		||||
        createNonElectronicRecordInContainer(NON_ELECTRONIC_RECORD, CATEGORY_ALL, FOLDER_SEARCH);
 | 
			
		||||
        uploadElectronicRecordInContainer(ADMIN_ELECTRONIC_RECORD, FOLDER_ADMIN_ONLY);
 | 
			
		||||
 | 
			
		||||
        UnfiledContainerChild electronicRecord = UnfiledContainerChild.builder()
 | 
			
		||||
            .name(UNFILED_ELECTRONIC_RECORD)
 | 
			
		||||
            .nodeType(CONTENT_TYPE)
 | 
			
		||||
            .content(RecordContent.builder().mimeType("text/plain").build())
 | 
			
		||||
            .build();
 | 
			
		||||
        getRecordsFromUnfiledRecordsContainer(electronicRecord);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Given I have created record category X which contains record folder Y which contains record Z
 | 
			
		||||
     * And I have selected to display record category id in the search results
 | 
			
		||||
     * When I issue a record search whose results will contain record X
 | 
			
		||||
     * Then record X is displayed in the results
 | 
			
		||||
     * And the record category X's ID is also displayed in search result meta-data for record X
 | 
			
		||||
     */
 | 
			
		||||
    @Test(priority = 1)
 | 
			
		||||
    public void searchResultsWithRecordCategoryIdentifier() {
 | 
			
		||||
        AtomicBoolean electronicRecordFound = new AtomicBoolean(false);
 | 
			
		||||
        AtomicReference<JSONArray> items = new AtomicReference<>();
 | 
			
		||||
        AtomicBoolean recordCategoryIdentifier = new AtomicBoolean(false);
 | 
			
		||||
 | 
			
		||||
        STEP("Open the record search page and search by the items created");
 | 
			
		||||
        try {
 | 
			
		||||
            Utility.sleep(1000, 40000, () -> {
 | 
			
		||||
                JSONObject searchResult = (searchAPI
 | 
			
		||||
                    .rmSearch(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
                        getDataUser().usingAdmin().getAdminUser().getPassword(),
 | 
			
		||||
                        "rm",
 | 
			
		||||
                        "keywords:" + TEST_PREFIX + "*",
 | 
			
		||||
                        "records/true,undeclared/true,vital/false,folders/false,categories/false,frozen/false,cutoff/false",
 | 
			
		||||
                        "rma:identifier/asc"));
 | 
			
		||||
                items.set((JSONArray) searchResult.get("items"));
 | 
			
		||||
                assertFalse("Site Consumer not able to find the document.", ((JSONArray)searchResult.get("items")).isEmpty());
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        catch (InterruptedException e) {
 | 
			
		||||
            fail("InterruptedException received while waiting for results.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        STEP("Check that the records from file plan have the record category identifier displayed");
 | 
			
		||||
        List searchList = IntStream.range(0, items.get().length()).mapToObj(i-> items.get().get(i)).collect(Collectors.toList());
 | 
			
		||||
 | 
			
		||||
        searchList.stream().forEach(x -> {
 | 
			
		||||
            Map<String, String> reconstructedUtilMap = Arrays.stream(x.toString().split(","))
 | 
			
		||||
                .map(s -> s.split(":"))
 | 
			
		||||
                .collect(Collectors.toMap(s -> s[0], s -> s[1]));
 | 
			
		||||
            if(reconstructedUtilMap.get("\"name\"").contains(TEST_PREFIX + " Electronic")) {
 | 
			
		||||
                electronicRecordFound.set(true);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        assertFalse("The File Name with the Prefix " + TEST_PREFIX + " as Electronic Record was not found.", !electronicRecordFound.get());
 | 
			
		||||
 | 
			
		||||
        STEP("Change the search filter to return only record folders and record categories");
 | 
			
		||||
        try {
 | 
			
		||||
            Utility.sleep(1000, 40000, () -> {
 | 
			
		||||
                JSONObject searchResult = (searchAPI
 | 
			
		||||
                    .rmSearch(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
                        getDataUser().usingAdmin().getAdminUser().getPassword(),
 | 
			
		||||
                        "rm",
 | 
			
		||||
                        "keywords:" + TEST_PREFIX + "*",
 | 
			
		||||
                        "records/false,undeclared/true,vital/false,folders/true,categories/true,frozen/false,cutoff/false",
 | 
			
		||||
                        "rma:identifier/asc"));
 | 
			
		||||
                items.set((JSONArray) searchResult.get("items"));
 | 
			
		||||
                assertFalse("Site Consumer not able to find the document.", ((JSONArray)searchResult.get("items")).isEmpty());
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        catch (InterruptedException e) {
 | 
			
		||||
            fail("InterruptedException received while waiting for results.");
 | 
			
		||||
        }
 | 
			
		||||
        STEP("Check that the records folders and categories don't have a record category identifier displayed");
 | 
			
		||||
        List recordFolderSearchList = IntStream.range(0, items.get().length()).mapToObj(i-> items.get().get(i)).collect(Collectors.toList());
 | 
			
		||||
 | 
			
		||||
        recordFolderSearchList.stream().forEach(x -> {
 | 
			
		||||
            Map<String, String> reconstructedUtilMap = Arrays.stream(x.toString().split(","))
 | 
			
		||||
                .map(s -> s.split(":"))
 | 
			
		||||
                .collect(Collectors.toMap(s -> s[0], s -> s[1]));
 | 
			
		||||
            if(null != reconstructedUtilMap.get("\"rma_recordCategoryIdentifier\"")) {
 | 
			
		||||
                recordCategoryIdentifier.set(true);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        assertFalse("Record Category Identifier displayed for " + TEST_PREFIX + ".", recordCategoryIdentifier.get());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * User with RM User role can see the records he has permission over and all in Unfiled Records
 | 
			
		||||
     * <p>
 | 
			
		||||
     * Given that I am a RM User
 | 
			
		||||
     * I can see only the records in File Plan I have permission over and all in Unfiled Records
 | 
			
		||||
     */
 | 
			
		||||
    @Test (priority = 2)
 | 
			
		||||
    public void nonRMUserSearchResults() {
 | 
			
		||||
        try {
 | 
			
		||||
            Utility.sleep(1000, 40000, () -> {
 | 
			
		||||
                List<String> stringList = (searchAPI
 | 
			
		||||
                    .searchForDocumentsAsUser(nonRmSiteUser.get().getUsername(),
 | 
			
		||||
                        nonRmSiteUser.get().getPassword(),
 | 
			
		||||
                        ELECTRONIC_RECORD));
 | 
			
		||||
                assertFalse("The file with search term " + ELECTRONIC_RECORD + " was found using RM Not Site User "+ nonRmSiteUser.get().getUsername(),getResult(ELECTRONIC_RECORD,stringList));
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        catch (InterruptedException e) {
 | 
			
		||||
            fail("InterruptedException received while waiting for results.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            Utility.sleep(1000, 40000, () -> {
 | 
			
		||||
                List<String> stringList = (searchAPI
 | 
			
		||||
                    .searchForDocumentsAsUser(nonRmSiteUser.get().getUsername(),
 | 
			
		||||
                        nonRmSiteUser.get().getPassword(),
 | 
			
		||||
                        UNFILED_ELECTRONIC_RECORD));
 | 
			
		||||
                assertFalse("The file with search term " + UNFILED_ELECTRONIC_RECORD + " was not found using RM Not Site User "+ nonRmSiteUser.get().getUsername(),getResult(UNFILED_ELECTRONIC_RECORD,stringList));
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        catch (InterruptedException e) {
 | 
			
		||||
            fail("InterruptedException received while waiting for results.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            Utility.sleep(1000, 40000, () -> {
 | 
			
		||||
                List<String> stringList = (searchAPI
 | 
			
		||||
                    .searchForDocumentsAsUser(nonRmSiteUser.get().getUsername(),
 | 
			
		||||
                        nonRmSiteUser.get().getPassword(),
 | 
			
		||||
                        NON_ELECTRONIC_RECORD));
 | 
			
		||||
                assertFalse("The file with search term " + NON_ELECTRONIC_RECORD + " was not found using RM Not Site User "+ nonRmSiteUser.get().getUsername(),getResult(NON_ELECTRONIC_RECORD,stringList));
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        catch (InterruptedException e) {
 | 
			
		||||
            fail("InterruptedException received while waiting for results.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            Utility.sleep(1000, 40000, () -> {
 | 
			
		||||
                List<String> stringList = searchAPI
 | 
			
		||||
                    .searchForDocumentsAsUser(nonRmSiteUser.get().getUsername(),
 | 
			
		||||
                        nonRmSiteUser.get().getPassword(),
 | 
			
		||||
                        ADMIN_ELECTRONIC_RECORD);
 | 
			
		||||
                assertFalse("The file with search term " + ADMIN_ELECTRONIC_RECORD + " was not found using RM Not Site User "+ nonRmSiteUser.get().getUsername(),getResult(ADMIN_ELECTRONIC_RECORD,stringList));
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        catch (InterruptedException e) {
 | 
			
		||||
            fail("InterruptedException received while waiting for results.");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * User with RM User role can see the records he has permission over and all in Unfiled Records
 | 
			
		||||
     * <p>
 | 
			
		||||
     * Given that I am a RM User
 | 
			
		||||
     * I can see only the records in File Plan I have permission over and all in Unfiled Records
 | 
			
		||||
     */
 | 
			
		||||
    @Test (priority = 3)
 | 
			
		||||
    public void rmUserSearchResults() {
 | 
			
		||||
        getRestAPIFactory().getRMUserAPI().addUserPermission(categoryAll.getId(), rm_user_search.get(), PERMISSION_READ_RECORDS);
 | 
			
		||||
        getRestAPIFactory().getRMUserAPI().addUserPermission(categoryAll.getId(), rm_user_search.get(), PERMISSION_FILE_RECORDS);
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            Utility.sleep(1000, 40000, () -> {
 | 
			
		||||
                List<String> stringList = (searchAPI
 | 
			
		||||
                    .searchForDocumentsAsUser(rm_user_search.get().getUsername(),
 | 
			
		||||
                        rm_user_search.get().getPassword(),
 | 
			
		||||
                        ELECTRONIC_RECORD));
 | 
			
		||||
                assertTrue(getResult(ELECTRONIC_RECORD,stringList),"The file with search term" + ELECTRONIC_RECORD + " was not found using RM User "+ rm_user_search.get().getUsername());
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        catch (InterruptedException e) {
 | 
			
		||||
            fail("InterruptedException received while waiting for results.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            Utility.sleep(1000, 40000, () -> {
 | 
			
		||||
                List<String> stringList = (searchAPI
 | 
			
		||||
                    .searchForDocumentsAsUser(rm_user_search.get().getUsername(),
 | 
			
		||||
                        rm_user_search.get().getPassword(),
 | 
			
		||||
                        UNFILED_ELECTRONIC_RECORD));
 | 
			
		||||
                assertTrue(getResult(UNFILED_ELECTRONIC_RECORD,stringList),"The file with search term" + UNFILED_ELECTRONIC_RECORD + " was not found using RM User "+ rm_user_search.get().getUsername());
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        catch (InterruptedException e) {
 | 
			
		||||
            fail("InterruptedException received while waiting for results.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            Utility.sleep(1000, 40000, () -> {
 | 
			
		||||
                List<String> stringList = (searchAPI
 | 
			
		||||
                    .searchForDocumentsAsUser(rm_user_search.get().getUsername(),
 | 
			
		||||
                        rm_user_search.get().getPassword(),
 | 
			
		||||
                        NON_ELECTRONIC_RECORD));
 | 
			
		||||
                assertTrue(getResult(NON_ELECTRONIC_RECORD,stringList),"The file with search term" + NON_ELECTRONIC_RECORD + " was not found using RM User "+ rm_user_search.get().getUsername());
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        catch (InterruptedException e) {
 | 
			
		||||
            fail("InterruptedException received while waiting for results.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            Utility.sleep(1000, 40000, () -> {
 | 
			
		||||
                List<String> stringList = searchAPI
 | 
			
		||||
                    .searchForDocumentsAsUser(rm_user_search.get().getUsername(),
 | 
			
		||||
                        rm_user_search.get().getPassword(),
 | 
			
		||||
                        ADMIN_ELECTRONIC_RECORD);
 | 
			
		||||
                assertFalse("The file with search term" + ADMIN_ELECTRONIC_RECORD + " was not found using RM User "+ rm_user_search.get().getUsername(),getResult(ADMIN_ELECTRONIC_RECORD,stringList));
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        catch (InterruptedException e) {
 | 
			
		||||
            fail("InterruptedException received while waiting for results.");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * User with RM Manager role can see the records he has permission over and all in Unfiled Records
 | 
			
		||||
     * <p>
 | 
			
		||||
     * Given that I am a RM Manager
 | 
			
		||||
     * I can see only the records in File Plan I have permission over and all in Unfiled Records
 | 
			
		||||
     */
 | 
			
		||||
    @Test (priority = 4)
 | 
			
		||||
    public void rmManagerSearchResults() {
 | 
			
		||||
        getRestAPIFactory().getRMUserAPI().addUserPermission(categoryAll.getId(), rm_manager.get(), PERMISSION_READ_RECORDS);
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            Utility.sleep(1000, 40000, () -> {
 | 
			
		||||
                List<String> stringList = (searchAPI
 | 
			
		||||
                    .searchForDocumentsAsUser(rm_manager.get().getUsername(),
 | 
			
		||||
                        rm_manager.get().getPassword(),
 | 
			
		||||
                        ELECTRONIC_RECORD));
 | 
			
		||||
                assertTrue(getResult(ELECTRONIC_RECORD,stringList),"The file with search term " + ELECTRONIC_RECORD + " was not found using RM manager User "+ rm_manager.get().getUsername());
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        catch (InterruptedException e) {
 | 
			
		||||
            fail("InterruptedException received while waiting for results.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            Utility.sleep(1000, 40000, () -> {
 | 
			
		||||
                List<String> stringList = (searchAPI
 | 
			
		||||
                    .searchForDocumentsAsUser(rm_manager.get().getUsername(),
 | 
			
		||||
                        rm_manager.get().getPassword(),
 | 
			
		||||
                        UNFILED_ELECTRONIC_RECORD));
 | 
			
		||||
                assertTrue(getResult(UNFILED_ELECTRONIC_RECORD,stringList),"The file with search term " + UNFILED_ELECTRONIC_RECORD + " was not found using RM manager User "+ rm_manager.get().getUsername());
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        catch (InterruptedException e) {
 | 
			
		||||
            fail("InterruptedException received while waiting for results.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            Utility.sleep(1000, 40000, () -> {
 | 
			
		||||
                List<String> stringList = (searchAPI
 | 
			
		||||
                    .searchForDocumentsAsUser(rm_manager.get().getUsername(),
 | 
			
		||||
                        rm_manager.get().getPassword(),
 | 
			
		||||
                        NON_ELECTRONIC_RECORD));
 | 
			
		||||
                assertTrue(getResult(NON_ELECTRONIC_RECORD,stringList),"The file with search term " + NON_ELECTRONIC_RECORD + " was not found using RM manager User "+ rm_manager.get().getUsername());
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        catch (InterruptedException e) {
 | 
			
		||||
            fail("InterruptedException received while waiting for results.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            Utility.sleep(1000, 40000, () -> {
 | 
			
		||||
                List<String> stringList = searchAPI
 | 
			
		||||
                    .searchForDocumentsAsUser(rm_manager.get().getUsername(),
 | 
			
		||||
                        rm_manager.get().getPassword(),
 | 
			
		||||
                        ADMIN_ELECTRONIC_RECORD);
 | 
			
		||||
                assertFalse("The file with search term" + ADMIN_ELECTRONIC_RECORD + " was found using RM manager User "+ rm_manager.get().getUsername(),getResult(ADMIN_ELECTRONIC_RECORD,stringList));
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        catch (InterruptedException e) {
 | 
			
		||||
            fail("InterruptedException received while waiting for results.");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * User with RM Administrator role can see all the records
 | 
			
		||||
     *
 | 
			
		||||
     * Given that I am a RM Administrator
 | 
			
		||||
     * I can see all the records in File Plan and Unfiled Records through RM Search and Advanced Search
 | 
			
		||||
     */
 | 
			
		||||
    @Test(priority = 5)
 | 
			
		||||
    public void rmAdminSearchResults() {
 | 
			
		||||
        try {
 | 
			
		||||
            Utility.sleep(1000, 40000, () -> {
 | 
			
		||||
                List<String> stringList = (searchAPI
 | 
			
		||||
                    .searchForDocumentsAsUser(rm_admin_search.get().getUsername(),
 | 
			
		||||
                        rm_admin_search.get().getPassword(),
 | 
			
		||||
                        ELECTRONIC_RECORD));
 | 
			
		||||
                assertTrue(getResult(ELECTRONIC_RECORD,stringList),"The file with search term " + ELECTRONIC_RECORD + " was not found using RM Admin User "+ rm_admin_search.get().getUsername());
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        catch (InterruptedException e) {
 | 
			
		||||
            fail("InterruptedException received while waiting for results.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            Utility.sleep(1000, 40000, () -> {
 | 
			
		||||
                List<String> stringList = (searchAPI
 | 
			
		||||
                    .searchForDocumentsAsUser(rm_admin_search.get().getUsername(),
 | 
			
		||||
                        rm_admin_search.get().getPassword(),
 | 
			
		||||
                        UNFILED_ELECTRONIC_RECORD));
 | 
			
		||||
                assertTrue(getResult(UNFILED_ELECTRONIC_RECORD,stringList),"The file with search term " + UNFILED_ELECTRONIC_RECORD + " was not found using RM Admin User "+ rm_admin_search.get().getUsername());
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        catch (InterruptedException e) {
 | 
			
		||||
            fail("InterruptedException received while waiting for results.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            Utility.sleep(1000, 40000, () -> {
 | 
			
		||||
                List<String> stringList = (searchAPI
 | 
			
		||||
                    .searchForDocumentsAsUser(rm_admin_search.get().getUsername(),
 | 
			
		||||
                        rm_admin_search.get().getPassword(),
 | 
			
		||||
                        NON_ELECTRONIC_RECORD));
 | 
			
		||||
                assertTrue(getResult(NON_ELECTRONIC_RECORD,stringList),"The file with search term " + NON_ELECTRONIC_RECORD + " was not found using RM Admin User "+ rm_admin_search.get().getUsername());
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        catch (InterruptedException e) {
 | 
			
		||||
            fail("InterruptedException received while waiting for results.");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void createRMManager() {
 | 
			
		||||
        // create RM manager
 | 
			
		||||
        rm_manager = Optional.ofNullable(getDataUser().createRandomTestUser());
 | 
			
		||||
        rmRolesAndActionsAPI.assignRoleToUser(
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(),
 | 
			
		||||
            rm_manager.get().getUsername(),
 | 
			
		||||
            ROLE_RM_MANAGER
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void createRMUser() {
 | 
			
		||||
        // create RM manager
 | 
			
		||||
        rm_user_search = Optional.ofNullable(getDataUser().createRandomTestUser());
 | 
			
		||||
        rmRolesAndActionsAPI.assignRoleToUser(
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(),
 | 
			
		||||
            rm_user_search.get().getUsername(),
 | 
			
		||||
            ROLE_RM_USER
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void createRMAdmin() {
 | 
			
		||||
        // create RM Admin
 | 
			
		||||
        rm_admin_search = Optional.ofNullable(getDataUser().createRandomTestUser());
 | 
			
		||||
        rmRolesAndActionsAPI.assignRoleToUser(
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(),
 | 
			
		||||
            rm_admin_search.get().getUsername(),
 | 
			
		||||
            ADMIN
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private RecordCategory createCategoryIfDoesNotExist(String CATEGORY_ALL) {
 | 
			
		||||
        return createRootCategory(getDataUser().usingAdmin().getAdminUser(), CATEGORY_ALL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private RecordCategoryChild createRecordFolderInCategory(String FOLDER_SEARCH, RecordCategory recordCategory) {
 | 
			
		||||
        return createFolder(getDataUser().usingAdmin().getAdminUser(), recordCategory.getId(), FOLDER_SEARCH);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void uploadElectronicRecordInContainer(String electronic_record, String folder_search) {
 | 
			
		||||
        recordsAPI.uploadElectronicRecord(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(),
 | 
			
		||||
            getDefaultElectronicRecordProperties(electronic_record), folder_search, CMISUtil.DocumentType.TEXT_PLAIN);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    protected HttpResponse createNonElectronicRecordInContainer(String name, String categoryName, String folderName) {
 | 
			
		||||
        Map<BaseAPI.RMProperty, String> defaultProperties = new HashMap<>();
 | 
			
		||||
        defaultProperties.put(BaseAPI.RMProperty.NAME, name);
 | 
			
		||||
        defaultProperties.put(BaseAPI.RMProperty.TITLE, TITLE);
 | 
			
		||||
        defaultProperties.put(BaseAPI.RMProperty.DESCRIPTION, DESCRIPTION);
 | 
			
		||||
 | 
			
		||||
        return recordsAPI.createNonElectronicRecord(getDataUser().usingAdmin().getAdminUser().getUsername(),
 | 
			
		||||
            getDataUser().usingAdmin().getAdminUser().getPassword(), defaultProperties, categoryName, folderName);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public 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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @AfterClass(alwaysRun = true)
 | 
			
		||||
    public void standardSearchTeardown() {
 | 
			
		||||
        // delete categories
 | 
			
		||||
        deleteRecordCategory(categoryAll.getId());
 | 
			
		||||
        deleteRecordCategory(category_Admin_Only.getId());
 | 
			
		||||
 | 
			
		||||
        // delete users
 | 
			
		||||
        Optional.of(nonRmSiteUser).ifPresent(x -> getDataUser().deleteUser(x.get()));
 | 
			
		||||
        Optional.of(rm_user_search).ifPresent(x -> getDataUser().deleteUser(x.get()));
 | 
			
		||||
        Optional.of(rm_manager).ifPresent(x -> getDataUser().deleteUser(x.get()));
 | 
			
		||||
        Optional.of(rm_admin_search).ifPresent(x -> getDataUser().deleteUser(x.get()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private boolean getResult(String partialRecordName, List<String> searchResults) {
 | 
			
		||||
        if(null != searchResults) {
 | 
			
		||||
            for (String searchResult : searchResults) {
 | 
			
		||||
                if (searchResult.startsWith(partialRecordName)) {
 | 
			
		||||
                    return true;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private Object[][] getRecordsFromUnfiledRecordsContainer(UnfiledContainerChild electronicRecord)
 | 
			
		||||
    {
 | 
			
		||||
        UnfiledContainerAPI unfiledContainersAPI = getRestAPIFactory().getUnfiledContainersAPI();
 | 
			
		||||
        return new String[][] {
 | 
			
		||||
            { unfiledContainersAPI.uploadRecord(electronicRecord, UNFILED_RECORDS_CONTAINER_ALIAS,
 | 
			
		||||
                createTempFile(ELECTRONIC_RECORD_NAME, ELECTRONIC_RECORD_NAME)).getId()}
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
   <parent>
 | 
			
		||||
      <groupId>org.alfresco</groupId>
 | 
			
		||||
      <artifactId>alfresco-governance-services-community-parent</artifactId>
 | 
			
		||||
      <version>17.48</version>
 | 
			
		||||
      <version>23.1.0.23-SNAPSHOT</version>
 | 
			
		||||
   </parent>
 | 
			
		||||
 | 
			
		||||
   <modules>
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
   <parent>
 | 
			
		||||
      <groupId>org.alfresco</groupId>
 | 
			
		||||
      <artifactId>alfresco-governance-services-community-repo-parent</artifactId>
 | 
			
		||||
      <version>17.48</version>
 | 
			
		||||
      <version>23.1.0.23-SNAPSHOT</version>
 | 
			
		||||
   </parent>
 | 
			
		||||
 | 
			
		||||
   <properties>
 | 
			
		||||
 
 | 
			
		||||
@@ -3,8 +3,8 @@
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# Version label
 | 
			
		||||
version.major=7
 | 
			
		||||
version.minor=3
 | 
			
		||||
version.major=23
 | 
			
		||||
version.minor=1
 | 
			
		||||
version.revision=0
 | 
			
		||||
version.label=
 | 
			
		||||
 | 
			
		||||
@@ -15,4 +15,4 @@ version.edition=Community
 | 
			
		||||
version.scmrevision=@scm-path@-r@scm-revision@
 | 
			
		||||
 | 
			
		||||
# Build number
 | 
			
		||||
version.build=r@scm-revision@-b@build-number@
 | 
			
		||||
version.build=r@scm-revision@-b@build-number@
 | 
			
		||||
@@ -168,7 +168,6 @@
 | 
			
		||||
      <property name="nodeService" ref="NodeService"/>
 | 
			
		||||
      <property name="ruleService" ref="RuleService"/>
 | 
			
		||||
      <property name="actionService" ref="ActionService"/>
 | 
			
		||||
      <property name="runtimeActionService" ref="actionService"/>
 | 
			
		||||
      <property name="dictionaryService" ref="DictionaryService"/>
 | 
			
		||||
      <property name="fileFolderService" ref="FileFolderService"/>
 | 
			
		||||
      <property name="namespaceService" ref="NamespaceService" />
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,7 @@
 | 
			
		||||
 | 
			
		||||
package org.alfresco.module.org_alfresco_module_rm.action.impl;
 | 
			
		||||
 | 
			
		||||
import static org.mockito.Mockito.verifyNoInteractions;
 | 
			
		||||
import static org.mockito.Mockito.verifyZeroInteractions;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.error.AlfrescoRuntimeException;
 | 
			
		||||
import org.alfresco.module.org_alfresco_module_rm.action.BaseActionUnitTest;
 | 
			
		||||
@@ -86,7 +86,7 @@ public class FileReportActionUnitTest extends BaseActionUnitTest
 | 
			
		||||
        fileReportAction.executeImpl(getMockedAction(), actionedUponNodeRef);
 | 
			
		||||
 | 
			
		||||
        // == then ==
 | 
			
		||||
        verifyNoInteractions(mockedReportService, mockedNodeService);
 | 
			
		||||
        verifyZeroInteractions(mockedReportService, mockedNodeService);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -110,6 +110,6 @@ public class FileReportActionUnitTest extends BaseActionUnitTest
 | 
			
		||||
        fileReportAction.executeImpl(getMockedAction(), actionedUponNodeRef);
 | 
			
		||||
 | 
			
		||||
        // == then ==
 | 
			
		||||
        verifyNoInteractions(mockedReportService, mockedNodeService);
 | 
			
		||||
        verifyZeroInteractions(mockedReportService, mockedNodeService);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@
 | 
			
		||||
package org.alfresco.module.org_alfresco_module_rm.action.impl;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.module.org_alfresco_module_rm.test.util.AlfMock.generateText;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.any;
 | 
			
		||||
import static org.mockito.Matchers.any;
 | 
			
		||||
import static org.mockito.Mockito.doReturn;
 | 
			
		||||
import static org.mockito.Mockito.mock;
 | 
			
		||||
import static org.mockito.Mockito.never;
 | 
			
		||||
 
 | 
			
		||||
@@ -38,8 +38,8 @@ import static org.alfresco.module.org_alfresco_module_rm.model.RecordsManagement
 | 
			
		||||
import static org.alfresco.module.org_alfresco_module_rm.model.rma.type.RmSiteType.DEFAULT_SITE_NAME;
 | 
			
		||||
import static org.junit.Assert.assertEquals;
 | 
			
		||||
import static org.junit.Assert.assertNotNull;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.any;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.eq;
 | 
			
		||||
import static org.mockito.Matchers.any;
 | 
			
		||||
import static org.mockito.Matchers.eq;
 | 
			
		||||
import static org.mockito.Mockito.times;
 | 
			
		||||
import static org.mockito.Mockito.verify;
 | 
			
		||||
import static org.mockito.Mockito.when;
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,7 @@
 | 
			
		||||
 | 
			
		||||
package org.alfresco.module.org_alfresco_module_rm.bootstrap;
 | 
			
		||||
 | 
			
		||||
import static org.mockito.ArgumentMatchers.anyString;
 | 
			
		||||
import static org.mockito.Matchers.anyString;
 | 
			
		||||
import static org.mockito.Mockito.never;
 | 
			
		||||
import static org.mockito.Mockito.verify;
 | 
			
		||||
import static org.mockito.Mockito.when;
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,8 @@
 | 
			
		||||
package org.alfresco.module.org_alfresco_module_rm.capability;
 | 
			
		||||
 | 
			
		||||
import static org.junit.Assert.assertEquals;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.any;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.eq;
 | 
			
		||||
import static org.mockito.Matchers.any;
 | 
			
		||||
import static org.mockito.Matchers.eq;
 | 
			
		||||
import static org.mockito.Mockito.mock;
 | 
			
		||||
import static org.mockito.Mockito.times;
 | 
			
		||||
import static org.mockito.Mockito.verify;
 | 
			
		||||
 
 | 
			
		||||
@@ -29,9 +29,9 @@ package org.alfresco.module.org_alfresco_module_rm.capability.declarative.condit
 | 
			
		||||
 | 
			
		||||
import static org.junit.Assert.assertFalse;
 | 
			
		||||
import static org.junit.Assert.assertTrue;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.any;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.anyBoolean;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.eq;
 | 
			
		||||
import static org.mockito.Matchers.any;
 | 
			
		||||
import static org.mockito.Matchers.anyBoolean;
 | 
			
		||||
import static org.mockito.Matchers.eq;
 | 
			
		||||
import static org.mockito.Mockito.doReturn;
 | 
			
		||||
import static org.mockito.Mockito.never;
 | 
			
		||||
import static org.mockito.Mockito.times;
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@ package org.alfresco.module.org_alfresco_module_rm.content;
 | 
			
		||||
 | 
			
		||||
import static org.mockito.Mockito.mock;
 | 
			
		||||
import static org.mockito.Mockito.verify;
 | 
			
		||||
import static org.mockito.Mockito.verifyNoInteractions;
 | 
			
		||||
import static org.mockito.Mockito.verifyZeroInteractions;
 | 
			
		||||
import static org.mockito.Mockito.when;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
@@ -125,6 +125,6 @@ public class EagerContentStoreCleanerUnitTest extends BaseUnitTest
 | 
			
		||||
        
 | 
			
		||||
        eagerContentStoreCleaner.deleteFromStore(AlfMock.generateText(), mock(ContentStore.class));
 | 
			
		||||
        
 | 
			
		||||
        verifyNoInteractions(mockedContentCleanser);
 | 
			
		||||
        verifyZeroInteractions(mockedContentCleanser);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -35,9 +35,9 @@ import static org.junit.Assert.assertFalse;
 | 
			
		||||
import static org.junit.Assert.assertNotNull;
 | 
			
		||||
import static org.junit.Assert.assertNull;
 | 
			
		||||
import static org.junit.Assert.assertTrue;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.any;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.anyString;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.eq;
 | 
			
		||||
import static org.mockito.Matchers.any;
 | 
			
		||||
import static org.mockito.Matchers.anyString;
 | 
			
		||||
import static org.mockito.Matchers.eq;
 | 
			
		||||
import static org.mockito.Mockito.doAnswer;
 | 
			
		||||
import static org.mockito.Mockito.doNothing;
 | 
			
		||||
import static org.mockito.Mockito.doReturn;
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@ import static org.mockito.Mockito.doReturn;
 | 
			
		||||
import static org.mockito.Mockito.times;
 | 
			
		||||
import static org.mockito.Mockito.verify;
 | 
			
		||||
import static org.mockito.Mockito.verifyNoMoreInteractions;
 | 
			
		||||
import static org.mockito.Mockito.verifyNoInteractions;
 | 
			
		||||
import static org.mockito.Mockito.verifyZeroInteractions;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.module.org_alfresco_module_rm.test.util.BaseUnitTest;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
@@ -73,7 +73,7 @@ public class DictionaryBootstrapPostProcessorUnitTest extends BaseUnitTest
 | 
			
		||||
        // === then ===
 | 
			
		||||
        verify(mockedBeanFactory, times(1)).containsBean(BEAN_SITESERVICE_BOOTSTRAP);
 | 
			
		||||
        verifyNoMoreInteractions(mockedBeanFactory);
 | 
			
		||||
        verifyNoInteractions(mockedBeanDefinition);
 | 
			
		||||
        verifyZeroInteractions(mockedBeanDefinition);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,7 @@
 | 
			
		||||
 | 
			
		||||
package org.alfresco.module.org_alfresco_module_rm.model.rma.aspect;
 | 
			
		||||
 | 
			
		||||
import static org.mockito.ArgumentMatchers.any;
 | 
			
		||||
import static org.mockito.Matchers.any;
 | 
			
		||||
import static org.mockito.Mockito.never;
 | 
			
		||||
import static org.mockito.Mockito.verify;
 | 
			
		||||
import static org.mockito.Mockito.when;
 | 
			
		||||
 
 | 
			
		||||
@@ -26,8 +26,8 @@
 | 
			
		||||
 */
 | 
			
		||||
package org.alfresco.module.org_alfresco_module_rm.model.rma.type;
 | 
			
		||||
 | 
			
		||||
import static org.mockito.ArgumentMatchers.any;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.eq;
 | 
			
		||||
import static org.mockito.Matchers.any;
 | 
			
		||||
import static org.mockito.Matchers.eq;
 | 
			
		||||
import static org.mockito.Mockito.never;
 | 
			
		||||
import static org.mockito.Mockito.verify;
 | 
			
		||||
import static org.mockito.Mockito.when;
 | 
			
		||||
 
 | 
			
		||||
@@ -27,8 +27,8 @@
 | 
			
		||||
 | 
			
		||||
package org.alfresco.module.org_alfresco_module_rm.patch.v22;
 | 
			
		||||
 | 
			
		||||
import static org.mockito.ArgumentMatchers.anyString;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.eq;
 | 
			
		||||
import static org.mockito.Matchers.anyString;
 | 
			
		||||
import static org.mockito.Matchers.eq;
 | 
			
		||||
import static org.mockito.Mockito.times;
 | 
			
		||||
import static org.mockito.Mockito.verify;
 | 
			
		||||
import static org.mockito.Mockito.when;
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@ import static org.mockito.Mockito.mock;
 | 
			
		||||
import static org.mockito.Mockito.times;
 | 
			
		||||
import static org.mockito.Mockito.verify;
 | 
			
		||||
import static org.mockito.Mockito.verifyNoMoreInteractions;
 | 
			
		||||
import static org.mockito.Mockito.verifyNoInteractions;
 | 
			
		||||
import static org.mockito.Mockito.verifyZeroInteractions;
 | 
			
		||||
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
@@ -72,7 +72,7 @@ public class RMv22RemoveInPlaceRolesFromAllPatchUnitTest extends BaseUnitTest
 | 
			
		||||
        patch.applyInternal();
 | 
			
		||||
        
 | 
			
		||||
        // then
 | 
			
		||||
        verifyNoInteractions(mockedAuthorityService);
 | 
			
		||||
        verifyZeroInteractions(mockedAuthorityService);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -30,8 +30,8 @@ package org.alfresco.module.org_alfresco_module_rm.patch.v23;
 | 
			
		||||
import static java.util.Arrays.asList;
 | 
			
		||||
import static org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel.ASPECT_SAVED_SEARCH;
 | 
			
		||||
import static org.alfresco.module.org_alfresco_module_rm.model.rma.type.RmSiteType.DEFAULT_SITE_NAME;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.any;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.anyMap;
 | 
			
		||||
import static org.mockito.Matchers.any;
 | 
			
		||||
import static org.mockito.Matchers.anyMap;
 | 
			
		||||
import static org.mockito.Mockito.times;
 | 
			
		||||
import static org.mockito.Mockito.verify;
 | 
			
		||||
import static org.mockito.Mockito.when;
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@ package org.alfresco.module.org_alfresco_module_rm.patch.v24;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.module.org_alfresco_module_rm.test.util.AlfMock.generateNodeRef;
 | 
			
		||||
import static org.mockito.Mockito.verify;
 | 
			
		||||
import static org.mockito.Mockito.verifyNoInteractions;
 | 
			
		||||
import static org.mockito.Mockito.verifyZeroInteractions;
 | 
			
		||||
import static org.mockito.Mockito.when;
 | 
			
		||||
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
@@ -81,7 +81,7 @@ public class RMv24FilePlanContainerRuleInheritancePatchUnitTest
 | 
			
		||||
        patch.applyInternal();
 | 
			
		||||
        
 | 
			
		||||
        // then
 | 
			
		||||
        verifyNoInteractions(mockedNodeService);
 | 
			
		||||
        verifyZeroInteractions(mockedNodeService);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -27,8 +27,8 @@
 | 
			
		||||
 | 
			
		||||
package org.alfresco.module.org_alfresco_module_rm.patch.v32;
 | 
			
		||||
 | 
			
		||||
import static org.mockito.ArgumentMatchers.any;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.anyMap;
 | 
			
		||||
import static org.mockito.Matchers.anyMap;
 | 
			
		||||
import static org.mockito.Matchers.anyObject;
 | 
			
		||||
import static org.mockito.Mockito.times;
 | 
			
		||||
import static org.mockito.Mockito.verify;
 | 
			
		||||
import static org.mockito.Mockito.when;
 | 
			
		||||
@@ -92,8 +92,8 @@ public class RMv32HoldReportUpdatePatchUnitTest
 | 
			
		||||
 | 
			
		||||
        patch.applyInternal();
 | 
			
		||||
        verify(mockedNodeService, times(1)).addAspect(hold_report, ContentModel.ASPECT_VERSIONABLE, null);
 | 
			
		||||
        verify(mockedVersionService, times(1)).createVersion((NodeRef) any(), anyMap());
 | 
			
		||||
        verify(mockedContentWriter, times(1)).putContent((InputStream) any());
 | 
			
		||||
        verify(mockedVersionService, times(1)).createVersion((NodeRef) anyObject(), anyMap());
 | 
			
		||||
        verify(mockedContentWriter, times(1)).putContent((InputStream) anyObject());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@
 | 
			
		||||
package org.alfresco.module.org_alfresco_module_rm.patch.v33;
 | 
			
		||||
 | 
			
		||||
import static org.junit.Assert.assertEquals;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.any;
 | 
			
		||||
import static org.mockito.Matchers.any;
 | 
			
		||||
import static org.mockito.Mockito.times;
 | 
			
		||||
import static org.mockito.Mockito.verify;
 | 
			
		||||
import static org.mockito.Mockito.when;
 | 
			
		||||
 
 | 
			
		||||
@@ -33,13 +33,13 @@ import static java.util.Collections.emptyList;
 | 
			
		||||
import static org.alfresco.model.ContentModel.ASSOC_CONTAINS;
 | 
			
		||||
import static org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel.ASSOC_FROZEN_CONTENT;
 | 
			
		||||
import static org.alfresco.module.org_alfresco_module_rm.patch.v35.RMv35HoldNewChildAssocPatch.PATCH_ASSOC_NAME;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.any;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.anyMap;
 | 
			
		||||
import static org.mockito.Matchers.any;
 | 
			
		||||
import static org.mockito.Matchers.anyMap;
 | 
			
		||||
import static org.mockito.Mockito.doReturn;
 | 
			
		||||
import static org.mockito.Mockito.never;
 | 
			
		||||
import static org.mockito.Mockito.times;
 | 
			
		||||
import static org.mockito.Mockito.verify;
 | 
			
		||||
import static org.mockito.Mockito.verifyNoInteractions;
 | 
			
		||||
import static org.mockito.Mockito.verifyZeroInteractions;
 | 
			
		||||
import static org.mockito.Mockito.when;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@ import static org.alfresco.module.org_alfresco_module_rm.test.util.AlfMock.gener
 | 
			
		||||
import static org.junit.Assert.assertEquals;
 | 
			
		||||
import static org.junit.Assert.assertNotNull;
 | 
			
		||||
import static org.junit.Assert.assertTrue;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.any;
 | 
			
		||||
import static org.mockito.Matchers.any;
 | 
			
		||||
import static org.mockito.Mockito.doNothing;
 | 
			
		||||
import static org.mockito.Mockito.doReturn;
 | 
			
		||||
import static org.mockito.Mockito.mock;
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@
 | 
			
		||||
package org.alfresco.module.org_alfresco_module_rm.script.hold;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.module.org_alfresco_module_rm.test.util.WebScriptExceptionMatcher.badRequest;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.eq;
 | 
			
		||||
import static org.mockito.Matchers.eq;
 | 
			
		||||
import static org.mockito.Mockito.when;
 | 
			
		||||
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
 
 | 
			
		||||
@@ -30,8 +30,8 @@ package org.alfresco.module.org_alfresco_module_rm.test.util;
 | 
			
		||||
import static java.util.Collections.emptyMap;
 | 
			
		||||
 | 
			
		||||
import static org.mockito.ArgumentMatchers.nullable;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.anyString;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.eq;
 | 
			
		||||
import static org.mockito.Matchers.anyString;
 | 
			
		||||
import static org.mockito.Matchers.eq;
 | 
			
		||||
import static org.mockito.Mockito.doAnswer;
 | 
			
		||||
import static org.mockito.Mockito.doReturn;
 | 
			
		||||
import static org.mockito.Mockito.lenient;
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ package org.alfresco.module.org_alfresco_module_rm.util;
 | 
			
		||||
 | 
			
		||||
import static org.junit.Assert.assertFalse;
 | 
			
		||||
import static org.junit.Assert.assertTrue;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.any;
 | 
			
		||||
import static org.mockito.Matchers.any;
 | 
			
		||||
import static org.mockito.Mockito.times;
 | 
			
		||||
import static org.mockito.Mockito.verify;
 | 
			
		||||
import static org.mockito.Mockito.when;
 | 
			
		||||
 
 | 
			
		||||
@@ -27,8 +27,8 @@
 | 
			
		||||
 | 
			
		||||
package org.alfresco.module.org_alfresco_module_rm.version;
 | 
			
		||||
 | 
			
		||||
import static org.mockito.ArgumentMatchers.any;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.eq;
 | 
			
		||||
import static org.mockito.Matchers.any;
 | 
			
		||||
import static org.mockito.Matchers.eq;
 | 
			
		||||
import static org.mockito.Mockito.doAnswer;
 | 
			
		||||
import static org.mockito.Mockito.never;
 | 
			
		||||
import static org.mockito.Mockito.times;
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@ package org.alfresco.rm.rest.api.sites;
 | 
			
		||||
import static org.junit.Assert.assertEquals;
 | 
			
		||||
import static org.junit.Assert.assertNotNull;
 | 
			
		||||
import static org.junit.Assert.fail;
 | 
			
		||||
import static org.mockito.ArgumentMatchers.any;
 | 
			
		||||
import static org.mockito.Matchers.any;
 | 
			
		||||
import static org.mockito.Mockito.mock;
 | 
			
		||||
import static org.mockito.Mockito.never;
 | 
			
		||||
import static org.mockito.Mockito.times;
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-governance-services-community-repo-parent</artifactId>
 | 
			
		||||
        <version>17.48</version>
 | 
			
		||||
        <version>23.1.0.23-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <build>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo</artifactId>
 | 
			
		||||
        <version>17.48</version>
 | 
			
		||||
        <version>23.1.0.23-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <modules>
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-amps</artifactId>
 | 
			
		||||
        <version>17.48</version>
 | 
			
		||||
        <version>23.1.0.23-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <properties>
 | 
			
		||||
 
 | 
			
		||||
@@ -176,6 +176,7 @@ public class NodeBrowserScript extends NodeBrowserPost implements Serializable
 | 
			
		||||
			{
 | 
			
		||||
				status.setCode(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
 | 
			
		||||
				status.setMessage(e.getMessage());
 | 
			
		||||
				status.setException(e);
 | 
			
		||||
				status.setRedirect(true);
 | 
			
		||||
			}
 | 
			
		||||
    		return tmplMap;
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
   <parent>
 | 
			
		||||
      <groupId>org.alfresco</groupId>
 | 
			
		||||
      <artifactId>alfresco-community-repo</artifactId>
 | 
			
		||||
      <version>17.48</version>
 | 
			
		||||
      <version>23.1.0.23-SNAPSHOT</version>
 | 
			
		||||
   </parent>
 | 
			
		||||
 | 
			
		||||
   <dependencies>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2005-2022 Alfresco Software Limited.
 | 
			
		||||
 * Copyright (C) 2005-2011 Alfresco Software Limited.
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of Alfresco
 | 
			
		||||
 *
 | 
			
		||||
@@ -16,7 +16,6 @@
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public License
 | 
			
		||||
 * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package org.alfresco.query;
 | 
			
		||||
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
@@ -56,7 +55,7 @@ public class ListBackedPagingResults<R> implements PagingResults<R>
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        this.results = Collections.unmodifiableList(
 | 
			
		||||
                list.subList(Math.min(start, end), end));
 | 
			
		||||
                list.subList(start, end));
 | 
			
		||||
        this.size = list.size();
 | 
			
		||||
        this.hasMore = ! (list.size() == end);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo</artifactId>
 | 
			
		||||
        <version>17.48</version>
 | 
			
		||||
        <version>23.1.0.23-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <properties>
 | 
			
		||||
@@ -134,7 +134,7 @@
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.fasterxml.woodstox</groupId>
 | 
			
		||||
            <artifactId>woodstox-core</artifactId>
 | 
			
		||||
            <version>6.3.0</version>
 | 
			
		||||
            <version>6.2.7</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- the cxf libs were updated, see dependencyManagement section -->
 | 
			
		||||
 
 | 
			
		||||
@@ -78,10 +78,6 @@ public class ObjectTypeIdLuceneBuilder extends BaseLuceneBuilder
 | 
			
		||||
        String field = getLuceneFieldName();
 | 
			
		||||
        String stringValue = getValueAsString(value);
 | 
			
		||||
        TypeDefinitionWrapper type = cmisDictionaryService.findType(stringValue);
 | 
			
		||||
        if (type == null)
 | 
			
		||||
        {
 | 
			
		||||
            throw new CmisInvalidArgumentException("Unknown type: " + stringValue);
 | 
			
		||||
        }
 | 
			
		||||
        return lqpa
 | 
			
		||||
                .getFieldQuery(field, type.getAlfrescoClass().toString(), AnalysisMode.IDENTIFIER, luceneFunction);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -146,7 +146,7 @@ public interface NamespaceService extends NamespacePrefixResolver
 | 
			
		||||
 | 
			
		||||
    /** Email Server Application Model Prefix */
 | 
			
		||||
    static final String EMAILSERVER_MODEL_PREFIX = "emailserver";
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Register a prefix for namespace uri. 
 | 
			
		||||
     * 
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Data model classes
 | 
			
		||||
 * %%
 | 
			
		||||
 * 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 
 | 
			
		||||
@@ -25,7 +25,7 @@
 | 
			
		||||
 */
 | 
			
		||||
package org.alfresco.repo.dictionary;
 | 
			
		||||
 | 
			
		||||
import static org.mockito.ArgumentMatchers.anyString;
 | 
			
		||||
import static org.mockito.Matchers.anyString;
 | 
			
		||||
import static org.mockito.Mockito.mock;
 | 
			
		||||
import static org.mockito.Mockito.when;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo</artifactId>
 | 
			
		||||
        <version>17.48</version>
 | 
			
		||||
        <version>23.1.0.23-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <dependencies>
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,6 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-packaging</artifactId>
 | 
			
		||||
        <version>17.48</version>
 | 
			
		||||
        <version>23.1.0.23-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
</project>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-packaging</artifactId>
 | 
			
		||||
        <version>17.48</version>
 | 
			
		||||
        <version>23.1.0.23-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <properties>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo</artifactId>
 | 
			
		||||
        <version>17.48</version>
 | 
			
		||||
        <version>23.1.0.23-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <modules>
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-packaging</artifactId>
 | 
			
		||||
        <version>17.48</version>
 | 
			
		||||
        <version>23.1.0.23-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <modules>
 | 
			
		||||
 
 | 
			
		||||
@@ -27,11 +27,11 @@ fi
 | 
			
		||||
 | 
			
		||||
echo "Starting ACS stack in ${DOCKER_COMPOSE_PATH}"
 | 
			
		||||
 | 
			
		||||
export TRANSFORMERS_TAG=$(mvn help:evaluate -Dexpression=dependency.alfresco-transform-core.version -q -DforceStdout)
 | 
			
		||||
export TRANSFORM_ROUTER_TAG=$(mvn help:evaluate -Dexpression=dependency.alfresco-transform-service.version -q -DforceStdout)
 | 
			
		||||
TRANSFORMERS_TAG=$(mvn help:evaluate -Dexpression=dependency.alfresco-transform-core.version -q -DforceStdout)
 | 
			
		||||
TRANSFORM_ROUTER_TAG=$(mvn help:evaluate -Dexpression=dependency.alfresco-transform-service.version -q -DforceStdout)
 | 
			
		||||
 | 
			
		||||
# .env files are picked up from project directory correctly on docker-compose 1.23.0+
 | 
			
		||||
docker-compose --file "${DOCKER_COMPOSE_PATH}" --project-directory $(dirname "${DOCKER_COMPOSE_PATH}") up -d
 | 
			
		||||
TRANSFORMERS_TAG=${TRANSFORMERS_TAG} TRANSFORM_ROUTER_TAG=${TRANSFORM_ROUTER_TAG} docker-compose --file "${DOCKER_COMPOSE_PATH}" --project-directory $(dirname "${DOCKER_COMPOSE_PATH}") up -d
 | 
			
		||||
 | 
			
		||||
if [ $? -eq 0 ]
 | 
			
		||||
then
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-tests</artifactId>
 | 
			
		||||
        <version>17.48</version>
 | 
			
		||||
        <version>23.1.0.23-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <developers>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,76 +0,0 @@
 | 
			
		||||
package org.alfresco.cmis.search;
 | 
			
		||||
 | 
			
		||||
import java.lang.reflect.Method;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.cmis.CmisProperties;
 | 
			
		||||
import org.alfresco.utility.Utility;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.context.annotation.Scope;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
import org.springframework.test.context.ContextConfiguration;
 | 
			
		||||
import org.testng.annotations.AfterMethod;
 | 
			
		||||
import org.testng.annotations.BeforeMethod;
 | 
			
		||||
 | 
			
		||||
@ContextConfiguration("classpath:alfresco-cmis-context.xml")
 | 
			
		||||
@Component
 | 
			
		||||
@Scope(value = "prototype")
 | 
			
		||||
public abstract class AbstractCmisE2ETest extends AbstractE2EFunctionalTest
 | 
			
		||||
{
 | 
			
		||||
    private static Logger LOGGER = LoggerFactory.getLogger(AbstractCmisE2ETest.class);
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    protected CmisProperties cmisProperties;
 | 
			
		||||
 | 
			
		||||
    public String documentContent = "CMIS document content";
 | 
			
		||||
 | 
			
		||||
    @BeforeMethod(alwaysRun = true)
 | 
			
		||||
    public void showStartTestInfo(Method method)
 | 
			
		||||
    {
 | 
			
		||||
        LOGGER.info(String.format("*** STARTING Test: [%s] ***", method.getName()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @AfterMethod(alwaysRun = true)
 | 
			
		||||
    public void showEndTestInfo(Method method)
 | 
			
		||||
    {
 | 
			
		||||
        LOGGER.info(String.format("*** ENDING Test: [%s] ***", method.getName()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Integer getElasticWaitTimeInSeconds()
 | 
			
		||||
    {
 | 
			
		||||
        return cmisProperties.envProperty().getSolrWaitTimeInSeconds();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Repeat Elastic Query till results count returns expectedCountResults
 | 
			
		||||
     * @param query CMIS Query to be executed
 | 
			
		||||
     * @param expectedCountResults Number of results expected
 | 
			
		||||
     * @return true when results count is equals to expectedCountResults
 | 
			
		||||
     */
 | 
			
		||||
    protected boolean waitForIndexing(String query, long expectedCountResults)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        for (int searchCount = 1; searchCount <= SEARCH_MAX_ATTEMPTS; searchCount++)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                cmisApi.withQuery(query).assertResultsCount().equals(expectedCountResults);
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
            catch (AssertionError ae)
 | 
			
		||||
            {
 | 
			
		||||
                LOGGER.info(String.format("WaitForIndexing in Progress: %s", ae));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            Utility.waitToLoopTime(getElasticWaitTimeInSeconds(), "Wait For Indexing");
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,58 +0,0 @@
 | 
			
		||||
package org.alfresco.cmis.search;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.cmis.CmisWrapper;
 | 
			
		||||
import org.alfresco.dataprep.SiteService.Visibility;
 | 
			
		||||
import org.alfresco.utility.data.DataContent;
 | 
			
		||||
import org.alfresco.utility.data.DataSite;
 | 
			
		||||
import org.alfresco.utility.data.DataUser;
 | 
			
		||||
import org.alfresco.utility.data.RandomData;
 | 
			
		||||
import org.alfresco.utility.model.SiteModel;
 | 
			
		||||
import org.alfresco.utility.model.UserModel;
 | 
			
		||||
import org.alfresco.utility.network.ServerHealth;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.test.context.ContextConfiguration;
 | 
			
		||||
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
 | 
			
		||||
import org.testng.annotations.BeforeClass;
 | 
			
		||||
 | 
			
		||||
@ContextConfiguration ("classpath:alfresco-cmis-context.xml")
 | 
			
		||||
public abstract class AbstractE2EFunctionalTest extends AbstractTestNGSpringContextTests
 | 
			
		||||
{
 | 
			
		||||
    /** The number of retries that a query will be tried before giving up. */
 | 
			
		||||
    protected static final int SEARCH_MAX_ATTEMPTS = 20;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    protected ServerHealth serverHealth;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    protected DataSite dataSite;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    protected DataContent dataContent;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    protected CmisWrapper cmisApi;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    protected DataUser dataUser;
 | 
			
		||||
 | 
			
		||||
    protected UserModel testUser, adminUserModel;
 | 
			
		||||
    protected SiteModel testSite;
 | 
			
		||||
 | 
			
		||||
    protected static String unique_searchString;
 | 
			
		||||
 | 
			
		||||
    @BeforeClass (alwaysRun = true)
 | 
			
		||||
    public void setup()
 | 
			
		||||
    {
 | 
			
		||||
        serverHealth.assertServerIsOnline();
 | 
			
		||||
 | 
			
		||||
        adminUserModel = dataUser.getAdminUser();
 | 
			
		||||
        testUser = dataUser.createRandomTestUser("UserSearch");
 | 
			
		||||
 | 
			
		||||
        testSite = new SiteModel(RandomData.getRandomName("SiteSearch"));
 | 
			
		||||
        testSite.setVisibility(Visibility.PRIVATE);
 | 
			
		||||
 | 
			
		||||
        testSite = dataSite.usingUser(testUser).createSite(testSite);
 | 
			
		||||
 | 
			
		||||
        unique_searchString = testSite.getTitle().replace("SiteSearch", "Unique");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,62 +0,0 @@
 | 
			
		||||
package org.alfresco.cmis.search;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.utility.Utility;
 | 
			
		||||
import org.alfresco.utility.data.provider.XMLDataConfig;
 | 
			
		||||
import org.alfresco.utility.data.provider.XMLTestDataProvider;
 | 
			
		||||
import org.alfresco.utility.model.FileModel;
 | 
			
		||||
import org.alfresco.utility.model.FileType;
 | 
			
		||||
import org.alfresco.utility.model.FolderModel;
 | 
			
		||||
import org.alfresco.utility.model.QueryModel;
 | 
			
		||||
import org.testng.Assert;
 | 
			
		||||
import org.testng.annotations.AfterClass;
 | 
			
		||||
import org.testng.annotations.BeforeClass;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
 | 
			
		||||
public class SearchInFolderTests extends AbstractCmisE2ETest
 | 
			
		||||
{
 | 
			
		||||
    private FolderModel parentFolder, subFolder1, subFolder2, subFolder3;
 | 
			
		||||
    private FileModel subFile1, subFile2, subFile3, subFile4, subFile5;
 | 
			
		||||
 | 
			
		||||
    @BeforeClass(alwaysRun = true)
 | 
			
		||||
    public void createTestData() throws Exception
 | 
			
		||||
    {
 | 
			
		||||
        // create input data
 | 
			
		||||
        parentFolder = FolderModel.getRandomFolderModel();
 | 
			
		||||
        subFolder1 = FolderModel.getRandomFolderModel();
 | 
			
		||||
        subFolder2 = FolderModel.getRandomFolderModel();
 | 
			
		||||
        subFolder3 = new FolderModel("subFolder");
 | 
			
		||||
        subFile5 = new FileModel("fifthFile.txt",FileType.TEXT_PLAIN, "fifthFile content");
 | 
			
		||||
        subFile1 = new FileModel("firstFile", FileType.MSEXCEL);
 | 
			
		||||
        subFile2 = FileModel.getRandomFileModel(FileType.MSPOWERPOINT2007);
 | 
			
		||||
        subFile3 = FileModel.getRandomFileModel(FileType.TEXT_PLAIN);
 | 
			
		||||
        subFile4 = new FileModel("fourthFile", "fourthFileTitle", "fourthFileDescription", FileType.MSWORD2007);
 | 
			
		||||
 | 
			
		||||
        cmisApi.authenticateUser(testUser).usingSite(testSite).createFolder(parentFolder)
 | 
			
		||||
                .then().usingResource(parentFolder)
 | 
			
		||||
                .createFile(subFile5).assertThat().contentIs("fifthFile content")
 | 
			
		||||
                .createFolder(subFolder1)
 | 
			
		||||
                .createFolder(subFolder2)
 | 
			
		||||
                .createFolder(subFolder3)
 | 
			
		||||
                .createFile(subFile1)
 | 
			
		||||
                .createFile(subFile2)
 | 
			
		||||
                .createFile(subFile3)
 | 
			
		||||
                .createFile(subFile4);
 | 
			
		||||
        // wait for index
 | 
			
		||||
        Utility.waitToLoopTime(getElasticWaitTimeInSeconds());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @AfterClass(alwaysRun = true)
 | 
			
		||||
    public void cleanupEnvironment()
 | 
			
		||||
    {
 | 
			
		||||
        dataContent.deleteSite(testSite);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test(dataProviderClass = XMLTestDataProvider.class, dataProvider = "getQueriesData")
 | 
			
		||||
    @XMLDataConfig(file = "src/test/resources/search-in-folder.xml")
 | 
			
		||||
    public void executeCMISQuery(QueryModel query)
 | 
			
		||||
    {
 | 
			
		||||
        String currentQuery = String.format(query.getValue(), parentFolder.getNodeRef());
 | 
			
		||||
        cmisApi.authenticateUser(testUser);
 | 
			
		||||
        Assert.assertTrue(waitForIndexing(currentQuery, query.getResults()), String.format("Result count not as expected for query: %s", currentQuery));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -7,7 +7,7 @@ alfresco.port=8082
 | 
			
		||||
admin.user=admin
 | 
			
		||||
admin.password=admin
 | 
			
		||||
 | 
			
		||||
solrWaitTimeInSeconds=60
 | 
			
		||||
solrWaitTimeInSeconds=30
 | 
			
		||||
 | 
			
		||||
# in containers we cannot access directly JMX, so we will use http://jolokia.org agent
 | 
			
		||||
# disabling this we will use direct JMX calls to server
 | 
			
		||||
 
 | 
			
		||||
@@ -1,23 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!--CMIS Queries: passing the search query as first param and results expected -->
 | 
			
		||||
<testData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 | 
			
		||||
	<queries>
 | 
			
		||||
		<query value="SELECT cmis:name, cmis:parentId, cmis:path, cmis:allowedChildObjectTypeIds FROM cmis:folder where IN_FOLDER('%s') AND cmis:name = 'subFolder'" expectedResults="1" />
 | 
			
		||||
		<query value="SELECT cmis:name, cmis:objectId, cmis:lastModifiedBy, cmis:creationDate, cmis:contentStreamFileName FROM cmis:document where IN_FOLDER('%s') AND cmis:name = 'fourthFile'" expectedResults="1" />
 | 
			
		||||
		<query value="SELECT cmis:parentId FROM cmis:folder where IN_FOLDER('%s')" expectedResults="3" />
 | 
			
		||||
		<query value="SELECT * FROM cmis:document where IN_FOLDER('%s')" expectedResults="5" />
 | 
			
		||||
		<query value="SELECT * FROM cmis:document where IN_FOLDER('%s') ORDER BY cmis:name ASC" expectedResults="5" />
 | 
			
		||||
		<query value="SELECT * FROM cmis:document where IN_FOLDER('%s') ORDER BY cmis:name DESC" expectedResults="5" />
 | 
			
		||||
		<query value="SELECT * FROM cmis:folder where IN_FOLDER('%s') ORDER BY cmis:lastModificationDate ASC"  expectedResults="3" />
 | 
			
		||||
		<query value="SELECT * FROM cmis:folder where IN_FOLDER('%s') ORDER BY cmis:lastModificationDate DESC"  expectedResults="3" />
 | 
			
		||||
		<query value="SELECT * FROM cmis:document where IN_FOLDER('%s') ORDER BY cmis:createdBy DESC" expectedResults="5" />
 | 
			
		||||
		<query value="SELECT * FROM cmis:document where IN_FOLDER('%s') AND cmis:name IS NOT NULL" expectedResults="5" />
 | 
			
		||||
		<query value="SELECT * FROM cmis:folder where IN_FOLDER('%s') AND cmis:name IS NOT NULL" expectedResults="3" />
 | 
			
		||||
		<query value="SELECT * FROM cmis:document where IN_FOLDER('%s') AND cmis:name LIKE 'fourthFile'" expectedResults="1" />
 | 
			
		||||
		<query value="SELECT * FROM cmis:folder where IN_FOLDER('%s') AND NOT(cmis:name NOT IN ('subFolder'))" expectedResults="1" />
 | 
			
		||||
		<query value="SELECT * FROM cmis:document where IN_FOLDER('%s') AND cmis:name IN ('fourthFile', 'fifthFile.txt')" expectedResults="2" />
 | 
			
		||||
		<query value="SELECT * FROM cmis:document where IN_FOLDER('%s') AND cmis:name NOT IN ('fourthFile', 'fifthFile.txt')" expectedResults="3" />
 | 
			
		||||
		<query value="SELECT * FROM cmis:folder where IN_FOLDER('%s') AND cmis:name <> 'subFolder'" expectedResults="2" />
 | 
			
		||||
		<query value="SELECT cmis:secondaryObjectTypeIds FROM cmis:folder where IN_FOLDER('%s') AND cmis:name = 'subFolder'" expectedResults="1" />
 | 
			
		||||
	</queries>
 | 
			
		||||
</testData> 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-tests</artifactId>
 | 
			
		||||
        <version>17.48</version>
 | 
			
		||||
        <version>23.1.0.23-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <developers>
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-tests</artifactId>
 | 
			
		||||
        <version>17.48</version>
 | 
			
		||||
        <version>23.1.0.23-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <developers>
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-tests</artifactId>
 | 
			
		||||
        <version>17.48</version>
 | 
			
		||||
        <version>23.1.0.23-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <developers>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,102 +0,0 @@
 | 
			
		||||
package org.alfresco.rest.actions.access;
 | 
			
		||||
 | 
			
		||||
import com.google.gson.Gson;
 | 
			
		||||
import org.alfresco.rest.actions.access.pojo.Action;
 | 
			
		||||
import org.alfresco.rest.actions.access.pojo.ActionCondition;
 | 
			
		||||
import org.alfresco.rest.actions.access.pojo.Rule;
 | 
			
		||||
import org.alfresco.utility.model.UserModel;
 | 
			
		||||
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
public class AccessRestrictionUtil {
 | 
			
		||||
 | 
			
		||||
    public static final String MAIL_ACTION = "mail";
 | 
			
		||||
 | 
			
		||||
    public static final String ERROR_MESSAGE_FIELD = "message";
 | 
			
		||||
    public static final String ERROR_MESSAGE_ACCESS_RESTRICTED =
 | 
			
		||||
            "Only admin or system user is allowed to define uses of or directly execute this action";
 | 
			
		||||
    private static final String ERROR_MESSAGE_FAILED_TO_SEND_EMAIL = "Failed to send email to:";
 | 
			
		||||
 | 
			
		||||
    public static Map<String, String> createMailParameters(UserModel sender, UserModel recipient) {
 | 
			
		||||
        Map<String, String> parameterValues = new HashMap<>();
 | 
			
		||||
        parameterValues.put("from", sender.getEmailAddress());
 | 
			
		||||
        parameterValues.put("to", recipient.getEmailAddress());
 | 
			
		||||
        parameterValues.put("subject", "Test");
 | 
			
		||||
        parameterValues.put("text", "<html>content</html>");
 | 
			
		||||
 | 
			
		||||
        return parameterValues;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Rule createRuleWithAction(String actionName, Map<String, String> parameterValues) {
 | 
			
		||||
        Rule rule = new Rule();
 | 
			
		||||
        rule.setId("");
 | 
			
		||||
        rule.setTitle("Test rule title");
 | 
			
		||||
        rule.setDescription("Test rule description");
 | 
			
		||||
        rule.setRuleType(List.of("inbound"));
 | 
			
		||||
        rule.setDisabled(false);
 | 
			
		||||
        rule.setApplyToChildren(false);
 | 
			
		||||
        rule.setExecuteAsynchronously(false);
 | 
			
		||||
 | 
			
		||||
        Action compositeAction = new Action();
 | 
			
		||||
        compositeAction.setActionDefinitionName("composite-action");
 | 
			
		||||
 | 
			
		||||
        ActionCondition actionCondition = new ActionCondition();
 | 
			
		||||
        actionCondition.setConditionDefinitionName("no-condition");
 | 
			
		||||
        actionCondition.setParameterValues(new HashMap<>());
 | 
			
		||||
 | 
			
		||||
        compositeAction.setConditions(List.of(actionCondition));
 | 
			
		||||
 | 
			
		||||
        Action action = createAction(actionName, parameterValues);
 | 
			
		||||
 | 
			
		||||
        compositeAction.setActions(List.of(action));
 | 
			
		||||
 | 
			
		||||
        rule.setAction(compositeAction);
 | 
			
		||||
 | 
			
		||||
        return rule;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Action createActionWithParameters(String actionName, Map<String, String> parameterValues) {
 | 
			
		||||
        Action compositeAction = new Action();
 | 
			
		||||
        compositeAction.setActionDefinitionName("composite-action");
 | 
			
		||||
 | 
			
		||||
        ActionCondition actionCondition = new ActionCondition();
 | 
			
		||||
        actionCondition.setConditionDefinitionName("no-condition");
 | 
			
		||||
        actionCondition.setParameterValues(new HashMap<>());
 | 
			
		||||
 | 
			
		||||
        compositeAction.setConditions(List.of(actionCondition));
 | 
			
		||||
 | 
			
		||||
        Action action = createAction(actionName, parameterValues);
 | 
			
		||||
        action.setExecuteAsynchronously(false);
 | 
			
		||||
 | 
			
		||||
        compositeAction.setActions(List.of(action));
 | 
			
		||||
 | 
			
		||||
        return action;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    public static Action createAction(String actionName, Map<String, String> parameterValues) {
 | 
			
		||||
        Action action = new Action();
 | 
			
		||||
        action.setActionDefinitionName(actionName);
 | 
			
		||||
        action.setParameterValues(parameterValues);
 | 
			
		||||
 | 
			
		||||
        return action;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String mapObjectToJSON(Object object) {
 | 
			
		||||
        Gson gson = new Gson();
 | 
			
		||||
        return gson.toJson(object);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Return error message that in fact means that the action has passed access restriction correctly,
 | 
			
		||||
     * but due to non-configured smtp couldn't send email.
 | 
			
		||||
     *
 | 
			
		||||
     * @param userModel
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    public static String getExpectedEmailSendFailureMessage(UserModel userModel) {
 | 
			
		||||
        return ERROR_MESSAGE_FAILED_TO_SEND_EMAIL + userModel.getEmailAddress();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,84 +0,0 @@
 | 
			
		||||
package org.alfresco.rest.actions.access;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.RestTest;
 | 
			
		||||
import org.alfresco.rest.core.RestRequest;
 | 
			
		||||
import org.alfresco.rest.core.RestResponse;
 | 
			
		||||
import org.alfresco.rest.core.RestWrapper;
 | 
			
		||||
import org.alfresco.utility.model.UserModel;
 | 
			
		||||
import org.json.simple.JSONObject;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.http.HttpMethod;
 | 
			
		||||
import org.springframework.http.HttpStatus;
 | 
			
		||||
import org.testng.annotations.BeforeClass;
 | 
			
		||||
import org.testng.annotations.BeforeMethod;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.rest.actions.access.AccessRestrictionUtil.ERROR_MESSAGE_ACCESS_RESTRICTED;
 | 
			
		||||
import static org.alfresco.rest.actions.access.AccessRestrictionUtil.ERROR_MESSAGE_FIELD;
 | 
			
		||||
import static org.alfresco.rest.actions.access.AccessRestrictionUtil.MAIL_ACTION;
 | 
			
		||||
import static org.alfresco.rest.actions.access.AccessRestrictionUtil.createMailParameters;
 | 
			
		||||
import static org.alfresco.rest.actions.access.AccessRestrictionUtil.getExpectedEmailSendFailureMessage;
 | 
			
		||||
import static org.hamcrest.Matchers.containsString;
 | 
			
		||||
 | 
			
		||||
public class FormProcAdminAccessRestrictionTest extends RestTest {
 | 
			
		||||
 | 
			
		||||
    private static final String ACTION_FORM_PROCESSOR_ENDPOINT = "alfresco/service/api/action/%s/formprocessor";
 | 
			
		||||
 | 
			
		||||
    private static final String PROPERTY_PREFIX = "prop_";
 | 
			
		||||
 | 
			
		||||
    private UserModel adminUser;
 | 
			
		||||
    private UserModel testUser;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    protected RestWrapper restClient;
 | 
			
		||||
 | 
			
		||||
    @BeforeClass(alwaysRun = true)
 | 
			
		||||
    public void dataPreparation() throws Exception {
 | 
			
		||||
        adminUser = dataUser.getAdminUser();
 | 
			
		||||
        testUser = dataUser.createRandomTestUser();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @BeforeMethod(alwaysRun=true)
 | 
			
		||||
    public void setup() {
 | 
			
		||||
        restClient.configureRequestSpec()
 | 
			
		||||
                .setBasePath("")
 | 
			
		||||
                .addHeader("Content-Type", "application/json");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void userShouldNotCreateAMailForm() {
 | 
			
		||||
        restClient.authenticateUser(testUser);
 | 
			
		||||
 | 
			
		||||
        String body = generateBody(createMailParameters(adminUser, testUser));
 | 
			
		||||
        String endpoint = String.format(ACTION_FORM_PROCESSOR_ENDPOINT, MAIL_ACTION);
 | 
			
		||||
 | 
			
		||||
        RestRequest request = RestRequest.requestWithBody(HttpMethod.POST, body, endpoint);
 | 
			
		||||
        RestResponse response = restClient.process(request);
 | 
			
		||||
 | 
			
		||||
        response.assertThat().statusCode(HttpStatus.INTERNAL_SERVER_ERROR.value())
 | 
			
		||||
                .assertThat().body(ERROR_MESSAGE_FIELD, containsString(ERROR_MESSAGE_ACCESS_RESTRICTED));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void adminShouldCreateAMailForm() {
 | 
			
		||||
        restClient.authenticateUser(adminUser);
 | 
			
		||||
 | 
			
		||||
        String body = generateBody(createMailParameters(adminUser, testUser));
 | 
			
		||||
        String endpoint = String.format(ACTION_FORM_PROCESSOR_ENDPOINT, MAIL_ACTION);
 | 
			
		||||
 | 
			
		||||
        RestRequest request = RestRequest.requestWithBody(HttpMethod.POST, body, endpoint);
 | 
			
		||||
        RestResponse response = restClient.process(request);
 | 
			
		||||
 | 
			
		||||
        response.assertThat().statusCode(HttpStatus.INTERNAL_SERVER_ERROR.value())
 | 
			
		||||
                .assertThat().body(ERROR_MESSAGE_FIELD, containsString(getExpectedEmailSendFailureMessage(testUser)));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private String generateBody(Map<String, String> mailParameters) {
 | 
			
		||||
        JSONObject json = new JSONObject();
 | 
			
		||||
        mailParameters.forEach((key, value) -> json.put(PROPERTY_PREFIX + key, value));
 | 
			
		||||
 | 
			
		||||
        return json.toJSONString();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,102 +0,0 @@
 | 
			
		||||
package org.alfresco.rest.actions.access;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.RestTest;
 | 
			
		||||
import org.alfresco.rest.actions.access.pojo.Rule;
 | 
			
		||||
import org.alfresco.rest.core.RestRequest;
 | 
			
		||||
import org.alfresco.rest.core.RestResponse;
 | 
			
		||||
import org.alfresco.rest.core.RestWrapper;
 | 
			
		||||
import org.alfresco.utility.model.FileModel;
 | 
			
		||||
import org.alfresco.utility.model.FileType;
 | 
			
		||||
import org.alfresco.utility.model.FolderModel;
 | 
			
		||||
import org.alfresco.utility.model.UserModel;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.http.HttpMethod;
 | 
			
		||||
import org.springframework.http.HttpStatus;
 | 
			
		||||
import org.testng.annotations.BeforeClass;
 | 
			
		||||
import org.testng.annotations.BeforeMethod;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.rest.actions.access.AccessRestrictionUtil.ERROR_MESSAGE_ACCESS_RESTRICTED;
 | 
			
		||||
import static org.alfresco.rest.actions.access.AccessRestrictionUtil.ERROR_MESSAGE_FIELD;
 | 
			
		||||
import static org.alfresco.rest.actions.access.AccessRestrictionUtil.MAIL_ACTION;
 | 
			
		||||
import static org.alfresco.rest.actions.access.AccessRestrictionUtil.createMailParameters;
 | 
			
		||||
import static org.alfresco.rest.actions.access.AccessRestrictionUtil.createRuleWithAction;
 | 
			
		||||
import static org.alfresco.rest.actions.access.AccessRestrictionUtil.mapObjectToJSON;
 | 
			
		||||
import static org.hamcrest.Matchers.containsString;
 | 
			
		||||
 | 
			
		||||
public class RuleAdminAccessRestrictionTest extends RestTest {
 | 
			
		||||
 | 
			
		||||
    private static final String CREATE_RULE_ENDPOINT = "alfresco/service/api/node/workspace/SpacesStore/%s/ruleset/rules";
 | 
			
		||||
 | 
			
		||||
    private UserModel adminUser;
 | 
			
		||||
    private UserModel testUser;
 | 
			
		||||
    private FolderModel testFolder;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    protected RestWrapper restClient;
 | 
			
		||||
 | 
			
		||||
    @BeforeClass(alwaysRun = true)
 | 
			
		||||
    public void dataPreparation() throws Exception {
 | 
			
		||||
        adminUser = dataUser.getAdminUser();
 | 
			
		||||
 | 
			
		||||
        testUser = dataUser.createRandomTestUser();
 | 
			
		||||
        testSite = dataSite.usingUser(testUser)
 | 
			
		||||
                .createPublicRandomSite();
 | 
			
		||||
        testFolder = dataContent.usingUser(testUser)
 | 
			
		||||
                .usingSite(testSite)
 | 
			
		||||
                .createFolder();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @BeforeMethod(alwaysRun=true)
 | 
			
		||||
    public void setup() {
 | 
			
		||||
        restClient.configureRequestSpec().setBasePath("");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void userShouldNotBeAbleToCreateANewRule() {
 | 
			
		||||
        restClient.authenticateUser(testUser);
 | 
			
		||||
 | 
			
		||||
        Rule rule = createRuleWithAction(MAIL_ACTION, createMailParameters(adminUser, testUser));
 | 
			
		||||
        String ruleRequestBody = mapObjectToJSON(rule);
 | 
			
		||||
        String ruleEndpoint = String.format(CREATE_RULE_ENDPOINT, testFolder.getNodeRef());
 | 
			
		||||
 | 
			
		||||
        RestRequest request = RestRequest.requestWithBody(HttpMethod.POST, ruleRequestBody, ruleEndpoint);
 | 
			
		||||
        RestResponse response = restClient.process(request);
 | 
			
		||||
 | 
			
		||||
        response.assertThat().statusCode(HttpStatus.INTERNAL_SERVER_ERROR.value())
 | 
			
		||||
                .assertThat().body(ERROR_MESSAGE_FIELD, containsString(ERROR_MESSAGE_ACCESS_RESTRICTED));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void adminShouldBeAbleToCreateANewRule() {
 | 
			
		||||
        restClient.authenticateUser(adminUser);
 | 
			
		||||
 | 
			
		||||
        Rule rule = createRuleWithAction(MAIL_ACTION, createMailParameters(adminUser, testUser));
 | 
			
		||||
        String ruleRequestBody = mapObjectToJSON(rule);
 | 
			
		||||
        String ruleEndpoint = String.format(CREATE_RULE_ENDPOINT, testFolder.getNodeRef());
 | 
			
		||||
 | 
			
		||||
        RestRequest request = RestRequest.requestWithBody(HttpMethod.POST, ruleRequestBody, ruleEndpoint);
 | 
			
		||||
        RestResponse response = restClient.process(request);
 | 
			
		||||
 | 
			
		||||
        response.assertThat().statusCode(HttpStatus.OK.value());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void userShouldAddAFileToFolderWithMailRule() {
 | 
			
		||||
        restClient.authenticateUser(adminUser);
 | 
			
		||||
 | 
			
		||||
        Rule rule = createRuleWithAction(MAIL_ACTION, createMailParameters(adminUser, testUser));
 | 
			
		||||
        String ruleRequestBody = mapObjectToJSON(rule);
 | 
			
		||||
        String ruleEndpoint = String.format(CREATE_RULE_ENDPOINT, testFolder.getNodeRef());
 | 
			
		||||
 | 
			
		||||
        RestRequest request = RestRequest.requestWithBody(HttpMethod.POST, ruleRequestBody, ruleEndpoint);
 | 
			
		||||
        RestResponse response = restClient.process(request);
 | 
			
		||||
 | 
			
		||||
        response.assertThat().statusCode(HttpStatus.OK.value());
 | 
			
		||||
 | 
			
		||||
        dataContent.usingUser(testUser)
 | 
			
		||||
                .usingSite(testSite)
 | 
			
		||||
                .usingResource(testFolder)
 | 
			
		||||
                .createContent(FileModel.getRandomFileModel(FileType.TEXT_PLAIN));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,76 +0,0 @@
 | 
			
		||||
package org.alfresco.rest.actions.access;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.actions.access.pojo.Action;
 | 
			
		||||
import org.alfresco.rest.RestTest;
 | 
			
		||||
import org.alfresco.rest.core.RestRequest;
 | 
			
		||||
import org.alfresco.rest.core.RestResponse;
 | 
			
		||||
import org.alfresco.rest.core.RestWrapper;
 | 
			
		||||
import org.alfresco.utility.model.UserModel;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.http.HttpMethod;
 | 
			
		||||
import org.springframework.http.HttpStatus;
 | 
			
		||||
import org.testng.annotations.BeforeClass;
 | 
			
		||||
import org.testng.annotations.BeforeMethod;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.rest.actions.access.AccessRestrictionUtil.ERROR_MESSAGE_ACCESS_RESTRICTED;
 | 
			
		||||
import static org.alfresco.rest.actions.access.AccessRestrictionUtil.ERROR_MESSAGE_FIELD;
 | 
			
		||||
import static org.alfresco.rest.actions.access.AccessRestrictionUtil.MAIL_ACTION;
 | 
			
		||||
import static org.alfresco.rest.actions.access.AccessRestrictionUtil.createActionWithParameters;
 | 
			
		||||
import static org.alfresco.rest.actions.access.AccessRestrictionUtil.createMailParameters;
 | 
			
		||||
import static org.alfresco.rest.actions.access.AccessRestrictionUtil.getExpectedEmailSendFailureMessage;
 | 
			
		||||
import static org.alfresco.rest.actions.access.AccessRestrictionUtil.mapObjectToJSON;
 | 
			
		||||
import static org.hamcrest.Matchers.containsString;
 | 
			
		||||
 | 
			
		||||
public class V0AdminAccessRestrictionTest extends RestTest {
 | 
			
		||||
 | 
			
		||||
    private static final String ACTION_QUEUE_ENDPOINT = "alfresco/service/api/actionQueue?async=false";
 | 
			
		||||
 | 
			
		||||
    private UserModel adminUser;
 | 
			
		||||
    private UserModel testUser;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    protected RestWrapper restClient;
 | 
			
		||||
 | 
			
		||||
    @BeforeClass(alwaysRun = true)
 | 
			
		||||
    public void dataPreparation() throws Exception {
 | 
			
		||||
        adminUser = dataUser.getAdminUser();
 | 
			
		||||
 | 
			
		||||
        testUser = dataUser.createRandomTestUser();
 | 
			
		||||
        testSite = dataSite.usingUser(testUser)
 | 
			
		||||
                .createPublicRandomSite();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @BeforeMethod(alwaysRun=true)
 | 
			
		||||
    public void setup() {
 | 
			
		||||
        restClient.configureRequestSpec().setBasePath("");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void userShouldNotExecuteMailActionQueue() {
 | 
			
		||||
        restClient.authenticateUser(testUser);
 | 
			
		||||
 | 
			
		||||
        Action action = createActionWithParameters(MAIL_ACTION, createMailParameters(adminUser, testUser));
 | 
			
		||||
        String actionRequestBody = mapObjectToJSON(action);
 | 
			
		||||
 | 
			
		||||
        RestRequest request = RestRequest.requestWithBody(HttpMethod.POST, actionRequestBody, ACTION_QUEUE_ENDPOINT);
 | 
			
		||||
        RestResponse response = restClient.process(request);
 | 
			
		||||
 | 
			
		||||
        response.assertThat().statusCode(HttpStatus.INTERNAL_SERVER_ERROR.value())
 | 
			
		||||
                .assertThat().body(ERROR_MESSAGE_FIELD, containsString(ERROR_MESSAGE_ACCESS_RESTRICTED));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void adminShouldExecuteMailActionQueue() {
 | 
			
		||||
        restClient.authenticateUser(adminUser);
 | 
			
		||||
 | 
			
		||||
        Action action = createActionWithParameters(MAIL_ACTION, createMailParameters(adminUser, testUser));
 | 
			
		||||
        String actionRequestBody = mapObjectToJSON(action);
 | 
			
		||||
 | 
			
		||||
        RestRequest request = RestRequest.requestWithBody(HttpMethod.POST, actionRequestBody, ACTION_QUEUE_ENDPOINT);
 | 
			
		||||
        RestResponse response = restClient.process(request);
 | 
			
		||||
 | 
			
		||||
        response.assertThat().statusCode(HttpStatus.INTERNAL_SERVER_ERROR.value())
 | 
			
		||||
                .assertThat().body(ERROR_MESSAGE_FIELD, containsString(getExpectedEmailSendFailureMessage(testUser)));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,64 +0,0 @@
 | 
			
		||||
package org.alfresco.rest.actions.access;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.RestTest;
 | 
			
		||||
import org.alfresco.utility.model.FolderModel;
 | 
			
		||||
import org.alfresco.utility.model.UserModel;
 | 
			
		||||
import org.springframework.http.HttpStatus;
 | 
			
		||||
import org.testng.annotations.BeforeClass;
 | 
			
		||||
import org.testng.annotations.Test;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.core.RestWrapper;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
 | 
			
		||||
import static org.alfresco.rest.actions.access.AccessRestrictionUtil.ERROR_MESSAGE_ACCESS_RESTRICTED;
 | 
			
		||||
import static org.alfresco.rest.actions.access.AccessRestrictionUtil.MAIL_ACTION;
 | 
			
		||||
import static org.alfresco.rest.actions.access.AccessRestrictionUtil.createMailParameters;
 | 
			
		||||
import static org.hamcrest.Matchers.notNullValue;
 | 
			
		||||
import static org.hamcrest.Matchers.nullValue;
 | 
			
		||||
 | 
			
		||||
public class V1AdminAccessRestrictionTest extends RestTest {
 | 
			
		||||
 | 
			
		||||
    private UserModel adminUser;
 | 
			
		||||
    private UserModel testUser;
 | 
			
		||||
    private FolderModel testFolder;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    protected RestWrapper restClient;
 | 
			
		||||
 | 
			
		||||
    @BeforeClass(alwaysRun = true)
 | 
			
		||||
    public void dataPreparation() throws Exception {
 | 
			
		||||
        adminUser = dataUser.getAdminUser();
 | 
			
		||||
 | 
			
		||||
        testUser = dataUser.createRandomTestUser();
 | 
			
		||||
        testSite = dataSite.usingUser(testUser)
 | 
			
		||||
                           .createPublicRandomSite();
 | 
			
		||||
        testFolder = dataContent.usingUser(testUser)
 | 
			
		||||
                                .usingSite(testSite)
 | 
			
		||||
                                .createFolder();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void userShouldNotExecuteMailAction() throws Exception {
 | 
			
		||||
        restClient.authenticateUser(testUser)
 | 
			
		||||
                          .withCoreAPI()
 | 
			
		||||
                          .usingActions()
 | 
			
		||||
                          .executeAction(MAIL_ACTION, testFolder, createMailParameters(adminUser, testUser));
 | 
			
		||||
 | 
			
		||||
        restClient.onResponse()
 | 
			
		||||
                .assertThat().statusCode(HttpStatus.INTERNAL_SERVER_ERROR.value())
 | 
			
		||||
                .assertThat().body("entry.id", nullValue());
 | 
			
		||||
        restClient.assertLastError().containsSummary(ERROR_MESSAGE_ACCESS_RESTRICTED);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void adminShouldExecuteMailAction() throws Exception {
 | 
			
		||||
        restClient.authenticateUser(adminUser)
 | 
			
		||||
                          .withCoreAPI()
 | 
			
		||||
                          .usingActions()
 | 
			
		||||
                          .executeAction(MAIL_ACTION, testFolder, createMailParameters(adminUser, testUser));
 | 
			
		||||
 | 
			
		||||
        restClient.onResponse()
 | 
			
		||||
                .assertThat().statusCode(HttpStatus.ACCEPTED.value())
 | 
			
		||||
                .assertThat().body("entry.id", notNullValue());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,57 +0,0 @@
 | 
			
		||||
package org.alfresco.rest.actions.access.pojo;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
public class Action {
 | 
			
		||||
    private String actionDefinitionName;
 | 
			
		||||
    private String actionedUponNode;
 | 
			
		||||
    private List<ActionCondition> conditions;
 | 
			
		||||
    private List<Action> actions;
 | 
			
		||||
    private Map<String, String> parameterValues;
 | 
			
		||||
 | 
			
		||||
    private boolean executeAsynchronously;
 | 
			
		||||
 | 
			
		||||
    public void setExecuteAsynchronously(boolean executeAsynchronously) {
 | 
			
		||||
        this.executeAsynchronously = executeAsynchronously;
 | 
			
		||||
    }
 | 
			
		||||
    public String getActionDefinitionName() {
 | 
			
		||||
        return actionDefinitionName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setActionDefinitionName(String actionDefinitionName) {
 | 
			
		||||
        this.actionDefinitionName = actionDefinitionName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getActionedUponNode() {
 | 
			
		||||
        return actionedUponNode;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setActionedUponNode(String actionedUponNode) {
 | 
			
		||||
        this.actionedUponNode = actionedUponNode;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public List<ActionCondition> getConditions() {
 | 
			
		||||
        return conditions;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setConditions(List<ActionCondition> conditions) {
 | 
			
		||||
        this.conditions = conditions;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public List<Action> getActions() {
 | 
			
		||||
        return actions;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setActions(List<Action> actions) {
 | 
			
		||||
        this.actions = actions;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Map<String, String> getParameterValues() {
 | 
			
		||||
        return parameterValues;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setParameterValues(Map<String, String> parameterValues) {
 | 
			
		||||
        this.parameterValues = parameterValues;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,24 +0,0 @@
 | 
			
		||||
package org.alfresco.rest.actions.access.pojo;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
public class ActionCondition {
 | 
			
		||||
    private String conditionDefinitionName;
 | 
			
		||||
    private Map<String, String> parameterValues;
 | 
			
		||||
 | 
			
		||||
    public String getConditionDefinitionName() {
 | 
			
		||||
        return conditionDefinitionName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setConditionDefinitionName(String conditionDefinitionName) {
 | 
			
		||||
        this.conditionDefinitionName = conditionDefinitionName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Map<String, String> getParameterValues() {
 | 
			
		||||
        return parameterValues;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setParameterValues(Map<String, String> parameterValues) {
 | 
			
		||||
        this.parameterValues = parameterValues;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,78 +0,0 @@
 | 
			
		||||
package org.alfresco.rest.actions.access.pojo;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
public class Rule {
 | 
			
		||||
    private String id;
 | 
			
		||||
    private String title;
 | 
			
		||||
    private String description;
 | 
			
		||||
    private List<String> ruleType;
 | 
			
		||||
    private boolean executeAsynchronously;
 | 
			
		||||
    private boolean disabled;
 | 
			
		||||
    private boolean applyToChildren;
 | 
			
		||||
    private Action action;
 | 
			
		||||
 | 
			
		||||
    public String getId() {
 | 
			
		||||
        return id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setId(String id) {
 | 
			
		||||
        this.id = id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getTitle() {
 | 
			
		||||
        return title;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setTitle(String title) {
 | 
			
		||||
        this.title = title;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getDescription() {
 | 
			
		||||
        return description;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setDescription(String description) {
 | 
			
		||||
        this.description = description;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public List<String> getRuleType() {
 | 
			
		||||
        return ruleType;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setRuleType(List<String> ruleType) {
 | 
			
		||||
        this.ruleType = ruleType;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isExecuteAsynchronously() {
 | 
			
		||||
        return executeAsynchronously;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setExecuteAsynchronously(boolean executeAsynchronously) {
 | 
			
		||||
        this.executeAsynchronously = executeAsynchronously;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isDisabled() {
 | 
			
		||||
        return disabled;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setDisabled(boolean disabled) {
 | 
			
		||||
        this.disabled = disabled;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isApplyToChildren() {
 | 
			
		||||
        return applyToChildren;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setApplyToChildren(boolean applyToChildren) {
 | 
			
		||||
        this.applyToChildren = applyToChildren;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Action getAction() {
 | 
			
		||||
        return action;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setAction(Action action) {
 | 
			
		||||
        this.action = action;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -16,7 +16,7 @@ import org.testng.annotations.Test;
 | 
			
		||||
 */
 | 
			
		||||
public class GetProcessSanityTests extends RestTest
 | 
			
		||||
{
 | 
			
		||||
    private UserModel userWhoStartsProcess, assignee, user;
 | 
			
		||||
    private UserModel userWhoStartsProcess, assignee;
 | 
			
		||||
    private RestProcessModel addedProcess, process;
 | 
			
		||||
 | 
			
		||||
    @BeforeClass(alwaysRun = true)
 | 
			
		||||
@@ -24,7 +24,6 @@ public class GetProcessSanityTests extends RestTest
 | 
			
		||||
    {
 | 
			
		||||
        userWhoStartsProcess = dataUser.createRandomTestUser();
 | 
			
		||||
        assignee = dataUser.createRandomTestUser();
 | 
			
		||||
        user = dataUser.createRandomTestUser();
 | 
			
		||||
        addedProcess = restClient.authenticateUser(userWhoStartsProcess).withWorkflowAPI().addProcess("activitiAdhoc", assignee, false, CMISUtil.Priority.High);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -60,13 +59,4 @@ public class GetProcessSanityTests extends RestTest
 | 
			
		||||
        process.assertThat().field("id").is(addedProcess.getId())
 | 
			
		||||
                .and().field("startUserId").is(addedProcess.getStartUserId());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @TestRail(section = { TestGroup.REST_API, TestGroup.PROCESSES }, executionType = ExecutionType.SANITY,
 | 
			
		||||
            description = "Verify User that is not involved in a process cannot get that process using REST API and status code is FORBIDDEN (403)")
 | 
			
		||||
    @Test(groups = { TestGroup.REST_API, TestGroup.WORKFLOW, TestGroup.PROCESSES, TestGroup.SANITY })
 | 
			
		||||
    public void shouldNotGetProcessesByNotInvolvedUser() throws Exception
 | 
			
		||||
    {
 | 
			
		||||
        process = restClient.authenticateUser(user).withWorkflowAPI().usingProcess(addedProcess).getProcess();
 | 
			
		||||
        restClient.assertStatusCodeIs(HttpStatus.FORBIDDEN);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-tests</artifactId>
 | 
			
		||||
        <version>17.48</version>
 | 
			
		||||
        <version>23.1.0.23-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <developers>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-packaging</artifactId>
 | 
			
		||||
        <version>17.48</version>
 | 
			
		||||
        <version>23.1.0.23-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <properties>
 | 
			
		||||
@@ -144,7 +144,7 @@
 | 
			
		||||
            <plugin>
 | 
			
		||||
                <groupId>org.codehaus.mojo</groupId>
 | 
			
		||||
                <artifactId>buildnumber-maven-plugin</artifactId>
 | 
			
		||||
                <version>3.0.0</version>
 | 
			
		||||
                <version>1.4</version>
 | 
			
		||||
                <executions>
 | 
			
		||||
                    <execution>
 | 
			
		||||
                        <phase>validate</phase>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										82
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										82
									
								
								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.48</version>
 | 
			
		||||
    <version>23.1.0.23-SNAPSHOT</version>
 | 
			
		||||
    <packaging>pom</packaging>
 | 
			
		||||
    <name>Alfresco Community Repo Parent</name>
 | 
			
		||||
 | 
			
		||||
@@ -23,11 +23,11 @@
 | 
			
		||||
    </modules>
 | 
			
		||||
 | 
			
		||||
    <properties>
 | 
			
		||||
        <acs.version.major>7</acs.version.major>
 | 
			
		||||
        <acs.version.minor>3</acs.version.minor>
 | 
			
		||||
        <acs.version.major>23</acs.version.major>
 | 
			
		||||
        <acs.version.minor>1</acs.version.minor>
 | 
			
		||||
        <acs.version.revision>0</acs.version.revision>
 | 
			
		||||
        <acs.version.label />
 | 
			
		||||
        <amp.min.version>${acs.version.major}.0.0</amp.min.version>
 | 
			
		||||
        <amp.min.version>${acs.version.major}.1.0</amp.min.version>
 | 
			
		||||
 | 
			
		||||
        <version.edition>Community</version.edition>
 | 
			
		||||
        <licenseName>community</licenseName>
 | 
			
		||||
@@ -54,52 +54,51 @@
 | 
			
		||||
        <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.2</dependency.alfresco-greenmail.version>
 | 
			
		||||
        <dependency.acs-event-model.version>0.0.15</dependency.acs-event-model.version>
 | 
			
		||||
        <dependency.acs-event-model.version>0.0.13</dependency.acs-event-model.version>
 | 
			
		||||
 | 
			
		||||
        <dependency.spring.version>5.3.21</dependency.spring.version>
 | 
			
		||||
        <dependency.spring.version>5.3.18</dependency.spring.version>
 | 
			
		||||
        <dependency.antlr.version>3.5.2</dependency.antlr.version>
 | 
			
		||||
        <dependency.jackson.version>2.13.3</dependency.jackson.version>
 | 
			
		||||
        <dependency.jackson-databind.version>2.13.3</dependency.jackson-databind.version>
 | 
			
		||||
        <dependency.cxf.version>3.5.3</dependency.cxf.version>
 | 
			
		||||
        <dependency.jackson.version>2.13.1</dependency.jackson.version>
 | 
			
		||||
        <dependency.jackson-databind.version>2.13.1</dependency.jackson-databind.version>
 | 
			
		||||
        <dependency.cxf.version>3.5.0</dependency.cxf.version>
 | 
			
		||||
        <dependency.opencmis.version>1.0.0</dependency.opencmis.version>
 | 
			
		||||
        <dependency.webscripts.version>8.31</dependency.webscripts.version>
 | 
			
		||||
        <dependency.webscripts.version>8.29</dependency.webscripts.version>
 | 
			
		||||
        <dependency.bouncycastle.version>1.70</dependency.bouncycastle.version>
 | 
			
		||||
        <dependency.mockito-core.version>4.6.1</dependency.mockito-core.version>
 | 
			
		||||
        <dependency.assertj.version>3.23.1</dependency.assertj.version>
 | 
			
		||||
        <dependency.org-json.version>20220320</dependency.org-json.version>
 | 
			
		||||
        <dependency.mockito-core.version>3.11.2</dependency.mockito-core.version>
 | 
			
		||||
        <dependency.org-json.version>20211205</dependency.org-json.version>
 | 
			
		||||
        <dependency.commons-dbcp.version>2.9.0</dependency.commons-dbcp.version>
 | 
			
		||||
        <dependency.commons-io.version>2.11.0</dependency.commons-io.version>
 | 
			
		||||
        <dependency.gson.version>2.8.9</dependency.gson.version>
 | 
			
		||||
        <dependency.gson.version>2.8.5</dependency.gson.version>
 | 
			
		||||
        <dependency.httpclient.version>4.5.13</dependency.httpclient.version>
 | 
			
		||||
        <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.35</dependency.slf4j.version>
 | 
			
		||||
        <dependency.gytheio.version>0.16</dependency.gytheio.version>
 | 
			
		||||
        <dependency.groovy.version>3.0.11</dependency.groovy.version>
 | 
			
		||||
        <dependency.tika.version>2.4.1</dependency.tika.version>
 | 
			
		||||
        <dependency.spring-security.version>5.7.2</dependency.spring-security.version>
 | 
			
		||||
        <dependency.groovy.version>3.0.9</dependency.groovy.version>
 | 
			
		||||
        <dependency.tika.version>2.2.1</dependency.tika.version>
 | 
			
		||||
        <dependency.spring-security.version>5.6.1</dependency.spring-security.version>
 | 
			
		||||
        <dependency.truezip.version>7.7.10</dependency.truezip.version>
 | 
			
		||||
        <dependency.poi.version>5.2.2</dependency.poi.version>
 | 
			
		||||
        <dependency.poi.version>4.1.2</dependency.poi.version>
 | 
			
		||||
        <dependency.ooxml-schemas.version>1.4</dependency.ooxml-schemas.version>
 | 
			
		||||
        <dependency.keycloak.version>15.0.2</dependency.keycloak.version>
 | 
			
		||||
        <dependency.jboss.logging.version>3.5.0.Final</dependency.jboss.logging.version>
 | 
			
		||||
        <dependency.jboss.logging.version>3.4.3.Final</dependency.jboss.logging.version>
 | 
			
		||||
        <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.16.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>
 | 
			
		||||
        <dependency.awaitility.version>4.2.0</dependency.awaitility.version>
 | 
			
		||||
        <dependency.awaitility.version>4.1.1</dependency.awaitility.version>
 | 
			
		||||
        <dependency.swagger-ui.version>3.38.0</dependency.swagger-ui.version>
 | 
			
		||||
        <dependency.swagger-parser.version>1.0.61</dependency.swagger-parser.version>
 | 
			
		||||
        <dependency.swagger-parser.version>1.0.56</dependency.swagger-parser.version>
 | 
			
		||||
        <dependency.maven-filtering.version>3.1.1</dependency.maven-filtering.version>
 | 
			
		||||
        <dependency.maven-artifact.version>3.8.6</dependency.maven-artifact.version>
 | 
			
		||||
        <dependency.maven-artifact.version>3.8.4</dependency.maven-artifact.version>
 | 
			
		||||
        <dependency.jdom2.version>2.0.6.1</dependency.jdom2.version>
 | 
			
		||||
 | 
			
		||||
        <dependency.jakarta-jaxb-api.version>2.3.3</dependency.jakarta-jaxb-api.version>
 | 
			
		||||
        <dependency.jakarta-ws-api.version>2.3.3</dependency.jakarta-ws-api.version>
 | 
			
		||||
        <dependency.jakarta-soap-api.version>1.4.2</dependency.jakarta-soap-api.version>
 | 
			
		||||
        <dependency.jakarta-activation-api.version>1.2.2</dependency.jakarta-activation-api.version>
 | 
			
		||||
        <dependency.jakarta-annotation-api.version>2.1.1</dependency.jakarta-annotation-api.version>
 | 
			
		||||
        <dependency.jakarta-annotation-api.version>1.3.5</dependency.jakarta-annotation-api.version>
 | 
			
		||||
        <dependency.jakarta-transaction-api.version>1.3.3</dependency.jakarta-transaction-api.version>
 | 
			
		||||
        <dependency.jakarta-jws-api.version>2.1.0</dependency.jakarta-jws-api.version>
 | 
			
		||||
        <dependency.jakarta-mail-api.version>1.6.5</dependency.jakarta-mail-api.version>
 | 
			
		||||
@@ -107,20 +106,20 @@
 | 
			
		||||
        <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.2-A3</alfresco.googledrive.version>
 | 
			
		||||
        <alfresco.googledrive.version>3.2.1.3</alfresco.googledrive.version>
 | 
			
		||||
        <alfresco.aos-module.version>1.4.1</alfresco.aos-module.version> 
 | 
			
		||||
        <alfresco.api-explorer.version>7.2.0</alfresco.api-explorer.version> <!-- Also in alfresco-enterprise-share -->
 | 
			
		||||
 | 
			
		||||
        <alfresco.maven-plugin.version>2.2.0</alfresco.maven-plugin.version>
 | 
			
		||||
        <license-maven-plugin.version>2.0.1.alfresco-2</license-maven-plugin.version>
 | 
			
		||||
 | 
			
		||||
        <dependency.postgresql.version>42.4.0</dependency.postgresql.version>
 | 
			
		||||
        <dependency.mysql.version>8.0.29</dependency.mysql.version>
 | 
			
		||||
        <dependency.postgresql.version>42.3.2</dependency.postgresql.version>
 | 
			
		||||
        <dependency.mysql.version>8.0.27</dependency.mysql.version>
 | 
			
		||||
        <dependency.mysql-image.version>8</dependency.mysql-image.version>
 | 
			
		||||
        <dependency.mariadb.version>2.7.4</dependency.mariadb.version>
 | 
			
		||||
        <dependency.tas-utility.version>3.0.48</dependency.tas-utility.version>
 | 
			
		||||
        <dependency.tas-utility.version>3.0.47</dependency.tas-utility.version>
 | 
			
		||||
        <dependency.rest-assured.version>3.3.0</dependency.rest-assured.version>
 | 
			
		||||
        <dependency.tas-restapi.version>1.87</dependency.tas-restapi.version>
 | 
			
		||||
        <dependency.tas-restapi.version>1.80</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>
 | 
			
		||||
@@ -148,7 +147,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.48</tag>
 | 
			
		||||
        <tag>HEAD</tag>
 | 
			
		||||
    </scm>
 | 
			
		||||
 | 
			
		||||
    <distributionManagement>
 | 
			
		||||
@@ -405,7 +404,7 @@
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>org.apache.xmlbeans</groupId>
 | 
			
		||||
                <artifactId>xmlbeans</artifactId>
 | 
			
		||||
                <version>5.1.0</version>
 | 
			
		||||
                <version>3.1.0</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>org.json</groupId>
 | 
			
		||||
@@ -633,13 +632,13 @@
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>com.drewnoakes</groupId>
 | 
			
		||||
                <artifactId>metadata-extractor</artifactId>
 | 
			
		||||
                <version>2.18.0</version>
 | 
			
		||||
                <version>2.16.0</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
            <!-- upgrade dependency from TIKA -->
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>com.github.junrar</groupId>
 | 
			
		||||
                <artifactId>junrar</artifactId>
 | 
			
		||||
                <version>7.5.2</version>
 | 
			
		||||
                <version>7.4.1</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>com.github.fge</groupId>
 | 
			
		||||
@@ -650,7 +649,7 @@
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>org.jsoup</groupId>
 | 
			
		||||
                <artifactId>jsoup</artifactId>
 | 
			
		||||
                <version>1.15.2</version>
 | 
			
		||||
                <version>1.14.3</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
            <!-- upgrade dependency from TIKA -->
 | 
			
		||||
            <dependency>
 | 
			
		||||
@@ -729,7 +728,7 @@
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>joda-time</groupId>
 | 
			
		||||
                <artifactId>joda-time</artifactId>
 | 
			
		||||
                <version>2.10.14</version>
 | 
			
		||||
                <version>2.10.13</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
 | 
			
		||||
            <!-- provided dependencies -->
 | 
			
		||||
@@ -756,11 +755,6 @@
 | 
			
		||||
                <artifactId>mockito-core</artifactId>
 | 
			
		||||
                <version>${dependency.mockito-core.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>org.assertj</groupId>
 | 
			
		||||
                <artifactId>assertj-core</artifactId>
 | 
			
		||||
                <version>${dependency.assertj.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>org.apache.commons</groupId>
 | 
			
		||||
                <artifactId>commons-dbcp2</artifactId>
 | 
			
		||||
@@ -874,7 +868,7 @@
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>org.projectlombok</groupId>
 | 
			
		||||
                <artifactId>lombok</artifactId>
 | 
			
		||||
                <version>1.18.24</version>
 | 
			
		||||
                <version>1.18.22</version>
 | 
			
		||||
                <scope>provided</scope>
 | 
			
		||||
            </dependency>
 | 
			
		||||
        </dependencies>
 | 
			
		||||
@@ -894,7 +888,7 @@
 | 
			
		||||
                <plugin>
 | 
			
		||||
                    <groupId>io.fabric8</groupId>
 | 
			
		||||
                    <artifactId>docker-maven-plugin</artifactId>
 | 
			
		||||
                    <version>0.40.1</version>
 | 
			
		||||
                    <version>0.39.1</version>
 | 
			
		||||
                </plugin>
 | 
			
		||||
                <plugin>
 | 
			
		||||
                    <artifactId>maven-surefire-plugin</artifactId>
 | 
			
		||||
@@ -915,7 +909,7 @@
 | 
			
		||||
                <plugin>
 | 
			
		||||
                    <groupId>org.apache.maven.plugins</groupId>
 | 
			
		||||
                    <artifactId>maven-javadoc-plugin</artifactId>
 | 
			
		||||
                    <version>3.4.0</version>
 | 
			
		||||
                    <version>3.3.1</version>
 | 
			
		||||
                </plugin>
 | 
			
		||||
                <plugin>
 | 
			
		||||
                    <groupId>org.apache.maven.plugins</groupId>
 | 
			
		||||
@@ -925,11 +919,11 @@
 | 
			
		||||
                <plugin>
 | 
			
		||||
                    <groupId>org.apache.maven.plugins</groupId>
 | 
			
		||||
                    <artifactId>maven-dependency-plugin</artifactId>
 | 
			
		||||
                    <version>3.3.0</version>
 | 
			
		||||
                    <version>3.1.2</version>
 | 
			
		||||
                </plugin>
 | 
			
		||||
                <plugin>
 | 
			
		||||
                    <artifactId>maven-assembly-plugin</artifactId>
 | 
			
		||||
                    <version>3.4.1</version>
 | 
			
		||||
                    <version>3.3.0</version>
 | 
			
		||||
                </plugin>
 | 
			
		||||
                <plugin>
 | 
			
		||||
                    <groupId>org.alfresco.maven.plugin</groupId>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo</artifactId>
 | 
			
		||||
        <version>17.48</version>
 | 
			
		||||
        <version>23.1.0.23-SNAPSHOT</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <dependencies>
 | 
			
		||||
@@ -47,7 +47,7 @@
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.apache.santuario</groupId>
 | 
			
		||||
            <artifactId>xmlsec</artifactId>
 | 
			
		||||
            <version>3.0.0</version>
 | 
			
		||||
            <version>2.3.0</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <!-- newer version, see REPO-3133 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
@@ -87,11 +87,6 @@
 | 
			
		||||
            <artifactId>mockito-core</artifactId>
 | 
			
		||||
            <scope>test</scope>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.assertj</groupId>
 | 
			
		||||
            <artifactId>assertj-core</artifactId>
 | 
			
		||||
            <scope>test</scope>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework</groupId>
 | 
			
		||||
            <artifactId>spring-test</artifactId>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,33 +1,32 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%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%
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * 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.web.scripts.action;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.repo.action.access.ActionAccessRestriction;
 | 
			
		||||
import org.alfresco.service.cmr.action.Action;
 | 
			
		||||
import org.alfresco.service.cmr.action.ExecutionSummary;
 | 
			
		||||
import org.springframework.extensions.webscripts.Cache;
 | 
			
		||||
@@ -59,7 +58,6 @@ public abstract class AbstractExecuteActionWebscript extends AbstractActionWebsc
 | 
			
		||||
           
 | 
			
		||||
           // Ask for it to be run in the background
 | 
			
		||||
           // It will be available to execute once the webscript finishes
 | 
			
		||||
           ActionAccessRestriction.setActionContext(action, ActionAccessRestriction.V0_ACTION_CONTEXT);
 | 
			
		||||
           actionService.executeAction(
 | 
			
		||||
                 action, null, 
 | 
			
		||||
                 false, true
 | 
			
		||||
 
 | 
			
		||||
@@ -1,28 +1,28 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%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%
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * 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.web.scripts.rule;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
@@ -38,8 +38,6 @@ import org.alfresco.error.AlfrescoRuntimeException;
 | 
			
		||||
import org.alfresco.repo.action.ActionConditionImpl;
 | 
			
		||||
import org.alfresco.repo.action.ActionImpl;
 | 
			
		||||
import org.alfresco.repo.action.CompositeActionImpl;
 | 
			
		||||
import org.alfresco.repo.action.RuntimeActionService;
 | 
			
		||||
import org.alfresco.repo.action.access.ActionAccessRestriction;
 | 
			
		||||
import org.alfresco.service.cmr.action.Action;
 | 
			
		||||
import org.alfresco.service.cmr.action.ActionCondition;
 | 
			
		||||
import org.alfresco.service.cmr.action.ActionService;
 | 
			
		||||
@@ -87,8 +85,6 @@ public abstract class AbstractRuleWebScript extends DeclarativeWebScript
 | 
			
		||||
    protected FileFolderService fileFolderService;
 | 
			
		||||
    protected NamespaceService namespaceService;
 | 
			
		||||
 | 
			
		||||
    private RuntimeActionService runtimeActionService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sets the node service instance
 | 
			
		||||
     * 
 | 
			
		||||
@@ -149,10 +145,6 @@ public abstract class AbstractRuleWebScript extends DeclarativeWebScript
 | 
			
		||||
        this.namespaceService = namespaceService;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setRuntimeActionService(RuntimeActionService runtimeActionService) {
 | 
			
		||||
        this.runtimeActionService = runtimeActionService;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Parses the request and providing it's valid returns the NodeRef.
 | 
			
		||||
     * 
 | 
			
		||||
@@ -440,22 +432,10 @@ public abstract class AbstractRuleWebScript extends DeclarativeWebScript
 | 
			
		||||
 | 
			
		||||
    protected void checkRule(Rule rule)
 | 
			
		||||
    {
 | 
			
		||||
        List<Action> actions = ((CompositeActionImpl) rule.getAction()).getActions();
 | 
			
		||||
 | 
			
		||||
        checkRestrictedAccessActions(actions);
 | 
			
		||||
        checkRuleOutboundHasNoCheckOutAction(rule, actions);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void checkRestrictedAccessActions(List<Action> actions) {
 | 
			
		||||
        for (Action action : actions) {
 | 
			
		||||
            ActionAccessRestriction.setActionContext(action, ActionAccessRestriction.RULE_ACTION_CONTEXT);
 | 
			
		||||
            runtimeActionService.verifyActionAccessRestrictions(action);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void checkRuleOutboundHasNoCheckOutAction(Rule rule, List<Action> actions) {
 | 
			
		||||
        if (rule.getRuleTypes().contains(RULE_OUTBOUND))
 | 
			
		||||
        List<String> ruleTypes = rule.getRuleTypes();
 | 
			
		||||
        if (ruleTypes.contains(RULE_OUTBOUND))
 | 
			
		||||
        {
 | 
			
		||||
            List<Action> actions = ((CompositeActionImpl) rule.getAction()).getActions();
 | 
			
		||||
            for (Action action : actions)
 | 
			
		||||
            {
 | 
			
		||||
                if (action.getActionDefinitionName().equalsIgnoreCase(ACTION_CHECK_OUT))
 | 
			
		||||
 
 | 
			
		||||
@@ -1,28 +1,28 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%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%
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * 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.web.scripts.rule;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
@@ -30,7 +30,6 @@ import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.repo.action.ActionImpl;
 | 
			
		||||
import org.alfresco.repo.action.access.ActionAccessRestriction;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeRef;
 | 
			
		||||
import org.apache.commons.logging.Log;
 | 
			
		||||
import org.apache.commons.logging.LogFactory;
 | 
			
		||||
@@ -90,7 +89,6 @@ public class ActionQueuePost extends AbstractRuleWebScript
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Execute action
 | 
			
		||||
            ActionAccessRestriction.setActionContext(action, ActionAccessRestriction.V0_ACTION_CONTEXT);
 | 
			
		||||
            actionService.executeAction(action, actionedUponNode, true, async);
 | 
			
		||||
 | 
			
		||||
            // Prepair model
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * 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 
 | 
			
		||||
@@ -390,9 +390,8 @@ public class LockInfoImpl implements Serializable, LockInfo
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            Date now = dateNow();
 | 
			
		||||
            long remainingTimeoutInSecondsRoundedUp = (Math.max(expires.getTime() - now.getTime(), 0) + 999) / 1000;
 | 
			
		||||
 | 
			
		||||
            return remainingTimeoutInSecondsRoundedUp;
 | 
			
		||||
            long timeout = ((expires.getTime() - now.getTime()) / 1000);
 | 
			
		||||
            return timeout;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,28 +1,28 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%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%
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * 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.webdav;
 | 
			
		||||
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
@@ -449,18 +449,30 @@ public class LockMethod extends WebDAVMethod
 | 
			
		||||
     */
 | 
			
		||||
    protected final void createLock(FileInfo lockNode, String userName) throws WebDAVServerException
 | 
			
		||||
    {
 | 
			
		||||
        if (!createExclusive) {
 | 
			
		||||
        // Create Lock token
 | 
			
		||||
        lockToken = WebDAV.makeLockToken(lockNode.getNodeRef(), userName);
 | 
			
		||||
 | 
			
		||||
        if (createExclusive)
 | 
			
		||||
        {
 | 
			
		||||
            // Lock the node
 | 
			
		||||
            lockInfo.setTimeoutSeconds(getLockTimeout());
 | 
			
		||||
            lockInfo.setExclusiveLockToken(lockToken);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            // Shared lock creation should already have been prohibited when parsing the request body
 | 
			
		||||
            throw new WebDAVServerException(HttpServletResponse.SC_PRECONDITION_FAILED);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        lockToken = WebDAV.makeLockToken(lockNode.getNodeRef(), userName);
 | 
			
		||||
        lockInfo.setExclusiveLockToken(lockToken);
 | 
			
		||||
        // Store lock depth
 | 
			
		||||
        lockInfo.setDepth(WebDAV.getDepthName(m_depth));
 | 
			
		||||
        lockInfo.setScope(WebDAV.XML_EXCLUSIVE);
 | 
			
		||||
        // Store lock scope (shared/exclusive)
 | 
			
		||||
        String scope = createExclusive ? WebDAV.XML_EXCLUSIVE : WebDAV.XML_SHARED;
 | 
			
		||||
        lockInfo.setScope(scope);
 | 
			
		||||
        // Store the owner of this lock
 | 
			
		||||
        lockInfo.setOwner(userName);
 | 
			
		||||
 | 
			
		||||
        getDAVLockService().lock(lockNode.getNodeRef(), lockInfo, getLockTimeout());
 | 
			
		||||
        // Lock the node
 | 
			
		||||
        getDAVLockService().lock(lockNode.getNodeRef(), lockInfo);
 | 
			
		||||
        
 | 
			
		||||
        if (logger.isDebugEnabled())
 | 
			
		||||
        {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,28 +1,28 @@
 | 
			
		||||
/*
 | 
			
		||||
 * #%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%
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * 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.webdav;
 | 
			
		||||
 | 
			
		||||
@@ -56,9 +56,7 @@ public interface WebDAVLockService
 | 
			
		||||
    void lock(NodeRef nodeRef, String userName, int timeout);
 | 
			
		||||
 | 
			
		||||
    void lock(NodeRef nodeRef, LockInfo lockInfo);
 | 
			
		||||
 | 
			
		||||
    void lock(NodeRef nodeRef, LockInfo lockInfo, int timeout);
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Shared method for webdav/vti to unlock node. Unlocked node is automatically removed from
 | 
			
		||||
     * current sessions's locked resources list.
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * 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 
 | 
			
		||||
@@ -32,6 +32,7 @@ import java.util.List;
 | 
			
		||||
import javax.servlet.http.HttpSession;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.model.ContentModel;
 | 
			
		||||
import org.alfresco.repo.lock.LockUtils;
 | 
			
		||||
import org.alfresco.repo.lock.mem.Lifetime;
 | 
			
		||||
import org.alfresco.repo.lock.mem.LockState;
 | 
			
		||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
 | 
			
		||||
@@ -236,15 +237,57 @@ public class WebDAVLockServiceImpl implements WebDAVLockService
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void lock(NodeRef nodeRef, LockInfo lockInfo) {
 | 
			
		||||
        int timeout = (int) lockInfo.getRemainingTimeoutSeconds();
 | 
			
		||||
        lock(nodeRef, lockInfo, timeout);
 | 
			
		||||
    }
 | 
			
		||||
    public void lock(NodeRef nodeRef, LockInfo lockInfo)
 | 
			
		||||
    {
 | 
			
		||||
        boolean performSessionBehavior = false;
 | 
			
		||||
        long timeout;
 | 
			
		||||
        
 | 
			
		||||
        timeout = lockInfo.getRemainingTimeoutSeconds();    
 | 
			
		||||
        
 | 
			
		||||
        // ALF-11777 fix, do not lock node for more than 24 hours (webdav and vti)
 | 
			
		||||
        if (timeout >= WebDAV.TIMEOUT_24_HOURS || timeout == WebDAV.TIMEOUT_INFINITY)
 | 
			
		||||
        {   
 | 
			
		||||
            timeout = WebDAV.TIMEOUT_24_HOURS;
 | 
			
		||||
            lockInfo.setTimeoutSeconds((int) timeout);
 | 
			
		||||
            performSessionBehavior = true;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        // TODO: lock children according to depth? lock type?
 | 
			
		||||
        final String additionalInfo = lockInfo.toJSON();
 | 
			
		||||
        lockService.lock(nodeRef, LockType.WRITE_LOCK, (int) timeout, Lifetime.EPHEMERAL, additionalInfo);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        if (logger.isDebugEnabled())
 | 
			
		||||
        {
 | 
			
		||||
            logger.debug(nodeRef + " was locked for " + timeout + " seconds.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (performSessionBehavior)
 | 
			
		||||
        {
 | 
			
		||||
            HttpSession session = currentSession.get();
 | 
			
		||||
 | 
			
		||||
            if (session == null)
 | 
			
		||||
            {
 | 
			
		||||
                if (logger.isDebugEnabled())
 | 
			
		||||
                {
 | 
			
		||||
                    logger.debug("Couldn't find current session.");
 | 
			
		||||
                }
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            storeObjectInSessionList(session, LOCKED_RESOURCES, new Pair<String, NodeRef>(AuthenticationUtil.getRunAsUser(), nodeRef));
 | 
			
		||||
 | 
			
		||||
            if (logger.isDebugEnabled())
 | 
			
		||||
            {
 | 
			
		||||
                logger.debug(nodeRef + " was added to the session " + session.getId() + " for post expiration processing.");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Shared method for webdav/vti protocols to lock node. If node is locked for more than 24 hours it is automatically added
 | 
			
		||||
     * to the current session locked resources list.
 | 
			
		||||
     *
 | 
			
		||||
     * 
 | 
			
		||||
     * @param nodeRef the node to lock
 | 
			
		||||
     * @param userName userName
 | 
			
		||||
     * @param timeout the number of seconds before the locks expires
 | 
			
		||||
@@ -252,68 +295,8 @@ public class WebDAVLockServiceImpl implements WebDAVLockService
 | 
			
		||||
    @Override
 | 
			
		||||
    public void lock(NodeRef nodeRef, String userName, int timeout)
 | 
			
		||||
    {
 | 
			
		||||
        LockInfo lockInfo = createLock(nodeRef, userName, true);
 | 
			
		||||
        lock(nodeRef, lockInfo, timeout);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void lock(NodeRef nodeRef, LockInfo lockInfo, int timeout)
 | 
			
		||||
    {
 | 
			
		||||
        // ALF-11777 fix, do not lock node for more than 24 hours (webdav and vti)
 | 
			
		||||
        boolean performSessionBehavior = false;
 | 
			
		||||
        if (timeout > WebDAV.TIMEOUT_24_HOURS || timeout == WebDAV.TIMEOUT_INFINITY)
 | 
			
		||||
        {
 | 
			
		||||
            timeout = WebDAV.TIMEOUT_24_HOURS;
 | 
			
		||||
            performSessionBehavior = true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        validateLockTimeout(timeout);
 | 
			
		||||
        lockInner(nodeRef, lockInfo, timeout);
 | 
			
		||||
 | 
			
		||||
        if (performSessionBehavior)
 | 
			
		||||
        {
 | 
			
		||||
            performLockSessionBehavior(nodeRef);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void validateLockTimeout(int timeout) {
 | 
			
		||||
        if (timeout != WebDAV.TIMEOUT_INFINITY && timeout == LockService.TIMEOUT_INFINITY) {
 | 
			
		||||
            throw new IllegalArgumentException("Timeout == " + LockService.TIMEOUT_INFINITY +
 | 
			
		||||
                    " is treated as permanence for locks. For maximum allowed timeout set " + WebDAV.TIMEOUT_INFINITY);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void lockInner(NodeRef nodeRef, LockInfo lockInfo, int timeout) {
 | 
			
		||||
        //Update/set true expiry date of a lock to be used in additional information
 | 
			
		||||
        lockInfo.setTimeoutSeconds(timeout);
 | 
			
		||||
 | 
			
		||||
        // TODO: lock children according to depth? lock type?
 | 
			
		||||
        final String additionalInfo = lockInfo.toJSON();
 | 
			
		||||
        lockService.lock(nodeRef, LockType.WRITE_LOCK, timeout, Lifetime.EPHEMERAL, additionalInfo);
 | 
			
		||||
 | 
			
		||||
        if (logger.isDebugEnabled())
 | 
			
		||||
        {
 | 
			
		||||
            logger.debug(nodeRef + " was locked for " + timeout + " seconds.");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void performLockSessionBehavior(NodeRef nodeRef) {
 | 
			
		||||
        HttpSession session = currentSession.get();
 | 
			
		||||
 | 
			
		||||
        if (session == null)
 | 
			
		||||
        {
 | 
			
		||||
            if (logger.isDebugEnabled())
 | 
			
		||||
            {
 | 
			
		||||
                logger.debug("Couldn't find current session.");
 | 
			
		||||
            }
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        storeObjectInSessionList(session, LOCKED_RESOURCES, new Pair<String, NodeRef>(AuthenticationUtil.getRunAsUser(), nodeRef));
 | 
			
		||||
 | 
			
		||||
        if (logger.isDebugEnabled())
 | 
			
		||||
        {
 | 
			
		||||
            logger.debug(nodeRef + " was added to the session " + session.getId() + " for post expiration processing.");
 | 
			
		||||
        }
 | 
			
		||||
        LockInfo lockInfo = createLock(nodeRef, userName, true, timeout);
 | 
			
		||||
        lock(nodeRef, lockInfo);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
@@ -461,15 +444,19 @@ public class WebDAVLockServiceImpl implements WebDAVLockService
 | 
			
		||||
     * @param nodeRef NodeRef
 | 
			
		||||
     * @param userName String
 | 
			
		||||
     * @param createExclusive boolean
 | 
			
		||||
     * @param timeoutSecs int
 | 
			
		||||
     */
 | 
			
		||||
    private LockInfo createLock(NodeRef nodeRef, String userName, boolean createExclusive)
 | 
			
		||||
    private LockInfo createLock(NodeRef nodeRef, String userName, boolean createExclusive, int timeoutSecs)
 | 
			
		||||
    {
 | 
			
		||||
        // Create Lock token
 | 
			
		||||
        String lockToken = WebDAV.makeLockToken(nodeRef, userName);
 | 
			
		||||
 | 
			
		||||
        LockInfo lockInfo = new LockInfoImpl();
 | 
			
		||||
        
 | 
			
		||||
        if (createExclusive)
 | 
			
		||||
        {
 | 
			
		||||
            // Lock the node
 | 
			
		||||
            lockInfo.setTimeoutSeconds(timeoutSecs);
 | 
			
		||||
            lockInfo.setExclusiveLockToken(lockToken);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
@@ -477,11 +464,15 @@ public class WebDAVLockServiceImpl implements WebDAVLockService
 | 
			
		||||
            lockInfo.addSharedLockToken(lockToken);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Store lock depth
 | 
			
		||||
        lockInfo.setDepth(WebDAV.getDepthName(WebDAV.DEPTH_INFINITY));
 | 
			
		||||
        // Store lock scope (shared/exclusive)
 | 
			
		||||
        String scope = createExclusive ? WebDAV.XML_EXCLUSIVE : WebDAV.XML_SHARED;
 | 
			
		||||
        lockInfo.setScope(scope);
 | 
			
		||||
        // Store the owner of this lock
 | 
			
		||||
        lockInfo.setOwner(userName);
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
        // TODO: to help with debugging/refactoring (remove later)
 | 
			
		||||
        String currentUser = AuthenticationUtil.getFullyAuthenticatedUser();
 | 
			
		||||
        if (!currentUser.equals(userName))
 | 
			
		||||
        {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,60 +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.Rule;
 | 
			
		||||
import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo;
 | 
			
		||||
import org.alfresco.rest.framework.resource.parameters.Paging;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Folder node rules API.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
@Experimental
 | 
			
		||||
public interface Rules
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Get rules for node's and rule set's IDs
 | 
			
		||||
     *
 | 
			
		||||
     * @param folderNodeId - folder node ID
 | 
			
		||||
     * @param ruleSetId - rule set ID
 | 
			
		||||
     * @param paging - {@link Paging} information
 | 
			
		||||
     * @return {@link CollectionWithPagingInfo} containing a list page of folder rules
 | 
			
		||||
     */
 | 
			
		||||
    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
 | 
			
		||||
     *
 | 
			
		||||
     * @param folderNodeId - folder node ID
 | 
			
		||||
     * @param ruleSetId - rule set ID
 | 
			
		||||
     * @param ruleId - rule ID
 | 
			
		||||
     * @return {@link Rule} definition
 | 
			
		||||
     */
 | 
			
		||||
    Rule getRuleById(String folderNodeId, String ruleSetId, String ruleId);
 | 
			
		||||
}
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2022 Alfresco Software Limited
 | 
			
		||||
 * Copyright (C) 2005 - 2017 Alfresco Software Limited
 | 
			
		||||
 * %%
 | 
			
		||||
 * This file is part of the Alfresco software.
 | 
			
		||||
 * If the software was purchased under a paid Alfresco license, the terms of
 | 
			
		||||
@@ -26,7 +26,6 @@
 | 
			
		||||
package org.alfresco.rest.api.impl;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.error.AlfrescoRuntimeException;
 | 
			
		||||
import org.alfresco.repo.action.access.ActionAccessRestriction;
 | 
			
		||||
import org.alfresco.rest.api.Actions;
 | 
			
		||||
import org.alfresco.rest.api.model.Action;
 | 
			
		||||
import org.alfresco.rest.api.model.ActionDefinition;
 | 
			
		||||
@@ -287,7 +286,6 @@ public class ActionsImpl implements Actions
 | 
			
		||||
            cmrAction = actionService.createAction(action.getActionDefinitionId());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ActionAccessRestriction.setActionContext(cmrAction, ActionAccessRestriction.V1_ACTION_CONTEXT);
 | 
			
		||||
        actionService.executeAction(cmrAction, actionedUponNodeRef, true, true);
 | 
			
		||||
 | 
			
		||||
        // Create user result.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,177 +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;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.model.ContentModel;
 | 
			
		||||
import org.alfresco.repo.rule.RuleModel;
 | 
			
		||||
import org.alfresco.rest.api.Nodes;
 | 
			
		||||
import org.alfresco.rest.api.Rules;
 | 
			
		||||
import org.alfresco.rest.api.model.rules.Rule;
 | 
			
		||||
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.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.rule.RuleService;
 | 
			
		||||
import org.alfresco.service.cmr.security.AccessStatus;
 | 
			
		||||
import org.alfresco.service.cmr.security.PermissionService;
 | 
			
		||||
import org.alfresco.service.namespace.QName;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
@Experimental
 | 
			
		||||
public class RulesImpl implements Rules
 | 
			
		||||
{
 | 
			
		||||
    private static final String RULE_SET_EXPECTED_TYPE_NAME = "rule set";
 | 
			
		||||
 | 
			
		||||
    private Nodes nodes;
 | 
			
		||||
 | 
			
		||||
    private PermissionService permissionService;
 | 
			
		||||
 | 
			
		||||
    private RuleService ruleService;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public CollectionWithPagingInfo<Rule> getRules(final String folderNodeId, final String ruleSetId, final Paging paging)
 | 
			
		||||
    {
 | 
			
		||||
        final NodeRef folderNodeRef = validateFolderNode(folderNodeId);
 | 
			
		||||
        validateRuleSetNode(ruleSetId, folderNodeRef);
 | 
			
		||||
 | 
			
		||||
        final List<Rule> rules = ruleService.getRules(folderNodeRef).stream()
 | 
			
		||||
            .map(Rule::from)
 | 
			
		||||
            .collect(Collectors.toList());
 | 
			
		||||
 | 
			
		||||
        return ListPage.of(rules, paging);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Rule getRuleById(final String folderNodeId, final String ruleSetId, final String ruleId)
 | 
			
		||||
    {
 | 
			
		||||
        final NodeRef folderNodeRef = validateFolderNode(folderNodeId);
 | 
			
		||||
        final NodeRef ruleSetNodeRef = validateRuleSetNode(ruleSetId, folderNodeRef);
 | 
			
		||||
        final NodeRef ruleNodeRef = validateRuleNode(ruleId, ruleSetNodeRef);
 | 
			
		||||
 | 
			
		||||
        return Rule.from(ruleService.getRule(ruleNodeRef));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setNodes(Nodes nodes)
 | 
			
		||||
    {
 | 
			
		||||
        this.nodes = nodes;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setPermissionService(PermissionService permissionService)
 | 
			
		||||
    {
 | 
			
		||||
        this.permissionService = permissionService;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setRuleService(RuleService ruleService)
 | 
			
		||||
    {
 | 
			
		||||
        this.ruleService = ruleService;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Validates if folder node exists and user have permission to read from it.
 | 
			
		||||
     *
 | 
			
		||||
     * @param folderNodeId - folder node ID
 | 
			
		||||
     * @return folder node reference
 | 
			
		||||
     * @throws InvalidArgumentException if node is not of an expected type
 | 
			
		||||
     * @throws PermissionDeniedException if user doesn't have right to read from folder
 | 
			
		||||
     */
 | 
			
		||||
    private NodeRef validateFolderNode(final String folderNodeId)
 | 
			
		||||
    {
 | 
			
		||||
        final NodeRef nodeRef = nodes.validateOrLookupNode(folderNodeId, null);
 | 
			
		||||
        if (permissionService.hasReadPermission(nodeRef) != AccessStatus.ALLOWED) {
 | 
			
		||||
            throw new PermissionDeniedException("Cannot read from this node!");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        verifyNodeType(nodeRef, ContentModel.TYPE_FOLDER, null);
 | 
			
		||||
 | 
			
		||||
        return nodeRef;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Validates if rule set ID is default, node exists and associated folder node matches.
 | 
			
		||||
     *
 | 
			
		||||
     * @param ruleSetId - rule set node ID
 | 
			
		||||
     * @param associatedFolderNodeRef - folder node ref to check the association
 | 
			
		||||
     * @return rule set node reference
 | 
			
		||||
     * @throws InvalidArgumentException in case of not matching associated folder node
 | 
			
		||||
     */
 | 
			
		||||
    private NodeRef validateRuleSetNode(final String ruleSetId, final NodeRef associatedFolderNodeRef)
 | 
			
		||||
    {
 | 
			
		||||
        if (RuleSet.isDefaultId(ruleSetId))
 | 
			
		||||
        {
 | 
			
		||||
            return ruleService.getRuleSetNode(associatedFolderNodeRef);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        final NodeRef ruleSetNodeRef = validateNode(ruleSetId, ContentModel.TYPE_SYSTEM_FOLDER, RULE_SET_EXPECTED_TYPE_NAME);
 | 
			
		||||
        if (!ruleService.isRuleSetAssociatedWithFolder(ruleSetNodeRef, associatedFolderNodeRef)) {
 | 
			
		||||
            throw new InvalidArgumentException("Rule set is not associated with folder node!");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return ruleSetNodeRef;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Validates if rule node exists and associated rule set node matches.
 | 
			
		||||
     *
 | 
			
		||||
     * @param ruleId - rule node ID
 | 
			
		||||
     * @param associatedRuleSetNodeRef - rule set node ref to check the association. Can be null
 | 
			
		||||
     * @return rule node reference
 | 
			
		||||
     * @throws InvalidArgumentException in case of not matching associated rule set node
 | 
			
		||||
     */
 | 
			
		||||
    private NodeRef validateRuleNode(final String ruleId, final NodeRef associatedRuleSetNodeRef)
 | 
			
		||||
    {
 | 
			
		||||
        final NodeRef ruleNodeRef = validateNode(ruleId, RuleModel.TYPE_RULE, null);
 | 
			
		||||
        if (associatedRuleSetNodeRef != null && !ruleService.isRuleAssociatedWithRuleSet(ruleNodeRef, associatedRuleSetNodeRef))
 | 
			
		||||
        {
 | 
			
		||||
            throw new InvalidArgumentException("Rule is not associated with rule set node!");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return ruleNodeRef;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private NodeRef validateNode(final String nodeId, final QName expectedType, final String expectedTypeName)
 | 
			
		||||
    {
 | 
			
		||||
        final NodeRef nodeRef = nodes.validateNode(nodeId);
 | 
			
		||||
        verifyNodeType(nodeRef, expectedType, expectedTypeName);
 | 
			
		||||
 | 
			
		||||
        return nodeRef;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void verifyNodeType(final NodeRef nodeRef, final QName expectedType, final String expectedTypeName) {
 | 
			
		||||
        final Set<QName> expectedTypes = Set.of(expectedType);
 | 
			
		||||
        if (!nodes.nodeMatches(nodeRef, expectedTypes, null)) {
 | 
			
		||||
            final String expectedTypeLocalName = (expectedTypeName != null)? expectedTypeName : expectedType.getLocalName();
 | 
			
		||||
            throw new InvalidArgumentException(String.format("NodeId of a %s is expected!", expectedTypeLocalName));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,81 +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 org.alfresco.rest.framework.resource.UniqueId;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.service.cmr.action.CompositeAction;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
@Experimental
 | 
			
		||||
public class Rule
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    private String id;
 | 
			
		||||
    private String name;
 | 
			
		||||
 | 
			
		||||
    public static Rule from(final org.alfresco.service.cmr.rule.Rule ruleModel) {
 | 
			
		||||
        if (ruleModel == null) {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        final Rule rule = new Rule();
 | 
			
		||||
        rule.id = ruleModel.getNodeRef().getId();
 | 
			
		||||
        rule.name = ruleModel.getTitle();
 | 
			
		||||
 | 
			
		||||
        return rule;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @UniqueId
 | 
			
		||||
    public String getId()
 | 
			
		||||
    {
 | 
			
		||||
        return id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setId(String id)
 | 
			
		||||
    {
 | 
			
		||||
        this.id = id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getName()
 | 
			
		||||
    {
 | 
			
		||||
        return name;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setName(String name)
 | 
			
		||||
    {
 | 
			
		||||
        this.name = name;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString()
 | 
			
		||||
    {
 | 
			
		||||
        return "Rule{" + "id='" + id + '\'' + ", name='" + name + '\'' + '}';
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,77 +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 org.alfresco.service.Experimental;
 | 
			
		||||
 | 
			
		||||
@Experimental
 | 
			
		||||
public class RuleSet
 | 
			
		||||
{
 | 
			
		||||
    private static final String DEFAULT_ID = "-default-";
 | 
			
		||||
 | 
			
		||||
    private String id;
 | 
			
		||||
 | 
			
		||||
    public static RuleSet of(String id)
 | 
			
		||||
    {
 | 
			
		||||
        final RuleSet ruleSet = new RuleSet();
 | 
			
		||||
        ruleSet.id = id;
 | 
			
		||||
 | 
			
		||||
        return ruleSet;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isNotDefaultId() {
 | 
			
		||||
        return isNotDefaultId(this.id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isDefaultId() {
 | 
			
		||||
        return isDefaultId(this.id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean isNotDefaultId(final String id) {
 | 
			
		||||
        return !isDefaultId(id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean isDefaultId(final String id) {
 | 
			
		||||
        return DEFAULT_ID.equals(id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getId()
 | 
			
		||||
    {
 | 
			
		||||
        return id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setId(String id)
 | 
			
		||||
    {
 | 
			
		||||
        this.id = id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString()
 | 
			
		||||
    {
 | 
			
		||||
        return "RuleSet{" + "id='" + id + '\'' + '}';
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,40 +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 org.alfresco.rest.framework.resource.RelationshipResource;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Folder node rule sets.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
@Experimental
 | 
			
		||||
@RelationshipResource(name = "rule-sets", entityResource = NodesEntityResource.class, title = "Folder node rule sets")
 | 
			
		||||
public class NodeRuleSetsRelation
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
@@ -1,110 +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 org.alfresco.rest.api.Rules;
 | 
			
		||||
import org.alfresco.rest.api.model.rules.Rule;
 | 
			
		||||
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.CollectionWithPagingInfo;
 | 
			
		||||
import org.alfresco.rest.framework.resource.parameters.Parameters;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.util.PropertyCheck;
 | 
			
		||||
import org.springframework.beans.factory.InitializingBean;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.http.HttpServletResponse;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Folder node's rules.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
@Experimental
 | 
			
		||||
@RelationshipResource(name = "rules", entityResource = NodeRuleSetsRelation.class, title = "Folder node rules")
 | 
			
		||||
public class NodeRulesRelation implements RelationshipResourceAction.Read<Rule>, RelationshipResourceAction.ReadById<Rule>, InitializingBean
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    private Rules rules;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void afterPropertiesSet() throws Exception
 | 
			
		||||
    {
 | 
			
		||||
        PropertyCheck.mandatory(this, "rules", this.rules);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * List folder rules for given folder node's and rule set's IDs as a page.
 | 
			
		||||
     *
 | 
			
		||||
     * - GET /nodes/{folderNodeId}/rule-sets/{ruleSetId}/rules
 | 
			
		||||
     *
 | 
			
		||||
     * @param folderNodeId - entity resource context for this relationship
 | 
			
		||||
     * @param parameters - will never be null. Contains i.a. paging information and ruleSetId (relationshipId)
 | 
			
		||||
     * @return {@link CollectionWithPagingInfo} containing a page of folder rules
 | 
			
		||||
     */
 | 
			
		||||
    @WebApiDescription(
 | 
			
		||||
        title = "Get folder node rules",
 | 
			
		||||
        description = "Returns a paged list of folder rules for given node's and rule set's IDs",
 | 
			
		||||
        successStatus = HttpServletResponse.SC_OK
 | 
			
		||||
    )
 | 
			
		||||
    @Override
 | 
			
		||||
    public CollectionWithPagingInfo<Rule> readAll(String folderNodeId, Parameters parameters)
 | 
			
		||||
    {
 | 
			
		||||
        final String ruleSetId = parameters.getRelationshipId();
 | 
			
		||||
 | 
			
		||||
        return rules.getRules(folderNodeId, ruleSetId, parameters.getPaging());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get single folder rule for given node's, rule set's and rule's IDs.
 | 
			
		||||
     *
 | 
			
		||||
     * - GET /nodes/{folderNodeId}/rule-sets/{ruleSetId}/rules/{ruleId}
 | 
			
		||||
     *
 | 
			
		||||
     * @param folderNodeId - entity resource context for this relationship
 | 
			
		||||
     * @param ruleSetId - rule set node ID (associated with folder node)
 | 
			
		||||
     * @param parameters - will never be null. Contains i.a. ruleId (relationship2Id)
 | 
			
		||||
     * @return {@link Rule} definition
 | 
			
		||||
     * @throws RelationshipResourceNotFoundException in case resource was not found
 | 
			
		||||
     */
 | 
			
		||||
    @WebApiDescription(
 | 
			
		||||
        title="Get folder node rule",
 | 
			
		||||
        description = "Returns a folder single rule definition for given node's, rule set's and rule's IDs",
 | 
			
		||||
        successStatus = HttpServletResponse.SC_OK
 | 
			
		||||
    )
 | 
			
		||||
    @Override
 | 
			
		||||
    public Rule readById(String folderNodeId, String ruleSetId, Parameters parameters) throws RelationshipResourceNotFoundException
 | 
			
		||||
    {
 | 
			
		||||
        final String ruleId = parameters.getRelationship2Id();
 | 
			
		||||
 | 
			
		||||
        return rules.getRuleById(folderNodeId, ruleSetId, ruleId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setRules(Rules rules)
 | 
			
		||||
    {
 | 
			
		||||
        this.rules = rules;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,123 +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.framework.resource.parameters;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.rest.api.search.context.SearchContext;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
@Experimental
 | 
			
		||||
public class ArrayListPage<E> extends ArrayList<E> implements ListPage<E>
 | 
			
		||||
{
 | 
			
		||||
    private final Paging paging;
 | 
			
		||||
    private final int totalItems;
 | 
			
		||||
    private final boolean hasMore;
 | 
			
		||||
 | 
			
		||||
    public ArrayListPage(final List<? extends E> list)
 | 
			
		||||
    {
 | 
			
		||||
        super(list != null ? list : Collections.emptyList());
 | 
			
		||||
        this.paging = null;
 | 
			
		||||
        this.totalItems = this.size();
 | 
			
		||||
        this.hasMore = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public ArrayListPage(final List<? extends E> list, final Paging paging)
 | 
			
		||||
    {
 | 
			
		||||
        super(sublistFrom(list, paging));
 | 
			
		||||
        this.paging = paging;
 | 
			
		||||
        if (list != null)
 | 
			
		||||
        {
 | 
			
		||||
            this.totalItems = list.size();
 | 
			
		||||
            if (paging != null)
 | 
			
		||||
            {
 | 
			
		||||
                final int start = paging.getSkipCount();
 | 
			
		||||
                final int end = (paging.getMaxItems() == 0) ? list.size() : Math.min(list.size(), start + paging.getMaxItems());
 | 
			
		||||
                this.hasMore = !(list.size() == end);
 | 
			
		||||
            } else {
 | 
			
		||||
                this.hasMore = false;
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            this.totalItems = 0;
 | 
			
		||||
            this.hasMore = false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Paging getPaging()
 | 
			
		||||
    {
 | 
			
		||||
        return paging;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Integer getTotalItems()
 | 
			
		||||
    {
 | 
			
		||||
        return totalItems;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean hasMoreItems()
 | 
			
		||||
    {
 | 
			
		||||
        return hasMore;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getQueryExecutionId()
 | 
			
		||||
    {
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Object getSourceEntity()
 | 
			
		||||
    {
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public SearchContext getContext()
 | 
			
		||||
    {
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static <E> List<? extends E> sublistFrom(final List<? extends E> list, final Paging paging)
 | 
			
		||||
    {
 | 
			
		||||
        if (list == null)
 | 
			
		||||
        {
 | 
			
		||||
            return Collections.emptyList();
 | 
			
		||||
        }
 | 
			
		||||
        if (paging == null)
 | 
			
		||||
        {
 | 
			
		||||
            return list;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        final int start = paging.getSkipCount();
 | 
			
		||||
        final int end = (paging.getMaxItems() == 0)? list.size() : Math.min(list.size(), start + paging.getMaxItems());
 | 
			
		||||
        return list.subList(Math.min(start, end), end);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * 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 
 | 
			
		||||
@@ -43,7 +43,7 @@ import java.util.Collections;
 | 
			
		||||
 * 
 | 
			
		||||
 * @author Gethin James.
 | 
			
		||||
 */
 | 
			
		||||
public class CollectionWithPagingInfo<T> implements SerializablePagedCollection<T>
 | 
			
		||||
public class CollectionWithPagingInfo<T> implements SerializablePagedCollection
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    private final Collection<T> collection;
 | 
			
		||||
@@ -80,18 +80,6 @@ public class CollectionWithPagingInfo<T> implements SerializablePagedCollection<
 | 
			
		||||
        this.context = context;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a new CollectionWithPagingInfo from a {@link SerializablePagedCollection} instance.
 | 
			
		||||
     *
 | 
			
		||||
     * @param pagedCollection - a collection with paging information
 | 
			
		||||
     * @return CollectionWithPagingInfo
 | 
			
		||||
     */
 | 
			
		||||
    public static <T> CollectionWithPagingInfo<T> from(SerializablePagedCollection<T> pagedCollection)
 | 
			
		||||
    {
 | 
			
		||||
        return new CollectionWithPagingInfo<>(pagedCollection.getCollection(), pagedCollection.getPaging(), pagedCollection.hasMoreItems(), pagedCollection.getTotalItems(),
 | 
			
		||||
            pagedCollection.getSourceEntity(), pagedCollection.getContext());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a new CollectionWithPagingInfo.
 | 
			
		||||
     * It automatically sets the total items based on the collection size and
 | 
			
		||||
 
 | 
			
		||||
@@ -1,80 +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.framework.resource.parameters;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.query.PagingResults;
 | 
			
		||||
import org.alfresco.rest.framework.resource.SerializablePagedCollection;
 | 
			
		||||
import org.alfresco.service.Experimental;
 | 
			
		||||
import org.alfresco.util.Pair;
 | 
			
		||||
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * List page with paging information.
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * @param <E> - list element type
 | 
			
		||||
 */
 | 
			
		||||
@Experimental
 | 
			
		||||
public interface ListPage<E> extends List<E>, PagingResults<E>, SerializablePagedCollection<E>
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    default List<E> getPage()
 | 
			
		||||
    {
 | 
			
		||||
        return this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    default Pair<Integer, Integer> getTotalResultCount()
 | 
			
		||||
    {
 | 
			
		||||
        return new Pair<>(this.getTotalItems(), this.getTotalItems());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    default Collection<E> getCollection()
 | 
			
		||||
    {
 | 
			
		||||
        return this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Builds a collection with paging information.
 | 
			
		||||
     *
 | 
			
		||||
     * @param list - the list that needs to be paged
 | 
			
		||||
     * @param paging - paging request info
 | 
			
		||||
     * @return list page in {@link CollectionWithPagingInfo}
 | 
			
		||||
     * @param <E> - list element type
 | 
			
		||||
     */
 | 
			
		||||
    static <E> CollectionWithPagingInfo<E> of(final List<? extends E> list, final Paging paging)
 | 
			
		||||
    {
 | 
			
		||||
        if (list == null)
 | 
			
		||||
        {
 | 
			
		||||
            return CollectionWithPagingInfo.asPaged(paging, Collections.emptyList());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return CollectionWithPagingInfo.from(new ArrayListPage<>(list, paging));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -511,9 +511,7 @@ public class ProcessesImpl extends WorkflowRestImpl implements Processes
 | 
			
		||||
        {
 | 
			
		||||
            throw new InvalidArgumentException("processId is required to get the process info");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        validateIfUserAllowedToWorkWithProcess(processId);
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
        HistoricProcessInstance processInstance = activitiProcessEngine
 | 
			
		||||
                .getHistoryService()
 | 
			
		||||
                .createHistoricProcessInstanceQuery()
 | 
			
		||||
 
 | 
			
		||||
@@ -850,26 +850,6 @@
 | 
			
		||||
        </property>
 | 
			
		||||
    </bean>
 | 
			
		||||
 | 
			
		||||
    <bean id="rules" class="org.alfresco.rest.api.impl.RulesImpl">
 | 
			
		||||
        <property name="nodes" ref="Nodes" />
 | 
			
		||||
        <property name="permissionService" ref="PermissionService"/>
 | 
			
		||||
        <property name="ruleService" ref="RuleService" />
 | 
			
		||||
    </bean>
 | 
			
		||||
 | 
			
		||||
    <bean id="Rules" class="org.springframework.aop.framework.ProxyFactoryBean">
 | 
			
		||||
        <property name="proxyInterfaces" value="org.alfresco.rest.api.Rules"/>
 | 
			
		||||
        <property name="target" ref="rules"/>
 | 
			
		||||
        <property name="interceptorNames">
 | 
			
		||||
            <list>
 | 
			
		||||
                <idref bean="legacyExceptionInterceptor" />
 | 
			
		||||
            </list>
 | 
			
		||||
        </property>
 | 
			
		||||
    </bean>
 | 
			
		||||
 | 
			
		||||
    <bean class="org.alfresco.rest.api.nodes.NodeRulesRelation">
 | 
			
		||||
        <property name="rules" ref="Rules" />
 | 
			
		||||
    </bean>
 | 
			
		||||
 | 
			
		||||
    <bean id="publicapi.mimeTypePropertyLookup" class="org.alfresco.rest.api.lookups.MimeTypePropertyLookup">
 | 
			
		||||
        <property name="serviceRegistry" ref="ServiceRegistry"/>
 | 
			
		||||
        <property name="supported">
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@ function main()
 | 
			
		||||
 | 
			
		||||
// Get the args
 | 
			
		||||
var filter = args["filter"];
 | 
			
		||||
if (filter!==null && !filter.includes(":")) {filter += " [hint:useCQ]";}
 | 
			
		||||
var maxResults = args["maxResults"];
 | 
			
		||||
var skipCountStr = args["skipCount"];
 | 
			
		||||
var skipCount = skipCountStr != null ? parseInt(skipCountStr) : -1;
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ function main()
 | 
			
		||||
   // Get the args
 | 
			
		||||
   var siteShortName = url.templateArgs.shortname,
 | 
			
		||||
      site = siteService.getSite(siteShortName),
 | 
			
		||||
      filter = ((args.filter != null) ? args.filter : (args.shortNameFilter != null) ? args.shortNameFilter : "" )+ " [hint:useCQ]",
 | 
			
		||||
      filter = (args.filter != null) ? args.filter : (args.shortNameFilter != null) ? args.shortNameFilter : "",
 | 
			
		||||
      maxResults = (args.maxResults == null) ? 10 : parseInt(args.maxResults, 10),
 | 
			
		||||
      authorityType = args.authorityType,
 | 
			
		||||
      zone = args.zone,
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user