use of com.evolveum.midpoint.provisioning.api.AsyncUpdateEvent in project midpoint by Evolveum.
the class AsyncUpdateActivityRun method processItem.
@Override
public boolean processItem(@NotNull ItemProcessingRequest<AsyncUpdateEvent> request, @NotNull RunningTask workerTask, OperationResult result) throws CommonException, ActivityRunException {
AsyncUpdateEvent event = request.getItem();
if (event.isComplete()) {
ResourceObjectShadowChangeDescription changeDescription = event.getChangeDescription();
changeDescription.setItemProcessingIdentifier(request.getIdentifier());
changeDescription.setSimulate(isPreview());
getModelBeans().eventDispatcher.notifyChange(changeDescription, workerTask, result);
} else if (event.isNotApplicable()) {
result.recordNotApplicable();
} else {
// TODO error criticality
assert event.isError();
result.recordFatalError("Item was not pre-processed correctly: " + event.getErrorMessage());
}
return true;
}
use of com.evolveum.midpoint.provisioning.api.AsyncUpdateEvent in project midpoint by Evolveum.
the class AsyncUpdater method processAsynchronousUpdates.
public void processAsynchronousUpdates(ResourceShadowCoordinates shadowCoordinates, AsyncUpdateEventHandler handler, Task callerTask, OperationResult callerResult) throws ObjectNotFoundException, CommunicationException, SchemaException, ConfigurationException, ExpressionEvaluationException {
InternalMonitor.recordCount(InternalCounters.PROVISIONING_ALL_EXT_OPERATION_COUNT);
ProvisioningContext globalContext = ctxFactory.createForCoordinates(shadowCoordinates, callerTask, callerResult);
// This is a bit of hack to propagate information about async update channel to upper layers
// e.g. to implement MID-5853. TODO fix this hack
globalContext.setChannelOverride(SchemaConstants.CHANNEL_ASYNC_UPDATE_URI);
IndividualEventsAcknowledgeGate<AsyncUpdateEvent> acknowledgeGate = new IndividualEventsAcknowledgeGate<>();
ResourceObjectAsyncChangeListener listener = (resourceObjectChange, lTask, lResult) -> {
ShadowedAsyncChange change = new ShadowedAsyncChange(resourceObjectChange, changeProcessingBeans);
change.initialize(lTask, lResult);
AsyncUpdateEvent event = new AsyncUpdateEventImpl(change) {
@Override
public void acknowledge(boolean release, OperationResult result) {
LOGGER.trace("Acknowledgement (release={}) sent for {}", release, this);
change.acknowledge(release, result);
acknowledgeGate.acknowledgeIssuedEvent(this);
}
};
acknowledgeGate.registerIssuedEvent(event);
try {
handler.handle(event, lResult);
} catch (Throwable t) {
LoggingUtils.logUnexpectedException(LOGGER, "Got unexpected exception while handling an async update event", t);
acknowledgeGate.acknowledgeIssuedEvent(event);
}
};
resourceObjectConverter.listenForAsynchronousUpdates(globalContext, listener, callerResult);
// There may be some events in processing - for example, if the async update task is suspended while
// receiving a lot of events.
acknowledgeGate.waitForIssuedEventsAcknowledge(callerResult);
}
use of com.evolveum.midpoint.provisioning.api.AsyncUpdateEvent in project midpoint by Evolveum.
the class AsyncUpdateActivityRun method iterateOverItemsInBucket.
@Override
public void iterateOverItemsInBucket(OperationResult opResult) throws CommunicationException, ObjectNotFoundException, SchemaException, ConfigurationException, ExpressionEvaluationException {
AsyncUpdateEventHandler handler = (event, hResult) -> {
SyncItemProcessingRequest<AsyncUpdateEvent> request = new SyncItemProcessingRequest<>(event, this);
return coordinator.submit(request, hResult);
};
RunningTask runningTask = getRunningTask();
ModelImplUtils.clearRequestee(runningTask);
getModelBeans().provisioningService.processAsynchronousUpdates(resourceObjectClass.getCoords(), handler, runningTask, opResult);
}
Aggregations