diff --git a/CHANGES.txt b/CHANGES.txt index 0586eb6a201..b79627d904a 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -65,8 +65,8 @@ Release 0.21.0 - Unreleased HBASE-1831 Scanning API must be reworked to allow for fully functional Filters client-side HBASE-1890 hbase-1506 where assignment is done at regionserver doesn't - work - HBASE-1889 ClassNotFoundException on trunk for REST + work + HBASE-1889 ClassNotFoundException on trunk for REST HBASE-1905 Remove unused config. hbase.hstore.blockCache.blockSize HBASE-1906 FilterList of prefix and columnvalue not working properly with deletes and multiple values @@ -150,6 +150,7 @@ Release 0.21.0 - Unreleased (Scott Wang via Andrew Purtell) HBASE-2068 MetricsRate is missing "registry" parameter (Lars George and Gary Helmling via Stack) + HBASE-2093 [stargate] RowSpec parse bug IMPROVEMENTS HBASE-1760 Cleanup TODOs in HTable diff --git a/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/RowResource.java b/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/RowResource.java index ddda83e0565..32a0a421291 100644 --- a/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/RowResource.java +++ b/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/RowResource.java @@ -21,6 +21,7 @@ package org.apache.hadoop.hbase.stargate; import java.io.IOException; +import java.net.URLDecoder; import java.util.List; import javax.ws.rs.Consumes; @@ -60,7 +61,8 @@ public class RowResource implements Constants { public RowResource(String table, String rowspec, String versions) throws IOException { this.table = table; - this.rowspec = new RowSpec(rowspec); + this.rowspec = new RowSpec(URLDecoder.decode(rowspec, + HConstants.UTF8_ENCODING)); if (versions != null) { this.rowspec.setMaxVersions(Integer.valueOf(versions)); } @@ -143,7 +145,8 @@ public class RowResource implements Constants { try { table = pool.getTable(this.table); for (RowModel row: model.getRows()) { - Put put = new Put(row.getKey()); + byte[] key = row.getKey(); + Put put = new Put(key); for (CellModel cell: row.getCells()) { byte [][] parts = KeyValue.parseColumn(cell.getColumn()); if(parts.length == 1) { diff --git a/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/package.html b/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/package.html index 306966a9180..d88521dcb11 100755 --- a/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/package.html +++ b/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/package.html @@ -277,7 +277,26 @@ scheme://user:pass@example.net:8080/path/to/file;type=foo?name=val#frag Stargate exposes HBase tables, rows, cells, and metadata as URL specified resources.
- +NOTE: The characters /, :, and , are reserved +within row keys, column names, and column qualifiers. Clients must escape them +somehow, perhaps by encoding them as hex escapes or by using www-url-encoding. For +example, the key: +
+
+ http://www.google.com/ ++
+should first be encoded as: +
+
+ http%3A%2F%2Fwww.google.com%2F ++
+to produce a path like: +
+ /SomeTable/http%3A%2F%2Fwww.google.com%2F/someColumn:qualifier ++
diff --git a/src/contrib/stargate/src/test/org/apache/hadoop/hbase/stargate/TestRowResource.java b/src/contrib/stargate/src/test/org/apache/hadoop/hbase/stargate/TestRowResource.java index 52736ec61c9..00f24d6f87a 100644 --- a/src/contrib/stargate/src/test/org/apache/hadoop/hbase/stargate/TestRowResource.java +++ b/src/contrib/stargate/src/test/org/apache/hadoop/hbase/stargate/TestRowResource.java @@ -23,6 +23,7 @@ package org.apache.hadoop.hbase.stargate; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.StringWriter; +import java.net.URLEncoder; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; @@ -31,6 +32,7 @@ import javax.xml.bind.Unmarshaller; import org.apache.commons.httpclient.Header; import org.apache.hadoop.hbase.HColumnDescriptor; +import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.client.HBaseAdmin; @@ -301,6 +303,18 @@ public class TestRowResource extends MiniClusterTestCase { assertEquals(response.getCode(), 200); } + public void testURLEncodedKey() throws IOException, JAXBException { + String encodedKey = URLEncoder.encode("http://www.google.com/", + HConstants.UTF8_ENCODING); + Response response; + response = putValueXML(TABLE, encodedKey, COLUMN_1, VALUE_1); + assertEquals(response.getCode(), 200); + response = putValuePB(TABLE, encodedKey, COLUMN_2, VALUE_2); + assertEquals(response.getCode(), 200); + checkValuePB(TABLE, encodedKey, COLUMN_1, VALUE_1); + checkValueXML(TABLE, encodedKey, COLUMN_2, VALUE_2); + } + public void testMultiCellGetPutXML() throws IOException, JAXBException { String path = "/" + TABLE + "/fakerow"; // deliberate nonexistent row