diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml
index 4e290a15ea..b5697229ef 100644
--- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml
+++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml
@@ -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
diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-version-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-version-context.xml
index 5245ccc2ea..e58a78ee8a 100644
--- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-version-context.xml
+++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-version-context.xml
@@ -15,12 +15,9 @@
-
-
-
-
+
diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordService.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordService.java
index fd284c3e30..b12b032939 100644
--- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordService.java
+++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordService.java
@@ -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
diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java
index 434ff30197..6cba2aaf6c 100644
--- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java
+++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java
@@ -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()
+ {
+ 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 readers = extendedPermissionService.getReaders(aclId);
+ Set writers = extendedPermissionService.getWriters(aclId);
+
+ // add the current owner to the list of extended writers
+ Set modifiedWrtiers = new HashSet(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 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 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)
*
diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/version/RecordableVersionServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/version/RecordableVersionServiceImpl.java
index 63703c3f32..b782aa43ee 100644
--- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/version/RecordableVersionServiceImpl.java
+++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/version/RecordableVersionServiceImpl.java
@@ -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()
- {
- 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 readers = extendedPermissionService.getReaders(aclId);
- Set writers = extendedPermissionService.getWriters(aclId);
-
- // add the current owner to the list of extended writers
- Set modifiedWrtiers = new HashSet(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 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 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.
*
diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/version/RecordableVersionServiceImplUnitTest.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/version/RecordableVersionServiceImplUnitTest.java
index 169d55eded..c334e94640 100644
--- a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/version/RecordableVersionServiceImplUnitTest.java
+++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/version/RecordableVersionServiceImplUnitTest.java
@@ -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);
}
}
\ No newline at end of file