Search in sources :

Example 1 with IdmRequestItemDto

use of eu.bcvsolutions.idm.core.api.dto.IdmRequestItemDto in project CzechIdMng by bcvsolutions.

the class DefaultRequestManager method executeRequestInternal.

@SuppressWarnings("unchecked")
private IdmRequestDto executeRequestInternal(UUID requestId) {
    Assert.notNull(requestId, "Role request ID is required!");
    IdmRequestDto request = requestService.get(requestId);
    Assert.notNull(request, "Role request is required!");
    // Validate request
    List<IdmRequestItemDto> items = this.findRequestItems(request.getId(), null);
    if (items.isEmpty()) {
        throw new ResultCodeException(CoreResultCode.REQUEST_CANNOT_BE_EXECUTED_NONE_ITEMS, ImmutableMap.of("request", request.toString()));
    }
    List<IdmRequestItemDto> sortedItems = items.stream().sorted(Comparator.comparing(IdmRequestItemDto::getCreated)).collect(Collectors.toList());
    // Validate items
    // 
    sortedItems.stream().filter(// 
    item -> !item.getState().isTerminatedState()).filter(// 
    item -> !(RequestState.CONCEPT == item.getState() || RequestState.APPROVED == item.getState())).forEach(item -> {
        // 
        throw new ResultCodeException(CoreResultCode.REQUEST_ITEM_CANNOT_BE_EXECUTED, ImmutableMap.of("item", item.toString(), "state", item.getState()));
    });
    // 
    sortedItems.stream().filter(item -> RequestOperationType.ADD == item.getOperation() || // 
    RequestOperationType.UPDATE == item.getOperation()).forEach(item -> {
        // 
        // Get DTO service
        Requestable dto = null;
        try {
            Class<? extends Requestable> dtoClass = (Class<? extends Requestable>) Class.forName(item.getOwnerType());
            ReadWriteDtoService<Requestable, BaseFilter> dtoService = (ReadWriteDtoService<Requestable, BaseFilter>) getServiceByItem(item, dtoClass);
            dto = this.convertItemToDto(item, dtoClass);
            dtoService.validateDto((Requestable) dto);
        } catch (Exception e) {
            throw new RoleRequestException(CoreResultCode.REQUEST_ITEM_IS_NOT_VALID, ImmutableMap.of("dto", dto != null ? dto.toString() : null, "item", item.toString()), e);
        }
    });
    // We have to ensure the referential integrity, because some items (his DTOs)
    // could be child of terminated (Disapproved, Cancelled) item (DTO)
    // 
    sortedItems.stream().filter(// We check terminated ADDed items (Executed state could not yet occur)
    item -> item.getState().isTerminatedState()).filter(// 
    item -> RequestOperationType.ADD == item.getOperation()).filter(// 
    item -> item.getOwnerId() != null).forEach(terminatedItem -> {
        // Create predicate - find all DTOs with that UUID value in any fields
        ImmutableList<RequestPredicate> predicates = ImmutableList.of(new RequestPredicate(terminatedItem.getOwnerId(), null));
        // 
        sortedItems.stream().filter(// 
        item -> !item.getState().isTerminatedState()).filter(item -> {
            // Is that item child of terminated item?
            try {
                Class<? extends Requestable> ownerType = (Class<? extends Requestable>) Class.forName(item.getOwnerType());
                Requestable requestable = requestManager.convertItemToDto(item, ownerType);
                List<Requestable> filteredDtos = requestManager.filterDtosByPredicates(ImmutableList.of(requestable), ownerType, predicates);
                return filteredDtos.contains(requestable);
            } catch (ClassNotFoundException | IOException e) {
                throw new CoreException(e);
            }
        }).forEach(itemToCancel -> {
            // This item could be not executed, because is use in other
            // already terminated (added) item.
            itemToCancel.setState(RequestState.CANCELED);
            itemToCancel.setResult(new OperationResultDto.Builder(OperationState.NOT_EXECUTED).setException(new RoleRequestException(CoreResultCode.REQUEST_ITEM_NOT_EXECUTED_PARENT_CANCELED, ImmutableMap.of("item", itemToCancel.toString(), "terminatedItem", terminatedItem.toString()))).build());
            requestItemService.save(itemToCancel);
        });
    });
    // Reload items ... could be changed
    items = this.findRequestItems(request.getId(), null);
    List<IdmRequestItemDto> sortedItemsResult = items.stream().sorted(Comparator.comparing(IdmRequestItemDto::getCreated)).collect(Collectors.toList());
    // 
    sortedItemsResult.stream().filter(// 
    item -> !item.getState().isTerminatedState()).forEach(item -> {
        try {
            this.resolveItem(item);
        } catch (ClassNotFoundException | IOException e) {
            throw new CoreException(e);
        }
    });
    request.setState(RequestState.EXECUTED);
    request.setResult(new OperationResultDto.Builder(OperationState.EXECUTED).build());
    return requestService.save(request);
}
Also used : DtoUtils(eu.bcvsolutions.idm.core.api.utils.DtoUtils) IdmRequestItemDto(eu.bcvsolutions.idm.core.api.dto.IdmRequestItemDto) IdmFormAttributeDto(eu.bcvsolutions.idm.core.eav.api.dto.IdmFormAttributeDto) Autowired(org.springframework.beans.factory.annotation.Autowired) FormService(eu.bcvsolutions.idm.core.eav.api.service.FormService) SecurityService(eu.bcvsolutions.idm.core.security.api.service.SecurityService) Map(java.util.Map) IdmRequestDto(eu.bcvsolutions.idm.core.api.dto.IdmRequestDto) PageRequest(org.springframework.data.domain.PageRequest) Page(org.springframework.data.domain.Page) IntrospectionException(java.beans.IntrospectionException) Serializable(java.io.Serializable) InvocationTargetException(java.lang.reflect.InvocationTargetException) PropertyDescriptor(java.beans.PropertyDescriptor) Builder(eu.bcvsolutions.idm.core.api.dto.OperationResultDto.Builder) Lazy(org.springframework.context.annotation.Lazy) GuardedString(eu.bcvsolutions.idm.core.security.api.domain.GuardedString) RequestOperationType(eu.bcvsolutions.idm.core.api.domain.RequestOperationType) ArrayList(java.util.ArrayList) LinkedHashMap(java.util.LinkedHashMap) Introspector(java.beans.Introspector) Strings(com.google.common.base.Strings) AbstractDto(eu.bcvsolutions.idm.core.api.dto.AbstractDto) IdmBasePermission(eu.bcvsolutions.idm.core.security.api.domain.IdmBasePermission) Lists(com.google.common.collect.Lists) BaseEntity(eu.bcvsolutions.idm.core.api.entity.BaseEntity) LookupService(eu.bcvsolutions.idm.core.api.service.LookupService) Service(org.springframework.stereotype.Service) WorkflowProcessInstanceService(eu.bcvsolutions.idm.core.workflow.service.WorkflowProcessInstanceService) IdmFormInstanceDto(eu.bcvsolutions.idm.core.eav.api.dto.IdmFormInstanceDto) Requestable(eu.bcvsolutions.idm.core.api.domain.Requestable) CoreException(eu.bcvsolutions.idm.core.api.exception.CoreException) OperationState(eu.bcvsolutions.idm.core.api.domain.OperationState) IOException(java.io.IOException) Field(java.lang.reflect.Field) BaseFilter(eu.bcvsolutions.idm.core.api.dto.filter.BaseFilter) IdmFormDefinitionDto(eu.bcvsolutions.idm.core.eav.api.dto.IdmFormDefinitionDto) IdmRoleDto(eu.bcvsolutions.idm.core.api.dto.IdmRoleDto) IdmRequestItemService(eu.bcvsolutions.idm.core.api.service.IdmRequestItemService) CoreResultCode(eu.bcvsolutions.idm.core.api.domain.CoreResultCode) FormValueService(eu.bcvsolutions.idm.core.eav.api.service.FormValueService) RequestEventType(eu.bcvsolutions.idm.core.model.event.RequestEvent.RequestEventType) BaseDto(eu.bcvsolutions.idm.core.api.dto.BaseDto) EntityEventManager(eu.bcvsolutions.idm.core.api.service.EntityEventManager) Embedded(eu.bcvsolutions.idm.core.api.domain.Embedded) RequestEvent(eu.bcvsolutions.idm.core.model.event.RequestEvent) RequestState(eu.bcvsolutions.idm.core.api.domain.RequestState) RoleRequestException(eu.bcvsolutions.idm.core.api.exception.RoleRequestException) CoreGroupPermission(eu.bcvsolutions.idm.core.model.domain.CoreGroupPermission) IdmFormValueDto(eu.bcvsolutions.idm.core.eav.api.dto.IdmFormValueDto) ResultCodeException(eu.bcvsolutions.idm.core.api.exception.ResultCodeException) BasePermission(eu.bcvsolutions.idm.core.security.api.domain.BasePermission) ProcessInstance(org.activiti.engine.runtime.ProcessInstance) Pageable(org.springframework.data.domain.Pageable) ImmutableMap(com.google.common.collect.ImmutableMap) Collection(java.util.Collection) ReadWriteDtoService(eu.bcvsolutions.idm.core.api.service.ReadWriteDtoService) RequestManager(eu.bcvsolutions.idm.core.api.service.RequestManager) AcceptedException(eu.bcvsolutions.idm.core.api.exception.AcceptedException) UUID(java.util.UUID) Collectors(java.util.stream.Collectors) List(java.util.List) ExceptionUtils(eu.bcvsolutions.idm.core.api.utils.ExceptionUtils) Modifier(java.lang.reflect.Modifier) Entry(java.util.Map.Entry) Identifiable(eu.bcvsolutions.idm.core.api.domain.Identifiable) RoleRequestApprovalProcessor(eu.bcvsolutions.idm.core.model.event.processor.role.RoleRequestApprovalProcessor) PageImpl(org.springframework.data.domain.PageImpl) IdmRequestService(eu.bcvsolutions.idm.core.api.service.IdmRequestService) FormableEntity(eu.bcvsolutions.idm.core.eav.api.entity.FormableEntity) IdmRequestItem(eu.bcvsolutions.idm.core.model.entity.IdmRequestItem) HashMap(java.util.HashMap) MessageFormat(java.text.MessageFormat) ConfidentialStorage(eu.bcvsolutions.idm.core.api.service.ConfidentialStorage) ReadDtoService(eu.bcvsolutions.idm.core.api.service.ReadDtoService) RequestFilterPredicate(eu.bcvsolutions.idm.core.api.domain.RequestFilterPredicate) ImmutableList(com.google.common.collect.ImmutableList) CollectionUtils(org.apache.commons.collections.CollectionUtils) Propagation(org.springframework.transaction.annotation.Propagation) OperationResultDto(eu.bcvsolutions.idm.core.api.dto.OperationResultDto) EntityUtils(eu.bcvsolutions.idm.core.api.utils.EntityUtils) Qualifier(org.springframework.beans.factory.annotation.Qualifier) JsonIgnore(com.fasterxml.jackson.annotation.JsonIgnore) Niceable(eu.bcvsolutions.idm.core.api.domain.Niceable) IdmRequestItemFilter(eu.bcvsolutions.idm.core.api.dto.filter.IdmRequestItemFilter) EntityEvent(eu.bcvsolutions.idm.core.api.event.EntityEvent) Codeable(eu.bcvsolutions.idm.core.api.domain.Codeable) IdmRequestAttributeValueDto(eu.bcvsolutions.idm.core.api.dto.IdmRequestAttributeValueDto) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) IdmRequestItemChangesDto(eu.bcvsolutions.idm.core.api.dto.IdmRequestItemChangesDto) MethodDescriptor(java.beans.MethodDescriptor) ApplicationContext(org.springframework.context.ApplicationContext) ConfigurationMap(eu.bcvsolutions.idm.core.api.domain.ConfigurationMap) IdmRequestItemAttributeDto(eu.bcvsolutions.idm.core.api.dto.IdmRequestItemAttributeDto) Comparator(java.util.Comparator) IdmRequestFilter(eu.bcvsolutions.idm.core.api.dto.filter.IdmRequestFilter) Transactional(org.springframework.transaction.annotation.Transactional) Assert(org.springframework.util.Assert) RoleRequestException(eu.bcvsolutions.idm.core.api.exception.RoleRequestException) Builder(eu.bcvsolutions.idm.core.api.dto.OperationResultDto.Builder) ResultCodeException(eu.bcvsolutions.idm.core.api.exception.ResultCodeException) Builder(eu.bcvsolutions.idm.core.api.dto.OperationResultDto.Builder) OperationResultDto(eu.bcvsolutions.idm.core.api.dto.OperationResultDto) IdmRequestDto(eu.bcvsolutions.idm.core.api.dto.IdmRequestDto) IOException(java.io.IOException) BaseFilter(eu.bcvsolutions.idm.core.api.dto.filter.BaseFilter) IntrospectionException(java.beans.IntrospectionException) InvocationTargetException(java.lang.reflect.InvocationTargetException) CoreException(eu.bcvsolutions.idm.core.api.exception.CoreException) IOException(java.io.IOException) RoleRequestException(eu.bcvsolutions.idm.core.api.exception.RoleRequestException) ResultCodeException(eu.bcvsolutions.idm.core.api.exception.ResultCodeException) AcceptedException(eu.bcvsolutions.idm.core.api.exception.AcceptedException) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) IdmRequestItemDto(eu.bcvsolutions.idm.core.api.dto.IdmRequestItemDto) CoreException(eu.bcvsolutions.idm.core.api.exception.CoreException) Requestable(eu.bcvsolutions.idm.core.api.domain.Requestable) ReadWriteDtoService(eu.bcvsolutions.idm.core.api.service.ReadWriteDtoService) ArrayList(java.util.ArrayList) List(java.util.List) ImmutableList(com.google.common.collect.ImmutableList)

Example 2 with IdmRequestItemDto

use of eu.bcvsolutions.idm.core.api.dto.IdmRequestItemDto in project CzechIdMng by bcvsolutions.

the class DefaultRequestManager method getFormInstance.

@SuppressWarnings("unchecked")
@Override
public <R extends Requestable> IdmFormInstanceDto getFormInstance(UUID requestId, R owner, IdmFormDefinitionDto formDefinition, BasePermission... permission) {
    Assert.notNull(requestId, "ID of request is required!");
    Assert.notNull(owner, "Owner is required!");
    Assert.notNull(formDefinition, "Form definition is required!");
    boolean isNew = getDtoService(owner).isNew(owner);
    List<IdmFormValueDto> requestValues = new ArrayList<>();
    // (owner does not exist) would be throw.
    if (!isNew) {
        IdmFormInstanceDto previousFormInstance = formService.getFormInstance(owner, formDefinition, permission);
        List<IdmFormValueDto> originalValues = previousFormInstance.getValues();
        originalValues.forEach(value -> {
            requestValues.add((IdmFormValueDto) this.get(requestId, (R) value));
        });
    }
    IdmRequestDto request = requestService.get(requestId);
    // Load all added items for that request
    List<IdmRequestItemDto> addedItems = this.findRequestItems(request.getId(), IdmFormValueDto.class, RequestOperationType.ADD);
    // Find added items for that owner ID
    List<R> relatedAddedItems = this.findRelatedAddedItems(request, ImmutableList.of(new RequestPredicate((UUID) owner.getId(), "ownerId")), addedItems, (Class<? extends R>) IdmFormValueDto.class);
    requestValues.addAll((Collection<? extends IdmFormValueDto>) relatedAddedItems);
    return new IdmFormInstanceDto(owner, formDefinition, requestValues);
}
Also used : IdmFormInstanceDto(eu.bcvsolutions.idm.core.eav.api.dto.IdmFormInstanceDto) IdmRequestItemDto(eu.bcvsolutions.idm.core.api.dto.IdmRequestItemDto) ArrayList(java.util.ArrayList) IdmFormValueDto(eu.bcvsolutions.idm.core.eav.api.dto.IdmFormValueDto) IdmRequestDto(eu.bcvsolutions.idm.core.api.dto.IdmRequestDto)

Example 3 with IdmRequestItemDto

use of eu.bcvsolutions.idm.core.api.dto.IdmRequestItemDto in project CzechIdMng by bcvsolutions.

the class DefaultRequestManager method delete.

@SuppressWarnings("unchecked")
@Override
@Transactional
public <R extends Requestable> R delete(Serializable requestId, R dto, BasePermission... permission) {
    Assert.notNull(dto, "DTO is required!");
    Assert.notNull(requestId, "Request ID is required!");
    IdmRequestDto request = requestService.get(requestId);
    Assert.notNull(request, "Request is required!");
    // update existing item
    if (request != null && !(RequestState.CONCEPT == request.getState() || RequestState.IN_PROGRESS == request.getState() || RequestState.EXCEPTION == request.getState())) {
        throw new ResultCodeException(CoreResultCode.REQUEST_ITEM_CANNOT_BE_CREATED, ImmutableMap.of("dto", dto.toString(), "state", request.getState().name()));
    }
    // Exists item for same original owner?
    IdmRequestItemDto item = this.findRequestItem(request.getId(), dto);
    // him.
    if (item != null) {
        requestItemService.delete(item);
        return this.get(request.getId(), (UUID) dto.getId(), (Class<R>) dto.getClass(), permission);
    }
    // Check permissions on the target service
    ReadDtoService<R, ?> dtoReadService = getDtoService(dto);
    dtoReadService.checkAccess(dto, permission);
    if (item == null) {
        item = createRequestItem(request.getId(), dto);
    }
    item.setOwnerId((UUID) dto.getId());
    item.setOperation(RequestOperationType.REMOVE);
    item.setData(null);
    // Update or create new request item
    item = requestItemService.save(item);
    // Set ID of request item to result DTO
    dto.setRequestItem(item.getId());
    return get(request.getId(), dto);
}
Also used : IdmRequestItemDto(eu.bcvsolutions.idm.core.api.dto.IdmRequestItemDto) ResultCodeException(eu.bcvsolutions.idm.core.api.exception.ResultCodeException) IdmRequestDto(eu.bcvsolutions.idm.core.api.dto.IdmRequestDto) Transactional(org.springframework.transaction.annotation.Transactional)

Example 4 with IdmRequestItemDto

use of eu.bcvsolutions.idm.core.api.dto.IdmRequestItemDto in project CzechIdMng by bcvsolutions.

the class DefaultRequestManager method createRequestItem.

private IdmRequestItemDto createRequestItem(UUID requestId, Requestable dto) {
    IdmRequestItemDto item = new IdmRequestItemDto();
    if (dto instanceof IdmFormValueDto) {
        IdmFormValueDto formValueDto = (IdmFormValueDto) dto;
        item.setSuperOwnerType(formValueDto.getOwnerType().getName());
        item.setSuperOwnerId((UUID) formValueDto.getOwnerId());
    }
    item.setRequest(requestId);
    item.setOwnerType(dto.getClass().getName());
    item.setResult(new OperationResultDto(OperationState.CREATED));
    return item;
}
Also used : IdmRequestItemDto(eu.bcvsolutions.idm.core.api.dto.IdmRequestItemDto) OperationResultDto(eu.bcvsolutions.idm.core.api.dto.OperationResultDto) IdmFormValueDto(eu.bcvsolutions.idm.core.eav.api.dto.IdmFormValueDto)

Example 5 with IdmRequestItemDto

use of eu.bcvsolutions.idm.core.api.dto.IdmRequestItemDto in project CzechIdMng by bcvsolutions.

the class RequestManagerTest method testDeleteRequestable.

@Test
public void testDeleteRequestable() {
    // Create role
    IdmRoleDto changedRole = getHelper().createRole();
    // Create request
    IdmRequestDto request = requestManager.createRequest(changedRole);
    Assert.assertNotNull(request);
    Assert.assertEquals(request.getOwnerType(), changedRole.getClass().getName());
    Assert.assertEquals(request.getOwnerId(), changedRole.getId());
    // Change role (without save)
    changedRole.setDescription(getHelper().createName());
    changedRole.setPriority(1000);
    // Create request item
    Requestable requestable = requestManager.post(request.getId(), changedRole);
    Assert.assertNotNull(requestable);
    Assert.assertNotNull(requestable.getRequestItem());
    Assert.assertTrue(requestable instanceof IdmRoleDto);
    IdmRoleDto roleFromRequest = (IdmRoleDto) requestable;
    // Is not same instance
    Assert.assertTrue(changedRole != roleFromRequest);
    // Has same values as new role
    Assert.assertEquals(changedRole.getPriority(), roleFromRequest.getPriority());
    Assert.assertEquals(changedRole.getDescription(), roleFromRequest.getDescription());
    IdmRoleDto currentRole = roleService.get(changedRole.getId());
    Assert.assertNotEquals(changedRole.getPriority(), currentRole.getPriority());
    Assert.assertNotEquals(changedRole.getDescription(), currentRole.getDescription());
    Assert.assertNotNull(requestItemService.get(requestable.getRequestItem()));
    // Delete the role
    roleService.delete(changedRole);
    // Request item must be canceled
    IdmRequestItemDto requestItem = requestItemService.get(requestable.getRequestItem());
    Assert.assertNotNull(requestItem);
    Assert.assertEquals(RequestState.CANCELED, requestItem.getState());
    // Request must be canceled
    request = requestService.get(request.getId());
    Assert.assertNotNull(request);
    Assert.assertEquals(RequestState.CANCELED, request.getState());
}
Also used : IdmRoleDto(eu.bcvsolutions.idm.core.api.dto.IdmRoleDto) IdmRequestItemDto(eu.bcvsolutions.idm.core.api.dto.IdmRequestItemDto) Requestable(eu.bcvsolutions.idm.core.api.domain.Requestable) IdmRequestDto(eu.bcvsolutions.idm.core.api.dto.IdmRequestDto) AbstractCoreWorkflowIntegrationTest(eu.bcvsolutions.idm.core.AbstractCoreWorkflowIntegrationTest) Test(org.junit.Test)

Aggregations

IdmRequestItemDto (eu.bcvsolutions.idm.core.api.dto.IdmRequestItemDto)27 IdmRequestDto (eu.bcvsolutions.idm.core.api.dto.IdmRequestDto)21 Requestable (eu.bcvsolutions.idm.core.api.domain.Requestable)14 IdmRoleDto (eu.bcvsolutions.idm.core.api.dto.IdmRoleDto)12 ResultCodeException (eu.bcvsolutions.idm.core.api.exception.ResultCodeException)10 AbstractCoreWorkflowIntegrationTest (eu.bcvsolutions.idm.core.AbstractCoreWorkflowIntegrationTest)9 Test (org.junit.Test)9 AbstractDto (eu.bcvsolutions.idm.core.api.dto.AbstractDto)8 IdmRequestItemFilter (eu.bcvsolutions.idm.core.api.dto.filter.IdmRequestItemFilter)7 IOException (java.io.IOException)7 OperationResultDto (eu.bcvsolutions.idm.core.api.dto.OperationResultDto)6 IdmRequestItemService (eu.bcvsolutions.idm.core.api.service.IdmRequestItemService)6 IdmFormValueDto (eu.bcvsolutions.idm.core.eav.api.dto.IdmFormValueDto)6 RequestOperationType (eu.bcvsolutions.idm.core.api.domain.RequestOperationType)5 RequestState (eu.bcvsolutions.idm.core.api.domain.RequestState)5 IdmRequestItemChangesDto (eu.bcvsolutions.idm.core.api.dto.IdmRequestItemChangesDto)5 RequestManager (eu.bcvsolutions.idm.core.api.service.RequestManager)5 IdmFormInstanceDto (eu.bcvsolutions.idm.core.eav.api.dto.IdmFormInstanceDto)5 WorkflowProcessInstanceService (eu.bcvsolutions.idm.core.workflow.service.WorkflowProcessInstanceService)5 ArrayList (java.util.ArrayList)5