Index: hbase-client/src/main/java/org/apache/hadoop/hbase/snapshot/ClientSnapshotDescriptionUtils.java =================================================================== --- hbase-client/src/main/java/org/apache/hadoop/hbase/snapshot/ClientSnapshotDescriptionUtils.java (revision 1573743) +++ hbase-client/src/main/java/org/apache/hadoop/hbase/snapshot/ClientSnapshotDescriptionUtils.java (working copy) @@ -39,7 +39,7 @@ public static void assertSnapshotRequestIsValid(HBaseProtos.SnapshotDescription snapshot) throws IllegalArgumentException { // make sure the snapshot name is valid - TableName.isLegalTableQualifierName(Bytes.toBytes(snapshot.getName())); + TableName.isLegalTableQualifierName(Bytes.toBytes(snapshot.getName()), true); if(snapshot.hasTable()) { // make sure the table name is valid, this will implicitly check validity TableName tableName = TableName.valueOf(snapshot.getTable()); Index: hbase-common/src/main/java/org/apache/hadoop/hbase/TableName.java =================================================================== --- hbase-common/src/main/java/org/apache/hadoop/hbase/TableName.java (revision 1573743) +++ hbase-common/src/main/java/org/apache/hadoop/hbase/TableName.java (working copy) @@ -145,11 +145,17 @@ return tableName; } - public static byte [] isLegalTableQualifierName(final byte[] qualifierName){ - isLegalTableQualifierName(qualifierName, 0, qualifierName.length); + public static byte [] isLegalTableQualifierName(final byte[] qualifierName) { + isLegalTableQualifierName(qualifierName, 0, qualifierName.length, false); return qualifierName; } + public static byte [] isLegalTableQualifierName(final byte[] qualifierName, boolean isSnapshot) { + isLegalTableQualifierName(qualifierName, 0, qualifierName.length, isSnapshot); + return qualifierName; + } + + /** * Qualifier names can only contain 'word' characters * [a-zA-Z_0-9] or '_', '.' or '-'. @@ -161,15 +167,23 @@ */ public static void isLegalTableQualifierName(final byte[] qualifierName, int start, - int end){ + int end) { + isLegalTableQualifierName(qualifierName, start, end, false); + } + + public static void isLegalTableQualifierName(final byte[] qualifierName, + int start, + int end, + boolean isSnapshot) { if(end - start < 1) { - throw new IllegalArgumentException("Table qualifier must not be empty"); + throw new IllegalArgumentException(isSnapshot ? "Snapshot" : "Table" + " qualifier must not be empty"); } if (qualifierName[start] == '.' || qualifierName[start] == '-') { throw new IllegalArgumentException("Illegal first character <" + qualifierName[0] + - "> at 0. Namespaces can only start with alphanumeric " + - "characters': i.e. [a-zA-Z_0-9]: " + Bytes.toString(qualifierName)); + "> at 0. Namespaces can only start with alphanumeric " + + "characters': i.e. [a-zA-Z_0-9]: " + + Bytes.toString(qualifierName)); } for (int i = start; i < end; i++) { if (Character.isLetterOrDigit(qualifierName[i]) || @@ -179,13 +193,13 @@ continue; } throw new IllegalArgumentException("Illegal character code:" + qualifierName[i] + - ", <" + (char) qualifierName[i] + "> at " + i + - ". User-space table qualifiers can only contain " + - "'alphanumeric characters': i.e. [a-zA-Z_0-9-.]: " + - Bytes.toString(qualifierName, start, end)); + ", <" + (char) qualifierName[i] + "> at " + i + + ". " + (isSnapshot ? "snapshot" : "User-space table") + + " qualifiers can only contain " + + "'alphanumeric characters': i.e. [a-zA-Z_0-9-.]: " + + Bytes.toString(qualifierName, start, end)); } } - public static void isLegalNamespaceName(byte[] namespaceName) { isLegalNamespaceName(namespaceName, 0, namespaceName.length); }