blob: 94c2fadec7e2b4a52943b187771e5e02d5cb1eb5 [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.internal.memcached;
import java.nio.ByteBuffer;
import org.apache.geode.internal.memcached.commands.AddCommand;
import org.apache.geode.internal.memcached.commands.AddQCommand;
import org.apache.geode.internal.memcached.commands.AppendCommand;
import org.apache.geode.internal.memcached.commands.AppendQCommand;
import org.apache.geode.internal.memcached.commands.CASCommand;
import org.apache.geode.internal.memcached.commands.DecrementCommand;
import org.apache.geode.internal.memcached.commands.DecrementQCommand;
import org.apache.geode.internal.memcached.commands.DeleteCommand;
import org.apache.geode.internal.memcached.commands.DeleteQCommand;
import org.apache.geode.internal.memcached.commands.FlushAllCommand;
import org.apache.geode.internal.memcached.commands.FlushAllQCommand;
import org.apache.geode.internal.memcached.commands.GATCommand;
import org.apache.geode.internal.memcached.commands.GATQCommand;
import org.apache.geode.internal.memcached.commands.GetCommand;
import org.apache.geode.internal.memcached.commands.GetKCommand;
import org.apache.geode.internal.memcached.commands.GetKQCommand;
import org.apache.geode.internal.memcached.commands.GetQCommand;
import org.apache.geode.internal.memcached.commands.IncrementCommand;
import org.apache.geode.internal.memcached.commands.IncrementQCommand;
import org.apache.geode.internal.memcached.commands.NoOpCommand;
import org.apache.geode.internal.memcached.commands.NotSupportedCommand;
import org.apache.geode.internal.memcached.commands.PrependCommand;
import org.apache.geode.internal.memcached.commands.PrependQCommand;
import org.apache.geode.internal.memcached.commands.QuitCommand;
import org.apache.geode.internal.memcached.commands.QuitQCommand;
import org.apache.geode.internal.memcached.commands.ReplaceCommand;
import org.apache.geode.internal.memcached.commands.ReplaceQCommand;
import org.apache.geode.internal.memcached.commands.SetCommand;
import org.apache.geode.internal.memcached.commands.SetQCommand;
import org.apache.geode.internal.memcached.commands.StatsCommand;
import org.apache.geode.internal.memcached.commands.TouchCommand;
import org.apache.geode.internal.memcached.commands.VerbosityCommand;
import org.apache.geode.internal.memcached.commands.VersionCommand;
/**
* Represents all commands a memcached client can issue
*
*/
public enum Command {
SET {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new SetCommand();
}
return processor;
}
},
SETQ {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new SetQCommand();
}
return processor;
}
},
ADD {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new AddCommand();
}
return processor;
}
},
ADDQ {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new AddQCommand();
}
return processor;
}
},
REPLACE {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new ReplaceCommand();
}
return processor;
}
},
REPLACEQ {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new ReplaceQCommand();
}
return processor;
}
},
APPEND {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new AppendCommand();
}
return processor;
}
},
APPENDQ {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new AppendQCommand();
}
return processor;
}
},
PREPEND {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new PrependCommand();
}
return processor;
}
},
PREPENDQ {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new PrependQCommand();
}
return processor;
}
},
CAS {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new CASCommand();
}
return processor;
}
},
GET {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new GetCommand();
}
return processor;
}
},
GETS {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new GetCommand();
}
return processor;
}
},
GETQ {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new GetQCommand();
}
return processor;
}
},
GETK {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new GetKCommand();
}
return processor;
}
},
GETKQ {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new GetKQCommand();
}
return processor;
}
},
DELETE {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new DeleteCommand();
}
return processor;
}
},
DELETEQ {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new DeleteQCommand();
}
return processor;
}
},
INCR {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new IncrementCommand();
}
return processor;
}
},
INCRQ {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new IncrementQCommand();
}
return processor;
}
},
DECR {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new DecrementCommand();
}
return processor;
}
},
DECRQ {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new DecrementQCommand();
}
return processor;
}
},
STATS {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new StatsCommand();
}
return processor;
}
},
FLUSH_ALL {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new FlushAllCommand();
}
return processor;
}
},
FLUSH_ALLQ {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new FlushAllQCommand();
}
return processor;
}
},
VERSION {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new VersionCommand();
}
return processor;
}
},
VERBOSITY {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new VerbosityCommand();
}
return processor;
}
},
QUIT {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new QuitCommand();
}
return processor;
}
},
QUITQ {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new QuitQCommand();
}
return processor;
}
},
NOOP {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new NoOpCommand();
}
return processor;
}
},
TOUCH {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new TouchCommand();
}
return processor;
}
},
GAT {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new GATCommand();
}
return processor;
}
},
GATQ {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new GATQCommand();
}
return processor;
}
},
NOT_SUPPORTED {
private CommandProcessor processor;
@Override
public CommandProcessor getCommandProcessor() {
if (processor == null) {
processor = new NotSupportedCommand();
}
return processor;
}
};
/**
* Returns a command processor to process the given {@link #Command}
*
* @return a command processor
*/
public abstract CommandProcessor getCommandProcessor();
public static String buffertoString(ByteBuffer header) {
StringBuilder str = new StringBuilder("\n0: ");
for (int i = 0; i < header.limit(); i++) {
str.append(byteToHex(header.get(i)) + " | ");
if ((i + 1) % 4 == 0) {
str.append("\n");
str.append((i + 1) + ": ");
}
}
return str.toString();
}
public static Command getCommandFromOpCode(byte opCode) {
switch (opCode) {
case 0x00:
return GET;
case 0x01:
return SET;
case 0x02:
return ADD;
case 0x03:
return REPLACE;
case 0x04:
return DELETE;
case 0x05:
return INCR;
case 0x06:
return DECR;
case 0x07:
return QUIT;
case 0x08:
return FLUSH_ALL;
case 0x09:
return GETQ;
case 0x0a:
return NOOP;
case 0x0b:
return VERSION;
case 0x0c:
return GETK;
case 0x0d:
return GETKQ;
case 0x0e:
return APPEND;
case 0x0f:
return PREPEND;
case 0x10:
return STATS;
case 0x11:
return SETQ;
case 0x12:
return ADDQ;
case 0x13:
return REPLACEQ;
case 0x14:
return DELETEQ;
case 0x15:
return INCRQ;
case 0x16:
return DECRQ;
case 0x17:
return QUITQ;
case 0x18:
return FLUSH_ALLQ;
case 0x19:
return APPENDQ;
case 0x1a:
return PREPENDQ;
case 0x1b:
return VERBOSITY;
case 0x1c:
return TOUCH;
case 0x1d:
return GAT;
case 0x1e:
return GATQ;
default:
return NOT_SUPPORTED;
}
}
public static String byteToHex(byte b) {
// Returns hex String representation of byte b
char hexDigit[] =
{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
char[] array = {hexDigit[(b >> 4) & 0x0f], hexDigit[b & 0x0f]};
return "0x" + new String(array);
}
}