diff --git a/CHANGES.txt b/CHANGES.txt index 281036f952e..d9ef3be9285 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -171,6 +171,8 @@ Release 0.91.0 - Unreleased HBASE-4127 Don't modify table's name away in HBaseAdmin HBASE-4105 Stargate does not support Content-Type: application/json and Content-Encoding: gzip in parallel + HBASE-4116 [stargate] StringIndexOutOfBoundsException in row spec parse + (Allan Yan) IMPROVEMENTS HBASE-3290 Max Compaction Size (Nicolas Spiegelberg via Stack) diff --git a/src/main/java/org/apache/hadoop/hbase/rest/RowSpec.java b/src/main/java/org/apache/hadoop/hbase/rest/RowSpec.java index 4b1610cdde1..93d0ed1adeb 100644 --- a/src/main/java/org/apache/hadoop/hbase/rest/RowSpec.java +++ b/src/main/java/org/apache/hadoop/hbase/rest/RowSpec.java @@ -70,15 +70,15 @@ public class RowSpec { i++; } i++; - startRow = sb.toString(); + String row = startRow = sb.toString(); int idx = startRow.indexOf(','); if (idx != -1) { - startRow = URLDecoder.decode(startRow.substring(0, idx), + startRow = URLDecoder.decode(row.substring(0, idx), HConstants.UTF8_ENCODING); - endRow = URLDecoder.decode(startRow.substring(idx + 1), + endRow = URLDecoder.decode(row.substring(idx + 1), HConstants.UTF8_ENCODING); } else { - startRow = URLDecoder.decode(startRow, HConstants.UTF8_ENCODING); + startRow = URLDecoder.decode(row, HConstants.UTF8_ENCODING); } } catch (IndexOutOfBoundsException e) { throw new IllegalArgumentException(e); diff --git a/src/test/java/org/apache/hadoop/hbase/rest/TestRowResource.java b/src/test/java/org/apache/hadoop/hbase/rest/TestRowResource.java index adaf5497ba9..214b2273d77 100644 --- a/src/test/java/org/apache/hadoop/hbase/rest/TestRowResource.java +++ b/src/test/java/org/apache/hadoop/hbase/rest/TestRowResource.java @@ -46,6 +46,7 @@ import org.apache.hadoop.hbase.rest.model.RowModel; import org.apache.hadoop.hbase.util.Bytes; import static org.junit.Assert.*; + import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -141,6 +142,20 @@ public class TestRowResource { return getValueXML(path.toString()); } + private static Response getValueXML(String table, String startRow, + String endRow, String column) throws IOException { + StringBuilder path = new StringBuilder(); + path.append('/'); + path.append(table); + path.append('/'); + path.append(startRow); + path.append(","); + path.append(endRow); + path.append('/'); + path.append(column); + return getValueXML(path.toString()); + } + private static Response getValueXML(String url) throws IOException { Response response = client.get(url, Constants.MIMETYPE_XML); return response; @@ -483,4 +498,32 @@ public class TestRowResource { response = deleteRow(TABLE, ROW_2); assertEquals(response.getCode(), 200); } + + @Test + public void testStartEndRowGetPutXML() throws IOException, JAXBException { + String[] rows = { ROW_1, ROW_2, ROW_3 }; + String[] values = { VALUE_1, VALUE_2, VALUE_3 }; + Response response = null; + for (int i = 0; i < rows.length; i++) { + response = putValueXML(TABLE, rows[i], COLUMN_1, values[i]); + assertEquals(200, response.getCode()); + checkValueXML(TABLE, rows[i], COLUMN_1, values[i]); + } + response = getValueXML(TABLE, rows[0], rows[2], COLUMN_1); + assertEquals(200, response.getCode()); + CellSetModel cellSet = (CellSetModel) + unmarshaller.unmarshal(new ByteArrayInputStream(response.getBody())); + assertEquals(2, cellSet.getRows().size()); + for (int i = 0; i < cellSet.getRows().size()-1; i++) { + RowModel rowModel = cellSet.getRows().get(i); + for (CellModel cell: rowModel.getCells()) { + assertEquals(COLUMN_1, Bytes.toString(cell.getColumn())); + assertEquals(values[i], Bytes.toString(cell.getValue())); + } + } + for (String row : rows) { + response = deleteRow(TABLE, row); + assertEquals(200, response.getCode()); + } + } }