From e8d7602102fd1db7e9f2672f415acc41daaf2dae Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 26 Oct 2012 23:36:21 +0200 Subject: [PATCH] [#1895] Decouple Executor from Configuration. Use composition rather than inheritance - Step 1: Let executor delegate to Configuration --- .../org/jooq/DivideByOnConditionStep.java | 14 +- jOOQ/src/main/java/org/jooq/Param.java | 4 +- .../org/jooq/SimpleSelectConditionStep.java | 15 +- .../java/org/jooq/SimpleSelectWhereStep.java | 8 +- .../java/org/jooq/UpdateConditionStep.java | 15 +- .../src/main/java/org/jooq/impl/Executor.java | 275 +++++++++++------- 6 files changed, 202 insertions(+), 129 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/DivideByOnConditionStep.java b/jOOQ/src/main/java/org/jooq/DivideByOnConditionStep.java index 41142d5dde..3682f943a3 100644 --- a/jOOQ/src/main/java/org/jooq/DivideByOnConditionStep.java +++ b/jOOQ/src/main/java/org/jooq/DivideByOnConditionStep.java @@ -35,7 +35,7 @@ */ package org.jooq; -import org.jooq.impl.Executor; +import org.jooq.impl.Factory; /** * An intermediate type for the construction of a relational division. This type @@ -61,7 +61,7 @@ public interface DivideByOnConditionStep extends DivideByReturningStep { * malicious SQL injection. Be sure to properly use bind variables and/or * escape literals when concatenated into SQL clauses! * - * @see Executor#condition(String) + * @see Factory#condition(String) */ @Support DivideByOnConditionStep and(String sql); @@ -75,7 +75,7 @@ public interface DivideByOnConditionStep extends DivideByReturningStep { * malicious SQL injection. Be sure to properly use bind variables and/or * escape literals when concatenated into SQL clauses! * - * @see Executor#condition(String, Object...) + * @see Factory#condition(String, Object...) */ @Support DivideByOnConditionStep and(String sql, Object... bindings); @@ -89,7 +89,7 @@ public interface DivideByOnConditionStep extends DivideByReturningStep { * malicious SQL injection. Be sure to properly use bind variables and/or * escape literals when concatenated into SQL clauses! * - * @see Executor#condition(String, QueryPart...) + * @see Factory#condition(String, QueryPart...) */ @Support DivideByOnConditionStep and(String sql, QueryPart... parts); @@ -131,7 +131,7 @@ public interface DivideByOnConditionStep extends DivideByReturningStep { * malicious SQL injection. Be sure to properly use bind variables and/or * escape literals when concatenated into SQL clauses! * - * @see Executor#condition(String) + * @see Factory#condition(String) */ @Support DivideByOnConditionStep or(String sql); @@ -145,7 +145,7 @@ public interface DivideByOnConditionStep extends DivideByReturningStep { * malicious SQL injection. Be sure to properly use bind variables and/or * escape literals when concatenated into SQL clauses! * - * @see Executor#condition(String, Object...) + * @see Factory#condition(String, Object...) */ @Support DivideByOnConditionStep or(String sql, Object... bindings); @@ -159,7 +159,7 @@ public interface DivideByOnConditionStep extends DivideByReturningStep { * malicious SQL injection. Be sure to properly use bind variables and/or * escape literals when concatenated into SQL clauses! * - * @see Executor#condition(String, QueryPart...) + * @see Factory#condition(String, QueryPart...) */ @Support DivideByOnConditionStep or(String sql, QueryPart... parts); diff --git a/jOOQ/src/main/java/org/jooq/Param.java b/jOOQ/src/main/java/org/jooq/Param.java index c75bfab0e9..37b393d3bc 100644 --- a/jOOQ/src/main/java/org/jooq/Param.java +++ b/jOOQ/src/main/java/org/jooq/Param.java @@ -36,14 +36,14 @@ package org.jooq; import org.jooq.exception.DataTypeException; -import org.jooq.impl.Executor; +import org.jooq.impl.Factory; import org.jooq.tools.Convert; /** * A named parameter and/or bind value. * * @author Lukas Eder - * @see Executor#param(String, Object) + * @see Factory#param(String, Object) */ public interface Param extends Field { diff --git a/jOOQ/src/main/java/org/jooq/SimpleSelectConditionStep.java b/jOOQ/src/main/java/org/jooq/SimpleSelectConditionStep.java index 021e07039b..17c49fbec9 100644 --- a/jOOQ/src/main/java/org/jooq/SimpleSelectConditionStep.java +++ b/jOOQ/src/main/java/org/jooq/SimpleSelectConditionStep.java @@ -35,7 +35,8 @@ */ package org.jooq; -import org.jooq.impl.Executor; +import org.jooq.impl.Factory; + /** * This type is used for the {@link Select}'s DSL API when selecting specific @@ -74,7 +75,7 @@ public interface SimpleSelectConditionStep extends SimpleSelec * malicious SQL injection. Be sure to properly use bind variables and/or * escape literals when concatenated into SQL clauses! * - * @see Executor#condition(String) + * @see Factory#condition(String) */ @Support SimpleSelectConditionStep and(String sql); @@ -88,7 +89,7 @@ public interface SimpleSelectConditionStep extends SimpleSelec * malicious SQL injection. Be sure to properly use bind variables and/or * escape literals when concatenated into SQL clauses! * - * @see Executor#condition(String, Object...) + * @see Factory#condition(String, Object...) */ @Support SimpleSelectConditionStep and(String sql, Object... bindings); @@ -102,7 +103,7 @@ public interface SimpleSelectConditionStep extends SimpleSelec * malicious SQL injection. Be sure to properly use bind variables and/or * escape literals when concatenated into SQL clauses! * - * @see Executor#condition(String, QueryPart...) + * @see Factory#condition(String, QueryPart...) */ @Support SimpleSelectConditionStep and(String sql, QueryPart... parts); @@ -144,7 +145,7 @@ public interface SimpleSelectConditionStep extends SimpleSelec * malicious SQL injection. Be sure to properly use bind variables and/or * escape literals when concatenated into SQL clauses! * - * @see Executor#condition(String) + * @see Factory#condition(String) */ @Support SimpleSelectConditionStep or(String sql); @@ -158,7 +159,7 @@ public interface SimpleSelectConditionStep extends SimpleSelec * malicious SQL injection. Be sure to properly use bind variables and/or * escape literals when concatenated into SQL clauses! * - * @see Executor#condition(String, Object...) + * @see Factory#condition(String, Object...) */ @Support SimpleSelectConditionStep or(String sql, Object... bindings); @@ -172,7 +173,7 @@ public interface SimpleSelectConditionStep extends SimpleSelec * malicious SQL injection. Be sure to properly use bind variables and/or * escape literals when concatenated into SQL clauses! * - * @see Executor#condition(String, QueryPart...) + * @see Factory#condition(String, QueryPart...) */ @Support SimpleSelectConditionStep or(String sql, QueryPart... parts); diff --git a/jOOQ/src/main/java/org/jooq/SimpleSelectWhereStep.java b/jOOQ/src/main/java/org/jooq/SimpleSelectWhereStep.java index 7632358bb8..50437e28f1 100644 --- a/jOOQ/src/main/java/org/jooq/SimpleSelectWhereStep.java +++ b/jOOQ/src/main/java/org/jooq/SimpleSelectWhereStep.java @@ -37,7 +37,7 @@ package org.jooq; import java.util.Collection; -import org.jooq.impl.Executor; +import org.jooq.impl.Factory; /** * This type is used for the {@link Select}'s DSL API when selecting specific @@ -80,7 +80,7 @@ public interface SimpleSelectWhereStep extends SimpleSelectOrd * malicious SQL injection. Be sure to properly use bind variables and/or * escape literals when concatenated into SQL clauses! * - * @see Executor#condition(String) + * @see Factory#condition(String) */ @Support SimpleSelectConditionStep where(String sql); @@ -93,7 +93,7 @@ public interface SimpleSelectWhereStep extends SimpleSelectOrd * malicious SQL injection. Be sure to properly use bind variables and/or * escape literals when concatenated into SQL clauses! * - * @see Executor#condition(String, Object...) + * @see Factory#condition(String, Object...) */ @Support SimpleSelectConditionStep where(String sql, Object... bindings); @@ -106,7 +106,7 @@ public interface SimpleSelectWhereStep extends SimpleSelectOrd * malicious SQL injection. Be sure to properly use bind variables and/or * escape literals when concatenated into SQL clauses! * - * @see Executor#condition(String, QueryPart...) + * @see Factory#condition(String, QueryPart...) */ @Support SimpleSelectConditionStep where(String sql, QueryPart... parts); diff --git a/jOOQ/src/main/java/org/jooq/UpdateConditionStep.java b/jOOQ/src/main/java/org/jooq/UpdateConditionStep.java index e19bf451e6..7818a87509 100644 --- a/jOOQ/src/main/java/org/jooq/UpdateConditionStep.java +++ b/jOOQ/src/main/java/org/jooq/UpdateConditionStep.java @@ -35,7 +35,8 @@ */ package org.jooq; -import org.jooq.impl.Executor; +import org.jooq.impl.Factory; + /** * This type is used for the {@link Update}'s DSL API. @@ -70,7 +71,7 @@ public interface UpdateConditionStep extends UpdateFinalStep and(String sql); @@ -84,7 +85,7 @@ public interface UpdateConditionStep extends UpdateFinalStep and(String sql, Object... bindings); @@ -98,7 +99,7 @@ public interface UpdateConditionStep extends UpdateFinalStep and(String sql, QueryPart... parts); @@ -140,7 +141,7 @@ public interface UpdateConditionStep extends UpdateFinalStep or(String sql); @@ -154,7 +155,7 @@ public interface UpdateConditionStep extends UpdateFinalStep or(String sql, Object... bindings); @@ -168,7 +169,7 @@ public interface UpdateConditionStep extends UpdateFinalStep or(String sql, QueryPart... parts); diff --git a/jOOQ/src/main/java/org/jooq/impl/Executor.java b/jOOQ/src/main/java/org/jooq/impl/Executor.java index 17aa8c55a4..57534d3f28 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Executor.java +++ b/jOOQ/src/main/java/org/jooq/impl/Executor.java @@ -157,19 +157,11 @@ public class Executor implements FactoryOperations { /** * Generated UID */ - private static final long serialVersionUID = 2681360188806309513L; - private static final JooqLogger log = JooqLogger.getLogger(Factory.class); + private static final long serialVersionUID = 2681360188806309513L; + private static final JooqLogger log = JooqLogger.getLogger(Factory.class); - private static final Executor[] DEFAULT_INSTANCES = new Executor[SQLDialect.values().length]; - - private transient Connection connection; - private transient DataSource datasource; - private final SQLDialect dialect; - - @SuppressWarnings("deprecation") - private final org.jooq.SchemaMapping mapping; - private final Settings settings; - private final Map data; + private static final Executor[] DEFAULT_INSTANCES = new Executor[SQLDialect.values().length]; + private final Configuration configuration; // ------------------------------------------------------------------------- // XXX Constructors @@ -305,121 +297,214 @@ public class Executor implements FactoryOperations { */ @SuppressWarnings("deprecation") private Executor(DataSource datasource, Connection connection, SQLDialect dialect, Settings settings, org.jooq.SchemaMapping mapping, Map data) { - this.connection = connection; - this.datasource = datasource; - this.dialect = dialect; - this.settings = settings != null ? settings : SettingsTools.defaultSettings(); - this.mapping = mapping != null ? mapping : new org.jooq.SchemaMapping(this.settings); - this.data = data != null ? data : new HashMap(); + this(new ExecutorConfiguration(datasource, connection, dialect, settings, mapping, data)); + } + + /** + * Create an executor from a custom configuration + * + * @param configuration The configuration + */ + public Executor(Configuration configuration) { + this.configuration = configuration; } // ------------------------------------------------------------------------- // XXX Configuration API // ------------------------------------------------------------------------- - /** - * {@inheritDoc} - */ @Override public final SQLDialect getDialect() { - return dialect; + return configuration.getDialect(); } - /** - * {@inheritDoc} - */ @Override public final DataSource getDataSource() { - return datasource; + return configuration.getDataSource(); } - /** - * {@inheritDoc} - */ @Override - public void setDataSource(DataSource datasource) { - this.datasource = datasource; + public final void setDataSource(DataSource datasource) { + configuration.setDataSource(datasource); } - /** - * {@inheritDoc} - */ @Override public final Connection getConnection() { - - // SQL-builder only Factory - if (connection == null && datasource == null) { - return null; - } - - // [#1424] DataSource-enabled Factory with no Connection yet - else if (connection == null && datasource != null) { - return new DataSourceConnection(datasource, null, settings); - } - - // Factory clone - else if (connection.getClass() == DataSourceConnection.class) { - return connection; - } - - // Factory clone - else if (connection.getClass() == ConnectionProxy.class) { - return connection; - } - - // [#1424] Connection-based Factory - else { - return new DataSourceConnection(null, new ConnectionProxy(connection, settings), settings); - } + return configuration.getConnection(); } - /** - * {@inheritDoc} - */ @Override public final void setConnection(Connection connection) { - this.connection = connection; + configuration.setConnection(connection); } - /** - * {@inheritDoc} - */ @Override @Deprecated public final org.jooq.SchemaMapping getSchemaMapping() { - return mapping; + return configuration.getSchemaMapping(); } - /** - * {@inheritDoc} - */ @Override public final Settings getSettings() { - return settings; + return configuration.getSettings(); } - /** - * {@inheritDoc} - */ @Override public final Map getData() { - return data; + return configuration.getData(); } - /** - * {@inheritDoc} - */ @Override public final Object getData(String key) { - return data.get(key); + return configuration.getData(key); } - /** - * {@inheritDoc} - */ @Override public final Object setData(String key, Object value) { - return data.put(key, value); + return configuration.setData(key, value); + } + + private static class ExecutorConfiguration implements Configuration { + + /** + * Serial version UID + */ + private static final long serialVersionUID = 8193158984283234708L; + + private transient Connection connection; + private transient DataSource datasource; + private final SQLDialect dialect; + + @SuppressWarnings("deprecation") + private final org.jooq.SchemaMapping mapping; + private final Settings settings; + private final Map data; + + @SuppressWarnings("deprecation") + ExecutorConfiguration(DataSource datasource, Connection connection, SQLDialect dialect, Settings settings, org.jooq.SchemaMapping mapping, Map data) { + this.connection = connection; + this.datasource = datasource; + this.dialect = dialect; + this.settings = settings != null ? settings : SettingsTools.defaultSettings(); + this.mapping = mapping != null ? mapping : new org.jooq.SchemaMapping(this.settings); + this.data = data != null ? data : new HashMap(); + } + + /** + * {@inheritDoc} + */ + @Override + public final SQLDialect getDialect() { + return dialect; + } + + /** + * {@inheritDoc} + */ + @Override + public final DataSource getDataSource() { + return datasource; + } + + /** + * {@inheritDoc} + */ + @Override + public void setDataSource(DataSource datasource) { + this.datasource = datasource; + } + + /** + * {@inheritDoc} + */ + @Override + public final Connection getConnection() { + + // SQL-builder only Factory + if (connection == null && datasource == null) { + return null; + } + + // [#1424] DataSource-enabled Factory with no Connection yet + else if (connection == null && datasource != null) { + return new DataSourceConnection(datasource, null, settings); + } + + // Factory clone + else if (connection.getClass() == DataSourceConnection.class) { + return connection; + } + + // Factory clone + else if (connection.getClass() == ConnectionProxy.class) { + return connection; + } + + // [#1424] Connection-based Factory + else { + return new DataSourceConnection(null, new ConnectionProxy(connection, settings), settings); + } + } + + /** + * {@inheritDoc} + */ + @Override + public final void setConnection(Connection connection) { + this.connection = connection; + } + + /** + * {@inheritDoc} + */ + @Override + @Deprecated + public final org.jooq.SchemaMapping getSchemaMapping() { + return mapping; + } + + /** + * {@inheritDoc} + */ + @Override + public final Settings getSettings() { + return settings; + } + + /** + * {@inheritDoc} + */ + @Override + public final Map getData() { + return data; + } + + /** + * {@inheritDoc} + */ + @Override + public final Object getData(String key) { + return data.get(key); + } + + /** + * {@inheritDoc} + */ + @Override + public final Object setData(String key, Object value) { + return data.put(key, value); + } + + @Override + public String toString() { + StringWriter writer = new StringWriter(); + JAXB.marshal(settings, writer); + + return "ExecutorConfiguration [\n\tconnected=" + (connection != null) + + ",\n\tdialect=" + dialect + + ",\n\tdata=" + data + + ",\n\tsettings=\n\t\t" + writer.toString().trim().replace("\n", "\n\t\t") + + "\n]"; } } // ------------------------------------------------------------------------- @@ -1260,7 +1345,7 @@ public class Executor implements FactoryOperations { try { String schemaName = render(schema); - switch (dialect) { + switch (getDialect()) { case DB2: case DERBY: case H2: @@ -1294,8 +1379,8 @@ public class Executor implements FactoryOperations { } } finally { - getRenderMapping(settings).setDefaultSchema(schema.getName()); - mapping.use(schema); + getRenderMapping(getSettings()).setDefaultSchema(schema.getName()); + getSchemaMapping().use(schema); } return result; @@ -1470,14 +1555,7 @@ public class Executor implements FactoryOperations { @Override public String toString() { - StringWriter writer = new StringWriter(); - JAXB.marshal(settings, writer); - - return "Factory [\n\tconnected=" + (connection != null) + - ",\n\tdialect=" + dialect + - ",\n\tdata=" + data + - ",\n\tsettings=\n\t\t" + writer.toString().trim().replace("\n", "\n\t\t") + - "\n]"; + return configuration.toString(); } static { @@ -1503,19 +1581,12 @@ public class Executor implements FactoryOperations { /** * Get a default Factory with a {@link Connection} */ - @SuppressWarnings("deprecation") final static Executor getNewFactory(Configuration configuration) { if (configuration == null) { return getNewFactory(DefaultConfiguration.DEFAULT_CONFIGURATION); } else { - return new Executor( - configuration.getDataSource(), - configuration.getConnection(), - configuration.getDialect(), - configuration.getSettings(), - configuration.getSchemaMapping(), - configuration.getData()); + return new Executor(configuration); } }