use of eu.bcvsolutions.idm.core.api.dto.filter.BaseFilter in project CzechIdMng by bcvsolutions.
the class DefaultIdmRoleService method toDto.
@Override
@SuppressWarnings("unchecked")
protected IdmRoleDto toDto(IdmRole entity, IdmRoleDto dto, IdmRoleFilter context) {
IdmRoleDto roleDto = super.toDto(entity, dto, context);
// Adds to result count of systems for this role, which are in cross-domain group.
if (context != null && context.getIncludeCrossDomainsSystemsCount() != null && context.getIncludeCrossDomainsSystemsCount() && roleDto != null && roleDto.getId() != null && roleSystemService instanceof AbstractReadDtoService) {
@SuppressWarnings(value = "rawtypes") AbstractReadDtoService roleSystemService = (AbstractReadDtoService) this.roleSystemService;
BaseFilter roleSystemFilter = roleSystemService.createFilterInstance();
if (roleSystemFilter instanceof IdmRoleSystemFilter) {
IdmRoleSystemFilter idmRoleSystemFilter = (IdmRoleSystemFilter) roleSystemFilter;
idmRoleSystemFilter.setIsInCrossDomainGroupRoleId(roleDto.getId());
// Permission: User can read role -> can read connected systems.
long count = roleSystemService.count(idmRoleSystemFilter);
roleDto.setSystemsInCrossDomains(count);
}
}
return roleDto;
}
use of eu.bcvsolutions.idm.core.api.dto.filter.BaseFilter in project CzechIdMng by bcvsolutions.
the class GeneralEntityExport method getAuthoritiesForEntity.
@Override
@SuppressWarnings("rawtypes")
protected List<String> getAuthoritiesForEntity() {
ReadWriteDtoService<AbstractDto, BaseFilter> service = getService();
if (!(service instanceof AuthorizableService)) {
// Service is not authorizable => only super admin can use report.
return Lists.newArrayList(IdmGroupPermission.APP_ADMIN);
}
AuthorizableService authorizableService = (AuthorizableService) service;
AuthorizableType authorizableType = authorizableService.getAuthorizableType();
if (authorizableType == null) {
// Service is authorizable but group is not specified => only super admin can use report.
return Lists.newArrayList(IdmGroupPermission.APP_ADMIN);
}
boolean readPermissionFound = authorizableType.getGroup().getPermissions().stream().filter(permission -> IdmBasePermission.READ == permission).findFirst().isPresent();
if (!readPermissionFound) {
// By default only super admin can use report.
return Lists.newArrayList(IdmGroupPermission.APP_ADMIN);
}
// If exist, read permission for that type will be returned.
return Lists.newArrayList(MessageFormat.format("{0}{1}{2}", authorizableType.getGroup().getName(), IdmBasePermission.SEPARATOR, IdmBasePermission.READ.name()));
}
use of eu.bcvsolutions.idm.core.api.dto.filter.BaseFilter in project CzechIdMng by bcvsolutions.
the class DefaultRequestManager method findPotencialParents.
/**
* Find potential parents. Invokes all method with UUID return type and without
* input parameters.
*
* @param filter
* @return
*/
private List<RequestPredicate> findPotencialParents(BaseFilter filter) {
Assert.notNull(filter, "Filter is mandatory!");
List<MethodDescriptor> descriptors;
try {
descriptors = //
Lists.newArrayList(Introspector.getBeanInfo(filter.getClass()).getMethodDescriptors()).stream().filter(//
methodDescriptor -> UUID.class.equals(methodDescriptor.getMethod().getReturnType())).filter(methodDescriptor -> methodDescriptor.getMethod().getParameterTypes() == null || //
methodDescriptor.getMethod().getParameterTypes().length == 0).collect(Collectors.toList());
} catch (IntrospectionException e) {
throw new CoreException(e);
}
//
List<RequestPredicate> results = new ArrayList<>();
descriptors.stream().forEach(descriptor -> {
try {
Object value = descriptor.getMethod().invoke(filter, new Object[] {});
if (value == null) {
return;
}
RequestFilterPredicate filterPredicate = descriptor.getMethod().getAnnotation(RequestFilterPredicate.class);
results.add(new RequestPredicate((UUID) value, filterPredicate != null ? filterPredicate.field() : null));
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
throw new CoreException(e);
}
});
return results;
}
use of eu.bcvsolutions.idm.core.api.dto.filter.BaseFilter in project CzechIdMng by bcvsolutions.
the class DefaultRequestManager method find.
@Override
public <R extends Requestable> Page<R> find(Class<? extends R> dtoClass, Serializable requestId, BaseFilter filter, Pageable pageable, IdmBasePermission... permission) {
if (pageable == null) {
// pageable is required in spring data
pageable = PageRequest.of(0, Integer.MAX_VALUE);
}
ReadDtoService<R, BaseFilter> dtoReadService = getDtoService(dtoClass);
Page<R> originalPage = dtoReadService.find(filter, pageable, permission);
List<R> originals = originalPage.getContent();
List<R> results = new ArrayList<>();
IdmRequestDto request = requestService.get(requestId);
List<IdmRequestItemDto> items = this.findRequestItems(request.getId(), dtoClass);
originals.stream().forEach(dto -> {
IdmRequestItemDto item = //
items.stream().filter(//
i -> dto.getId().equals(i.getOwnerId())).findFirst().orElse(//
null);
if (item == null) {
// None item found -> result is original DTO
results.add(dto);
return;
}
if (Strings.isNullOrEmpty(item.getData())) {
// Item found, but does not contains any DTO. So original DTO will be result
// (with connected item)
addRequestItemToDto(dto, item);
results.add(dto);
return;
}
try {
// Item with data found. Data in the request is result
R requestedDto = this.convertItemToDto(item, dtoClass);
addEmbedded((AbstractDto) requestedDto, request.getId());
addRequestItemToDto((Requestable) requestedDto, item);
results.add(requestedDto);
return;
} catch (IOException | ReflectiveOperationException | IllegalArgumentException | IntrospectionException e) {
throw new ResultCodeException(CoreResultCode.JSON_CANNOT_BE_CONVERT_TO_DTO, ImmutableMap.of("json", item.getData()));
}
});
// !!Searching of added DTOs are very naive!!
// We use all UUID value in the filter and try to find it in the DTOs. It means
// only equals is implemented.
// Find potential parents
List<RequestPredicate> potencialParents = this.findPotencialParents(filter);
results.addAll(this.findRelatedAddedItems(request, potencialParents, items, dtoClass));
// Set all results as trimmed = true. FE expects trimmed value in the table.
results.forEach(result -> ((AbstractDto) result).setTrimmed(true));
return new PageImpl<>(results, pageable, originalPage.getTotalElements());
}
use of eu.bcvsolutions.idm.core.api.dto.filter.BaseFilter in project CzechIdMng by bcvsolutions.
the class DefaultIdmRequestIdentityRoleService method conceptToRequestIdentityRole.
/**
* Converts concept to the request-identity-roles.
*
* @param concept
* @param filter
* @return
*/
@SuppressWarnings("unchecked")
private IdmRequestIdentityRoleDto conceptToRequestIdentityRole(IdmConceptRoleRequestDto concept, IdmRequestIdentityRoleFilter filter) {
IdmRequestIdentityRoleDto requestIdentityRoleDto = modelMapper.map(concept, IdmRequestIdentityRoleDto.class);
// load permission from related contract or role (OR)
if (// from find method only
filter != null && // newly requested role only
ConceptRoleRequestOperation.ADD == concept.getOperation() && !concept.getState().isTerminatedState()) {
// not terminated concepts
// by related contract (backward compatible)
IdmIdentityContractDto contract = lookupService.lookupEmbeddedDto(concept, IdmConceptRoleRequest_.identityContract);
Set<String> contractPermissions = identityContractService.getPermissions(contract);
if (PermissionUtils.hasPermission(contractPermissions, ContractBasePermission.CHANGEPERMISSION)) {
Set<String> permissions = requestIdentityRoleDto.getPermissions();
if (permissions == null) {
permissions = new HashSet<>();
}
permissions.add(ContractBasePermission.CHANGEPERMISSION.getName());
requestIdentityRoleDto.setPermissions(permissions);
} else {
// by related role
IdmRoleDto role = lookupService.lookupEmbeddedDto(concept, IdmConceptRoleRequest_.role);
Set<String> rolePermissions = roleService.getPermissions(role);
if (PermissionUtils.hasPermission(rolePermissions, RoleBasePermission.CHANGEPERMISSION)) {
Set<String> permissions = requestIdentityRoleDto.getPermissions();
if (permissions == null) {
permissions = new HashSet<>();
}
permissions.add(RoleBasePermission.CHANGEPERMISSION.getName());
requestIdentityRoleDto.setPermissions(permissions);
}
}
}
if (filter != null && filter.isIncludeEav()) {
IdmFormInstanceDto formInstanceDto;
if (ConceptRoleRequestOperation.REMOVE == concept.getOperation()) {
IdmIdentityRoleDto identityRole = DtoUtils.getEmbedded(concept, IdmConceptRoleRequest_.identityRole, IdmIdentityRoleDto.class, (IdmIdentityRoleDto) null);
if (identityRole == null) {
// Identity-role was not found, remove concept was executed (identity-role was removed).
return addCandidates(requestIdentityRoleDto, concept, filter);
}
formInstanceDto = identityRoleService.getRoleAttributeValues(identityRole);
} else {
// Check on change of values is made only on ended request! 'Original' value is current value and in audit it was confusing (only 'new' value is show now).
formInstanceDto = conceptRoleService.getRoleAttributeValues(concept, !concept.getState().isTerminatedState());
}
addEav(requestIdentityRoleDto, formInstanceDto);
}
// Include info if is role in cross-domain group.
if (filter != null && filter.isIncludeCrossDomainsSystemsCount()) {
if (ConceptRoleRequestOperation.REMOVE != concept.getOperation()) {
IdmRoleDto roleDto = DtoUtils.getEmbedded(concept, IdmConceptRoleRequest_.role.getName(), IdmRoleDto.class, null);
if (roleDto != null && this.roleSystemService instanceof AbstractReadDtoService) {
AbstractReadDtoService<?, ?, IdmRoleSystemFilter> roleSystemService = (AbstractReadDtoService<?, ?, IdmRoleSystemFilter>) this.roleSystemService;
BaseFilter roleSystemFilter = roleSystemService.createFilterInstance();
if (roleSystemFilter instanceof IdmRoleSystemFilter) {
IdmRoleSystemFilter idmRoleSystemFilter = (IdmRoleSystemFilter) roleSystemFilter;
idmRoleSystemFilter.setIsInCrossDomainGroupRoleId(roleDto.getId());
long count = roleSystemService.count(idmRoleSystemFilter);
roleDto.setSystemsInCrossDomains(count);
}
}
}
}
return addCandidates(requestIdentityRoleDto, concept, filter);
}
Aggregations