diff --git a/source/java/org/alfresco/opencmis/AlfrescoCmisServiceImpl.java b/source/java/org/alfresco/opencmis/AlfrescoCmisServiceImpl.java index 371d6f1220..d3eb01d307 100644 --- a/source/java/org/alfresco/opencmis/AlfrescoCmisServiceImpl.java +++ b/source/java/org/alfresco/opencmis/AlfrescoCmisServiceImpl.java @@ -2262,6 +2262,11 @@ public class AlfrescoCmisServiceImpl extends AbstractCmisService implements Alfr for (Version version : versionHistory.getAllVersions()) { CMISNodeInfo versionInfo = createNodeInfo(version.getFrozenStateNodeRef(), versionHistory); + // MNT-9557 fix. Replace head version with current node info + if (versionHistory.getHeadVersion().equals(version)) + { + versionInfo = createNodeInfo(nodeRef); + } result.add( connector.createCMISObject( diff --git a/source/test-java/org/alfresco/opencmis/CMISTest.java b/source/test-java/org/alfresco/opencmis/CMISTest.java index 926d1596a4..696d024cc3 100644 --- a/source/test-java/org/alfresco/opencmis/CMISTest.java +++ b/source/test-java/org/alfresco/opencmis/CMISTest.java @@ -162,6 +162,7 @@ public class CMISTest private ActionService actionService; private RuleService ruleService; + private VersionService versionService; private CMISConnector cmisConnector; @@ -321,6 +322,7 @@ public class CMISTest this.namespaceService = (NamespaceService) ctx.getBean("namespaceService"); this.repositoryHelper = (Repository)ctx.getBean("repositoryHelper"); this.factory = (AlfrescoCmisServiceFactory)ctx.getBean("CMISServiceFactory"); + this.versionService = (VersionService) ctx.getBean("versionService"); this.cmisConnector = (CMISConnector) ctx.getBean("CMISConnector"); this.nodeDAO = (NodeDAO) ctx.getBean("nodeDAO"); this.authorityService = (AuthorityService)ctx.getBean("AuthorityService"); @@ -3054,4 +3056,128 @@ public class CMISTest } }, CmisVersion.CMIS_1_1); } + + /** + * Test to ensure that set of aspect returned by cmisService#getAllVersions for latest version is the same + * as for the object returned by cmisService#getObjectByPath. + * + * See MNT-9557 + */ + @Test + public void testLastVersionOfVersionSeries() + { + AuthenticationUtil.pushAuthentication(); + AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getAdminUserName()); + + final String FOLDER = "testUpdatePropertiesSetDeleteContentVersioning-" + GUID.generate(), + DOC = "documentProperties-" + GUID.generate(); + + try + { + final NodeRef nodeRef = transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback() + { + @Override + public NodeRef execute() throws Throwable + { + // create folder + FileInfo folderInfo = fileFolderService.create(repositoryHelper.getCompanyHome(), FOLDER, ContentModel.TYPE_FOLDER); + nodeService.setProperty(folderInfo.getNodeRef(), ContentModel.PROP_NAME, FOLDER); + assertNotNull(folderInfo); + + // create documents + FileInfo document = fileFolderService.create(folderInfo.getNodeRef(), DOC, ContentModel.TYPE_CONTENT); + nodeService.setProperty(document.getNodeRef(), ContentModel.PROP_NAME, DOC); + nodeService.setProperty(document.getNodeRef(), ContentModel.PROP_DESCRIPTION, "Initial doc"); + + return document.getNodeRef(); + } + }); + + transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback() + { + @Override + public Void execute() throws Throwable + { + // make sure that there is no version history yet + assertNull(versionService.getVersionHistory(nodeRef)); + + // create a version + // turn off auto-versioning + Map props = new HashMap(); + props.put(ContentModel.PROP_INITIAL_VERSION, false); + props.put(ContentModel.PROP_AUTO_VERSION, false); + props.put(ContentModel.PROP_AUTO_VERSION_PROPS, false); + + versionService.ensureVersioningEnabled(nodeRef, props); + + return null; + } + }); + + transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback() + { + @Override + public Void execute() throws Throwable + { + assertNotNull(versionService.getVersionHistory(nodeRef)); + // create another one version + versionService.createVersion(nodeRef, null); + + return null; + } + }); + + final String NEW_DOC_NAME = transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback() + { + @Override + public String execute() throws Throwable + { + // add aspect to the node + String newDocName = DOC + GUID.generate(); + nodeService.addAspect(nodeRef, ContentModel.ASPECT_AUTHOR, null); + nodeService.setProperty(nodeRef, ContentModel.PROP_NAME, newDocName); + + return newDocName; + } + }); + + CmisService cmisService = factory.getService(context); + String repositoryId = cmisService.getRepositoryInfos(null).get(0).getId(); + + List versions = + cmisService.getAllVersions(repositoryId, nodeRef.toString(), null, null, null, null); + assertNotNull(versions); + // get the latest version + ObjectData latestVersion = versions.get(0); + // get the object + ObjectData object = + // cmisService.getObjectOfLatestVersion(repositoryId, nodeRef.toString(), null, false, null, null, null, null, false, false, null); + cmisService.getObjectByPath(repositoryId, "/" + FOLDER + "/" + NEW_DOC_NAME, null, null, null, null, false, false, null); + + assertNotNull(latestVersion); + assertNotNull(object); + + Object objectDescriptionString = object.getProperties().getProperties().get("cmis:name").getValues().get(0); + Object latestVersionDescriptionString = latestVersion.getProperties().getProperties().get("cmis:name").getValues().get(0); + // ensure that node and latest version both have same description + assertEquals(objectDescriptionString, latestVersionDescriptionString); + + Set documentAspects = new HashSet(); + for (CmisExtensionElement cmisEE : object.getProperties().getExtensions().get(0).getChildren()) + { + documentAspects.add(cmisEE.getValue()); + } + Set latestVersionAspects = new HashSet(); + for (CmisExtensionElement cmisEE : latestVersion.getProperties().getExtensions().get(0).getChildren()) + { + latestVersionAspects.add(cmisEE.getValue()); + } + // ensure that node and latest version both have the same set of aspects + assertEquals(latestVersionAspects, documentAspects); + } + finally + { + AuthenticationUtil.popAuthentication(); + } + } }