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:
Roy Wetherall
2014-11-13 03:45:55 +00:00
parent da1d457c97
commit 9574e4e135
6 changed files with 125 additions and 186 deletions

View File

@@ -1101,7 +1101,8 @@
org.alfresco.module.org_alfresco_module_rm.record.RecordService.isDeclared=RM.Read.0
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.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

View File

@@ -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" />

View File

@@ -164,6 +164,14 @@ public interface RecordService
* @see #createRecord(NodeRef, NodeRef, boolean)
*/
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

View File

@@ -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)
*

View File

@@ -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
*/
@@ -152,6 +102,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.
*

View File

@@ -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);
}
}