package org.apache.cassandra.stress.settings; import java.io.Serializable; import java.util.Arrays; import java.util.List; import java.util.Map; import com.datastax.driver.core.ProtocolOptions; public class SettingsMode implements Serializable { public final ConnectionAPI api; public final ConnectionStyle style; public final CqlVersion cqlVersion; private final String compression; public SettingsMode(GroupedOptions options) { if (options instanceof Cql3Options) { cqlVersion = CqlVersion.CQL3; Cql3Options opts = (Cql3Options) options; api = opts.useNative.setByUser() ? ConnectionAPI.JAVA_DRIVER_NATIVE : ConnectionAPI.THRIFT; style = opts.usePrepared.setByUser() ? ConnectionStyle.CQL_PREPARED : ConnectionStyle.CQL; compression = ProtocolOptions.Compression.valueOf(opts.useCompression.value().toUpperCase()).name(); } else if (options instanceof Cql3SimpleNativeOptions) { cqlVersion = CqlVersion.CQL3; Cql3SimpleNativeOptions opts = (Cql3SimpleNativeOptions) options; api = ConnectionAPI.SIMPLE_NATIVE; style = opts.usePrepared.setByUser() ? ConnectionStyle.CQL_PREPARED : ConnectionStyle.CQL; compression = ProtocolOptions.Compression.NONE.name(); } else if (options instanceof Cql2Options) { cqlVersion = CqlVersion.CQL2; api = ConnectionAPI.THRIFT; Cql2Options opts = (Cql2Options) options; style = opts.usePrepared.setByUser() ? ConnectionStyle.CQL_PREPARED : ConnectionStyle.CQL; compression = ProtocolOptions.Compression.NONE.name(); } else if (options instanceof ThriftOptions) { ThriftOptions opts = (ThriftOptions) options; cqlVersion = CqlVersion.NOCQL; api = opts.smart.setByUser() ? ConnectionAPI.THRIFT_SMART : ConnectionAPI.THRIFT; style = ConnectionStyle.THRIFT; compression = ProtocolOptions.Compression.NONE.name(); } else throw new IllegalStateException(); } public ProtocolOptions.Compression compression() { return ProtocolOptions.Compression.valueOf(compression); } // Option Declarations private static final class Cql3Options extends GroupedOptions { final OptionSimple api = new OptionSimple("cql3", "", null, "", true); final OptionSimple useNative = new OptionSimple("native", "", null, "", false); final OptionSimple usePrepared = new OptionSimple("prepared", "", null, "", false); final OptionSimple useCompression = new OptionSimple("compression=", "none|lz4|snappy", "none", "", false); final OptionSimple port = new OptionSimple("port=", "[0-9]+", "9046", "", false); @Override public List<? extends Option> options() { return Arrays.asList(useNative, usePrepared, api, useCompression, port); } } private static final class Cql3SimpleNativeOptions extends GroupedOptions { final OptionSimple api = new OptionSimple("cql3", "", null, "", true); final OptionSimple useSimpleNative = new OptionSimple("simplenative", "", null, "", true); final OptionSimple usePrepared = new OptionSimple("prepared", "", null, "", false); final OptionSimple port = new OptionSimple("port=", "[0-9]+", "9046", "", false); @Override public List<? extends Option> options() { return Arrays.asList(useSimpleNative, usePrepared, api, port); } } private static final class Cql2Options extends GroupedOptions { final OptionSimple api = new OptionSimple("cql2", "", null, "", true); final OptionSimple usePrepared = new OptionSimple("prepared", "", null, "", false); @Override public List<? extends Option> options() { return Arrays.asList(usePrepared, api); } } private static final class ThriftOptions extends GroupedOptions { final OptionSimple api = new OptionSimple("thrift", "", null, "", true); final OptionSimple smart = new OptionSimple("smart", "", null, "", false); @Override public List<? extends Option> options() { return Arrays.asList(api, smart); } } // CLI Utility Methods public static SettingsMode get(Map<String, String[]> clArgs) { String[] params = clArgs.remove("-mode"); if (params == null) { ThriftOptions opts = new ThriftOptions(); opts.smart.accept("smart"); return new SettingsMode(opts); } GroupedOptions options = GroupedOptions.select(params, new ThriftOptions(), new Cql2Options(), new Cql3Options(), new Cql3SimpleNativeOptions()); if (options == null) { printHelp(); System.out.println("Invalid -mode options provided, see output for valid options"); System.exit(1); } return new SettingsMode(options); } public static void printHelp() { GroupedOptions.printOptions(System.out, "-mode", new ThriftOptions(), new Cql2Options(), new Cql3Options(), new Cql3SimpleNativeOptions()); } public static Runnable helpPrinter() { return new Runnable() { @Override public void run() { printHelp(); } }; } }