/* * 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; } } static public 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); } }