Search in sources :

Example 1 with REFRESH

use of org.jooq.impl.RecordDelegate.RecordLifecycleType.REFRESH 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;
}
Also used : READ(org.jooq.ExecuteType.READ) Record(org.jooq.Record) Arrays(java.util.Arrays) Tools.map(org.jooq.impl.Tools.map) Tools.attachRecords(org.jooq.impl.Tools.attachRecords) WRITE(org.jooq.ExecuteType.WRITE) REVERSE(org.jooq.conf.InvocationOrder.REVERSE) Tools.isEmpty(org.jooq.impl.Tools.isEmpty) Supplier(java.util.function.Supplier) RecordListener(org.jooq.RecordListener) Configuration(org.jooq.Configuration) ExecuteType(org.jooq.ExecuteType) REFRESH(org.jooq.impl.RecordDelegate.RecordLifecycleType.REFRESH) LOAD(org.jooq.impl.RecordDelegate.RecordLifecycleType.LOAD) RecordListenerProvider(org.jooq.RecordListenerProvider) ControlFlowSignal(org.jooq.exception.ControlFlowSignal) WRITE(org.jooq.ExecuteType.WRITE) REVERSE(org.jooq.conf.InvocationOrder.REVERSE) RecordListenerProvider(org.jooq.RecordListenerProvider) RecordListener(org.jooq.RecordListener) ControlFlowSignal(org.jooq.exception.ControlFlowSignal)

Aggregations

Arrays (java.util.Arrays)1 Supplier (java.util.function.Supplier)1 Configuration (org.jooq.Configuration)1 ExecuteType (org.jooq.ExecuteType)1 READ (org.jooq.ExecuteType.READ)1 WRITE (org.jooq.ExecuteType.WRITE)1 Record (org.jooq.Record)1 RecordListener (org.jooq.RecordListener)1 RecordListenerProvider (org.jooq.RecordListenerProvider)1 REVERSE (org.jooq.conf.InvocationOrder.REVERSE)1 ControlFlowSignal (org.jooq.exception.ControlFlowSignal)1 LOAD (org.jooq.impl.RecordDelegate.RecordLifecycleType.LOAD)1 REFRESH (org.jooq.impl.RecordDelegate.RecordLifecycleType.REFRESH)1 Tools.attachRecords (org.jooq.impl.Tools.attachRecords)1 Tools.isEmpty (org.jooq.impl.Tools.isEmpty)1 Tools.map (org.jooq.impl.Tools.map)1