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