use of org.jooq.RecordListener in project jOOQ by jOOQ.
the class RecordDelegate method operate.
@SuppressWarnings("unchecked")
final <E extends Exception> R operate(RecordOperation<? super R, E> operation) throws E {
RecordListenerProvider[] providers = null;
RecordListener[] listeners = null;
DefaultRecordContext ctx = null;
E exception = null;
if (configuration != null) {
providers = configuration.recordListenerProviders();
if (providers != null && providers.length > 0) {
listeners = new RecordListener[providers.length];
ctx = new DefaultRecordContext(configuration, executeType(), record);
for (int i = 0; i < providers.length; i++) {
listeners[i] = providers[i].provide();
}
}
}
if (listeners != null) {
for (RecordListener listener : 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 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.operate(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 : 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 DELETE:
listener.deleteEnd(ctx);
break;
default:
throw new IllegalStateException("Type not supported: " + type);
}
}
}
if (exception != null) {
throw exception;
}
return record;
}
Aggregations