use of eu.bcvsolutions.idm.ic.impl.IcUidAttributeImpl in project CzechIdMng by bcvsolutions.
the class BasicVirtualConnector method internalUpdate.
@Override
public IcUidAttribute internalUpdate(IcUidAttribute uid, IcObjectClass objectClass, List<IcAttribute> attributes) {
Assert.notNull(objectClass, "Object class cannot be null!");
Assert.notNull(attributes, "Attributes cannot be null!");
Assert.notNull(uid, "UID cannot be null!");
if (!IcObjectClassInfo.ACCOUNT.equals(objectClass.getType())) {
throw new IcException("Only ACCOUNT object class is supported now!");
}
String uidValue = uid.getUidValue();
if (uidValue == null) {
throw new IcException("UID value cannot be null!");
}
// Find account by UID and System ID
VsAccountDto account = accountService.findByUidSystem(uidValue, systemId);
if (account == null) {
throw new IcException(MessageFormat.format("Vs account was not found for UID [{0}] and system ID [{1}]!", uidValue, systemId));
}
// Update UID - if is different
IcAttribute uidAttribute = geAttribute(attributes, IcAttributeInfo.NAME);
if (uidAttribute != null) {
Object attributeUidValue = uidAttribute.getValue();
if (!(attributeUidValue instanceof String)) {
throw new IcException(MessageFormat.format("UID attribute value [{0}] must be String!", attributeUidValue));
}
if (!uidValue.equals(attributeUidValue)) {
// TODO: Connector not supported more entity types!
LOG.info("Update account - UID is different (old: {} new: {})", uidValue, attributeUidValue);
account.setUid((String) attributeUidValue);
account = accountService.save(account);
// We have to change system entity directly from VS module
// (request can be started/executed async => standard
// process update UID in system entity (ACC module) will not
// works!)
updateSystemEntity(uidValue, attributeUidValue, true);
}
}
// Update ENABLE - if is different
IcAttribute enableAttribute = geAttribute(attributes, IcAttributeInfo.ENABLE);
if (enableAttribute != null && this.virtualConfiguration.isDisableSupported()) {
Object attributeEnableValue = enableAttribute.getValue();
if (!(attributeEnableValue instanceof Boolean)) {
throw new IcException(MessageFormat.format("ENABLE attribute value [{0}] must be Boolean!", attributeEnableValue));
}
if (account.isEnable() != (Boolean) attributeEnableValue) {
account.setEnable((Boolean) attributeEnableValue);
account = accountService.save(account);
}
}
UUID accountId = account.getId();
// Update extended attributes
Arrays.asList(virtualConfiguration.getAttributes()).forEach(virtualAttirbute -> {
updateFormAttributeValue(uidValue, virtualAttirbute, accountId, attributes);
});
return new IcUidAttributeImpl(IcAttributeInfo.NAME, account.getUid(), null);
}
use of eu.bcvsolutions.idm.ic.impl.IcUidAttributeImpl in project CzechIdMng by bcvsolutions.
the class BasicVirtualConnector method searchByPage.
/**
* Do search for given page and invoke result handler
*
* @param handler
* @param pageable
*/
private void searchByPage(IcResultsHandler handler, Pageable pageable) {
VsAccountFilter accountFilter = new VsAccountFilter();
accountFilter.setSystemId(systemId);
Page<VsAccountDto> resultsPage = accountService.find(accountFilter, pageable);
List<VsAccountDto> results = resultsPage.getContent();
results.forEach(account -> {
boolean canContinue = handler.handle(this.read(new IcUidAttributeImpl(IcAttributeInfo.NAME, account.getUid(), null), new IcObjectClassImpl(IcObjectClassInfo.ACCOUNT)));
if (!canContinue) {
// Handler stop next searching
return;
}
});
if (resultsPage.hasNext()) {
this.searchByPage(handler, resultsPage.nextPageable());
}
}
use of eu.bcvsolutions.idm.ic.impl.IcUidAttributeImpl in project CzechIdMng by bcvsolutions.
the class BasicVirtualConnector method internalCreate.
@Override
public IcUidAttribute internalCreate(IcObjectClass objectClass, List<IcAttribute> attributes) {
Assert.notNull(objectClass, "Object class cannot be null!");
Assert.notNull(attributes, "Attributes cannot be null!");
if (!IcObjectClassInfo.ACCOUNT.equals(objectClass.getType())) {
throw new IcException("Only ACCOUNT object class is supported now!");
}
IcAttribute uidAttribute = geAttribute(attributes, IcAttributeInfo.NAME);
if (uidAttribute == null) {
throw new IcException("UID attribute was not found!");
}
Object uidValue = uidAttribute.getValue();
if (!(uidValue instanceof String)) {
throw new IcException(MessageFormat.format("UID attribute value [{0}] must be String!", uidValue));
}
String uid = (String) uidValue;
// Find account by UID and System ID - If will be found, then we will do
// update instead create
VsAccountDto account = accountService.findByUidSystem(uid, systemId);
if (account != null) {
LOG.info("Create account - Virtual system account for UID [{}] already exist. We will execute update!", uidValue);
return this.internalUpdate(new IcUidAttributeImpl(null, uid, null), objectClass, attributes);
}
account = new VsAccountDto();
// Set ENABLE - if is supported
IcAttribute enableAttribute = geAttribute(attributes, IcAttributeInfo.ENABLE);
if (enableAttribute != null && this.virtualConfiguration.isDisableSupported()) {
Object attributeEnableValue = enableAttribute.getValue();
if (!(attributeEnableValue instanceof Boolean)) {
throw new IcException(MessageFormat.format("ENABLE attribute value [{0}] must be Boolean!", attributeEnableValue));
}
account.setEnable((Boolean) attributeEnableValue);
}
account.setUid(uid);
account.setSystemId(this.systemId);
account.setConnectorKey(connectorKey);
account = accountService.save(account);
UUID accountId = account.getId();
// Attributes from definition and configuration
Arrays.asList(virtualConfiguration.getAttributes()).forEach(virtualAttirbute -> {
updateFormAttributeValue(uidValue, virtualAttirbute, accountId, attributes);
});
// We have to change system entity directly (set wish=false!!!) from VS module
// (request can be started/executed async => standard
// process update UID in system entity (ACC module) will not
// works!)
updateSystemEntity(uid, uid, false);
return new IcUidAttributeImpl(IcAttributeInfo.NAME, account.getUid(), null);
}
use of eu.bcvsolutions.idm.ic.impl.IcUidAttributeImpl in project CzechIdMng by bcvsolutions.
the class DefaultVsRequestService method internalExecute.
@Override
public IcUidAttribute internalExecute(VsRequestDto request) {
request.setState(VsRequestState.REALIZED);
Assert.notNull(request.getConfiguration(), "Request have to contains connector configuration!");
Assert.notNull(request.getConnectorKey(), "Request have to contains connector key!");
// Find connector by request
VsVirtualConnector virtualConnector = getVirtualConnector(request);
IcUidAttribute result = null;
// Save the request
this.save(request);
switch(request.getOperationType()) {
case CREATE:
{
result = virtualConnector.internalCreate(request.getConnectorObject().getObjectClass(), request.getConnectorObject().getAttributes());
break;
}
case UPDATE:
{
VsAccountDto account = accountService.findByUidSystem(request.getUid(), request.getSystem());
if (account == null) {
throw new VsException(VsResultCode.VS_REQUEST_UPDATING_ACCOUNT_NOT_EXIST, ImmutableMap.of("uid", request.getUid()));
}
result = virtualConnector.internalUpdate(new IcUidAttributeImpl(null, request.getUid(), null), request.getConnectorObject().getObjectClass(), request.getConnectorObject().getAttributes());
break;
}
case DELETE:
{
VsAccountDto account = accountService.findByUidSystem(request.getUid(), request.getSystem());
if (account == null) {
throw new VsException(VsResultCode.VS_REQUEST_DELETING_ACCOUNT_NOT_EXIST, ImmutableMap.of("uid", request.getUid()));
}
virtualConnector.internalDelete(new IcUidAttributeImpl(null, request.getUid(), null), request.getConnectorObject().getObjectClass());
// All unresolved request created before this delete request will be
// canceled
VsRequestFilter filter = new VsRequestFilter();
filter.setCreatedBefore(request.getCreated());
filter.setUid(request.getUid());
filter.setSystemId(request.getSystem());
filter.setState(VsRequestState.IN_PROGRESS);
// Unresolved request created before this request
List<VsRequestDto> beforeRequests = this.find(filter, null).getContent();
beforeRequests.forEach(beforeRequest -> {
String reason = MessageFormat.format("Request [{0}] was canceled (by SYSTEM), because 'after' delete request [{1}] was realized!", beforeRequest.getId(), request.getId());
this.cancel(beforeRequest, reason);
LOG.info(reason);
});
break;
}
default:
throw new IcException(MessageFormat.format("Unsupported operation type [{0}]", request.getOperationType()));
}
return result;
}
use of eu.bcvsolutions.idm.ic.impl.IcUidAttributeImpl in project CzechIdMng by bcvsolutions.
the class PrepareConnectorObjectProcessor method process.
/**
* Prepare provisioning operation execution
*/
@Override
public EventResult<SysProvisioningOperationDto> process(EntityEvent<SysProvisioningOperationDto> event) {
SysProvisioningOperationDto provisioningOperation = event.getContent();
SysSystemDto system = systemService.get(provisioningOperation.getSystem());
IcObjectClass objectClass = provisioningOperation.getProvisioningContext().getConnectorObject().getObjectClass();
SysSystemEntityDto systemEntity = provisioningOperationService.getByProvisioningOperation(provisioningOperation);
String uid = systemEntity.getUid();
boolean isWish = systemEntity.isWish();
LOG.debug("Start preparing attribubes for provisioning operation [{}] for object with uid [{}] and connector object [{}]", provisioningOperation.getOperationType(), uid, objectClass.getType());
// Find connector identification persisted in system
if (system.getConnectorKey() == null) {
throw new ProvisioningException(AccResultCode.CONNECTOR_KEY_FOR_SYSTEM_NOT_FOUND, ImmutableMap.of("system", system.getName()));
}
// load connector configuration
IcConnectorConfiguration connectorConfig = systemService.getConnectorConfiguration(system);
if (connectorConfig == null) {
throw new ProvisioningException(AccResultCode.CONNECTOR_CONFIGURATION_FOR_SYSTEM_NOT_FOUND, ImmutableMap.of("system", system.getName()));
}
//
try {
IcConnectorObject existsConnectorObject = null;
// call the connector and auto mapping is not allowed.
if (!(isWish && !provisioningConfiguration.isAllowedAutoMappingOnExistingAccount())) {
IcUidAttribute uidAttribute = new IcUidAttributeImpl(null, uid, null);
existsConnectorObject = connectorFacade.readObject(system.getConnectorInstance(), connectorConfig, objectClass, uidAttribute);
}
if (existsConnectorObject == null) {
processCreate(provisioningOperation);
} else {
processUpdate(provisioningOperation, connectorConfig, existsConnectorObject);
}
//
LOG.debug("Preparing attribubes for provisioning operation [{}] for object with uid [{}] and connector object [{}] is sucessfully completed", provisioningOperation.getOperationType(), uid, objectClass.getType());
// set back to event content
provisioningOperation = provisioningOperationService.save(provisioningOperation);
event.setContent(provisioningOperation);
return new DefaultEventResult<>(event, this);
} catch (Exception ex) {
ResultModel resultModel;
if (ex instanceof ResultCodeException) {
resultModel = ((ResultCodeException) ex).getError().getError();
} else {
resultModel = new DefaultResultModel(AccResultCode.PROVISIONING_PREPARE_ACCOUNT_ATTRIBUTES_FAILED, ImmutableMap.of("name", uid, "system", system.getName(), "operationType", provisioningOperation.getOperationType(), "objectClass", objectClass.getType()));
}
LOG.error(resultModel.toString(), ex);
provisioningOperation.setResult(new OperationResult.Builder(OperationState.EXCEPTION).setModel(resultModel).setCause(ex).build());
//
provisioningOperation = provisioningOperationService.save(provisioningOperation);
//
notificationManager.send(AccModuleDescriptor.TOPIC_PROVISIONING, new IdmMessageDto.Builder().setModel(resultModel).build());
// set back to event content
event.setContent(provisioningOperation);
return new DefaultEventResult<>(event, this, true);
}
}
Aggregations