From c38c6fe1d7be6c5332c0f2bcb2972f710da81b5d Mon Sep 17 00:00:00 2001 From: Alan Davis Date: Thu, 20 Feb 2014 14:23:58 +0000 Subject: [PATCH] Merged HEAD-BUG-FIX (Cloud33/4.3) to HEAD (Cloud33/4.3) 62905: Merged PLATFORM1 (Cloud33) to HEAD-BUG-FIX (Cloud33/4.3) 61335: ACE-33 implementation of cmis:items add permissions create and delete of cmis:items some unit test fixes new unit test for items git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@62958 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../opencmis/AlfrescoCmisServiceImpl.java | 41 +++++++++++++++++++ .../org/alfresco/opencmis/CMISConnector.java | 12 +++++- .../alfresco/opencmis/CMISNodeInfoImpl.java | 24 ++++++++++- .../opencmis/mapping/BaseTypeIdProperty.java | 7 +++- .../RuntimePropertyAccessorMapping.java | 17 ++++++++ .../org/alfresco/opencmis/CMISTest.java | 32 +++++++++++++++ 6 files changed, 128 insertions(+), 5 deletions(-) diff --git a/source/java/org/alfresco/opencmis/AlfrescoCmisServiceImpl.java b/source/java/org/alfresco/opencmis/AlfrescoCmisServiceImpl.java index 7004c89516..a22dc3a605 100644 --- a/source/java/org/alfresco/opencmis/AlfrescoCmisServiceImpl.java +++ b/source/java/org/alfresco/opencmis/AlfrescoCmisServiceImpl.java @@ -988,6 +988,9 @@ public class AlfrescoCmisServiceImpl extends AbstractCmisService implements Alfr case CMIS_POLICY: newId = createPolicy(repositoryId, properties, folderId, policies, null, null, extension); break; + case CMIS_ITEM: + newId = createItem(repositoryId, properties, folderId, policies, null, null, extension); + } // check new object id @@ -1043,6 +1046,44 @@ public class AlfrescoCmisServiceImpl extends AbstractCmisService implements Alfr String objectId = connector.createObjectId(nodeRef); return objectId; } + + + @Override + public String createItem(String repositoryId, Properties properties, String folderId, List policies, + Acl addAces, Acl removeAces, ExtensionsData extension) + { + checkRepositoryId(repositoryId); + + // get the parent folder node ref + final CMISNodeInfo parentInfo = getOrCreateFolderInfo(folderId, "Folder"); + + // get name and type + final String name = connector.getNameProperty(properties, null); + final String objectTypeId = connector.getObjectTypeIdProperty(properties); + final TypeDefinitionWrapper type = connector.getTypeForCreate(objectTypeId, BaseTypeId.CMIS_ITEM); + + connector.checkChildObjectType(parentInfo, type.getTypeId()); + + /** + * The above code specifies a folder - so the contents of a folder (as defined by the alfresco model) are + * ASSOC cm:contains to a TYPE sys:base + */ + QName assocQName = QName.createQName( + NamespaceService.CONTENT_MODEL_1_0_URI, + QName.createValidLocalName(name)); + + ChildAssociationRef newRef = connector.getNodeService().createNode(parentInfo.getNodeRef(), ContentModel.ASSOC_CONTAINS, assocQName, type.getAlfrescoClass()); + + NodeRef nodeRef = newRef.getChildRef(); + + connector.setProperties(nodeRef, type, properties, new String[] { PropertyIds.NAME, PropertyIds.OBJECT_TYPE_ID }); + connector.applyPolicies(nodeRef, type, policies); + connector.applyACL(nodeRef, type, addAces, removeAces); + + String objectId = connector.createObjectId(nodeRef); + return objectId; + + } private String parseMimeType(ContentStream contentStream) { diff --git a/source/java/org/alfresco/opencmis/CMISConnector.java b/source/java/org/alfresco/opencmis/CMISConnector.java index f303e87f78..301976994c 100644 --- a/source/java/org/alfresco/opencmis/CMISConnector.java +++ b/source/java/org/alfresco/opencmis/CMISConnector.java @@ -1262,7 +1262,15 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen */ public String createObjectId(NodeRef currentVersionNodeRef) { - if(getFileFolderService().getFileInfo(currentVersionNodeRef).isFolder()) + FileInfo fileInfo = getFileFolderService().getFileInfo(currentVersionNodeRef); + + if(fileInfo == null) + { + // not a file or a folder + return constructObjectId(currentVersionNodeRef, null); + } + + if(fileInfo.isFolder()) { return constructObjectId(currentVersionNodeRef, null); } @@ -1407,7 +1415,7 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen { return; } - + if (!childTypes.contains(childType)) { throw new CmisConstraintException("Objects of type '" + childType + "' cannot be added to this folder!"); diff --git a/source/java/org/alfresco/opencmis/CMISNodeInfoImpl.java b/source/java/org/alfresco/opencmis/CMISNodeInfoImpl.java index 6b7835e2fb..2e62fbf4b3 100644 --- a/source/java/org/alfresco/opencmis/CMISNodeInfoImpl.java +++ b/source/java/org/alfresco/opencmis/CMISNodeInfoImpl.java @@ -31,6 +31,7 @@ import org.alfresco.opencmis.dictionary.CMISNodeInfo; import org.alfresco.opencmis.dictionary.CMISObjectVariant; import org.alfresco.opencmis.dictionary.DocumentTypeDefinitionWrapper; import org.alfresco.opencmis.dictionary.FolderTypeDefintionWrapper; +import org.alfresco.opencmis.dictionary.ItemTypeDefinitionWrapper; import org.alfresco.opencmis.dictionary.RelationshipTypeDefintionWrapper; import org.alfresco.opencmis.dictionary.TypeDefinitionWrapper; import org.alfresco.repo.security.permissions.AccessDeniedException; @@ -74,6 +75,7 @@ public class CMISNodeInfoImpl implements CMISNodeInfo private String name; private boolean hasPWC; private Boolean isRootFolder; + private String cmisPath; private VersionHistory versionHistory; private Version version; @@ -281,6 +283,12 @@ public class CMISNodeInfoImpl implements CMISNodeInfo } return; } + + if(isItem()) + { + objecVariant = CMISObjectVariant.ITEM; + return; + } if (versionLabel == null) { @@ -448,6 +456,13 @@ public class CMISNodeInfoImpl implements CMISNodeInfo currentObjectId = objectId; return; } + else if (isItem()) + { + objecVariant = CMISObjectVariant.ITEM; + objectId = connector.constructObjectId(nodeRef, null); + currentObjectId = objectId; + return; + } else if (getType() == null) { objecVariant = CMISObjectVariant.NOT_A_CMIS_OBJECT; @@ -687,6 +702,11 @@ public class CMISNodeInfoImpl implements CMISNodeInfo { return getType() instanceof FolderTypeDefintionWrapper; } + + public boolean isItem() + { + return getType() instanceof ItemTypeDefinitionWrapper; + } public boolean isRootFolder() { @@ -807,7 +827,7 @@ public class CMISNodeInfoImpl implements CMISNodeInfo { return getVersion().getVersionProperty(VersionBaseModel.PROP_CREATED_DATE); } - } else if (isFolder()) + } else if (isFolder() || isItem()) { return connector.getNodeService().getProperty(nodeRef, ContentModel.PROP_CREATED); } else @@ -827,7 +847,7 @@ public class CMISNodeInfoImpl implements CMISNodeInfo { return getVersion().getVersionProperty(ContentModel.PROP_MODIFIED.getLocalName()); } - } else if (isFolder()) + } else if (isFolder() || isItem()) { return connector.getNodeService().getProperty(nodeRef, ContentModel.PROP_MODIFIED); } else diff --git a/source/java/org/alfresco/opencmis/mapping/BaseTypeIdProperty.java b/source/java/org/alfresco/opencmis/mapping/BaseTypeIdProperty.java index 46f7f064ca..79f588eaa1 100644 --- a/source/java/org/alfresco/opencmis/mapping/BaseTypeIdProperty.java +++ b/source/java/org/alfresco/opencmis/mapping/BaseTypeIdProperty.java @@ -48,10 +48,15 @@ public class BaseTypeIdProperty extends AbstractProperty if (nodeInfo.isFolder()) { return BaseTypeId.CMIS_FOLDER.value(); - } else if (nodeInfo.isRelationship()) + } + else if (nodeInfo.isRelationship()) { return BaseTypeId.CMIS_RELATIONSHIP.value(); } + else if(nodeInfo.isItem()) + { + return BaseTypeId.CMIS_ITEM.value(); + } return BaseTypeId.CMIS_DOCUMENT.value(); } diff --git a/source/java/org/alfresco/opencmis/mapping/RuntimePropertyAccessorMapping.java b/source/java/org/alfresco/opencmis/mapping/RuntimePropertyAccessorMapping.java index fbc38e0810..1c16aad138 100644 --- a/source/java/org/alfresco/opencmis/mapping/RuntimePropertyAccessorMapping.java +++ b/source/java/org/alfresco/opencmis/mapping/RuntimePropertyAccessorMapping.java @@ -279,6 +279,23 @@ public class RuntimePropertyAccessorMapping implements PropertyAccessorMapping, false)); registerEvaluator(BaseTypeId.CMIS_POLICY, new FixedValueActionEvaluator(serviceRegistry, Action.CAN_APPLY_ACL, false)); + + // permissions for ITEMS in order of CMIS-Core.xsd + registerEvaluator(BaseTypeId.CMIS_ITEM, new PermissionActionEvaluator(serviceRegistry, + Action.CAN_DELETE_OBJECT, PermissionService.DELETE_NODE)); + registerEvaluator(BaseTypeId.CMIS_ITEM, new PermissionActionEvaluator(serviceRegistry, + Action.CAN_UPDATE_PROPERTIES, PermissionService.WRITE_PROPERTIES)); + registerEvaluator(BaseTypeId.CMIS_ITEM, new PermissionActionEvaluator(serviceRegistry, + Action.CAN_GET_PROPERTIES, PermissionService.READ_PROPERTIES)); + registerEvaluator(BaseTypeId.CMIS_ITEM, new FixedValueActionEvaluator(serviceRegistry, + Action.CAN_GET_OBJECT_RELATIONSHIPS, true)); + registerEvaluator(BaseTypeId.CMIS_ITEM, new ParentActionEvaluator(new PermissionActionEvaluator( + serviceRegistry, Action.CAN_GET_OBJECT_PARENTS, PermissionService.READ_PERMISSIONS))); + registerEvaluator(BaseTypeId.CMIS_ITEM, new PermissionActionEvaluator(serviceRegistry, Action.CAN_GET_ACL, + PermissionService.READ_PERMISSIONS)); + registerEvaluator(BaseTypeId.CMIS_ITEM, new PermissionActionEvaluator(serviceRegistry, Action.CAN_APPLY_ACL, + PermissionService.CHANGE_PERMISSIONS)); + } public void init() diff --git a/source/test-java/org/alfresco/opencmis/CMISTest.java b/source/test-java/org/alfresco/opencmis/CMISTest.java index 025d8e1b5e..553cb80c29 100644 --- a/source/test-java/org/alfresco/opencmis/CMISTest.java +++ b/source/test-java/org/alfresco/opencmis/CMISTest.java @@ -1399,6 +1399,38 @@ public class CMISTest } }); } + + /** + * ACE-33 + * + * Cmis Item support + */ + @Test + public void testItems() + { + + withCmisService(new CmisServiceCallback() { + @Override + public String execute(CmisService cmisService) { + List repositories = cmisService.getRepositoryInfos(null); + assertTrue(repositories.size() > 0); + RepositoryInfo repo = repositories.get(0); + String repositoryId = repo.getId(); + + TypeDefinition def = cmisService.getTypeDefinition(repositoryId, "cmis:item", null); + assertNotNull("the cmis:item type is not defined", def); + + TypeDefinition p = cmisService.getTypeDefinition(repositoryId, "I:cm:person", null); + assertNotNull("the I:cm:person type is not defined", def); + + ObjectList result = cmisService.query(repositoryId, "select * from cm:person", Boolean.FALSE, Boolean.TRUE, IncludeRelationships.NONE, "", BigInteger.TEN, BigInteger.ZERO, null); + assertTrue("", result.getNumItems().intValue() > 0); + return ""; + + }; + }, CmisVersion.CMIS_1_1); + + } @Test public void testMNT10529() throws Exception