package jnpf.dmsPermission; import jnpf.dmsEntity.permission.entity.DmsFilePermissionEntity; import jnpf.dmsEntity.permission.enums.DmsPrincipalType; import jnpf.dmsEntity.permission.enums.DmsResourceScope; import jnpf.dmsEntity.permission.enums.DmsResourceType; import jnpf.dmsEntity.permission.model.DmsResourcePath; import jnpf.dmsEntity.permission.model.DmsSubjectSet; import org.springframework.stereotype.Component; @Component public class DmsPermissionMatcher { public boolean matches(DmsFilePermissionEntity permission, DmsResourcePath path, DmsSubjectSet subjects) { return matchesPrincipal(permission, subjects) && coversResource(permission, path); } public boolean matchesPrincipal(DmsFilePermissionEntity permission, DmsSubjectSet subjects) { DmsPrincipalType type = DmsPrincipalType.valueOf(permission.getPrincipalType()); String id = permission.getPrincipalId(); switch (type) { case USER: return id.equals(subjects.getUserId()); case ORG: return Boolean.TRUE.equals(permission.getIncludeChildOrgs()) ? subjects.getAncestorOrgIds().contains(id) : subjects.getDirectOrgIds().contains(id); case POSITION: return subjects.getPositionIds().contains(id); case ROLE: return subjects.getRoleIds().contains(id); case GROUP: return subjects.getPermissionGroupIds().contains(id); default: return false; } } public boolean coversResource(DmsFilePermissionEntity permission, DmsResourcePath path) { DmsResourceType grantedType = DmsResourceType.valueOf(permission.getResourceType()); if (grantedType == DmsResourceType.FILE_VERSION) { return DmsResourceType.FILE_VERSION.name().equals(path.getActualResourceType()) && permission.getResourceId().equals(path.getActualResourceId()); } if (grantedType == DmsResourceType.DOCUMENT) { return permission.getResourceId().equals(path.getDocumentId()); } if (DmsResourceScope.SUBTREE.name().equals(permission.getResourceScope())) { return path.getFolderPath().contains(permission.getResourceId()); } return permission.getResourceId().equals(path.getDirectFolderId()); } }