diff --git a/config/alfresco/cmis-api-context.xml b/config/alfresco/cmis-api-context.xml
index 5235f91ed5..2078967cb0 100644
--- a/config/alfresco/cmis-api-context.xml
+++ b/config/alfresco/cmis-api-context.xml
@@ -33,6 +33,9 @@
+
+
+
diff --git a/source/java/org/alfresco/cmis/mapping/CMISMapping.java b/source/java/org/alfresco/cmis/mapping/CMISMapping.java
index 1aba1dc841..fa8e3b2b24 100644
--- a/source/java/org/alfresco/cmis/mapping/CMISMapping.java
+++ b/source/java/org/alfresco/cmis/mapping/CMISMapping.java
@@ -35,6 +35,7 @@ import org.alfresco.cmis.CMISDataTypeEnum;
import org.alfresco.cmis.CMISDictionaryModel;
import org.alfresco.cmis.CMISPropertyId;
import org.alfresco.cmis.CMISScope;
+import org.alfresco.cmis.CMISServices;
import org.alfresco.cmis.CMISTypeId;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel;
@@ -96,6 +97,7 @@ public class CMISMapping implements InitializingBean
// Service Dependencies
private ServiceRegistry serviceRegistry;
+ private CMISServices cmisService;
// Mappings
private Map mapAlfrescoQNameToTypeId = new HashMap();
@@ -187,7 +189,7 @@ public class CMISMapping implements InitializingBean
registerPropertyAccessor(new ContentStreamIdProperty(serviceRegistry));
registerPropertyAccessor(new DirectProperty(serviceRegistry, CMISDictionaryModel.PROP_CONTENT_STREAM_FILENAME, ContentModel.PROP_NAME));
registerPropertyAccessor(new ParentProperty(serviceRegistry));
- registerPropertyAccessor(new FixedValueProperty(serviceRegistry, CMISDictionaryModel.PROP_PATH_NAME, null));
+ registerPropertyAccessor(new PathNameProperty(serviceRegistry, cmisService));
registerPropertyAccessor(new FixedValueProperty(serviceRegistry, CMISDictionaryModel.PROP_ALLOWED_CHILD_OBJECT_TYPE_IDS, null));
registerPropertyAccessor(new SourceIdProperty(serviceRegistry));
registerPropertyAccessor(new TargetIdProperty(serviceRegistry));
@@ -269,6 +271,11 @@ public class CMISMapping implements InitializingBean
this.serviceRegistry = serviceRegistry;
}
+ public void setCMISService(CMISServices cmisService)
+ {
+ this.cmisService = cmisService;
+ }
+
/**
* @return namespaceService
*/
diff --git a/source/java/org/alfresco/cmis/mapping/PathNameProperty.java b/source/java/org/alfresco/cmis/mapping/PathNameProperty.java
new file mode 100644
index 0000000000..963dcfe7e1
--- /dev/null
+++ b/source/java/org/alfresco/cmis/mapping/PathNameProperty.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2005-2007 Alfresco Software Limited.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ * As a special exception to the terms and conditions of version 2.0 of
+ * the GPL, you may redistribute this Program in connection with Free/Libre
+ * and Open Source Software ("FLOSS") applications as described in Alfresco's
+ * FLOSS exception. You should have recieved a copy of the text describing
+ * the FLOSS exception, and it is also available here:
+ * http://www.alfresco.com/legal/licensing"
+ */
+package org.alfresco.cmis.mapping;
+
+import java.io.Serializable;
+
+import org.alfresco.cmis.CMISDictionaryModel;
+import org.alfresco.cmis.CMISServices;
+import org.alfresco.error.AlfrescoRuntimeException;
+import org.alfresco.model.ContentModel;
+import org.alfresco.service.ServiceRegistry;
+import org.alfresco.service.cmr.repository.ChildAssociationRef;
+import org.alfresco.service.cmr.repository.NodeRef;
+import org.alfresco.service.cmr.repository.Path;
+import org.alfresco.service.cmr.repository.Path.ChildAssocElement;
+
+/**
+ * Get the CMIS object id property.
+ *
+ * @author davidc
+ */
+public class PathNameProperty extends AbstractProperty
+{
+ private CMISServices cmisService;
+
+ /**
+ * Construct
+ *
+ * @param serviceRegistry
+ */
+ public PathNameProperty(ServiceRegistry serviceRegistry, CMISServices cmisService)
+ {
+ super(serviceRegistry, CMISDictionaryModel.PROP_PATH_NAME);
+ this.cmisService = cmisService;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.alfresco.cmis.mapping.AbstractProperty#getValue(org.alfresco.service.cmr.repository.NodeRef)
+ */
+ public Serializable getValue(NodeRef nodeRef)
+ {
+ Path path = getServiceRegistry().getNodeService().getPath(nodeRef);
+ return toDisplayPath(path);
+ }
+
+
+ private String toDisplayPath(Path path)
+ {
+ StringBuilder displayPath = new StringBuilder(64);
+
+ // skip to CMIS root path
+ NodeRef rootNode = cmisService.getDefaultRootNodeRef();
+ int i = 0;
+ while (i < path.size())
+ {
+ Path.Element element = path.get(i);
+ if (element instanceof ChildAssocElement)
+ {
+ ChildAssociationRef assocRef = ((ChildAssocElement)element).getRef();
+ NodeRef node = assocRef.getChildRef();
+ if (node.equals(rootNode))
+ {
+ break;
+ }
+ }
+ i++;
+ }
+
+ if (i == path.size())
+ {
+ throw new AlfrescoRuntimeException("Path " + path + " not in CMIS root node scope");
+ }
+
+ if (path.size() - i == 1)
+ {
+ // render root path
+ displayPath.append("/");
+ }
+ else
+ {
+ // render CMIS scoped path
+ i++;
+ while (i < path.size())
+ {
+ Path.Element element = path.get(i);
+ if (element instanceof ChildAssocElement)
+ {
+ ChildAssociationRef assocRef = ((ChildAssocElement)element).getRef();
+ NodeRef node = assocRef.getChildRef();
+ displayPath.append("/");
+ displayPath.append(getServiceRegistry().getNodeService().getProperty(node, ContentModel.PROP_NAME));
+ }
+ i++;
+ }
+ }
+
+ return displayPath.toString();
+ }
+
+}