use of org.jooq.impl.RecordDelegate.RecordLifecycleType.LOAD in project jOOQ by jOOQ.
the class RecordDelegate method operate.
@SuppressWarnings("unchecked")
final <E extends Exception> R operate(ThrowingFunction<R, R, E> operation) throws E {
R record = recordSupplier.get();
// [#3300] Records that were fetched from the database
if (fetched != null && record instanceof AbstractRecord)
((AbstractRecord) record).fetched = fetched;
RecordListenerProvider[] providers = null;
RecordListener[] listeners = null;
DefaultRecordContext ctx = null;
E exception = null;
if (configuration != null) {
providers = configuration.recordListenerProviders();
if (!isEmpty(providers)) {
listeners = map(providers, p -> p.provide(), RecordListener[]::new);
ctx = new DefaultRecordContext(configuration, executeType(), record);
}
}
if (listeners != null) {
for (RecordListener listener : (ctx == null || ctx.settings().getRecordListenerStartInvocationOrder() != REVERSE ? Arrays.asList(listeners) : Tools.reverseIterable(listeners))) {
switch(type) {
case LOAD:
listener.loadStart(ctx);
break;
case REFRESH:
listener.refreshStart(ctx);
break;
case STORE:
listener.storeStart(ctx);
break;
case INSERT:
listener.insertStart(ctx);
break;
case UPDATE:
listener.updateStart(ctx);
break;
case MERGE:
listener.mergeStart(ctx);
break;
case DELETE:
listener.deleteStart(ctx);
break;
default:
throw new IllegalStateException("Type not supported: " + type);
}
}
}
// [#1684] Do not attach configuration if settings say no
if (attachRecords(configuration))
record.attach(configuration);
if (operation != null) {
try {
operation.apply(record);
}// [#2770][#3036] Exceptions must not propagate before listeners receive "end" events
catch (Exception e) {
exception = (E) e;
// Do not propagate these exception types to client code as they're not really "exceptions"
if (!(e instanceof ControlFlowSignal)) {
if (ctx != null)
ctx.exception = e;
if (listeners != null)
for (RecordListener listener : listeners) listener.exception(ctx);
}
}
}
if (listeners != null) {
for (RecordListener listener : (ctx == null || ctx.settings().getRecordListenerEndInvocationOrder() != REVERSE ? Arrays.asList(listeners) : Tools.reverseIterable(listeners))) {
switch(type) {
case LOAD:
listener.loadEnd(ctx);
break;
case REFRESH:
listener.refreshEnd(ctx);
break;
case STORE:
listener.storeEnd(ctx);
break;
case INSERT:
listener.insertEnd(ctx);
break;
case UPDATE:
listener.updateEnd(ctx);
break;
case MERGE:
listener.mergeEnd(ctx);
break;
case DELETE:
listener.deleteEnd(ctx);
break;
default:
throw new IllegalStateException("Type not supported: " + type);
}
}
}
if (exception != null)
throw exception;
return record;
}
Aggregations