Search in sources :

Example 6 with ControlFlowSignal

use of org.jooq.exception.ControlFlowSignal 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

ControlFlowSignal (org.jooq.exception.ControlFlowSignal)6 SQLException (java.sql.SQLException)5 ExecuteListener (org.jooq.ExecuteListener)4 Connection (java.sql.Connection)3 ExecuteContext (org.jooq.ExecuteContext)3 ArrayList (java.util.ArrayList)2 Array (java.sql.Array)1 ResultSet (java.sql.ResultSet)1 Arrays.asList (java.util.Arrays.asList)1 List (java.util.List)1 Configuration (org.jooq.Configuration)1 DataType (org.jooq.DataType)1 WRITE (org.jooq.ExecuteType.WRITE)1 Param (org.jooq.Param)1 RecordListener (org.jooq.RecordListener)1 RecordListenerProvider (org.jooq.RecordListenerProvider)1 DataTypeException (org.jooq.exception.DataTypeException)1 DetachedException (org.jooq.exception.DetachedException)1 MappingException (org.jooq.exception.MappingException)1 SQLDialectNotSupportedException (org.jooq.exception.SQLDialectNotSupportedException)1