mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-31 17:39:05 +00:00
Merge master into feature/RM-4293_RM_special_containers_can_be_deleted
This commit is contained in:
@@ -23,7 +23,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
* POJO for file plan component
|
||||
*
|
||||
* @author Tuna Aksoy
|
||||
* @since 1.0
|
||||
* @since 2.6
|
||||
*/
|
||||
public class FilePlanComponent
|
||||
{
|
||||
|
@@ -17,7 +17,7 @@ import static org.alfresco.rest.rm.util.ParameterCheck.mandatoryString;
|
||||
* File plan component alias enumeration
|
||||
*
|
||||
* @author Tuna Aksoy
|
||||
* @since 1.0
|
||||
* @since 2.6
|
||||
*/
|
||||
public enum FilePlanComponentAlias
|
||||
{
|
||||
|
@@ -21,7 +21,7 @@ import org.alfresco.rest.core.RestModels;
|
||||
* POJO for file plan component entry
|
||||
*
|
||||
* @author Tuna Aksoy
|
||||
* @since 1.0
|
||||
* @since 2.6
|
||||
*/
|
||||
public class FilePlanComponentEntry extends RestModels<FilePlanComponent, FilePlanComponentEntry>
|
||||
{
|
||||
|
@@ -15,7 +15,7 @@ package org.alfresco.rest.rm.model.fileplancomponents;
|
||||
* File plan component field names constants
|
||||
*
|
||||
* @author Tuna Aksoy
|
||||
* @since 1.0
|
||||
* @since 2.6
|
||||
*/
|
||||
public class FilePlanComponentFields
|
||||
{
|
||||
|
@@ -15,7 +15,7 @@ package org.alfresco.rest.rm.model.fileplancomponents;
|
||||
* POJO for id/name pair
|
||||
*
|
||||
* @author Kristijan Conkas
|
||||
* @since 1.0
|
||||
* @since 2.6
|
||||
*/
|
||||
public class FilePlanComponentIdNamePair
|
||||
{
|
||||
|
@@ -19,7 +19,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
* POJO for FilePlanComponent path parameter
|
||||
* <br>
|
||||
* @author Kristijan Conkas
|
||||
* @since 1.0
|
||||
* @since 2.6
|
||||
*/
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
public class FilePlanComponentPath
|
||||
|
@@ -28,7 +28,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
* POJO for file plan component properties
|
||||
*
|
||||
* @author Kristijan Conkas
|
||||
* @since 1.0
|
||||
* @since 2.6
|
||||
*/
|
||||
//FIXME: Once the fields have been added the JsonIgnoreProperties annotation should be removed
|
||||
@JsonIgnoreProperties (ignoreUnknown = true)
|
||||
|
@@ -17,7 +17,7 @@ import static org.alfresco.rest.rm.util.ParameterCheck.mandatoryString;
|
||||
* File plan component type enumeration
|
||||
*
|
||||
* @author Tuna Aksoy
|
||||
* @since 1.0
|
||||
* @since 2.6
|
||||
*/
|
||||
public enum FilePlanComponentType
|
||||
{
|
||||
|
@@ -15,7 +15,7 @@ package org.alfresco.rest.rm.model.fileplancomponents;
|
||||
* POJO for file plan component created by object
|
||||
*
|
||||
* @author Kristijan Conkas
|
||||
* @since 1.0
|
||||
* @since 2.6
|
||||
*/
|
||||
public class FilePlanComponentUserInfo
|
||||
{
|
||||
|
@@ -17,7 +17,7 @@ import org.alfresco.rest.core.RestModels;
|
||||
* Handle collection of FilePlanComponents
|
||||
*
|
||||
* @author Kristijan Conkas
|
||||
* @since 1.0
|
||||
* @since 2.6
|
||||
*/
|
||||
public class FilePlanComponentsCollection extends RestModels<FilePlanComponentEntry, FilePlanComponentsCollection>
|
||||
{
|
||||
|
@@ -4,7 +4,7 @@ package org.alfresco.rest.rm.model.fileplancomponents;
|
||||
* POJO for the review period
|
||||
*
|
||||
* @author Rodica Sutu
|
||||
* @since 1.0
|
||||
* @since 2.6
|
||||
*/
|
||||
public class ReviewPeriod
|
||||
{
|
||||
|
@@ -19,7 +19,7 @@ import org.alfresco.rest.model.RestSiteModel;
|
||||
* POJO for RM Site component
|
||||
*
|
||||
* @author Rodica Sutu
|
||||
* @since 1.0
|
||||
* @since 2.6
|
||||
*/
|
||||
public class RMSite extends RestSiteModel
|
||||
{
|
||||
|
@@ -15,7 +15,7 @@ package org.alfresco.rest.rm.model.site;
|
||||
* RM Site compliance
|
||||
*
|
||||
* @author Tuna Aksoy
|
||||
* @since 1.0
|
||||
* @since 2.6
|
||||
*/
|
||||
public enum RMSiteCompliance
|
||||
{
|
||||
|
@@ -24,7 +24,7 @@ package org.alfresco.rest.rm.model.site;
|
||||
*}
|
||||
* @author Tuna Aksoy
|
||||
* @author Rodica Sutu
|
||||
* @since 1.0
|
||||
* @since 2.6
|
||||
*/
|
||||
public class RMSiteFields
|
||||
{
|
||||
|
@@ -33,7 +33,7 @@ import org.springframework.stereotype.Component;
|
||||
*
|
||||
* @author Tuna Aksoy
|
||||
* @author Kristijan Conkas
|
||||
* @since 1.0
|
||||
* @since 2.6
|
||||
*/
|
||||
@Component
|
||||
@Scope(value = "prototype")
|
||||
|
@@ -31,7 +31,7 @@ import org.springframework.stereotype.Component;
|
||||
*
|
||||
* @author Tuna Aksoy
|
||||
* @author Rodica Sutu
|
||||
* @since 1.0
|
||||
* @since 2.6
|
||||
*/
|
||||
@Component
|
||||
@Scope (value = "prototype")
|
||||
|
@@ -17,7 +17,7 @@ import static org.apache.commons.lang3.StringUtils.isBlank;
|
||||
* Utility class for checking parameters
|
||||
*
|
||||
* @author Tuna Aksoy
|
||||
* @since 1.0
|
||||
* @since 2.6
|
||||
*/
|
||||
public class ParameterCheck
|
||||
{
|
||||
|
@@ -15,7 +15,7 @@ package org.alfresco.rest.rm.base;
|
||||
* List of allowable operations
|
||||
*
|
||||
* @author Tuna Aksoy
|
||||
* @since 1.0
|
||||
* @since 2.6
|
||||
*/
|
||||
public class AllowableOperations
|
||||
{
|
||||
|
@@ -50,7 +50,7 @@ import org.testng.annotations.BeforeClass;
|
||||
*
|
||||
* @author Kristijan Conkas
|
||||
* @author Tuna Aksoy
|
||||
* @since 1.0
|
||||
* @since 2.6
|
||||
*/
|
||||
@Configuration
|
||||
@PropertySource("classpath:default.properties")
|
||||
|
@@ -27,7 +27,7 @@ import org.testng.annotations.DataProvider;
|
||||
* Test data used in tests
|
||||
*
|
||||
* @author Rodica Sutu
|
||||
* @since 1.0
|
||||
* @since 2.6
|
||||
*/
|
||||
public interface TestData
|
||||
{
|
||||
|
@@ -52,7 +52,7 @@ import org.testng.annotations.Test;
|
||||
* the File Plan CRUD API
|
||||
*
|
||||
* @author Rodica Sutu
|
||||
* @since 1.0
|
||||
* @since 2.6
|
||||
*/
|
||||
public class FilePlanTests extends BaseRestTest
|
||||
{
|
||||
|
@@ -51,7 +51,7 @@ import org.testng.annotations.Test;
|
||||
*
|
||||
* @author Kristijan Conkas
|
||||
* @author Tuna Aksoy
|
||||
* @since 1.0
|
||||
* @since 2.6
|
||||
*/
|
||||
public class RecordCategoryTest extends BaseRestTest
|
||||
{
|
||||
|
@@ -61,7 +61,7 @@ import org.testng.annotations.Test;
|
||||
* the Record Folder CRUD API
|
||||
*
|
||||
* @author Rodica Sutu
|
||||
* @since 1.0
|
||||
* @since 2.6
|
||||
*/
|
||||
public class RecordFolderTests extends BaseRestTest
|
||||
{
|
||||
|
@@ -51,7 +51,7 @@ import org.testng.annotations.Test;
|
||||
* the RM site CRUD API
|
||||
*
|
||||
* @author Rodica Sutu
|
||||
* @since 1.0
|
||||
* @since 2.6
|
||||
*/
|
||||
public class RMSiteTests extends BaseRestTest
|
||||
{
|
||||
|
@@ -27,6 +27,7 @@
|
||||
<property name="quickShareLinks" ref="rm.QuickShareLinks"/>
|
||||
<property name="filePlanService" ref="FilePlanService"/>
|
||||
<property name="recordsManagementServiceRegistry" ref="RecordsManagementServiceRegistry"/>
|
||||
<property name="capabilityService" ref="CapabilityService"/>
|
||||
</bean>
|
||||
|
||||
<bean id="rm.Nodes" class="org.springframework.aop.framework.ProxyFactoryBean">
|
||||
|
@@ -518,8 +518,6 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
|
||||
* @param dispositionAction disposition action
|
||||
*/
|
||||
private void updateDispositionActionProperties(NodeRef record, NodeRef dispositionAction)
|
||||
{
|
||||
if (!methodCached("updateDispositionActionProperties", record))
|
||||
{
|
||||
Map<QName, Serializable> props = nodeService.getProperties(record);
|
||||
|
||||
@@ -561,7 +559,6 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
|
||||
props.get(PROP_RS_DISPOSITION_PERIOD_EXPRESSION));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* On update of event execution information behaviour\
|
||||
|
@@ -37,6 +37,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.alfresco.model.ContentModel;
|
||||
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementServiceRegistry;
|
||||
import org.alfresco.module.org_alfresco_module_rm.capability.CapabilityService;
|
||||
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedule;
|
||||
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
|
||||
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
|
||||
@@ -62,6 +63,8 @@ import org.alfresco.service.namespace.QName;
|
||||
import org.alfresco.util.Pair;
|
||||
import org.alfresco.util.ParameterCheck;
|
||||
|
||||
import net.sf.acegisecurity.vote.AccessDecisionVoter;
|
||||
|
||||
/**
|
||||
* Centralizes access to the repository.
|
||||
*
|
||||
@@ -82,6 +85,7 @@ public class RMNodesImpl extends NodesImpl implements RMNodes
|
||||
private Repository repositoryHelper;
|
||||
private DictionaryService dictionaryService;
|
||||
private DispositionService dispositionService;
|
||||
private CapabilityService capabilityService;
|
||||
|
||||
/**
|
||||
* TODO to remove this after isSpecialNode is made protected in core implementation(REPO-1459)
|
||||
@@ -111,6 +115,11 @@ public class RMNodesImpl extends NodesImpl implements RMNodes
|
||||
this.filePlanService = filePlanService;
|
||||
}
|
||||
|
||||
public void setCapabilityService(CapabilityService capabilityService)
|
||||
{
|
||||
this.capabilityService = capabilityService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Node getFolderOrDocument(final NodeRef nodeRef, NodeRef parentNodeRef, QName nodeTypeQName, List<String> includeParam, Map<String, UserInfo> mapUserInfo)
|
||||
{
|
||||
@@ -121,26 +130,6 @@ public class RMNodesImpl extends NodesImpl implements RMNodes
|
||||
nodeTypeQName = nodeService.getType(nodeRef);
|
||||
}
|
||||
|
||||
//TODO to remove this part of code after isSpecialNode will be made protected on core, will not need this anymore since the right allowed operations will be returned from core(REPO-1459).
|
||||
if (includeParam.contains(PARAM_INCLUDE_ALLOWABLEOPERATIONS) && originalNode.getAllowableOperations() != null)
|
||||
{
|
||||
List<String> allowableOperations = originalNode.getAllowableOperations();
|
||||
List<String> modifiedAllowableOperations = new ArrayList<>();
|
||||
modifiedAllowableOperations.addAll(allowableOperations);
|
||||
|
||||
for (String op : allowableOperations)
|
||||
{
|
||||
if (op.equals(OP_DELETE) && (isSpecialNode(nodeRef, nodeTypeQName)))
|
||||
{
|
||||
// special case: do not return "delete" (as an allowable op) for specific system nodes
|
||||
modifiedAllowableOperations.remove(op);
|
||||
}
|
||||
}
|
||||
|
||||
originalNode.setAllowableOperations((modifiedAllowableOperations.size() > 0 )? modifiedAllowableOperations : null);
|
||||
}
|
||||
|
||||
|
||||
RMNodeType type = getType(nodeTypeQName, nodeRef);
|
||||
FileplanComponentNode node = null;
|
||||
if (mapUserInfo == null)
|
||||
@@ -191,9 +180,55 @@ public class RMNodesImpl extends NodesImpl implements RMNodes
|
||||
}
|
||||
}
|
||||
|
||||
if (includeParam.contains(PARAM_INCLUDE_ALLOWABLEOPERATIONS))
|
||||
{
|
||||
node.setAllowableOperations(getAllowableOperations(nodeRef, type));
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper method that generates allowable operation for the provided node
|
||||
* @param nodeRef the node to get the allowable operations for
|
||||
* @param type the type of the provided nodeRef
|
||||
* @return a sublist of [{@link Nodes.OP_DELETE}, {@link Nodes.OP_CREATE}, {@link Nodes.OP_UPDATE}] representing the allowable operations for the provided node
|
||||
*/
|
||||
private List<String> getAllowableOperations(NodeRef nodeRef, RMNodeType type)
|
||||
{
|
||||
List<String> allowableOperations = new ArrayList<>();
|
||||
|
||||
NodeRef filePlan = filePlanService.getFilePlanBySiteId(FilePlanService.DEFAULT_RM_SITE_ID);
|
||||
boolean isFilePlan = nodeRef.equals(filePlan);
|
||||
boolean isTransferContainer = nodeRef.equals(filePlanService.getTransferContainer(filePlan));
|
||||
boolean isUnfiledContainer = nodeRef.equals(filePlanService.getUnfiledContainer(filePlan));
|
||||
boolean isHoldsContainer = nodeRef.equals(filePlanService.getHoldContainer(filePlan)) ;
|
||||
boolean isSpecialContainer = isFilePlan || isTransferContainer || isUnfiledContainer || isHoldsContainer;
|
||||
|
||||
// DELETE
|
||||
if(!isSpecialContainer &&
|
||||
capabilityService.getCapability("Delete").evaluate(nodeRef) == AccessDecisionVoter.ACCESS_GRANTED)
|
||||
{
|
||||
allowableOperations.add(OP_DELETE);
|
||||
}
|
||||
|
||||
// CREATE
|
||||
if(type != RMNodeType.FILE &&
|
||||
!isTransferContainer &&
|
||||
capabilityService.getCapability("FillingPermissionOnly").evaluate(nodeRef) == AccessDecisionVoter.ACCESS_GRANTED)
|
||||
{
|
||||
allowableOperations.add(OP_CREATE);
|
||||
}
|
||||
|
||||
// UPDATE
|
||||
if (capabilityService.getCapability("Update").evaluate(nodeRef) == AccessDecisionVoter.ACCESS_GRANTED)
|
||||
{
|
||||
allowableOperations.add(OP_UPDATE);
|
||||
}
|
||||
|
||||
return allowableOperations;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeRef validateNode(String nodeId)
|
||||
{
|
||||
|
@@ -66,6 +66,10 @@ public class MultipleSchedulesTest extends BaseRMTestCase
|
||||
protected static final String CATEGORY_B_NAME = TEST_PREFIX + "CategoryB";
|
||||
/** The name to use for the folder within the second category. */
|
||||
protected static final String FOLDER_B_NAME = TEST_PREFIX + "FolderB";
|
||||
/** The name to use for the third category. */
|
||||
protected static final String CATEGORY_C_NAME = TEST_PREFIX + "CategoryC";
|
||||
/** The name to use for the folder within the third category. */
|
||||
protected static final String FOLDER_C_NAME = TEST_PREFIX + "FolderC";
|
||||
/** The name to use for the record. */
|
||||
protected static final String RECORD_NAME = TEST_PREFIX + "Record";
|
||||
|
||||
@@ -80,6 +84,10 @@ public class MultipleSchedulesTest extends BaseRMTestCase
|
||||
private NodeRef categoryB;
|
||||
/** The folder node within the second category. */
|
||||
private NodeRef folderB;
|
||||
/** The third category node. */
|
||||
private NodeRef categoryC;
|
||||
/** The folder node within the third category. */
|
||||
private NodeRef folderC;
|
||||
/** The record node. */
|
||||
private NodeRef record;
|
||||
|
||||
@@ -114,6 +122,7 @@ public class MultipleSchedulesTest extends BaseRMTestCase
|
||||
// Create two categories.
|
||||
categoryA = filePlanService.createRecordCategory(filePlan, CATEGORY_A_NAME);
|
||||
categoryB = filePlanService.createRecordCategory(filePlan, CATEGORY_B_NAME);
|
||||
categoryC = filePlanService.createRecordCategory(filePlan, CATEGORY_C_NAME);
|
||||
// Create a disposition schedule for category A (Cut off immediately, then Destroy immediately).
|
||||
DispositionSchedule dispSchedA = utils.createBasicDispositionSchedule(categoryA, "instructions", "authority", true, false);
|
||||
Map<QName, Serializable> cutOffParamsA = ImmutableMap.of(PROP_DISPOSITION_ACTION_NAME, CutOffAction.NAME,
|
||||
@@ -135,9 +144,21 @@ public class MultipleSchedulesTest extends BaseRMTestCase
|
||||
PROP_DISPOSITION_PERIOD, CommonRMTestUtils.PERIOD_ONE_WEEK,
|
||||
PROP_DISPOSITION_PERIOD_PROPERTY, PROP_CUT_OFF_DATE);
|
||||
dispositionService.addDispositionActionDefinition(dispSchedB, destroyParamsB);
|
||||
// Create a disposition schedule for category C (Cut off immediately, then Destroy one year after cutoff).
|
||||
DispositionSchedule dispSchedC = utils.createBasicDispositionSchedule(categoryC, "instructions", "authority", true, false);
|
||||
Map<QName, Serializable> cutOffParamsC = ImmutableMap.of(PROP_DISPOSITION_ACTION_NAME, CutOffAction.NAME,
|
||||
PROP_DISPOSITION_DESCRIPTION, "description",
|
||||
PROP_DISPOSITION_PERIOD, CommonRMTestUtils.PERIOD_IMMEDIATELY);
|
||||
dispositionService.addDispositionActionDefinition(dispSchedC, cutOffParamsC);
|
||||
Map<QName, Serializable> destroyParamsC = ImmutableMap.of(PROP_DISPOSITION_ACTION_NAME, DestroyAction.NAME,
|
||||
PROP_DISPOSITION_DESCRIPTION, "description",
|
||||
PROP_DISPOSITION_PERIOD, CommonRMTestUtils.PERIOD_ONE_YEAR,
|
||||
PROP_DISPOSITION_PERIOD_PROPERTY, PROP_CUT_OFF_DATE);
|
||||
dispositionService.addDispositionActionDefinition(dispSchedC, destroyParamsC);
|
||||
// Create a folder within each category.
|
||||
folderA = recordFolderService.createRecordFolder(categoryA, FOLDER_A_NAME);
|
||||
folderB = recordFolderService.createRecordFolder(categoryB, FOLDER_B_NAME);
|
||||
folderC = recordFolderService.createRecordFolder(categoryC, FOLDER_C_NAME);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -155,6 +176,7 @@ public class MultipleSchedulesTest extends BaseRMTestCase
|
||||
test()
|
||||
.given(() -> {
|
||||
setUpFilePlan();
|
||||
|
||||
// Create a record filed under category A and linked to category B.
|
||||
record = fileFolderService.create(folderA, RECORD_NAME, ContentModel.TYPE_CONTENT).getNodeRef();
|
||||
recordService.link(record, folderB);
|
||||
@@ -219,19 +241,22 @@ public class MultipleSchedulesTest extends BaseRMTestCase
|
||||
test()
|
||||
.given(() -> {
|
||||
setUpFilePlan();
|
||||
// Create a record filed under category A and linked to category B.
|
||||
// Create a record filed under category A and linked to category B and C.
|
||||
record = fileFolderService.create(folderA, RECORD_NAME, ContentModel.TYPE_CONTENT).getNodeRef();
|
||||
recordService.link(record, folderB);
|
||||
})
|
||||
.when(() -> {
|
||||
recordService.link(record, folderC);
|
||||
// Cut off the record.
|
||||
dispositionService.cutoffDisposableItem(record);
|
||||
// Ensure the update has been applied to the record.
|
||||
internalDispositionService.updateNextDispositionAction(record);
|
||||
})
|
||||
.when(() -> {
|
||||
// Unlink the record from folder B.
|
||||
recordService.unlink(record, folderB);
|
||||
})
|
||||
.then()
|
||||
.expect(true)
|
||||
.expect(false)
|
||||
.from(() -> dispositionService.isNextDispositionActionEligible(record))
|
||||
.because("Destroy action should be available, as the record should follow its origin disposition schedule.");
|
||||
.because("Destroy action shouldn't be available, as the record should follow disposition schedule from category C.");
|
||||
}
|
||||
}
|
||||
|
@@ -30,7 +30,6 @@ package org.alfresco.rm.rest.api.impl;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
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.junit.Assert.fail;
|
||||
import static org.mockito.Matchers.any;
|
||||
@@ -42,6 +41,8 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.alfresco.model.ContentModel;
|
||||
import org.alfresco.module.org_alfresco_module_rm.capability.Capability;
|
||||
import org.alfresco.module.org_alfresco_module_rm.capability.CapabilityService;
|
||||
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedule;
|
||||
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
|
||||
import org.alfresco.module.org_alfresco_module_rm.test.util.AlfMock;
|
||||
@@ -69,6 +70,8 @@ import org.mockito.InjectMocks;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
|
||||
import net.sf.acegisecurity.vote.AccessDecisionVoter;
|
||||
|
||||
/**
|
||||
* Unit Test class for RMNodesImpl.
|
||||
*
|
||||
@@ -99,9 +102,16 @@ public class RMNodesImplUnitTest extends BaseUnitTest
|
||||
@Mock
|
||||
private ServiceRegistry mockedServiceRegistry;
|
||||
|
||||
@Mock
|
||||
private CapabilityService mockedCapabilityService;
|
||||
|
||||
@InjectMocks
|
||||
private RMNodesImpl rmNodesImpl;
|
||||
|
||||
private Capability deleteCapability;
|
||||
private Capability createCapability;
|
||||
private Capability updateCapability;
|
||||
|
||||
@Before
|
||||
public void before()
|
||||
{
|
||||
@@ -112,6 +122,12 @@ public class RMNodesImplUnitTest extends BaseUnitTest
|
||||
when(mockedNamespaceService.getPrefixes(any(String.class))).thenReturn(prefixes);
|
||||
when(mockedNamespaceService.getNamespaceURI(any(String.class))).thenReturn(RM_URI);
|
||||
|
||||
deleteCapability = mock(Capability.class);
|
||||
when(mockedCapabilityService.getCapability("Delete")).thenReturn(deleteCapability);
|
||||
createCapability = mock(Capability.class);
|
||||
when(mockedCapabilityService.getCapability("FillingPermissionOnly")).thenReturn(createCapability);
|
||||
updateCapability = mock(Capability.class);
|
||||
when(mockedCapabilityService.getCapability("Update")).thenReturn(updateCapability);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -155,19 +171,13 @@ public class RMNodesImplUnitTest extends BaseUnitTest
|
||||
|
||||
setPermissions(nodeRef, AccessStatus.ALLOWED);
|
||||
|
||||
when(deleteCapability.evaluate(nodeRef)).thenReturn(AccessDecisionVoter.ACCESS_GRANTED);
|
||||
when(createCapability.evaluate(nodeRef)).thenReturn(AccessDecisionVoter.ACCESS_GRANTED);
|
||||
when(updateCapability.evaluate(nodeRef)).thenReturn(AccessDecisionVoter.ACCESS_GRANTED);
|
||||
|
||||
when(mockedFilePlanService.getFilePlanBySiteId(RM_SITE_ID)).thenReturn(nodeRef);
|
||||
Node folderOrDocument = rmNodesImpl.getFolderOrDocument(nodeRef, null, null, includeParamList, null);
|
||||
assertNotNull(folderOrDocument);
|
||||
assertTrue(FileplanComponentNode.class.isInstance(folderOrDocument));
|
||||
|
||||
FileplanComponentNode resultNode = (FileplanComponentNode) folderOrDocument;
|
||||
assertEquals(false, resultNode.getIsRecordFolder());
|
||||
assertEquals(false, resultNode.getIsFile());
|
||||
assertEquals(false, resultNode.getIsCategory());
|
||||
List<String> allowableOperations = resultNode.getAllowableOperations();
|
||||
assertTrue("Create operation should be available for FilePlan.", allowableOperations.contains(RMNodes.OP_CREATE));
|
||||
assertTrue("Update operation should be available for FilePlan.", allowableOperations.contains(RMNodes.OP_UPDATE));
|
||||
assertFalse("Delete operation should note be available for FilePlan.", allowableOperations.contains(RMNodes.OP_DELETE));
|
||||
checksAllowedOperations(folderOrDocument, false, true, false);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -198,15 +208,15 @@ public class RMNodesImplUnitTest extends BaseUnitTest
|
||||
assertEquals(false, resultNode.getIsFile());
|
||||
assertEquals(false, resultNode.getIsCategory());
|
||||
List<String> allowableOperations = resultNode.getAllowableOperations();
|
||||
assertNull(allowableOperations);
|
||||
assertEquals(0, allowableOperations.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetTransferContainerAllowableOperations() throws Exception
|
||||
{
|
||||
NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService);
|
||||
when(mockedNodeService.getType(nodeRef)).thenReturn(RecordsManagementModel.TYPE_RECORD_CATEGORY);
|
||||
when(mockedDictionaryService.isSubClass(RecordsManagementModel.TYPE_RECORD_CATEGORY, ContentModel.TYPE_FOLDER)).thenReturn(true);
|
||||
when(mockedNodeService.getType(nodeRef)).thenReturn(RecordsManagementModel.TYPE_TRANSFER_CONTAINER);
|
||||
when(mockedDictionaryService.isSubClass(RecordsManagementModel.TYPE_TRANSFER_CONTAINER, ContentModel.TYPE_FOLDER)).thenReturn(true);
|
||||
|
||||
setupCompanyHomeAndPrimaryParent(nodeRef);
|
||||
|
||||
@@ -219,16 +229,22 @@ public class RMNodesImplUnitTest extends BaseUnitTest
|
||||
when(mockedFilePlanService.getFilePlanBySiteId(RM_SITE_ID)).thenReturn(filePlanNodeRef);
|
||||
when(mockedFilePlanService.getTransferContainer(filePlanNodeRef)).thenReturn(nodeRef);
|
||||
|
||||
when(deleteCapability.evaluate(nodeRef)).thenReturn(AccessDecisionVoter.ACCESS_GRANTED);
|
||||
when(createCapability.evaluate(nodeRef)).thenReturn(AccessDecisionVoter.ACCESS_GRANTED);
|
||||
when(updateCapability.evaluate(nodeRef)).thenReturn(AccessDecisionVoter.ACCESS_GRANTED);
|
||||
|
||||
when(mockedFilePlanService.isFilePlanComponent(nodeRef)).thenReturn(true);
|
||||
|
||||
Node folderOrDocument = rmNodesImpl.getFolderOrDocument(nodeRef, null, null, includeParamList, null);
|
||||
checkSpecialContainersAllowedOperations(folderOrDocument);
|
||||
checksAllowedOperations(folderOrDocument, false, true, false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetHoldContainerAllowableOperations() throws Exception
|
||||
{
|
||||
NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService);
|
||||
when(mockedNodeService.getType(nodeRef)).thenReturn(RecordsManagementModel.TYPE_RECORD_CATEGORY);
|
||||
when(mockedDictionaryService.isSubClass(RecordsManagementModel.TYPE_RECORD_CATEGORY, ContentModel.TYPE_FOLDER)).thenReturn(true);
|
||||
when(mockedNodeService.getType(nodeRef)).thenReturn(RecordsManagementModel.TYPE_HOLD_CONTAINER);
|
||||
when(mockedDictionaryService.isSubClass(RecordsManagementModel.TYPE_HOLD_CONTAINER, ContentModel.TYPE_FOLDER)).thenReturn(true);
|
||||
|
||||
setupCompanyHomeAndPrimaryParent(nodeRef);
|
||||
|
||||
@@ -245,16 +261,22 @@ public class RMNodesImplUnitTest extends BaseUnitTest
|
||||
|
||||
when(mockedFilePlanService.getHoldContainer(filePlanNodeRef)).thenReturn(nodeRef);
|
||||
|
||||
when(deleteCapability.evaluate(nodeRef)).thenReturn(AccessDecisionVoter.ACCESS_GRANTED);
|
||||
when(createCapability.evaluate(nodeRef)).thenReturn(AccessDecisionVoter.ACCESS_GRANTED);
|
||||
when(updateCapability.evaluate(nodeRef)).thenReturn(AccessDecisionVoter.ACCESS_GRANTED);
|
||||
|
||||
when(mockedFilePlanService.isFilePlanComponent(nodeRef)).thenReturn(true);
|
||||
|
||||
Node folderOrDocument = rmNodesImpl.getFolderOrDocument(nodeRef, null, null, includeParamList, null);
|
||||
checkSpecialContainersAllowedOperations(folderOrDocument);
|
||||
checksAllowedOperations(folderOrDocument, true, true, false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetUnfiledContainerAllowableOperations() throws Exception
|
||||
{
|
||||
NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService);
|
||||
when(mockedNodeService.getType(nodeRef)).thenReturn(RecordsManagementModel.TYPE_RECORD_CATEGORY);
|
||||
when(mockedDictionaryService.isSubClass(RecordsManagementModel.TYPE_RECORD_CATEGORY, ContentModel.TYPE_FOLDER)).thenReturn(true);
|
||||
when(mockedNodeService.getType(nodeRef)).thenReturn(RecordsManagementModel.TYPE_UNFILED_RECORD_CONTAINER);
|
||||
when(mockedDictionaryService.isSubClass(RecordsManagementModel.TYPE_UNFILED_RECORD_CONTAINER, ContentModel.TYPE_FOLDER)).thenReturn(true);
|
||||
|
||||
setupCompanyHomeAndPrimaryParent(nodeRef);
|
||||
|
||||
@@ -274,8 +296,14 @@ public class RMNodesImplUnitTest extends BaseUnitTest
|
||||
|
||||
when(mockedFilePlanService.getUnfiledContainer(filePlanNodeRef)).thenReturn(nodeRef);
|
||||
|
||||
when(deleteCapability.evaluate(nodeRef)).thenReturn(AccessDecisionVoter.ACCESS_GRANTED);
|
||||
when(createCapability.evaluate(nodeRef)).thenReturn(AccessDecisionVoter.ACCESS_GRANTED);
|
||||
when(updateCapability.evaluate(nodeRef)).thenReturn(AccessDecisionVoter.ACCESS_GRANTED);
|
||||
|
||||
when(mockedFilePlanService.isFilePlanComponent(nodeRef)).thenReturn(true);
|
||||
|
||||
Node folderOrDocument = rmNodesImpl.getFolderOrDocument(nodeRef, null, null, includeParamList, null);
|
||||
checkSpecialContainersAllowedOperations(folderOrDocument);
|
||||
checksAllowedOperations(folderOrDocument, true, true, false);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -621,18 +649,23 @@ public class RMNodesImplUnitTest extends BaseUnitTest
|
||||
when(mockedPermissionService.hasPermission(nodeRef, PermissionService.ADD_CHILDREN)).thenReturn(permissionToSet);
|
||||
}
|
||||
|
||||
private void checkSpecialContainersAllowedOperations(Node containerNode)
|
||||
private void checksAllowedOperations(Node containerNode, boolean allowCreate, boolean allowUpdate, boolean allowDelete)
|
||||
{
|
||||
assertNotNull(containerNode);
|
||||
assertTrue(RecordCategoryNode.class.isInstance(containerNode));
|
||||
|
||||
RecordCategoryNode resultNode = (RecordCategoryNode) containerNode;
|
||||
assertEquals(false, resultNode.getIsRecordFolder());
|
||||
assertEquals(false, resultNode.getIsFile());
|
||||
assertEquals(true, resultNode.getIsCategory());
|
||||
assertTrue(FileplanComponentNode.class.isInstance(containerNode));
|
||||
FileplanComponentNode resultNode = (FileplanComponentNode) containerNode;
|
||||
List<String> allowableOperations = resultNode.getAllowableOperations();
|
||||
assertTrue("Create operation should be available for provided container.", allowableOperations.contains(RMNodes.OP_CREATE));
|
||||
assertTrue("Update operation should be available for provided container.", allowableOperations.contains(RMNodes.OP_UPDATE));
|
||||
assertFalse("Delete operation should note be available for provided container.", allowableOperations.contains(RMNodes.OP_DELETE));
|
||||
|
||||
assertEquals("Create operation should " + (allowCreate?"":"not ") + "be available for provided container.",
|
||||
allowCreate,
|
||||
allowableOperations.contains(RMNodes.OP_CREATE));
|
||||
|
||||
assertEquals("Update operation should " + (allowCreate?"":"not ") + "be available for provided container.",
|
||||
allowUpdate,
|
||||
allowableOperations.contains(RMNodes.OP_UPDATE));
|
||||
|
||||
assertEquals("Delete operation should " + (allowCreate?"":"not ") + "be available for provided container.",
|
||||
allowDelete,
|
||||
allowableOperations.contains(RMNodes.OP_DELETE));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user