/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Other licenses:
* -----------------------------------------------------------------------------
* Commercial licenses for this work are available. These replace the above
* ASL 2.0 and offer limited warranties, support, maintenance, and commercial
* database integrations.
*
* For more information, please visit: http://www.jooq.org/licenses
*
*
*
*
*
*
*
*
*
*
*
*
*
*/
package org.jooq.impl;
import static java.lang.Boolean.FALSE;
import static org.jooq.impl.Tools.EMPTY_EXECUTE_LISTENER;
import java.util.ArrayList;
import java.util.List;
import org.jooq.ExecuteContext;
import org.jooq.ExecuteListener;
import org.jooq.ExecuteListenerProvider;
import org.jooq.conf.Settings;
import org.jooq.tools.LoggerListener;
/**
* A queue implementation for several {@link ExecuteListener} objects as defined
* in {@link Settings#getExecuteListeners()}
*
* @author Lukas Eder
*/
final class ExecuteListeners implements ExecuteListener {
/**
* Generated UID
*/
private static final long serialVersionUID = 7399239846062763212L;
private final ExecuteListener[] listeners;
// In some setups, these two events may get mixed up chronologically by the
// Cursor. Postpone fetchEnd event until after resultEnd event, if there is
// an open Result
private boolean resultStart;
private boolean fetchEnd;
ExecuteListeners(ExecuteContext ctx) {
listeners = listeners(ctx);
start(ctx);
}
/**
* Provide delegate listeners from an <code>ExecuteContext</code>
*/
private static ExecuteListener[] listeners(ExecuteContext ctx) {
List<ExecuteListener> result = new ArrayList<ExecuteListener>();
for (ExecuteListenerProvider provider : ctx.configuration().executeListenerProviders())
// Could be null after deserialisation
if (provider != null)
result.add(provider.provide());
// [#6051] The previously used StopWatchListener is no longer included by default
if (!FALSE.equals(ctx.configuration().settings().isExecuteLogging()))
result.add(new LoggerListener());
return result.toArray(EMPTY_EXECUTE_LISTENER);
}
@Override
public final void start(ExecuteContext ctx) {
for (ExecuteListener listener : listeners)
listener.start(ctx);
}
@Override
public final void renderStart(ExecuteContext ctx) {
for (ExecuteListener listener : listeners)
listener.renderStart(ctx);
}
@Override
public final void renderEnd(ExecuteContext ctx) {
for (ExecuteListener listener : listeners)
listener.renderEnd(ctx);
}
@Override
public final void prepareStart(ExecuteContext ctx) {
for (ExecuteListener listener : listeners)
listener.prepareStart(ctx);
}
@Override
public final void prepareEnd(ExecuteContext ctx) {
for (ExecuteListener listener : listeners)
listener.prepareEnd(ctx);
}
@Override
public final void bindStart(ExecuteContext ctx) {
for (ExecuteListener listener : listeners)
listener.bindStart(ctx);
}
@Override
public final void bindEnd(ExecuteContext ctx) {
for (ExecuteListener listener : listeners)
listener.bindEnd(ctx);
}
@Override
public final void executeStart(ExecuteContext ctx) {
for (ExecuteListener listener : listeners)
listener.executeStart(ctx);
}
@Override
public final void executeEnd(ExecuteContext ctx) {
for (ExecuteListener listener : listeners)
listener.executeEnd(ctx);
}
@Override
public final void fetchStart(ExecuteContext ctx) {
for (ExecuteListener listener : listeners)
listener.fetchStart(ctx);
}
@Override
public final void outStart(ExecuteContext ctx) {
for (ExecuteListener listener : listeners)
listener.outStart(ctx);
}
@Override
public final void outEnd(ExecuteContext ctx) {
for (ExecuteListener listener : listeners)
listener.outEnd(ctx);
}
@Override
public final void resultStart(ExecuteContext ctx) {
resultStart = true;
for (ExecuteListener listener : listeners)
listener.resultStart(ctx);
}
@Override
public final void recordStart(ExecuteContext ctx) {
for (ExecuteListener listener : listeners)
listener.recordStart(ctx);
}
@Override
public final void recordEnd(ExecuteContext ctx) {
for (ExecuteListener listener : listeners)
listener.recordEnd(ctx);
}
@Override
public final void resultEnd(ExecuteContext ctx) {
resultStart = false;
for (ExecuteListener listener : listeners)
listener.resultEnd(ctx);
if (fetchEnd)
fetchEnd(ctx);
}
@Override
public final void fetchEnd(ExecuteContext ctx) {
if (resultStart)
fetchEnd = true;
else
for (ExecuteListener listener : listeners)
listener.fetchEnd(ctx);
}
@Override
public final void end(ExecuteContext ctx) {
for (ExecuteListener listener : listeners)
listener.end(ctx);
}
@Override
public final void exception(ExecuteContext ctx) {
for (ExecuteListener listener : listeners)
listener.exception(ctx);
}
@Override
public final void warning(ExecuteContext ctx) {
for (ExecuteListener listener : listeners)
listener.warning(ctx);
}
}