package jnpf.elnService.template;
|
|
import org.springframework.stereotype.Component;
|
import org.springframework.transaction.PlatformTransactionManager;
|
import org.springframework.transaction.TransactionDefinition;
|
import org.springframework.transaction.support.TransactionTemplate;
|
|
import java.util.function.Consumer;
|
import java.util.function.Supplier;
|
|
@Component
|
public class ElnTemplateBindingConfirmationFacade {
|
|
private final TransactionTemplate stateTransactionTemplate;
|
private final TransactionTemplate failureAuditTransactionTemplate;
|
|
public ElnTemplateBindingConfirmationFacade(PlatformTransactionManager transactionManager) {
|
stateTransactionTemplate = requiresNew(transactionManager);
|
failureAuditTransactionTemplate = requiresNew(transactionManager);
|
}
|
|
public void execute(Runnable stateAction, Consumer<RuntimeException> failureAudit) {
|
execute(() -> {
|
stateAction.run();
|
return null;
|
}, failureAudit);
|
}
|
|
public <T> T execute(Supplier<T> stateAction, Consumer<RuntimeException> failureAudit) {
|
try {
|
return stateTransactionTemplate.execute(status -> stateAction.get());
|
} catch (RuntimeException stateFailure) {
|
try {
|
failureAuditTransactionTemplate.executeWithoutResult(
|
status -> failureAudit.accept(stateFailure));
|
} catch (RuntimeException auditFailure) {
|
stateFailure.addSuppressed(auditFailure);
|
}
|
throw stateFailure;
|
}
|
}
|
|
private static TransactionTemplate requiresNew(PlatformTransactionManager manager) {
|
TransactionTemplate template = new TransactionTemplate(manager);
|
template.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
|
return template;
|
}
|
}
|