summaryrefslogtreecommitdiff
path: root/qpid/java/broker-plugins
diff options
context:
space:
mode:
authorKeith Wall <kwall@apache.org>2014-06-18 22:15:54 +0000
committerKeith Wall <kwall@apache.org>2014-06-18 22:15:54 +0000
commitbaa3cc48506e60d86f44577a410fd3683be30014 (patch)
treee334e48db83d6f9209b5a71f76e1b657a35b5710 /qpid/java/broker-plugins
parent3a95f8c316e8d81a876094409a5952b3f41b5ba3 (diff)
downloadqpid-python-baa3cc48506e60d86f44577a410fd3683be30014.tar.gz
QPID-5822: [Java Broker] Replace low level BDB/JDBC attributes in fovour of context variables from the model
* BDB attributes environmentConfiguration/replicatedEnvironmentConfiguration removed. User can now specify context variables with the configuration keys that are understood by JE itself. * JDBC attributes bigIntType/bytesForBlob/varBinaryType/blobType are now context variables with names begining qpid.jdbcstore. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1603655 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java/broker-plugins')
-rw-r--r--qpid/java/broker-plugins/derby-store/src/test/java/org/apache/qpid/server/store/derby/DerbyMessageStoreQuotaEventsTest.java7
-rw-r--r--qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/org/apache/qpid/server/store/jdbc/bonecp/BoneCPConnectionProvider.java8
-rw-r--r--qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/GenericJDBCConfigurationStore.java34
-rw-r--r--qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/GenericJDBCMessageStore.java37
-rw-r--r--qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JDBCDetails.java337
-rw-r--r--qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNode.java12
-rw-r--r--qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeImpl.java35
-rw-r--r--qpid/java/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/store/jdbc/JDBCDetailsTest.java94
8 files changed, 350 insertions, 214 deletions
diff --git a/qpid/java/broker-plugins/derby-store/src/test/java/org/apache/qpid/server/store/derby/DerbyMessageStoreQuotaEventsTest.java b/qpid/java/broker-plugins/derby-store/src/test/java/org/apache/qpid/server/store/derby/DerbyMessageStoreQuotaEventsTest.java
index ba7ae26292..348d81fadd 100644
--- a/qpid/java/broker-plugins/derby-store/src/test/java/org/apache/qpid/server/store/derby/DerbyMessageStoreQuotaEventsTest.java
+++ b/qpid/java/broker-plugins/derby-store/src/test/java/org/apache/qpid/server/store/derby/DerbyMessageStoreQuotaEventsTest.java
@@ -20,6 +20,7 @@
*/
package org.apache.qpid.server.store.derby;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@@ -65,4 +66,10 @@ public class DerbyMessageStoreQuotaEventsTest extends MessageStoreQuotaEventsTes
return messageStoreSettings;
}
+ @Override
+ protected Map<String, String> createContextSettings()
+ {
+ return Collections.emptyMap();
+ }
+
}
diff --git a/qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/org/apache/qpid/server/store/jdbc/bonecp/BoneCPConnectionProvider.java b/qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/org/apache/qpid/server/store/jdbc/bonecp/BoneCPConnectionProvider.java
index 8bc3a10320..4dfb05ff4f 100644
--- a/qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/org/apache/qpid/server/store/jdbc/bonecp/BoneCPConnectionProvider.java
+++ b/qpid/java/broker-plugins/jdbc-provider-bone/src/main/java/org/apache/qpid/server/store/jdbc/bonecp/BoneCPConnectionProvider.java
@@ -31,9 +31,10 @@ import java.util.Map;
public class BoneCPConnectionProvider implements ConnectionProvider
{
- public static final String PARTITION_COUNT = "partitionCount";
- public static final String MAX_CONNECTIONS_PER_PARTITION = "maxConnectionsPerPartition";
- public static final String MIN_CONNECTIONS_PER_PARTITION = "minConnectionsPerPartition";
+ public static final String PARTITION_COUNT = "qpid.jdbcstore.bonecp.partitionCount";
+ public static final String MAX_CONNECTIONS_PER_PARTITION = "qpid.jdbcstore.bonecp.maxConnectionsPerPartition";
+ public static final String MIN_CONNECTIONS_PER_PARTITION = "qpid.jdbcstore.bonecp.minConnectionsPerPartition";
+
public static final int DEFAULT_MIN_CONNECTIONS_PER_PARTITION = 5;
public static final int DEFAULT_MAX_CONNECTIONS_PER_PARTITION = 10;
@@ -43,6 +44,7 @@ public class BoneCPConnectionProvider implements ConnectionProvider
public BoneCPConnectionProvider(String connectionUrl, Map<String, Object> storeSettings) throws SQLException
{
+ // TODO change interface to pass through username and password
BoneCPConfig config = new BoneCPConfig();
config.setJdbcUrl(connectionUrl);
config.setMinConnectionsPerPartition(MapValueConverter.getIntegerAttribute(MIN_CONNECTIONS_PER_PARTITION, storeSettings, DEFAULT_MIN_CONNECTIONS_PER_PARTITION));
diff --git a/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/GenericJDBCConfigurationStore.java b/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/GenericJDBCConfigurationStore.java
index 6e707b5f3b..aa8c38cbb0 100644
--- a/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/GenericJDBCConfigurationStore.java
+++ b/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/GenericJDBCConfigurationStore.java
@@ -32,7 +32,6 @@ import org.apache.log4j.Logger;
import org.apache.qpid.server.model.ConfiguredObject;
import org.apache.qpid.server.plugin.JDBCConnectionProviderFactory;
import org.apache.qpid.server.store.*;
-import org.apache.qpid.server.util.MapValueConverter;
/**
* Implementation of a DurableConfigurationStore backed by Generic JDBC Database
@@ -46,15 +45,11 @@ public class GenericJDBCConfigurationStore extends AbstractJDBCConfigurationStor
public static final String CONNECTION_URL = "connectionUrl";
public static final String CONNECTION_POOL_TYPE = "connectionPoolType";
- public static final String JDBC_BIG_INT_TYPE = "bigIntType";
- public static final String JDBC_BYTES_FOR_BLOB = "bytesForBlob";
- public static final String JDBC_VARBINARY_TYPE = "varbinaryType";
- public static final String JDBC_BLOB_TYPE = "blobType";
private final AtomicBoolean _configurationStoreOpen = new AtomicBoolean();
private final MessageStore _providedMessageStore = new ProvidedMessageStore();
- protected String _connectionURL;
+ private String _connectionURL;
private ConnectionProvider _connectionProvider;
private String _blobType;
@@ -74,20 +69,17 @@ public class GenericJDBCConfigurationStore extends AbstractJDBCConfigurationStor
_connectionURL = String.valueOf(storeSettings.get(CONNECTION_URL));
Object poolAttribute = storeSettings.get(CONNECTION_POOL_TYPE);
- JDBCDetails details = null;
+ JDBCDetails details = JDBCDetails.getDetailsForJdbcUrl(_connectionURL, parent.getContext());
- String[] components = _connectionURL.split(":", 3);
- if(components.length >= 2)
+ if (!details.isKnownVendor() && getLogger().isInfoEnabled())
{
- String vendor = components[1];
- details = JDBCDetails.getDetails(vendor);
+ getLogger().info("Do not recognize vendor from connection URL: " + _connectionURL
+ + " Using fallback settings " + details);
}
-
- if(details == null)
+ if (details.isOverridden() && getLogger().isInfoEnabled())
{
- getLogger().info("Do not recognize vendor from connection URL: " + _connectionURL);
-
- details = JDBCDetails.getDefaultDetails();
+ getLogger().info("One or more JDBC details were overridden from context. "
+ + " Using settings : " + details);
}
String connectionPoolType = poolAttribute == null ? DefaultConnectionProviderFactory.TYPE : String.valueOf(poolAttribute);
@@ -110,12 +102,10 @@ public class GenericJDBCConfigurationStore extends AbstractJDBCConfigurationStor
{
throw new StoreException("Failed to create connection provider for " + _connectionURL);
}
- _blobType = MapValueConverter.getStringAttribute(JDBC_BLOB_TYPE, storeSettings, details.getBlobType());
- _varBinaryType = MapValueConverter.getStringAttribute(JDBC_VARBINARY_TYPE, storeSettings, details.getVarBinaryType());
- _useBytesMethodsForBlob = MapValueConverter.getBooleanAttribute(JDBC_BYTES_FOR_BLOB, storeSettings, details.isUseBytesMethodsForBlob());
- _bigIntType = MapValueConverter.getStringAttribute(JDBC_BIG_INT_TYPE,
- storeSettings,
- details.getBigintType());
+ _blobType = details.getBlobType();
+ _varBinaryType = details.getVarBinaryType();
+ _useBytesMethodsForBlob = details.isUseBytesMethodsForBlob();
+ _bigIntType = details.getBigintType();
createOrOpenConfigurationStoreDatabase();
}
diff --git a/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/GenericJDBCMessageStore.java b/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/GenericJDBCMessageStore.java
index dad4432183..680f6b5d10 100644
--- a/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/GenericJDBCMessageStore.java
+++ b/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/GenericJDBCMessageStore.java
@@ -25,6 +25,7 @@ import java.sql.Blob;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.Collections;
import java.util.Map;
import org.apache.log4j.Logger;
@@ -42,13 +43,8 @@ public class GenericJDBCMessageStore extends GenericAbstractJDBCMessageStore
private static final Logger _logger = Logger.getLogger(GenericJDBCMessageStore.class);
- public static final String TYPE = "JDBC";
public static final String CONNECTION_URL = "connectionUrl";
public static final String CONNECTION_POOL_TYPE = "connectionPoolType";
- public static final String JDBC_BIG_INT_TYPE = "bigIntType";
- public static final String JDBC_BYTES_FOR_BLOB = "bytesForBlob";
- public static final String JDBC_VARBINARY_TYPE = "varbinaryType";
- public static final String JDBC_BLOB_TYPE = "blobType";
protected String _connectionURL;
private ConnectionProvider _connectionProvider;
@@ -58,35 +54,29 @@ public class GenericJDBCMessageStore extends GenericAbstractJDBCMessageStore
private String _bigIntType;
private boolean _useBytesMethodsForBlob;
-
@Override
protected void doOpen(final ConfiguredObject<?> parent, final Map<String, Object> storeSettings) throws StoreException
{
_connectionURL = String.valueOf(storeSettings.get(CONNECTION_URL));
- org.apache.qpid.server.store.jdbc.JDBCDetails details = null;
+ JDBCDetails details = JDBCDetails.getDetailsForJdbcUrl(_connectionURL, parent.getContext());
- String[] components = _connectionURL.split(":", 3);
- if(components.length >= 2)
+ if (!details.isKnownVendor() && getLogger().isInfoEnabled())
{
- String vendor = components[1];
- details = org.apache.qpid.server.store.jdbc.JDBCDetails.getDetails(vendor);
+ getLogger().info("Do not recognize vendor from connection URL: " + _connectionURL
+ + " Using fallback settings " + details);
}
-
- if(details == null)
+ if (details.isOverridden() && getLogger().isInfoEnabled())
{
- getLogger().info("Do not recognize vendor from connection URL: " + _connectionURL);
-
- details = org.apache.qpid.server.store.jdbc.JDBCDetails.getDefaultDetails();
+ getLogger().info("One or more JDBC details were overridden from context. "
+ + " Using settings : " + details);
}
+ _blobType = details.getBlobType();
+ _varBinaryType = details.getVarBinaryType();
+ _useBytesMethodsForBlob = details.isUseBytesMethodsForBlob();
+ _bigIntType = details.getBigintType();
- _blobType = MapValueConverter.getStringAttribute(JDBC_BLOB_TYPE, storeSettings, details.getBlobType());
- _varBinaryType = MapValueConverter.getStringAttribute(JDBC_VARBINARY_TYPE, storeSettings, details.getVarBinaryType());
- _useBytesMethodsForBlob = MapValueConverter.getBooleanAttribute(JDBC_BYTES_FOR_BLOB, storeSettings, details.isUseBytesMethodsForBlob());
- _bigIntType = MapValueConverter.getStringAttribute(JDBC_BIG_INT_TYPE,
- storeSettings,
- details.getBigintType());
Object poolAttribute = storeSettings.get(CONNECTION_POOL_TYPE);
String connectionPoolType = poolAttribute == null ? DefaultConnectionProviderFactory.TYPE : String.valueOf(poolAttribute);
@@ -95,12 +85,13 @@ public class GenericJDBCMessageStore extends GenericAbstractJDBCMessageStore
JDBCConnectionProviderFactory.FACTORIES.get(connectionPoolType);
if(connectionProviderFactory == null)
{
- _logger.warn("Unknown connection pool type: " + connectionPoolType + ". no connection pooling will be used");
+ _logger.warn("Unknown connection pool type: " + connectionPoolType + ". No connection pooling will be used");
connectionProviderFactory = new DefaultConnectionProviderFactory();
}
try
{
+ // TODO: Pass parent to the connenction provider?
_connectionProvider = connectionProviderFactory.getConnectionProvider(_connectionURL, storeSettings);
}
catch (SQLException e)
diff --git a/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JDBCDetails.java b/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JDBCDetails.java
index 6cf1413b83..a74f852dfa 100644
--- a/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JDBCDetails.java
+++ b/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JDBCDetails.java
@@ -19,123 +19,128 @@
package org.apache.qpid.server.store.jdbc;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
-public class JDBCDetails
+public abstract class JDBCDetails
{
+ public static final String CONTEXT_JDBCSTORE_BIGINTTYPE = "qpid.jdbcstore.bigIntType";
+ public static final String CONTEXT_JDBCSTORE_VARBINARYTYPE = "qpid.jdbcstore.varBinaryType";
+ public static final String CONTEXT_JDBCSTORE_BLOBTYPE = "qpid.jdbcstore.blobType";
+ public static final String CONTEXT_JDBCSTORE_USEBYTESFORBLOB = "qpid.jdbcstore.useBytesForBlob";
- private static Map<String, JDBCDetails> VENDOR_DETAILS = new HashMap<>();
+ public abstract String getVendor();
- private static JDBCDetails DERBY_DETAILS =
- new JDBCDetails("derby",
- "blob",
- "varchar(%d) for bit data",
- "bigint",
- false);
+ public abstract String getBlobType();
- private static JDBCDetails POSTGRESQL_DETAILS =
- new JDBCDetails("postgresql",
- "bytea",
- "bytea",
- "bigint",
- true);
+ public abstract String getVarBinaryType();
- private static JDBCDetails MYSQL_DETAILS =
- new JDBCDetails("mysql",
- "blob",
- "varbinary(%d)",
- "bigint",
- false);
+ public abstract String getBigintType();
+ public abstract boolean isUseBytesMethodsForBlob();
- private static JDBCDetails SYBASE_DETAILS =
- new JDBCDetails("sybase",
- "image",
- "varbinary(%d)",
- "bigint",
- false);
+ public abstract boolean isKnownVendor();
+ public abstract boolean isOverridden();
- private static JDBCDetails ORACLE_DETAILS =
- new JDBCDetails("oracle",
- "blob",
- "raw(%d)",
- "number",
- false);
-
-
- static
- {
-
- addDetails(DERBY_DETAILS);
- addDetails(POSTGRESQL_DETAILS);
- addDetails(MYSQL_DETAILS);
- addDetails(SYBASE_DETAILS);
- addDetails(ORACLE_DETAILS);
- }
-
- public static JDBCDetails getDetails(String vendor)
+ static class KnownJDBCDetails extends JDBCDetails
{
- return VENDOR_DETAILS.get(vendor);
- }
+ private static final JDBCDetails FALLBACK = new KnownJDBCDetails("fallback", "blob", "varchar(%d) for bit data", "bigint", false,
+ false);
+ private static final JDBCDetails ORACLE = new KnownJDBCDetails("oracle", "blob", "raw(%d)", "number", false,
+ true);
+ private static final JDBCDetails SYBASE = new KnownJDBCDetails("sybase", "image", "varbinary(%d)", "bigint", false,
+ true);
+ private static final JDBCDetails POSTGRES = new KnownJDBCDetails("postgresql", "bytea", "bytea", "bigint", true,
+ true);
+ private static final JDBCDetails DERBY = new KnownJDBCDetails("derby", "blob", "varchar(%d) for bit data", "bigint", false,
+ true);
+
+ static
+ {
+ Map<String, JDBCDetails> map = new HashMap<>();
+
+ try
+ {
+ map.put(ORACLE.getVendor(), ORACLE);
+ map.put(SYBASE.getVendor(), SYBASE);
+ map.put(POSTGRES.getVendor(), POSTGRES);
+ map.put(DERBY.getVendor(), DERBY);
+ map.put(FALLBACK.getVendor(), FALLBACK);
+ }
+ finally
+ {
+ VENDOR_DETAILS = Collections.unmodifiableMap(map);
+ }
+ }
- public static JDBCDetails getDefaultDetails()
- {
- return DERBY_DETAILS;
- }
+ private final static Map<String, JDBCDetails> VENDOR_DETAILS;
+
+ private final String _vendor;
+ private final String _blobType;
+ private final String _varBinaryType;
+ private final String _bigintType;
+ private final boolean _useBytesMethodsForBlob;
+ private final boolean _isKnownVendor;
+
+ KnownJDBCDetails(String vendor,
+ String blobType,
+ String varBinaryType,
+ String bigIntType,
+ boolean useBytesMethodsForBlob,
+ boolean knownVendor)
+ {
+ _vendor = vendor;
+ _blobType = blobType;
+ _varBinaryType = varBinaryType;
+ _bigintType = bigIntType;
+ _useBytesMethodsForBlob = useBytesMethodsForBlob;
+ _isKnownVendor = knownVendor;
+ }
- private static void addDetails(JDBCDetails details)
- {
- VENDOR_DETAILS.put(details.getVendor(), details);
- }
+ @Override
+ public String getVendor()
+ {
+ return _vendor;
+ }
- private final String _vendor;
- private String _blobType;
- private String _varBinaryType;
- private String _bigintType;
- private boolean _useBytesMethodsForBlob;
-
- JDBCDetails(String vendor,
- String blobType,
- String varBinaryType,
- String bigIntType,
- boolean useBytesMethodsForBlob)
- {
- _vendor = vendor;
- setBlobType(blobType);
- setVarBinaryType(varBinaryType);
- setBigintType(bigIntType);
- setUseBytesMethodsForBlob(useBytesMethodsForBlob);
- }
+ @Override
+ public String getBlobType()
+ {
+ return _blobType;
+ }
+ @Override
+ public String getVarBinaryType()
+ {
+ return _varBinaryType;
+ }
- @Override
- public boolean equals(Object o)
- {
- if (this == o)
+ @Override
+ public boolean isUseBytesMethodsForBlob()
{
- return true;
+ return _useBytesMethodsForBlob;
}
- if (o == null || getClass() != o.getClass())
+
+ @Override
+ public String getBigintType()
{
- return false;
+ return _bigintType;
}
- JDBCDetails that = (JDBCDetails) o;
+ @Override
+ public boolean isKnownVendor()
+ {
+ return _isKnownVendor;
+ }
- if (!getVendor().equals(that.getVendor()))
+ @Override
+ public boolean isOverridden()
{
return false;
}
- return true;
- }
-
- @Override
- public int hashCode()
- {
- return getVendor().hashCode();
}
@Override
@@ -147,51 +152,145 @@ public class JDBCDetails
", varBinaryType='" + getVarBinaryType() + '\'' +
", bigIntType='" + getBigintType() + '\'' +
", useBytesMethodsForBlob=" + isUseBytesMethodsForBlob() +
+ ", knownVendor=" + isKnownVendor() +
+ ", overridden=" + isOverridden() +
'}';
}
- public String getVendor()
+ @Override
+ public boolean equals(final Object o)
{
- return _vendor;
- }
+ if (this == o)
+ {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass())
+ {
+ return false;
+ }
- public String getBlobType()
- {
- return _blobType;
- }
+ final JDBCDetails that = (JDBCDetails) o;
- public void setBlobType(String blobType)
- {
- _blobType = blobType;
- }
+ if (isKnownVendor() != that.isKnownVendor())
+ {
+ return false;
+ }
+ if (isOverridden() != that.isOverridden())
+ {
+ return false;
+ }
+ if (isUseBytesMethodsForBlob() != that.isUseBytesMethodsForBlob())
+ {
+ return false;
+ }
+ if (getBigintType() != null ? !getBigintType().equals(that.getBigintType()) : that.getBigintType() != null)
+ {
+ return false;
+ }
+ if (getBlobType() != null ? !getBlobType().equals(that.getBlobType()) : that.getBlobType() != null)
+ {
+ return false;
+ }
+ if (getVarBinaryType() != null ? !getVarBinaryType().equals(that.getVarBinaryType()) : that.getVarBinaryType() != null)
+ {
+ return false;
+ }
+ if (getVendor() != null ? !getVendor().equals(that.getVendor()) : that.getVendor() != null)
+ {
+ return false;
+ }
- public String getVarBinaryType()
- {
- return _varBinaryType;
+ return true;
}
- public void setVarBinaryType(String varBinaryType)
+ @Override
+ public int hashCode()
{
- _varBinaryType = varBinaryType;
+ int result = getVendor() != null ? getVendor().hashCode() : 0;
+ result = 31 * result + (getBlobType() != null ? getBlobType().hashCode() : 0);
+ result = 31 * result + (getVarBinaryType() != null ? getVarBinaryType().hashCode() : 0);
+ result = 31 * result + (getBigintType() != null ? getBigintType().hashCode() : 0);
+ result = 31 * result + (isUseBytesMethodsForBlob() ? 1 : 0);
+ result = 31 * result + (isKnownVendor() ? 1 : 0);
+ result = 31 * result + (isOverridden() ? 1 : 0);
+ return result;
}
- public boolean isUseBytesMethodsForBlob()
- {
- return _useBytesMethodsForBlob;
- }
- public void setUseBytesMethodsForBlob(boolean useBytesMethodsForBlob)
+ public static JDBCDetails getDetailsForJdbcUrl(String jdbcUrl, final Map<String, String> contextMap)
{
- _useBytesMethodsForBlob = useBytesMethodsForBlob;
- }
+ String[] components = jdbcUrl.split(":", 3);
+ final JDBCDetails details;
+ if(components.length >= 2)
+ {
+ String vendor = components[1];
+ if (KnownJDBCDetails.VENDOR_DETAILS.containsKey(vendor))
+ {
+ details = KnownJDBCDetails.VENDOR_DETAILS.get(vendor);
+ }
+ else
+ {
+ details = KnownJDBCDetails.FALLBACK;
+ }
+ }
+ else
+ {
+ details = KnownJDBCDetails.FALLBACK;
+ }
- public String getBigintType()
- {
- return _bigintType;
- }
- public void setBigintType(String bigintType)
- {
- _bigintType = bigintType;
+ return new JDBCDetails()
+ {
+ @Override
+ public String getVendor()
+ {
+ return details.getVendor();
+ }
+
+ @Override
+ public String getBlobType()
+ {
+ return contextMap.containsKey(CONTEXT_JDBCSTORE_BLOBTYPE)
+ ? String.valueOf(contextMap.get(CONTEXT_JDBCSTORE_BLOBTYPE)) : details.getBlobType();
+ }
+
+ @Override
+ public String getVarBinaryType()
+ {
+ return contextMap.containsKey(CONTEXT_JDBCSTORE_VARBINARYTYPE)
+ ? String.valueOf(contextMap.get(CONTEXT_JDBCSTORE_VARBINARYTYPE)) : details.getVarBinaryType();
+ }
+
+ @Override
+ public String getBigintType()
+ {
+ return contextMap.containsKey(CONTEXT_JDBCSTORE_BIGINTTYPE)
+ ? String.valueOf(contextMap.get(CONTEXT_JDBCSTORE_BIGINTTYPE)) : details.getBigintType();
+ }
+
+ @Override
+ public boolean isUseBytesMethodsForBlob()
+ {
+ return contextMap.containsKey(CONTEXT_JDBCSTORE_USEBYTESFORBLOB)
+ ? Boolean.parseBoolean(contextMap.get(CONTEXT_JDBCSTORE_USEBYTESFORBLOB)) : details.isUseBytesMethodsForBlob();
+ }
+
+ @Override
+ public boolean isKnownVendor()
+ {
+ return details.isKnownVendor();
+ }
+
+ @Override
+ public boolean isOverridden()
+ {
+ return contextMap.containsKey(CONTEXT_JDBCSTORE_USEBYTESFORBLOB)
+ || contextMap.containsKey(CONTEXT_JDBCSTORE_BIGINTTYPE)
+ || contextMap.containsKey(CONTEXT_JDBCSTORE_VARBINARYTYPE)
+ || contextMap.containsKey(CONTEXT_JDBCSTORE_BLOBTYPE);
+ }
+ };
+
}
+
}
diff --git a/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNode.java b/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNode.java
index 302ec9c59f..f9756fec65 100644
--- a/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNode.java
+++ b/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNode.java
@@ -33,16 +33,4 @@ public interface JDBCVirtualHostNode<X extends JDBCVirtualHostNode<X>> extends V
@ManagedAttribute(defaultValue=DefaultConnectionProviderFactory.TYPE)
String getConnectionPoolType();
- @ManagedAttribute
- String getBigIntType();
-
- @ManagedAttribute
- boolean isBytesForBlob();
-
- @ManagedAttribute
- String getVarBinaryType();
-
- @ManagedAttribute
- String getBlobType();
-
}
diff --git a/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeImpl.java b/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeImpl.java
index ab8f4554cb..9098434b69 100644
--- a/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeImpl.java
+++ b/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeImpl.java
@@ -41,18 +41,6 @@ public class JDBCVirtualHostNodeImpl extends AbstractStandardVirtualHostNode<JDB
@ManagedAttributeField
private String _connectionPoolType;
- @ManagedAttributeField
- private String _bigIntType;
-
- @ManagedAttributeField
- private boolean _bytesForBlob;
-
- @ManagedAttributeField
- private String _varBinaryType;
-
- @ManagedAttributeField
- private String _blobType;
-
@ManagedObjectFactoryConstructor
public JDBCVirtualHostNodeImpl(Map<String, Object> attributes, Broker<?> parent)
{
@@ -77,27 +65,4 @@ public class JDBCVirtualHostNodeImpl extends AbstractStandardVirtualHostNode<JDB
return _connectionPoolType;
}
- @Override
- public String getBigIntType()
- {
- return _bigIntType;
- }
-
- @Override
- public boolean isBytesForBlob()
- {
- return _bytesForBlob;
- }
-
- @Override
- public String getVarBinaryType()
- {
- return _varBinaryType;
- }
-
- @Override
- public String getBlobType()
- {
- return _blobType;
- }
}
diff --git a/qpid/java/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/store/jdbc/JDBCDetailsTest.java b/qpid/java/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/store/jdbc/JDBCDetailsTest.java
new file mode 100644
index 0000000000..67e9960ca7
--- /dev/null
+++ b/qpid/java/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/store/jdbc/JDBCDetailsTest.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+
+package org.apache.qpid.server.store.jdbc;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+public class JDBCDetailsTest extends TestCase
+{
+ public void testDerby()
+ {
+ JDBCDetails derbyDetails = JDBCDetails.getDetailsForJdbcUrl("jdbc:derby:sample",
+ Collections.<String, String>emptyMap());
+ assertEquals("derby", derbyDetails.getVendor());
+ assertEquals("varchar(%d) for bit data", derbyDetails.getVarBinaryType());
+ assertEquals("bigint", derbyDetails.getBigintType());
+ assertEquals("blob", derbyDetails.getBlobType());
+ assertFalse(derbyDetails.isUseBytesMethodsForBlob());
+
+ assertTrue(derbyDetails.isKnownVendor());
+ assertFalse(derbyDetails.isOverridden());
+ }
+
+ public void testUnknownVendor_UsesFallbackDetails()
+ {
+ JDBCDetails details = JDBCDetails.getDetailsForJdbcUrl("jdbc:homedb:", Collections.<String, String>emptyMap());
+ assertEquals("fallback", details.getVendor());
+ assertEquals("varchar(%d) for bit data", details.getVarBinaryType());
+ assertEquals("bigint", details.getBigintType());
+ assertEquals("blob", details.getBlobType());
+ assertEquals(false, details.isUseBytesMethodsForBlob());
+ assertFalse(details.isOverridden());
+ assertFalse(details.isKnownVendor());
+ }
+
+ public void testDerbyWithOverride()
+ {
+
+ Map<String, String> contextMap = new HashMap<>();
+ contextMap.put(JDBCDetails.CONTEXT_JDBCSTORE_VARBINARYTYPE, "myvarbin");
+
+ JDBCDetails derbyDetails = JDBCDetails.getDetailsForJdbcUrl("jdbc:derby:sample", contextMap);
+ assertEquals("derby", derbyDetails.getVendor());
+ assertEquals("myvarbin", derbyDetails.getVarBinaryType());
+ assertEquals("bigint", derbyDetails.getBigintType());
+ assertEquals("blob", derbyDetails.getBlobType());
+ assertFalse(derbyDetails.isUseBytesMethodsForBlob());
+
+ assertTrue(derbyDetails.isKnownVendor());
+ assertTrue(derbyDetails.isOverridden());
+ }
+
+
+
+
+ public void testRecognisedDriver_AllDetailsProvidedByContext()
+ {
+ Map<String, String> contextMap = new HashMap<>();
+ contextMap.put(JDBCDetails.CONTEXT_JDBCSTORE_VARBINARYTYPE, "myvarbin");
+ contextMap.put(JDBCDetails.CONTEXT_JDBCSTORE_BIGINTTYPE, "mybigint");
+ contextMap.put(JDBCDetails.CONTEXT_JDBCSTORE_BLOBTYPE, "myblob");
+ contextMap.put(JDBCDetails.CONTEXT_JDBCSTORE_USEBYTESFORBLOB, "true");
+
+ JDBCDetails details = JDBCDetails.getDetailsForJdbcUrl("jdbc:sybase:", contextMap);
+ assertEquals("sybase", details.getVendor());
+ assertEquals("myvarbin", details.getVarBinaryType());
+ assertEquals("mybigint", details.getBigintType());
+ assertEquals("myblob", details.getBlobType());
+ assertEquals(true, details.isUseBytesMethodsForBlob());
+ assertTrue(details.isKnownVendor());
+ assertTrue(details.isOverridden());
+ }
+
+} \ No newline at end of file