Modified: qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JDBCDetails.java URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JDBCDetails.java?rev=1603655&r1=1603654&r2=1603655&view=diff ============================================================================== --- qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JDBCDetails.java (original) +++ qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JDBCDetails.java Wed Jun 18 22:15:54 2014 @@ -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); - - private static JDBCDetails POSTGRESQL_DETAILS = - new JDBCDetails("postgresql", - "bytea", - "bytea", - "bigint", - true); - - private static JDBCDetails MYSQL_DETAILS = - new JDBCDetails("mysql", - "blob", - "varbinary(%d)", - "bigint", - false); - - - private static JDBCDetails SYBASE_DETAILS = - new JDBCDetails("sybase", - "image", - "varbinary(%d)", - "bigint", - false); - - - private static JDBCDetails ORACLE_DETAILS = - new JDBCDetails("oracle", - "blob", - "raw(%d)", - "number", - false); + public abstract String getBlobType(); + public abstract String getVarBinaryType(); - static - { + public abstract String getBigintType(); - addDetails(DERBY_DETAILS); - addDetails(POSTGRESQL_DETAILS); - addDetails(MYSQL_DETAILS); - addDetails(SYBASE_DETAILS); - addDetails(ORACLE_DETAILS); - } + public abstract boolean isUseBytesMethodsForBlob(); - public static JDBCDetails getDetails(String vendor) - { - return VENDOR_DETAILS.get(vendor); - } + public abstract boolean isKnownVendor(); - public static JDBCDetails getDefaultDetails() - { - return DERBY_DETAILS; - } + public abstract boolean isOverridden(); - private static void addDetails(JDBCDetails details) + static class KnownJDBCDetails extends JDBCDetails { - VENDOR_DETAILS.put(details.getVendor(), details); - } + 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); - 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); - } + 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); + } + } - @Override - public boolean equals(Object o) - { - if (this == o) + 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) { - return true; + _vendor = vendor; + _blobType = blobType; + _varBinaryType = varBinaryType; + _bigintType = bigIntType; + _useBytesMethodsForBlob = useBytesMethodsForBlob; + _isKnownVendor = knownVendor; } - if (o == null || getClass() != o.getClass()) + + @Override + public String getVendor() { - return false; + return _vendor; } - JDBCDetails that = (JDBCDetails) o; + @Override + public String getBlobType() + { + return _blobType; + } - if (!getVendor().equals(that.getVendor())) + @Override + public String getVarBinaryType() { - return false; + return _varBinaryType; } - return true; - } + @Override + public boolean isUseBytesMethodsForBlob() + { + return _useBytesMethodsForBlob; + } + + @Override + public String getBigintType() + { + return _bigintType; + } + + @Override + public boolean isKnownVendor() + { + return _isKnownVendor; + } + + @Override + public boolean isOverridden() + { + return false; + } - @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) - { - _useBytesMethodsForBlob = useBytesMethodsForBlob; - } + public static JDBCDetails getDetailsForJdbcUrl(String jdbcUrl, final Map<String, String> contextMap) + { + 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); + } + }; + } + }
Modified: qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNode.java URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNode.java?rev=1603655&r1=1603654&r2=1603655&view=diff ============================================================================== --- qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNode.java (original) +++ qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNode.java Wed Jun 18 22:15:54 2014 @@ -33,16 +33,4 @@ public interface JDBCVirtualHostNode<X e @ManagedAttribute(defaultValue=DefaultConnectionProviderFactory.TYPE) String getConnectionPoolType(); - @ManagedAttribute - String getBigIntType(); - - @ManagedAttribute - boolean isBytesForBlob(); - - @ManagedAttribute - String getVarBinaryType(); - - @ManagedAttribute - String getBlobType(); - } Modified: qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeImpl.java URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeImpl.java?rev=1603655&r1=1603654&r2=1603655&view=diff ============================================================================== --- qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeImpl.java (original) +++ qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeImpl.java Wed Jun 18 22:15:54 2014 @@ -41,18 +41,6 @@ public class JDBCVirtualHostNodeImpl ext @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 ext 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; - } } Added: qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/store/jdbc/JDBCDetailsTest.java URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/store/jdbc/JDBCDetailsTest.java?rev=1603655&view=auto ============================================================================== --- qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/store/jdbc/JDBCDetailsTest.java (added) +++ qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/store/jdbc/JDBCDetailsTest.java Wed Jun 18 22:15:54 2014 @@ -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 --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
