mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-31 17:39:05 +00:00
RM-1757: Record is not renamed when filed by rule
git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/HEAD@90353 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -1102,6 +1102,7 @@
|
||||
org.alfresco.module.org_alfresco_module_rm.record.RecordService.isFiled=RM.Read.0
|
||||
org.alfresco.module.org_alfresco_module_rm.record.RecordService.createRecord=RM_ALLOW
|
||||
org.alfresco.module.org_alfresco_module_rm.record.RecordService.createRecordFromContent=RM.Create.0
|
||||
org.alfresco.module.org_alfresco_module_rm.record.RecordService.createRecordFromCopy=RM_ALLOW
|
||||
org.alfresco.module.org_alfresco_module_rm.record.RecordService.file=RM_ALLOW
|
||||
org.alfresco.module.org_alfresco_module_rm.record.RecordService.isPropertyEditable=RM.Read.0
|
||||
org.alfresco.module.org_alfresco_module_rm.record.RecordService.isMetadataStub=RM.Read.0
|
||||
|
@@ -15,12 +15,9 @@
|
||||
<!-- extended version service bean definition -->
|
||||
<bean id="rm.versionService" abstract="true" class="org.alfresco.module.org_alfresco_module_rm.version.RecordableVersionServiceImpl">
|
||||
<property name="filePlanService" ref="FilePlanService" />
|
||||
<property name="fileFolderService" ref="fileFolderService" />
|
||||
<property name="extendedPermissionService" ref="ExtendedPermissionService" />
|
||||
<property name="ownableService" ref="OwnableService" />
|
||||
<property name="extendedSecurityService" ref="ExtendedSecurityService" />
|
||||
<property name="authenticationUtil" ref="rm.authenticationUtil" />
|
||||
<property name="relationshipService" ref="RelationshipService" />
|
||||
<property name="recordService" ref="RecordService" />
|
||||
</bean>
|
||||
<bean class="org.alfresco.util.BeanExtender">
|
||||
<property name="beanName" value="versionService" />
|
||||
|
@@ -165,6 +165,14 @@ public interface RecordService
|
||||
*/
|
||||
void createRecord(NodeRef filePlan, NodeRef nodeRef);
|
||||
|
||||
/**
|
||||
* Creates a record from a copy of the node reference provided.
|
||||
*
|
||||
* @param filePlan file plan
|
||||
* @param nodeRef node reference
|
||||
*/
|
||||
NodeRef createRecordFromCopy(NodeRef filePlan, NodeRef nodeRef);
|
||||
|
||||
/**
|
||||
* Creates a new document in the unfiled records container if the given node reference is a file plan
|
||||
* node reference otherwise the node reference will be used as the destination for the new record.
|
||||
|
@@ -77,7 +77,9 @@ import org.alfresco.service.cmr.dictionary.ClassDefinition;
|
||||
import org.alfresco.service.cmr.dictionary.PropertyDefinition;
|
||||
import org.alfresco.service.cmr.model.FileExistsException;
|
||||
import org.alfresco.service.cmr.model.FileFolderService;
|
||||
import org.alfresco.service.cmr.model.FileInfo;
|
||||
import org.alfresco.service.cmr.model.FileNotFoundException;
|
||||
import org.alfresco.service.cmr.repository.AssociationRef;
|
||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||
import org.alfresco.service.cmr.repository.ContentData;
|
||||
import org.alfresco.service.cmr.repository.ContentReader;
|
||||
@@ -849,6 +851,9 @@ public class RecordServiceImpl extends BaseBehaviourBean
|
||||
// get the documents primary parent assoc
|
||||
ChildAssociationRef parentAssoc = nodeService.getPrimaryParent(nodeRef);
|
||||
|
||||
// get the latest version record, if there is one
|
||||
NodeRef latestVersionRecord = getLatestVersionRecord(nodeRef);
|
||||
|
||||
behaviourFilter.disableBehaviour();
|
||||
try
|
||||
{
|
||||
@@ -867,9 +872,6 @@ public class RecordServiceImpl extends BaseBehaviourBean
|
||||
aspectProperties.put(PROP_RECORD_ORIGINATING_CREATION_DATE, new Date());
|
||||
nodeService.addAspect(nodeRef, ASPECT_RECORD_ORIGINATING_DETAILS, aspectProperties);
|
||||
|
||||
// get the latest version record, if there is one
|
||||
NodeRef latestVersionRecord = getLatestVersionRecord(nodeRef);
|
||||
|
||||
// make the document a record
|
||||
makeRecord(nodeRef);
|
||||
|
||||
@@ -918,6 +920,92 @@ public class RecordServiceImpl extends BaseBehaviourBean
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#createRecordFromCopy(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.repository.NodeRef)
|
||||
*/
|
||||
@Override
|
||||
public NodeRef createRecordFromCopy(final NodeRef filePlan, final NodeRef nodeRef)
|
||||
{
|
||||
return authenticationUtil.runAsSystem(new RunAsWork<NodeRef>()
|
||||
{
|
||||
public NodeRef doWork() throws Exception
|
||||
{
|
||||
// get the unfiled record folder
|
||||
final NodeRef unfiledRecordFolder = filePlanService.getUnfiledContainer(filePlan);
|
||||
|
||||
// get the documents readers
|
||||
Long aclId = nodeService.getNodeAclId(nodeRef);
|
||||
Set<String> readers = extendedPermissionService.getReaders(aclId);
|
||||
Set<String> writers = extendedPermissionService.getWriters(aclId);
|
||||
|
||||
// add the current owner to the list of extended writers
|
||||
Set<String> modifiedWrtiers = new HashSet<String>(writers);
|
||||
if (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_OWNABLE))
|
||||
{
|
||||
String owner = ownableService.getOwner(nodeRef);
|
||||
if (owner != null && !owner.isEmpty() && !owner.equals(OwnableService.NO_OWNER))
|
||||
{
|
||||
modifiedWrtiers.add(owner);
|
||||
}
|
||||
}
|
||||
|
||||
// add the current user as extended writer
|
||||
modifiedWrtiers.add(authenticationUtil.getFullyAuthenticatedUser());
|
||||
|
||||
// copy version state and create record
|
||||
NodeRef record = null;
|
||||
try
|
||||
{
|
||||
List<AssociationRef> originalAssocs = null;
|
||||
if (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_COPIEDFROM))
|
||||
{
|
||||
// take a note of any copyFrom information already on the node
|
||||
originalAssocs = nodeService.getTargetAssocs(nodeRef, ContentModel.ASSOC_ORIGINAL);
|
||||
}
|
||||
|
||||
// create a copy of the original state and add it to the unfiled record container
|
||||
FileInfo recordInfo = fileFolderService.copy(nodeRef, unfiledRecordFolder, null);
|
||||
record = recordInfo.getNodeRef();
|
||||
|
||||
// make record
|
||||
makeRecord(record);
|
||||
|
||||
// remove added copy assocs
|
||||
List<AssociationRef> recordAssocs = nodeService.getTargetAssocs(record, ContentModel.ASSOC_ORIGINAL);
|
||||
for (AssociationRef recordAssoc : recordAssocs)
|
||||
{
|
||||
nodeService.removeAssociation(
|
||||
recordAssoc.getSourceRef(),
|
||||
recordAssoc.getTargetRef(),
|
||||
ContentModel.ASSOC_ORIGINAL);
|
||||
}
|
||||
|
||||
// re-add origional assocs or remove aspect
|
||||
if (originalAssocs == null)
|
||||
{
|
||||
nodeService.removeAspect(record, ContentModel.ASPECT_COPIEDFROM);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (AssociationRef originalAssoc : originalAssocs)
|
||||
{
|
||||
nodeService.createAssociation(originalAssoc.getSourceRef(), originalAssoc.getTargetRef(), ContentModel.ASSOC_ORIGINAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (FileNotFoundException e)
|
||||
{
|
||||
throw new AlfrescoRuntimeException("Can't create recorded version, because copy fails.", e);
|
||||
}
|
||||
|
||||
// set extended security on record
|
||||
extendedSecurityService.addExtendedSecurity(record, readers, writers);
|
||||
|
||||
return record;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper to get the latest version record for a given document (ie non-record)
|
||||
*
|
||||
|
@@ -24,30 +24,21 @@ import java.io.Serializable;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.alfresco.error.AlfrescoRuntimeException;
|
||||
import org.alfresco.model.ContentModel;
|
||||
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
|
||||
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
|
||||
import org.alfresco.module.org_alfresco_module_rm.relationship.RelationshipService;
|
||||
import org.alfresco.module.org_alfresco_module_rm.security.ExtendedSecurityService;
|
||||
import org.alfresco.module.org_alfresco_module_rm.util.AuthenticationUtil;
|
||||
import org.alfresco.repo.policy.PolicyScope;
|
||||
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
|
||||
import org.alfresco.repo.security.permissions.impl.ExtendedPermissionService;
|
||||
import org.alfresco.repo.version.Version2Model;
|
||||
import org.alfresco.repo.version.Version2ServiceImpl;
|
||||
import org.alfresco.repo.version.VersionModel;
|
||||
import org.alfresco.service.cmr.model.FileFolderService;
|
||||
import org.alfresco.service.cmr.model.FileInfo;
|
||||
import org.alfresco.service.cmr.model.FileNotFoundException;
|
||||
import org.alfresco.service.cmr.repository.AssociationRef;
|
||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.security.OwnableService;
|
||||
import org.alfresco.service.cmr.version.ReservedVersionNameException;
|
||||
import org.alfresco.service.cmr.version.Version;
|
||||
import org.alfresco.service.cmr.version.VersionHistory;
|
||||
@@ -77,25 +68,16 @@ public class RecordableVersionServiceImpl extends Version2ServiceImpl
|
||||
public static final String PROP_VERSION_RECORD = "RecordVersion";
|
||||
|
||||
/** file plan service */
|
||||
protected FilePlanService filePlanService;
|
||||
|
||||
/** file folder service */
|
||||
protected FileFolderService fileFolderService;
|
||||
|
||||
/** extended permission service */
|
||||
protected ExtendedPermissionService extendedPermissionService;
|
||||
|
||||
/** ownable service */
|
||||
protected OwnableService ownableService;
|
||||
|
||||
/** extended security service */
|
||||
protected ExtendedSecurityService extendedSecurityService;
|
||||
private FilePlanService filePlanService;
|
||||
|
||||
/** authentication util helper */
|
||||
protected AuthenticationUtil authenticationUtil;
|
||||
private AuthenticationUtil authenticationUtil;
|
||||
|
||||
/** relationship service */
|
||||
protected RelationshipService relationshipService;
|
||||
private RelationshipService relationshipService;
|
||||
|
||||
/** record service */
|
||||
private RecordService recordService;
|
||||
|
||||
/**
|
||||
* @param filePlanService file plan service
|
||||
@@ -105,38 +87,6 @@ public class RecordableVersionServiceImpl extends Version2ServiceImpl
|
||||
this.filePlanService = filePlanService;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param fileFolderService file folder service
|
||||
*/
|
||||
public void setFileFolderService(FileFolderService fileFolderService)
|
||||
{
|
||||
this.fileFolderService = fileFolderService;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param extendedPermissionService extended permission service
|
||||
*/
|
||||
public void setExtendedPermissionService(ExtendedPermissionService extendedPermissionService)
|
||||
{
|
||||
this.extendedPermissionService = extendedPermissionService;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ownableService ownable service
|
||||
*/
|
||||
public void setOwnableService(OwnableService ownableService)
|
||||
{
|
||||
this.ownableService = ownableService;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param extendedSecurityService extended security service
|
||||
*/
|
||||
public void setExtendedSecurityService(ExtendedSecurityService extendedSecurityService)
|
||||
{
|
||||
this.extendedSecurityService = extendedSecurityService;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param authenticationUtil authentication util helper
|
||||
*/
|
||||
@@ -153,6 +103,14 @@ public class RecordableVersionServiceImpl extends Version2ServiceImpl
|
||||
this.relationshipService = relationshipService;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param recordService record service
|
||||
*/
|
||||
public void setRecordService(RecordService recordService)
|
||||
{
|
||||
this.recordService = recordService;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.alfresco.repo.version.Version2ServiceImpl#createVersion(org.alfresco.service.cmr.repository.NodeRef, java.util.Map, int)
|
||||
*/
|
||||
@@ -329,7 +287,7 @@ public class RecordableVersionServiceImpl extends Version2ServiceImpl
|
||||
final NodeRef nodeRef = (NodeRef)standardVersionProperties.get(Version2Model.PROP_QNAME_FROZEN_NODE_REF);
|
||||
|
||||
// create record
|
||||
final NodeRef record = createRecord(nodeRef, filePlan);
|
||||
final NodeRef record = recordService.createRecordFromCopy(filePlan, nodeRef);
|
||||
|
||||
// apply version record aspect to record
|
||||
PropertyMap versionRecordProps = new PropertyMap(3);
|
||||
@@ -441,92 +399,6 @@ public class RecordableVersionServiceImpl extends Version2ServiceImpl
|
||||
return versionRecord;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create record from current version
|
||||
*
|
||||
* @param nodeRef state to freeze
|
||||
* @param filePlan destination file plan
|
||||
* @return {@link NodeRef} versioned record
|
||||
*/
|
||||
private NodeRef createRecord(final NodeRef nodeRef, final NodeRef filePlan)
|
||||
{
|
||||
return authenticationUtil.runAs(new RunAsWork<NodeRef>()
|
||||
{
|
||||
public NodeRef doWork() throws Exception
|
||||
{
|
||||
// get the unfiled record folder
|
||||
final NodeRef unfiledRecordFolder = filePlanService.getUnfiledContainer(filePlan);
|
||||
|
||||
// get the documents readers
|
||||
Long aclId = dbNodeService.getNodeAclId(nodeRef);
|
||||
Set<String> readers = extendedPermissionService.getReaders(aclId);
|
||||
Set<String> writers = extendedPermissionService.getWriters(aclId);
|
||||
|
||||
// add the current owner to the list of extended writers
|
||||
Set<String> modifiedWrtiers = new HashSet<String>(writers);
|
||||
if (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_OWNABLE))
|
||||
{
|
||||
String owner = ownableService.getOwner(nodeRef);
|
||||
if (owner != null && !owner.isEmpty() && !owner.equals(OwnableService.NO_OWNER))
|
||||
{
|
||||
modifiedWrtiers.add(owner);
|
||||
}
|
||||
}
|
||||
|
||||
// add the current user as extended writer
|
||||
modifiedWrtiers.add(authenticationUtil.getFullyAuthenticatedUser());
|
||||
|
||||
// copy version state and create record
|
||||
NodeRef record = null;
|
||||
try
|
||||
{
|
||||
List<AssociationRef> originalAssocs = null;
|
||||
if (dbNodeService.hasAspect(nodeRef, ContentModel.ASPECT_COPIEDFROM))
|
||||
{
|
||||
// take a note of any copyFrom information already on the node
|
||||
originalAssocs = dbNodeService.getTargetAssocs(nodeRef, ContentModel.ASSOC_ORIGINAL);
|
||||
}
|
||||
|
||||
// create a copy of the original state and add it to the unfiled record container
|
||||
FileInfo recordInfo = fileFolderService.copy(nodeRef, unfiledRecordFolder, null);
|
||||
record = recordInfo.getNodeRef();
|
||||
|
||||
// remove added copy assocs
|
||||
List<AssociationRef> recordAssocs = dbNodeService.getTargetAssocs(record, ContentModel.ASSOC_ORIGINAL);
|
||||
for (AssociationRef recordAssoc : recordAssocs)
|
||||
{
|
||||
dbNodeService.removeAssociation(
|
||||
recordAssoc.getSourceRef(),
|
||||
recordAssoc.getTargetRef(),
|
||||
ContentModel.ASSOC_ORIGINAL);
|
||||
}
|
||||
|
||||
// re-add origional assocs or remove aspect
|
||||
if (originalAssocs == null)
|
||||
{
|
||||
dbNodeService.removeAspect(record, ContentModel.ASPECT_COPIEDFROM);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (AssociationRef originalAssoc : originalAssocs)
|
||||
{
|
||||
dbNodeService.createAssociation(originalAssoc.getSourceRef(), originalAssoc.getTargetRef(), ContentModel.ASSOC_ORIGINAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (FileNotFoundException e)
|
||||
{
|
||||
throw new AlfrescoRuntimeException("Can't create recorded version, because copy fails.", e);
|
||||
}
|
||||
|
||||
// set extended security on record
|
||||
extendedSecurityService.addExtendedSecurity(record, readers, writers);
|
||||
|
||||
return record;
|
||||
}
|
||||
}, authenticationUtil.getAdminUserName());
|
||||
}
|
||||
|
||||
/**
|
||||
* Freezes audit aspect properties.
|
||||
*
|
||||
|
@@ -29,7 +29,6 @@ import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -199,33 +198,7 @@ public class RecordableVersionServiceImplUnitTest extends BaseUnitTest
|
||||
recordableVersionService.createVersion(nodeRef, versionProperties);
|
||||
|
||||
// then the recorded version is created
|
||||
verifyRecordedVersion(filePlan);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper method that verifies that a recorded version was created.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
private void verifyRecordedVersion(NodeRef filePlan) throws Exception
|
||||
{
|
||||
// then unfiled container is retrieved for file plan
|
||||
verify(mockedFilePlanService, times(1)).getUnfiledContainer(filePlan);
|
||||
|
||||
// then the node is copied into the file plan
|
||||
verify(mockedFileFolderService, times(1)).copy(eq(nodeRef),
|
||||
eq(unfiledRecordContainer),
|
||||
anyString());
|
||||
|
||||
// then the version is created
|
||||
verify(mockedDbNodeService, times(1)).createNode(any(NodeRef.class),
|
||||
eq(Version2Model.CHILD_QNAME_VERSIONS),
|
||||
any(QName.class),
|
||||
eq(TYPE_CONTENT),
|
||||
anyMap());
|
||||
verify(mockedNodeService, times(1)).addAspect(eq(version), eq(Version2Model.ASPECT_VERSION), anyMap());
|
||||
verify(mockedNodeService, times(1)).addAspect(eq(version), eq(RecordableVersionModel.ASPECT_RECORDED_VERSION),
|
||||
eq(Collections.singletonMap(RecordableVersionModel.PROP_RECORD_NODE_REF, (Serializable)record)));
|
||||
verify(mockedRecordService, times(1)).createRecordFromCopy(filePlan, nodeRef);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -267,7 +240,7 @@ public class RecordableVersionServiceImplUnitTest extends BaseUnitTest
|
||||
recordableVersionService.createVersion(nodeRef, versionProperties);
|
||||
|
||||
// then the recorded version is created
|
||||
verifyRecordedVersion(filePlan);
|
||||
verify(mockedRecordService, times(1)).createRecordFromCopy(filePlan, nodeRef);
|
||||
|
||||
}
|
||||
|
||||
@@ -308,7 +281,7 @@ public class RecordableVersionServiceImplUnitTest extends BaseUnitTest
|
||||
recordableVersionService.createVersion(nodeRef, versionProperties);
|
||||
|
||||
// then the recorded version is created
|
||||
verifyRecordedVersion(filePlan);
|
||||
verify(mockedRecordService, times(1)).createRecordFromCopy(filePlan, nodeRef);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -355,7 +328,7 @@ public class RecordableVersionServiceImplUnitTest extends BaseUnitTest
|
||||
recordableVersionService.createVersion(nodeRef, versionProperties);
|
||||
|
||||
// then the recorded version is created
|
||||
verifyRecordedVersion(anotherFilePlan);
|
||||
verify(mockedRecordService, times(0)).createRecordFromCopy(filePlan, nodeRef);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -380,7 +353,7 @@ public class RecordableVersionServiceImplUnitTest extends BaseUnitTest
|
||||
recordableVersionService.createVersion(nodeRef, versionProperties);
|
||||
|
||||
// then the recorded version is created
|
||||
verifyRecordedVersion(anotherFilePlan);
|
||||
verify(mockedRecordService, times(0)).createRecordFromCopy(filePlan, nodeRef);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -395,7 +368,7 @@ public class RecordableVersionServiceImplUnitTest extends BaseUnitTest
|
||||
recordableVersionService.createVersion(nodeRef, versionProperties);
|
||||
|
||||
// then the recorded version is created
|
||||
verifyRecordedVersion(filePlan);
|
||||
verify(mockedRecordService, times(1)).createRecordFromCopy(filePlan, nodeRef);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -411,6 +384,6 @@ public class RecordableVersionServiceImplUnitTest extends BaseUnitTest
|
||||
recordableVersionService.createVersion(nodeRef, versionProperties);
|
||||
|
||||
// then the recorded version is created
|
||||
verifyRecordedVersion(filePlan);
|
||||
verify(mockedRecordService, times(1)).createRecordFromCopy(filePlan, nodeRef);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user