use of org.apache.geode.rest.internal.web.controllers.support.RegionData in project geode by apache.
the class PdxBasedCrudController method read.
/**
* Reading data for set of keys
*
* @param region gemfire region name
* @param keys string containing comma seperated keys
* @return JSON document
*/
@RequestMapping(method = RequestMethod.GET, value = "/{region}/{keys}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@ApiOperation(value = "read data for specific keys", notes = "Read data for specific set of keys in region.", response = void.class)
@ApiResponses({ @ApiResponse(code = 200, message = "OK."), @ApiResponse(code = 400, message = "Bad Request."), @ApiResponse(code = 401, message = "Invalid Username or Password."), @ApiResponse(code = 403, message = "Insufficient privileges for operation."), @ApiResponse(code = 404, message = "Region does not exist."), @ApiResponse(code = 500, message = "GemFire throws an error or exception.") })
@PreAuthorize("@securityService.authorize('READ', #region, #keys)")
public ResponseEntity<?> read(@PathVariable("region") String region, @PathVariable("keys") final String[] keys, @RequestParam(value = "ignoreMissingKey", required = false) final String ignoreMissingKey) {
logger.debug("Reading data for keys ({}) in Region ({})", ArrayUtils.toString(keys), region);
final HttpHeaders headers = new HttpHeaders();
region = decode(region);
if (keys.length == 1) {
/* GET op on single key */
Object value = getValue(region, keys[0]);
// if region.get(K) return null (i.e INVLD or TOMBSTONE case) We consider 404, NOT Found case
if (value == null) {
throw new ResourceNotFoundException(String.format("Key (%1$s) does not exist for region (%2$s) in cache!", keys[0], region));
}
final RegionEntryData<Object> data = new RegionEntryData<>(region);
headers.set("Content-Location", toUri(region, keys[0]).toASCIIString());
data.add(value);
return new ResponseEntity<RegionData<?>>(data, headers, HttpStatus.OK);
} else {
// fail fast for the case where ignoreMissingKey param is not specified correctly.
if (ignoreMissingKey != null && !(ignoreMissingKey.equalsIgnoreCase("true") || ignoreMissingKey.equalsIgnoreCase("false"))) {
String errorMessage = String.format("ignoreMissingKey param (%1$s) is not valid. valid usage is ignoreMissingKey=true!", ignoreMissingKey);
return new ResponseEntity<>(convertErrorAsJson(errorMessage), HttpStatus.BAD_REQUEST);
}
if (!("true".equalsIgnoreCase(ignoreMissingKey))) {
List<String> unknownKeys = checkForMultipleKeysExist(region, keys);
if (unknownKeys.size() > 0) {
String unknownKeysAsStr = StringUtils.collectionToDelimitedString(unknownKeys, ",");
String erroString = String.format("Requested keys (%1$s) not exist in region (%2$s)", StringUtils.collectionToDelimitedString(unknownKeys, ","), region);
return new ResponseEntity<>(convertErrorAsJson(erroString), headers, HttpStatus.BAD_REQUEST);
}
}
final Map<Object, Object> valueObjs = getValues(region, keys);
// Do we need to remove null values from Map..?
// To Remove null value entries from map.
// valueObjs.values().removeAll(Collections.singleton(null));
// currently we are not removing keys having value null from the result.
String keyList = StringUtils.collectionToDelimitedString(valueObjs.keySet(), ",");
headers.set("Content-Location", toUri(region, keyList).toASCIIString());
final RegionData<Object> data = new RegionData<>(region);
data.add(valueObjs.values());
return new ResponseEntity<RegionData<?>>(data, headers, HttpStatus.OK);
}
}
use of org.apache.geode.rest.internal.web.controllers.support.RegionData in project geode by apache.
the class PdxBasedCrudController method read.
/**
* Read all or fixed number of data in a given Region
*
* @param region gemfire region name
* @param limit total number of entries requested
* @return JSON document
*/
@RequestMapping(method = RequestMethod.GET, value = "/{region}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@ApiOperation(value = "read all data for region", notes = "Read all data for region. Use limit param to get fixed or limited number of entries.", response = void.class)
@ApiResponses({ @ApiResponse(code = 200, message = "OK."), @ApiResponse(code = 400, message = "Bad request."), @ApiResponse(code = 401, message = "Invalid Username or Password."), @ApiResponse(code = 403, message = "Insufficient privileges for operation."), @ApiResponse(code = 404, message = "Region does not exist."), @ApiResponse(code = 500, message = "GemFire throws an error or exception.") })
@PreAuthorize("@securityService.authorize('DATA', 'READ', #region)")
public ResponseEntity<?> read(@PathVariable("region") String region, @RequestParam(value = "limit", defaultValue = DEFAULT_GETALL_RESULT_LIMIT) final String limit) {
logger.debug("Reading all data in Region ({})...", region);
region = decode(region);
Map<Object, Object> valueObjs = null;
final RegionData<Object> data = new RegionData<>(region);
final HttpHeaders headers = new HttpHeaders();
String keyList = null;
int regionSize = getRegion(region).size();
List<Object> keys = new ArrayList<>(regionSize);
List<Object> values = new ArrayList<>(regionSize);
for (Map.Entry<Object, Object> entry : getValues(region).entrySet()) {
Object value = entry.getValue();
if (value != null) {
keys.add(entry.getKey());
values.add(value);
}
}
if ("ALL".equalsIgnoreCase(limit)) {
data.add(values);
keyList = StringUtils.collectionToDelimitedString(keys, ",");
} else {
try {
int maxLimit = Integer.valueOf(limit);
if (maxLimit < 0) {
String errorMessage = String.format("Negative limit param (%1$s) is not valid!", maxLimit);
return new ResponseEntity<>(convertErrorAsJson(errorMessage), HttpStatus.BAD_REQUEST);
}
int mapSize = keys.size();
if (maxLimit > mapSize) {
maxLimit = mapSize;
}
data.add(values.subList(0, maxLimit));
keyList = StringUtils.collectionToDelimitedString(keys.subList(0, maxLimit), ",");
} catch (NumberFormatException e) {
// limit param is not specified in proper format. set the HTTPHeader
// for BAD_REQUEST
String errorMessage = String.format("limit param (%1$s) is not valid!", limit);
return new ResponseEntity<>(convertErrorAsJson(errorMessage), HttpStatus.BAD_REQUEST);
}
}
headers.set("Content-Location", toUri(region, keyList).toASCIIString());
return new ResponseEntity<RegionData<?>>(data, headers, HttpStatus.OK);
}
Aggregations