RM-2368 Initial version record does not inherit document type and

aspects from original document
This commit is contained in:
Mihai Cozma
2016-10-06 13:03:40 +03:00
parent cf602aa9e1
commit 98ca0abe19
4 changed files with 156 additions and 101 deletions

View File

@@ -1039,7 +1039,7 @@ public class RecordServiceImpl extends BaseBehaviourBean
NodeRef versionRecord = null; NodeRef versionRecord = null;
recordableVersionService.createFreezeVersion(nodeRef); recordableVersionService.createSnapshotVersion(nodeRef);
// wire record up to previous record // wire record up to previous record
VersionHistory versionHistory = versionService.getVersionHistory(nodeRef); VersionHistory versionHistory = versionService.getVersionHistory(nodeRef);
if (versionHistory != null) if (versionHistory != null)

View File

@@ -64,7 +64,7 @@ public interface RecordableVersionService
Version getRecordedVersion(NodeRef record); 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> * <p>
* Does not create a record if the node is not versionable or the latest version is already recorded. * Does not create a record if the node is not versionable or the latest version is already recorded.
* *
@@ -72,6 +72,19 @@ public interface RecordableVersionService
* @return NodeRef node reference to the created record. * @return NodeRef node reference to the created record.
*/ */
NodeRef createRecordFromLatestVersion(NodeRef filePlan, NodeRef nodeRef); 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. * Indicates whether a record version is destroyed or not.
@@ -91,17 +104,16 @@ public interface RecordableVersionService
void destroyRecordedVersion(Version version); 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 * @param nodeRef node reference
* @return version version or null
*/ */
Version createFreezeVersion(NodeRef nodeRef); void createSnapshotVersion(NodeRef nodeRef);
} }

View File

@@ -673,6 +673,17 @@ public class RecordableVersionServiceImpl extends Version2ServiceImpl
{ {
return new NodeRef(convertStoreRef(nodeRef.getStoreRef()), nodeRef.getId()); 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) * @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 // check for versionable aspect
if (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_VERSIONABLE)) if (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_VERSIONABLE))
{ {
createFreezeVersion(nodeRef); createSnapshotVersion(nodeRef);
// get the latest version // get the latest version
final Version currentVersion = getCurrentVersion(nodeRef); final Version currentVersion = getCurrentVersion(nodeRef);
@@ -902,37 +913,27 @@ public class RecordableVersionServiceImpl extends Version2ServiceImpl
*/ */
public boolean isCurrentVersionDirty(NodeRef nodeRef) 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);
// get the latest version Date modificationDate = (Date) nodeService.getProperty(nodeRef, ContentModel.PROP_MODIFIED);
Version currentVersion = 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 (frozenModificationDate != null)
{
if (modificationDate.getTime() > frozenModificationDate.getTime()) { return true; }
}
}
else
{
return true;
}
} if (currentVersion == null) { return true; }
return false;
// grab the frozen state
NodeRef currentFrozenState = currentVersion.getFrozenStateNodeRef();
Date frozenModificationDate = (Date) nodeService.getProperty(currentFrozenState, ContentModel.PROP_MODIFIED);
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(); boolean autoVersion = isEnableAutoVersionOnRecordCreation();
// if the flag autoversion on record creation set, create new version on dirty nodes // if the flag autoversion on record creation set, create new version on dirty nodes
if (autoVersion && isCurrentVersionDirty(nodeRef)) if (autoVersion && isCurrentVersionDirty(nodeRef))
@@ -940,8 +941,8 @@ public class RecordableVersionServiceImpl extends Version2ServiceImpl
Map<String, Serializable> autoVersionProperties = new HashMap<String, Serializable>(2); Map<String, Serializable> autoVersionProperties = new HashMap<String, Serializable>(2);
autoVersionProperties.put(VersionModel.PROP_VERSION_TYPE, VersionType.MINOR); autoVersionProperties.put(VersionModel.PROP_VERSION_TYPE, VersionType.MINOR);
autoVersionProperties.put(VersionModel.PROP_DESCRIPTION, I18NUtil.getMessage(AUTO_VERSION_ON_RECORD_CREATION)); autoVersionProperties.put(VersionModel.PROP_DESCRIPTION, I18NUtil.getMessage(AUTO_VERSION_ON_RECORD_CREATION));
newVersion = createVersion(nodeRef, autoVersionProperties); createVersion(nodeRef, autoVersionProperties);
} }
return newVersion;
} }
} }

View File

@@ -102,9 +102,10 @@ public class DeclareAsRecordVersionTest extends RecordableVersionsBaseTest
} }
/** /**
* Given versionable content with a recorded latest version * Given versionable content with a recorded latest version
* When I declare a version record * 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() public void testDeclareLatestVersionAsRecordButAlreadyRecorded()
{ {
@@ -215,6 +216,98 @@ public class DeclareAsRecordVersionTest extends RecordableVersionsBaseTest
* *
* @see https://issues.alfresco.com/jira/browse/RM-2368 * @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() public void testCreateRecordFromLatestVersion()
{ {
doBehaviourDrivenTest(new BehaviourDrivenTest(dmCollaborator) doBehaviourDrivenTest(new BehaviourDrivenTest(dmCollaborator)
@@ -223,10 +316,8 @@ public class DeclareAsRecordVersionTest extends RecordableVersionsBaseTest
private NodeRef versionedRecord; private NodeRef versionedRecord;
private Map<String, Serializable> versionProperties; private Map<String, Serializable> versionProperties;
private Date createdDate; private Date createdDate;
private Date frozenModifDate;
private Date modificationDate; private Date modificationDate;
private String record_name = "initial_name"; private String record_name = "initial_name";
private String AUTO_VERSION_DESCRIPTION = "Auto Version on Record Creation";
private boolean autoVersion = false; private boolean autoVersion = false;
public void given() throws Exception public void given() throws Exception
@@ -251,8 +342,6 @@ public class DeclareAsRecordVersionTest extends RecordableVersionsBaseTest
// Change Type to a custom document // Change Type to a custom document
nodeService.setType(myDocument, TYPE_CUSTOM_TYPE); 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 // setup version properties
versionProperties = new HashMap<String, Serializable>(2); versionProperties = new HashMap<String, Serializable>(2);
versionProperties.put(Version.PROP_DESCRIPTION, DESCRIPTION); versionProperties.put(Version.PROP_DESCRIPTION, DESCRIPTION);
@@ -260,35 +349,17 @@ public class DeclareAsRecordVersionTest extends RecordableVersionsBaseTest
// create initial version // create initial version
versionService.createVersion(myDocument, versionProperties); versionService.createVersion(myDocument, versionProperties);
Version version = versionService.getCurrentVersion(myDocument);
frozenModifDate = version.getFrozenModifiedDate();
// get autoversion flag from cofiguratie
autoVersion = recordableVersionService.isEnableAutoVersionOnRecordCreation();
} }
public void when() public void when()
{ {
// current node is not dirty // Apply a custom aspect
assertFalse(isCurrentVersionDirty(myDocument)); nodeService.addAspect(myDocument, ContentModel.ASPECT_TITLED, null);
// Update properties
if (autoVersion) nodeService.setProperty(myDocument, ContentModel.PROP_NAME, "initial_name");
{ nodeService.setProperty(myDocument, ContentModel.PROP_DESCRIPTION, DESCRIPTION);
// 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);
// node should be modified
assertTrue(isCurrentVersionDirty(myDocument));
}
else
{
assertFalse(isCurrentVersionDirty(myDocument));
}
// test RM-2368 // test RM-2368
versionedRecord = recordableVersionService.createRecordFromLatestVersion(filePlan, myDocument); versionedRecord = recordableVersionService.createRecordFromLatestVersion(filePlan, myDocument, autoVersion);
} }
public void then() public void then()
@@ -307,45 +378,16 @@ public class DeclareAsRecordVersionTest extends RecordableVersionsBaseTest
// get name of record // get name of record
record_name = (String) nodeService.getProperty(versionedRecord, ContentModel.PROP_NAME); record_name = (String) nodeService.getProperty(versionedRecord, ContentModel.PROP_NAME);
if (autoVersion) // 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"));
// new version is create, current node was modified checkRecordedVersion(myDocument, DESCRIPTION, "1.0");
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;
} }
}); });
} }
} }