RM-4326: allow creation in transfer container only from

TransferServiceImpl
This commit is contained in:
Silviu Dinuta
2016-11-08 17:26:07 +02:00
parent c28e0d5338
commit fce705ff72
7 changed files with 73 additions and 118 deletions

View File

@@ -161,6 +161,7 @@
<property name="recordFolderService" ref="RecordFolderService" /> <property name="recordFolderService" ref="RecordFolderService" />
<property name="nodeService" ref="nodeService"/> <property name="nodeService" ref="nodeService"/>
<property name="freezeService" ref="FreezeService"/> <property name="freezeService" ref="FreezeService"/>
<property name="transferContainerType" ref="rma.transferContainer"/>
</bean> </bean>
<bean id="RmTransferService" class="org.springframework.aop.framework.ProxyFactoryBean"> <bean id="RmTransferService" class="org.springframework.aop.framework.ProxyFactoryBean">
@@ -373,10 +374,10 @@
<!-- File Plan Service --> <!-- File Plan Service -->
<bean id="rootContainerCache" class="org.alfresco.repo.cache.DefaultSimpleCache" /> <bean id="rootContainerCache" class="org.alfresco.repo.cache.DefaultSimpleCache" />
<bean id="filePlanService" <bean id="filePlanService"
parent="baseService" parent="baseService"
class="org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanServiceImpl"> class="org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanServiceImpl">
<property name="rootContainerCache" ref="rootContainerCache" /> <property name="rootContainerCache" ref="rootContainerCache" />
</bean> </bean>
@@ -566,9 +567,9 @@
parent="baseService"> parent="baseService">
<property name="nodeService" ref="nodeService"/> <property name="nodeService" ref="nodeService"/>
<property name="filePlanService" ref="filePlanService" /> <property name="filePlanService" ref="filePlanService" />
<property name="filePlanRoleService" ref="filePlanRoleService" /> <property name="filePlanRoleService" ref="filePlanRoleService" />
<property name="authorityService" ref="authorityService"/> <property name="authorityService" ref="authorityService"/>
<property name="permissionService" ref="permissionService"/> <property name="permissionService" ref="permissionService"/>
<property name="transactionService" ref="transactionService"/> <property name="transactionService" ref="transactionService"/>
</bean> </bean>
@@ -1060,8 +1061,8 @@
</bean> </bean>
<bean id="recordMetadataAspectBootstrap" class="org.alfresco.module.org_alfresco_module_rm.record.RecordMetadataBootstrap" init-method="init" abstract="true"> <bean id="recordMetadataAspectBootstrap" class="org.alfresco.module.org_alfresco_module_rm.record.RecordMetadataBootstrap" init-method="init" abstract="true">
<property name="recordService" ref="recordService"/> <property name="recordService" ref="recordService"/>
<property name="namespaceService" ref="namespaceService"/> <property name="namespaceService" ref="namespaceService"/>
</bean> </bean>
<bean id="RecordService" class="org.springframework.aop.framework.ProxyFactoryBean"> <bean id="RecordService" class="org.springframework.aop.framework.ProxyFactoryBean">
@@ -1522,20 +1523,20 @@
<property name="objectDefinitionSource"> <property name="objectDefinitionSource">
<value> <value>
<![CDATA[ <![CDATA[
org.alfresco.module.org_alfresco_module_rm.hold.HoldService.isHold=RM_ALLOW org.alfresco.module.org_alfresco_module_rm.hold.HoldService.isHold=RM_ALLOW
org.alfresco.module.org_alfresco_module_rm.hold.HoldService.getHolds=RM.Read.0,AFTER_RM.FilterNode org.alfresco.module.org_alfresco_module_rm.hold.HoldService.getHolds=RM.Read.0,AFTER_RM.FilterNode
org.alfresco.module.org_alfresco_module_rm.hold.HoldService.getHold=RM.Read.0,AFTER_RM.FilterNode org.alfresco.module.org_alfresco_module_rm.hold.HoldService.getHold=RM.Read.0,AFTER_RM.FilterNode
org.alfresco.module.org_alfresco_module_rm.hold.HoldService.heldBy=RM.Read.0,AFTER_RM.FilterNode org.alfresco.module.org_alfresco_module_rm.hold.HoldService.heldBy=RM.Read.0,AFTER_RM.FilterNode
org.alfresco.module.org_alfresco_module_rm.hold.HoldService.getHeld=RM.Read.0,AFTER_RM.FilterNode org.alfresco.module.org_alfresco_module_rm.hold.HoldService.getHeld=RM.Read.0,AFTER_RM.FilterNode
org.alfresco.module.org_alfresco_module_rm.hold.HoldService.createHold=RM_CAP.0.rma:filePlanComponent.CreateHold org.alfresco.module.org_alfresco_module_rm.hold.HoldService.createHold=RM_CAP.0.rma:filePlanComponent.CreateHold
org.alfresco.module.org_alfresco_module_rm.hold.HoldService.getHoldReason=RM.Read.0 org.alfresco.module.org_alfresco_module_rm.hold.HoldService.getHoldReason=RM.Read.0
org.alfresco.module.org_alfresco_module_rm.hold.HoldService.setHoldReason=RM_CAP.0.rma:filePlanComponent.EditHold org.alfresco.module.org_alfresco_module_rm.hold.HoldService.setHoldReason=RM_CAP.0.rma:filePlanComponent.EditHold
org.alfresco.module.org_alfresco_module_rm.hold.HoldService.deleteHold=RM_CAP.0.rma:filePlanComponent.DeleteHold org.alfresco.module.org_alfresco_module_rm.hold.HoldService.deleteHold=RM_CAP.0.rma:filePlanComponent.DeleteHold
org.alfresco.module.org_alfresco_module_rm.hold.HoldService.addToHold=RM_CAP.0.rma:filePlanComponent.AddToHold org.alfresco.module.org_alfresco_module_rm.hold.HoldService.addToHold=RM_CAP.0.rma:filePlanComponent.AddToHold
org.alfresco.module.org_alfresco_module_rm.hold.HoldService.addToHolds=RM_ALLOW org.alfresco.module.org_alfresco_module_rm.hold.HoldService.addToHolds=RM_ALLOW
org.alfresco.module.org_alfresco_module_rm.hold.HoldService.removeFromHold=RM_CAP.0.rma:filePlanComponent.RemoveFromHold org.alfresco.module.org_alfresco_module_rm.hold.HoldService.removeFromHold=RM_CAP.0.rma:filePlanComponent.RemoveFromHold
org.alfresco.module.org_alfresco_module_rm.hold.HoldService.removeFromHolds=RM_ALLOW org.alfresco.module.org_alfresco_module_rm.hold.HoldService.removeFromHolds=RM_ALLOW
org.alfresco.module.org_alfresco_module_rm.hold.HoldService.removeFromAllHolds=RM_ALLOW org.alfresco.module.org_alfresco_module_rm.hold.HoldService.removeFromAllHolds=RM_ALLOW
org.alfresco.module.org_alfresco_module_rm.hold.HoldService.*=RM_DENY org.alfresco.module.org_alfresco_module_rm.hold.HoldService.*=RM_DENY
]]> ]]>
</value> </value>

View File

@@ -26,8 +26,7 @@
*/ */
package org.alfresco.module.org_alfresco_module_rm.model.rma.type; package org.alfresco.module.org_alfresco_module_rm.model.rma.type;
import java.util.Arrays; import java.security.InvalidParameterException;
import java.util.List;
import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
@@ -38,7 +37,6 @@ import org.alfresco.repo.policy.annotation.BehaviourBean;
import org.alfresco.repo.policy.annotation.BehaviourKind; import org.alfresco.repo.policy.annotation.BehaviourKind;
import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.QName;
import org.springframework.extensions.surf.util.I18NUtil; import org.springframework.extensions.surf.util.I18NUtil;
/** /**
@@ -52,7 +50,25 @@ public class TransferContainerType extends BaseBehaviourBean
implements NodeServicePolicies.OnCreateChildAssociationPolicy, NodeServicePolicies.OnCreateNodePolicy implements NodeServicePolicies.OnCreateChildAssociationPolicy, NodeServicePolicies.OnCreateNodePolicy
{ {
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_TRANSFER); private static final String BEHAVIOUR_NAME = "onCreateChildAssocsForTransferContainer";
/**
* 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();
}
/** /**
* On every event * On every event
@@ -61,11 +77,14 @@ public class TransferContainerType extends BaseBehaviourBean
* boolean) * boolean)
*/ */
@Override @Override
@Behaviour(kind = BehaviourKind.ASSOCIATION) @Behaviour
(
kind = BehaviourKind.ASSOCIATION,
name = BEHAVIOUR_NAME
)
public void onCreateChildAssociation(ChildAssociationRef childAssocRef, boolean bNew) public void onCreateChildAssociation(ChildAssociationRef childAssocRef, boolean bNew)
{ {
// check the created child is of an accepted type throw new InvalidParameterException("Operation failed. Creation is not allowed in Transfer Container");
validateNewChildAssociationSubTypesIncluded(childAssocRef.getChildRef(), ACCEPTED_NON_UNIQUE_CHILD_TYPES);
} }
@Override @Override

View File

@@ -41,6 +41,7 @@ import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
import org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService; import org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.model.rma.type.TransferContainerType;
import org.alfresco.module.org_alfresco_module_rm.record.RecordService; import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
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.util.ServiceBaseImpl; import org.alfresco.module.org_alfresco_module_rm.util.ServiceBaseImpl;
@@ -87,6 +88,8 @@ public class TransferServiceImpl extends ServiceBaseImpl
/** Freeze Service */ /** Freeze Service */
protected FreezeService freezeService; protected FreezeService freezeService;
protected TransferContainerType transferContainerType;
/** /**
* @param filePlanService file plan service * @param filePlanService file plan service
*/ */
@@ -127,6 +130,11 @@ public class TransferServiceImpl extends ServiceBaseImpl
this.freezeService = freezeService; this.freezeService = freezeService;
} }
public void setTransferContainerType(TransferContainerType transferContainerType)
{
this.transferContainerType = transferContainerType;
}
/** /**
* @see org.alfresco.module.org_alfresco_module_rm.transfer.TransferService#transfer(NodeRef, boolean) * @see org.alfresco.module.org_alfresco_module_rm.transfer.TransferService#transfer(NodeRef, boolean)
*/ */
@@ -164,12 +172,21 @@ public class TransferServiceImpl extends ServiceBaseImpl
} }
NodeRef transferContainer = filePlanService.getTransferContainer(root); NodeRef transferContainer = filePlanService.getTransferContainer(root);
transferNodeRef = nodeService.createNode(transferContainer,
ContentModel.ASSOC_CONTAINS,
QName.createQName(RM_URI, transferName),
TYPE_TRANSFER,
transferProps).getChildRef();
transferContainerType.disable();
try
{
transferNodeRef = nodeService.createNode(transferContainer,
ContentModel.ASSOC_CONTAINS,
QName.createQName(RM_URI, transferName),
TYPE_TRANSFER,
transferProps).getChildRef();
}
finally
{
transferContainerType.enable();
}
// Bind the hold node reference to the transaction // Bind the hold node reference to the transaction
AlfrescoTransactionSupport.bindResource(KEY_TRANSFER_NODEREF, transferNodeRef); AlfrescoTransactionSupport.bindResource(KEY_TRANSFER_NODEREF, transferNodeRef);
} }
@@ -253,12 +270,12 @@ public class TransferServiceImpl extends ServiceBaseImpl
{ {
throw new AlfrescoRuntimeException("Could not complete a transfer that contains held folders"); throw new AlfrescoRuntimeException("Could not complete a transfer that contains held folders");
} }
if(freezeService.hasFrozenChildren(assoc.getChildRef())) if(freezeService.hasFrozenChildren(assoc.getChildRef()))
{ {
throw new AlfrescoRuntimeException("Cound not complete a transfer that contains folders with held children"); throw new AlfrescoRuntimeException("Cound not complete a transfer that contains folders with held children");
} }
markComplete(assoc.getChildRef(), accessionIndicator, transferLocation); markComplete(assoc.getChildRef(), accessionIndicator, transferLocation);
} }

View File

@@ -413,10 +413,6 @@ public class RMNodesImpl extends NodesImpl implements RMNodes
{ {
throw new PermissionDeniedException("POST request not allowed in Transfer Folder."); throw new PermissionDeniedException("POST request not allowed in Transfer Folder.");
} }
else if(RecordsManagementModel.TYPE_TRANSFER_CONTAINER.equals(parentNodeRefType))
{
throw new PermissionDeniedException("POST request not allowed in Transfer Container.");
}
else if(RecordsManagementModel.TYPE_HOLD.equals(parentNodeRefType)) else if(RecordsManagementModel.TYPE_HOLD.equals(parentNodeRefType))
{ {
throw new PermissionDeniedException("POST request not allowed in Hold Folder."); throw new PermissionDeniedException("POST request not allowed in Hold Folder.");

View File

@@ -68,22 +68,4 @@ public class TransferContainerTypeUnitTest extends BaseUnitTest
when(mockedChildAssoc.getParentRef()).thenReturn(transferContainer); when(mockedChildAssoc.getParentRef()).thenReturn(transferContainer);
transferContainerType.onCreateChildAssociation(mockedChildAssoc, true); transferContainerType.onCreateChildAssociation(mockedChildAssoc, true);
} }
/**
* Given that we try to add "rma:transfer" type to transfer container,
* Then the operation is successful.
*/
@Test
public void testAddTransferFolderToTransferContainer()
{
QName type = AlfMock.generateQName();
when(mockedDictionaryService.isSubClass(type, TYPE_TRANSFER)).thenReturn(true);
NodeRef transferFolder= AlfMock.generateNodeRef(mockedNodeService, type);
NodeRef transferContainer = generateNodeRef(TYPE_TRANSFER_CONTAINER, true);
ChildAssociationRef mockedChildAssoc = mock(ChildAssociationRef.class);
when(mockedChildAssoc.getChildRef()).thenReturn(transferFolder);
when(mockedChildAssoc.getParentRef()).thenReturn(transferContainer);
transferContainerType.onCreateChildAssociation(mockedChildAssoc, true);
}
} }

View File

@@ -755,22 +755,6 @@ public class RMNodesImplUnitTest extends BaseUnitTest
rmNodesImpl.checkPostPermission(parentNodeRef.getId()); rmNodesImpl.checkPostPermission(parentNodeRef.getId());
} }
@Test
public void testCheckPostPermissionForTransferContainer() throws Exception
{
NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService);
when(mockedNodeService.getType(parentNodeRef)).thenReturn(RecordsManagementModel.TYPE_TRANSFER_CONTAINER);
try
{
rmNodesImpl.checkPostPermission(parentNodeRef.getId());
fail("Expected ecxeption as post should not be permitted on the Transfer Container");
}
catch(PermissionDeniedException ex)
{
assertEquals("POST request not allowed in Transfer Container.", ex.getMsgId());
}
}
@Test @Test
public void testCheckPostPermissionForTransferFolder() throws Exception public void testCheckPostPermissionForTransferFolder() throws Exception
{ {

View File

@@ -122,29 +122,6 @@ public class FileplanComponentChildrenRelationUnitTest extends BaseUnitTest
verify(mockedRMNodes, never()).createNode(parentNodeRef.getId(), nodeInfos.get(0), mockedParameters); verify(mockedRMNodes, never()).createNode(parentNodeRef.getId(), nodeInfos.get(0), mockedParameters);
} }
@Test
public void testCreateOnTransferContainer() throws Exception
{
Parameters mockedParameters = mock(Parameters.class);
NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService);
List<Node> nodeInfos = new ArrayList<Node>();
Node mokedNodeInfo = mock(Node.class);
nodeInfos.add(mokedNodeInfo);
Mockito.doThrow(new PermissionDeniedException("POST request not allowed in Transfer Container.")).when(mockedRMNodes).checkPostPermission(parentNodeRef.getId());
try
{
filePlanComponentChildrenRelation.create(parentNodeRef.getId(), nodeInfos, mockedParameters);
fail("Expected ecxeption as POST request is not allowed in Transfer Container.");
}
catch(PermissionDeniedException ex)
{
assertEquals("POST request not allowed in Transfer Container.", ex.getMsgId());
}
verify(mockedRMNodes, never()).createNode(parentNodeRef.getId(), nodeInfos.get(0), mockedParameters);
}
@Test @Test
public void testCreateOnHoldFolder() throws Exception public void testCreateOnHoldFolder() throws Exception
{ {
@@ -223,27 +200,6 @@ public class FileplanComponentChildrenRelationUnitTest extends BaseUnitTest
verify(mockedRMNodes, never()).upload(parentNodeRef.getId(), mockedFormData, mockedParameters); verify(mockedRMNodes, never()).upload(parentNodeRef.getId(), mockedFormData, mockedParameters);
} }
@Test
public void testUploadOnTransferContainer() throws Exception
{
Parameters mockedParameters = mock(Parameters.class);
NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService);
FormData mockedFormData = mock(FormData.class);
WithResponse mockedWithResponse = mock(WithResponse.class);
Mockito.doThrow(new PermissionDeniedException("POST request not allowed in Transfer Container.")).when(mockedRMNodes).checkPostPermission(parentNodeRef.getId());
try
{
filePlanComponentChildrenRelation.create(parentNodeRef.getId(), mockedFormData, mockedParameters, mockedWithResponse);
fail("Expected ecxeption as POST request is not allowed in Transfer Container.");
}
catch(PermissionDeniedException ex)
{
assertEquals("POST request not allowed in Transfer Container.", ex.getMsgId());
}
verify(mockedRMNodes, never()).upload(parentNodeRef.getId(), mockedFormData, mockedParameters);
}
@Test @Test
public void testUploadOnHoldFolder() throws Exception public void testUploadOnHoldFolder() throws Exception
{ {