mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-31 17:39:05 +00:00
RM-2368 Initial version record does not inherit document type and
aspects from original document
This commit is contained in:
@@ -1039,7 +1039,7 @@ public class RecordServiceImpl extends BaseBehaviourBean
|
||||
NodeRef versionRecord = null;
|
||||
|
||||
|
||||
recordableVersionService.createFreezeVersion(nodeRef);
|
||||
recordableVersionService.createSnapshotVersion(nodeRef);
|
||||
// wire record up to previous record
|
||||
VersionHistory versionHistory = versionService.getVersionHistory(nodeRef);
|
||||
if (versionHistory != null)
|
||||
|
@@ -64,7 +64,7 @@ public interface RecordableVersionService
|
||||
Version getRecordedVersion(NodeRef record);
|
||||
|
||||
/**
|
||||
* Creates a record from the latest version, marking it as recorded.
|
||||
* Creates a record from the latest frozen version, marking it as recorded.
|
||||
* <p>
|
||||
* Does not create a record if the node is not versionable or the latest version is already recorded.
|
||||
*
|
||||
@@ -73,6 +73,19 @@ public interface RecordableVersionService
|
||||
*/
|
||||
NodeRef createRecordFromLatestVersion(NodeRef filePlan, NodeRef nodeRef);
|
||||
|
||||
/**
|
||||
* Creates a record from the latest version, marking it as recorded.
|
||||
* <p>
|
||||
* Does not create a record if the node is not versionable or the latest version is already recorded.
|
||||
*
|
||||
* @param nodeRef parent node reference
|
||||
* @param nodeRef node reference
|
||||
* @param autoVersion true, create new record version from latest version, false creates a record from the latest frozen version
|
||||
* @return NodeRef node reference to the created record.
|
||||
*
|
||||
*/
|
||||
NodeRef createRecordFromLatestVersion(NodeRef filePlan, NodeRef nodeRef, boolean autoVersion);
|
||||
|
||||
/**
|
||||
* Indicates whether a record version is destroyed or not.
|
||||
*
|
||||
@@ -91,17 +104,16 @@ public interface RecordableVersionService
|
||||
void destroyRecordedVersion(Version version);
|
||||
|
||||
/**
|
||||
* Flag that indicate to create new version on record creation if current state of node is modified
|
||||
* Flag that indicate to create new version on record creation if current node is modified
|
||||
*
|
||||
* @return boolean
|
||||
* @return boolean true to auto-version on record creation, false to use latest versioned version
|
||||
*/
|
||||
public boolean isEnableAutoVersionOnRecordCreation();
|
||||
boolean isEnableAutoVersionOnRecordCreation();
|
||||
|
||||
/**
|
||||
* Create a snapshot - 'freeze' version of current node
|
||||
* Create a snapshot version of current node
|
||||
*
|
||||
* @param nodeRef node reference
|
||||
* @return version version or null
|
||||
*/
|
||||
Version createFreezeVersion(NodeRef nodeRef);
|
||||
void createSnapshotVersion(NodeRef nodeRef);
|
||||
}
|
||||
|
@@ -674,6 +674,17 @@ public class RecordableVersionServiceImpl extends Version2ServiceImpl
|
||||
return new NodeRef(convertStoreRef(nodeRef.getStoreRef()), nodeRef.getId());
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.alfresco.module.org_alfresco_module_rm.version.RecordableVersionService#createRecordFromLatestVersion(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.repository.NodeRef, autoVersion)
|
||||
*/
|
||||
@Override
|
||||
public NodeRef createRecordFromLatestVersion(final NodeRef filePlan, final NodeRef nodeRef, final boolean isEnableAutoVersionOnRecordCreation)
|
||||
{
|
||||
setEnableAutoVersionOnRecordCreation(isEnableAutoVersionOnRecordCreation);
|
||||
|
||||
return createRecordFromLatestVersion(filePlan, nodeRef);
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.alfresco.module.org_alfresco_module_rm.version.RecordableVersionService#createRecordFromLatestVersion(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.repository.NodeRef)
|
||||
*/
|
||||
@@ -688,7 +699,7 @@ public class RecordableVersionServiceImpl extends Version2ServiceImpl
|
||||
// check for versionable aspect
|
||||
if (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_VERSIONABLE))
|
||||
{
|
||||
createFreezeVersion(nodeRef);
|
||||
createSnapshotVersion(nodeRef);
|
||||
// get the latest version
|
||||
final Version currentVersion = getCurrentVersion(nodeRef);
|
||||
|
||||
@@ -902,37 +913,27 @@ public class RecordableVersionServiceImpl extends Version2ServiceImpl
|
||||
*/
|
||||
public boolean isCurrentVersionDirty(NodeRef nodeRef)
|
||||
{
|
||||
if (!nodeService.hasAspect(nodeRef, ContentModel.ASPECT_VERSIONABLE)) { return false; }
|
||||
|
||||
if (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_VERSIONABLE) == true)
|
||||
{
|
||||
// get the latest version
|
||||
Version currentVersion = getCurrentVersion(nodeRef);
|
||||
Date modificationDate = (Date) nodeService.getProperty(nodeRef, ContentModel.PROP_MODIFIED);
|
||||
if (currentVersion != null)
|
||||
{
|
||||
|
||||
if (currentVersion == null) { return true; }
|
||||
|
||||
// grab the frozen state
|
||||
NodeRef currentFrozenState = currentVersion.getFrozenStateNodeRef();
|
||||
Date frozenModificationDate = (Date) nodeService.getProperty(currentFrozenState, ContentModel.PROP_MODIFIED);
|
||||
if (frozenModificationDate != null)
|
||||
{
|
||||
if (modificationDate.getTime() > frozenModificationDate.getTime()) { return true; }
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
return false;
|
||||
boolean versionStoreOutdated = ((frozenModificationDate != null) && (modificationDate.getTime() > frozenModificationDate.getTime()));
|
||||
return versionStoreOutdated;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see RecordableVersionService#createFreezeVersion(NodeRef)
|
||||
* @see RecordableVersionService#createSnapshotVersion(NodeRef)
|
||||
*/
|
||||
public Version createFreezeVersion(NodeRef nodeRef)
|
||||
public void createSnapshotVersion(NodeRef nodeRef)
|
||||
{
|
||||
Version newVersion = null;
|
||||
boolean autoVersion = isEnableAutoVersionOnRecordCreation();
|
||||
// if the flag autoversion on record creation set, create new version on dirty nodes
|
||||
if (autoVersion && isCurrentVersionDirty(nodeRef))
|
||||
@@ -940,8 +941,8 @@ public class RecordableVersionServiceImpl extends Version2ServiceImpl
|
||||
Map<String, Serializable> autoVersionProperties = new HashMap<String, Serializable>(2);
|
||||
autoVersionProperties.put(VersionModel.PROP_VERSION_TYPE, VersionType.MINOR);
|
||||
autoVersionProperties.put(VersionModel.PROP_DESCRIPTION, I18NUtil.getMessage(AUTO_VERSION_ON_RECORD_CREATION));
|
||||
newVersion = createVersion(nodeRef, autoVersionProperties);
|
||||
createVersion(nodeRef, autoVersionProperties);
|
||||
}
|
||||
return newVersion;
|
||||
|
||||
}
|
||||
}
|
||||
|
@@ -104,7 +104,8 @@ public class DeclareAsRecordVersionTest extends RecordableVersionsBaseTest
|
||||
/**
|
||||
* Given versionable content with a recorded latest version
|
||||
* When I declare a version record
|
||||
* Then nothing happens since the latest version is already recorded And a warning is logged
|
||||
* Then nothing happens since the latest version is already recorded
|
||||
* And a warning is logged
|
||||
*/
|
||||
public void testDeclareLatestVersionAsRecordButAlreadyRecorded()
|
||||
{
|
||||
@@ -215,6 +216,98 @@ public class DeclareAsRecordVersionTest extends RecordableVersionsBaseTest
|
||||
*
|
||||
* @see https://issues.alfresco.com/jira/browse/RM-2368
|
||||
*/
|
||||
|
||||
public void testCreateRecordFromLatestVersionAutoTrue()
|
||||
{
|
||||
doBehaviourDrivenTest(new BehaviourDrivenTest(dmCollaborator)
|
||||
{
|
||||
private NodeRef myDocument;
|
||||
private NodeRef versionedRecord;
|
||||
private Map<String, Serializable> versionProperties;
|
||||
private Date createdDate;
|
||||
private Date modificationDate;
|
||||
private String record_name = "initial_name";
|
||||
private String AUTO_VERSION_DESCRIPTION = "Auto Version on Record Creation";
|
||||
private boolean autoVersion = true;
|
||||
|
||||
public void given() throws Exception
|
||||
{
|
||||
// create a document
|
||||
myDocument = fileFolderService.create(dmFolder, GUID.generate(), ContentModel.TYPE_CONTENT).getNodeRef();
|
||||
createdDate = (Date) nodeService.getProperty(myDocument, ContentModel.PROP_CREATED);
|
||||
modificationDate = (Date) nodeService.getProperty(myDocument, ContentModel.PROP_MODIFIED);
|
||||
assertTrue("Modified date must be after or on creation date", createdDate.getTime() == modificationDate.getTime());
|
||||
|
||||
// Set initial set of properties
|
||||
Map<QName, Serializable> properties = new HashMap<QName, Serializable>(3);
|
||||
// Ensure default behaviour autoversion on change properties is set to false
|
||||
properties.put(ContentModel.PROP_AUTO_VERSION_PROPS, false);
|
||||
// Set initial name
|
||||
properties.put(ContentModel.PROP_NAME, "initial_name");
|
||||
nodeService.setProperties(myDocument, properties);
|
||||
nodeService.setProperty(myDocument, ContentModel.PROP_DESCRIPTION, DESCRIPTION);
|
||||
nodeService.addAspect(myDocument, ContentModel.ASPECT_OWNABLE, null);
|
||||
// make sure document is versionable
|
||||
nodeService.addAspect(myDocument, ContentModel.ASPECT_VERSIONABLE, null);
|
||||
// Change Type to a custom document
|
||||
nodeService.setType(myDocument, TYPE_CUSTOM_TYPE);
|
||||
|
||||
// setup version properties
|
||||
versionProperties = new HashMap<String, Serializable>(2);
|
||||
versionProperties.put(Version.PROP_DESCRIPTION, DESCRIPTION);
|
||||
versionProperties.put(VersionModel.PROP_VERSION_TYPE, VersionType.MAJOR);
|
||||
|
||||
// create initial version
|
||||
versionService.createVersion(myDocument, versionProperties);
|
||||
}
|
||||
|
||||
public void when()
|
||||
{
|
||||
// Apply a custom aspect
|
||||
nodeService.addAspect(myDocument, ContentModel.ASPECT_TITLED, null);
|
||||
// Update properties
|
||||
nodeService.setProperty(myDocument, ContentModel.PROP_NAME, "updated_name");
|
||||
nodeService.setProperty(myDocument, ContentModel.PROP_DESCRIPTION, DESCRIPTION);
|
||||
// test RM-2368
|
||||
versionedRecord = recordableVersionService.createRecordFromLatestVersion(filePlan, myDocument, autoVersion);
|
||||
}
|
||||
|
||||
public void then()
|
||||
{
|
||||
// Properties updated / flag as modified
|
||||
// check the created record
|
||||
assertNotNull(versionedRecord);
|
||||
assertTrue(recordService.isRecord(versionedRecord));
|
||||
|
||||
// check the record type is correct
|
||||
assertEquals(TYPE_CUSTOM_TYPE, nodeService.getType(versionedRecord));
|
||||
|
||||
// assert the current version is recorded
|
||||
assertTrue(recordableVersionService.isCurrentVersionRecorded(myDocument));
|
||||
|
||||
// get name of record
|
||||
record_name = (String) nodeService.getProperty(versionedRecord, ContentModel.PROP_NAME);
|
||||
|
||||
// new version is create, current node was modified
|
||||
assertTrue("Name was updated:", record_name.contains("updated_name"));
|
||||
// check record
|
||||
checkRecordedVersion(myDocument, AUTO_VERSION_DESCRIPTION, "1.1");
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* Given versionable content with a recorded latest version
|
||||
* When I declare this version record
|
||||
* Then a new minor version is created for document
|
||||
*
|
||||
* @see https://issues.alfresco.com/jira/browse/RM-2368
|
||||
*/
|
||||
public void testCreateRecordFromLatestVersion()
|
||||
{
|
||||
doBehaviourDrivenTest(new BehaviourDrivenTest(dmCollaborator)
|
||||
@@ -223,10 +316,8 @@ public class DeclareAsRecordVersionTest extends RecordableVersionsBaseTest
|
||||
private NodeRef versionedRecord;
|
||||
private Map<String, Serializable> versionProperties;
|
||||
private Date createdDate;
|
||||
private Date frozenModifDate;
|
||||
private Date modificationDate;
|
||||
private String record_name = "initial_name";
|
||||
private String AUTO_VERSION_DESCRIPTION = "Auto Version on Record Creation";
|
||||
private boolean autoVersion = false;
|
||||
|
||||
public void given() throws Exception
|
||||
@@ -251,8 +342,6 @@ public class DeclareAsRecordVersionTest extends RecordableVersionsBaseTest
|
||||
// Change Type to a custom document
|
||||
nodeService.setType(myDocument, TYPE_CUSTOM_TYPE);
|
||||
|
||||
Date modificationDate1 = (Date) nodeService.getProperty(myDocument, ContentModel.PROP_MODIFIED);
|
||||
assertTrue("Frozen modification date", modificationDate.getTime() == modificationDate1.getTime());
|
||||
// setup version properties
|
||||
versionProperties = new HashMap<String, Serializable>(2);
|
||||
versionProperties.put(Version.PROP_DESCRIPTION, DESCRIPTION);
|
||||
@@ -260,35 +349,17 @@ public class DeclareAsRecordVersionTest extends RecordableVersionsBaseTest
|
||||
|
||||
// create initial version
|
||||
versionService.createVersion(myDocument, versionProperties);
|
||||
Version version = versionService.getCurrentVersion(myDocument);
|
||||
frozenModifDate = version.getFrozenModifiedDate();
|
||||
|
||||
// get autoversion flag from cofiguratie
|
||||
autoVersion = recordableVersionService.isEnableAutoVersionOnRecordCreation();
|
||||
}
|
||||
|
||||
public void when()
|
||||
{
|
||||
// current node is not dirty
|
||||
assertFalse(isCurrentVersionDirty(myDocument));
|
||||
|
||||
if (autoVersion)
|
||||
{
|
||||
// Apply a custom aspect
|
||||
nodeService.addAspect(myDocument, ContentModel.ASPECT_TITLED, null);
|
||||
// Update properties
|
||||
nodeService.setProperty(myDocument, ContentModel.PROP_NAME, "updated_name");
|
||||
nodeService.setProperty(myDocument, ContentModel.PROP_NAME, "initial_name");
|
||||
nodeService.setProperty(myDocument, ContentModel.PROP_DESCRIPTION, DESCRIPTION);
|
||||
// node should be modified
|
||||
assertTrue(isCurrentVersionDirty(myDocument));
|
||||
}
|
||||
else
|
||||
{
|
||||
assertFalse(isCurrentVersionDirty(myDocument));
|
||||
}
|
||||
// test RM-2368
|
||||
versionedRecord = recordableVersionService.createRecordFromLatestVersion(filePlan, myDocument);
|
||||
|
||||
versionedRecord = recordableVersionService.createRecordFromLatestVersion(filePlan, myDocument, autoVersion);
|
||||
}
|
||||
|
||||
public void then()
|
||||
@@ -307,45 +378,16 @@ public class DeclareAsRecordVersionTest extends RecordableVersionsBaseTest
|
||||
// get name of record
|
||||
record_name = (String) nodeService.getProperty(versionedRecord, ContentModel.PROP_NAME);
|
||||
|
||||
if (autoVersion)
|
||||
{
|
||||
// new version is create, current node was modified
|
||||
assertTrue("Name was updated:", record_name.contains("updated_name"));
|
||||
// check record
|
||||
checkRecordedVersion(myDocument, AUTO_VERSION_DESCRIPTION, "1.1");
|
||||
}
|
||||
else
|
||||
{
|
||||
// record is created based on existing frozen, which does not contain any modification of node
|
||||
assertTrue("Name is not modified: ", record_name.contains("initial_name"));
|
||||
checkRecordedVersion(myDocument, DESCRIPTION, "1.0");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public boolean isCurrentVersionDirty(NodeRef nodeRef)
|
||||
{
|
||||
if (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_VERSIONABLE) == true)
|
||||
{
|
||||
// get the latest version
|
||||
Version currentVersion = versionService.getCurrentVersion(nodeRef);
|
||||
Date modificationDate = (Date) nodeService.getProperty(nodeRef, ContentModel.PROP_MODIFIED);
|
||||
if (currentVersion != null)
|
||||
{
|
||||
// grab the frozen state
|
||||
NodeRef currentFrozenState = currentVersion.getFrozenStateNodeRef();
|
||||
Date frozenModificationDate = (Date) nodeService.getProperty(currentFrozenState, ContentModel.PROP_MODIFIED);
|
||||
if (modificationDate.getTime() > frozenModificationDate.getTime()) { return true; }
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user