use of eu.bcvsolutions.idm.core.api.exception.ResultCodeException in project CzechIdMng by bcvsolutions.
the class IdentityAnonymousUsernameGenerator method generate.
@Override
public IdmIdentityDto generate(IdmIdentityDto dto, IdmGenerateValueDto valueGenerator) {
Assert.notNull(dto, "DTO is required.");
Assert.notNull(valueGenerator, "Value generator is required.");
// if exists username and configuration doesn't allow regenerate return dto
if (!valueGenerator.isRegenerateValue() && StringUtils.isNotEmpty(dto.getUsername())) {
return dto;
}
// generator configuration
int numPartLen = getNumberPartLength(valueGenerator);
int numPartMax = calcMaxValueForLen(numPartLen);
String prefix = getPrefixString(valueGenerator);
// try to generate the new unique username within several attempts
int attepts = GENERATE_ATTEMPTS;
do {
int randomPartVal = generateNumberPart(numPartMax);
String username = createUsername(prefix, randomPartVal, numPartLen);
// find at the first attempt OK
if (!usernameInUse(username)) {
dto.setUsername(username);
return dto;
}
} while (--attepts != 0);
// unsuccessful with random generation -> search for empty number slots
String usernameRoot = createUsername(prefix, null, null);
IdmIdentityFilter identityFilt = new IdmIdentityFilter();
identityFilt.setText(usernameRoot);
Page<IdmIdentityDto> page = null;
int pageSize = SEARCH_PAGE_SIZE;
int pageNum = 0;
do {
page = identityService.find(identityFilt, PageRequest.of(pageNum, pageSize, Sort.by(IdmIdentity_.username.getName()).ascending()));
List<IdmIdentityDto> dtos = page.getContent();
List<String> usernameNumbers = dtos.stream().map(IdmIdentityDto::getUsername).filter(usernameFilterFactory(usernameRoot, numPartLen)).map(name -> name.replace(usernameRoot, "")).collect(Collectors.toList());
Integer newRandomPartVal = findEmptySlotFromRange(usernameNumbers, 0, usernameNumbers.size() - 1);
if (newRandomPartVal != null) {
String username = createUsername(prefix, newRandomPartVal, Integer.valueOf(numPartLen));
dto.setUsername(username);
return dto;
}
pageNum++;
} while (pageNum < page.getTotalPages());
// unable to find empty space by bisect? try min and max values which may still be missing
// first index
String username = createUsername(prefix, 0, numPartLen);
if (!usernameInUse(username)) {
dto.setUsername(username);
return dto;
}
// last index
username = createUsername(prefix, numPartMax, numPartLen);
if (!usernameInUse(username)) {
dto.setUsername(username);
return dto;
}
// it's over nothing remains to try
LOG.warn("The anonymous username generator reached the limit of the count of available numbers. Increase nuemric part length in the generator setting.");
throw new ResultCodeException(CoreResultCode.IDENTITY_UNABLE_GENERATE_UNIQUE_USERNAME);
}
use of eu.bcvsolutions.idm.core.api.exception.ResultCodeException in project CzechIdMng by bcvsolutions.
the class CodeListSaveProcessor method process.
@Override
public EventResult<IdmCodeListDto> process(EntityEvent<IdmCodeListDto> event) {
IdmCodeListDto codeList = event.getContent();
//
// prevent to change underlying form definition
IdmCodeListDto originalSource = event.getOriginalSource();
if (originalSource == null) {
if (codeList.getFormDefinition() != null) {
throw new ResultCodeException(CoreResultCode.UNMODIFIABLE_ATTRIBUTE_CHANGE, ImmutableMap.of("name", "formDefinition", "class", codeList.getClass().getSimpleName()));
}
} else {
if (!codeList.getFormDefinition().equals(originalSource.getFormDefinition())) {
throw new ResultCodeException(CoreResultCode.UNMODIFIABLE_ATTRIBUTE_CHANGE, ImmutableMap.of("name", "formDefinition", "class", codeList.getClass().getSimpleName()));
}
}
codeList = service.saveInternal(codeList);
event.setContent(codeList);
//
return new DefaultEventResult<>(event, this);
}
use of eu.bcvsolutions.idm.core.api.exception.ResultCodeException in project CzechIdMng by bcvsolutions.
the class DefaultImportManager method makeAdvancedPairing.
/**
* Make advanced paring
*
* @param dto
* @param context
* @param dtoClass
* @return
*/
private BaseDto makeAdvancedPairing(BaseDto dto, ImportContext context, Class<? extends BaseDto> dtoClass) {
ExportDescriptorDto descriptor = this.getDescriptor(context, dtoClass);
for (String advancedParingField : descriptor.getAdvancedParingFields()) {
try {
Class<? extends AbstractDto> dtoClassField = this.getDtoClassFromField(dtoClass, advancedParingField);
if (dtoClassField == null) {
throw new ResultCodeException(CoreResultCode.IMPORT_FIELD_EMBEDDED_ANNOTATION_MISSING, ImmutableMap.of("field", advancedParingField));
}
UUID id = this.getFieldUUIDValue(advancedParingField, dto, dtoClass);
if (id == null) {
// ID is null -> no relation exists -> continues
continue;
}
// Get service for DTO in field.
Class<? extends BaseDto> serviceDtoClass = dtoClassField;
if (dtoClassField.isAnnotationPresent(Inheritable.class)) {
serviceDtoClass = dto.getClass().getAnnotation(Inheritable.class).dtoService();
}
ReadWriteDtoService<BaseDto, ?> dtoServiceForField = getDtoService(serviceDtoClass);
BaseDto currentFieldDto = dtoServiceForField.get(id);
if (currentFieldDto != null) {
// DTO exists -> no change is necessary.
continue;
}
// DTO not found by ID, we will try find it by code.
if (dto instanceof AbstractDto) {
Path dtoPath = Paths.get(context.getTempDirectory().toString(), dtoClass.getSimpleName(), MessageFormat.format("{0}.{1}", dto.getId().toString(), ExportManager.EXTENSION_JSON));
EmbeddedDto embeddedDto = (EmbeddedDto) this.convertFileToDto(dtoPath.toFile(), EmbeddedDto.class, context);
JsonNode batchFieldDtoAsString = embeddedDto.getEmbedded().get(advancedParingField);
if (batchFieldDtoAsString == null) {
if (descriptor.isOptional()) {
return null;
} else {
Assert.notNull(batchFieldDtoAsString, MessageFormat.format("Embedded map must contains DTO for advanced paring field [{0}]", advancedParingField));
}
}
BaseDto batchFieldDto;
try {
batchFieldDto = this.convertStringToDto(batchFieldDtoAsString.toString(), dtoClassField, context);
String code = null;
if (batchFieldDto instanceof Codeable) {
code = ((Codeable) batchFieldDto).getCode();
if (Strings.isNotEmpty(code)) {
currentFieldDto = lookupService.lookupDto(serviceDtoClass, code);
}
} else if (batchFieldDto != null) {
// Find target DTO by example source DTO (typically by more then one filter field).
code = batchFieldDto.toString();
EmbeddedDto fieldEmbeddedDto = (EmbeddedDto) this.convertStringToDto(batchFieldDtoAsString.toString(), EmbeddedDto.class, context);
currentFieldDto = this.findByExample(batchFieldDto, fieldEmbeddedDto, context);
}
if (currentFieldDto != null) {
// DTO for given code exists -> replace ID by this new in given DTO.
//
new PropertyDescriptor(advancedParingField, dtoClass).getWriteMethod().invoke(dto, currentFieldDto.getId());
// Save old and new ID for next DTOs.
context.getReplacedIDs().put(id, (UUID) currentFieldDto.getId());
continue;
} else {
// If is DTO set as optional, we will only skip this DTO.
if (descriptor.isOptional()) {
throw new ResultCodeException(CoreResultCode.IMPORT_ADVANCED_PARING_NOT_FOUND_OPTIONAL, ImmutableMap.of("field", advancedParingField, "dto", dto.toString(), "notFoundDto", batchFieldDto.toString(), "code", code));
}
throw new ResultCodeException(CoreResultCode.IMPORT_ADVANCED_PARING_FAILED_NOT_FOUND, ImmutableMap.of("field", advancedParingField, "dto", dto.toString(), "notFoundDto", batchFieldDto.toString(), "code", code));
}
} catch (IOException e) {
throw new ResultCodeException(CoreResultCode.IMPORT_CONVERT_TO_DTO_FAILED, ImmutableMap.of("file", "Converted from String.", "dto", dtoClass), e);
}
}
// (skip this DTO).
if (descriptor.isOptional()) {
return null;
}
} catch (IntrospectionException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | SecurityException e) {
throw new ResultCodeException(CoreResultCode.EXPORT_IMPORT_REFLECTION_FAILED, e);
}
}
return dto;
}
use of eu.bcvsolutions.idm.core.api.exception.ResultCodeException in project CzechIdMng by bcvsolutions.
the class DefaultImportManager method extractZip.
/**
* Extract ZIP in attachment to the temp directory.
*
* @param attachment
* @return
*/
private Path extractZip(IdmAttachmentDto attachment) {
File source = Paths.get(attachmentConfiguration.getStoragePath(), attachment.getContentPath()).toFile();
Path tempDirectory = attachmentManager.createTempDirectory(null);
try {
ZipUtils.extract(source, tempDirectory.toString());
} catch (IOException ex) {
throw new ResultCodeException(CoreResultCode.IMPORT_ZIP_EXTRACTION_FAILED, ex);
}
return tempDirectory;
}
use of eu.bcvsolutions.idm.core.api.exception.ResultCodeException in project CzechIdMng by bcvsolutions.
the class DefaultImportManager method executeImport.
@Override
@Transactional
public IdmExportImportDto executeImport(IdmExportImportDto importBatch, boolean dryRun, BasePermission... permission) {
Assert.notNull(importBatch, "Batch cannot be null!");
Assert.notNull(importBatch.getId(), "Id of batch cannot be null!");
LOG.info("Import [{}, dry-run: {}] starts ...", importBatch.toString(), dryRun);
// Check permissions (if given) before LRT is executed (dry run updates batch too => permissions have to be evaluated).
exportImportService.checkAccess(importBatch, permission);
OperationResult operationResult = importBatch.getResult();
if (operationResult != null && OperationState.RUNNING == operationResult.getState()) {
throw new ResultCodeException(CoreResultCode.IMPORT_IS_ALREADY_RUNNING, ImmutableMap.of("batch", importBatch.toString()));
}
ImportTaskExecutor lrt = new ImportTaskExecutor(importBatch.getId(), dryRun);
LongRunningFutureTask<OperationResult> result = longRunningTaskManager.execute(lrt);
UUID taskId = result.getExecutor().getLongRunningTaskId();
importBatch.setLongRunningTask(taskId);
return exportImportService.save(importBatch, permission);
}
Aggregations