diff --git a/source/java/org/alfresco/cmis/mapping/CMISMapping.java b/source/java/org/alfresco/cmis/mapping/CMISMapping.java index 64bceee234..13c129950d 100644 --- a/source/java/org/alfresco/cmis/mapping/CMISMapping.java +++ b/source/java/org/alfresco/cmis/mapping/CMISMapping.java @@ -221,7 +221,7 @@ public class CMISMapping implements InitializingBean // Is CAN_MOVE correct mapping? registerEvaluator(CMISScope.DOCUMENT, new PermissionActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_MOVE_OBJECT, PermissionService.DELETE_NODE)); registerEvaluator(CMISScope.DOCUMENT, new PermissionActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_DELETE_CONTENT_STREAM, PermissionService.WRITE_PROPERTIES, PermissionService.WRITE_CONTENT)); - registerEvaluator(CMISScope.DOCUMENT, new PermissionActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_CHECKOUT, PermissionService.CHECK_OUT)); + registerEvaluator(CMISScope.DOCUMENT, new CanCheckOutActionEvaluator(serviceRegistry)); registerEvaluator(CMISScope.DOCUMENT, new PermissionActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_CANCEL_CHECKOUT, PermissionService.CANCEL_CHECK_OUT)); registerEvaluator(CMISScope.DOCUMENT, new PermissionActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_CHECKIN, PermissionService.CHECK_IN)); registerEvaluator(CMISScope.DOCUMENT, new PermissionActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_SET_CONTENT_STREAM, PermissionService.WRITE_CONTENT)); diff --git a/source/java/org/alfresco/cmis/mapping/CanCheckOutActionEvaluator.java b/source/java/org/alfresco/cmis/mapping/CanCheckOutActionEvaluator.java new file mode 100644 index 0000000000..c9a6054784 --- /dev/null +++ b/source/java/org/alfresco/cmis/mapping/CanCheckOutActionEvaluator.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.cmis.mapping; + +import org.alfresco.cmis.CMISAllowedActionEnum; +import org.alfresco.model.ContentModel; +import org.alfresco.service.ServiceRegistry; +import org.alfresco.service.cmr.lock.LockService; +import org.alfresco.service.cmr.lock.LockType; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.cmr.security.PermissionService; + +/** + * Alfresco Permission based Action Evaluator + * + * @author davidc + */ +public class CanCheckOutActionEvaluator extends AbstractActionEvaluator +{ + private PermissionActionEvaluator permissionEvaluator; + private NodeService nodeService; + private LockService lockService; + + /** + * Construct + * + * @param serviceRegistry + * @param permission + */ + protected CanCheckOutActionEvaluator(ServiceRegistry serviceRegistry) + { + super(serviceRegistry, CMISAllowedActionEnum.CAN_CHECKOUT); + permissionEvaluator = new PermissionActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_CHECKOUT, PermissionService.CHECK_OUT); + nodeService = serviceRegistry.getNodeService(); + lockService = serviceRegistry.getLockService(); + } + + /* + * (non-Javadoc) + * @see org.alfresco.cmis.CMISActionEvaluator#isAllowed(org.alfresco.service.cmr.repository.NodeRef) + */ + public boolean isAllowed(NodeRef nodeRef) + { + if (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_WORKING_COPY) || + lockService.getLockType(nodeRef) == LockType.READ_ONLY_LOCK) + { + return false; + } + return permissionEvaluator.isAllowed(nodeRef); + } + +}