/******************************************************************************* * Copyright (c) 2013 aegif. * * This file is part of NemakiWare. * * NemakiWare is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * NemakiWare 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 General Public License for more details. * * You should have received a copy of the GNU General Public License along with NemakiWare. * If not, see <http://www.gnu.org/licenses/>. * * Contributors: * linzhixing(https://github.com/linzhixing) - initial API and implementation ******************************************************************************/ package jp.aegif.nemaki.cmis.service.impl; import java.math.BigInteger; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.locks.Lock; import jp.aegif.nemaki.businesslogic.ContentService; import jp.aegif.nemaki.cmis.aspect.CompileService; import jp.aegif.nemaki.cmis.aspect.ExceptionService; import jp.aegif.nemaki.cmis.aspect.type.TypeManager; import jp.aegif.nemaki.cmis.service.RelationshipService; import jp.aegif.nemaki.model.Content; import jp.aegif.nemaki.model.Relationship; import jp.aegif.nemaki.util.constant.DomainType; import jp.aegif.nemaki.util.lock.ThreadLockService; import org.apache.chemistry.opencmis.commons.data.ExtensionsData; import org.apache.chemistry.opencmis.commons.data.ObjectList; import org.apache.chemistry.opencmis.commons.data.PermissionMapping; import org.apache.chemistry.opencmis.commons.definitions.TypeDefinitionContainer; import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships; import org.apache.chemistry.opencmis.commons.enums.RelationshipDirection; import org.apache.chemistry.opencmis.commons.server.CallContext; public class RelationshipServiceImpl implements RelationshipService { private TypeManager typeManager; private ContentService contentService; private CompileService compileService; private ExceptionService exceptionService; private ThreadLockService threadLockService; @Override public ObjectList getObjectRelationships(CallContext callContext, String repositoryId, String objectId, Boolean includeSubRelationshipTypes, RelationshipDirection relationshipDirection, String typeId, String filter, Boolean includeAllowableActions, BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) { exceptionService.invalidArgumentRequiredString("objectId", objectId); Lock lock = threadLockService.getReadLock(repositoryId, objectId); try{ lock.lock(); // ////////////////// // General Exception // ////////////////// Content content = contentService.getContent(repositoryId, objectId); exceptionService.objectNotFound(DomainType.OBJECT, content, objectId); exceptionService.permissionDenied(callContext, repositoryId, PermissionMapping.CAN_GET_OBJECT_RELATIONSHIPS_OBJECT, content); // ////////////////// // Body of the method // ////////////////// // Set default relationshipDirection = (relationshipDirection == null) ? RelationshipDirection.SOURCE : relationshipDirection; List<Relationship> rels = contentService.getRelationsipsOfObject( repositoryId, objectId, relationshipDirection); // Filtering results List<Relationship> extracted = new ArrayList<Relationship>(); if (typeId != null) { Set<String> typeIds = new HashSet<String>(); typeIds.add(typeId); if (includeSubRelationshipTypes) { List<TypeDefinitionContainer> descendants = typeManager .getTypesDescendants(repositoryId, typeId, BigInteger.valueOf(-1), false); for (TypeDefinitionContainer tdc : descendants) { typeIds.add(tdc.getTypeDefinition().getId()); } } for (Relationship rel : rels) { if (typeIds.contains(rel.getId())) { extracted.add(rel); } } } else { extracted = rels; } // Compile to ObjectData return compileService.compileObjectDataList(callContext, repositoryId, extracted, filter, includeAllowableActions, IncludeRelationships.NONE, null, false, maxItems, skipCount, false, null); }finally{ lock.unlock(); } } public void setTypeManager(TypeManager typeManager) { this.typeManager = typeManager; } public void setContentService(ContentService contentService) { this.contentService = contentService; } public void setCompileService(CompileService compileService) { this.compileService = compileService; } public void setExceptionService(ExceptionService exceptionService) { this.exceptionService = exceptionService; } public void setThreadLockService(ThreadLockService threadLockService) { this.threadLockService = threadLockService; } }