RM-2396 (Upload record via WebDAV fails with org.alfresco.repo.security.permissions.AccessDeniedException)

This commit is contained in:
Tuna Aksoy
2017-03-12 21:00:19 +00:00
parent 5acdf861cf
commit 92f0e5bff0

View File

@@ -30,7 +30,9 @@ package org.alfresco.module.org_alfresco_module_rm.record;
import static com.google.common.collect.Lists.newArrayList; import static com.google.common.collect.Lists.newArrayList;
import static org.alfresco.repo.policy.Behaviour.NotificationFrequency.FIRST_EVENT; import static org.alfresco.repo.policy.Behaviour.NotificationFrequency.FIRST_EVENT;
import static org.alfresco.repo.policy.Behaviour.NotificationFrequency.TRANSACTION_COMMIT;
import static org.alfresco.repo.policy.annotation.BehaviourKind.ASSOCIATION; import static org.alfresco.repo.policy.annotation.BehaviourKind.ASSOCIATION;
import static org.apache.commons.lang.StringUtils.isNotBlank;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
@@ -72,6 +74,7 @@ import org.alfresco.module.org_alfresco_module_rm.role.Role;
import org.alfresco.module.org_alfresco_module_rm.security.ExtendedSecurityService; import org.alfresco.module.org_alfresco_module_rm.security.ExtendedSecurityService;
import org.alfresco.module.org_alfresco_module_rm.version.RecordableVersionModel; import org.alfresco.module.org_alfresco_module_rm.version.RecordableVersionModel;
import org.alfresco.module.org_alfresco_module_rm.version.RecordableVersionService; import org.alfresco.module.org_alfresco_module_rm.version.RecordableVersionService;
import org.alfresco.repo.content.ContentServicePolicies;
import org.alfresco.repo.node.NodeServicePolicies; import org.alfresco.repo.node.NodeServicePolicies;
import org.alfresco.repo.policy.ClassPolicyDelegate; import org.alfresco.repo.policy.ClassPolicyDelegate;
import org.alfresco.repo.policy.PolicyComponent; import org.alfresco.repo.policy.PolicyComponent;
@@ -126,8 +129,8 @@ public class RecordServiceImpl extends BaseBehaviourBean
RecordsManagementModel, RecordsManagementModel,
RecordsManagementCustomModel, RecordsManagementCustomModel,
NodeServicePolicies.OnCreateChildAssociationPolicy, NodeServicePolicies.OnCreateChildAssociationPolicy,
NodeServicePolicies.OnRemoveAspectPolicy, NodeServicePolicies.OnUpdatePropertiesPolicy,
NodeServicePolicies.OnUpdatePropertiesPolicy ContentServicePolicies.OnContentUpdatePolicy
{ {
/** Logger */ /** Logger */
private static Log logger = LogFactory.getLog(RecordServiceImpl.class); private static Log logger = LogFactory.getLog(RecordServiceImpl.class);
@@ -399,56 +402,6 @@ public class RecordServiceImpl extends BaseBehaviourBean
onFileRecord = policyComponent.registerClassPolicy(OnFileRecord.class); onFileRecord = policyComponent.registerClassPolicy(OnFileRecord.class);
} }
/**
* @see org.alfresco.repo.node.NodeServicePolicies.OnRemoveAspectPolicy#onRemoveAspect(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.namespace.QName)
*/
@Override
@Behaviour
(
kind = BehaviourKind.CLASS,
type = "sys:noContent"
)
public void onRemoveAspect(NodeRef nodeRef, QName aspect)
{
if (nodeService.hasAspect(nodeRef, ASPECT_RECORD) && !nodeService.hasAspect(nodeRef, ContentModel.ASPECT_HIDDEN))
{
// get the record id
String recordId = (String) nodeService.getProperty(nodeRef, PROP_IDENTIFIER);
// get the record name
String name = (String) nodeService.getProperty(nodeRef, ContentModel.PROP_NAME);
// rename the record
int dotIndex = name.lastIndexOf('.');
String prefix = name;
String postfix = "";
if (dotIndex > 0)
{
prefix = name.substring(0, dotIndex);
postfix = name.substring(dotIndex);
}
String recordName = prefix + " (" + recordId + ")" + postfix;
behaviourFilter.disableBehaviour();
try
{
fileFolderService.rename(nodeRef, recordName);
}
catch (FileNotFoundException e)
{
throw new AlfrescoRuntimeException("Unable to make record, because rename failed.", e);
}
finally
{
behaviourFilter.enableBehaviour();
}
if (logger.isDebugEnabled())
{
logger.debug("Rename " + name + " to " + recordName);
}
}
}
/** /**
* Behaviour executed when a new item is added to a record folder. * Behaviour executed when a new item is added to a record folder.
* *
@@ -853,6 +806,7 @@ public class RecordServiceImpl extends BaseBehaviourBean
// make the document a record // make the document a record
makeRecord(nodeRef); makeRecord(nodeRef);
renameRecord(nodeRef);
if (latestVersionRecord != null) if (latestVersionRecord != null)
{ {
@@ -948,6 +902,7 @@ public class RecordServiceImpl extends BaseBehaviourBean
// make record // make record
makeRecord(record); makeRecord(record);
renameRecord(record);
// remove added copy assocs // remove added copy assocs
List<AssociationRef> recordAssocs = nodeService.getTargetAssocs(record, ContentModel.ASSOC_ORIGINAL); List<AssociationRef> recordAssocs = nodeService.getTargetAssocs(record, ContentModel.ASSOC_ORIGINAL);
@@ -1082,6 +1037,7 @@ public class RecordServiceImpl extends BaseBehaviourBean
{ {
// make record // make record
makeRecord(record); makeRecord(record);
renameRecord(record);
} }
return record; return record;
@@ -1129,6 +1085,11 @@ public class RecordServiceImpl extends BaseBehaviourBean
// remove the owner // remove the owner
ownableService.setOwner(document, OwnableService.NO_OWNER); ownableService.setOwner(document, OwnableService.NO_OWNER);
if (TYPE_NON_ELECTRONIC_DOCUMENT.equals(nodeService.getType(document)))
{
renameRecord(document);
}
} }
finally finally
{ {
@@ -1712,5 +1673,53 @@ public class RecordServiceImpl extends BaseBehaviourBean
// can only unlink a record from a record folder // can only unlink a record from a record folder
throw new RecordLinkRuntimeException("Can only unlink a record from a record folder."); throw new RecordLinkRuntimeException("Can only unlink a record from a record folder.");
} }
} }
/*
* @see org.alfresco.repo.content.ContentServicePolicies.OnContentUpdatePolicy#onContentUpdate(org.alfresco.service.cmr.repository.NodeRef, boolean)
*/
@Override
@Behaviour
(
kind = BehaviourKind.CLASS,
type = "rma:record",
notificationFrequency = TRANSACTION_COMMIT
)
public void onContentUpdate(NodeRef nodeRef, boolean newContent)
{
if (!nodeService.hasAspect(nodeRef, ContentModel.ASPECT_HIDDEN))
{
renameRecord(nodeRef);
}
}
private void renameRecord(NodeRef nodeRef)
{
// get the record id
String recordId = (String) nodeService.getProperty(nodeRef, PROP_IDENTIFIER);
if (isNotBlank(recordId))
{
// get the record name
String name = (String) nodeService.getProperty(nodeRef, ContentModel.PROP_NAME);
// rename the record
int dotIndex = name.lastIndexOf('.');
String prefix = name;
String postfix = "";
if (dotIndex > 0)
{
prefix = name.substring(0, dotIndex);
postfix = name.substring(dotIndex);
}
String recordName = prefix + " (" + recordId + ")" + postfix;
nodeService.setProperty(nodeRef, ContentModel.PROP_NAME, recordName);
if (logger.isDebugEnabled())
{
logger.debug("Rename " + name + " to " + recordName);
}
}
}
} }