You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by jd...@apache.org on 2011/03/25 01:33:09 UTC
svn commit: r1085217 - in /hbase/trunk/src:
main/java/org/apache/hadoop/hbase/rest/MultiRowResource.java
test/java/org/apache/hadoop/hbase/rest/TestMultiRowResource.java
Author: jdcryans
Date: Fri Mar 25 00:33:08 2011
New Revision: 1085217
URL: http://svn.apache.org/viewvc?rev=1085217&view=rev
Log:
Adding the files missing from HBASE-3541
Added:
hbase/trunk/src/main/java/org/apache/hadoop/hbase/rest/MultiRowResource.java
hbase/trunk/src/test/java/org/apache/hadoop/hbase/rest/TestMultiRowResource.java
Added: hbase/trunk/src/main/java/org/apache/hadoop/hbase/rest/MultiRowResource.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/rest/MultiRowResource.java?rev=1085217&view=auto
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/rest/MultiRowResource.java (added)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/rest/MultiRowResource.java Fri Mar 25 00:33:08 2011
@@ -0,0 +1,88 @@
+package org.apache.hadoop.hbase.rest;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.hbase.KeyValue;
+import org.apache.hadoop.hbase.rest.ResourceBase;
+import org.apache.hadoop.hbase.rest.RowSpec;
+import org.apache.hadoop.hbase.rest.TableResource;
+import org.apache.hadoop.hbase.rest.model.CellModel;
+import org.apache.hadoop.hbase.rest.model.CellSetModel;
+import org.apache.hadoop.hbase.rest.model.RowModel;
+import org.apache.hadoop.hbase.rest.transform.Transform;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Produces;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import java.io.IOException;
+import java.util.ArrayList;
+
+public class MultiRowResource extends ResourceBase {
+ private static final Log LOG = LogFactory.getLog(MultiRowResource.class);
+ public static final String ROW_KEYS_PARAM_NAME = "row";
+
+ TableResource tableResource;
+ Integer versions = null;
+
+ /**
+ * Constructor
+ *
+ * @param tableResource
+ * @param versions
+ * @throws java.io.IOException
+ */
+ public MultiRowResource(TableResource tableResource, String versions) throws IOException {
+ super();
+ this.tableResource = tableResource;
+
+ if (versions != null) {
+ this.versions = Integer.valueOf(versions);
+
+ }
+ }
+
+ @GET
+ @Produces({MIMETYPE_XML, MIMETYPE_JSON, MIMETYPE_PROTOBUF})
+ public Response get(final @Context UriInfo uriInfo) {
+ MultivaluedMap<String, String> params = uriInfo.getQueryParameters();
+
+ servlet.getMetrics().incrementRequests(1);
+ try {
+ CellSetModel model = new CellSetModel();
+ for (String rk : params.get(ROW_KEYS_PARAM_NAME)) {
+ RowSpec rowSpec = new RowSpec(rk);
+
+ if (this.versions != null) {
+ rowSpec.setMaxVersions(this.versions);
+ }
+
+ ResultGenerator generator = ResultGenerator.fromRowSpec(this.tableResource.getName(), rowSpec, null);
+ if (!generator.hasNext()) {
+ throw new WebApplicationException(Response.Status.NOT_FOUND);
+ }
+
+ KeyValue value = null;
+ RowModel rowModel = new RowModel(rk);
+
+
+ while ((value = generator.next()) != null) {
+ byte[] family = value.getFamily();
+ byte[] qualifier = value.getQualifier();
+ byte[] data = tableResource.transform(family, qualifier, value.getValue(), Transform.Direction.OUT);
+ rowModel.addCell(new CellModel(family, qualifier, value.getTimestamp(), data));
+ }
+
+ model.addRow(rowModel);
+ }
+ return Response.ok(model).build();
+ } catch (IOException e) {
+ throw new WebApplicationException(e,
+ Response.Status.SERVICE_UNAVAILABLE);
+ }
+
+ }
+}
Added: hbase/trunk/src/test/java/org/apache/hadoop/hbase/rest/TestMultiRowResource.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/test/java/org/apache/hadoop/hbase/rest/TestMultiRowResource.java?rev=1085217&view=auto
==============================================================================
--- hbase/trunk/src/test/java/org/apache/hadoop/hbase/rest/TestMultiRowResource.java (added)
+++ hbase/trunk/src/test/java/org/apache/hadoop/hbase/rest/TestMultiRowResource.java Fri Mar 25 00:33:08 2011
@@ -0,0 +1,151 @@
+package org.apache.hadoop.hbase.rest;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.HBaseTestingUtility;
+import org.apache.hadoop.hbase.HColumnDescriptor;
+import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.client.HBaseAdmin;
+import org.apache.hadoop.hbase.rest.client.Client;
+import org.apache.hadoop.hbase.rest.client.Cluster;
+import org.apache.hadoop.hbase.rest.client.Response;
+import org.apache.hadoop.hbase.rest.model.CellModel;
+import org.apache.hadoop.hbase.rest.model.CellSetModel;
+import org.apache.hadoop.hbase.rest.model.RowModel;
+import org.apache.hadoop.hbase.util.Bytes;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+
+
+public class TestMultiRowResource {
+
+ private static final String TABLE = "TestRowResource";
+ private static final String CFA = "a";
+ private static final String CFB = "b";
+ private static final String COLUMN_1 = CFA + ":1";
+ private static final String COLUMN_2 = CFB + ":2";
+ private static final String ROW_1 = "testrow5";
+ private static final String VALUE_1 = "testvalue5";
+ private static final String ROW_2 = "testrow6";
+ private static final String VALUE_2 = "testvalue6";
+
+
+ private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
+ private static final HBaseRESTTestingUtility REST_TEST_UTIL = new HBaseRESTTestingUtility();
+
+ private static Client client;
+ private static JAXBContext context;
+ private static Marshaller marshaller;
+ private static Unmarshaller unmarshaller;
+ private static Configuration conf;
+
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ conf = TEST_UTIL.getConfiguration();
+ TEST_UTIL.startMiniCluster(3);
+ REST_TEST_UTIL.startServletContainer(conf);
+ context = JAXBContext.newInstance(
+ CellModel.class,
+ CellSetModel.class,
+ RowModel.class);
+ marshaller = context.createMarshaller();
+ unmarshaller = context.createUnmarshaller();
+ client = new Client(new Cluster().add("localhost", REST_TEST_UTIL.getServletPort()));
+ HBaseAdmin admin = TEST_UTIL.getHBaseAdmin();
+ if (admin.tableExists(TABLE)) {
+ return;
+ }
+ HTableDescriptor htd = new HTableDescriptor(TABLE);
+ htd.addFamily(new HColumnDescriptor(CFA));
+ htd.addFamily(new HColumnDescriptor(CFB));
+ admin.createTable(htd);
+ }
+
+ @AfterClass
+ public static void tearDownAfterClass() throws Exception {
+ REST_TEST_UTIL.shutdownServletContainer();
+ TEST_UTIL.shutdownMiniCluster();
+ }
+
+
+ @Test
+ public void testMultiCellGetJSON() throws IOException, JAXBException {
+ String row_5_url = "/" + TABLE + "/" + ROW_1 + "/" + COLUMN_1;
+ String row_6_url = "/" + TABLE + "/" + ROW_2 + "/" + COLUMN_2;
+
+
+ StringBuilder path = new StringBuilder();
+ path.append("/");
+ path.append(TABLE);
+ path.append("/multiget/?row=");
+ path.append(ROW_1);
+ path.append("&row=");
+ path.append(ROW_2);
+
+ client.post(row_5_url, Constants.MIMETYPE_BINARY, Bytes.toBytes(VALUE_1));
+ client.post(row_6_url, Constants.MIMETYPE_BINARY, Bytes.toBytes(VALUE_2));
+
+
+ Response response = client.get(path.toString(), Constants.MIMETYPE_JSON);
+ assertEquals(response.getCode(), 200);
+
+ client.delete(row_5_url);
+ client.delete(row_6_url);
+
+ }
+
+ @Test
+ public void testMultiCellGetXML() throws IOException, JAXBException {
+ String row_5_url = "/" + TABLE + "/" + ROW_1 + "/" + COLUMN_1;
+ String row_6_url = "/" + TABLE + "/" + ROW_2 + "/" + COLUMN_2;
+
+
+ StringBuilder path = new StringBuilder();
+ path.append("/");
+ path.append(TABLE);
+ path.append("/multiget/?row=");
+ path.append(ROW_1);
+ path.append("&row=");
+ path.append(ROW_2);
+
+ client.post(row_5_url, Constants.MIMETYPE_BINARY, Bytes.toBytes(VALUE_1));
+ client.post(row_6_url, Constants.MIMETYPE_BINARY, Bytes.toBytes(VALUE_2));
+
+
+ Response response = client.get(path.toString(), Constants.MIMETYPE_XML);
+ assertEquals(response.getCode(), 200);
+
+ client.delete(row_5_url);
+ client.delete(row_6_url);
+
+ }
+
+ @Test
+ public void testMultiCellGetJSONNotFound() throws IOException {
+ String row_5_url = "/" + TABLE + "/" + ROW_1 + "/" + COLUMN_1;
+
+ StringBuilder path = new StringBuilder();
+ path.append("/");
+ path.append(TABLE);
+ path.append("/multiget/?row=");
+ path.append(ROW_1);
+ path.append("&row=");
+ path.append(ROW_2);
+
+ client.post(row_5_url, Constants.MIMETYPE_BINARY, Bytes.toBytes(VALUE_1));
+
+ Response response = client.get(path.toString(), Constants.MIMETYPE_JSON);
+
+ assertEquals(response.getCode(), 404);
+
+ }
+}