[#1895] Decouple Executor from Configuration. Use composition rather

than inheritance - Step 1: Let executor delegate to Configuration
This commit is contained in:
Lukas Eder 2012-10-26 23:36:21 +02:00
parent e506d9de65
commit e8d7602102
6 changed files with 202 additions and 129 deletions

View File

@ -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);

View File

@ -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<T> extends Field<T> {

View File

@ -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<R extends Record> 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<R> and(String sql);
@ -88,7 +89,7 @@ public interface SimpleSelectConditionStep<R extends Record> 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<R> and(String sql, Object... bindings);
@ -102,7 +103,7 @@ public interface SimpleSelectConditionStep<R extends Record> 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<R> and(String sql, QueryPart... parts);
@ -144,7 +145,7 @@ public interface SimpleSelectConditionStep<R extends Record> 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<R> or(String sql);
@ -158,7 +159,7 @@ public interface SimpleSelectConditionStep<R extends Record> 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<R> or(String sql, Object... bindings);
@ -172,7 +173,7 @@ public interface SimpleSelectConditionStep<R extends Record> 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<R> or(String sql, QueryPart... parts);

View File

@ -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<R extends Record> 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<R> where(String sql);
@ -93,7 +93,7 @@ public interface SimpleSelectWhereStep<R extends Record> 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<R> where(String sql, Object... bindings);
@ -106,7 +106,7 @@ public interface SimpleSelectWhereStep<R extends Record> 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<R> where(String sql, QueryPart... parts);

View File

@ -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<R extends Record> extends UpdateFinalStep<R
* 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
UpdateConditionStep<R> and(String sql);
@ -84,7 +85,7 @@ public interface UpdateConditionStep<R extends Record> extends UpdateFinalStep<R
* 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
UpdateConditionStep<R> and(String sql, Object... bindings);
@ -98,7 +99,7 @@ public interface UpdateConditionStep<R extends Record> extends UpdateFinalStep<R
* 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
UpdateConditionStep<R> and(String sql, QueryPart... parts);
@ -140,7 +141,7 @@ public interface UpdateConditionStep<R extends Record> extends UpdateFinalStep<R
* 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
UpdateConditionStep<R> or(String sql);
@ -154,7 +155,7 @@ public interface UpdateConditionStep<R extends Record> extends UpdateFinalStep<R
* 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
UpdateConditionStep<R> or(String sql, Object... bindings);
@ -168,7 +169,7 @@ public interface UpdateConditionStep<R extends Record> extends UpdateFinalStep<R
* 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
UpdateConditionStep<R> or(String sql, QueryPart... parts);

View File

@ -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<String, Object> 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<String, Object> 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<String, Object>();
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<String, Object> 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<String, Object> data;
@SuppressWarnings("deprecation")
ExecutorConfiguration(DataSource datasource, Connection connection, SQLDialect dialect, Settings settings, org.jooq.SchemaMapping mapping, Map<String, Object> 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<String, Object>();
}
/**
* {@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<String, Object> 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 <code>Factory</code> 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);
}
}