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]

Reply via email to