RM-1315: Manage Permissions is not working for folder inside Holds/Unfiled Records

* unit tests to show unfiled and holds permissions working correctly
 * fixed issues exposed by above
 * minor refactor for FilePlanPermissionService implementation to reduce complexity
 * added unit test execution to local build target



git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/HEAD@66102 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Roy Wetherall
2014-04-01 23:53:16 +00:00
parent c7facab5a9
commit 09648f9829
10 changed files with 478 additions and 180 deletions

View File

@@ -139,6 +139,8 @@ public interface FilePlanService
NodeRef createUnfiledContainer(NodeRef filePlan);
/**
* Gets the hold container for a given file plan. Returns
* null if none.
*
* @param filePlan
* @return

View File

@@ -30,8 +30,6 @@ import java.util.Set;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
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.role.FilePlanRoleService;
import org.alfresco.module.org_alfresco_module_rm.security.ExtendedReaderDynamicAuthority;
@@ -41,7 +39,6 @@ import org.alfresco.module.org_alfresco_module_rm.util.ServiceBaseImpl;
import org.alfresco.repo.domain.node.NodeDAO;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.cmr.site.SiteInfo;
@@ -51,9 +48,6 @@ import org.alfresco.service.namespace.QName;
import org.alfresco.service.namespace.RegexQNamePattern;
import org.alfresco.util.Pair;
import org.alfresco.util.ParameterCheck;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.extensions.surf.util.I18NUtil;
/**
@@ -63,9 +57,7 @@ import org.springframework.extensions.surf.util.I18NUtil;
* @since 2.1
*/
public class FilePlanServiceImpl extends ServiceBaseImpl
implements FilePlanService,
RecordsManagementModel,
ApplicationContextAware
implements FilePlanService
{
/** I18N */
private final static String MSG_DUP_ROOT = "rm.service.dup-root";
@@ -85,18 +77,6 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
/** RM site file plan container */
private static final String FILE_PLAN_CONTAINER = "documentLibrary";
/** Application context */
private ApplicationContext applicationContext;
/**
* @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
{
this.applicationContext = applicationContext;
}
/**
* NOTE: for some reason spring couldn't cope with the circular references between these two
* beans so we need to grab this one manually.
@@ -124,14 +104,6 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
return (NodeDAO)applicationContext.getBean("nodeDAO");
}
/**
* @return internal node service
*/
protected NodeService getInternalNodeService()
{
return (NodeService)applicationContext.getBean("nodeService");
}
/**
* @return site service
*/
@@ -140,14 +112,6 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
return (SiteService)applicationContext.getBean("SiteService");
}
/**
* @return record service
*/
protected RecordService getRecordService()
{
return (RecordService)applicationContext.getBean("RecordService");
}
/**
* @return record folder service
*/
@@ -164,20 +128,6 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
return (TransferService)applicationContext.getBean("RmTransferService");
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#isFilePlanComponent(org.alfresco.service.cmr.repository.NodeRef)
*/
public boolean isFilePlanComponent(NodeRef nodeRef)
{
boolean result = false;
if (getInternalNodeService().exists(nodeRef) &&
getInternalNodeService().hasAspect(nodeRef, ASPECT_FILE_PLAN_COMPONENT))
{
result = true;
}
return result;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getFilePlanComponentKind(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -201,7 +151,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
result = FilePlanComponentKind.RECORD_FOLDER;
}
else if (getRecordService().isRecord(nodeRef))
else if (isRecord(nodeRef))
{
result = FilePlanComponentKind.RECORD;
}
@@ -277,15 +227,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
}
return result;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#isFilePlan(org.alfresco.service.cmr.repository.NodeRef)
*/
public boolean isFilePlan(NodeRef nodeRef)
{
return instanceOf(nodeRef, TYPE_FILE_PLAN);
}
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getFilePlans()
@@ -470,25 +412,18 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
containerType,
properties).getChildRef();
// if (!inheritPermissions)
// {
// set inheritance to false
getPermissionService().setInheritParentPermissions(container, false);
getPermissionService().setPermission(container, allRoles, RMPermissionModel.READ_RECORDS, true);
getPermissionService().setPermission(container, ExtendedReaderDynamicAuthority.EXTENDED_READER, RMPermissionModel.READ_RECORDS, true);
getPermissionService().setPermission(container, ExtendedWriterDynamicAuthority.EXTENDED_WRITER, RMPermissionModel.FILING, true);
getPermissionService().setPermission(container, "Administrator", RMPermissionModel.FILING, true);
// TODO set the admin users to have filing permissions on the unfiled container!!!
// TODO we will need to be able to get a list of the admin roles from the service
// }
// else
// {
// just inherit eveything
// TODO will change this when we are able to set permissions on holds and transfers!
// getPermissionService().setInheritParentPermissions(container, true);
// }
// set inheritance to false
getPermissionService().setInheritParentPermissions(container, false);
// give all roles read permissions on the container by default
getPermissionService().setPermission(container, allRoles, RMPermissionModel.READ_RECORDS, true);
// setup the extended reader permissions
getPermissionService().setPermission(container, ExtendedReaderDynamicAuthority.EXTENDED_READER, RMPermissionModel.READ_RECORDS, true);
getPermissionService().setPermission(container, ExtendedWriterDynamicAuthority.EXTENDED_WRITER, RMPermissionModel.FILING, true);
// setup the administrator permissions
getPermissionService().setPermission(container, "Administrator", RMPermissionModel.FILING, true);
return container;
}
@@ -605,23 +540,6 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
}
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#isFilePlanContainer(org.alfresco.service.cmr.repository.NodeRef)
*/
@Override
public boolean isFilePlanContainer(NodeRef nodeRef)
{
return instanceOf(nodeRef, TYPE_RECORDS_MANAGEMENT_CONTAINER);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#isRecordCategory(org.alfresco.service.cmr.repository.NodeRef)
*/
public boolean isRecordCategory(NodeRef nodeRef)
{
return instanceOf(nodeRef, TYPE_RECORD_CATEGORY);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#createRecordCategory(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, org.alfresco.service.namespace.QName, java.util.Map)
*/

View File

@@ -25,10 +25,6 @@ import java.util.Set;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel;
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
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.util.ServiceBaseImpl;
import org.alfresco.repo.node.NodeServicePolicies;
import org.alfresco.repo.policy.Behaviour.NotificationFrequency;
@@ -37,7 +33,6 @@ import org.alfresco.repo.policy.PolicyComponent;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.security.AccessPermission;
import org.alfresco.service.cmr.security.AccessStatus;
import org.alfresco.service.cmr.security.PermissionService;
@@ -54,8 +49,7 @@ import org.apache.commons.logging.LogFactory;
* @since 2.1
*/
public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
implements FilePlanPermissionService,
RecordsManagementModel
implements FilePlanPermissionService
{
/** Permission service */
protected PermissionService permissionService;
@@ -63,15 +57,6 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
/** Policy component */
protected PolicyComponent policyComponent;
/** File plan service */
protected FilePlanService filePlanService;
/** Record service */
protected RecordService recordService;
/** Record folder service */
protected RecordFolderService recordFolderService;
/** Logger */
protected static Log logger = LogFactory.getLog(FilePlanPermissionServiceImpl.class);
@@ -110,14 +95,6 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
this.permissionService = permissionService;
}
/**
* @param nodeService node service
*/
public void setNodeService(NodeService nodeService)
{
this.nodeService = nodeService;
}
/**
* @param policyComponent policy component
*/
@@ -126,30 +103,6 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
this.policyComponent = policyComponent;
}
/**
* @param filePlanService file plan service
*/
public void setFilePlanService(FilePlanService filePlanService)
{
this.filePlanService = filePlanService;
}
/**
* @param recordService record service
*/
public void setRecordService(RecordService recordService)
{
this.recordService = recordService;
}
/**
* @param recordFolderService record folder service
*/
public void setRecordFolderService(RecordFolderService recordFolderService)
{
this.recordFolderService = recordFolderService;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.security.FilePlanPermissionService#setupRecordCategoryPermissions(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -175,7 +128,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
{
public Object doWork()
{
boolean fillingOnly = filePlanService.isFilePlan(parentNodeRef);
boolean fillingOnly = isFilePlan(parentNodeRef);
// since this is not a root category, inherit from parent
Set<AccessPermission> perms = permissionService.getAllSetPermissions(parentNodeRef);
@@ -258,7 +211,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
*/
public void onAddRecord(final NodeRef record, final QName aspectTypeQName)
{
AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork<Object>()
runAs(new AuthenticationUtil.RunAsWork<Object>()
{
public Object doWork()
{
@@ -412,7 +365,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
{
if (nodeService.exists(nodeRef))
{
AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork<Object>()
runAs(new AuthenticationUtil.RunAsWork<Object>()
{
public Object doWork()
{
@@ -438,17 +391,18 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
ParameterCheck.mandatory("authority", authority);
ParameterCheck.mandatory("permission", permission);
AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork<Object>()
runAsSystem(new AuthenticationUtil.RunAsWork<Object>()
{
public Boolean doWork() throws Exception
{
if (filePlanService.isFilePlan(nodeRef))
if (isFilePlan(nodeRef))
{
setPermissionDown(nodeRef, authority, permission);
}
else if (filePlanService.isFilePlanContainer(nodeRef) ||
recordFolderService.isRecordFolder(nodeRef) ||
recordService.isRecord(nodeRef))
else if (isFilePlanContainer(nodeRef) ||
isRecordFolder(nodeRef) ||
isRecord(nodeRef) ||
isHold(nodeRef))
{
setReadPermissionUp(nodeRef, authority);
setPermissionDown(nodeRef, authority, permission);
@@ -463,7 +417,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
return null;
}
}, AuthenticationUtil.getSystemUserName());
});
}
/**
@@ -475,7 +429,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
private void setReadPermissionUp(NodeRef nodeRef, String authority)
{
NodeRef parent = nodeService.getPrimaryParent(nodeRef).getParentRef();
if (parent != null && filePlanService.isFilePlanComponent(parent))
if (parent != null && isFilePlanComponent(parent))
{
setReadPermissionUpImpl(parent, authority);
}
@@ -492,7 +446,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
setPermissionImpl(nodeRef, authority, RMPermissionModel.READ_RECORDS);
NodeRef parent = nodeService.getPrimaryParent(nodeRef).getParentRef();
if (parent != null && filePlanService.isFilePlanComponent(parent))
if (parent != null && isFilePlanComponent(parent))
{
setReadPermissionUpImpl(parent, authority);
}
@@ -513,17 +467,17 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
// set permissions
setPermissionImpl(nodeRef, authority, permission);
if (filePlanService.isFilePlanContainer(nodeRef) ||
recordFolderService.isRecordFolder(nodeRef))
if (isFilePlanContainer(nodeRef) ||
isRecordFolder(nodeRef))
{
List<ChildAssociationRef> assocs = nodeService.getChildAssocs(nodeRef, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL);
for (ChildAssociationRef assoc : assocs)
{
NodeRef child = assoc.getChildRef();
if (filePlanService.isFilePlanContainer(child) ||
recordFolderService.isRecordFolder(child) ||
recordService.isRecord(child) ||
instanceOf(child, TYPE_HOLD) ||
if (isFilePlanContainer(child) ||
isRecordFolder(child) ||
isRecord(child) ||
isHold(child) ||
instanceOf(child, TYPE_TRANSFER))
{
setPermissionDown(child, authority, permission);
@@ -556,7 +510,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
*/
public void deletePermission(final NodeRef nodeRef, final String authority, final String permission)
{
AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork<Object>()
runAsSystem(new AuthenticationUtil.RunAsWork<Object>()
{
public Boolean doWork() throws Exception
{
@@ -566,17 +520,17 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
// Delete permission on this node
permissionService.deletePermission(nodeRef, authority, permission);
if (filePlanService.isFilePlanContainer(nodeRef) ||
recordFolderService.isRecordFolder(nodeRef))
if (isFilePlanContainer(nodeRef) ||
isRecordFolder(nodeRef))
{
List<ChildAssociationRef> assocs = nodeService.getChildAssocs(nodeRef, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL);
for (ChildAssociationRef assoc : assocs)
{
NodeRef child = assoc.getChildRef();
if (filePlanService.isFilePlanContainer(child) ||
recordFolderService.isRecordFolder(child) ||
recordService.isRecord(child)||
instanceOf(child, TYPE_HOLD) ||
if (isFilePlanContainer(child) ||
isRecordFolder(child) ||
isRecord(child)||
isHold(child) ||
instanceOf(child, TYPE_TRANSFER))
{
deletePermission(child, authority, permission);
@@ -587,6 +541,6 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
return null;
}
}, AuthenticationUtil.getSystemUserName());
});
}
}

View File

@@ -31,6 +31,9 @@ import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.ParameterCheck;
import org.alfresco.util.PropertyMap;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
/**
* Helper base class for service implementations.
@@ -38,13 +41,25 @@ import org.alfresco.util.PropertyMap;
* @author Roy Wetherall
* @since 2.1
*/
public class ServiceBaseImpl implements RecordsManagementModel
public class ServiceBaseImpl implements RecordsManagementModel, ApplicationContextAware
{
/** Node service */
protected NodeService nodeService;
/** Dictionary service */
protected DictionaryService dictionaryService;
/** Application context */
protected ApplicationContext applicationContext;
/**
* @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
{
this.applicationContext = applicationContext;
}
/**
* @param nodeService node service
@@ -61,6 +76,60 @@ public class ServiceBaseImpl implements RecordsManagementModel
{
this.dictionaryService = dictionaryService;
}
/**
* Indicates whether the given node is a file plan component or not.
* <p>
* Exposed in the FilePlan service.
*
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#isFilePlanComponent(org.alfresco.service.cmr.repository.NodeRef)
*/
public boolean isFilePlanComponent(NodeRef nodeRef)
{
boolean result = false;
// use the internal node service to prevent redirection of security checking.
NodeService myNodeService = (NodeService)applicationContext.getBean("nodeService");
if (myNodeService.exists(nodeRef) &&
myNodeService.hasAspect(nodeRef, ASPECT_FILE_PLAN_COMPONENT))
{
result = true;
}
return result;
}
/**
* Indicates whether the given node is a file plan or not.
* <p>
* Exposed in the FilePlan service.
*
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#isFilePlan(org.alfresco.service.cmr.repository.NodeRef)
*/
public boolean isFilePlan(NodeRef nodeRef)
{
return instanceOf(nodeRef, TYPE_FILE_PLAN);
}
/**
* Indicates whether the given node is a file plan container or not.
*
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#isFilePlanContainer(org.alfresco.service.cmr.repository.NodeRef)
*/
public boolean isFilePlanContainer(NodeRef nodeRef)
{
return instanceOf(nodeRef, TYPE_RECORDS_MANAGEMENT_CONTAINER);
}
/**
* Indicates whether the given node is a record category or not.
*
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#isRecordCategory(org.alfresco.service.cmr.repository.NodeRef)
*/
public boolean isRecordCategory(NodeRef nodeRef)
{
return instanceOf(nodeRef, TYPE_RECORD_CATEGORY);
}
/**
* Indicates whether the given node is a record folder or not.