[#2388] Replace Configuration's List<ExecuteListener> with
ExecuteListenerProvider[] to simplify correct and thread-safe client implementations
This commit is contained in:
parent
ecaeee7d97
commit
ebca8adaa2
@ -125,7 +125,7 @@ public class ASETest extends jOOQAbstractTest<
|
||||
T_785Record> {
|
||||
|
||||
@Override
|
||||
protected DSLContext create(Settings settings) {
|
||||
protected DSLContext create0(Settings settings) {
|
||||
return DSL.using(getConnection(), SQLDialect.ASE, settings);
|
||||
}
|
||||
|
||||
|
||||
@ -60,6 +60,7 @@ import org.jooq.DAO;
|
||||
import org.jooq.DSLContext;
|
||||
import org.jooq.DataType;
|
||||
import org.jooq.ExecuteListener;
|
||||
import org.jooq.ExecuteListenerProvider;
|
||||
import org.jooq.Field;
|
||||
import org.jooq.ForeignKey;
|
||||
import org.jooq.Record;
|
||||
@ -77,8 +78,7 @@ import org.jooq.TableRecord;
|
||||
import org.jooq.UDTRecord;
|
||||
import org.jooq.UpdatableRecord;
|
||||
import org.jooq.conf.Settings;
|
||||
import org.jooq.impl.DSL;
|
||||
import org.jooq.test._.TestStatisticsListener;
|
||||
import org.jooq.impl.DefaultExecuteListenerProvider;
|
||||
import org.jooq.test._.converters.Boolean_10;
|
||||
import org.jooq.test._.converters.Boolean_TF_LC;
|
||||
import org.jooq.test._.converters.Boolean_TF_UC;
|
||||
@ -709,23 +709,19 @@ public abstract class BaseTest<
|
||||
}
|
||||
|
||||
protected final DSLContext create(Settings settings) {
|
||||
DSLContext create = delegate.create(settings);
|
||||
addListeners(create.configuration(), new TestStatisticsListener());
|
||||
return create;
|
||||
return delegate.create(settings);
|
||||
}
|
||||
|
||||
protected final DSLContext create(Configuration configuration) {
|
||||
DSLContext create = DSL.using(configuration);
|
||||
addListeners(create.configuration(), new TestStatisticsListener());
|
||||
return create;
|
||||
return delegate.create(configuration);
|
||||
}
|
||||
|
||||
protected final List<ExecuteListener> getListeners(Configuration configuration) {
|
||||
return delegate.getListeners(configuration);
|
||||
}
|
||||
protected final DSLContext create(ExecuteListener... listeners) {
|
||||
ExecuteListenerProvider[] providers = new ExecuteListenerProvider[listeners.length];
|
||||
for (int i = 0; i < listeners.length; i++)
|
||||
providers[i] = new DefaultExecuteListenerProvider(listeners[i]);
|
||||
|
||||
protected final void addListeners(Configuration configuration, ExecuteListener... listeners) {
|
||||
delegate.addListeners(configuration, listeners);
|
||||
return create(create().configuration().derive(providers));
|
||||
}
|
||||
|
||||
protected final Connection getConnection() {
|
||||
|
||||
@ -132,7 +132,7 @@ public class CUBRIDTest extends jOOQAbstractTest<
|
||||
T_785Record> {
|
||||
|
||||
@Override
|
||||
protected DSLContext create(Settings settings) {
|
||||
protected DSLContext create0(Settings settings) {
|
||||
return using(getConnection(), SQLDialect.CUBRID, settings);
|
||||
}
|
||||
|
||||
|
||||
@ -132,7 +132,7 @@ public class DB2Test extends jOOQAbstractTest<
|
||||
T_785Record> {
|
||||
|
||||
@Override
|
||||
protected DSLContext create(Settings settings) {
|
||||
protected DSLContext create0(Settings settings) {
|
||||
return DSL.using(getConnection(), SQLDialect.DB2, settings);
|
||||
}
|
||||
|
||||
|
||||
@ -132,7 +132,7 @@ public class DerbyTest extends jOOQAbstractTest<
|
||||
T_785Record> {
|
||||
|
||||
@Override
|
||||
protected DSLContext create(Settings settings) {
|
||||
protected DSLContext create0(Settings settings) {
|
||||
return DSL.using(getConnection(), SQLDialect.DERBY, settings);
|
||||
}
|
||||
|
||||
|
||||
@ -124,7 +124,7 @@ public class FirebirdTest extends jOOQAbstractTest<
|
||||
T_785Record> {
|
||||
|
||||
@Override
|
||||
protected DSLContext create(Settings settings) {
|
||||
protected DSLContext create0(Settings settings) {
|
||||
return DSL.using(getConnection(), SQLDialect.FIREBIRD, settings);
|
||||
}
|
||||
|
||||
|
||||
@ -140,7 +140,7 @@ public class H2Test extends jOOQAbstractTest<
|
||||
T_785Record> {
|
||||
|
||||
@Override
|
||||
protected DSLContext create(Settings settings) {
|
||||
protected DSLContext create0(Settings settings) {
|
||||
return DSL.using(getConnection(), SQLDialect.H2, settings);
|
||||
}
|
||||
|
||||
|
||||
@ -130,7 +130,7 @@ public class HSQLDBTest extends jOOQAbstractTest<
|
||||
T_785Record> {
|
||||
|
||||
@Override
|
||||
protected DSLContext create(Settings settings) {
|
||||
protected DSLContext create0(Settings settings) {
|
||||
return DSL.using(getConnection(), SQLDialect.HSQLDB, settings);
|
||||
}
|
||||
|
||||
|
||||
@ -129,7 +129,7 @@ public class HSQLDBTest2 extends jOOQAbstractTest<
|
||||
T_785Record> {
|
||||
|
||||
@Override
|
||||
protected DSLContext create(Settings settings) {
|
||||
protected DSLContext create0(Settings settings) {
|
||||
settings = (settings != null) ? settings : new Settings();
|
||||
RenderMapping mapping = SettingsTools.getRenderMapping(settings);
|
||||
List<MappedSchema> schemata = mapping.getSchemata();
|
||||
|
||||
@ -129,7 +129,7 @@ public class IngresTest extends jOOQAbstractTest<
|
||||
T_785Record> {
|
||||
|
||||
@Override
|
||||
protected DSLContext create(Settings settings) {
|
||||
protected DSLContext create0(Settings settings) {
|
||||
return DSL.using(getConnection(), SQLDialect.INGRES, settings);
|
||||
}
|
||||
|
||||
|
||||
@ -158,7 +158,7 @@ public class MySQLTest extends jOOQAbstractTest<
|
||||
T_785Record> {
|
||||
|
||||
@Override
|
||||
protected DSLContext create(Settings settings) {
|
||||
protected DSLContext create0(Settings settings) {
|
||||
return DSL.using(getConnection(), SQLDialect.MYSQL, settings);
|
||||
}
|
||||
|
||||
|
||||
@ -65,7 +65,7 @@ public class MySQLTestSchemaMapping extends MySQLTest {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected DSLContext create(Settings settings) {
|
||||
protected DSLContext create0(Settings settings) {
|
||||
settings = (settings != null) ? settings : new Settings();
|
||||
RenderMapping mapping = SettingsTools.getRenderMapping(settings);
|
||||
List<MappedSchema> schemata = mapping.getSchemata();
|
||||
|
||||
@ -132,7 +132,7 @@ public class MySQLTestSchemaRewrite extends jOOQAbstractTest<
|
||||
}
|
||||
|
||||
@Override
|
||||
protected DSLContext create(Settings settings) {
|
||||
protected DSLContext create0(Settings settings) {
|
||||
return DSL.using(getConnection(), SQLDialect.MYSQL, settings);
|
||||
}
|
||||
|
||||
|
||||
@ -214,7 +214,7 @@ public class OracleTest extends jOOQAbstractTest<
|
||||
}
|
||||
|
||||
@Override
|
||||
protected DSLContext create(Settings settings) {
|
||||
protected DSLContext create0(Settings settings) {
|
||||
return DSL.using(getConnection(), SQLDialect.ORACLE, settings);
|
||||
}
|
||||
|
||||
|
||||
@ -49,7 +49,7 @@ import org.jooq.impl.DSL;
|
||||
public class OracleTestInline extends OracleTest {
|
||||
|
||||
@Override
|
||||
protected DSLContext create(Settings settings) {
|
||||
protected DSLContext create0(Settings settings) {
|
||||
settings = (settings != null) ? settings : new Settings();
|
||||
settings.withStatementType(StatementType.STATIC_STATEMENT);
|
||||
settings.withRenderFormatted(true);
|
||||
|
||||
@ -148,7 +148,7 @@ public class PostgresTest extends jOOQAbstractTest<
|
||||
T_785Record> {
|
||||
|
||||
@Override
|
||||
protected DSLContext create(Settings settings) {
|
||||
protected DSLContext create0(Settings settings) {
|
||||
return DSL.using(getConnection(), SQLDialect.POSTGRES, settings);
|
||||
}
|
||||
|
||||
|
||||
@ -126,7 +126,7 @@ public class SQLServerTest extends jOOQAbstractTest<
|
||||
T_785Record> {
|
||||
|
||||
@Override
|
||||
protected DSLContext create(Settings settings) {
|
||||
protected DSLContext create0(Settings settings) {
|
||||
return DSL.using(getConnection(), SQLDialect.SQLSERVER, settings);
|
||||
}
|
||||
|
||||
|
||||
@ -49,7 +49,7 @@ import org.jooq.impl.DSL;
|
||||
public class SQLServerTestInline extends SQLServerTest {
|
||||
|
||||
@Override
|
||||
protected DSLContext create(Settings settings) {
|
||||
protected DSLContext create0(Settings settings) {
|
||||
settings = (settings != null) ? settings : new Settings();
|
||||
settings.withStatementType(StatementType.STATIC_STATEMENT);
|
||||
return DSL.using(getConnection(), SQLDialect.SQLSERVER, settings);
|
||||
|
||||
@ -126,7 +126,7 @@ public class SQLiteTest extends jOOQAbstractTest<
|
||||
T_785Record> {
|
||||
|
||||
@Override
|
||||
protected DSLContext create(Settings settings) {
|
||||
protected DSLContext create0(Settings settings) {
|
||||
return DSL.using(getConnection(), SQLDialect.SQLITE, settings);
|
||||
}
|
||||
|
||||
|
||||
@ -126,7 +126,7 @@ public class SybaseTest extends jOOQAbstractTest<
|
||||
T_785Record> {
|
||||
|
||||
@Override
|
||||
protected DSLContext create(Settings settings) {
|
||||
protected DSLContext create0(Settings settings) {
|
||||
return DSL.using(getConnection(), SQLDialect.SYBASE, settings);
|
||||
}
|
||||
|
||||
|
||||
@ -42,6 +42,7 @@ import java.util.Random;
|
||||
|
||||
import org.jooq.Configuration;
|
||||
import org.jooq.DSLContext;
|
||||
import org.jooq.ExecuteListenerProvider;
|
||||
import org.jooq.Record1;
|
||||
import org.jooq.Record2;
|
||||
import org.jooq.Record3;
|
||||
@ -126,9 +127,8 @@ extends BaseTest<A, AP, B, S, B2S, BS, L, X, DATE, BOOL, D, T, U, UU, I, IPK, T7
|
||||
// This benchmark is contributed by "jjYBdx4IL" on GitHub:
|
||||
// https://github.com/jOOQ/jOOQ/issues/1625
|
||||
|
||||
Configuration configuration = create().configuration().derive();
|
||||
Configuration configuration = create().configuration().derive(new ExecuteListenerProvider[0]);
|
||||
configuration.settings().setExecuteLogging(false);
|
||||
getListeners(configuration).clear();
|
||||
DSLContext create = create(configuration);
|
||||
|
||||
// Dry-run to avoid side-effects
|
||||
|
||||
@ -100,9 +100,7 @@ extends BaseTest<A, AP, B, S, B2S, BS, L, X, DATE, BOOL, D, T, U, UU, I, IPK, T7
|
||||
|
||||
@Test
|
||||
public void testExecuteListenerWithData() throws Exception {
|
||||
DSLContext create = create();
|
||||
addListeners(create.configuration(), new DataListener());
|
||||
|
||||
DSLContext create = create(new DataListener());
|
||||
create.selectOne().fetch();
|
||||
}
|
||||
|
||||
@ -210,8 +208,7 @@ extends BaseTest<A, AP, B, S, B2S, BS, L, X, DATE, BOOL, D, T, U, UU, I, IPK, T7
|
||||
|
||||
@Test
|
||||
public void testExecuteListenerCustomException() throws Exception {
|
||||
DSLContext create = create();
|
||||
addListeners(create.configuration(), new CustomExceptionListener());
|
||||
DSLContext create = create(new CustomExceptionListener());
|
||||
|
||||
try {
|
||||
create.fetch("invalid sql");
|
||||
@ -236,8 +233,7 @@ extends BaseTest<A, AP, B, S, B2S, BS, L, X, DATE, BOOL, D, T, U, UU, I, IPK, T7
|
||||
|
||||
@Test
|
||||
public void testExecuteListenerOnResultQuery() throws Exception {
|
||||
DSLContext create = create();
|
||||
addListeners(create.configuration(), new ResultQueryListener());
|
||||
DSLContext create = create(new ResultQueryListener());
|
||||
|
||||
create.configuration().data("Foo", "Bar");
|
||||
create.configuration().data("Bar", "Baz");
|
||||
@ -580,8 +576,7 @@ extends BaseTest<A, AP, B, S, B2S, BS, L, X, DATE, BOOL, D, T, U, UU, I, IPK, T7
|
||||
|
||||
jOOQAbstractTest.reset = false;
|
||||
|
||||
DSLContext create = create();
|
||||
addListeners(create.configuration(), new BatchSingleListener());
|
||||
DSLContext create = create(new BatchSingleListener());
|
||||
|
||||
create.configuration().data("Foo", "Bar");
|
||||
create.configuration().data("Bar", "Baz");
|
||||
@ -794,8 +789,7 @@ extends BaseTest<A, AP, B, S, B2S, BS, L, X, DATE, BOOL, D, T, U, UU, I, IPK, T7
|
||||
public void testExecuteListenerOnBatchMultiple() {
|
||||
jOOQAbstractTest.reset = false;
|
||||
|
||||
DSLContext create = create();
|
||||
addListeners(create.configuration(), new BatchMultipleListener());
|
||||
DSLContext create = create(new BatchMultipleListener());
|
||||
|
||||
create.configuration().data("Foo", "Bar");
|
||||
create.configuration().data("Bar", "Baz");
|
||||
@ -1020,8 +1014,7 @@ extends BaseTest<A, AP, B, S, B2S, BS, L, X, DATE, BOOL, D, T, U, UU, I, IPK, T7
|
||||
|
||||
@Test
|
||||
public void testExecuteListenerFetchLazyTest() throws Exception {
|
||||
DSLContext create = create();
|
||||
addListeners(create.configuration(), new FetchLazyListener());
|
||||
DSLContext create = create(new FetchLazyListener());
|
||||
FetchLazyListener.reset();
|
||||
|
||||
create.selectFrom(TAuthor()).fetch();
|
||||
|
||||
@ -232,8 +232,7 @@ extends BaseTest<A, AP, B, S, B2S, BS, L, X, DATE, BOOL, D, T, U, UU, I, IPK, T7
|
||||
// [#1191] Check execution capabilities with new features in ExecuteListener
|
||||
ConnectionProviderListener.c = create().configuration().connectionProvider().acquire();
|
||||
try {
|
||||
DSLContext create = create();
|
||||
addListeners(create.configuration(), new ConnectionProviderListener());
|
||||
DSLContext create = create(new ConnectionProviderListener());
|
||||
q = create
|
||||
.selectFrom(TAuthor())
|
||||
.orderBy(TAuthor_LAST_NAME());
|
||||
|
||||
@ -99,8 +99,7 @@ extends BaseTest<A, AP, B, S, B2S, BS, L, X, DATE, BOOL, D, T, U, UU, I, IPK, T7
|
||||
|
||||
@Test
|
||||
public void testKeepStatement() throws Exception {
|
||||
DSLContext create = create();
|
||||
addListeners(create.configuration(), new KeepStatementListener());
|
||||
DSLContext create = create(new KeepStatementListener());
|
||||
|
||||
// [#385] By default, new statements are created for every execution
|
||||
KeepStatementListener.reset();
|
||||
|
||||
@ -67,6 +67,7 @@ import org.jooq.DAO;
|
||||
import org.jooq.DSLContext;
|
||||
import org.jooq.DataType;
|
||||
import org.jooq.ExecuteListener;
|
||||
import org.jooq.ExecuteListenerProvider;
|
||||
import org.jooq.ExecuteType;
|
||||
import org.jooq.Field;
|
||||
import org.jooq.ForeignKey;
|
||||
@ -860,7 +861,7 @@ public abstract class jOOQAbstractTest<
|
||||
protected abstract Class<?> cLibrary();
|
||||
protected abstract Class<?> cSequences();
|
||||
protected abstract DataType<?>[] getCastableDataTypes();
|
||||
protected abstract DSLContext create(Settings settings);
|
||||
protected abstract DSLContext create0(Settings settings);
|
||||
|
||||
protected final Schema schema() {
|
||||
return create().map(TAuthor().getSchema());
|
||||
@ -875,25 +876,42 @@ public abstract class jOOQAbstractTest<
|
||||
.withRenderMapping(new RenderMapping()
|
||||
.withDefaultSchema(defaultSchema));
|
||||
|
||||
DSLContext create = create(settings);
|
||||
addListeners(create.configuration(),
|
||||
new TestStatisticsListener(),
|
||||
new PrettyPrinter(),
|
||||
new LifecycleWatcherListener());
|
||||
|
||||
return create;
|
||||
return DSL.using(create0(settings).configuration().derive(
|
||||
DefaultExecuteListenerProvider.providers(
|
||||
new TestStatisticsListener(),
|
||||
new PrettyPrinter(),
|
||||
new LifecycleWatcherListener()
|
||||
)
|
||||
));
|
||||
}
|
||||
|
||||
protected final List<ExecuteListener> getListeners(org.jooq.Configuration configuration) {
|
||||
|
||||
// Most test cases run with the DefaultExecuteListenerProvider,
|
||||
// which (inofficially) exposes a mutable List
|
||||
DefaultExecuteListenerProvider provider = (DefaultExecuteListenerProvider) configuration.executeListenerProvider();
|
||||
return provider.provide();
|
||||
protected final DSLContext create(Settings settings) {
|
||||
DSLContext create = create0(settings);
|
||||
return create(create.configuration());
|
||||
}
|
||||
|
||||
protected final void addListeners(org.jooq.Configuration configuration, ExecuteListener... listeners) {
|
||||
getListeners(configuration).addAll(Arrays.asList(listeners));
|
||||
protected final DSLContext create(org.jooq.Configuration configuration) {
|
||||
return DSL.using(configuration.derive(combine(
|
||||
configuration.executeListenerProviders(),
|
||||
new DefaultExecuteListenerProvider(new TestStatisticsListener())
|
||||
)));
|
||||
}
|
||||
|
||||
protected final DSLContext create(ExecuteListener... listeners) {
|
||||
ExecuteListenerProvider[] providers = new ExecuteListenerProvider[listeners.length];
|
||||
for (int i = 0; i < listeners.length; i++)
|
||||
providers[i] = new DefaultExecuteListenerProvider(listeners[i]);
|
||||
|
||||
return create(create().configuration().derive(providers));
|
||||
}
|
||||
|
||||
protected static final <T> T[] combine(T[] array, T value) {
|
||||
T[] result = (T[]) java.lang.reflect.Array.newInstance(array.getClass().getComponentType(), array.length + 1);
|
||||
|
||||
System.arraycopy(array, 0, result, 0, array.length);
|
||||
result[array.length] = value;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
protected final SQLDialect getDialect() {
|
||||
|
||||
@ -172,7 +172,7 @@ public interface Configuration extends Serializable {
|
||||
* @see ExecuteListener
|
||||
* @see ExecuteContext
|
||||
*/
|
||||
ExecuteListenerProvider executeListenerProvider();
|
||||
ExecuteListenerProvider[] executeListenerProviders();
|
||||
|
||||
/**
|
||||
* Create a derived configuration from this one, without changing any
|
||||
@ -218,6 +218,6 @@ public interface Configuration extends Serializable {
|
||||
* contained in the derived configuration.
|
||||
* @return The derived configuration.
|
||||
*/
|
||||
Configuration derive(ExecuteListenerProvider newExecuteListenerProvider);
|
||||
Configuration derive(ExecuteListenerProvider... newExecuteListenerProviders);
|
||||
|
||||
}
|
||||
|
||||
@ -35,15 +35,11 @@
|
||||
*/
|
||||
package org.jooq;
|
||||
|
||||
import java.util.List;
|
||||
import org.jooq.impl.DefaultExecuteListenerProvider;
|
||||
|
||||
/**
|
||||
* A provider for {@link ExecuteListener} instances.
|
||||
* <p>
|
||||
* <strong>WARNING: The design of the <code>ExecuteListener</code> API is
|
||||
* undergoing change and may be unstable at the current stage of jOOQ 3.0-RC3
|
||||
* development. USE AT OWN RISK!</strong>
|
||||
* <p>
|
||||
* In order to facilitate the lifecycle management of
|
||||
* <code>ExecuteListener</code> instances that are provided to a jOOQ
|
||||
* {@link Configuration}, clients can implement this API. To jOOQ, it is thus
|
||||
@ -57,13 +53,19 @@ import java.util.List;
|
||||
public interface ExecuteListenerProvider {
|
||||
|
||||
/**
|
||||
* Provide a list of <code>ExecuteListener</code> instances.
|
||||
* Provide an <code>ExecuteListener</code> instance.
|
||||
* <p>
|
||||
* jOOQ will issue {@link ExecuteListener} notification events to each
|
||||
* listener in the order of iteration of the returned list.
|
||||
* Implementations are free to choose whether this method returns new
|
||||
* instances at every call or whether the same instance is returned
|
||||
* repetitively.
|
||||
* <p>
|
||||
* An <code>ExecuteListener</code> shall be provided exactly once per query
|
||||
* execution lifecycle, i.e. per <code>ExecuteContext</code>.
|
||||
*
|
||||
* @return A list of <code>ExecuteListener</code> instances.
|
||||
* @return An <code>ExecuteListener</code> instance.
|
||||
* @see ExecuteListener
|
||||
* @see ExecuteContext
|
||||
* @see DefaultExecuteListenerProvider
|
||||
*/
|
||||
List<ExecuteListener> provide();
|
||||
ExecuteListener provide();
|
||||
}
|
||||
|
||||
@ -49,7 +49,6 @@ import org.jooq.BatchBindStep;
|
||||
import org.jooq.Configuration;
|
||||
import org.jooq.DSLContext;
|
||||
import org.jooq.ExecuteContext;
|
||||
import org.jooq.ExecuteListener;
|
||||
import org.jooq.Query;
|
||||
import org.jooq.UpdatableRecord;
|
||||
import org.jooq.exception.DataAccessException;
|
||||
@ -99,9 +98,10 @@ class BatchCRUD implements Batch {
|
||||
QueryCollector collector = new QueryCollector();
|
||||
|
||||
// Add the QueryCollector to intercept query execution after rendering
|
||||
List<ExecuteListener> listeners = new ArrayList<ExecuteListener>(configuration.executeListenerProvider().provide());
|
||||
listeners.add(collector);
|
||||
Configuration local = configuration.derive(new DefaultExecuteListenerProvider(listeners));
|
||||
Configuration local = configuration.derive(Utils.combine(
|
||||
configuration.executeListenerProviders(),
|
||||
new DefaultExecuteListenerProvider(collector)
|
||||
));
|
||||
|
||||
// [#1537] Communicate with UpdatableRecordImpl
|
||||
local.data(Utils.DATA_OMIT_RETURNING_CLAUSE, true);
|
||||
@ -167,9 +167,10 @@ class BatchCRUD implements Batch {
|
||||
List<Query> queries = new ArrayList<Query>();
|
||||
QueryCollector collector = new QueryCollector();
|
||||
|
||||
List<ExecuteListener> listeners = new ArrayList<ExecuteListener>(configuration.executeListenerProvider().provide());
|
||||
listeners.add(collector);
|
||||
Configuration local = configuration.derive(new DefaultExecuteListenerProvider(listeners));
|
||||
Configuration local = configuration.derive(Utils.combine(
|
||||
configuration.executeListenerProviders(),
|
||||
new DefaultExecuteListenerProvider(collector)
|
||||
));
|
||||
|
||||
for (int i = 0; i < records.length; i++) {
|
||||
Configuration previous = ((AttachableInternal) records[i]).configuration();
|
||||
|
||||
@ -78,7 +78,7 @@ public class DefaultConfiguration implements Configuration {
|
||||
|
||||
// Non-serializable Configuration objects
|
||||
private transient ConnectionProvider connectionProvider;
|
||||
private transient ExecuteListenerProvider listenerProvider;
|
||||
private transient ExecuteListenerProvider[] listenerProviders;
|
||||
|
||||
// Derived objects
|
||||
private final org.jooq.SchemaMapping mapping;
|
||||
@ -97,7 +97,7 @@ public class DefaultConfiguration implements Configuration {
|
||||
public DefaultConfiguration() {
|
||||
this(
|
||||
new NoConnectionProvider(),
|
||||
new DefaultExecuteListenerProvider(),
|
||||
new ExecuteListenerProvider[0],
|
||||
SQL99,
|
||||
SettingsTools.defaultSettings(),
|
||||
null);
|
||||
@ -114,7 +114,7 @@ public class DefaultConfiguration implements Configuration {
|
||||
DefaultConfiguration(Configuration configuration) {
|
||||
this(
|
||||
configuration.connectionProvider(),
|
||||
configuration.executeListenerProvider(),
|
||||
configuration.executeListenerProviders(),
|
||||
configuration.dialect(),
|
||||
configuration.settings(),
|
||||
configuration.data()
|
||||
@ -131,15 +131,15 @@ public class DefaultConfiguration implements Configuration {
|
||||
*/
|
||||
DefaultConfiguration(
|
||||
ConnectionProvider connectionProvider,
|
||||
ExecuteListenerProvider listenerProvider,
|
||||
ExecuteListenerProvider[] listenerProviders,
|
||||
SQLDialect dialect,
|
||||
Settings settings,
|
||||
Map<Object, Object> data)
|
||||
{
|
||||
this.connectionProvider = connectionProvider;
|
||||
this.listenerProvider = listenerProvider != null
|
||||
? listenerProvider
|
||||
: new DefaultExecuteListenerProvider();
|
||||
this.listenerProviders = listenerProviders != null
|
||||
? listenerProviders
|
||||
: new ExecuteListenerProvider[0];
|
||||
|
||||
this.dialect = dialect;
|
||||
this.settings = settings != null
|
||||
@ -170,7 +170,7 @@ public class DefaultConfiguration implements Configuration {
|
||||
*/
|
||||
@Override
|
||||
public final Configuration derive(SQLDialect newDialect) {
|
||||
return new DefaultConfiguration(connectionProvider, listenerProvider, newDialect, settings, data);
|
||||
return new DefaultConfiguration(connectionProvider, listenerProviders, newDialect, settings, data);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -178,7 +178,7 @@ public class DefaultConfiguration implements Configuration {
|
||||
*/
|
||||
@Override
|
||||
public final Configuration derive(ConnectionProvider newConnectionProvider) {
|
||||
return new DefaultConfiguration(newConnectionProvider, listenerProvider, dialect, settings, data);
|
||||
return new DefaultConfiguration(newConnectionProvider, listenerProviders, dialect, settings, data);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -186,15 +186,15 @@ public class DefaultConfiguration implements Configuration {
|
||||
*/
|
||||
@Override
|
||||
public final Configuration derive(Settings newSettings) {
|
||||
return new DefaultConfiguration(connectionProvider, listenerProvider, dialect, newSettings, data);
|
||||
return new DefaultConfiguration(connectionProvider, listenerProviders, dialect, newSettings, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public final Configuration derive(ExecuteListenerProvider newExecuteListenerProvider) {
|
||||
return new DefaultConfiguration(connectionProvider, newExecuteListenerProvider, dialect, settings, data);
|
||||
public final Configuration derive(ExecuteListenerProvider... newExecuteListenerProviders) {
|
||||
return new DefaultConfiguration(connectionProvider, newExecuteListenerProviders, dialect, settings, data);
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
@ -262,8 +262,8 @@ public class DefaultConfiguration implements Configuration {
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public final ExecuteListenerProvider executeListenerProvider() {
|
||||
return listenerProvider;
|
||||
public final ExecuteListenerProvider[] executeListenerProviders() {
|
||||
return listenerProviders;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -289,15 +289,21 @@ public class DefaultConfiguration implements Configuration {
|
||||
oos.writeObject(connectionProvider instanceof Serializable
|
||||
? connectionProvider
|
||||
: null);
|
||||
oos.writeObject(listenerProvider instanceof Serializable
|
||||
? listenerProvider
|
||||
: null);
|
||||
|
||||
ExecuteListenerProvider[] clone = new ExecuteListenerProvider[listenerProviders.length];
|
||||
for (int i = 0; i < clone.length; i++) {
|
||||
if (listenerProviders[i] instanceof Serializable) {
|
||||
clone[i] = listenerProviders[i];
|
||||
}
|
||||
}
|
||||
|
||||
oos.writeObject(clone);
|
||||
}
|
||||
|
||||
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
|
||||
ois.defaultReadObject();
|
||||
|
||||
connectionProvider = (ConnectionProvider) ois.readObject();
|
||||
listenerProvider = (ExecuteListenerProvider) ois.readObject();
|
||||
listenerProviders = (ExecuteListenerProvider[]) ois.readObject();
|
||||
}
|
||||
}
|
||||
@ -36,9 +36,6 @@
|
||||
package org.jooq.impl;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import org.jooq.ExecuteListener;
|
||||
import org.jooq.ExecuteListenerProvider;
|
||||
@ -46,9 +43,9 @@ import org.jooq.ExecuteListenerProvider;
|
||||
/**
|
||||
* A default implementation for {@link ExecuteListenerProvider}.
|
||||
* <p>
|
||||
* This implementation just wraps a <code>List</code> of {@link ExecuteListener}
|
||||
* instances, always providing the same.
|
||||
*
|
||||
* This implementation just wraps an instance of {@link ExecuteListener}, always
|
||||
* providing the same.
|
||||
*
|
||||
* @author Lukas Eder
|
||||
*/
|
||||
public class DefaultExecuteListenerProvider implements ExecuteListenerProvider, Serializable {
|
||||
@ -61,40 +58,38 @@ public class DefaultExecuteListenerProvider implements ExecuteListenerProvider,
|
||||
/**
|
||||
* The delegate list.
|
||||
*/
|
||||
private List<ExecuteListener> listeners;
|
||||
private final ExecuteListener listener;
|
||||
|
||||
/**
|
||||
* Create a new provider instance with an empty <code>ArrayList</code>
|
||||
* argument.
|
||||
* Convenience method to construct an array of
|
||||
* <code>DefaultExecuteListenerProvider</code> from an array of
|
||||
* <code>ExecuteListener</code> instances.
|
||||
*/
|
||||
public DefaultExecuteListenerProvider() {
|
||||
this(new ArrayList<ExecuteListener>());
|
||||
public static ExecuteListenerProvider[] providers(ExecuteListener... listeners) {
|
||||
ExecuteListenerProvider[] result = new ExecuteListenerProvider[listeners.length];
|
||||
|
||||
for (int i = 0; i < listeners.length; i++) {
|
||||
result[i] = new DefaultExecuteListenerProvider(listeners[i]);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new provider instance from an argument <code>List</code>.
|
||||
* Create a new provider instance from an argument listener.
|
||||
*
|
||||
* @param listeners The argument list.
|
||||
* @param listener The argument listener.
|
||||
*/
|
||||
public DefaultExecuteListenerProvider(ExecuteListener... listeners) {
|
||||
this.listeners = new ArrayList<ExecuteListener>(Arrays.asList(listeners));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new provider instance from an argument <code>List</code>.
|
||||
*
|
||||
* @param listeners The argument list.
|
||||
*/
|
||||
public DefaultExecuteListenerProvider(List<ExecuteListener> listeners) {
|
||||
this.listeners = listeners;
|
||||
public DefaultExecuteListenerProvider(ExecuteListener listener) {
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public final List<ExecuteListener> provide() {
|
||||
return listeners;
|
||||
public final ExecuteListener provide() {
|
||||
return listener;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -102,6 +97,6 @@ public class DefaultExecuteListenerProvider implements ExecuteListenerProvider,
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return "" + listeners;
|
||||
return listener.toString();
|
||||
}
|
||||
}
|
||||
|
||||
@ -35,11 +35,17 @@
|
||||
*/
|
||||
package org.jooq.impl;
|
||||
|
||||
import static java.lang.Boolean.FALSE;
|
||||
|
||||
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;
|
||||
import org.jooq.tools.StopWatchListener;
|
||||
|
||||
/**
|
||||
* A queue implementation for several {@link ExecuteListener} objects as defined
|
||||
@ -52,7 +58,7 @@ class ExecuteListeners implements ExecuteListener {
|
||||
/**
|
||||
* Generated UID
|
||||
*/
|
||||
private static final long serialVersionUID = 7399239846062763212L;
|
||||
private static final long serialVersionUID = 7399239846062763212L;
|
||||
|
||||
private final List<ExecuteListener> listeners;
|
||||
|
||||
@ -63,11 +69,33 @@ class ExecuteListeners implements ExecuteListener {
|
||||
private boolean fetchEnd;
|
||||
|
||||
ExecuteListeners(ExecuteContext ctx) {
|
||||
listeners = Utils.getListeners(ctx);
|
||||
listeners = listeners(ctx);
|
||||
|
||||
start(ctx);
|
||||
}
|
||||
|
||||
/**
|
||||
* Provide delegate listeners from an <code>ExecuteContext</code>
|
||||
*/
|
||||
private static List<ExecuteListener> listeners(ExecuteContext ctx) {
|
||||
List<ExecuteListener> result = new ArrayList<ExecuteListener>();
|
||||
|
||||
if (!FALSE.equals(ctx.configuration().settings().isExecuteLogging())) {
|
||||
result.add(new StopWatchListener());
|
||||
result.add(new LoggerListener());
|
||||
}
|
||||
|
||||
for (ExecuteListenerProvider provider : ctx.configuration().executeListenerProviders()) {
|
||||
|
||||
// Could be null after deserialisation
|
||||
if (provider != null) {
|
||||
result.add(provider.provide());
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void start(ExecuteContext ctx) {
|
||||
for (ExecuteListener listener : listeners) {
|
||||
|
||||
@ -956,6 +956,16 @@ final class Utils {
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
static final <T> T[] combine(T[] array, T value) {
|
||||
T[] result = (T[]) java.lang.reflect.Array.newInstance(array.getClass().getComponentType(), array.length + 1);
|
||||
|
||||
System.arraycopy(array, 0, result, 0, array.length);
|
||||
result[array.length] = value;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Combine a field with an array of fields
|
||||
*/
|
||||
@ -1090,25 +1100,6 @@ final class Utils {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list of ExecuteListener instances (including defaults) from a
|
||||
* configuration
|
||||
*/
|
||||
static final List<ExecuteListener> getListeners(ExecuteContext ctx) {
|
||||
List<ExecuteListener> result = new ArrayList<ExecuteListener>();
|
||||
if (!FALSE.equals(ctx.configuration().settings().isExecuteLogging())) {
|
||||
result.add(new StopWatchListener());
|
||||
result.add(new LoggerListener());
|
||||
}
|
||||
|
||||
ExecuteListenerProvider provider = ctx.configuration().executeListenerProvider();
|
||||
if (provider != null) {
|
||||
result.addAll(provider.provide());
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrap a piece of SQL code in parentheses, if not wrapped already
|
||||
*/
|
||||
|
||||
Loading…
Reference in New Issue
Block a user