package jp.aegif.nemaki.cmis.service.impl; import java.util.List; import java.util.concurrent.locks.Lock; import org.apache.chemistry.opencmis.commons.data.PermissionMapping; import org.apache.chemistry.opencmis.commons.server.CallContext; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import jp.aegif.nemaki.businesslogic.ContentService; import jp.aegif.nemaki.cmis.aspect.ExceptionService; import jp.aegif.nemaki.model.Content; import jp.aegif.nemaki.util.cache.NemakiCachePool; import jp.aegif.nemaki.util.constant.DomainType; import jp.aegif.nemaki.util.lock.ThreadLockService; public class ObjectServiceInternalImpl implements jp.aegif.nemaki.cmis.service.ObjectServiceInternal{ private static final Log log = LogFactory .getLog(ObjectServiceInternalImpl.class); private ContentService contentService; private ExceptionService exceptionService; private ThreadLockService threadLockService; private NemakiCachePool nemakiCachePool; @Override public void deleteObjectInternal(CallContext callContext, String repositoryId, String objectId, Boolean allVersions, Boolean deleteWithParent) { exceptionService.invalidArgumentRequiredString("objectId", objectId); Content content = contentService.getContent(repositoryId, objectId); deleteObjectInternal(callContext, repositoryId, content, allVersions, deleteWithParent); } @Override public void deleteObjectInternal(CallContext callContext, String repositoryId, Content content, Boolean allVersions, Boolean deleteWithParent) { Lock lock = threadLockService.getWriteLock(repositoryId, content.getId()); try{ lock.lock(); // ////////////////// // General Exception // ////////////////// String objectId = content.getId(); exceptionService.permissionDenied(callContext, repositoryId, PermissionMapping.CAN_DELETE_OBJECT, content); exceptionService.constraintDeleteRootFolder(repositoryId, objectId); exceptionService.objectNotFound(DomainType.OBJECT, content, objectId); // ////////////////// // Body of the method // ////////////////// if (content.isDocument()) { contentService.deleteDocument(callContext, repositoryId, content.getId(), allVersions, deleteWithParent); } else if (content.isFolder()) { List<Content> children = contentService.getChildren(repositoryId, objectId); if (!CollectionUtils.isEmpty(children)) { exceptionService .constraint(objectId, "deleteObject method is invoked on a folder containing objects."); } contentService.delete(callContext, repositoryId, objectId, deleteWithParent); } else { contentService.delete(callContext, repositoryId, objectId, deleteWithParent); } nemakiCachePool.get(repositoryId).removeCmisCache(content.getId()); }finally{ lock.unlock(); } } public void setContentService(ContentService contentService) { this.contentService = contentService; } public void setExceptionService(ExceptionService exceptionService) { this.exceptionService = exceptionService; } public void setThreadLockService(ThreadLockService threadLockService) { this.threadLockService = threadLockService; } public void setNemakiCachePool(NemakiCachePool nemakiCachePool) { this.nemakiCachePool = nemakiCachePool; } }