blob: f8967ae8ff27937884d6124afa652fa84a3c82d5 [file] [log] [blame]
/*
* 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.geode.redis.internal;
import java.nio.channels.SocketChannel;
import java.util.List;
import io.netty.buffer.ByteBuf;
/**
* The command class is used in holding a received Redis command. Each sent command resides in an
* instance of this class. This class is designed to be used strictly by getter and setter methods.
*
*
*/
public class Command {
private final List<byte[]> commandElems;
private final RedisCommandType commandType;
private ByteBuf response;
private String key;
private ByteArrayWrapper bytes;
/**
* Constructor for {@link Command}. Must initialize Command with a {@link SocketChannel} and a
* {@link List} of command elements
*
* @param commandElems List of elements in command
*/
public Command(List<byte[]> commandElems) {
if (commandElems == null || commandElems.isEmpty())
throw new IllegalArgumentException(
"List of command elements cannot be empty -> List:" + commandElems);
this.commandElems = commandElems;
this.response = null;
RedisCommandType type;
try {
byte[] charCommand = commandElems.get(0);
String commandName = Coder.bytesToString(charCommand).toUpperCase();
type = RedisCommandType.valueOf(commandName);
} catch (Exception e) {
type = RedisCommandType.UNKNOWN;
}
this.commandType = type;
}
/**
* Used to get the command element list
*
* @return List of command elements in form of {@link List}
*/
public List<byte[]> getProcessedCommand() {
return this.commandElems;
}
/**
* Getter method for the command type
*
* @return The command type
*/
public RedisCommandType getCommandType() {
return this.commandType;
}
/**
* Getter method to get the response to be sent
*
* @return The response
*/
public ByteBuf getResponse() {
return response;
}
/**
* Setter method to set the response to be sent
*
* @param response The response to be sent
*/
public void setResponse(ByteBuf response) {
this.response = response;
}
public boolean hasError() {
if (response == null)
return false;
if (response.getByte(0) == Coder.ERROR_ID)
return true;
return false;
}
/**
* Convenience method to get a String representation of the key in a Redis command, always at the
* second position in the sent command array
*
* @return Returns the second element in the parsed command list, which is always the key for
* commands indicating a key
*/
public String getStringKey() {
if (this.commandElems.size() > 1) {
if (this.bytes == null) {
this.bytes = new ByteArrayWrapper(this.commandElems.get(1));
this.key = this.bytes.toString();
} else if (this.key == null)
this.key = this.bytes.toString();
return this.key;
} else
return null;
}
public ByteArrayWrapper getKey() {
if (this.commandElems.size() > 1) {
if (this.bytes == null)
this.bytes = new ByteArrayWrapper(this.commandElems.get(1));
return this.bytes;
} else
return null;
}
@Override
public String toString() {
StringBuilder b = new StringBuilder();
for (byte[] bs : this.commandElems) {
b.append(Coder.bytesToString(bs));
b.append(' ');
}
return b.toString();
}
}