HBASE-4720 revert until agreement is reached on solution
git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1235388 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
f4872ddd1f
commit
f20083b193
|
@ -1,163 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright The Apache Software Foundation
|
|
||||||
*
|
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
* or more contributor license agreements. See the NOTICE file
|
|
||||||
* distributed with this work for additional information
|
|
||||||
* regarding copyright ownership. The ASF licenses this file
|
|
||||||
* to you under the Apache License, Version 2.0 (the
|
|
||||||
* "License"); you may not use this file except in compliance
|
|
||||||
* with the License. You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.apache.hadoop.hbase.rest;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
import org.apache.hadoop.hbase.KeyValue;
|
|
||||||
import org.apache.hadoop.hbase.client.Delete;
|
|
||||||
import org.apache.hadoop.hbase.client.HTable;
|
|
||||||
import org.apache.hadoop.hbase.client.HTableInterface;
|
|
||||||
import org.apache.hadoop.hbase.client.HTablePool;
|
|
||||||
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 javax.ws.rs.Consumes;
|
|
||||||
import javax.ws.rs.POST;
|
|
||||||
import javax.ws.rs.PUT;
|
|
||||||
import javax.ws.rs.WebApplicationException;
|
|
||||||
import javax.ws.rs.core.Context;
|
|
||||||
import javax.ws.rs.core.Response;
|
|
||||||
import javax.ws.rs.core.UriInfo;
|
|
||||||
import javax.ws.rs.core.Response.ResponseBuilder;
|
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
|
||||||
import org.apache.commons.logging.LogFactory;
|
|
||||||
|
|
||||||
public class CheckAndDeleteRowResource extends ResourceBase {
|
|
||||||
|
|
||||||
private static final Log LOG =
|
|
||||||
LogFactory.getLog(CheckAndDeleteRowResource.class);
|
|
||||||
|
|
||||||
CheckAndDeleteTableResource tableResource;
|
|
||||||
RowSpec rowspec;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*
|
|
||||||
* @param tableResource
|
|
||||||
* @param rowspec
|
|
||||||
* @param versions
|
|
||||||
* @throws IOException
|
|
||||||
*/
|
|
||||||
public CheckAndDeleteRowResource(CheckAndDeleteTableResource tableResource,
|
|
||||||
String rowspec, String versions) throws IOException {
|
|
||||||
super();
|
|
||||||
this.tableResource = tableResource;
|
|
||||||
this.rowspec = new RowSpec(rowspec);
|
|
||||||
if (versions != null) {
|
|
||||||
this.rowspec.setMaxVersions(Integer.valueOf(versions));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Validates the input request parameters, parses columns from CellSetModel,
|
|
||||||
* and invokes checkAndDelete on HTable.
|
|
||||||
*
|
|
||||||
* @param model instance of CellSetModel
|
|
||||||
* @return Response 200 OK, 304 Not modified, 400 Bad request
|
|
||||||
*/
|
|
||||||
Response update(final CellSetModel model) {
|
|
||||||
servlet.getMetrics().incrementRequests(1);
|
|
||||||
if (servlet.isReadOnly()) {
|
|
||||||
throw new WebApplicationException(Response.Status.FORBIDDEN);
|
|
||||||
}
|
|
||||||
HTablePool pool = servlet.getTablePool();
|
|
||||||
HTableInterface table = null;
|
|
||||||
Delete delete = null;
|
|
||||||
try {
|
|
||||||
if (model.getRows().size() != 1) {
|
|
||||||
throw new WebApplicationException(Response.Status.BAD_REQUEST);
|
|
||||||
}
|
|
||||||
RowModel rowModel = model.getRows().get(0);
|
|
||||||
byte[] key = rowModel.getKey();
|
|
||||||
if (key == null) {
|
|
||||||
key = rowspec.getRow();
|
|
||||||
}
|
|
||||||
if (key == null) {
|
|
||||||
throw new WebApplicationException(Response.Status.BAD_REQUEST);
|
|
||||||
}
|
|
||||||
if (rowModel.getCells().size() != 1) {
|
|
||||||
throw new WebApplicationException(Response.Status.BAD_REQUEST);
|
|
||||||
}
|
|
||||||
delete = new Delete(key);
|
|
||||||
|
|
||||||
CellModel valueToDeleteCell = rowModel.getCells().get(0);
|
|
||||||
byte[] valueToDeleteColumn = valueToDeleteCell.getColumn();
|
|
||||||
if (valueToDeleteColumn == null) {
|
|
||||||
try {
|
|
||||||
valueToDeleteColumn = rowspec.getColumns()[0];
|
|
||||||
} catch (final ArrayIndexOutOfBoundsException e) {
|
|
||||||
throw new WebApplicationException(Response.Status.BAD_REQUEST);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
byte[][] parts = KeyValue.parseColumn(valueToDeleteColumn);
|
|
||||||
if (parts.length == 2 && parts[1].length > 0) {
|
|
||||||
delete.deleteColumns(parts[0], parts[1]);
|
|
||||||
} else {
|
|
||||||
throw new WebApplicationException(Response.Status.BAD_REQUEST);
|
|
||||||
}
|
|
||||||
|
|
||||||
table = pool.getTable(tableResource.getName());
|
|
||||||
boolean retValue = table.checkAndDelete(key, parts[0], parts[1],
|
|
||||||
valueToDeleteCell.getValue(), delete);
|
|
||||||
if (LOG.isDebugEnabled()) {
|
|
||||||
LOG.debug("CHECK-AND-DELETE " + delete.toString() + ", returns "
|
|
||||||
+ retValue);
|
|
||||||
}
|
|
||||||
table.flushCommits();
|
|
||||||
ResponseBuilder response = Response.ok();
|
|
||||||
if (!retValue) {
|
|
||||||
response = Response.status(304);
|
|
||||||
}
|
|
||||||
return response.build();
|
|
||||||
} catch (final IOException e) {
|
|
||||||
throw new WebApplicationException(e, Response.Status.SERVICE_UNAVAILABLE);
|
|
||||||
} finally {
|
|
||||||
try {
|
|
||||||
pool.putTable(table);
|
|
||||||
} catch (IOException ioe) {
|
|
||||||
throw new WebApplicationException(ioe,
|
|
||||||
Response.Status.SERVICE_UNAVAILABLE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@PUT
|
|
||||||
@Consumes({ MIMETYPE_XML, MIMETYPE_JSON, MIMETYPE_PROTOBUF })
|
|
||||||
public Response put(final CellSetModel model, final @Context UriInfo uriInfo) {
|
|
||||||
if (LOG.isDebugEnabled()) {
|
|
||||||
LOG.debug("PUT " + uriInfo.getAbsolutePath());
|
|
||||||
}
|
|
||||||
return update(model);
|
|
||||||
}
|
|
||||||
|
|
||||||
@POST
|
|
||||||
@Consumes({ MIMETYPE_XML, MIMETYPE_JSON, MIMETYPE_PROTOBUF })
|
|
||||||
public Response post(final CellSetModel model, final @Context UriInfo uriInfo) {
|
|
||||||
if (LOG.isDebugEnabled()) {
|
|
||||||
LOG.debug("POST " + uriInfo.getAbsolutePath());
|
|
||||||
}
|
|
||||||
return update(model);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,59 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright The Apache Software Foundation
|
|
||||||
*
|
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
* or more contributor license agreements. See the NOTICE file
|
|
||||||
* distributed with this work for additional information
|
|
||||||
* regarding copyright ownership. The ASF licenses this file
|
|
||||||
* to you under the Apache License, Version 2.0 (the
|
|
||||||
* "License"); you may not use this file except in compliance
|
|
||||||
* with the License. You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.apache.hadoop.hbase.rest;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
import javax.ws.rs.QueryParam;
|
|
||||||
import javax.ws.rs.PathParam;
|
|
||||||
import javax.ws.rs.Path;
|
|
||||||
import javax.ws.rs.Encoded;
|
|
||||||
|
|
||||||
public class CheckAndDeleteTableResource extends ResourceBase {
|
|
||||||
|
|
||||||
String table;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*
|
|
||||||
* @param table
|
|
||||||
* @throws IOException
|
|
||||||
*/
|
|
||||||
public CheckAndDeleteTableResource(String table) throws IOException {
|
|
||||||
super();
|
|
||||||
this.table = table;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @return the table name */
|
|
||||||
String getName() {
|
|
||||||
return table;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Path("{rowspec: .+}")
|
|
||||||
public CheckAndDeleteRowResource getCheckAndDeleteRowResource(
|
|
||||||
// We need the @Encoded decorator so Jersey won't urldecode before
|
|
||||||
// the RowSpec constructor has a chance to parse
|
|
||||||
final @PathParam("rowspec") @Encoded String rowspec,
|
|
||||||
final @QueryParam("v") String versions) throws IOException {
|
|
||||||
return new CheckAndDeleteRowResource(this, rowspec, versions);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,176 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright The Apache Software Foundation
|
|
||||||
*
|
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
* or more contributor license agreements. See the NOTICE file
|
|
||||||
* distributed with this work for additional information
|
|
||||||
* regarding copyright ownership. The ASF licenses this file
|
|
||||||
* to you under the Apache License, Version 2.0 (the
|
|
||||||
* "License"); you may not use this file except in compliance
|
|
||||||
* with the License. You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.apache.hadoop.hbase.rest;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
import javax.ws.rs.Consumes;
|
|
||||||
import javax.ws.rs.POST;
|
|
||||||
import javax.ws.rs.PUT;
|
|
||||||
import javax.ws.rs.WebApplicationException;
|
|
||||||
import javax.ws.rs.core.Context;
|
|
||||||
import javax.ws.rs.core.Response;
|
|
||||||
import javax.ws.rs.core.UriInfo;
|
|
||||||
import javax.ws.rs.core.Response.ResponseBuilder;
|
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
|
||||||
import org.apache.commons.logging.LogFactory;
|
|
||||||
|
|
||||||
import org.apache.hadoop.hbase.KeyValue;
|
|
||||||
import org.apache.hadoop.hbase.client.HTable;
|
|
||||||
import org.apache.hadoop.hbase.client.HTableInterface;
|
|
||||||
import org.apache.hadoop.hbase.client.HTablePool;
|
|
||||||
import org.apache.hadoop.hbase.client.Put;
|
|
||||||
import org.apache.hadoop.hbase.rest.model.CellModel;
|
|
||||||
import org.apache.hadoop.hbase.rest.model.CellSetModel;
|
|
||||||
import org.apache.hadoop.hbase.rest.model.RowModel;
|
|
||||||
|
|
||||||
|
|
||||||
public class CheckAndPutRowResource extends ResourceBase {
|
|
||||||
private static final Log LOG = LogFactory
|
|
||||||
.getLog(CheckAndPutRowResource.class);
|
|
||||||
|
|
||||||
CheckAndPutTableResource tableResource;
|
|
||||||
RowSpec rowspec;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*
|
|
||||||
* @param tableResource
|
|
||||||
* @param rowspec
|
|
||||||
* @param versions
|
|
||||||
* @throws IOException
|
|
||||||
*/
|
|
||||||
public CheckAndPutRowResource(CheckAndPutTableResource tableResource,
|
|
||||||
String rowspec, String versions) throws IOException {
|
|
||||||
super();
|
|
||||||
this.tableResource = tableResource;
|
|
||||||
this.rowspec = new RowSpec(rowspec);
|
|
||||||
if (versions != null) {
|
|
||||||
this.rowspec.setMaxVersions(Integer.valueOf(versions));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Validates the input request parameters, parses columns from CellSetModel,
|
|
||||||
* and invokes checkAndPut on HTable.
|
|
||||||
*
|
|
||||||
* @param model instance of CellSetModel
|
|
||||||
* @return Response 200 OK, 304 Not modified, 400 Bad request
|
|
||||||
*/
|
|
||||||
Response update(final CellSetModel model) {
|
|
||||||
servlet.getMetrics().incrementRequests(1);
|
|
||||||
if (servlet.isReadOnly()) {
|
|
||||||
throw new WebApplicationException(Response.Status.FORBIDDEN);
|
|
||||||
}
|
|
||||||
HTablePool pool = servlet.getTablePool();
|
|
||||||
HTableInterface table = null;
|
|
||||||
try {
|
|
||||||
if (model.getRows().size() != 1) {
|
|
||||||
throw new WebApplicationException(Response.Status.BAD_REQUEST);
|
|
||||||
}
|
|
||||||
|
|
||||||
RowModel rowModel = model.getRows().get(0);
|
|
||||||
byte[] key = rowModel.getKey();
|
|
||||||
if (key == null) {
|
|
||||||
key = rowspec.getRow();
|
|
||||||
}
|
|
||||||
if (key == null) {
|
|
||||||
throw new WebApplicationException(Response.Status.BAD_REQUEST);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rowModel.getCells().size() != 2) {
|
|
||||||
throw new WebApplicationException(Response.Status.BAD_REQUEST);
|
|
||||||
}
|
|
||||||
|
|
||||||
Put put = new Put(key);
|
|
||||||
|
|
||||||
CellModel valueToPutCell = rowModel.getCells().get(0);
|
|
||||||
byte[] valueToPutColumn = valueToPutCell.getColumn();
|
|
||||||
if (valueToPutColumn == null) {
|
|
||||||
try {
|
|
||||||
valueToPutColumn = rowspec.getColumns()[0];
|
|
||||||
} catch (final ArrayIndexOutOfBoundsException e) {
|
|
||||||
throw new WebApplicationException(Response.Status.BAD_REQUEST);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
byte[][] valueToPutParts = KeyValue.parseColumn(valueToPutColumn);
|
|
||||||
if (valueToPutParts.length == 2 && valueToPutParts[1].length > 0) {
|
|
||||||
put.add(valueToPutParts[0], valueToPutParts[1], valueToPutCell
|
|
||||||
.getTimestamp(), valueToPutCell.getValue());
|
|
||||||
} else {
|
|
||||||
throw new WebApplicationException(Response.Status.BAD_REQUEST);
|
|
||||||
}
|
|
||||||
|
|
||||||
CellModel valueToCheckCell = rowModel.getCells().get(1);
|
|
||||||
byte[] valueToCheckColumn = valueToCheckCell.getColumn();
|
|
||||||
if (valueToCheckColumn == null) {
|
|
||||||
try {
|
|
||||||
valueToCheckColumn = rowspec.getColumns()[1];
|
|
||||||
} catch (final ArrayIndexOutOfBoundsException e) {
|
|
||||||
throw new WebApplicationException(Response.Status.BAD_REQUEST);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
table = pool.getTable(tableResource.getName());
|
|
||||||
boolean retValue = table.checkAndPut(key, valueToPutParts[0],
|
|
||||||
valueToPutParts[1], valueToCheckCell.getValue(), put);
|
|
||||||
if (LOG.isDebugEnabled()) {
|
|
||||||
LOG.debug("CHECK-AND-PUT " + put.toString() + ", returns " + retValue);
|
|
||||||
}
|
|
||||||
table.flushCommits();
|
|
||||||
ResponseBuilder response = Response.ok();
|
|
||||||
if (!retValue) {
|
|
||||||
response = Response.status(304);
|
|
||||||
}
|
|
||||||
return response.build();
|
|
||||||
} catch (final IOException e) {
|
|
||||||
throw new WebApplicationException(e, Response.Status.SERVICE_UNAVAILABLE);
|
|
||||||
} finally {
|
|
||||||
try {
|
|
||||||
pool.putTable(table);
|
|
||||||
} catch (IOException ioe) {
|
|
||||||
throw new WebApplicationException(ioe,
|
|
||||||
Response.Status.SERVICE_UNAVAILABLE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@PUT
|
|
||||||
@Consumes({ MIMETYPE_XML, MIMETYPE_JSON, MIMETYPE_PROTOBUF })
|
|
||||||
public Response put(final CellSetModel model, final @Context UriInfo uriInfo) {
|
|
||||||
if (LOG.isDebugEnabled()) {
|
|
||||||
LOG.debug("PUT " + uriInfo.getAbsolutePath());
|
|
||||||
}
|
|
||||||
return update(model);
|
|
||||||
}
|
|
||||||
|
|
||||||
@POST
|
|
||||||
@Consumes({ MIMETYPE_XML, MIMETYPE_JSON, MIMETYPE_PROTOBUF })
|
|
||||||
public Response post(final CellSetModel model, final @Context UriInfo uriInfo) {
|
|
||||||
if (LOG.isDebugEnabled()) {
|
|
||||||
LOG.debug("POST " + uriInfo.getAbsolutePath());
|
|
||||||
}
|
|
||||||
return update(model);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,58 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright The Apache Software Foundation
|
|
||||||
*
|
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
* or more contributor license agreements. See the NOTICE file
|
|
||||||
* distributed with this work for additional information
|
|
||||||
* regarding copyright ownership. The ASF licenses this file
|
|
||||||
* to you under the Apache License, Version 2.0 (the
|
|
||||||
* "License"); you may not use this file except in compliance
|
|
||||||
* with the License. You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.apache.hadoop.hbase.rest;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
import javax.ws.rs.QueryParam;
|
|
||||||
import javax.ws.rs.PathParam;
|
|
||||||
import javax.ws.rs.Path;
|
|
||||||
import javax.ws.rs.Encoded;
|
|
||||||
|
|
||||||
public class CheckAndPutTableResource extends ResourceBase {
|
|
||||||
|
|
||||||
String table;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*
|
|
||||||
* @param table
|
|
||||||
* @throws IOException
|
|
||||||
*/
|
|
||||||
public CheckAndPutTableResource(String table) throws IOException {
|
|
||||||
super();
|
|
||||||
this.table = table;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @return the table name */
|
|
||||||
String getName() {
|
|
||||||
return table;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Path("{rowspec: .+}")
|
|
||||||
public CheckAndPutRowResource getCheckAndPutRowResource(
|
|
||||||
// We need the @Encoded decorator so Jersey won't urldecode before
|
|
||||||
// the RowSpec constructor has a chance to parse
|
|
||||||
final @PathParam("rowspec") @Encoded String rowspec,
|
|
||||||
final @QueryParam("v") String versions) throws IOException {
|
|
||||||
return new CheckAndPutRowResource(this, rowspec, versions);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -103,16 +103,4 @@ public class RootResource extends ResourceBase {
|
||||||
final @PathParam("table") String table) throws IOException {
|
final @PathParam("table") String table) throws IOException {
|
||||||
return new TableResource(table);
|
return new TableResource(table);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Path("checkandput/{table}")
|
|
||||||
public CheckAndPutTableResource getCheckAndPutTableResource(
|
|
||||||
final @PathParam("table") String table) throws IOException {
|
|
||||||
return new CheckAndPutTableResource(table);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Path("checkanddelete/{table}")
|
|
||||||
public CheckAndDeleteTableResource getCheckAndDeleteTableResource(
|
|
||||||
final @PathParam("table") String table) throws IOException {
|
|
||||||
return new CheckAndDeleteTableResource(table);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -585,82 +585,12 @@ public class RemoteHTable implements HTableInterface {
|
||||||
|
|
||||||
public boolean checkAndPut(byte[] row, byte[] family, byte[] qualifier,
|
public boolean checkAndPut(byte[] row, byte[] family, byte[] qualifier,
|
||||||
byte[] value, Put put) throws IOException {
|
byte[] value, Put put) throws IOException {
|
||||||
// column to check-the-value
|
throw new IOException("checkAndPut not supported");
|
||||||
put.add(new KeyValue(row, family, qualifier, value));
|
|
||||||
|
|
||||||
CellSetModel model = buildModelFromPut(put);
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
sb.append('/');
|
|
||||||
if (accessToken != null) {
|
|
||||||
sb.append(accessToken);
|
|
||||||
sb.append('/');
|
|
||||||
}
|
|
||||||
sb.append("checkandput");
|
|
||||||
sb.append('/');
|
|
||||||
sb.append(Bytes.toStringBinary(name));
|
|
||||||
sb.append('/');
|
|
||||||
sb.append(Bytes.toStringBinary(put.getRow()));
|
|
||||||
|
|
||||||
for (int i = 0; i < maxRetries; i++) {
|
|
||||||
Response response = client.put(sb.toString(),
|
|
||||||
Constants.MIMETYPE_PROTOBUF, model.createProtobufOutput());
|
|
||||||
int code = response.getCode();
|
|
||||||
switch (code) {
|
|
||||||
case 200:
|
|
||||||
return true;
|
|
||||||
case 304: // NOT-MODIFIED
|
|
||||||
return false;
|
|
||||||
case 509:
|
|
||||||
try {
|
|
||||||
Thread.sleep(sleepTime);
|
|
||||||
} catch (final InterruptedException e) {
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new IOException("checkAndPut request failed with " + code);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
throw new IOException("checkAndPut request timed out");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean checkAndDelete(byte[] row, byte[] family, byte[] qualifier,
|
public boolean checkAndDelete(byte[] row, byte[] family, byte[] qualifier,
|
||||||
byte[] value, Delete delete) throws IOException {
|
byte[] value, Delete delete) throws IOException {
|
||||||
Put put = new Put(row);
|
throw new IOException("checkAndDelete not supported");
|
||||||
// column to check-the-value
|
|
||||||
put.add(new KeyValue(row, family, qualifier, value));
|
|
||||||
CellSetModel model = buildModelFromPut(put);
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
sb.append('/');
|
|
||||||
if (accessToken != null) {
|
|
||||||
sb.append(accessToken);
|
|
||||||
sb.append('/');
|
|
||||||
}
|
|
||||||
sb.append("checkanddelete");
|
|
||||||
sb.append('/');
|
|
||||||
sb.append(Bytes.toStringBinary(name));
|
|
||||||
sb.append('/');
|
|
||||||
sb.append(Bytes.toStringBinary(row));
|
|
||||||
|
|
||||||
for (int i = 0; i < maxRetries; i++) {
|
|
||||||
Response response = client.put(sb.toString(),
|
|
||||||
Constants.MIMETYPE_PROTOBUF, model.createProtobufOutput());
|
|
||||||
int code = response.getCode();
|
|
||||||
switch (code) {
|
|
||||||
case 200:
|
|
||||||
return true;
|
|
||||||
case 304: // NOT-MODIFIED
|
|
||||||
return false;
|
|
||||||
case 509:
|
|
||||||
try {
|
|
||||||
Thread.sleep(sleepTime);
|
|
||||||
} catch (final InterruptedException e) {
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new IOException("checkAndDelete request failed with " + code);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
throw new IOException("checkAndDelete request timed out");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Result increment(Increment increment) throws IOException {
|
public Result increment(Increment increment) throws IOException {
|
||||||
|
|
|
@ -265,129 +265,6 @@ public class TestRowResource {
|
||||||
assertEquals(Bytes.toString(cell.getValue()), value);
|
assertEquals(Bytes.toString(cell.getValue()), value);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Response checkAndPutValuePB(String url, String table,
|
|
||||||
String row, String column, String valueToCheck, String valueToPut)
|
|
||||||
throws IOException {
|
|
||||||
RowModel rowModel = new RowModel(row);
|
|
||||||
rowModel.addCell(new CellModel(Bytes.toBytes(column), Bytes
|
|
||||||
.toBytes(valueToPut)));
|
|
||||||
rowModel.addCell(new CellModel(Bytes.toBytes(column), Bytes
|
|
||||||
.toBytes(valueToCheck)));
|
|
||||||
CellSetModel cellSetModel = new CellSetModel();
|
|
||||||
cellSetModel.addRow(rowModel);
|
|
||||||
Response response = client.put(url, Constants.MIMETYPE_PROTOBUF,
|
|
||||||
cellSetModel.createProtobufOutput());
|
|
||||||
Thread.yield();
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Response checkAndPutValuePB(String table, String row,
|
|
||||||
String column, String valueToCheck, String valueToPut) throws IOException {
|
|
||||||
StringBuilder path = new StringBuilder();
|
|
||||||
path.append('/');
|
|
||||||
path.append("checkandput");
|
|
||||||
path.append('/');
|
|
||||||
path.append(table);
|
|
||||||
path.append('/');
|
|
||||||
path.append(row);
|
|
||||||
path.append('/');
|
|
||||||
path.append(column);
|
|
||||||
return checkAndPutValuePB(path.toString(), table, row, column,
|
|
||||||
valueToCheck, valueToPut);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Response checkAndPutValueXML(String url, String table,
|
|
||||||
String row, String column, String valueToCheck, String valueToPut)
|
|
||||||
throws IOException, JAXBException {
|
|
||||||
RowModel rowModel = new RowModel(row);
|
|
||||||
rowModel.addCell(new CellModel(Bytes.toBytes(column), Bytes
|
|
||||||
.toBytes(valueToPut)));
|
|
||||||
rowModel.addCell(new CellModel(Bytes.toBytes(column), Bytes
|
|
||||||
.toBytes(valueToCheck)));
|
|
||||||
CellSetModel cellSetModel = new CellSetModel();
|
|
||||||
cellSetModel.addRow(rowModel);
|
|
||||||
StringWriter writer = new StringWriter();
|
|
||||||
marshaller.marshal(cellSetModel, writer);
|
|
||||||
Response response = client.put(url, Constants.MIMETYPE_XML,
|
|
||||||
Bytes.toBytes(writer.toString()));
|
|
||||||
Thread.yield();
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Response checkAndPutValueXML(String table, String row,
|
|
||||||
String column, String valueToCheck, String valueToPut)
|
|
||||||
throws IOException, JAXBException {
|
|
||||||
StringBuilder path = new StringBuilder();
|
|
||||||
path.append('/');
|
|
||||||
path.append("checkandput");
|
|
||||||
path.append('/');
|
|
||||||
path.append(table);
|
|
||||||
path.append('/');
|
|
||||||
path.append(row);
|
|
||||||
path.append('/');
|
|
||||||
path.append(column);
|
|
||||||
return checkAndPutValueXML(path.toString(), table, row, column,
|
|
||||||
valueToCheck, valueToPut);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Response checkAndDeleteXML(String url, String table,
|
|
||||||
String row, String column, String valueToCheck) throws IOException,
|
|
||||||
JAXBException {
|
|
||||||
RowModel rowModel = new RowModel(row);
|
|
||||||
rowModel.addCell(new CellModel(Bytes.toBytes(column), Bytes
|
|
||||||
.toBytes(valueToCheck)));
|
|
||||||
CellSetModel cellSetModel = new CellSetModel();
|
|
||||||
cellSetModel.addRow(rowModel);
|
|
||||||
StringWriter writer = new StringWriter();
|
|
||||||
marshaller.marshal(cellSetModel, writer);
|
|
||||||
Response response = client.put(url, Constants.MIMETYPE_XML,
|
|
||||||
Bytes.toBytes(writer.toString()));
|
|
||||||
Thread.yield();
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Response checkAndDeleteXML(String table, String row,
|
|
||||||
String column, String valueToCheck) throws IOException, JAXBException {
|
|
||||||
StringBuilder path = new StringBuilder();
|
|
||||||
path.append('/');
|
|
||||||
path.append("checkanddelete");
|
|
||||||
path.append('/');
|
|
||||||
path.append(table);
|
|
||||||
path.append('/');
|
|
||||||
path.append(row);
|
|
||||||
path.append('/');
|
|
||||||
path.append(column);
|
|
||||||
return checkAndDeleteXML(path.toString(), table, row, column, valueToCheck);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Response checkAndDeletePB(String table, String row,
|
|
||||||
String column, String value) throws IOException {
|
|
||||||
StringBuilder path = new StringBuilder();
|
|
||||||
path.append('/');
|
|
||||||
path.append("checkanddelete");
|
|
||||||
path.append('/');
|
|
||||||
path.append(table);
|
|
||||||
path.append('/');
|
|
||||||
path.append(row);
|
|
||||||
path.append('/');
|
|
||||||
path.append(column);
|
|
||||||
return checkAndDeleteValuePB(path.toString(), table, row, column, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Response checkAndDeleteValuePB(String url, String table,
|
|
||||||
String row, String column, String valueToCheck)
|
|
||||||
throws IOException {
|
|
||||||
RowModel rowModel = new RowModel(row);
|
|
||||||
rowModel.addCell(new CellModel(Bytes.toBytes(column), Bytes
|
|
||||||
.toBytes(valueToCheck)));
|
|
||||||
CellSetModel cellSetModel = new CellSetModel();
|
|
||||||
cellSetModel.addRow(rowModel);
|
|
||||||
Response response = client.put(url, Constants.MIMETYPE_PROTOBUF,
|
|
||||||
cellSetModel.createProtobufOutput());
|
|
||||||
Thread.yield();
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testDelete() throws IOException, JAXBException {
|
public void testDelete() throws IOException, JAXBException {
|
||||||
Response response;
|
Response response;
|
||||||
|
@ -405,13 +282,6 @@ public class TestRowResource {
|
||||||
assertEquals(response.getCode(), 404);
|
assertEquals(response.getCode(), 404);
|
||||||
checkValueXML(TABLE, ROW_1, COLUMN_2, VALUE_2);
|
checkValueXML(TABLE, ROW_1, COLUMN_2, VALUE_2);
|
||||||
|
|
||||||
response = putValueXML(TABLE, ROW_1, COLUMN_1, VALUE_1);
|
|
||||||
assertEquals(response.getCode(), 200);
|
|
||||||
response = checkAndDeletePB(TABLE, ROW_1, COLUMN_1, VALUE_1);
|
|
||||||
assertEquals(response.getCode(), 200);
|
|
||||||
response = getValueXML(TABLE, ROW_1, COLUMN_1);
|
|
||||||
assertEquals(response.getCode(), 404);
|
|
||||||
|
|
||||||
response = deleteRow(TABLE, ROW_1);
|
response = deleteRow(TABLE, ROW_1);
|
||||||
assertEquals(response.getCode(), 200);
|
assertEquals(response.getCode(), 200);
|
||||||
response = getValueXML(TABLE, ROW_1, COLUMN_1);
|
response = getValueXML(TABLE, ROW_1, COLUMN_1);
|
||||||
|
@ -430,14 +300,8 @@ public class TestRowResource {
|
||||||
assertEquals(response.getCode(), 403);
|
assertEquals(response.getCode(), 403);
|
||||||
response = putValuePB(TABLE, ROW_1, COLUMN_1, VALUE_1);
|
response = putValuePB(TABLE, ROW_1, COLUMN_1, VALUE_1);
|
||||||
assertEquals(response.getCode(), 403);
|
assertEquals(response.getCode(), 403);
|
||||||
response = checkAndPutValueXML(TABLE, ROW_1, COLUMN_1, VALUE_1, VALUE_2);
|
|
||||||
assertEquals(response.getCode(), 403);
|
|
||||||
response = checkAndPutValuePB(TABLE, ROW_1, COLUMN_1, VALUE_1, VALUE_2);
|
|
||||||
assertEquals(response.getCode(), 403);
|
|
||||||
response = deleteValue(TABLE, ROW_1, COLUMN_1);
|
response = deleteValue(TABLE, ROW_1, COLUMN_1);
|
||||||
assertEquals(response.getCode(), 403);
|
assertEquals(response.getCode(), 403);
|
||||||
response = checkAndDeletePB(TABLE, ROW_1, COLUMN_1, VALUE_1);
|
|
||||||
assertEquals(response.getCode(), 403);
|
|
||||||
response = deleteRow(TABLE, ROW_1);
|
response = deleteRow(TABLE, ROW_1);
|
||||||
assertEquals(response.getCode(), 403);
|
assertEquals(response.getCode(), 403);
|
||||||
|
|
||||||
|
@ -447,10 +311,6 @@ public class TestRowResource {
|
||||||
assertEquals(response.getCode(), 200);
|
assertEquals(response.getCode(), 200);
|
||||||
response = putValuePB(TABLE, ROW_1, COLUMN_1, VALUE_1);
|
response = putValuePB(TABLE, ROW_1, COLUMN_1, VALUE_1);
|
||||||
assertEquals(response.getCode(), 200);
|
assertEquals(response.getCode(), 200);
|
||||||
response = checkAndPutValueXML(TABLE, ROW_1, COLUMN_1, VALUE_1, VALUE_2);
|
|
||||||
assertEquals(response.getCode(), 200);
|
|
||||||
response = checkAndPutValuePB(TABLE, ROW_1, COLUMN_1, VALUE_2, VALUE_3);
|
|
||||||
assertEquals(response.getCode(), 200);
|
|
||||||
response = deleteValue(TABLE, ROW_1, COLUMN_1);
|
response = deleteValue(TABLE, ROW_1, COLUMN_1);
|
||||||
assertEquals(response.getCode(), 200);
|
assertEquals(response.getCode(), 200);
|
||||||
response = deleteRow(TABLE, ROW_1);
|
response = deleteRow(TABLE, ROW_1);
|
||||||
|
@ -468,11 +328,6 @@ public class TestRowResource {
|
||||||
response = putValueXML(TABLE, ROW_1, COLUMN_1, VALUE_2);
|
response = putValueXML(TABLE, ROW_1, COLUMN_1, VALUE_2);
|
||||||
assertEquals(response.getCode(), 200);
|
assertEquals(response.getCode(), 200);
|
||||||
checkValueXML(TABLE, ROW_1, COLUMN_1, VALUE_2);
|
checkValueXML(TABLE, ROW_1, COLUMN_1, VALUE_2);
|
||||||
response = checkAndPutValueXML(TABLE, ROW_1, COLUMN_1, VALUE_2, VALUE_3);
|
|
||||||
assertEquals(response.getCode(), 200);
|
|
||||||
checkValueXML(TABLE, ROW_1, COLUMN_1, VALUE_3);
|
|
||||||
response = checkAndDeleteXML(TABLE, ROW_1, COLUMN_1, VALUE_3);
|
|
||||||
assertEquals(response.getCode(), 200);
|
|
||||||
|
|
||||||
response = deleteRow(TABLE, ROW_1);
|
response = deleteRow(TABLE, ROW_1);
|
||||||
assertEquals(response.getCode(), 200);
|
assertEquals(response.getCode(), 200);
|
||||||
|
@ -494,13 +349,6 @@ public class TestRowResource {
|
||||||
assertEquals(response.getCode(), 200);
|
assertEquals(response.getCode(), 200);
|
||||||
checkValuePB(TABLE, ROW_1, COLUMN_1, VALUE_2);
|
checkValuePB(TABLE, ROW_1, COLUMN_1, VALUE_2);
|
||||||
|
|
||||||
response = checkAndPutValuePB(TABLE, ROW_1, COLUMN_1, VALUE_2, VALUE_3);
|
|
||||||
assertEquals(response.getCode(), 200);
|
|
||||||
checkValuePB(TABLE, ROW_1, COLUMN_1, VALUE_3);
|
|
||||||
response = checkAndPutValueXML(TABLE, ROW_1, COLUMN_1, VALUE_3, VALUE_4);
|
|
||||||
assertEquals(response.getCode(), 200);
|
|
||||||
checkValuePB(TABLE, ROW_1, COLUMN_1, VALUE_4);
|
|
||||||
|
|
||||||
response = deleteRow(TABLE, ROW_1);
|
response = deleteRow(TABLE, ROW_1);
|
||||||
assertEquals(response.getCode(), 200);
|
assertEquals(response.getCode(), 200);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue