use of eu.bcvsolutions.idm.core.scheduler.task.impl.ClearDirtyStateForContractSliceTaskExecutor in project CzechIdMng by bcvsolutions.
the class ContractSliceSynchronizationExecutor method save.
/**
* Save entity
*
* @param entity
* @param skipProvisioning
* @return
*/
@Override
protected IdmContractSliceDto save(IdmContractSliceDto entity, boolean skipProvisioning, SynchronizationContext context) {
if (entity.getIdentity() == null) {
throw new ProvisioningException(AccResultCode.SYNCHRONIZATION_IDM_FIELD_CANNOT_BE_NULL, ImmutableMap.of("property", CONTRACT_IDENTITY_FIELD));
}
EntityEvent<IdmContractSliceDto> event = new ContractSliceEvent(sliceService.isNew(entity) ? ContractSliceEventType.CREATE : ContractSliceEventType.UPDATE, entity, ImmutableMap.of(ProvisioningService.SKIP_PROVISIONING, skipProvisioning));
// We do not want execute HR processes for every contract. We need start
// them for every identity only once.
// For this we skip them now. HR processes must be start after whole
// sync finished (by using dependent scheduled task)!
event.getProperties().put(IdmIdentityContractService.SKIP_HR_PROCESSES, Boolean.TRUE);
//
// We don't want recalculate automatic role by attribute recalculation for every
// contract.
// Recalculation will be started only once.
event.getProperties().put(AutomaticRoleManager.SKIP_RECALCULATION, Boolean.TRUE);
//
// Set dirty state during recalculation, the process of recalculation will be solved in ClearDirtyStateForContractSliceTaskExecutor
// ClearDirtyStateForContractSliceTaskExecutor will be started with HR processes.
event.getProperties().put(IdmContractSliceService.SET_DIRTY_STATE_CONTRACT_SLICE, Boolean.TRUE);
IdmContractSliceDto slice = sliceService.publish(event).getContent();
if (entity.getEmbedded().containsKey(SYNC_CONTRACT_FIELD)) {
SyncIdentityContractDto syncContract = (SyncIdentityContractDto) entity.getEmbedded().get(SYNC_CONTRACT_FIELD);
IdmContractSliceGuaranteeFilter guaranteeFilter = new IdmContractSliceGuaranteeFilter();
guaranteeFilter.setContractSliceId(slice.getId());
List<IdmContractSliceGuaranteeDto> currentGuarantees = guaranteeService.find(guaranteeFilter, null).getContent();
// Search guarantees to delete
List<IdmContractSliceGuaranteeDto> guaranteesToDelete = currentGuarantees.stream().filter(sysImplementer -> {
return sysImplementer.getGuarantee() != null && !syncContract.getGuarantees().contains(new IdmIdentityDto(sysImplementer.getGuarantee()));
}).collect(Collectors.toList());
// Search guarantees to add
List<IdmIdentityDto> guaranteesToAdd = syncContract.getGuarantees().stream().filter(identity -> {
return !currentGuarantees.stream().filter(currentGuarrantee -> {
return identity.getId().equals(currentGuarrantee.getGuarantee());
}).findFirst().isPresent();
}).collect(Collectors.toList());
// Delete guarantees
guaranteesToDelete.forEach(guarantee -> {
EntityEvent<IdmContractSliceGuaranteeDto> guaranteeEvent = new ContractSliceGuaranteeEvent(ContractSliceGuaranteeEventType.DELETE, guarantee, ImmutableMap.of(ProvisioningService.SKIP_PROVISIONING, skipProvisioning));
guaranteeService.publish(guaranteeEvent);
});
// Create new guarantees
guaranteesToAdd.forEach(identity -> {
IdmContractSliceGuaranteeDto guarantee = new IdmContractSliceGuaranteeDto();
guarantee.setContractSlice(slice.getId());
guarantee.setGuarantee(identity.getId());
//
EntityEvent<IdmContractSliceGuaranteeDto> guaranteeEvent = new ContractSliceGuaranteeEvent(ContractSliceGuaranteeEventType.CREATE, guarantee, ImmutableMap.of(ProvisioningService.SKIP_PROVISIONING, skipProvisioning));
guaranteeService.publish(guaranteeEvent);
});
}
return slice;
}
use of eu.bcvsolutions.idm.core.scheduler.task.impl.ClearDirtyStateForContractSliceTaskExecutor in project CzechIdMng by bcvsolutions.
the class ContractSliceSynchronizationExecutor method executeClearDirtyStateForContractSlice.
/**
* Execute {@link SelectCurrentContractSliceTaskExecutor}
*
* @param log
* @return
*/
private SysSyncLogDto executeClearDirtyStateForContractSlice(SysSyncLogDto log) {
ClearDirtyStateForContractSliceTaskExecutor executor = new ClearDirtyStateForContractSliceTaskExecutor();
log.addToLog(MessageFormat.format("After success sync have to be run clear dirty state for contract slices. We start him (synchronously) now [{0}].", ZonedDateTime.now()));
OperationResult executeSync = longRunningTaskManager.executeSync(executor);
if (executeSync != null) {
if (executeSync.getState() == OperationState.EXECUTED) {
log.addToLog(MessageFormat.format("Clear dirty state end in [{0}].", ZonedDateTime.now()));
} else if (executeSync.getState() == OperationState.EXCEPTION) {
log.addToLog(MessageFormat.format("Warning - clear dirty state is not executed correctly. Ended in [{0}].", ZonedDateTime.now()));
}
} else {
log.addToLog(MessageFormat.format("Warning - select corrent contract slice is not executed correctly, Returned operation result is null. Ended in [{0}].", ZonedDateTime.now()));
}
return log;
}
use of eu.bcvsolutions.idm.core.scheduler.task.impl.ClearDirtyStateForContractSliceTaskExecutor in project CzechIdMng by bcvsolutions.
the class ContractSliceManagerTest method clearStateExecutorTest.
@Test
public void clearStateExecutorTest() {
IdmIdentityDto identity = this.getHelper().createIdentity();
// remove all contracts
List<IdmIdentityContractDto> allByIdentity = contractService.findAllByIdentity(identity.getId());
allByIdentity.forEach(contract -> {
contractService.delete(contract);
});
IdmContractSliceDto slice = new IdmContractSliceDto();
slice.setContractCode("test");
slice.setIdentity(identity.getId());
slice.setValidFrom(LocalDate.now().minusDays(1));
slice.setValidTill(LocalDate.now().plusDays(5));
slice.setContractValidFrom(LocalDate.now().minusDays(50));
slice.setMain(true);
IdmContractSliceDto sliceTwo = new IdmContractSliceDto();
sliceTwo.setContractCode("test");
sliceTwo.setIdentity(identity.getId());
sliceTwo.setValidFrom(LocalDate.now().minusDays(10));
sliceTwo.setValidTill(LocalDate.now().minusDays(2));
sliceTwo.setContractValidFrom(LocalDate.now().minusDays(50));
sliceTwo.setMain(true);
EventContext<IdmContractSliceDto> eventContextOne = contractSliceService.publish(new ContractSliceEvent(ContractSliceEventType.CREATE, slice, ImmutableMap.of(IdmContractSliceService.SET_DIRTY_STATE_CONTRACT_SLICE, Boolean.TRUE)));
EventContext<IdmContractSliceDto> eventContextTwo = contractSliceService.publish(new ContractSliceEvent(ContractSliceEventType.CREATE, sliceTwo, ImmutableMap.of(IdmContractSliceService.SET_DIRTY_STATE_CONTRACT_SLICE, Boolean.TRUE)));
// slice has skip recalculation and dirty state isn't create
allByIdentity = contractService.findAllByIdentity(identity.getId());
assertTrue(allByIdentity.isEmpty());
List<IdmEntityStateDto> dirtyStates = findDirtyStatesForSlice(null);
assertFalse(dirtyStates.isEmpty());
assertEquals(2, dirtyStates.size());
ClearDirtyStateForContractSliceTaskExecutor executor = new ClearDirtyStateForContractSliceTaskExecutor();
OperationResult result = longRunningTaskManager.executeSync(executor);
assertEquals(OperationState.EXECUTED, result.getState());
dirtyStates = findDirtyStatesForSlice(null);
assertTrue(dirtyStates.isEmpty());
assertEquals(0, dirtyStates.size());
allByIdentity = contractService.findAllByIdentity(identity.getId());
assertEquals(1, allByIdentity.size());
IdmIdentityContractDto contractDto = allByIdentity.get(0);
assertTrue(contractDto.getControlledBySlices());
assertEquals(LocalDate.now().minusDays(50), contractDto.getValidFrom());
// Delete unused slices
contractSliceService.delete(eventContextOne.getContent());
contractSliceService.delete(eventContextTwo.getContent());
}
use of eu.bcvsolutions.idm.core.scheduler.task.impl.ClearDirtyStateForContractSliceTaskExecutor in project CzechIdMng by bcvsolutions.
the class ContractSliceManagerTest method clearStateExecutorPageTest.
@Test
public void clearStateExecutorPageTest() {
IdmIdentityDto identity = this.getHelper().createIdentity();
List<IdmEntityStateDto> dirtyStates = findAllDirtyStatesForSlices();
assertEquals(0, dirtyStates.size());
for (int index = 0; index < 21; index++) {
IdmContractSliceDto createContractSlice = this.getHelper().createContractSlice(identity);
createDirtyState(createContractSlice);
}
dirtyStates = findAllDirtyStatesForSlices();
assertEquals(21, dirtyStates.size());
ClearDirtyStateForContractSliceTaskExecutor executor = new ClearDirtyStateForContractSliceTaskExecutor();
OperationResult result = longRunningTaskManager.executeSync(executor);
assertEquals(OperationState.EXECUTED, result.getState());
dirtyStates = findAllDirtyStatesForSlices();
assertEquals(0, dirtyStates.size());
IdmLongRunningTaskDto taskDto = longRunningTaskService.get(executor.getLongRunningTaskId());
assertNotNull(taskDto.getCount());
assertNotNull(taskDto.getCounter());
assertEquals(21, taskDto.getCount().longValue());
assertEquals(21, taskDto.getCounter().longValue());
}
Aggregations