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);
+ }
+
+}