Search in sources :

Example 1 with RecordListener

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;
}
Also used : WRITE(org.jooq.ExecuteType.WRITE) RecordListenerProvider(org.jooq.RecordListenerProvider) RecordListener(org.jooq.RecordListener) ControlFlowSignal(org.jooq.exception.ControlFlowSignal)

Aggregations

WRITE (org.jooq.ExecuteType.WRITE)1 RecordListener (org.jooq.RecordListener)1 RecordListenerProvider (org.jooq.RecordListenerProvider)1 ControlFlowSignal (org.jooq.exception.ControlFlowSignal)1