diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/item.get.atomentry.ftl b/config/alfresco/templates/webscripts/org/alfresco/cmis/item.get.atomentry.ftl index 662d8cb222..0017816a04 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/item.get.atomentry.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/item.get.atomentry.ftl @@ -7,7 +7,9 @@ [#assign namespace][@nsLib.entryNS/][/#assign] -[#if node.isDocument] +[#if assoc?exists] + [@entryLib.assoc assoc=assoc propfilter=filter includeallowableactions=includeAllowableActions ns=namespace/] +[#elseif node?exists && node.isDocument] [@entryLib.document node=node renditionfilter=renditionFilter propfilter=filter includeallowableactions=includeAllowableActions includerelationships=includeRelationships includeacl=includeACL ns=namespace/] [#else] [@entryLib.folder node=node renditionfilter=renditionFilter propfilter=filter includeallowableactions=includeAllowableActions includerelationships=includeRelationships includeacl=includeACL ns=namespace/] diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/item.get.js b/config/alfresco/templates/webscripts/org/alfresco/cmis/item.get.js index b000d922b6..53ea487049 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/item.get.js +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/item.get.js @@ -2,21 +2,28 @@ script: { - var object = getObjectFromUrl(); - if (object.node === null) - { - break script; - } - model.node = object.node; - - // return version - var returnVersion = args[cmisserver.ARG_RETURN_VERSION]; - if (returnVersion === null || returnVersion.length == 0) - { - returnVersion = "this"; - } - model.node = cmisserver.getReturnVersion(model.node, returnVersion); - + var object = getObjectOrAssocFromUrl(); + if (object.node !== null && typeof(object.node) != 'undefined') + { + model.node = object.node; + + // return version + var returnVersion = args[cmisserver.ARG_RETURN_VERSION]; + if (returnVersion === null || returnVersion.length == 0) + { + returnVersion = "this"; + } + model.node = cmisserver.getReturnVersion(model.node, returnVersion); + } + else + { + if (object.assoc === null) + { + break script; + } + model.assoc = object.assoc; + } + // property filter model.filter = args[cmisserver.ARG_FILTER]; if (model.filter === null || model.filter == "") diff --git a/config/alfresco/templates/webscripts/org/alfresco/cmis/lib/read.lib.js b/config/alfresco/templates/webscripts/org/alfresco/cmis/lib/read.lib.js index 0856cad5f7..43740e9050 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/cmis/lib/read.lib.js +++ b/config/alfresco/templates/webscripts/org/alfresco/cmis/lib/read.lib.js @@ -60,3 +60,24 @@ function getAssocFromUrl() } return ret; } + +// +//Get Node or Association from URL +// +//@return node or association (or null, if not found) +function getObjectOrAssocFromUrl() +{ + var id = url.templateArgs.id; + + if (id === null) + { + id = args.noderef; + } + + if (id != null && id.indexOf("assoc:") === 0) + { + return getAssocFromUrl(); + } + + return getObjectFromUrl(); +} diff --git a/source/java/org/alfresco/repo/cmis/reference/AssociationIdRelationshipReference.java b/source/java/org/alfresco/repo/cmis/reference/AssociationIdRelationshipReference.java index 2ea9798c68..7761dad4ac 100644 --- a/source/java/org/alfresco/repo/cmis/reference/AssociationIdRelationshipReference.java +++ b/source/java/org/alfresco/repo/cmis/reference/AssociationIdRelationshipReference.java @@ -56,7 +56,7 @@ public class AssociationIdRelationshipReference implements CMISRelationshipRefer { try { - return cmisServices.getReadableObject(CMISServices.ASSOC_ID_PREFIX + this.assocId, AssociationRef.class); + return cmisServices.getReadableObject(this.assocId, AssociationRef.class); } catch (CMISServiceException e) { diff --git a/source/java/org/alfresco/repo/cmis/reference/ReferenceFactory.java b/source/java/org/alfresco/repo/cmis/reference/ReferenceFactory.java index 42a7d94f28..8f9722360d 100644 --- a/source/java/org/alfresco/repo/cmis/reference/ReferenceFactory.java +++ b/source/java/org/alfresco/repo/cmis/reference/ReferenceFactory.java @@ -145,6 +145,14 @@ public class ReferenceFactory public CMISRelationshipReference createRelationshipReferenceFromUrl(Map args, Map templateArgs) { String assocId = templateArgs.get("assoc_id"); + if (assocId == null) + { + assocId = templateArgs.get("id"); + } + if (assocId == null) + { + assocId = args.get("noderef"); + } if (assocId != null) { return new AssociationIdRelationshipReference(cmisService, assocId); diff --git a/source/java/org/alfresco/repo/cmis/rest/test/CmisRelationshipSystemTest.java b/source/java/org/alfresco/repo/cmis/rest/test/CmisRelationshipSystemTest.java new file mode 100644 index 0000000000..fb41ba353d --- /dev/null +++ b/source/java/org/alfresco/repo/cmis/rest/test/CmisRelationshipSystemTest.java @@ -0,0 +1,120 @@ +package org.alfresco.repo.cmis.rest.test; + +import static org.junit.Assert.assertEquals; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.alfresco.cmis.client.impl.AlfrescoObjectFactoryImpl; +import org.apache.chemistry.opencmis.client.api.Document; +import org.apache.chemistry.opencmis.client.api.Folder; +import org.apache.chemistry.opencmis.client.api.ItemIterable; +import org.apache.chemistry.opencmis.client.api.ObjectType; +import org.apache.chemistry.opencmis.client.api.OperationContext; +import org.apache.chemistry.opencmis.client.api.Relationship; +import org.apache.chemistry.opencmis.client.api.Session; +import org.apache.chemistry.opencmis.client.api.SessionFactory; +import org.apache.chemistry.opencmis.client.runtime.SessionFactoryImpl; +import org.apache.chemistry.opencmis.commons.PropertyIds; +import org.apache.chemistry.opencmis.commons.SessionParameter; +import org.apache.chemistry.opencmis.commons.enums.BindingType; +import org.apache.chemistry.opencmis.commons.enums.RelationshipDirection; +import org.junit.BeforeClass; +import org.junit.Test; +import org.safehaus.uuid.UUIDGenerator; + +/** + * CMIS Relationship integration tests. + * + * @author Alex Strachan (tidy up by Alan Davis) + */ +public class CmisRelationshipSystemTest +{ + static Session session; + + static Document doc1; + + @BeforeClass + public static void classSetup() throws Exception + { + SessionFactory factory = SessionFactoryImpl.newInstance(); + Map sessionParameters = new HashMap(); + sessionParameters + .put(SessionParameter.ATOMPUB_URL, "http://localhost:8080/alfresco/s/cmis"); + sessionParameters.put(SessionParameter.USER, "admin"); + sessionParameters.put(SessionParameter.PASSWORD, "admin"); + sessionParameters.put(SessionParameter.BINDING_TYPE, BindingType.ATOMPUB.value()); + sessionParameters.put(SessionParameter.OBJECT_FACTORY_CLASS, + AlfrescoObjectFactoryImpl.class.getName()); + session = factory.getRepositories(sessionParameters).get(0).createSession(); + + /* + * Association example from: + * http://forums.alfresco.com/en/viewtopic.php?f=45&t=27219 + */ + HashMap prop1 = new HashMap(); + prop1.put(PropertyIds.NAME, GUID()); + prop1.put(PropertyIds.OBJECT_TYPE_ID, "D:ws:article"); + + HashMap prop2 = new HashMap(); + prop2.put(PropertyIds.NAME, GUID()); + prop2.put(PropertyIds.OBJECT_TYPE_ID, "D:ws:article"); + + Folder folder = (Folder) session.getObjectByPath("/"); + + doc1 = folder.createDocument(prop1, null, null, null, null, null, + session.getDefaultContext()); + Document doc2 = folder.createDocument(prop2, null, null, null, null, null, + session.getDefaultContext()); + + Map relProps = new HashMap(); + relProps.put("cmis:sourceId", doc1.getId()); + relProps.put("cmis:targetId", doc2.getId()); + relProps.put("cmis:objectTypeId", "R:ws:relatedArticles"); + session.createRelationship(relProps, null, null, null); + } + + private static String GUID() + { + return UUIDGenerator.getInstance().generateRandomBasedUUID().toString(); + } + + @Test + public void testObjectRelationships() throws Exception + { + // Can't use object relationships retrieval due an isValidCmisRelationship issue. + // TODO Change expected value to 1 rather than 0 once bug is fixed. + assertEquals(0, doc1.getRelationships().size()); + } + + private void testGetRelationshipsViaSession(RelationshipDirection direction) throws Exception + { + // Try and get relationships using the session + ObjectType typeDefinition = session.getTypeDefinition("R:ws:relatedArticles"); + OperationContext operationContext = session.createOperationContext(); + + ItemIterable relationships = session.getRelationships(doc1, true, direction, + typeDefinition, operationContext); + int relationshipCount = 0; + Iterator iterator = relationships.iterator(); + while (iterator.hasNext()) + { + relationshipCount++; + iterator.next(); + } + assertEquals(1, relationshipCount); + } + + @Test + public void testRelationshipDirectionEither() throws Exception + { + testGetRelationshipsViaSession(RelationshipDirection.EITHER); + } + + @Test + public void testRelationshipDirectionSource() throws Exception + { + testGetRelationshipsViaSession(RelationshipDirection.SOURCE); + } +} \ No newline at end of file