mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-31 17:39:05 +00:00
Merge branch 'master' of https://gitlab.alfresco.com/records-management/records-management into RM-4367_RecordCategoryAcceptOnly
This commit is contained in:
@@ -23,7 +23,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
|
|||||||
* POJO for file plan component
|
* POJO for file plan component
|
||||||
*
|
*
|
||||||
* @author Tuna Aksoy
|
* @author Tuna Aksoy
|
||||||
* @since 1.0
|
* @since 2.6
|
||||||
*/
|
*/
|
||||||
public class FilePlanComponent
|
public class FilePlanComponent
|
||||||
{
|
{
|
||||||
|
@@ -17,7 +17,7 @@ import static org.alfresco.rest.rm.util.ParameterCheck.mandatoryString;
|
|||||||
* File plan component alias enumeration
|
* File plan component alias enumeration
|
||||||
*
|
*
|
||||||
* @author Tuna Aksoy
|
* @author Tuna Aksoy
|
||||||
* @since 1.0
|
* @since 2.6
|
||||||
*/
|
*/
|
||||||
public enum FilePlanComponentAlias
|
public enum FilePlanComponentAlias
|
||||||
{
|
{
|
||||||
|
@@ -21,7 +21,7 @@ import org.alfresco.rest.core.RestModels;
|
|||||||
* POJO for file plan component entry
|
* POJO for file plan component entry
|
||||||
*
|
*
|
||||||
* @author Tuna Aksoy
|
* @author Tuna Aksoy
|
||||||
* @since 1.0
|
* @since 2.6
|
||||||
*/
|
*/
|
||||||
public class FilePlanComponentEntry extends RestModels<FilePlanComponent, FilePlanComponentEntry>
|
public class FilePlanComponentEntry extends RestModels<FilePlanComponent, FilePlanComponentEntry>
|
||||||
{
|
{
|
||||||
|
@@ -15,7 +15,7 @@ package org.alfresco.rest.rm.model.fileplancomponents;
|
|||||||
* File plan component field names constants
|
* File plan component field names constants
|
||||||
*
|
*
|
||||||
* @author Tuna Aksoy
|
* @author Tuna Aksoy
|
||||||
* @since 1.0
|
* @since 2.6
|
||||||
*/
|
*/
|
||||||
public class FilePlanComponentFields
|
public class FilePlanComponentFields
|
||||||
{
|
{
|
||||||
|
@@ -15,7 +15,7 @@ package org.alfresco.rest.rm.model.fileplancomponents;
|
|||||||
* POJO for id/name pair
|
* POJO for id/name pair
|
||||||
*
|
*
|
||||||
* @author Kristijan Conkas
|
* @author Kristijan Conkas
|
||||||
* @since 1.0
|
* @since 2.6
|
||||||
*/
|
*/
|
||||||
public class FilePlanComponentIdNamePair
|
public class FilePlanComponentIdNamePair
|
||||||
{
|
{
|
||||||
|
@@ -19,7 +19,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
|||||||
* POJO for FilePlanComponent path parameter
|
* POJO for FilePlanComponent path parameter
|
||||||
* <br>
|
* <br>
|
||||||
* @author Kristijan Conkas
|
* @author Kristijan Conkas
|
||||||
* @since 1.0
|
* @since 2.6
|
||||||
*/
|
*/
|
||||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||||
public class FilePlanComponentPath
|
public class FilePlanComponentPath
|
||||||
|
@@ -28,7 +28,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
|
|||||||
* POJO for file plan component properties
|
* POJO for file plan component properties
|
||||||
*
|
*
|
||||||
* @author Kristijan Conkas
|
* @author Kristijan Conkas
|
||||||
* @since 1.0
|
* @since 2.6
|
||||||
*/
|
*/
|
||||||
//FIXME: Once the fields have been added the JsonIgnoreProperties annotation should be removed
|
//FIXME: Once the fields have been added the JsonIgnoreProperties annotation should be removed
|
||||||
@JsonIgnoreProperties (ignoreUnknown = true)
|
@JsonIgnoreProperties (ignoreUnknown = true)
|
||||||
|
@@ -17,7 +17,7 @@ import static org.alfresco.rest.rm.util.ParameterCheck.mandatoryString;
|
|||||||
* File plan component type enumeration
|
* File plan component type enumeration
|
||||||
*
|
*
|
||||||
* @author Tuna Aksoy
|
* @author Tuna Aksoy
|
||||||
* @since 1.0
|
* @since 2.6
|
||||||
*/
|
*/
|
||||||
public enum FilePlanComponentType
|
public enum FilePlanComponentType
|
||||||
{
|
{
|
||||||
|
@@ -15,7 +15,7 @@ package org.alfresco.rest.rm.model.fileplancomponents;
|
|||||||
* POJO for file plan component created by object
|
* POJO for file plan component created by object
|
||||||
*
|
*
|
||||||
* @author Kristijan Conkas
|
* @author Kristijan Conkas
|
||||||
* @since 1.0
|
* @since 2.6
|
||||||
*/
|
*/
|
||||||
public class FilePlanComponentUserInfo
|
public class FilePlanComponentUserInfo
|
||||||
{
|
{
|
||||||
|
@@ -17,7 +17,7 @@ import org.alfresco.rest.core.RestModels;
|
|||||||
* Handle collection of FilePlanComponents
|
* Handle collection of FilePlanComponents
|
||||||
*
|
*
|
||||||
* @author Kristijan Conkas
|
* @author Kristijan Conkas
|
||||||
* @since 1.0
|
* @since 2.6
|
||||||
*/
|
*/
|
||||||
public class FilePlanComponentsCollection extends RestModels<FilePlanComponentEntry, FilePlanComponentsCollection>
|
public class FilePlanComponentsCollection extends RestModels<FilePlanComponentEntry, FilePlanComponentsCollection>
|
||||||
{
|
{
|
||||||
|
@@ -4,7 +4,7 @@ package org.alfresco.rest.rm.model.fileplancomponents;
|
|||||||
* POJO for the review period
|
* POJO for the review period
|
||||||
*
|
*
|
||||||
* @author Rodica Sutu
|
* @author Rodica Sutu
|
||||||
* @since 1.0
|
* @since 2.6
|
||||||
*/
|
*/
|
||||||
public class ReviewPeriod
|
public class ReviewPeriod
|
||||||
{
|
{
|
||||||
|
@@ -19,7 +19,7 @@ import org.alfresco.rest.model.RestSiteModel;
|
|||||||
* POJO for RM Site component
|
* POJO for RM Site component
|
||||||
*
|
*
|
||||||
* @author Rodica Sutu
|
* @author Rodica Sutu
|
||||||
* @since 1.0
|
* @since 2.6
|
||||||
*/
|
*/
|
||||||
public class RMSite extends RestSiteModel
|
public class RMSite extends RestSiteModel
|
||||||
{
|
{
|
||||||
|
@@ -15,7 +15,7 @@ package org.alfresco.rest.rm.model.site;
|
|||||||
* RM Site compliance
|
* RM Site compliance
|
||||||
*
|
*
|
||||||
* @author Tuna Aksoy
|
* @author Tuna Aksoy
|
||||||
* @since 1.0
|
* @since 2.6
|
||||||
*/
|
*/
|
||||||
public enum RMSiteCompliance
|
public enum RMSiteCompliance
|
||||||
{
|
{
|
||||||
|
@@ -24,7 +24,7 @@ package org.alfresco.rest.rm.model.site;
|
|||||||
*}
|
*}
|
||||||
* @author Tuna Aksoy
|
* @author Tuna Aksoy
|
||||||
* @author Rodica Sutu
|
* @author Rodica Sutu
|
||||||
* @since 1.0
|
* @since 2.6
|
||||||
*/
|
*/
|
||||||
public class RMSiteFields
|
public class RMSiteFields
|
||||||
{
|
{
|
||||||
|
@@ -33,7 +33,7 @@ import org.springframework.stereotype.Component;
|
|||||||
*
|
*
|
||||||
* @author Tuna Aksoy
|
* @author Tuna Aksoy
|
||||||
* @author Kristijan Conkas
|
* @author Kristijan Conkas
|
||||||
* @since 1.0
|
* @since 2.6
|
||||||
*/
|
*/
|
||||||
@Component
|
@Component
|
||||||
@Scope(value = "prototype")
|
@Scope(value = "prototype")
|
||||||
|
@@ -31,7 +31,7 @@ import org.springframework.stereotype.Component;
|
|||||||
*
|
*
|
||||||
* @author Tuna Aksoy
|
* @author Tuna Aksoy
|
||||||
* @author Rodica Sutu
|
* @author Rodica Sutu
|
||||||
* @since 1.0
|
* @since 2.6
|
||||||
*/
|
*/
|
||||||
@Component
|
@Component
|
||||||
@Scope (value = "prototype")
|
@Scope (value = "prototype")
|
||||||
|
@@ -17,7 +17,7 @@ import static org.apache.commons.lang3.StringUtils.isBlank;
|
|||||||
* Utility class for checking parameters
|
* Utility class for checking parameters
|
||||||
*
|
*
|
||||||
* @author Tuna Aksoy
|
* @author Tuna Aksoy
|
||||||
* @since 1.0
|
* @since 2.6
|
||||||
*/
|
*/
|
||||||
public class ParameterCheck
|
public class ParameterCheck
|
||||||
{
|
{
|
||||||
|
@@ -15,7 +15,7 @@ package org.alfresco.rest.rm.base;
|
|||||||
* List of allowable operations
|
* List of allowable operations
|
||||||
*
|
*
|
||||||
* @author Tuna Aksoy
|
* @author Tuna Aksoy
|
||||||
* @since 1.0
|
* @since 2.6
|
||||||
*/
|
*/
|
||||||
public class AllowableOperations
|
public class AllowableOperations
|
||||||
{
|
{
|
||||||
|
@@ -50,7 +50,7 @@ import org.testng.annotations.BeforeClass;
|
|||||||
*
|
*
|
||||||
* @author Kristijan Conkas
|
* @author Kristijan Conkas
|
||||||
* @author Tuna Aksoy
|
* @author Tuna Aksoy
|
||||||
* @since 1.0
|
* @since 2.6
|
||||||
*/
|
*/
|
||||||
@Configuration
|
@Configuration
|
||||||
@PropertySource("classpath:default.properties")
|
@PropertySource("classpath:default.properties")
|
||||||
|
@@ -32,7 +32,7 @@ import org.testng.annotations.DataProvider;
|
|||||||
* Test data used in tests
|
* Test data used in tests
|
||||||
*
|
*
|
||||||
* @author Rodica Sutu
|
* @author Rodica Sutu
|
||||||
* @since 1.0
|
* @since 2.6
|
||||||
*/
|
*/
|
||||||
public interface TestData
|
public interface TestData
|
||||||
{
|
{
|
||||||
|
@@ -52,7 +52,7 @@ import org.testng.annotations.Test;
|
|||||||
* the File Plan CRUD API
|
* the File Plan CRUD API
|
||||||
*
|
*
|
||||||
* @author Rodica Sutu
|
* @author Rodica Sutu
|
||||||
* @since 1.0
|
* @since 2.6
|
||||||
*/
|
*/
|
||||||
public class FilePlanTests extends BaseRestTest
|
public class FilePlanTests extends BaseRestTest
|
||||||
{
|
{
|
||||||
@@ -198,7 +198,7 @@ public class FilePlanTests extends BaseRestTest
|
|||||||
/**
|
/**
|
||||||
* Given that a file plan exists
|
* Given that a file plan exists
|
||||||
* When I ask the API to delete the file plan
|
* When I ask the API to delete the file plan
|
||||||
* Then the 403 response code is returned.
|
* Then the 422 response code is returned.
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
(
|
(
|
||||||
@@ -217,6 +217,40 @@ public class FilePlanTests extends BaseRestTest
|
|||||||
// Delete the file plan component
|
// Delete the file plan component
|
||||||
filePlanComponentAPI.deleteFilePlanComponent(filePlanAlias.toString());
|
filePlanComponentAPI.deleteFilePlanComponent(filePlanAlias.toString());
|
||||||
|
|
||||||
|
// Check the DELETE response status code
|
||||||
|
filePlanComponentAPI.usingRestWrapper().assertStatusCodeIs(UNPROCESSABLE_ENTITY);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given that a file plan exists and I am a non RM user
|
||||||
|
* When I ask the API to delete the file plan
|
||||||
|
* Then the 403 response code is returned.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
(
|
||||||
|
description = "Check the response code when deleting the special file plan components with non RM user",
|
||||||
|
dataProviderClass = TestData.class,
|
||||||
|
dataProvider = "getContainers"
|
||||||
|
)
|
||||||
|
public void deleteFilePlanSpecialComponentsNonRMUser(String filePlanAlias) throws Exception
|
||||||
|
{
|
||||||
|
// Create RM Site if doesn't exist
|
||||||
|
createRMSiteIfNotExists();
|
||||||
|
|
||||||
|
// Disconnect the current user from the API session
|
||||||
|
rmSiteAPI.usingRestWrapper().disconnect();
|
||||||
|
// Authenticate admin user to Alfresco REST API
|
||||||
|
restClient.authenticateUser(dataUser.getAdminUser());
|
||||||
|
|
||||||
|
// Create a random user
|
||||||
|
UserModel nonRMuser = dataUser.createRandomTestUser("testUser");
|
||||||
|
|
||||||
|
// Authenticate using the random user
|
||||||
|
filePlanComponentAPI.usingRestWrapper().authenticateUser(nonRMuser);
|
||||||
|
|
||||||
|
// Delete the file plan component
|
||||||
|
filePlanComponentAPI.deleteFilePlanComponent(filePlanAlias.toString());
|
||||||
|
|
||||||
// Check the DELETE response status code
|
// Check the DELETE response status code
|
||||||
filePlanComponentAPI.usingRestWrapper().assertStatusCodeIs(FORBIDDEN);
|
filePlanComponentAPI.usingRestWrapper().assertStatusCodeIs(FORBIDDEN);
|
||||||
}
|
}
|
||||||
|
@@ -54,7 +54,7 @@ import org.testng.annotations.Test;
|
|||||||
*
|
*
|
||||||
* @author Kristijan Conkas
|
* @author Kristijan Conkas
|
||||||
* @author Tuna Aksoy
|
* @author Tuna Aksoy
|
||||||
* @since 1.0
|
* @since 2.6
|
||||||
*/
|
*/
|
||||||
public class RecordCategoryTest extends BaseRestTest
|
public class RecordCategoryTest extends BaseRestTest
|
||||||
{
|
{
|
||||||
|
@@ -61,7 +61,7 @@ import org.testng.annotations.Test;
|
|||||||
* the Record Folder CRUD API
|
* the Record Folder CRUD API
|
||||||
*
|
*
|
||||||
* @author Rodica Sutu
|
* @author Rodica Sutu
|
||||||
* @since 1.0
|
* @since 2.6
|
||||||
*/
|
*/
|
||||||
public class RecordFolderTests extends BaseRestTest
|
public class RecordFolderTests extends BaseRestTest
|
||||||
{
|
{
|
||||||
|
@@ -51,7 +51,7 @@ import org.testng.annotations.Test;
|
|||||||
* the RM site CRUD API
|
* the RM site CRUD API
|
||||||
*
|
*
|
||||||
* @author Rodica Sutu
|
* @author Rodica Sutu
|
||||||
* @since 1.0
|
* @since 2.6
|
||||||
*/
|
*/
|
||||||
public class RMSiteTests extends BaseRestTest
|
public class RMSiteTests extends BaseRestTest
|
||||||
{
|
{
|
||||||
|
@@ -94,4 +94,35 @@
|
|||||||
</property>
|
</property>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
|
<bean id="rmDeleteTransferContainerCapability"
|
||||||
|
parent="declarativeCapability">
|
||||||
|
<property name="name" value="DeleteTransferContainer"/>
|
||||||
|
<property name="kinds">
|
||||||
|
<list>
|
||||||
|
<value>TRANSFER_CONTAINER</value>
|
||||||
|
</list>
|
||||||
|
</property>
|
||||||
|
<property name="conditions">
|
||||||
|
<map>
|
||||||
|
<entry key="capabilityCondition.filling" value="true"/>
|
||||||
|
</map>
|
||||||
|
</property>
|
||||||
|
<property name="private" value="true"/>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<bean id="rmDeleteHoldContainerCapability"
|
||||||
|
parent="declarativeCapability">
|
||||||
|
<property name="name" value="DeleteHoldContainer"/>
|
||||||
|
<property name="kinds">
|
||||||
|
<list>
|
||||||
|
<value>HOLD_CONTAINER</value>
|
||||||
|
</list>
|
||||||
|
</property>
|
||||||
|
<property name="conditions">
|
||||||
|
<map>
|
||||||
|
<entry key="capabilityCondition.filling" value="true"/>
|
||||||
|
</map>
|
||||||
|
</property>
|
||||||
|
<property name="private" value="true"/>
|
||||||
|
</bean>
|
||||||
</beans>
|
</beans>
|
@@ -25,6 +25,8 @@
|
|||||||
<ref bean="rmDeleteUnfiledRecordsContainerFolderCapability"/>
|
<ref bean="rmDeleteUnfiledRecordsContainerFolderCapability"/>
|
||||||
<ref bean="rmDeleteHoldCapability"/>
|
<ref bean="rmDeleteHoldCapability"/>
|
||||||
<ref bean="rmUnlinkFromRecordFolderCapability"/>
|
<ref bean="rmUnlinkFromRecordFolderCapability"/>
|
||||||
|
<ref bean="rmDeleteTransferContainerCapability"/>
|
||||||
|
<ref bean="rmDeleteHoldContainerCapability"/>
|
||||||
</list>
|
</list>
|
||||||
</property>
|
</property>
|
||||||
</bean>
|
</bean>
|
||||||
|
@@ -76,6 +76,9 @@
|
|||||||
<property name="filePlanService" ref="FilePlanService" />
|
<property name="filePlanService" ref="FilePlanService" />
|
||||||
<property name="recordFolderService" ref="RecordFolderService" />
|
<property name="recordFolderService" ref="RecordFolderService" />
|
||||||
<property name="filePlanRoleService" ref="FilePlanRoleService" />
|
<property name="filePlanRoleService" ref="FilePlanRoleService" />
|
||||||
|
<property name="unfilerRecordContainerType" ref="rma.unfiledRecordsContainer" />
|
||||||
|
<property name="transferContainerType" ref="rma.transferContainer" />
|
||||||
|
<property name="holdContainerType" ref="rma.holdContainer" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="rma.holdContainer" class="org.alfresco.module.org_alfresco_module_rm.model.rma.type.HoldContainerType" parent="rm.baseBehaviour">
|
<bean id="rma.holdContainer" class="org.alfresco.module.org_alfresco_module_rm.model.rma.type.HoldContainerType" parent="rm.baseBehaviour">
|
||||||
@@ -112,6 +115,7 @@
|
|||||||
<property name="recordsManagementSearchService" ref="RecordsManagementSearchService" />
|
<property name="recordsManagementSearchService" ref="RecordsManagementSearchService" />
|
||||||
<property name="capabilityService" ref="CapabilityService" />
|
<property name="capabilityService" ref="CapabilityService" />
|
||||||
<property name="authorityService" ref="AuthorityService" />
|
<property name="authorityService" ref="AuthorityService" />
|
||||||
|
<property name="filePlanType" ref="rma.filePlan" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<!-- rma model aspects -->
|
<!-- rma model aspects -->
|
||||||
|
@@ -518,8 +518,6 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
|
|||||||
* @param dispositionAction disposition action
|
* @param dispositionAction disposition action
|
||||||
*/
|
*/
|
||||||
private void updateDispositionActionProperties(NodeRef record, NodeRef dispositionAction)
|
private void updateDispositionActionProperties(NodeRef record, NodeRef dispositionAction)
|
||||||
{
|
|
||||||
if (!methodCached("updateDispositionActionProperties", record))
|
|
||||||
{
|
{
|
||||||
Map<QName, Serializable> props = nodeService.getProperties(record);
|
Map<QName, Serializable> props = nodeService.getProperties(record);
|
||||||
|
|
||||||
@@ -561,7 +559,6 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
|
|||||||
props.get(PROP_RS_DISPOSITION_PERIOD_EXPRESSION));
|
props.get(PROP_RS_DISPOSITION_PERIOD_EXPRESSION));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* On update of event execution information behaviour\
|
* On update of event execution information behaviour\
|
||||||
|
@@ -37,6 +37,7 @@ import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
|
|||||||
import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService;
|
import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService;
|
||||||
import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService;
|
import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService;
|
||||||
import org.alfresco.repo.node.NodeServicePolicies;
|
import org.alfresco.repo.node.NodeServicePolicies;
|
||||||
|
import org.alfresco.repo.node.integrity.IntegrityException;
|
||||||
import org.alfresco.repo.policy.Behaviour.NotificationFrequency;
|
import org.alfresco.repo.policy.Behaviour.NotificationFrequency;
|
||||||
import org.alfresco.repo.policy.annotation.Behaviour;
|
import org.alfresco.repo.policy.annotation.Behaviour;
|
||||||
import org.alfresco.repo.policy.annotation.BehaviourBean;
|
import org.alfresco.repo.policy.annotation.BehaviourBean;
|
||||||
@@ -61,10 +62,12 @@ import org.alfresco.service.namespace.QName;
|
|||||||
public class FilePlanType extends BaseBehaviourBean
|
public class FilePlanType extends BaseBehaviourBean
|
||||||
implements NodeServicePolicies.OnCreateChildAssociationPolicy,
|
implements NodeServicePolicies.OnCreateChildAssociationPolicy,
|
||||||
NodeServicePolicies.OnCreateNodePolicy,
|
NodeServicePolicies.OnCreateNodePolicy,
|
||||||
NodeServicePolicies.OnDeleteNodePolicy
|
NodeServicePolicies.OnDeleteNodePolicy,
|
||||||
|
NodeServicePolicies.BeforeDeleteNodePolicy
|
||||||
{
|
{
|
||||||
private final static List<QName> ACCEPTED_UNIQUE_CHILD_TYPES = Arrays.asList(TYPE_HOLD_CONTAINER, TYPE_TRANSFER_CONTAINER, TYPE_UNFILED_RECORD_CONTAINER);
|
private final static List<QName> ACCEPTED_UNIQUE_CHILD_TYPES = Arrays.asList(TYPE_HOLD_CONTAINER, TYPE_TRANSFER_CONTAINER, TYPE_UNFILED_RECORD_CONTAINER);
|
||||||
private final static List<QName> ACCEPTED_NON_UNIQUE_CHILD_TYPES = Arrays.asList(TYPE_RECORD_CATEGORY);
|
private final static List<QName> ACCEPTED_NON_UNIQUE_CHILD_TYPES = Arrays.asList(TYPE_RECORD_CATEGORY);
|
||||||
|
private static final String BEHAVIOUR_NAME = "onDeleteFilePlan";
|
||||||
|
|
||||||
/** file plan service */
|
/** file plan service */
|
||||||
private FilePlanService filePlanService;
|
private FilePlanService filePlanService;
|
||||||
@@ -78,6 +81,21 @@ public class FilePlanType extends BaseBehaviourBean
|
|||||||
/** file plan role service */
|
/** file plan role service */
|
||||||
private FilePlanRoleService filePlanRoleService;
|
private FilePlanRoleService filePlanRoleService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unfiled Record Container Type behaviour bean
|
||||||
|
*/
|
||||||
|
private UnfiledRecordContainerType unfilerRecordContainerType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transfer Container Type behaviour bean
|
||||||
|
*/
|
||||||
|
private TransferContainerType transferContainerType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hold Container Type behaviour bean
|
||||||
|
*/
|
||||||
|
private HoldContainerType holdContainerType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return File plan service
|
* @return File plan service
|
||||||
*/
|
*/
|
||||||
@@ -142,6 +160,49 @@ public class FilePlanType extends BaseBehaviourBean
|
|||||||
this.filePlanRoleService = filePlanRoleService;
|
this.filePlanRoleService = filePlanRoleService;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param unfilerRecordContainerType - unfiled record container type behaviour bean
|
||||||
|
*/
|
||||||
|
public void setUnfilerRecordContainerType(UnfiledRecordContainerType unfilerRecordContainerType)
|
||||||
|
{
|
||||||
|
this.unfilerRecordContainerType = unfilerRecordContainerType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param transferContainerType - transfer container type behaviour bean
|
||||||
|
*/
|
||||||
|
public void setTransferContainerType(TransferContainerType transferContainerType)
|
||||||
|
{
|
||||||
|
this.transferContainerType = transferContainerType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param holdContainerType - hold container type behaviour bean
|
||||||
|
*/
|
||||||
|
public void setHoldContainerType(HoldContainerType holdContainerType)
|
||||||
|
{
|
||||||
|
this.holdContainerType = holdContainerType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable the behaviours for this transaction
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void disable()
|
||||||
|
{
|
||||||
|
getBehaviour(BEHAVIOUR_NAME).disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable behaviours for this transaction
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void enable()
|
||||||
|
{
|
||||||
|
getBehaviour(BEHAVIOUR_NAME).enable();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see org.alfresco.repo.node.NodeServicePolicies.OnCreateChildAssociationPolicy#onCreateChildAssociation(org.alfresco.service.cmr.repository.ChildAssociationRef, boolean)
|
* @see org.alfresco.repo.node.NodeServicePolicies.OnCreateChildAssociationPolicy#onCreateChildAssociation(org.alfresco.service.cmr.repository.ChildAssociationRef, boolean)
|
||||||
*/
|
*/
|
||||||
@@ -194,15 +255,49 @@ public class FilePlanType extends BaseBehaviourBean
|
|||||||
/**
|
/**
|
||||||
* @see org.alfresco.repo.node.NodeServicePolicies.OnDeleteNodePolicy#onDeleteNode(org.alfresco.service.cmr.repository.ChildAssociationRef, boolean)
|
* @see org.alfresco.repo.node.NodeServicePolicies.OnDeleteNodePolicy#onDeleteNode(org.alfresco.service.cmr.repository.ChildAssociationRef, boolean)
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
@Behaviour
|
@Behaviour
|
||||||
(
|
(
|
||||||
kind = BehaviourKind.CLASS,
|
kind = BehaviourKind.CLASS,
|
||||||
|
notificationFrequency = NotificationFrequency.FIRST_EVENT,
|
||||||
|
name = BEHAVIOUR_NAME
|
||||||
|
)
|
||||||
|
public void onDeleteNode(ChildAssociationRef childAssocRef, boolean archived)
|
||||||
|
{
|
||||||
|
unfilerRecordContainerType.enable();
|
||||||
|
transferContainerType.enable();
|
||||||
|
holdContainerType.enable();
|
||||||
|
throw new IntegrityException("Operation failed. Deletion of File Plan is not allowed.", null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see org.alfresco.repo.node.NodeServicePolicies.BeforeDeleteNodePolicy#beforeDeleteNode(org.alfresco.service.cmr.repository.NodeRef)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@Behaviour
|
||||||
|
(
|
||||||
|
kind = BehaviourKind.CLASS,
|
||||||
|
notificationFrequency = NotificationFrequency.FIRST_EVENT
|
||||||
|
)
|
||||||
|
public void beforeDeleteNode(NodeRef nodeRef)
|
||||||
|
{
|
||||||
|
unfilerRecordContainerType.disable();
|
||||||
|
transferContainerType.disable();
|
||||||
|
holdContainerType.disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Behaviour
|
||||||
|
(
|
||||||
|
kind = BehaviourKind.CLASS,
|
||||||
|
policy = "alf:onDeleteNode",
|
||||||
notificationFrequency = NotificationFrequency.TRANSACTION_COMMIT
|
notificationFrequency = NotificationFrequency.TRANSACTION_COMMIT
|
||||||
)
|
)
|
||||||
@Override
|
public void onDeleteNodeOnCommit(ChildAssociationRef childAssocRef, boolean archived)
|
||||||
public void onDeleteNode(ChildAssociationRef childAssocRef, boolean archived)
|
|
||||||
{
|
{
|
||||||
// tear down the file plan roles
|
// tear down the file plan roles
|
||||||
getFilePlanRoleService().tearDownFilePlanRoles(childAssocRef.getChildRef());
|
getFilePlanRoleService().tearDownFilePlanRoles(childAssocRef.getChildRef());
|
||||||
|
unfilerRecordContainerType.enable();
|
||||||
|
transferContainerType.enable();
|
||||||
|
holdContainerType.enable();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -33,6 +33,7 @@ import org.alfresco.error.AlfrescoRuntimeException;
|
|||||||
import org.alfresco.model.ContentModel;
|
import org.alfresco.model.ContentModel;
|
||||||
import org.alfresco.module.org_alfresco_module_rm.model.BaseBehaviourBean;
|
import org.alfresco.module.org_alfresco_module_rm.model.BaseBehaviourBean;
|
||||||
import org.alfresco.repo.node.NodeServicePolicies;
|
import org.alfresco.repo.node.NodeServicePolicies;
|
||||||
|
import org.alfresco.repo.node.integrity.IntegrityException;
|
||||||
import org.alfresco.repo.policy.annotation.Behaviour;
|
import org.alfresco.repo.policy.annotation.Behaviour;
|
||||||
import org.alfresco.repo.policy.annotation.BehaviourBean;
|
import org.alfresco.repo.policy.annotation.BehaviourBean;
|
||||||
import org.alfresco.repo.policy.annotation.BehaviourKind;
|
import org.alfresco.repo.policy.annotation.BehaviourKind;
|
||||||
@@ -49,10 +50,31 @@ import org.springframework.extensions.surf.util.I18NUtil;
|
|||||||
*/
|
*/
|
||||||
@BehaviourBean(defaultType = "rma:holdContainer")
|
@BehaviourBean(defaultType = "rma:holdContainer")
|
||||||
public class HoldContainerType extends BaseBehaviourBean
|
public class HoldContainerType extends BaseBehaviourBean
|
||||||
implements NodeServicePolicies.OnCreateChildAssociationPolicy, NodeServicePolicies.OnCreateNodePolicy
|
implements NodeServicePolicies.OnCreateChildAssociationPolicy,
|
||||||
|
NodeServicePolicies.OnCreateNodePolicy,
|
||||||
|
NodeServicePolicies.OnDeleteNodePolicy
|
||||||
{
|
{
|
||||||
private final static String MSG_ERROR_ADD_CONTENT_CONTAINER = "rm.service.error-add-content-container";
|
private final static String MSG_ERROR_ADD_CONTENT_CONTAINER = "rm.service.error-add-content-container";
|
||||||
private final static List<QName> ACCEPTED_NON_UNIQUE_CHILD_TYPES = Arrays.asList(TYPE_HOLD);
|
private final static List<QName> ACCEPTED_NON_UNIQUE_CHILD_TYPES = Arrays.asList(TYPE_HOLD);
|
||||||
|
private static final String DELETE_BEHAVIOUR_NAME = "onDeleteHoldContainer";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable the behaviours for this transaction
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void disable()
|
||||||
|
{
|
||||||
|
getBehaviour(DELETE_BEHAVIOUR_NAME).disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable behaviours for this transaction
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void enable()
|
||||||
|
{
|
||||||
|
getBehaviour(DELETE_BEHAVIOUR_NAME).enable();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* On every event
|
* On every event
|
||||||
@@ -74,6 +96,16 @@ public class HoldContainerType extends BaseBehaviourBean
|
|||||||
NodeRef nodeRef = childAssocRef.getChildRef();
|
NodeRef nodeRef = childAssocRef.getChildRef();
|
||||||
if (instanceOf(nodeRef, ContentModel.TYPE_CONTENT) == true) { throw new AlfrescoRuntimeException(
|
if (instanceOf(nodeRef, ContentModel.TYPE_CONTENT) == true) { throw new AlfrescoRuntimeException(
|
||||||
I18NUtil.getMessage(MSG_ERROR_ADD_CONTENT_CONTAINER)); }
|
I18NUtil.getMessage(MSG_ERROR_ADD_CONTENT_CONTAINER)); }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Behaviour
|
||||||
|
(
|
||||||
|
kind = BehaviourKind.CLASS,
|
||||||
|
name = DELETE_BEHAVIOUR_NAME
|
||||||
|
)
|
||||||
|
public void onDeleteNode(ChildAssociationRef childAssocRef, boolean isNodeArchived)
|
||||||
|
{
|
||||||
|
throw new IntegrityException("Operation failed. Deletion of Hold Container is not allowed.", null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -97,6 +97,8 @@ public class RmSiteType extends BaseBehaviourBean
|
|||||||
/** Authority service */
|
/** Authority service */
|
||||||
private AuthorityService authorityService;
|
private AuthorityService authorityService;
|
||||||
|
|
||||||
|
private FilePlanType filePlanType;
|
||||||
|
|
||||||
/** Map of file plan type's key'ed by corresponding site types */
|
/** Map of file plan type's key'ed by corresponding site types */
|
||||||
protected Map<QName, QName> mapFilePlanType = new HashMap<QName, QName>(3);
|
protected Map<QName, QName> mapFilePlanType = new HashMap<QName, QName>(3);
|
||||||
|
|
||||||
@@ -133,6 +135,11 @@ public class RmSiteType extends BaseBehaviourBean
|
|||||||
this.authorityService = authorityService;
|
this.authorityService = authorityService;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setFilePlanType(FilePlanType filePlanType)
|
||||||
|
{
|
||||||
|
this.filePlanType = filePlanType;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers a file plan type for a specific site type.
|
* Registers a file plan type for a specific site type.
|
||||||
*
|
*
|
||||||
@@ -302,6 +309,7 @@ public class RmSiteType extends BaseBehaviourBean
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
filePlanType.disable();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -354,4 +362,15 @@ public class RmSiteType extends BaseBehaviourBean
|
|||||||
throw new IntegrityException(I18NUtil.getMessage(MULTIPLE_CHILDREN_TYPE_ERROR, ContentModel.TYPE_FOLDER), null);
|
throw new IntegrityException(I18NUtil.getMessage(MULTIPLE_CHILDREN_TYPE_ERROR, ContentModel.TYPE_FOLDER), null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Behaviour
|
||||||
|
(
|
||||||
|
kind = BehaviourKind.CLASS,
|
||||||
|
policy = "alf:onDeleteNode",
|
||||||
|
notificationFrequency = NotificationFrequency.TRANSACTION_COMMIT
|
||||||
|
)
|
||||||
|
public void onDeleteNodeOnCommit(ChildAssociationRef childAssocRef, boolean isNodeArchived)
|
||||||
|
{
|
||||||
|
filePlanType.enable();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -46,11 +46,15 @@ import org.springframework.extensions.surf.util.I18NUtil;
|
|||||||
*/
|
*/
|
||||||
@BehaviourBean(defaultType = "rma:transferContainer")
|
@BehaviourBean(defaultType = "rma:transferContainer")
|
||||||
public class TransferContainerType extends BaseBehaviourBean
|
public class TransferContainerType extends BaseBehaviourBean
|
||||||
implements NodeServicePolicies.OnCreateChildAssociationPolicy, NodeServicePolicies.OnCreateNodePolicy
|
implements NodeServicePolicies.OnCreateChildAssociationPolicy,
|
||||||
|
NodeServicePolicies.OnCreateNodePolicy,
|
||||||
|
NodeServicePolicies.OnDeleteNodePolicy
|
||||||
|
|
||||||
{
|
{
|
||||||
private final static String MSG_ERROR_ADD_CONTENT_CONTAINER = "rm.service.error-add-content-container";
|
private final static String MSG_ERROR_ADD_CONTENT_CONTAINER = "rm.service.error-add-content-container";
|
||||||
private final static String MSG_ERROR_ADD_CHILD_TO_TRANSFER_CONTAINER = "rm.action.create.transfer.container.child-error-message";
|
private final static String MSG_ERROR_ADD_CHILD_TO_TRANSFER_CONTAINER = "rm.action.create.transfer.container.child-error-message";
|
||||||
private static final String BEHAVIOUR_NAME = "onCreateChildAssocsForTransferContainer";
|
private static final String BEHAVIOUR_NAME = "onCreateChildAssocsForTransferContainer";
|
||||||
|
private static final String DELETE_BEHAVIOUR_NAME = "onDeleteTransferContainer";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disable the behaviours for this transaction
|
* Disable the behaviours for this transaction
|
||||||
@@ -59,6 +63,7 @@ public class TransferContainerType extends BaseBehaviourBean
|
|||||||
public void disable()
|
public void disable()
|
||||||
{
|
{
|
||||||
getBehaviour(BEHAVIOUR_NAME).disable();
|
getBehaviour(BEHAVIOUR_NAME).disable();
|
||||||
|
getBehaviour(DELETE_BEHAVIOUR_NAME).disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -68,6 +73,7 @@ public class TransferContainerType extends BaseBehaviourBean
|
|||||||
public void enable()
|
public void enable()
|
||||||
{
|
{
|
||||||
getBehaviour(BEHAVIOUR_NAME).enable();
|
getBehaviour(BEHAVIOUR_NAME).enable();
|
||||||
|
getBehaviour(DELETE_BEHAVIOUR_NAME).enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -94,4 +100,15 @@ public class TransferContainerType extends BaseBehaviourBean
|
|||||||
if (instanceOf(nodeRef, ContentModel.TYPE_CONTENT) == true) { throw new AlfrescoRuntimeException(
|
if (instanceOf(nodeRef, ContentModel.TYPE_CONTENT) == true) { throw new AlfrescoRuntimeException(
|
||||||
I18NUtil.getMessage(MSG_ERROR_ADD_CONTENT_CONTAINER)); }
|
I18NUtil.getMessage(MSG_ERROR_ADD_CONTENT_CONTAINER)); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Behaviour
|
||||||
|
(
|
||||||
|
kind = BehaviourKind.CLASS,
|
||||||
|
name = DELETE_BEHAVIOUR_NAME
|
||||||
|
)
|
||||||
|
public void onDeleteNode(ChildAssociationRef childAssocRef, boolean isNodeArchived)
|
||||||
|
{
|
||||||
|
throw new IntegrityException("Operation failed. Deletion of Transfer Container is not allowed.", null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -33,6 +33,7 @@ import java.util.List;
|
|||||||
import org.alfresco.model.ContentModel;
|
import org.alfresco.model.ContentModel;
|
||||||
import org.alfresco.module.org_alfresco_module_rm.model.BaseBehaviourBean;
|
import org.alfresco.module.org_alfresco_module_rm.model.BaseBehaviourBean;
|
||||||
import org.alfresco.repo.node.NodeServicePolicies;
|
import org.alfresco.repo.node.NodeServicePolicies;
|
||||||
|
import org.alfresco.repo.node.integrity.IntegrityException;
|
||||||
import org.alfresco.repo.policy.annotation.Behaviour;
|
import org.alfresco.repo.policy.annotation.Behaviour;
|
||||||
import org.alfresco.repo.policy.annotation.BehaviourBean;
|
import org.alfresco.repo.policy.annotation.BehaviourBean;
|
||||||
import org.alfresco.repo.policy.annotation.BehaviourKind;
|
import org.alfresco.repo.policy.annotation.BehaviourKind;
|
||||||
@@ -47,9 +48,30 @@ import org.alfresco.service.namespace.QName;
|
|||||||
*/
|
*/
|
||||||
@BehaviourBean(defaultType = "rma:unfiledRecordContainer")
|
@BehaviourBean(defaultType = "rma:unfiledRecordContainer")
|
||||||
public class UnfiledRecordContainerType extends BaseBehaviourBean
|
public class UnfiledRecordContainerType extends BaseBehaviourBean
|
||||||
implements NodeServicePolicies.OnCreateChildAssociationPolicy
|
implements NodeServicePolicies.OnCreateChildAssociationPolicy,
|
||||||
|
NodeServicePolicies.OnDeleteNodePolicy
|
||||||
{
|
{
|
||||||
|
private static final String BEHAVIOUR_NAME = "onDeleteUnfiledRecordContainer";
|
||||||
private final static List<QName> ACCEPTED_NON_UNIQUE_CHILD_TYPES = Arrays.asList(TYPE_UNFILED_RECORD_FOLDER, ContentModel.TYPE_CONTENT, TYPE_NON_ELECTRONIC_DOCUMENT);
|
private final static List<QName> ACCEPTED_NON_UNIQUE_CHILD_TYPES = Arrays.asList(TYPE_UNFILED_RECORD_FOLDER, ContentModel.TYPE_CONTENT, TYPE_NON_ELECTRONIC_DOCUMENT);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable the behaviours for this transaction
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void disable()
|
||||||
|
{
|
||||||
|
getBehaviour(BEHAVIOUR_NAME).disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable behaviours for this transaction
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void enable()
|
||||||
|
{
|
||||||
|
getBehaviour(BEHAVIOUR_NAME).enable();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Behaviour(kind = BehaviourKind.ASSOCIATION)
|
@Behaviour(kind = BehaviourKind.ASSOCIATION)
|
||||||
public void onCreateChildAssociation(ChildAssociationRef childAssocRef, boolean isNewNode)
|
public void onCreateChildAssociation(ChildAssociationRef childAssocRef, boolean isNewNode)
|
||||||
@@ -57,4 +79,15 @@ public class UnfiledRecordContainerType extends BaseBehaviourBean
|
|||||||
// check the created child is of an accepted type
|
// check the created child is of an accepted type
|
||||||
validateNewChildAssociationSubTypesIncluded(childAssocRef.getChildRef(), ACCEPTED_NON_UNIQUE_CHILD_TYPES);
|
validateNewChildAssociationSubTypesIncluded(childAssocRef.getChildRef(), ACCEPTED_NON_UNIQUE_CHILD_TYPES);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Behaviour
|
||||||
|
(
|
||||||
|
kind = BehaviourKind.CLASS,
|
||||||
|
name = BEHAVIOUR_NAME
|
||||||
|
)
|
||||||
|
public void onDeleteNode(ChildAssociationRef childAssocRef, boolean isNodeArchived)
|
||||||
|
{
|
||||||
|
throw new IntegrityException("Operation failed. Deletion of Unfiled Record Container is not allowed.", null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -48,8 +48,6 @@ import org.alfresco.rest.api.impl.NodesImpl;
|
|||||||
import org.alfresco.rest.api.model.Node;
|
import org.alfresco.rest.api.model.Node;
|
||||||
import org.alfresco.rest.api.model.UserInfo;
|
import org.alfresco.rest.api.model.UserInfo;
|
||||||
import org.alfresco.rest.framework.core.exceptions.EntityNotFoundException;
|
import org.alfresco.rest.framework.core.exceptions.EntityNotFoundException;
|
||||||
import org.alfresco.rest.framework.core.exceptions.PermissionDeniedException;
|
|
||||||
import org.alfresco.rest.framework.resource.parameters.Parameters;
|
|
||||||
import org.alfresco.rm.rest.api.RMNodes;
|
import org.alfresco.rm.rest.api.RMNodes;
|
||||||
import org.alfresco.rm.rest.api.model.FileplanComponentNode;
|
import org.alfresco.rm.rest.api.model.FileplanComponentNode;
|
||||||
import org.alfresco.rm.rest.api.model.RecordCategoryNode;
|
import org.alfresco.rm.rest.api.model.RecordCategoryNode;
|
||||||
@@ -380,22 +378,4 @@ public class RMNodesImpl extends NodesImpl implements RMNodes
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Overridden this method just in order to use our isSpecialNode method since core method could not be overridden.
|
|
||||||
*
|
|
||||||
* TODO remove this after isSpecialNode will be made protected in core(REPO-1459).
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void deleteNode(String nodeId, Parameters parameters)
|
|
||||||
{
|
|
||||||
NodeRef nodeRef = validateOrLookupNode(nodeId, null);
|
|
||||||
QName nodeType = nodeService.getType(nodeRef);
|
|
||||||
|
|
||||||
if (isSpecialNode(nodeRef, nodeType))
|
|
||||||
{
|
|
||||||
throw new PermissionDeniedException("Cannot delete: " + nodeId);
|
|
||||||
}
|
|
||||||
super.deleteNode(nodeId, parameters);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -66,6 +66,10 @@ public class MultipleSchedulesTest extends BaseRMTestCase
|
|||||||
protected static final String CATEGORY_B_NAME = TEST_PREFIX + "CategoryB";
|
protected static final String CATEGORY_B_NAME = TEST_PREFIX + "CategoryB";
|
||||||
/** The name to use for the folder within the second category. */
|
/** The name to use for the folder within the second category. */
|
||||||
protected static final String FOLDER_B_NAME = TEST_PREFIX + "FolderB";
|
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. */
|
/** The name to use for the record. */
|
||||||
protected static final String RECORD_NAME = TEST_PREFIX + "Record";
|
protected static final String RECORD_NAME = TEST_PREFIX + "Record";
|
||||||
|
|
||||||
@@ -80,6 +84,10 @@ public class MultipleSchedulesTest extends BaseRMTestCase
|
|||||||
private NodeRef categoryB;
|
private NodeRef categoryB;
|
||||||
/** The folder node within the second category. */
|
/** The folder node within the second category. */
|
||||||
private NodeRef folderB;
|
private NodeRef folderB;
|
||||||
|
/** The third category node. */
|
||||||
|
private NodeRef categoryC;
|
||||||
|
/** The folder node within the third category. */
|
||||||
|
private NodeRef folderC;
|
||||||
/** The record node. */
|
/** The record node. */
|
||||||
private NodeRef record;
|
private NodeRef record;
|
||||||
|
|
||||||
@@ -114,6 +122,7 @@ public class MultipleSchedulesTest extends BaseRMTestCase
|
|||||||
// Create two categories.
|
// Create two categories.
|
||||||
categoryA = filePlanService.createRecordCategory(filePlan, CATEGORY_A_NAME);
|
categoryA = filePlanService.createRecordCategory(filePlan, CATEGORY_A_NAME);
|
||||||
categoryB = filePlanService.createRecordCategory(filePlan, CATEGORY_B_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).
|
// Create a disposition schedule for category A (Cut off immediately, then Destroy immediately).
|
||||||
DispositionSchedule dispSchedA = utils.createBasicDispositionSchedule(categoryA, "instructions", "authority", true, false);
|
DispositionSchedule dispSchedA = utils.createBasicDispositionSchedule(categoryA, "instructions", "authority", true, false);
|
||||||
Map<QName, Serializable> cutOffParamsA = ImmutableMap.of(PROP_DISPOSITION_ACTION_NAME, CutOffAction.NAME,
|
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, CommonRMTestUtils.PERIOD_ONE_WEEK,
|
||||||
PROP_DISPOSITION_PERIOD_PROPERTY, PROP_CUT_OFF_DATE);
|
PROP_DISPOSITION_PERIOD_PROPERTY, PROP_CUT_OFF_DATE);
|
||||||
dispositionService.addDispositionActionDefinition(dispSchedB, destroyParamsB);
|
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.
|
// Create a folder within each category.
|
||||||
folderA = recordFolderService.createRecordFolder(categoryA, FOLDER_A_NAME);
|
folderA = recordFolderService.createRecordFolder(categoryA, FOLDER_A_NAME);
|
||||||
folderB = recordFolderService.createRecordFolder(categoryB, FOLDER_B_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()
|
test()
|
||||||
.given(() -> {
|
.given(() -> {
|
||||||
setUpFilePlan();
|
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.
|
||||||
record = fileFolderService.create(folderA, RECORD_NAME, ContentModel.TYPE_CONTENT).getNodeRef();
|
record = fileFolderService.create(folderA, RECORD_NAME, ContentModel.TYPE_CONTENT).getNodeRef();
|
||||||
recordService.link(record, folderB);
|
recordService.link(record, folderB);
|
||||||
@@ -219,19 +241,22 @@ public class MultipleSchedulesTest extends BaseRMTestCase
|
|||||||
test()
|
test()
|
||||||
.given(() -> {
|
.given(() -> {
|
||||||
setUpFilePlan();
|
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();
|
record = fileFolderService.create(folderA, RECORD_NAME, ContentModel.TYPE_CONTENT).getNodeRef();
|
||||||
recordService.link(record, folderB);
|
recordService.link(record, folderB);
|
||||||
})
|
recordService.link(record, folderC);
|
||||||
.when(() -> {
|
|
||||||
// Cut off the record.
|
// Cut off the record.
|
||||||
dispositionService.cutoffDisposableItem(record);
|
dispositionService.cutoffDisposableItem(record);
|
||||||
|
// Ensure the update has been applied to the record.
|
||||||
|
internalDispositionService.updateNextDispositionAction(record);
|
||||||
|
})
|
||||||
|
.when(() -> {
|
||||||
// Unlink the record from folder B.
|
// Unlink the record from folder B.
|
||||||
recordService.unlink(record, folderB);
|
recordService.unlink(record, folderB);
|
||||||
})
|
})
|
||||||
.then()
|
.then()
|
||||||
.expect(true)
|
.expect(false)
|
||||||
.from(() -> dispositionService.isNextDispositionActionEligible(record))
|
.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.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,126 @@
|
|||||||
|
/*
|
||||||
|
* #%L
|
||||||
|
* Alfresco Records Management Module
|
||||||
|
* %%
|
||||||
|
* 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.module.org_alfresco_module_rm.test.integration.issue;
|
||||||
|
|
||||||
|
import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase;
|
||||||
|
import org.alfresco.repo.node.integrity.IntegrityException;
|
||||||
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for RM-4293
|
||||||
|
*
|
||||||
|
* @author Silviu Dinuta
|
||||||
|
* @since 2.6
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class RM4293Test extends BaseRMTestCase
|
||||||
|
{
|
||||||
|
public void testDeleteSpecialContainers() throws Exception
|
||||||
|
{
|
||||||
|
doTestInTransaction(new Test<Void>()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public Void run()
|
||||||
|
{
|
||||||
|
NodeRef holdContainer = filePlanService.getHoldContainer(filePlan);
|
||||||
|
assertNotNull(holdContainer);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
fileFolderService.delete(holdContainer);
|
||||||
|
fail("This should have thrown an exception");
|
||||||
|
}
|
||||||
|
catch (IntegrityException e)
|
||||||
|
{
|
||||||
|
// ("Hold Container can't be deleted.")
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
doTestInTransaction(new Test<Void>()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public Void run()
|
||||||
|
{
|
||||||
|
NodeRef transferContainer = filePlanService.getTransferContainer(filePlan);
|
||||||
|
assertNotNull(transferContainer);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
fileFolderService.delete(transferContainer);
|
||||||
|
fail("This should have thrown an exception");
|
||||||
|
}
|
||||||
|
catch (IntegrityException e)
|
||||||
|
{
|
||||||
|
// ("Transfer Container can't be deleted.")
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
doTestInTransaction(new Test<Void>()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public Void run()
|
||||||
|
{
|
||||||
|
NodeRef unfiledRecordContainer = filePlanService.getUnfiledContainer(filePlan);
|
||||||
|
assertNotNull(unfiledRecordContainer);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
fileFolderService.delete(unfiledRecordContainer);
|
||||||
|
fail("This should have thrown an exception");
|
||||||
|
}
|
||||||
|
catch (IntegrityException e)
|
||||||
|
{
|
||||||
|
// ("Unfiled Record Container can't be deleted.")
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
doTestInTransaction(new Test<Void>()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public Void run()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
fileFolderService.delete(filePlan);
|
||||||
|
fail("This should have thrown an exception");
|
||||||
|
}
|
||||||
|
catch (IntegrityException e)
|
||||||
|
{
|
||||||
|
// ("FilePlan can't be deleted.")
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@@ -35,9 +35,6 @@ import static org.junit.Assert.assertTrue;
|
|||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
import static org.mockito.Matchers.any;
|
import static org.mockito.Matchers.any;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.never;
|
|
||||||
import static org.mockito.Mockito.times;
|
|
||||||
import static org.mockito.Mockito.verify;
|
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import java.security.InvalidParameterException;
|
import java.security.InvalidParameterException;
|
||||||
@@ -52,8 +49,6 @@ import org.alfresco.module.org_alfresco_module_rm.test.util.BaseUnitTest;
|
|||||||
import org.alfresco.repo.model.Repository;
|
import org.alfresco.repo.model.Repository;
|
||||||
import org.alfresco.rest.api.model.Node;
|
import org.alfresco.rest.api.model.Node;
|
||||||
import org.alfresco.rest.framework.core.exceptions.EntityNotFoundException;
|
import org.alfresco.rest.framework.core.exceptions.EntityNotFoundException;
|
||||||
import org.alfresco.rest.framework.core.exceptions.PermissionDeniedException;
|
|
||||||
import org.alfresco.rest.framework.resource.parameters.Parameters;
|
|
||||||
import org.alfresco.rm.rest.api.RMNodes;
|
import org.alfresco.rm.rest.api.RMNodes;
|
||||||
import org.alfresco.rm.rest.api.model.FileplanComponentNode;
|
import org.alfresco.rm.rest.api.model.FileplanComponentNode;
|
||||||
import org.alfresco.rm.rest.api.model.RecordCategoryNode;
|
import org.alfresco.rm.rest.api.model.RecordCategoryNode;
|
||||||
@@ -609,121 +604,6 @@ public class RMNodesImplUnitTest extends BaseUnitTest
|
|||||||
assertEquals(nodeRef, validateOrLookupNode);
|
assertEquals(nodeRef, validateOrLookupNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testDeleteNode() throws Exception
|
|
||||||
{
|
|
||||||
NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService);
|
|
||||||
Parameters mockedParameters = mock(Parameters.class);
|
|
||||||
QName mockedType = AlfMock.generateQName();
|
|
||||||
when(mockedNodeService.getType(nodeRef)).thenReturn(mockedType);
|
|
||||||
|
|
||||||
setupCompanyHomeAndPrimaryParent(nodeRef);
|
|
||||||
|
|
||||||
rmNodesImpl.deleteNode(nodeRef.getId(), mockedParameters);
|
|
||||||
verify(mockedFileFolderService, times(1)).delete(nodeRef);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testDeleteFileplanNode() throws Exception
|
|
||||||
{
|
|
||||||
NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService);
|
|
||||||
Parameters mockedParameters = mock(Parameters.class);
|
|
||||||
QName mockedType = AlfMock.generateQName();
|
|
||||||
when(mockedNodeService.getType(nodeRef)).thenReturn(mockedType);
|
|
||||||
|
|
||||||
when(mockedFilePlanService.getFilePlanBySiteId(RM_SITE_ID)).thenReturn(nodeRef);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
rmNodesImpl.deleteNode(nodeRef.getId(), mockedParameters);
|
|
||||||
fail("Expected ecxeption as filePlan can't be deleted.");
|
|
||||||
}
|
|
||||||
catch(PermissionDeniedException ex)
|
|
||||||
{
|
|
||||||
assertEquals("Cannot delete: " + nodeRef.getId(), ex.getMsgId());
|
|
||||||
}
|
|
||||||
verify(mockedFileFolderService, never()).delete(nodeRef);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testDeleteTransfersContainerNode() throws Exception
|
|
||||||
{
|
|
||||||
NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService);
|
|
||||||
Parameters mockedParameters = mock(Parameters.class);
|
|
||||||
QName mockedType = AlfMock.generateQName();
|
|
||||||
when(mockedNodeService.getType(nodeRef)).thenReturn(mockedType);
|
|
||||||
|
|
||||||
NodeRef filePlanNodeRef = AlfMock.generateNodeRef(mockedNodeService);
|
|
||||||
when(mockedFilePlanService.getFilePlanBySiteId(RM_SITE_ID)).thenReturn(filePlanNodeRef);
|
|
||||||
when(mockedFilePlanService.getTransferContainer(filePlanNodeRef)).thenReturn(nodeRef);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
rmNodesImpl.deleteNode(nodeRef.getId(), mockedParameters);
|
|
||||||
fail("Expected ecxeption as Trnsfers container can't be deleted.");
|
|
||||||
}
|
|
||||||
catch(PermissionDeniedException ex)
|
|
||||||
{
|
|
||||||
assertEquals("Cannot delete: " + nodeRef.getId(), ex.getMsgId());
|
|
||||||
}
|
|
||||||
verify(mockedFileFolderService, never()).delete(nodeRef);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testDeleteHoldsContainerNode() throws Exception
|
|
||||||
{
|
|
||||||
NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService);
|
|
||||||
Parameters mockedParameters = mock(Parameters.class);
|
|
||||||
QName mockedType = AlfMock.generateQName();
|
|
||||||
when(mockedNodeService.getType(nodeRef)).thenReturn(mockedType);
|
|
||||||
|
|
||||||
NodeRef filePlanNodeRef = AlfMock.generateNodeRef(mockedNodeService);
|
|
||||||
when(mockedFilePlanService.getFilePlanBySiteId(RM_SITE_ID)).thenReturn(filePlanNodeRef);
|
|
||||||
|
|
||||||
NodeRef transferContainerNodeRef = AlfMock.generateNodeRef(mockedNodeService);
|
|
||||||
when(mockedFilePlanService.getTransferContainer(filePlanNodeRef)).thenReturn(transferContainerNodeRef);
|
|
||||||
|
|
||||||
when(mockedFilePlanService.getHoldContainer(filePlanNodeRef)).thenReturn(nodeRef);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
rmNodesImpl.deleteNode(nodeRef.getId(), mockedParameters);
|
|
||||||
fail("Expected ecxeption as Holds container can't be deleted.");
|
|
||||||
}
|
|
||||||
catch(PermissionDeniedException ex)
|
|
||||||
{
|
|
||||||
assertEquals("Cannot delete: " + nodeRef.getId(), ex.getMsgId());
|
|
||||||
}
|
|
||||||
verify(mockedFileFolderService, never()).delete(nodeRef);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testDeleteUnfiledRecordsContainerNode() throws Exception
|
|
||||||
{
|
|
||||||
NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService);
|
|
||||||
Parameters mockedParameters = mock(Parameters.class);
|
|
||||||
QName mockedType = AlfMock.generateQName();
|
|
||||||
when(mockedNodeService.getType(nodeRef)).thenReturn(mockedType);
|
|
||||||
|
|
||||||
NodeRef filePlanNodeRef = AlfMock.generateNodeRef(mockedNodeService);
|
|
||||||
when(mockedFilePlanService.getFilePlanBySiteId(RM_SITE_ID)).thenReturn(filePlanNodeRef);
|
|
||||||
|
|
||||||
NodeRef transferContainerNodeRef = AlfMock.generateNodeRef(mockedNodeService);
|
|
||||||
when(mockedFilePlanService.getTransferContainer(filePlanNodeRef)).thenReturn(transferContainerNodeRef);
|
|
||||||
|
|
||||||
NodeRef holdContainerNodeRef = AlfMock.generateNodeRef(mockedNodeService);
|
|
||||||
when(mockedFilePlanService.getHoldContainer(filePlanNodeRef)).thenReturn(holdContainerNodeRef);
|
|
||||||
|
|
||||||
when(mockedFilePlanService.getUnfiledContainer(filePlanNodeRef)).thenReturn(nodeRef);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
rmNodesImpl.deleteNode(nodeRef.getId(), mockedParameters);
|
|
||||||
fail("Expected ecxeption as Unfiled Records container can't be deleted.");
|
|
||||||
}
|
|
||||||
catch(PermissionDeniedException ex)
|
|
||||||
{
|
|
||||||
assertEquals("Cannot delete: " + nodeRef.getId(), ex.getMsgId());
|
|
||||||
}
|
|
||||||
verify(mockedFileFolderService, never()).delete(nodeRef);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setupCompanyHomeAndPrimaryParent(NodeRef nodeRef)
|
private void setupCompanyHomeAndPrimaryParent(NodeRef nodeRef)
|
||||||
{
|
{
|
||||||
NodeRef companyHomeNodeRef = AlfMock.generateNodeRef(mockedNodeService);
|
NodeRef companyHomeNodeRef = AlfMock.generateNodeRef(mockedNodeService);
|
||||||
|
Reference in New Issue
Block a user