Author: [email protected]
Date: Mon Oct 10 12:16:40 2011
New Revision: 1479

Log:
[AMDATUCASSANDRA-99] Added thorough validation of input arguments before 
passing them to Hector, preventing the internal Hector errors.

Modified:
   
trunk/amdatu-cassandra/cassandra-persistencemanager-hector/src/main/java/org/amdatu/cassandra/persistencemanager/hector/service/HectorCassandraPersistenceManagerImpl.java

Modified: 
trunk/amdatu-cassandra/cassandra-persistencemanager-hector/src/main/java/org/amdatu/cassandra/persistencemanager/hector/service/HectorCassandraPersistenceManagerImpl.java
==============================================================================
--- 
trunk/amdatu-cassandra/cassandra-persistencemanager-hector/src/main/java/org/amdatu/cassandra/persistencemanager/hector/service/HectorCassandraPersistenceManagerImpl.java
  (original)
+++ 
trunk/amdatu-cassandra/cassandra-persistencemanager-hector/src/main/java/org/amdatu/cassandra/persistencemanager/hector/service/HectorCassandraPersistenceManagerImpl.java
  Mon Oct 10 12:16:40 2011
@@ -49,8 +49,6 @@
 
 import 
org.amdatu.cassandra.persistencemanager.hector.HectorCassandraPersistenceManager;
 
-
-
 /**
  * This class implements a CassandraPersistenceManager using the Hector API. 
It provides an additional
  * Amdatu specific layer on top of the Hector API, which internally uses the 
(very rudimentary) Thrift API.
@@ -63,7 +61,8 @@
  * 
  * @author ivol
  */
-public class HectorCassandraPersistenceManagerImpl extends 
CassandraPersistenceManagerBaseImpl implements 
HectorCassandraPersistenceManager {
+public class HectorCassandraPersistenceManagerImpl extends 
CassandraPersistenceManagerBaseImpl implements
+    HectorCassandraPersistenceManager {
     public void start() {
         super.start();
 
@@ -112,7 +111,7 @@
             Thread.currentThread().setContextClassLoader(oldClassLoader);
         }
     }
-    
+
     public Cluster getHectorCluster() {
         ClassLoader oldClassLoader = 
Thread.currentThread().getContextClassLoader();
         try {
@@ -122,14 +121,42 @@
             String thriftHost =
                 getConfigurationService().getRPCAddress() + ":" + 
getConfigurationService().getRPCPort();
             String clusterName = getConfigurationService().getClustername();
-            return HFactory.getOrCreateCluster(clusterName, thriftHost); 
+            return HFactory.getOrCreateCluster(clusterName, thriftHost);
         }
         finally {
             Thread.currentThread().setContextClassLoader(oldClassLoader);
         }
     }
 
+    private void validateCF(final String cf) {
+        if (cf == null) {
+            throw new HInvalidRequestException("Invalid request: input 
ColumnFamily argument is null");
+        }
+    }
+
+    private void validateRowKey(final String rowKey) {
+        if (rowKey == null) {
+            throw new HInvalidRequestException("Invalid request: input rowKey 
argument is null");
+        }
+    }
+
+    private void validateColumn(final String column) {
+        if (column == null) {
+            throw new HInvalidRequestException("Invalid request: input column 
argument is null");
+        }
+    }
+
+    private void validateSuperColumn(final String superColumn) {
+        if (superColumn == null) {
+            throw new HInvalidRequestException("Invalid request: input 
SuperColumn argument is null");
+        }
+    }
+
     public boolean exists(final String columnFamilyName, final String rowKey) {
+        // Validate input arguments
+        validateCF(columnFamilyName);
+        validateRowKey(rowKey);
+
         StringSerializer stringSerializer = StringSerializer.get();
         StringSerializer nameSerializer = StringSerializer.get();
         QueryResult<Integer> result =
@@ -143,12 +170,15 @@
 
     public boolean exists(final String columnFamilyName, final String rowKey, 
final String superColumnName,
         final String columnName) {
+        // Validate input arguments
+        validateCF(columnFamilyName);
+        validateRowKey(rowKey);
+
         StringSerializer serializer = StringSerializer.get();
         if (isSuper(columnFamilyName, superColumnName, columnName)) {
-            if (superColumnName == null) {
-                throw new HInvalidRequestException("Invalid request: 
superColumnName is null while ColumnFamily '"
-                    + columnFamilyName + "' is of type 'Super'");
-            }
+            // Validate input arguments
+            validateSuperColumn(superColumnName);
+
             QueryResult<HSuperColumn<String, String, String>> result =
                 HFactory.createSuperColumnQuery(getHectorKeyspace(), 
serializer, serializer, serializer, serializer)
                     .setColumnFamily(columnFamilyName)
@@ -176,10 +206,16 @@
     }
 
     public List<String> getRowKeys(final String columnFamilyName) {
+        // Validate input arguments
+        validateCF(columnFamilyName);
+
         return getRowKeys(columnFamilyName, null, null);
     }
 
     public List<String> getRowKeys(final String columnFamilyName, final String 
column, final String superColumn) {
+        // Validate input arguments (column and superColumn may be null in 
these queries)
+        validateCF(columnFamilyName);
+
         List<String> rowKeys = new ArrayList<String>();
         if (isSuperColumnFamily(columnFamilyName)) {
             Iterator<SuperRow<String, String, String, ByteBuffer>> iter =
@@ -214,6 +250,10 @@
     }
 
     public List<String> getColumnNames(final String columnFamilyName, final 
String rowKey) {
+        // Validate input arguments
+        validateCF(columnFamilyName);
+        validateRowKey(rowKey);
+
         List<String> columnNames = new ArrayList<String>();
         if (isSuperColumnFamily(columnFamilyName)) {
             List<HSuperColumn<String, String, ByteBuffer>> superColumns =
@@ -242,38 +282,72 @@
     }
 
     public void deleteRow(final String columnFamilyName, final String rowKey) {
+        // Validate input arguments
+        validateCF(columnFamilyName);
+        validateRowKey(rowKey);
+
         StringSerializer serializer = StringSerializer.get();
         Mutator<String> mutator = HFactory.createMutator(getHectorKeyspace(), 
serializer);
         mutator.delete(rowKey, columnFamilyName, null, serializer);
     }
 
     public void deleteSuperColumn(final String columnFamilyName, final String 
rowKey, final String superColumnName) {
+        // Validate input arguments
+        validateCF(columnFamilyName);
+        validateRowKey(rowKey);
+        validateSuperColumn(superColumnName);
+
         deleteColumn(columnFamilyName, rowKey, superColumnName, null);
     }
 
     public void deleteColumn(final String columnFamilyName, final String 
rowKey,
         final String superColumnName, final String columnName) {
+        // Validate input arguments
+        validateCF(columnFamilyName);
+        validateRowKey(rowKey);
+
         StringSerializer serializer = StringSerializer.get();
         Mutator<String> mutator = HFactory.createMutator(getHectorKeyspace(), 
serializer);
         if (isSuper(columnFamilyName, superColumnName, columnName)) {
+            // Validate input arguments (column may be null)
+            validateSuperColumn(superColumnName);
+
             mutator.subDelete(rowKey, columnFamilyName, superColumnName, 
columnName, serializer, serializer);
         }
         else {
+            // Validate input arguments
+            validateColumn(columnName);
+            
             mutator.delete(rowKey, columnFamilyName, columnName, serializer);
         }
     }
 
     public void setValue(final String columnFamily, final String rowKey, final 
String superColumn, final String column,
         final Object value) {
+        // Validate input arguments
+        validateCF(columnFamily);
+        validateRowKey(rowKey);
+        validateColumn(column);
+
         internalsetValue(columnFamily, rowKey, superColumn, column, value, 0);
     }
-    
+
     public void setValue(String columnFamily, String rowKey, String 
superColumn, String column, Object value, int ttl) {
+        // Validate input arguments
+        validateCF(columnFamily);
+        validateRowKey(rowKey);
+        validateColumn(column);
+
         internalsetValue(columnFamily, rowKey, superColumn, column, value, 
ttl);
     }
 
     public <T> T getValue(final String columnFamilyName, final String rowKey, 
final String superColumnName,
         final String columnName, final Class<T> clazz) {
+        // Validate input arguments
+        validateCF(columnFamilyName);
+        validateRowKey(rowKey);
+        validateColumn(columnName);
+
         return internalGetValue(columnFamilyName, rowKey, superColumnName, 
columnName, clazz);
     }
 
@@ -286,6 +360,10 @@
      */
     public <T> List<HSuperColumn<String, String, T>> getSuperColumns(final 
String columnFamilyName,
         final String rowKey, final Class<T> clazz) {
+        // Validate input arguments
+        validateCF(columnFamilyName);
+        validateRowKey(rowKey);
+
         StringSerializer serializer = StringSerializer.get();
         Serializer<T> valueSerializer = getSerializer(clazz);
         QueryResult<SuperSlice<String, String, T>> result =
@@ -307,6 +385,10 @@
      */
     public <T> List<HColumn<String, T>> getColumns(final String 
columnFamilyName, final String rowKey,
         final Class<T> clazz) {
+        // Validate input arguments
+        validateCF(columnFamilyName);
+        validateRowKey(rowKey);
+
         StringSerializer serializer = StringSerializer.get();
         Serializer<T> valueSerializer = getSerializer(clazz);
         QueryResult<ColumnSlice<String, T>> result =
@@ -322,47 +404,79 @@
             return null;
         }
     }
-    
+
     public <T> SuperRow<String, String, String, T> getSuperRow(String 
columnFamily, String rowKey, Class<T> clazz) {
-        Iterator<SuperRow<String, String, String, T>> superRows = 
getSuperRows(columnFamily, rowKey, clazz, COLUMN_LIMIT, null, null);
+        // Validate input arguments
+        validateCF(columnFamily);
+        validateRowKey(rowKey);
+
+        Iterator<SuperRow<String, String, String, T>> superRows =
+            getSuperRows(columnFamily, rowKey, clazz, COLUMN_LIMIT, null, 
null);
         if (superRows.hasNext()) {
             return superRows.next();
-        } else {
+        }
+        else {
             return null;
         }
     }
-    
+
     public <T> SuperRow<String, String, String, T> getSuperRow(String 
columnFamilyName, String rowKey,
         String superColumn, Class<T> clazz) {
-        Iterator<SuperRow<String, String, String, T>> superRows = 
getSuperRows(columnFamilyName, rowKey, clazz, COLUMN_LIMIT, null, superColumn);
+        // Validate input arguments
+        validateCF(columnFamilyName);
+        validateRowKey(rowKey);
+        validateSuperColumn(superColumn);
+
+        Iterator<SuperRow<String, String, String, T>> superRows =
+            getSuperRows(columnFamilyName, rowKey, clazz, COLUMN_LIMIT, null, 
superColumn);
         if (superRows.hasNext()) {
             return superRows.next();
-        } else {
+        }
+        else {
             return null;
         }
     }
-    
+
     public <T> Iterator<SuperRow<String, String, String, T>> 
getSuperRows(final String columnFamilyName,
         final Class<T> clazz) {
+        // Validate input arguments
+        validateCF(columnFamilyName);
+
         return getSuperRows(columnFamilyName, null, clazz, COLUMN_LIMIT, null, 
null);
     }
-    
+
     public <T> Iterator<SuperRow<String, String, String, T>> 
getSuperRows(String columnFamilyName, String superColumn,
         Class<T> clazz) {
+        // Validate input arguments
+        validateCF(columnFamilyName);
+        validateSuperColumn(superColumn);
+
         return getSuperRows(columnFamilyName, null, clazz, COLUMN_LIMIT, null, 
superColumn);
     }
 
     public <T> Iterator<Row<String, String, T>> getRows(final String 
columnFamilyName, final Class<T> clazz) {
+        // Validate input arguments
+        validateCF(columnFamilyName);
+
         return getRows(columnFamilyName, clazz, COLUMN_LIMIT, null);
     }
-    
+
     private <T extends Object> T internalGetValue(final String 
columnFamilyName, final String rowKey,
         final String superColumnName, final String columnName, final Class<T> 
clazz) {
+        // Validate input arguments
+        validateCF(columnFamilyName);
+        validateRowKey(rowKey);
+        validateColumn(columnName);
+
         StringSerializer serializer = StringSerializer.get();
         Serializer<T> valueSerializer = getSerializer(clazz);
         if (isSuper(columnFamilyName, superColumnName, columnName)) {
+            // Validate input arguments
+            validateSuperColumn(superColumnName);
+
             QueryResult<HSuperColumn<String, String, T>> result =
-                HFactory.createSuperColumnQuery(getHectorKeyspace(), 
serializer, serializer, serializer, valueSerializer)
+                HFactory
+                    .createSuperColumnQuery(getHectorKeyspace(), serializer, 
serializer, serializer, valueSerializer)
                     .setColumnFamily(columnFamilyName)
                     .setKey(rowKey)
                     .setSuperName(superColumnName)
@@ -436,13 +550,14 @@
     private <T extends Object> Serializer<T> getSerializer(final T value) {
         return SerializerTypeInferer.getSerializer(value);
     }
-    
+
     private <T> Iterator<SuperRow<String, String, String, T>> 
getSuperRows(final String columnFamilyName,
         final String rowKey, final Class<T> clazz, final int colLimit, final 
String column, final String superColumn) {
         StringSerializer serializer = StringSerializer.get();
         Serializer<T> valueSerializer = getSerializer(clazz);
         RangeSuperSlicesQuery<String, String, String, T> rangeSlicesQuery =
-            HFactory.createRangeSuperSlicesQuery(getHectorKeyspace(), 
serializer, serializer, serializer, valueSerializer)
+            HFactory
+                .createRangeSuperSlicesQuery(getHectorKeyspace(), serializer, 
serializer, serializer, valueSerializer)
                 .setColumnFamily(columnFamilyName)
                 .setKeys(null, null)
                 .setRange(superColumn, superColumn, false, colLimit)
@@ -463,8 +578,6 @@
         }
     }
 
-
-
     private <T> Iterator<Row<String, String, T>> getRows(final String 
columnFamilyName, final Class<T> clazz,
         final int colLimit, final String column) {
         StringSerializer serializer = StringSerializer.get();
_______________________________________________
Amdatu-commits mailing list
[email protected]
http://lists.amdatu.org/mailman/listinfo/amdatu-commits

Reply via email to