package org.infinispan.server.hotrod;
import java.util.List;
import org.infinispan.AdvancedCache;
import org.infinispan.configuration.cache.Configuration;
import org.infinispan.container.entries.CacheEntry;
import org.infinispan.server.core.transport.NettyTransport;
import org.infinispan.server.hotrod.CacheDecodeContext.RequestParameters;
import io.netty.buffer.ByteBuf;
/**
* This class represents the work to be done by a decoder of a particular Hot Rod protocol version.
*
* @author Galder ZamarreƱo
* @since 4.1
*/
interface VersionedDecoder {
/**
* Having read the message's Id, read the rest of Hot Rod header from the given buffer and return it. Returns whether
* the entire header was read or not.
*/
boolean readHeader(ByteBuf buffer, byte version, long messageId, HotRodHeader header) throws Exception;
/**
* Read the parameters of the operation, if present.
*/
RequestParameters readParameters(HotRodHeader header, ByteBuf buffer);
/**
* Create a successful response.
*/
Response createSuccessResponse(HotRodHeader header, byte[] prev);
/**
* Create a response indicating the the operation could not be executed.
*/
Response createNotExecutedResponse(HotRodHeader header, byte[] prev);
/**
* Create a response indicating that the key, which the message tried to operate on, did not exist.
*/
Response createNotExistResponse(HotRodHeader header);
/**
* Create a response for get a request.
*/
Response createGetResponse(HotRodHeader header, CacheEntry<byte[], byte[]> entry);
/**
* Read operation specific data for an operation that only requires a header
*/
void customReadHeader(HotRodHeader header, ByteBuf buffer, CacheDecodeContext hrCtx, List<Object> out);
/**
* Handle a protocol specific key reading.
*/
void customReadKey(HotRodHeader header, ByteBuf buffer, CacheDecodeContext hrCtx, List<Object> out);
/**
* Handle a protocol specific value reading.
*/
void customReadValue(HotRodHeader header, ByteBuf buffer, CacheDecodeContext hrCtx, List<Object> out);
/**
* Create a response for the stats command.
*/
StatsResponse createStatsResponse(CacheDecodeContext hrCtx, NettyTransport t);
/**
* Create an error response based on the Throwable instance received.
*/
ErrorResponse createErrorResponse(HotRodHeader header, Throwable t);
/**
* Get an optimized cache instance depending on the operation parameters.
*/
AdvancedCache<byte[], byte[]> getOptimizedCache(HotRodHeader h, AdvancedCache<byte[], byte[]> c, Configuration cacheCfg);
}