package org.infinispan.server.hotrod;
import java.util.Iterator;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import org.infinispan.CacheSet;
import org.infinispan.commons.util.Util;
import org.infinispan.remoting.transport.Address;
import org.infinispan.server.hotrod.iteration.IterableIterationResult;
/**
* A basic responses. The rest of this file contains other response types.
*
* @author Galder ZamarreƱo
* @since 4.1
*/
public abstract class Response {
protected final byte version;
protected final long messageId;
protected final String cacheName;
protected final short clientIntel;
protected final HotRodOperation operation;
protected final OperationStatus status;
protected final int topologyId;
protected Response(byte version, long messageId, String cacheName, short clientIntel, HotRodOperation operation, OperationStatus status, int topologyId) {
this.version = version;
this.messageId = messageId;
this.cacheName = cacheName;
this.clientIntel = clientIntel;
this.operation = operation;
this.status = status;
this.topologyId = topologyId;
}
public byte getVersion() {
return version;
}
public long getMessageId() {
return messageId;
}
public String getCacheName() {
return cacheName;
}
public short getClientIntel() {
return clientIntel;
}
public HotRodOperation getOperation() {
return operation;
}
public OperationStatus getStatus() {
return status;
}
public int getTopologyId() {
return topologyId;
}
@Override
public String toString() {
return "Response{" +
"version=" + version +
", messageId=" + messageId +
", cacheName='" + cacheName + '\'' +
", clientIntel=" + clientIntel +
", operation=" + operation +
", status=" + status +
", topologyId=" + topologyId +
'}';
}
}
class ResponseWithPrevious extends Response {
protected final Optional<byte[]> previous;
ResponseWithPrevious(byte version, long messageId, String cacheName, short clientIntel, HotRodOperation operation,
OperationStatus status, int topologyId, Optional<byte[]> previous) {
super(version, messageId, cacheName, clientIntel, operation, status, topologyId);
this.previous = previous;
}
@Override
public String toString() {
return "ResponseWithPrevious{" +
"version=" + version +
", messageId=" + messageId +
", cacheName='" + cacheName + '\'' +
", clientIntel=" + clientIntel +
", operation=" + operation +
", status=" + status +
", topologyId=" + topologyId +
", previous=" + Util.printArray(previous.orElse(null), true) +
'}';
}
}
class GetResponse extends Response {
protected final byte[] data;
GetResponse(byte version, long messageId, String cacheName, short clientIntel, HotRodOperation operation,
OperationStatus status, int topologyId, byte[] data) {
super(version, messageId, cacheName, clientIntel, operation, status, topologyId);
this.data = data;
}
@Override
public String toString() {
return "GetResponse{" +
"version=" + version +
", messageId=" + messageId +
", cacheName='" + cacheName + '\'' +
", clientIntel=" + clientIntel +
", operation=" + operation +
", status=" + status +
", topologyId=" + topologyId +
", data=" + Util.printArray(data, true) +
'}';
}
}
class BulkGetResponse extends Response {
protected final int count;
protected final CacheSet<Map.Entry<byte[], byte[]>> entries;
BulkGetResponse(byte version, long messageId, String cacheName, short clientIntel, int topologyId, int count,
CacheSet<Map.Entry<byte[], byte[]>> entries) {
super(version, messageId, cacheName, clientIntel, HotRodOperation.BULK_GET, OperationStatus.Success, topologyId);
this.count = count;
this.entries = entries;
}
@Override
public String toString() {
return "BulkGetResponse{" +
"version=" + version +
", messageId=" + messageId +
", cacheName='" + cacheName + '\'' +
", clientIntel=" + clientIntel +
", operation=" + operation +
", status=" + status +
", topologyId=" + topologyId +
", count=" + count +
", entries=" + entries +
'}';
}
}
class BulkGetKeysResponse extends Response {
protected final int scope;
protected final Iterator<byte[]> iterator;
BulkGetKeysResponse(byte version, long messageId, String cacheName, short clientIntel, int topologyId, int scope,
Iterator<byte[]> iterator) {
super(version, messageId, cacheName, clientIntel, HotRodOperation.BULK_GET_KEYS, OperationStatus.Success,
topologyId);
this.scope = scope;
this.iterator = iterator;
}
@Override
public String toString() {
return "BulkGetKeysResponse{" +
"version=" + version +
", messageId=" + messageId +
", cacheName='" + cacheName + '\'' +
", clientIntel=" + clientIntel +
", operation=" + operation +
", status=" + status +
", topologyId=" + topologyId +
", scope=" + scope +
'}';
}
}
class GetAllResponse extends Response {
protected final Map<byte[], byte[]> entries;
GetAllResponse(byte version, long messageId, String cacheName, short clientIntel, int topologyId,
Map<byte[], byte[]> entries) {
super(version, messageId, cacheName, clientIntel, HotRodOperation.GET_ALL, OperationStatus.Success, topologyId);
this.entries = entries;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder().append("GetAllResponse").append("{")
.append("version=").append(version)
.append(", messageId=").append(messageId)
.append(", operation=").append(operation)
.append(", status=").append(status)
.append(", entries=[");
entries.forEach((k, v) -> {
sb.append(Util.printArray(k, true));
sb.append('=');
sb.append(Util.printArray(v, true));
});
return sb.append("]}").toString();
}
}
class IterationStartResponse extends Response {
protected final String iterationId;
IterationStartResponse(byte version, long messageId, String cacheName, short clientIntel, int topologyId,
String iterationId) {
super(version, messageId, cacheName, clientIntel, HotRodOperation.ITERATION_START, OperationStatus.Success, topologyId);
this.iterationId = iterationId;
}
@Override
public String toString() {
return "IterationStartResponse{" +
"version=" + version +
", messageId=" + messageId +
", cacheName='" + cacheName + '\'' +
", clientIntel=" + clientIntel +
", operation=" + operation +
", status=" + status +
", topologyId=" + topologyId +
", iterationId=" + iterationId +
'}';
}
}
class IterationNextResponse extends Response {
protected final IterableIterationResult iterationResult;
IterationNextResponse(byte version, long messageId, String cacheName, short clientIntel, int topologyId,
IterableIterationResult iterationResult) {
super(version, messageId, cacheName, clientIntel, HotRodOperation.ITERATION_NEXT,
iterationResult.getStatusCode(), topologyId);
this.iterationResult = iterationResult;
}
@Override
public String toString() {
return "IterationNextResponse{" +
"version=" + version +
", messageId=" + messageId +
", cacheName='" + cacheName + '\'' +
", clientIntel=" + clientIntel +
", operation=" + operation +
", status=" + status +
", topologyId=" + topologyId +
'}';
}
}
class EmptyResponse extends Response {
protected EmptyResponse(byte version, long messageId, String cacheName, short clientIntel, HotRodOperation operation, OperationStatus status, int topologyId) {
super(version, messageId, cacheName, clientIntel, operation, status, topologyId);
}
@Override
public String toString() {
return "EmptyResponse{" +
"version=" + version +
", messageId=" + messageId +
", cacheName='" + cacheName + '\'' +
", clientIntel=" + clientIntel +
", operation=" + operation +
", status=" + status +
", topologyId=" + topologyId +
'}';
}
}
class GetWithVersionResponse extends GetResponse {
protected final long dataVersion;
GetWithVersionResponse(byte version, long messageId, String cacheName, short clientIntel, HotRodOperation operation,
OperationStatus status, int topologyId, byte[] data, long dataVersion) {
super(version, messageId, cacheName, clientIntel, operation, status, topologyId, data);
this.dataVersion = dataVersion;
}
@Override
public String toString() {
return "GetWithVersionResponse{" +
"version=" + version +
", messageId=" + messageId +
", cacheName='" + cacheName + '\'' +
", clientIntel=" + clientIntel +
", operation=" + operation +
", status=" + status +
", topologyId=" + topologyId +
", data=" + Util.printArray(data, true) +
", dataVersion=" + dataVersion +
'}';
}
}
class GetWithMetadataResponse extends GetResponse {
protected final long dataVersion;
protected final long created;
protected final int lifespan;
protected final long lastUsed;
protected final int maxIdle;
GetWithMetadataResponse(byte version, long messageId, String cacheName, short clientIntel, HotRodOperation operation,
OperationStatus status, int topologyId, byte[] data, long dataVersion, long created, int lifespan,
long lastUsed, int maxIdle) {
super(version, messageId, cacheName, clientIntel, operation, status, topologyId, data);
this.dataVersion = dataVersion;
this.created = created;
this.lifespan = lifespan;
this.lastUsed = lastUsed;
this.maxIdle = maxIdle;
}
GetWithMetadataResponse(byte version, long messageId, String cacheName, short clientIntel, HotRodOperation operation,
OperationStatus status, int topologyId) {
this(version, messageId, cacheName, clientIntel, operation, status, topologyId, null, -1, -1, -1, -1, -1);
}
@Override
public String toString() {
return "GetWithMetadataResponse{" +
"version=" + version +
", messageId=" + messageId +
", cacheName='" + cacheName + '\'' +
", clientIntel=" + clientIntel +
", operation=" + operation +
", status=" + status +
", topologyId=" + topologyId +
", data=" + Util.printArray(data, true) +
", dataVersion=" + dataVersion +
", created=" + created +
", lifespan=" + lifespan +
", lastUsed=" + lastUsed +
", maxIdle=" + maxIdle +
'}';
}
}
class GetStreamResponse extends GetWithMetadataResponse {
protected final int offset;
GetStreamResponse(byte version, long messageId, String cacheName, short clientIntel, HotRodOperation operation,
OperationStatus status, int topologyId, byte[] data, int offset, long dataVersion, long created, int lifespan,
long lastUsed, int maxIdle) {
super(version, messageId, cacheName, clientIntel, operation, status, topologyId, data, dataVersion, created, lifespan, lastUsed, maxIdle);
this.offset = offset;
}
GetStreamResponse(byte version, long messageId, String cacheName, short clientIntel, HotRodOperation operation, OperationStatus status, int topologyId) {
super(version, messageId, cacheName, clientIntel, operation, status, topologyId);
offset = 0;
}
@Override
public String toString() {
return "GetStreamResponse{" +
"version=" + version +
", messageId=" + messageId +
", cacheName='" + cacheName + '\'' +
", clientIntel=" + clientIntel +
", operation=" + operation +
", status=" + status +
", topologyId=" + topologyId +
", data=" + Util.printArray(data, true) +
", offset=" + offset +
", dataVersion=" + dataVersion +
", created=" + created +
", lifespan=" + lifespan +
", lastUsed=" + lastUsed +
", maxIdle=" + maxIdle +
'}';
}
}
class StatsResponse extends Response {
final Map<String, String> stats;
StatsResponse(byte version, long messageId, String cacheName, short clientIntel, Map<String, String> stats,
int topologyId) {
super(version, messageId, cacheName, clientIntel, HotRodOperation.STATS, OperationStatus.Success, topologyId);
this.stats = stats;
}
@Override
public String toString() {
return "StatsResponse{" +
"version=" + version +
", messageId=" + messageId +
", cacheName='" + cacheName + '\'' +
", clientIntel=" + clientIntel +
", operation=" + operation +
", status=" + status +
", topologyId=" + topologyId +
", stats=" + stats +
'}';
}
}
class QueryResponse extends Response {
final byte[] result;
QueryResponse(byte version, long messageId, String cacheName, short clientIntel, int topologyId, byte[] result) {
super(version, messageId, cacheName, clientIntel, HotRodOperation.QUERY, OperationStatus.Success, topologyId);
this.result = result;
}
@Override
public String toString() {
return "QueryResponse{" +
"version=" + version +
", messageId=" + messageId +
", cacheName='" + cacheName + '\'' +
", clientIntel=" + clientIntel +
", operation=" + operation +
", status=" + status +
", topologyId=" + topologyId +
", result=" + Util.printArray(result, true) +
'}';
}
}
class AuthMechListResponse extends Response {
final Set<String> mechs;
AuthMechListResponse(byte version, long messageId, String cacheName, short clientIntel, Set<String> mechs,
int topologyId) {
super(version, messageId, cacheName, clientIntel, HotRodOperation.AUTH_MECH_LIST, OperationStatus.Success,
topologyId);
this.mechs = mechs;
}
@Override
public String toString() {
return "AuthMechListResponse{" +
"version=" + version +
", messageId=" + messageId +
", cacheName='" + cacheName + '\'' +
", clientIntel=" + clientIntel +
", operation=" + operation +
", status=" + status +
", topologyId=" + topologyId +
", mechs=" + mechs +
'}';
}
}
class AuthResponse extends Response {
final byte[] challenge;
AuthResponse(byte version, long messageId, String cacheName, short clientIntel, byte[] challenge,
int topologyId) {
super(version, messageId, cacheName, clientIntel, HotRodOperation.AUTH, OperationStatus.Success,
topologyId);
this.challenge = challenge;
}
@Override
public String toString() {
return "AuthResponse{" +
"version=" + version +
", messageId=" + messageId +
", cacheName='" + cacheName + '\'' +
", clientIntel=" + clientIntel +
", operation=" + operation +
", status=" + status +
", topologyId=" + topologyId +
", challenge=" + Util.printArray(challenge, true) +
'}';
}
}
class SizeResponse extends Response {
final long size;
SizeResponse(byte version, long messageId, String cacheName, short clientIntel, int topologyId, long size) {
super(version, messageId, cacheName, clientIntel, HotRodOperation.SIZE, OperationStatus.Success,
topologyId);
this.size = size;
}
@Override
public String toString() {
return "SizeResponse{" +
"version=" + version +
", messageId=" + messageId +
", cacheName='" + cacheName + '\'' +
", clientIntel=" + clientIntel +
", operation=" + operation +
", status=" + status +
", topologyId=" + topologyId +
", size=" + size +
'}';
}
}
class ExecResponse extends Response {
final byte[] result;
ExecResponse(byte version, long messageId, String cacheName, short clientIntel, int topologyId, byte[] result) {
super(version, messageId, cacheName, clientIntel, HotRodOperation.EXEC, OperationStatus.Success,
topologyId);
this.result = result;
}
@Override
public String toString() {
return "ExecResponse{" +
"version=" + version +
", messageId=" + messageId +
", cacheName='" + cacheName + '\'' +
", clientIntel=" + clientIntel +
", operation=" + operation +
", status=" + status +
", topologyId=" + topologyId +
", result=" + Util.printArray(result, true) +
'}';
}
}
abstract class AbstractTopologyResponse {
final int topologyId;
final Map<Address, ServerAddress> serverEndpointsMap;
final int numSegments;
protected AbstractTopologyResponse(int topologyId, Map<Address, ServerAddress> serverEndpointsMap, int numSegments) {
this.topologyId = topologyId;
this.serverEndpointsMap = serverEndpointsMap;
this.numSegments = numSegments;
}
}
abstract class AbstractHashDistAwareResponse extends AbstractTopologyResponse {
final int numOwners;
final byte hashFunction;
final int hashSpace;
protected AbstractHashDistAwareResponse(int topologyId, Map<Address, ServerAddress> serverEndpointsMap,
int numSegments, int numOwners, byte hashFunction, int hashSpace) {
super(topologyId, serverEndpointsMap, numSegments);
this.numOwners = numOwners;
this.hashFunction = hashFunction;
this.hashSpace = hashSpace;
}
}
class TopologyAwareResponse extends AbstractTopologyResponse {
protected TopologyAwareResponse(int topologyId, Map<Address, ServerAddress> serverEndpointsMap, int numSegments) {
super(topologyId, serverEndpointsMap, numSegments);
}
}
class HashDistAwareResponse extends AbstractHashDistAwareResponse {
protected HashDistAwareResponse(int topologyId, Map<Address, ServerAddress> serverEndpointsMap, int numSegments, int numOwners, byte hashFunction, int hashSpace) {
super(topologyId, serverEndpointsMap, numSegments, numOwners, hashFunction, hashSpace);
}
}
class HashDistAware11Response extends AbstractHashDistAwareResponse {
final int numVNodes;
protected HashDistAware11Response(int topologyId, Map<Address, ServerAddress> serverEndpointsMap, int numOwners,
byte hashFunction, int hashSpace, int numVNodes) {
super(topologyId, serverEndpointsMap, 0, numOwners, hashFunction, hashSpace);
this.numVNodes = numVNodes;
}
}
class HashDistAware20Response extends AbstractTopologyResponse {
final byte hashFunction;
protected HashDistAware20Response(int topologyId, Map<Address, ServerAddress> serverEndpointsMap, int numSegments,
byte hashFunction) {
super(topologyId, serverEndpointsMap, numSegments);
this.hashFunction = hashFunction;
}
}