From 2df10ea85d0cff4cf77c2e526a68915a69ce7348 Mon Sep 17 00:00:00 2001 From: David Caruana Date: Fri, 21 May 2010 17:56:57 +0000 Subject: [PATCH] Fix ALF-2319: CMIS 'current' version mapping is not compliant with spec git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@20345 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../cmis/mapping/CMISServicesImpl.java | 5 ++- .../cmis/mapping/CheckinCommentProperty.java | 6 ++-- .../mapping/IsLatestMajorVersionProperty.java | 27 +++++++++++++--- .../cmis/mapping/IsLatestVersionProperty.java | 31 ++++++++++++++++++- .../cmis/mapping/IsMajorVersionProperty.java | 8 ++--- .../cmis/mapping/VersionLabelProperty.java | 10 +++--- 6 files changed, 68 insertions(+), 19 deletions(-) diff --git a/source/java/org/alfresco/cmis/mapping/CMISServicesImpl.java b/source/java/org/alfresco/cmis/mapping/CMISServicesImpl.java index 49853bd40e..40231e1bb8 100644 --- a/source/java/org/alfresco/cmis/mapping/CMISServicesImpl.java +++ b/source/java/org/alfresco/cmis/mapping/CMISServicesImpl.java @@ -1097,7 +1097,6 @@ public class CMISServicesImpl implements CMISServices, ApplicationContextAware, { objects.add(pwc); } - objects.add(nodeRef); VersionHistory versionHistory = versionService.getVersionHistory(nodeRef); if (versionHistory != null) { @@ -1108,6 +1107,10 @@ public class CMISServicesImpl implements CMISServices, ApplicationContextAware, current = versionHistory.getPredecessor(current); } } + else if (pwc == null) + { + objects.add(nodeRef); + } return objects; } diff --git a/source/java/org/alfresco/cmis/mapping/CheckinCommentProperty.java b/source/java/org/alfresco/cmis/mapping/CheckinCommentProperty.java index 29dc2d4317..2ba1089fcc 100644 --- a/source/java/org/alfresco/cmis/mapping/CheckinCommentProperty.java +++ b/source/java/org/alfresco/cmis/mapping/CheckinCommentProperty.java @@ -50,8 +50,7 @@ public class CheckinCommentProperty extends AbstractVersioningProperty */ public Serializable getValue(NodeRef nodeRef) { - NodeRef versionSeries; - if (isWorkingCopy(nodeRef) || (versionSeries = getVersionSeries(nodeRef)).equals(nodeRef)) + if (isWorkingCopy(nodeRef)) { return null; } @@ -60,7 +59,8 @@ public class CheckinCommentProperty extends AbstractVersioningProperty if (versionLabel == null) { return null; - } + } + NodeRef versionSeries = getVersionSeries(nodeRef); VersionHistory versionHistory = serviceRegistry.getVersionService().getVersionHistory(versionSeries); if (versionHistory == null) { diff --git a/source/java/org/alfresco/cmis/mapping/IsLatestMajorVersionProperty.java b/source/java/org/alfresco/cmis/mapping/IsLatestMajorVersionProperty.java index e40b8633c8..ea30b4d553 100644 --- a/source/java/org/alfresco/cmis/mapping/IsLatestMajorVersionProperty.java +++ b/source/java/org/alfresco/cmis/mapping/IsLatestMajorVersionProperty.java @@ -21,6 +21,8 @@ package org.alfresco.cmis.mapping; import java.io.Serializable; import org.alfresco.cmis.CMISDictionaryModel; +import org.alfresco.model.ContentModel; +import org.alfresco.repo.version.VersionBaseModel; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.version.Version; @@ -52,11 +54,11 @@ public class IsLatestMajorVersionProperty extends AbstractVersioningProperty */ public Serializable getValue(NodeRef nodeRef) { - NodeRef versionSeries; - if (isWorkingCopy(nodeRef) || (versionSeries = getVersionSeries(nodeRef)).equals(nodeRef)) + if (isWorkingCopy(nodeRef)) { return false; } + NodeRef versionSeries = getVersionSeries(nodeRef); ServiceRegistry serviceRegistry = getServiceRegistry(); VersionService versionService = serviceRegistry.getVersionService(); VersionHistory versionHistory = versionService.getVersionHistory(versionSeries); @@ -64,16 +66,33 @@ public class IsLatestMajorVersionProperty extends AbstractVersioningProperty { return false; } + + NodeRef versionNodeRef = nodeRef; + if (!nodeRef.getStoreRef().getProtocol().equals(VersionBaseModel.STORE_PROTOCOL)) + { + String versionLabel = (String) serviceRegistry.getNodeService().getProperty(nodeRef, ContentModel.PROP_VERSION_LABEL); + if (versionLabel == null) + { + return false; + } + Version version = versionHistory.getVersion(versionLabel); + if (version == null) + { + return false; + } + versionNodeRef = version.getFrozenStateNodeRef(); + } + // Go back in time to the last major version Version currentVersion = versionService.getCurrentVersion(versionSeries); while (currentVersion != null) { if (currentVersion.getVersionType() == VersionType.MAJOR) { - return currentVersion.getFrozenStateNodeRef().equals(nodeRef); + return currentVersion.getFrozenStateNodeRef().equals(versionNodeRef); } // We got to the current node and its not major. We failed! - else if (currentVersion.getFrozenStateNodeRef().equals(nodeRef)) + else if (currentVersion.getFrozenStateNodeRef().equals(versionNodeRef)) { return false; } diff --git a/source/java/org/alfresco/cmis/mapping/IsLatestVersionProperty.java b/source/java/org/alfresco/cmis/mapping/IsLatestVersionProperty.java index fe997ffdee..230bb15b08 100644 --- a/source/java/org/alfresco/cmis/mapping/IsLatestVersionProperty.java +++ b/source/java/org/alfresco/cmis/mapping/IsLatestVersionProperty.java @@ -21,8 +21,11 @@ package org.alfresco.cmis.mapping; import java.io.Serializable; import org.alfresco.cmis.CMISDictionaryModel; +import org.alfresco.model.ContentModel; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.version.Version; +import org.alfresco.service.cmr.version.VersionHistory; /** * Accesser for CMIS is latest version property @@ -47,6 +50,32 @@ public class IsLatestVersionProperty extends AbstractVersioningProperty */ public Serializable getValue(NodeRef nodeRef) { - return isWorkingCopy(nodeRef) || getVersionSeries(nodeRef).equals(nodeRef) && !hasWorkingCopy(nodeRef); + if (isWorkingCopy(nodeRef) || getVersionSeries(nodeRef).equals(nodeRef) && !hasWorkingCopy(nodeRef)) + { + return true; + } + NodeRef versionSeries = getVersionSeries(nodeRef); + if (hasWorkingCopy(versionSeries)) + { + return false; + } + + ServiceRegistry serviceRegistry = getServiceRegistry(); + String versionLabel = (String) serviceRegistry.getNodeService().getProperty(nodeRef, ContentModel.PROP_VERSION_LABEL); + if (versionLabel == null) + { + return false; + } + VersionHistory versionHistory = serviceRegistry.getVersionService().getVersionHistory(versionSeries); + if (versionHistory == null) + { + return false; + } + Version version = versionHistory.getVersion(versionLabel); + if (version == null) + { + return false; + } + return versionHistory.getHeadVersion().getFrozenStateNodeRef().equals(version.getFrozenStateNodeRef()); } } diff --git a/source/java/org/alfresco/cmis/mapping/IsMajorVersionProperty.java b/source/java/org/alfresco/cmis/mapping/IsMajorVersionProperty.java index b20c3037dd..5f7ee9df0b 100644 --- a/source/java/org/alfresco/cmis/mapping/IsMajorVersionProperty.java +++ b/source/java/org/alfresco/cmis/mapping/IsMajorVersionProperty.java @@ -24,6 +24,7 @@ import org.alfresco.cmis.CMISDictionaryModel; import org.alfresco.model.ContentModel; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.version.Version; import org.alfresco.service.cmr.version.VersionHistory; import org.alfresco.service.cmr.version.VersionType; @@ -50,18 +51,17 @@ public class IsMajorVersionProperty extends AbstractVersioningProperty */ public Serializable getValue(NodeRef nodeRef) { - NodeRef versionSeries; - if (isWorkingCopy(nodeRef) || (versionSeries = getVersionSeries(nodeRef)).equals(nodeRef)) + if (isWorkingCopy(nodeRef)) { return false; } ServiceRegistry serviceRegistry = getServiceRegistry(); - String versionLabel = (String) serviceRegistry.getNodeService().getProperty(nodeRef, - ContentModel.PROP_VERSION_LABEL); + String versionLabel = (String) serviceRegistry.getNodeService().getProperty(nodeRef, ContentModel.PROP_VERSION_LABEL); if (versionLabel == null) { return false; } + NodeRef versionSeries = getVersionSeries(nodeRef); VersionHistory versionHistory = serviceRegistry.getVersionService().getVersionHistory(versionSeries); if (versionHistory == null) { diff --git a/source/java/org/alfresco/cmis/mapping/VersionLabelProperty.java b/source/java/org/alfresco/cmis/mapping/VersionLabelProperty.java index f794157513..e32f8bb8eb 100644 --- a/source/java/org/alfresco/cmis/mapping/VersionLabelProperty.java +++ b/source/java/org/alfresco/cmis/mapping/VersionLabelProperty.java @@ -50,13 +50,11 @@ public class VersionLabelProperty extends AbstractVersioningProperty { return "pwc"; } - if (getVersionSeries(nodeRef).equals(nodeRef)) + Serializable versionLabel = getServiceRegistry().getNodeService().getProperty(nodeRef, ContentModel.PROP_VERSION_LABEL); + if (versionLabel == null) { - return "current"; - } - else - { - return getServiceRegistry().getNodeService().getProperty(nodeRef, ContentModel.PROP_VERSION_LABEL); + return "0.0"; } + return versionLabel; } }