package voldemort; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.List; import org.apache.avro.Schema; import org.apache.avro.generic.GenericDatumReader; import org.apache.avro.io.JsonDecoder; import voldemort.client.ClientConfig; import voldemort.client.DefaultStoreClient; import voldemort.client.SocketStoreClientFactory; import voldemort.client.StoreClientFactory; import voldemort.client.protocol.RequestFormatType; import voldemort.client.protocol.admin.AdminClient; import voldemort.store.StoreDefinition; import voldemort.utils.Pair; import voldemort.utils.Utils; /** * NOTE: This class is unsupported. All shell access is via the * {@link VoldemortClientShell} * * Utility to check avro values through command line very handy for debugging * */ @Deprecated public class VoldemortAvroClientShell { private static final String PROMPT = "> "; public static void main(String args[]) throws IOException { if(args.length < 2 || args.length > 3) { System.err.println("Usage: java VoldemortAvroClient store_name bootstrap_url [command_file]"); System.exit(-1); } String storeName = args[0]; String bootstrapUrl = args[1]; String commandsFileName = ""; BufferedReader fileReader = null; BufferedReader inputReader = null; try { if(args.length == 3) { commandsFileName = args[2]; fileReader = new BufferedReader(new FileReader(commandsFileName)); } inputReader = new BufferedReader(new InputStreamReader(System.in)); } catch(IOException e) { Utils.croak("Failure to open input stream: " + e.getMessage()); } ClientConfig clientConfig = new ClientConfig().setBootstrapUrls(bootstrapUrl) .setEnableLazy(false) .setRequestFormatType(RequestFormatType.VOLDEMORT_V3); StoreClientFactory factory = null; DefaultStoreClient<Object, Object> client = null; try { try { factory = new SocketStoreClientFactory(clientConfig); client = (DefaultStoreClient<Object, Object>) factory.getStoreClient(storeName); } catch(Exception e) { Utils.croak("Could not connect to server: " + e.getMessage()); } System.out.println("Established connection to " + storeName + " via " + bootstrapUrl); System.out.print(PROMPT); Pair<Schema, Schema> keyValueSchemaPair = getLatestKeyValueSchema(bootstrapUrl, storeName); Schema latestKeySchema = keyValueSchemaPair.getFirst(); if(latestKeySchema == null) { Utils.croak("Could not parse latest key schema for store name " + storeName); } Schema latestValueSchema = keyValueSchemaPair.getSecond(); if(latestValueSchema == null) { Utils.croak("Could not parse latest value schema for store name " + storeName); } if(fileReader != null) { processCommands(client, fileReader, latestKeySchema, latestValueSchema, true); } else { processCommands(client, inputReader, latestKeySchema, latestValueSchema, false); } } finally { if(factory != null) factory.close(); if(fileReader != null) fileReader.close(); } } private static Pair<Schema, Schema> getLatestKeyValueSchema(String url, String storeName) { AdminClient adminClient = null; try { adminClient = new AdminClient(url); List<StoreDefinition> storeDefs = adminClient.metadataMgmtOps.getRemoteStoreDefList() .getValue(); for(StoreDefinition storeDef: storeDefs) { if(storeDef.getName().equals(storeName)) { Schema keySchema = Schema.parse(storeDef.getKeySerializer() .getCurrentSchemaInfo()); Schema valueSchema = Schema.parse(storeDef.getValueSerializer() .getCurrentSchemaInfo()); return new Pair<Schema, Schema>(keySchema, valueSchema); } } } catch(Exception e) { System.err.println("Error while getting latest key schema " + e.getMessage()); } finally { if(adminClient != null) { adminClient.close(); } } return null; } private static void processCommands(DefaultStoreClient<Object, Object> client, BufferedReader reader, Schema keySchema, Schema valueSchema, boolean printCommands) throws IOException { for(String line = reader.readLine(); line != null; line = reader.readLine()) { System.out.print(PROMPT); if(line.trim().equals("")) continue; if(printCommands) System.out.println(line); try { if(line.toLowerCase().startsWith("get")) { System.out.println("Enter key:"); line = reader.readLine(); JsonDecoder decoder = new JsonDecoder(keySchema, line); GenericDatumReader<Object> datumReader = null; Object key = null; try { datumReader = new GenericDatumReader<Object>(keySchema); key = datumReader.read(null, decoder); } catch(IOException e) {} if(key == null) { System.err.println("Error parsing key "); continue; } System.out.println("Value - " + client.get(key)); } else if(line.toLowerCase().startsWith("put")) { String keyString = null; String valueString = null; System.out.println("Enter key:"); line = reader.readLine(); keyString = line; System.out.println("Enter value:"); line = reader.readLine(); valueString = line; JsonDecoder keyDecoder = new JsonDecoder(keySchema, keyString); JsonDecoder valueDecoder = new JsonDecoder(valueSchema, valueString); GenericDatumReader<Object> datumReader = null; Object key = null; Object value = null; try { datumReader = new GenericDatumReader<Object>(keySchema); key = datumReader.read(null, keyDecoder); } catch(IOException e) {} if(key == null) { System.err.println("Error parsing key "); continue; } try { datumReader = new GenericDatumReader<Object>(valueSchema); value = datumReader.read(null, valueDecoder); } catch(IOException e) {} if(value == null) { System.err.println("Error parsing value "); continue; } System.out.println("Put - " + client.put(key, value)); } else if(line.startsWith("quit") || line.startsWith("exit")) { System.out.println("k k thx bye."); System.exit(0); } else { System.err.println("Only supported 'get' & 'put' "); } } catch(Exception e) { System.err.println("Unexpected error:"); e.printStackTrace(System.err); } } } }