]> source.dussan.org Git - vaadin-framework.git/commitdiff
#9148 SQLContainer extensible null value support using custom StatementHelper classes
authorHenri Sara <henri.sara@itmill.com>
Wed, 25 Jul 2012 10:15:39 +0000 (10:15 +0000)
committerHenri Sara <henri.sara@itmill.com>
Wed, 25 Jul 2012 10:15:39 +0000 (10:15 +0000)
svn changeset:24023/svn branch:6.8

src/com/vaadin/data/util/sqlcontainer/query/generator/DefaultSQLGenerator.java
src/com/vaadin/data/util/sqlcontainer/query/generator/MSSQLGenerator.java
src/com/vaadin/data/util/sqlcontainer/query/generator/OracleGenerator.java
src/com/vaadin/data/util/sqlcontainer/query/generator/StatementHelper.java

index 24d283c9ab42559c4a81d2633abb1bd4c713b37b..d1700fc0d2388395207d89a3d9442af8773bca52 100644 (file)
@@ -24,10 +24,24 @@ import com.vaadin.data.util.sqlcontainer.query.generator.filter.StringDecorator;
 @SuppressWarnings("serial")
 public class DefaultSQLGenerator implements SQLGenerator {
 
+    private Class<? extends StatementHelper> statementHelperClass = null;
+
     public DefaultSQLGenerator() {
 
     }
 
+    /**
+     * Create a new DefaultSqlGenerator instance that uses the given
+     * implementation of {@link StatementHelper}
+     * 
+     * @param statementHelper
+     */
+    public DefaultSQLGenerator(
+            Class<? extends StatementHelper> statementHelperClazz) {
+        this();
+        statementHelperClass = statementHelperClazz;
+    }
+
     /**
      * Construct a DefaultSQLGenerator with the specified identifiers for start
      * and end of quoted strings. The identifiers may be different depending on
@@ -44,6 +58,20 @@ public class DefaultSQLGenerator implements SQLGenerator {
                 quoteEnd));
     }
 
+    /**
+     * Same as {@link #DefaultSQLGenerator(String, String)} but with support for
+     * custom {@link StatementHelper} implementation.
+     * 
+     * @param quoteStart
+     * @param quoteEnd
+     * @param statementHelperClazz
+     */
+    public DefaultSQLGenerator(String quoteStart, String quoteEnd,
+            Class<? extends StatementHelper> statementHelperClazz) {
+        this(quoteStart, quoteEnd);
+        statementHelperClass = statementHelperClazz;
+    }
+
     /*
      * (non-Javadoc)
      * 
@@ -58,7 +86,7 @@ public class DefaultSQLGenerator implements SQLGenerator {
             throw new IllegalArgumentException("Table name must be given.");
         }
         toSelect = toSelect == null ? "*" : toSelect;
-        StatementHelper sh = new StatementHelper();
+        StatementHelper sh = getStatementHelper();
         StringBuffer query = new StringBuffer();
         query.append("SELECT " + toSelect + " FROM ").append(
                 SQLUtil.escapeSQL(tableName));
@@ -91,7 +119,7 @@ public class DefaultSQLGenerator implements SQLGenerator {
         if (item == null) {
             throw new IllegalArgumentException("Updated item must be given.");
         }
-        StatementHelper sh = new StatementHelper();
+        StatementHelper sh = getStatementHelper();
         StringBuffer query = new StringBuffer();
         query.append("UPDATE ").append(tableName).append(" SET");
 
@@ -144,7 +172,7 @@ public class DefaultSQLGenerator implements SQLGenerator {
             throw new IllegalArgumentException(
                     "Cannot generate an insert query for item already in database.");
         }
-        StatementHelper sh = new StatementHelper();
+        StatementHelper sh = getStatementHelper();
         StringBuffer query = new StringBuffer();
         query.append("INSERT INTO ").append(tableName).append(" (");
 
@@ -197,7 +225,7 @@ public class DefaultSQLGenerator implements SQLGenerator {
             throw new IllegalArgumentException(
                     "Valid keyColumnNames must be provided.");
         }
-        StatementHelper sh = new StatementHelper();
+        StatementHelper sh = getStatementHelper();
         StringBuffer query = new StringBuffer();
         query.append("DELETE FROM ").append(tableName).append(" WHERE ");
         int count = 1;
@@ -308,4 +336,28 @@ public class DefaultSQLGenerator implements SQLGenerator {
         }
         return rowIdentifiers;
     }
+
+    /**
+     * Returns the statement helper for the generator. Override this to handle
+     * platform specific data types.
+     * 
+     * @see http://dev.vaadin.com/ticket/9148
+     * @return a new instance of the statement helper
+     */
+    protected StatementHelper getStatementHelper() {
+        if (statementHelperClass == null) {
+            return new StatementHelper();
+        }
+
+        try {
+            return statementHelperClass.newInstance();
+        } catch (InstantiationException e) {
+            throw new RuntimeException(
+                    "Unable to instantiate custom StatementHelper", e);
+        } catch (IllegalAccessException e) {
+            throw new RuntimeException(
+                    "Unable to instantiate custom StatementHelper", e);
+        }
+    }
+
 }
\ No newline at end of file
index 52c13feecba59e9ac1097cffbde38cd2ac29c333..13ef1d0090232f89752ab8ead9a0f772c83376c8 100644 (file)
@@ -50,7 +50,7 @@ public class MSSQLGenerator extends DefaultSQLGenerator {
         offset = pagelength > 1 ? ++offset : offset;
         pagelength = pagelength > 1 ? --pagelength : pagelength;
         toSelect = toSelect == null ? "*" : toSelect;
-        StatementHelper sh = new StatementHelper();
+        StatementHelper sh = getStatementHelper();
         StringBuffer query = new StringBuffer();
 
         /* Row count request is handled here */
index 8e332111544765df122c0d1e0c7a8a4fa8a1c368..43a562d3a8232b8bbf55edf4bce5a383f57f6c3d 100644 (file)
@@ -16,6 +16,10 @@ public class OracleGenerator extends DefaultSQLGenerator {
 
     }
 
+    public OracleGenerator(Class<? extends StatementHelper> statementHelperClazz) {
+        super(statementHelperClazz);
+    }
+
     /**
      * Construct an OracleSQLGenerator with the specified identifiers for start
      * and end of quoted strings. The identifiers may be different depending on
@@ -31,6 +35,11 @@ public class OracleGenerator extends DefaultSQLGenerator {
         super(quoteStart, quoteEnd);
     }
 
+    public OracleGenerator(String quoteStart, String quoteEnd,
+            Class<? extends StatementHelper> statementHelperClazz) {
+        super(quoteStart, quoteEnd, statementHelperClazz);
+    }
+
     /*
      * (non-Javadoc)
      * 
@@ -50,7 +59,7 @@ public class OracleGenerator extends DefaultSQLGenerator {
         offset = pagelength > 1 ? ++offset : offset;
         pagelength = pagelength > 1 ? --pagelength : pagelength;
         toSelect = toSelect == null ? "*" : toSelect;
-        StatementHelper sh = new StatementHelper();
+        StatementHelper sh = getStatementHelper();
         StringBuffer query = new StringBuffer();
 
         /* Row count request is handled here */
@@ -99,4 +108,5 @@ public class OracleGenerator extends DefaultSQLGenerator {
         sh.setQueryString(query.toString());
         return sh;
     }
+
 }
\ No newline at end of file
index 3fd92e920d37d133d6283c92dc7d39620211e456..f9458609c38dcd8d4a41b2c775def40ec1b312dc 100644 (file)
@@ -128,8 +128,32 @@ public class StatementHelper implements Serializable {
         } else if (Timestamp.class.equals(dataTypes.get(i))) {
             pstmt.setTimestamp(i + 1, null);
         } else {
+
+            if (handleUnrecognizedTypeNullValue(i, pstmt, dataTypes)) {
+                return;
+            }
+
             throw new SQLException("Data type not supported by SQLContainer: "
                     + parameters.get(i).getClass().toString());
         }
     }
+
+    /**
+     * Handle unrecognized null values. Override this to handle null values for
+     * platform specific data types that are not handled by the default
+     * implementation of the {@link StatementHelper}.
+     * 
+     * @param i
+     * @param pstmt
+     * @param dataTypes2
+     * 
+     * @return true if handled, false otherwise
+     * 
+     * @see {@link http://dev.vaadin.com/ticket/9148}
+     */
+    protected boolean handleUnrecognizedTypeNullValue(int i,
+            PreparedStatement pstmt, Map<Integer, Class<?>> dataTypes)
+            throws SQLException {
+        return false;
+    }
 }