use of com.evolveum.midpoint.provisioning.api.LiveSyncTokenStorage in project midpoint by Evolveum.
the class LiveSynchronizer method synchronize.
@NotNull
public SynchronizationOperationResult synchronize(ResourceShadowDiscriminator shadowCoordinates, LiveSyncOptions options, LiveSyncTokenStorage tokenStorage, LiveSyncEventHandler handler, Task task, OperationResult gResult) throws ObjectNotFoundException, CommunicationException, GenericFrameworkException, SchemaException, ConfigurationException, SecurityViolationException, ObjectAlreadyExistsException, ExpressionEvaluationException {
LiveSyncCtx ctx = new LiveSyncCtx(shadowCoordinates, task, options, tokenStorage, gResult);
InternalMonitor.recordCount(InternalCounters.PROVISIONING_ALL_EXT_OPERATION_COUNT);
setupInitialToken(ctx);
if (!ctx.hasInitialToken()) {
// see comment in the called method
fetchAndRememberCurrentToken(ctx, gResult);
return ctx.syncResult;
}
IndividualEventsAcknowledgeGate<LiveSyncEvent> acknowledgeGate = new IndividualEventsAcknowledgeGate<>();
ResourceObjectLiveSyncChangeListener listener = (resourceObjectChange, lResult) -> {
int sequentialNumber = ctx.oldestTokenWatcher.changeArrived(resourceObjectChange.getToken());
ShadowedLiveSyncChange change = new ShadowedLiveSyncChange(resourceObjectChange, beans);
change.initialize(task, lResult);
LiveSyncEvent event = new LiveSyncEventImpl(change) {
@Override
public void acknowledge(boolean release, OperationResult aResult) {
LOGGER.trace("Acknowledgement (release={}) sent for {}", release, this);
if (release) {
ctx.oldestTokenWatcher.changeProcessed(sequentialNumber);
}
acknowledgeGate.acknowledgeIssuedEvent(this);
}
};
acknowledgeGate.registerIssuedEvent(event);
try {
return handler.handle(event, lResult);
} catch (Throwable t) {
// We assume the event was not acknowledged yet. Note that serious handler should never throw an exception!
LoggingUtils.logUnexpectedException(LOGGER, "Got unexpected exception while handling a live sync event", t);
acknowledgeGate.acknowledgeIssuedEvent(event);
return false;
}
};
UcfFetchChangesResult fetchChangesResult;
try {
fetchChangesResult = resourceObjectConverter.fetchChanges(ctx.context, ctx.getInitialToken(), ctx.getBatchSize(), listener, gResult);
} finally {
handler.allEventsSubmitted(gResult);
}
if (fetchChangesResult.isAllChangesFetched()) {
ctx.syncResult.setAllChangesFetched();
ctx.finalToken = TokenUtil.fromUcf(fetchChangesResult.getFinalToken());
}
acknowledgeGate.waitForIssuedEventsAcknowledge(gResult);
if (ctx.oldestTokenWatcher.isEverythingProcessed()) {
ctx.syncResult.setAllFetchedChangesProcessed();
}
updateTokenValue(ctx, gResult);
return ctx.syncResult;
}
Aggregations