diff --git a/jOOQ/src/main/java/org/jooq/Configuration.java b/jOOQ/src/main/java/org/jooq/Configuration.java
index e8d16cd6bc..81f5b67723 100644
--- a/jOOQ/src/main/java/org/jooq/Configuration.java
+++ b/jOOQ/src/main/java/org/jooq/Configuration.java
@@ -262,6 +262,12 @@ public interface Configuration extends Serializable {
*/
TransactionProvider transactionProvider();
+ /**
+ * Get the configured TransactionListenerProviders from this
+ * configuration.
+ */
+ TransactionListenerProvider[] transactionListenerProviders();
+
/**
* Get this configuration's underlying record mapper provider.
*/
@@ -472,6 +478,18 @@ public interface Configuration extends Serializable {
*/
Configuration set(VisitListenerProvider... newVisitListenerProviders);
+ /**
+ * Change this configuration to hold a new transaction listener providers.
+ *
+ * This method is not thread-safe and should not be used in globally
+ * available Configuration objects.
+ *
+ * @param newTransactionListenerProviders The new transaction listener
+ * providers to be contained in the changed configuration.
+ * @return The changed configuration.
+ */
+ Configuration set(TransactionListenerProvider... newTransactionListenerProviders);
+
/**
* Change this configuration to hold a new converter provider.
*
@@ -612,6 +630,16 @@ public interface Configuration extends Serializable {
*/
Configuration derive(VisitListenerProvider... newVisitListenerProviders);
+ /**
+ * Create a derived configuration from this one, with new transaction
+ * listener providers.
+ *
+ * @param newTransactionListenerProviders The new transaction listener
+ * providers to be contained in the derived configuration.
+ * @return The derived configuration.
+ */
+ Configuration derive(TransactionListenerProvider... newTransactionListenerProviders);
+
/**
* Create a derived configuration from this one, with new converter
* provider.
diff --git a/jOOQ/src/main/java/org/jooq/TransactionListener.java b/jOOQ/src/main/java/org/jooq/TransactionListener.java
new file mode 100644
index 0000000000..503e842641
--- /dev/null
+++ b/jOOQ/src/main/java/org/jooq/TransactionListener.java
@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2009-2016, Data Geekery GmbH (http://www.datageekery.com)
+ * All rights reserved.
+ *
+ * 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;
+
+/**
+ * The TransactionListener SPI is used to intercept the
+ * {@link TransactionProvider}'s transaction events.
+ *
+ * @author Lukas Eder
+ */
+public interface TransactionListener {
+
+ /**
+ * Called before {@link TransactionProvider#begin(TransactionContext)}.
+ */
+ void beginStart(TransactionContext ctx);
+
+ /**
+ * Called after {@link TransactionProvider#begin(TransactionContext)}.
+ */
+ void beginEnd(TransactionContext ctx);
+
+ /**
+ * Called before {@link TransactionProvider#commit(TransactionContext)}.
+ */
+ void commitStart(TransactionContext ctx);
+
+ /**
+ * Called after {@link TransactionProvider#commit(TransactionContext)}.
+ */
+ void commitEnd(TransactionContext ctx);
+
+ /**
+ * Called before {@link TransactionProvider#rollback(TransactionContext)}.
+ */
+ void rollbackStart(TransactionContext ctx);
+
+ /**
+ * Called after {@link TransactionProvider#rollback(TransactionContext)}.
+ */
+ void rollbackEnd(TransactionContext ctx);
+
+}
diff --git a/jOOQ/src/main/java/org/jooq/TransactionListenerProvider.java b/jOOQ/src/main/java/org/jooq/TransactionListenerProvider.java
new file mode 100644
index 0000000000..66b18d5e8a
--- /dev/null
+++ b/jOOQ/src/main/java/org/jooq/TransactionListenerProvider.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2009-2016, Data Geekery GmbH (http://www.datageekery.com)
+ * All rights reserved.
+ *
+ * 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;
+
+import org.jooq.impl.DefaultTransactionListenerProvider;
+
+/**
+ * A provider for {@link TransactionListener} instances.
+ *
+ * In order to facilitate the lifecycle management of
+ * TransactionListener instances that are provided to a jOOQ
+ * {@link Configuration}, clients can implement this API. To jOOQ, it is thus
+ * irrelevant, if transaction listeners are stateful or stateless, local to an
+ * execution, or global to an application.
+ *
+ * @author Lukas Eder
+ * @see TransactionListener
+ * @see Configuration
+ */
+
+@FunctionalInterface
+
+public interface TransactionListenerProvider {
+
+ /**
+ * Provide an TransactionListener instance.
+ *
+ * Implementations are free to choose whether this method returns new
+ * instances at every call or whether the same instance is returned
+ * repetitively.
+ *
+ * A TransactionListener shall be provided exactly once per
+ * transaction lifecycle, i.e. per call to
+ * {@link DSLContext#transaction(TransactionalRunnable)} or similar API.
+ *
+ * @return An TransactionListener instance.
+ * @see TransactionListener
+ * @see TransactionProvider
+ * @see DefaultTransactionListenerProvider
+ */
+ TransactionListener provide();
+}
diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultConfiguration.java b/jOOQ/src/main/java/org/jooq/impl/DefaultConfiguration.java
index 2f9955401a..cd1a8bd846 100644
--- a/jOOQ/src/main/java/org/jooq/impl/DefaultConfiguration.java
+++ b/jOOQ/src/main/java/org/jooq/impl/DefaultConfiguration.java
@@ -64,6 +64,7 @@ import org.jooq.ExecutorProvider;
import org.jooq.RecordListenerProvider;
import org.jooq.RecordMapperProvider;
import org.jooq.SQLDialect;
+import org.jooq.TransactionListenerProvider;
import org.jooq.TransactionProvider;
import org.jooq.VisitListenerProvider;
import org.jooq.conf.Settings;
@@ -83,25 +84,26 @@ public class DefaultConfiguration implements Configuration {
/**
* Serial version UID
*/
- private static final long serialVersionUID = 8193158984283234708L;
+ private static final long serialVersionUID = 8193158984283234708L;
// Configuration objects
- private SQLDialect dialect;
- private Settings settings;
- private ConcurrentHashMap data;
+ private SQLDialect dialect;
+ private Settings settings;
+ private ConcurrentHashMap data;
// Non-serializable Configuration objects
- private transient ConnectionProvider connectionProvider;
- private transient ExecutorProvider executorProvider;
- private transient TransactionProvider transactionProvider;
- private transient RecordMapperProvider recordMapperProvider;
- private transient RecordListenerProvider[] recordListenerProviders;
- private transient ExecuteListenerProvider[] executeListenerProviders;
- private transient VisitListenerProvider[] visitListenerProviders;
- private transient ConverterProvider converterProvider;
+ private transient ConnectionProvider connectionProvider;
+ private transient ExecutorProvider executorProvider;
+ private transient TransactionProvider transactionProvider;
+ private transient RecordMapperProvider recordMapperProvider;
+ private transient RecordListenerProvider[] recordListenerProviders;
+ private transient ExecuteListenerProvider[] executeListenerProviders;
+ private transient VisitListenerProvider[] visitListenerProviders;
+ private transient TransactionListenerProvider[] transactionListenerProviders;
+ private transient ConverterProvider converterProvider;
// Derived objects
- private org.jooq.SchemaMapping mapping;
+ private org.jooq.SchemaMapping mapping;
// -------------------------------------------------------------------------
// XXX: Constructors
@@ -137,6 +139,7 @@ public class DefaultConfiguration implements Configuration {
null,
null,
null,
+ null,
dialect,
SettingsTools.defaultSettings(),
null
@@ -160,6 +163,7 @@ public class DefaultConfiguration implements Configuration {
configuration.recordListenerProviders(),
configuration.executeListenerProviders(),
configuration.visitListenerProviders(),
+ configuration.transactionListenerProviders(),
configuration.converterProvider(),
configuration.dialect(),
configuration.settings(),
@@ -173,9 +177,9 @@ public class DefaultConfiguration implements Configuration {
* through reflection.
*
* @deprecated Use
- * {@link #DefaultConfiguration(ConnectionProvider, ExecutorProvider, TransactionProvider, RecordMapperProvider, RecordListenerProvider[], ExecuteListenerProvider[], VisitListenerProvider[], ConverterProvider, SQLDialect, Settings, Map)}
+ * {@link #DefaultConfiguration(ConnectionProvider, ExecutorProvider, TransactionProvider, RecordMapperProvider, RecordListenerProvider[], ExecuteListenerProvider[], VisitListenerProvider[], TransactionListenerProvider[], ConverterProvider, SQLDialect, Settings, Map)}
* instead. This constructor is maintained to provide jOOQ 3.2,
- * 3.3, 3.7 backwards-compatibility if called with reflection
+ * 3.3, 3.7, 3.8 backwards-compatibility if called with reflection
* from Spring configurations.
*/
@Deprecated
@@ -195,6 +199,7 @@ public class DefaultConfiguration implements Configuration {
executeListenerProviders,
null,
null,
+ null,
dialect,
settings,
data
@@ -207,9 +212,9 @@ public class DefaultConfiguration implements Configuration {
* through reflection.
*
* @deprecated Use
- * {@link #DefaultConfiguration(ConnectionProvider, ExecutorProvider, TransactionProvider, RecordMapperProvider, RecordListenerProvider[], ExecuteListenerProvider[], VisitListenerProvider[], ConverterProvider, SQLDialect, Settings, Map)}
+ * {@link #DefaultConfiguration(ConnectionProvider, ExecutorProvider, TransactionProvider, RecordMapperProvider, RecordListenerProvider[], ExecuteListenerProvider[], VisitListenerProvider[], TransactionListenerProvider[], ConverterProvider, SQLDialect, Settings, Map)}
* instead. This constructor is maintained to provide jOOQ 3.2,
- * 3.3, 3.7 backwards-compatibility if called with reflection
+ * 3.3, 3.7, 3.8 backwards-compatibility if called with reflection
* from Spring configurations.
*/
@Deprecated
@@ -230,6 +235,7 @@ public class DefaultConfiguration implements Configuration {
executeListenerProviders,
null,
null,
+ null,
dialect,
settings,
data
@@ -242,9 +248,9 @@ public class DefaultConfiguration implements Configuration {
* through reflection.
*
* @deprecated Use
- * {@link #DefaultConfiguration(ConnectionProvider, ExecutorProvider, TransactionProvider, RecordMapperProvider, RecordListenerProvider[], ExecuteListenerProvider[], VisitListenerProvider[], ConverterProvider, SQLDialect, Settings, Map)}
+ * {@link #DefaultConfiguration(ConnectionProvider, ExecutorProvider, TransactionProvider, RecordMapperProvider, RecordListenerProvider[], ExecuteListenerProvider[], VisitListenerProvider[], TransactionListenerProvider[], ConverterProvider, SQLDialect, Settings, Map)}
* instead. This constructor is maintained to provide jOOQ 3.2,
- * 3.3, 3.7 backwards-compatibility if called with reflection
+ * 3.3, 3.7, 3.8 backwards-compatibility if called with reflection
* from Spring configurations.
*/
@Deprecated
@@ -267,6 +273,7 @@ public class DefaultConfiguration implements Configuration {
executeListenerProviders,
visitListenerProviders,
null,
+ null,
dialect,
settings,
data
@@ -279,9 +286,9 @@ public class DefaultConfiguration implements Configuration {
* through reflection.
*
* @deprecated Use
- * {@link #DefaultConfiguration(ConnectionProvider, ExecutorProvider, TransactionProvider, RecordMapperProvider, RecordListenerProvider[], ExecuteListenerProvider[], VisitListenerProvider[], ConverterProvider, SQLDialect, Settings, Map)}
+ * {@link #DefaultConfiguration(ConnectionProvider, ExecutorProvider, TransactionProvider, RecordMapperProvider, RecordListenerProvider[], ExecuteListenerProvider[], VisitListenerProvider[], TransactionListenerProvider[], ConverterProvider, SQLDialect, Settings, Map)}
* instead. This constructor is maintained to provide jOOQ 3.2,
- * 3.3, 3.7 backwards-compatibility if called with reflection
+ * 3.3, 3.7, 3.8 backwards-compatibility if called with reflection
* from Spring configurations.
*/
@Deprecated
@@ -305,6 +312,7 @@ public class DefaultConfiguration implements Configuration {
executeListenerProviders,
visitListenerProviders,
null,
+ null,
dialect,
settings,
data
@@ -317,9 +325,9 @@ public class DefaultConfiguration implements Configuration {
* through reflection.
*
* @deprecated Use
- * {@link #DefaultConfiguration(ConnectionProvider, ExecutorProvider, TransactionProvider, RecordMapperProvider, RecordListenerProvider[], ExecuteListenerProvider[], VisitListenerProvider[], ConverterProvider, SQLDialect, Settings, Map)}
+ * {@link #DefaultConfiguration(ConnectionProvider, ExecutorProvider, TransactionProvider, RecordMapperProvider, RecordListenerProvider[], ExecuteListenerProvider[], VisitListenerProvider[], TransactionListenerProvider[], ConverterProvider, SQLDialect, Settings, Map)}
* instead. This constructor is maintained to provide jOOQ 3.2,
- * 3.3, 3.7 backwards-compatibility if called with reflection
+ * 3.3, 3.7, 3.8 backwards-compatibility if called with reflection
* from Spring configurations.
*/
@Deprecated
@@ -343,6 +351,51 @@ public class DefaultConfiguration implements Configuration {
recordListenerProviders,
executeListenerProviders,
visitListenerProviders,
+ null,
+ converterProvider,
+ dialect,
+ settings,
+ data
+ );
+ }
+
+ /**
+ * Create the actual configuration object.
+ *
+ * This constructor has been made package-private to allow for adding new
+ * configuration properties in the future, without breaking client code.
+ * Consider creating a configuration by chaining calls to various
+ * derive() methods.
+ *
+ * @deprecated Use
+ * {@link #DefaultConfiguration(ConnectionProvider, ExecutorProvider, TransactionProvider, RecordMapperProvider, RecordListenerProvider[], ExecuteListenerProvider[], VisitListenerProvider[], TransactionListenerProvider[], ConverterProvider, SQLDialect, Settings, Map)}
+ * instead. This constructor is maintained to provide jOOQ 3.2,
+ * 3.3, 3.7, 3.8 backwards-compatibility if called with reflection
+ * from Spring configurations.
+ */
+ @Deprecated
+ DefaultConfiguration(
+ ConnectionProvider connectionProvider,
+ ExecutorProvider executorProvider,
+ TransactionProvider transactionProvider,
+ RecordMapperProvider recordMapperProvider,
+ RecordListenerProvider[] recordListenerProviders,
+ ExecuteListenerProvider[] executeListenerProviders,
+ VisitListenerProvider[] visitListenerProviders,
+ ConverterProvider converterProvider,
+ SQLDialect dialect,
+ Settings settings,
+ Map data)
+ {
+ this(
+ connectionProvider,
+ executorProvider,
+ transactionProvider,
+ recordMapperProvider,
+ recordListenerProviders,
+ executeListenerProviders,
+ visitListenerProviders,
+ null,
converterProvider,
dialect,
settings,
@@ -366,6 +419,7 @@ public class DefaultConfiguration implements Configuration {
RecordListenerProvider[] recordListenerProviders,
ExecuteListenerProvider[] executeListenerProviders,
VisitListenerProvider[] visitListenerProviders,
+ TransactionListenerProvider[] transactionListenerProviders,
ConverterProvider converterProvider,
SQLDialect dialect,
Settings settings,
@@ -378,6 +432,7 @@ public class DefaultConfiguration implements Configuration {
set(recordListenerProviders);
set(executeListenerProviders);
set(visitListenerProviders);
+ set(transactionListenerProviders);
set(converterProvider);
set(dialect);
set(settings);
@@ -428,6 +483,7 @@ public class DefaultConfiguration implements Configuration {
recordListenerProviders,
executeListenerProviders,
visitListenerProviders,
+ transactionListenerProviders,
converterProvider,
dialect,
settings,
@@ -448,6 +504,7 @@ public class DefaultConfiguration implements Configuration {
recordListenerProviders,
executeListenerProviders,
visitListenerProviders,
+ transactionListenerProviders,
converterProvider,
dialect,
settings,
@@ -468,6 +525,7 @@ public class DefaultConfiguration implements Configuration {
recordListenerProviders,
executeListenerProviders,
visitListenerProviders,
+ transactionListenerProviders,
converterProvider,
dialect,
settings,
@@ -488,6 +546,7 @@ public class DefaultConfiguration implements Configuration {
recordListenerProviders,
executeListenerProviders,
visitListenerProviders,
+ transactionListenerProviders,
converterProvider,
dialect,
settings,
@@ -508,6 +567,7 @@ public class DefaultConfiguration implements Configuration {
newRecordListenerProviders,
executeListenerProviders,
visitListenerProviders,
+ transactionListenerProviders,
converterProvider,
dialect,
settings,
@@ -528,6 +588,7 @@ public class DefaultConfiguration implements Configuration {
recordListenerProviders,
newExecuteListenerProviders,
visitListenerProviders,
+ transactionListenerProviders,
converterProvider,
dialect,
settings,
@@ -548,6 +609,28 @@ public class DefaultConfiguration implements Configuration {
recordListenerProviders,
executeListenerProviders,
newVisitListenerProviders,
+ transactionListenerProviders,
+ converterProvider,
+ dialect,
+ settings,
+ data
+ );
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public final Configuration derive(TransactionListenerProvider... newTransactionListenerProviders) {
+ return new DefaultConfiguration(
+ connectionProvider,
+ executorProvider,
+ transactionProvider,
+ recordMapperProvider,
+ recordListenerProviders,
+ executeListenerProviders,
+ visitListenerProviders,
+ newTransactionListenerProviders,
converterProvider,
dialect,
settings,
@@ -568,6 +651,7 @@ public class DefaultConfiguration implements Configuration {
recordListenerProviders,
executeListenerProviders,
visitListenerProviders,
+ transactionListenerProviders,
newConverterProvider,
dialect,
settings,
@@ -588,6 +672,7 @@ public class DefaultConfiguration implements Configuration {
recordListenerProviders,
executeListenerProviders,
visitListenerProviders,
+ transactionListenerProviders,
converterProvider,
newDialect,
settings,
@@ -608,6 +693,7 @@ public class DefaultConfiguration implements Configuration {
recordListenerProviders,
executeListenerProviders,
visitListenerProviders,
+ transactionListenerProviders,
converterProvider,
dialect,
newSettings,
@@ -713,6 +799,18 @@ public class DefaultConfiguration implements Configuration {
return this;
}
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public final Configuration set(TransactionListenerProvider... newTransactionListenerProviders) {
+ this.transactionListenerProviders = newTransactionListenerProviders != null
+ ? newTransactionListenerProviders
+ : new TransactionListenerProvider[0];
+
+ return this;
+ }
+
@Override
public final Configuration set(ConverterProvider newConverterProvider) {
this.converterProvider = newConverterProvider != null
@@ -811,6 +909,13 @@ public class DefaultConfiguration implements Configuration {
set(newVisitListenerProviders);
}
+ /**
+ * @see #set(TransactionListenerProvider[])
+ */
+ public final void setTransactionListenerProvider(TransactionListenerProvider... newTransactionListenerProviders) {
+ set(newTransactionListenerProviders);
+ }
+
/**
* @see #set(SQLDialect)
*/
@@ -903,6 +1008,14 @@ public class DefaultConfiguration implements Configuration {
return visitListenerProviders;
}
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public final TransactionListenerProvider[] transactionListenerProviders() {
+ return transactionListenerProviders;
+ }
+
/**
* {@inheritDoc}
*/
@@ -1003,6 +1116,7 @@ public class DefaultConfiguration implements Configuration {
oos.writeObject(cloneSerializables(executeListenerProviders));
oos.writeObject(cloneSerializables(recordListenerProviders));
oos.writeObject(cloneSerializables(visitListenerProviders));
+ oos.writeObject(cloneSerializables(transactionListenerProviders));
oos.writeObject(converterProvider instanceof Serializable
? converterProvider
@@ -1030,6 +1144,7 @@ public class DefaultConfiguration implements Configuration {
executeListenerProviders = (ExecuteListenerProvider[]) ois.readObject();
recordListenerProviders = (RecordListenerProvider[]) ois.readObject();
visitListenerProviders = (VisitListenerProvider[]) ois.readObject();
+ transactionListenerProviders = (TransactionListenerProvider[]) ois.readObject();
converterProvider = (ConverterProvider) ois.readObject();
}
}
diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java b/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java
index 76db4b2193..d51c1fad5a 100644
--- a/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java
+++ b/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java
@@ -389,15 +389,33 @@ public class DefaultDSLContext extends AbstractScope implements DSLContext, Seri
DefaultTransactionContext ctx = new DefaultTransactionContext(configuration().derive());
TransactionProvider provider = ctx.configuration().transactionProvider();
+ TransactionListeners listeners = new TransactionListeners(ctx.configuration());
try {
- provider.begin(ctx);
+ try {
+ listeners.beginStart(ctx);
+ provider.begin(ctx);
+ }
+ finally {
+ listeners.beginEnd(ctx);
+ }
+
result = transactional.run(ctx.configuration());
- provider.commit(ctx);
+
+ try {
+ listeners.commitStart(ctx);
+ provider.commit(ctx);
+ }
+ finally {
+ listeners.commitEnd(ctx);
+ }
}
catch (Exception cause) {
+ ctx.cause(cause);
+
+ listeners.rollbackStart(ctx);
try {
- provider.rollback(ctx.cause(cause));
+ provider.rollback(ctx);
}
// [#3718] Use reflection to support also JDBC 4.0
@@ -406,6 +424,7 @@ public class DefaultDSLContext extends AbstractScope implements DSLContext, Seri
cause.addSuppressed(suppress);
}
+ listeners.rollbackEnd(ctx);
if (cause instanceof RuntimeException) {
throw (RuntimeException) cause;
diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultExecuteListenerProvider.java b/jOOQ/src/main/java/org/jooq/impl/DefaultExecuteListenerProvider.java
index bedd91186b..184061e8ad 100644
--- a/jOOQ/src/main/java/org/jooq/impl/DefaultExecuteListenerProvider.java
+++ b/jOOQ/src/main/java/org/jooq/impl/DefaultExecuteListenerProvider.java
@@ -73,9 +73,8 @@ public class DefaultExecuteListenerProvider implements ExecuteListenerProvider,
public static ExecuteListenerProvider[] providers(ExecuteListener... listeners) {
ExecuteListenerProvider[] result = new ExecuteListenerProvider[listeners.length];
- for (int i = 0; i < listeners.length; i++) {
+ for (int i = 0; i < listeners.length; i++)
result[i] = new DefaultExecuteListenerProvider(listeners[i]);
- }
return result;
}
diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultRecordListenerProvider.java b/jOOQ/src/main/java/org/jooq/impl/DefaultRecordListenerProvider.java
index df763b668a..9dbfb75baa 100644
--- a/jOOQ/src/main/java/org/jooq/impl/DefaultRecordListenerProvider.java
+++ b/jOOQ/src/main/java/org/jooq/impl/DefaultRecordListenerProvider.java
@@ -73,9 +73,8 @@ public class DefaultRecordListenerProvider implements RecordListenerProvider, Se
public static RecordListenerProvider[] providers(RecordListener... listeners) {
RecordListenerProvider[] result = new RecordListenerProvider[listeners.length];
- for (int i = 0; i < listeners.length; i++) {
+ for (int i = 0; i < listeners.length; i++)
result[i] = new DefaultRecordListenerProvider(listeners[i]);
- }
return result;
}
diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultTransactionListener.java b/jOOQ/src/main/java/org/jooq/impl/DefaultTransactionListener.java
new file mode 100644
index 0000000000..8ecad6725f
--- /dev/null
+++ b/jOOQ/src/main/java/org/jooq/impl/DefaultTransactionListener.java
@@ -0,0 +1,74 @@
+/**
+ * Copyright (c) 2009-2016, Data Geekery GmbH (http://www.datageekery.com)
+ * All rights reserved.
+ *
+ * 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 org.jooq.TransactionContext;
+import org.jooq.TransactionListener;
+
+/**
+ * A publicly available default implementation of {@link TransactionListener}.
+ *
+ * Use this to stay compatible with future API changes (i.e. added methods to
+ * TransactionListener)
+ *
+ * @author Lukas Eder
+ */
+public class DefaultTransactionListener implements TransactionListener {
+
+ @Override
+ public void beginStart(TransactionContext ctx) {}
+
+ @Override
+ public void beginEnd(TransactionContext ctx) {}
+
+ @Override
+ public void commitStart(TransactionContext ctx) {}
+
+ @Override
+ public void commitEnd(TransactionContext ctx) {}
+
+ @Override
+ public void rollbackStart(TransactionContext ctx) {}
+
+ @Override
+ public void rollbackEnd(TransactionContext ctx) {}
+
+}
diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultTransactionListenerProvider.java b/jOOQ/src/main/java/org/jooq/impl/DefaultTransactionListenerProvider.java
new file mode 100644
index 0000000000..6d038a8163
--- /dev/null
+++ b/jOOQ/src/main/java/org/jooq/impl/DefaultTransactionListenerProvider.java
@@ -0,0 +1,106 @@
+/**
+ * Copyright (c) 2009-2016, Data Geekery GmbH (http://www.datageekery.com)
+ * All rights reserved.
+ *
+ * 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 java.io.Serializable;
+
+import org.jooq.TransactionListener;
+import org.jooq.TransactionListenerProvider;
+
+/**
+ * A default implementation for {@link TransactionListenerProvider}.
+ *
+ * This implementation just wraps an instance of {@link TransactionListener}, always
+ * providing the same.
+ *
+ * @author Lukas Eder
+ */
+public class DefaultTransactionListenerProvider implements TransactionListenerProvider, Serializable {
+
+ /**
+ * Generated UID.
+ */
+ private static final long serialVersionUID = -2122007794302549679L;
+
+ /**
+ * The delegate listener.
+ */
+ private final TransactionListener listener;
+
+ /**
+ * Convenience method to construct an array of
+ * DefaultTransactionListenerProvider from an array of
+ * TransactionListener instances.
+ */
+ public static TransactionListenerProvider[] providers(TransactionListener... listeners) {
+ TransactionListenerProvider[] result = new TransactionListenerProvider[listeners.length];
+
+ for (int i = 0; i < listeners.length; i++)
+ result[i] = new DefaultTransactionListenerProvider(listeners[i]);
+
+ return result;
+ }
+
+ /**
+ * Create a new provider instance from an argument listener.
+ *
+ * @param listener The argument listener.
+ */
+ public DefaultTransactionListenerProvider(TransactionListener listener) {
+ this.listener = listener;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public final TransactionListener provide() {
+ return listener;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String toString() {
+ return listener.toString();
+ }
+}
diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultVisitListenerProvider.java b/jOOQ/src/main/java/org/jooq/impl/DefaultVisitListenerProvider.java
index da93f62672..38b245bdac 100644
--- a/jOOQ/src/main/java/org/jooq/impl/DefaultVisitListenerProvider.java
+++ b/jOOQ/src/main/java/org/jooq/impl/DefaultVisitListenerProvider.java
@@ -73,9 +73,8 @@ public class DefaultVisitListenerProvider implements VisitListenerProvider, Seri
public static VisitListenerProvider[] providers(VisitListener... listeners) {
VisitListenerProvider[] result = new VisitListenerProvider[listeners.length];
- for (int i = 0; i < listeners.length; i++) {
+ for (int i = 0; i < listeners.length; i++)
result[i] = new DefaultVisitListenerProvider(listeners[i]);
- }
return result;
}
diff --git a/jOOQ/src/main/java/org/jooq/impl/TransactionListeners.java b/jOOQ/src/main/java/org/jooq/impl/TransactionListeners.java
new file mode 100644
index 0000000000..3a49f55a09
--- /dev/null
+++ b/jOOQ/src/main/java/org/jooq/impl/TransactionListeners.java
@@ -0,0 +1,99 @@
+/**
+ * Copyright (c) 2009-2016, Data Geekery GmbH (http://www.datageekery.com)
+ * All rights reserved.
+ *
+ * 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 org.jooq.Configuration;
+import org.jooq.TransactionContext;
+import org.jooq.TransactionListener;
+import org.jooq.TransactionListenerProvider;
+
+/**
+ * @author Lukas Eder
+ */
+class TransactionListeners implements TransactionListener {
+
+ private final TransactionListener[] listeners;
+
+ TransactionListeners(Configuration configuration) {
+ TransactionListenerProvider[] providers = configuration.transactionListenerProviders();
+ listeners = new TransactionListener[providers.length];
+
+ for (int i = 0; i < providers.length; i++)
+ listeners[i] = providers[i].provide();
+ }
+
+ @Override
+ public final void beginStart(TransactionContext ctx) {
+ for (TransactionListener listener : listeners)
+ listener.beginStart(ctx);
+ }
+
+ @Override
+ public final void beginEnd(TransactionContext ctx) {
+ for (TransactionListener listener : listeners)
+ listener.beginEnd(ctx);
+ }
+
+ @Override
+ public final void commitStart(TransactionContext ctx) {
+ for (TransactionListener listener : listeners)
+ listener.commitStart(ctx);
+ }
+
+ @Override
+ public final void commitEnd(TransactionContext ctx) {
+ for (TransactionListener listener : listeners)
+ listener.commitEnd(ctx);
+ }
+
+ @Override
+ public final void rollbackStart(TransactionContext ctx) {
+ for (TransactionListener listener : listeners)
+ listener.rollbackStart(ctx);
+ }
+
+ @Override
+ public final void rollbackEnd(TransactionContext ctx) {
+ for (TransactionListener listener : listeners)
+ listener.rollbackEnd(ctx);
+ }
+
+}