You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by el...@apache.org on 2014/04/08 05:03:22 UTC
[26/53] [abbrv] Revert "ACCUMULO-1897 Move shell into new package and
module"
http://git-wip-us.apache.org/repos/asf/accumulo/blob/b2b985e2/shell/src/main/java/org/apache/accumulo/shell/Shell.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/accumulo/shell/Shell.java b/shell/src/main/java/org/apache/accumulo/shell/Shell.java
deleted file mode 100644
index 48d8bd0..0000000
--- a/shell/src/main/java/org/apache/accumulo/shell/Shell.java
+++ /dev/null
@@ -1,1168 +0,0 @@
-/*
- * 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.accumulo.shell;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.net.InetAddress;
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.UUID;
-
-import jline.console.ConsoleReader;
-import jline.console.UserInterruptException;
-import jline.console.history.FileHistory;
-
-import org.apache.accumulo.core.Constants;
-import org.apache.accumulo.core.client.AccumuloException;
-import org.apache.accumulo.core.client.AccumuloSecurityException;
-import org.apache.accumulo.core.client.ClientConfiguration;
-import org.apache.accumulo.core.client.ClientConfiguration.ClientProperty;
-import org.apache.accumulo.core.client.Connector;
-import org.apache.accumulo.core.client.Instance;
-import org.apache.accumulo.core.client.IteratorSetting;
-import org.apache.accumulo.core.client.TableNotFoundException;
-import org.apache.accumulo.core.client.ZooKeeperInstance;
-import org.apache.accumulo.core.client.impl.ServerConfigurationUtil;
-import org.apache.accumulo.core.client.impl.Tables;
-import org.apache.accumulo.core.client.mock.MockInstance;
-import org.apache.accumulo.core.client.security.tokens.AuthenticationToken;
-import org.apache.accumulo.core.client.security.tokens.PasswordToken;
-import org.apache.accumulo.core.conf.AccumuloConfiguration;
-import org.apache.accumulo.core.conf.DefaultConfiguration;
-import org.apache.accumulo.core.conf.Property;
-import org.apache.accumulo.core.conf.SiteConfiguration;
-import org.apache.accumulo.core.data.Key;
-import org.apache.accumulo.core.data.Value;
-import org.apache.accumulo.core.data.thrift.TConstraintViolationSummary;
-import org.apache.accumulo.core.tabletserver.thrift.ConstraintViolationException;
-import org.apache.accumulo.core.trace.DistributedTrace;
-import org.apache.accumulo.core.util.BadArgumentException;
-import org.apache.accumulo.core.util.format.BinaryFormatter;
-import org.apache.accumulo.core.util.format.DefaultFormatter;
-import org.apache.accumulo.core.util.format.Formatter;
-import org.apache.accumulo.core.util.format.FormatterFactory;
-import org.apache.accumulo.core.volume.VolumeConfiguration;
-import org.apache.accumulo.core.zookeeper.ZooUtil;
-import org.apache.accumulo.fate.zookeeper.ZooReader;
-import org.apache.accumulo.shell.commands.AboutCommand;
-import org.apache.accumulo.shell.commands.AddAuthsCommand;
-import org.apache.accumulo.shell.commands.AddSplitsCommand;
-import org.apache.accumulo.shell.commands.AuthenticateCommand;
-import org.apache.accumulo.shell.commands.ByeCommand;
-import org.apache.accumulo.shell.commands.ClasspathCommand;
-import org.apache.accumulo.shell.commands.ClearCommand;
-import org.apache.accumulo.shell.commands.CloneTableCommand;
-import org.apache.accumulo.shell.commands.ClsCommand;
-import org.apache.accumulo.shell.commands.CompactCommand;
-import org.apache.accumulo.shell.commands.ConfigCommand;
-import org.apache.accumulo.shell.commands.ConstraintCommand;
-import org.apache.accumulo.shell.commands.CreateNamespaceCommand;
-import org.apache.accumulo.shell.commands.CreateTableCommand;
-import org.apache.accumulo.shell.commands.CreateUserCommand;
-import org.apache.accumulo.shell.commands.DUCommand;
-import org.apache.accumulo.shell.commands.DebugCommand;
-import org.apache.accumulo.shell.commands.DeleteCommand;
-import org.apache.accumulo.shell.commands.DeleteIterCommand;
-import org.apache.accumulo.shell.commands.DeleteManyCommand;
-import org.apache.accumulo.shell.commands.DeleteNamespaceCommand;
-import org.apache.accumulo.shell.commands.DeleteRowsCommand;
-import org.apache.accumulo.shell.commands.DeleteScanIterCommand;
-import org.apache.accumulo.shell.commands.DeleteShellIterCommand;
-import org.apache.accumulo.shell.commands.DeleteTableCommand;
-import org.apache.accumulo.shell.commands.DeleteUserCommand;
-import org.apache.accumulo.shell.commands.DropTableCommand;
-import org.apache.accumulo.shell.commands.DropUserCommand;
-import org.apache.accumulo.shell.commands.EGrepCommand;
-import org.apache.accumulo.shell.commands.ExecfileCommand;
-import org.apache.accumulo.shell.commands.ExitCommand;
-import org.apache.accumulo.shell.commands.ExportTableCommand;
-import org.apache.accumulo.shell.commands.ExtensionCommand;
-import org.apache.accumulo.shell.commands.FateCommand;
-import org.apache.accumulo.shell.commands.FlushCommand;
-import org.apache.accumulo.shell.commands.FormatterCommand;
-import org.apache.accumulo.shell.commands.GetAuthsCommand;
-import org.apache.accumulo.shell.commands.GetGroupsCommand;
-import org.apache.accumulo.shell.commands.GetSplitsCommand;
-import org.apache.accumulo.shell.commands.GrantCommand;
-import org.apache.accumulo.shell.commands.GrepCommand;
-import org.apache.accumulo.shell.commands.HelpCommand;
-import org.apache.accumulo.shell.commands.HiddenCommand;
-import org.apache.accumulo.shell.commands.HistoryCommand;
-import org.apache.accumulo.shell.commands.ImportDirectoryCommand;
-import org.apache.accumulo.shell.commands.ImportTableCommand;
-import org.apache.accumulo.shell.commands.InfoCommand;
-import org.apache.accumulo.shell.commands.InsertCommand;
-import org.apache.accumulo.shell.commands.InterpreterCommand;
-import org.apache.accumulo.shell.commands.ListCompactionsCommand;
-import org.apache.accumulo.shell.commands.ListIterCommand;
-import org.apache.accumulo.shell.commands.ListScansCommand;
-import org.apache.accumulo.shell.commands.ListShellIterCommand;
-import org.apache.accumulo.shell.commands.MaxRowCommand;
-import org.apache.accumulo.shell.commands.MergeCommand;
-import org.apache.accumulo.shell.commands.NamespacePermissionsCommand;
-import org.apache.accumulo.shell.commands.NamespacesCommand;
-import org.apache.accumulo.shell.commands.NoTableCommand;
-import org.apache.accumulo.shell.commands.OfflineCommand;
-import org.apache.accumulo.shell.commands.OnlineCommand;
-import org.apache.accumulo.shell.commands.PasswdCommand;
-import org.apache.accumulo.shell.commands.PingCommand;
-import org.apache.accumulo.shell.commands.QuestionCommand;
-import org.apache.accumulo.shell.commands.QuitCommand;
-import org.apache.accumulo.shell.commands.QuotedStringTokenizer;
-import org.apache.accumulo.shell.commands.RenameNamespaceCommand;
-import org.apache.accumulo.shell.commands.RenameTableCommand;
-import org.apache.accumulo.shell.commands.RevokeCommand;
-import org.apache.accumulo.shell.commands.ScanCommand;
-import org.apache.accumulo.shell.commands.ScriptCommand;
-import org.apache.accumulo.shell.commands.SetAuthsCommand;
-import org.apache.accumulo.shell.commands.SetGroupsCommand;
-import org.apache.accumulo.shell.commands.SetIterCommand;
-import org.apache.accumulo.shell.commands.SetScanIterCommand;
-import org.apache.accumulo.shell.commands.SetShellIterCommand;
-import org.apache.accumulo.shell.commands.SleepCommand;
-import org.apache.accumulo.shell.commands.SystemPermissionsCommand;
-import org.apache.accumulo.shell.commands.TableCommand;
-import org.apache.accumulo.shell.commands.TablePermissionsCommand;
-import org.apache.accumulo.shell.commands.TablesCommand;
-import org.apache.accumulo.shell.commands.TraceCommand;
-import org.apache.accumulo.shell.commands.UserCommand;
-import org.apache.accumulo.shell.commands.UserPermissionsCommand;
-import org.apache.accumulo.shell.commands.UsersCommand;
-import org.apache.accumulo.shell.commands.WhoAmICommand;
-import org.apache.commons.cli.BasicParser;
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.HelpFormatter;
-import org.apache.commons.cli.MissingOptionException;
-import org.apache.commons.cli.Option;
-import org.apache.commons.cli.Options;
-import org.apache.commons.cli.ParseException;
-import org.apache.hadoop.fs.Path;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
-
-import com.beust.jcommander.JCommander;
-import com.beust.jcommander.ParameterException;
-
-/**
- * A convenient console interface to perform basic accumulo functions Includes auto-complete, help, and quoted strings with escape sequences
- */
-public class Shell extends ShellOptions {
- public static final Logger log = Logger.getLogger(Shell.class);
- private static final Logger audit = Logger.getLogger(Shell.class.getName() + ".audit");
-
- public static final String CHARSET = "ISO-8859-1";
- public static final int NO_FIXED_ARG_LENGTH_CHECK = -1;
- public static final String COMMENT_PREFIX = "#";
- public static final String HISTORY_DIR_NAME = ".accumulo";
- public static final String HISTORY_FILE_NAME = "shell_history.txt";
- private static final String SHELL_DESCRIPTION = "Shell - Apache Accumulo Interactive Shell";
-
- protected int exitCode = 0;
- private String tableName;
- protected Instance instance;
- private Connector connector;
- protected ConsoleReader reader;
- private String principal;
- private AuthenticationToken token;
- private final Class<? extends Formatter> defaultFormatterClass = DefaultFormatter.class;
- private final Class<? extends Formatter> binaryFormatterClass = BinaryFormatter.class;
- public Map<String,List<IteratorSetting>> scanIteratorOptions = new HashMap<String,List<IteratorSetting>>();
- public Map<String,List<IteratorSetting>> iteratorProfiles = new HashMap<String,List<IteratorSetting>>();
-
- private Token rootToken;
- public final Map<String,Command> commandFactory = new TreeMap<String,Command>();
- public final Map<String,Command[]> commandGrouping = new TreeMap<String,Command[]>();
- protected boolean configError = false;
-
- // exit if true
- private boolean exit = false;
-
- // file to execute commands from
- protected File execFile = null;
- // single command to execute from the command line
- protected String execCommand = null;
- protected boolean verbose = true;
-
- private boolean tabCompletion;
- private boolean disableAuthTimeout;
- private long authTimeout;
- private long lastUserActivity = System.currentTimeMillis();
- private boolean logErrorsToConsole = false;
- private PrintWriter writer = null;
- private boolean masking = false;
-
- public Shell() throws IOException {
- this(new ConsoleReader(), new PrintWriter(
- new OutputStreamWriter(System.out,
- System.getProperty("jline.WindowsTerminal.output.encoding", System.getProperty("file.encoding")))));
- }
-
- public Shell(ConsoleReader reader, PrintWriter writer) {
- super();
- this.reader = reader;
- this.writer = writer;
- }
-
- // Not for client use
- public boolean config(String... args) {
- ShellOptionsJC options = new ShellOptionsJC();
- JCommander jc = new JCommander();
-
- jc.setProgramName("accumulo shell");
- jc.addObject(options);
- try {
- jc.parse(args);
- } catch (ParameterException e) {
- configError = true;
- }
-
- if (options.isHelpEnabled()) {
- configError = true;
- }
-
- if (!configError && options.getUnrecognizedOptions() != null) {
- configError = true;
- logError("Unrecognized Options: " + options.getUnrecognizedOptions().toString());
- }
-
- if (configError) {
- jc.usage();
- return true;
- }
-
- setDebugging(options.isDebugEnabled());
- authTimeout = options.getAuthTimeout() * 60 * 1000; // convert minutes to milliseconds
- disableAuthTimeout = options.isAuthTimeoutDisabled();
-
- // get the options that were parsed
- String user = options.getUsername();
- String password = options.getPassword();
-
- tabCompletion = !options.isTabCompletionDisabled();
-
- // Use a fake (Mock), ZK, or HdfsZK Accumulo instance
- setInstance(options);
-
- // AuthenticationToken options
- token = options.getAuthenticationToken();
- Map<String,String> loginOptions = options.getTokenProperties();
-
- // process default parameters if unspecified
- try {
- boolean hasToken = (token != null);
- boolean hasTokenOptions = !loginOptions.isEmpty();
-
- if (hasToken && password != null) {
- throw new ParameterException("Can not supply '--pass' option with '--tokenClass' option");
- }
-
- Runtime.getRuntime().addShutdownHook(new Thread() {
- @Override
- public void run() {
- reader.getTerminal().setEchoEnabled(true);
- }
- });
-
- // Need either both a token and options, or neither, but not just one.
- if (hasToken != hasTokenOptions) {
- throw new ParameterException("Must supply either both or neither of '--tokenClass' and '--tokenProperty'");
- } else if (hasToken) { // implied hasTokenOptions
- // Fully qualified name so we don't shadow java.util.Properties
- org.apache.accumulo.core.client.security.tokens.AuthenticationToken.Properties props;
- // and line wrap it because the package name is so long
- props = new org.apache.accumulo.core.client.security.tokens.AuthenticationToken.Properties();
-
- props.putAllStrings(loginOptions);
- token.init(props);
- } else {
- // Read password if the user explicitly asked for it, or didn't specify anything at all
- if ("stdin".equals(password) || password == null) {
- password = reader.readLine("Password: ", '*');
- }
-
- if (password == null) {
- // User cancel, e.g. Ctrl-D pressed
- throw new ParameterException("No password or token option supplied");
- } else {
- this.token = new PasswordToken(password);
- }
- }
-
- if (!options.isFake()) {
- ZooReader zr = new ZooReader(instance.getZooKeepers(), instance.getZooKeepersSessionTimeOut());
- DistributedTrace.enable(instance, zr, "shell", InetAddress.getLocalHost().getHostName());
- }
-
- this.setTableName("");
- this.principal = user;
- connector = instance.getConnector(this.principal, token);
-
- } catch (Exception e) {
- printException(e);
- configError = true;
- }
-
- // decide whether to execute commands from a file and quit
- if (options.getExecFile() != null) {
- execFile = options.getExecFile();
- verbose = false;
- } else if (options.getExecFileVerbose() != null) {
- execFile = options.getExecFileVerbose();
- verbose = true;
- }
- execCommand = options.getExecCommand();
- if (execCommand != null) {
- verbose = false;
- }
-
- rootToken = new Token();
-
- Command[] dataCommands = {new DeleteCommand(), new DeleteManyCommand(), new DeleteRowsCommand(), new EGrepCommand(), new FormatterCommand(),
- new InterpreterCommand(), new GrepCommand(), new ImportDirectoryCommand(), new InsertCommand(), new MaxRowCommand(), new ScanCommand()};
- Command[] debuggingCommands = {new ClasspathCommand(), new DebugCommand(), new ListScansCommand(), new ListCompactionsCommand(), new TraceCommand(),
- new PingCommand()};
- Command[] execCommands = {new ExecfileCommand(), new HistoryCommand(), new ExtensionCommand(), new ScriptCommand()};
- Command[] exitCommands = {new ByeCommand(), new ExitCommand(), new QuitCommand()};
- Command[] helpCommands = {new AboutCommand(), new HelpCommand(), new InfoCommand(), new QuestionCommand()};
- Command[] iteratorCommands = {new DeleteIterCommand(), new DeleteScanIterCommand(), new ListIterCommand(), new SetIterCommand(), new SetScanIterCommand(),
- new SetShellIterCommand(), new ListShellIterCommand(), new DeleteShellIterCommand()};
- Command[] otherCommands = {new HiddenCommand()};
- Command[] permissionsCommands = {new GrantCommand(), new RevokeCommand(), new SystemPermissionsCommand(), new TablePermissionsCommand(),
- new UserPermissionsCommand(), new NamespacePermissionsCommand()};
- Command[] stateCommands = {new AuthenticateCommand(), new ClsCommand(), new ClearCommand(), new FateCommand(), new NoTableCommand(), new SleepCommand(),
- new TableCommand(), new UserCommand(), new WhoAmICommand()};
- Command[] tableCommands = {new CloneTableCommand(), new ConfigCommand(), new CreateTableCommand(), new DeleteTableCommand(), new DropTableCommand(),
- new DUCommand(), new ExportTableCommand(), new ImportTableCommand(), new OfflineCommand(), new OnlineCommand(), new RenameTableCommand(),
- new TablesCommand(), new NamespacesCommand(), new CreateNamespaceCommand(), new DeleteNamespaceCommand(), new RenameNamespaceCommand()};
- Command[] tableControlCommands = {new AddSplitsCommand(), new CompactCommand(), new ConstraintCommand(), new FlushCommand(), new GetGroupsCommand(),
- new GetSplitsCommand(), new MergeCommand(), new SetGroupsCommand()};
- Command[] userCommands = {new AddAuthsCommand(), new CreateUserCommand(), new DeleteUserCommand(), new DropUserCommand(), new GetAuthsCommand(),
- new PasswdCommand(), new SetAuthsCommand(), new UsersCommand()};
- commandGrouping.put("-- Writing, Reading, and Removing Data --", dataCommands);
- commandGrouping.put("-- Debugging Commands -------------------", debuggingCommands);
- commandGrouping.put("-- Shell Execution Commands -------------", execCommands);
- commandGrouping.put("-- Exiting Commands ---------------------", exitCommands);
- commandGrouping.put("-- Help Commands ------------------------", helpCommands);
- commandGrouping.put("-- Iterator Configuration ---------------", iteratorCommands);
- commandGrouping.put("-- Permissions Administration Commands --", permissionsCommands);
- commandGrouping.put("-- Shell State Commands -----------------", stateCommands);
- commandGrouping.put("-- Table Administration Commands --------", tableCommands);
- commandGrouping.put("-- Table Control Commands ---------------", tableControlCommands);
- commandGrouping.put("-- User Administration Commands ---------", userCommands);
-
- for (Command[] cmds : commandGrouping.values()) {
- for (Command cmd : cmds)
- commandFactory.put(cmd.getName(), cmd);
- }
- for (Command cmd : otherCommands) {
- commandFactory.put(cmd.getName(), cmd);
- }
- return configError;
- }
-
- /**
- * Sets the instance used by the shell based on the given options.
- *
- * @param options
- * shell options
- */
- protected void setInstance(ShellOptionsJC options) {
- // should only be one set of instance options set
- instance = null;
- if (options.isFake()) {
- instance = new MockInstance("fake");
- } else {
- String instanceName, hosts;
- if (options.isHdfsZooInstance()) {
- instanceName = hosts = null;
- } else if (options.getZooKeeperInstance().size() > 0) {
- List<String> zkOpts = options.getZooKeeperInstance();
- instanceName = zkOpts.get(0);
- hosts = zkOpts.get(1);
- } else {
- instanceName = options.getZooKeeperInstanceName();
- hosts = options.getZooKeeperHosts();
- }
- try {
- instance = getZooInstance(instanceName, hosts, options.getClientConfiguration());
- } catch (Exception e) {
- throw new IllegalArgumentException("Unable to load client config from " + options.getClientConfigFile(), e);
- }
- }
- }
-
- /*
- * Takes instanceName and keepers as separate arguments, rather than just packaged into the clientConfig, so that we can fail over to accumulo-site.xml or
- * HDFS config if they're unspecified.
- */
- private static Instance getZooInstance(String instanceName, String keepers, ClientConfiguration clientConfig) {
- UUID instanceId = null;
- if (instanceName == null) {
- instanceName = clientConfig.get(ClientProperty.INSTANCE_NAME);
- }
- if (instanceName == null || keepers == null) {
- AccumuloConfiguration conf = SiteConfiguration.getInstance(ServerConfigurationUtil.convertClientConfig(DefaultConfiguration.getInstance(), clientConfig));
- if (instanceName == null) {
- Path instanceDir = new Path(VolumeConfiguration.getVolumeUris(conf)[0], "instance_id");
- instanceId = UUID.fromString(ZooUtil.getInstanceIDFromHdfs(instanceDir, conf));
- }
- if (keepers == null) {
- keepers = conf.get(Property.INSTANCE_ZK_HOST);
- }
- }
- if (instanceId != null) {
- return new ZooKeeperInstance(clientConfig.withInstance(instanceId).withZkHosts(keepers));
- } else {
- return new ZooKeeperInstance(clientConfig.withInstance(instanceName).withZkHosts(keepers));
- }
- }
-
- public Connector getConnector() {
- return connector;
- }
-
- public Instance getInstance() {
- return instance;
- }
-
- public static void main(String args[]) throws IOException {
- Shell shell = new Shell();
- try {
- shell.config(args);
-
- System.exit(shell.start());
- } finally {
- shell.shutdown();
- }
- }
-
- public int start() throws IOException {
- if (configError)
- return 1;
-
- String input;
- if (isVerbose())
- printInfo();
-
- String home = System.getProperty("HOME");
- if (home == null)
- home = System.getenv("HOME");
- String configDir = home + "/" + HISTORY_DIR_NAME;
- String historyPath = configDir + "/" + HISTORY_FILE_NAME;
- File accumuloDir = new File(configDir);
- if (!accumuloDir.exists() && !accumuloDir.mkdirs())
- log.warn("Unable to make directory for history at " + accumuloDir);
- try {
- final FileHistory history = new FileHistory(new File(historyPath));
- reader.setHistory(history);
- // Add shutdown hook to flush file history, per jline javadocs
- Runtime.getRuntime().addShutdownHook(new Thread() {
- @Override
- public void run() {
- try {
- history.flush();
- } catch (IOException e) {
- log.warn("Could not flush history to file.");
- }
- }
- });
- } catch (IOException e) {
- log.warn("Unable to load history file at " + historyPath);
- }
-
- // Turn Ctrl+C into Exception instead of JVM exit
- reader.setHandleUserInterrupt(true);
-
- ShellCompletor userCompletor = null;
-
- if (execFile != null) {
- java.util.Scanner scanner = new java.util.Scanner(execFile, StandardCharsets.UTF_8.name());
- try {
- while (scanner.hasNextLine() && !hasExited()) {
- execCommand(scanner.nextLine(), true, isVerbose());
- }
- } finally {
- scanner.close();
- }
- } else if (execCommand != null) {
- for (String command : execCommand.split("\n")) {
- execCommand(command, true, isVerbose());
- }
- return exitCode;
- }
-
- while (true) {
- try {
- if (hasExited())
- return exitCode;
-
- // If tab completion is true we need to reset
- if (tabCompletion) {
- if (userCompletor != null)
- reader.removeCompleter(userCompletor);
-
- userCompletor = setupCompletion();
- reader.addCompleter(userCompletor);
- }
-
- reader.setPrompt(getDefaultPrompt());
- input = reader.readLine();
- if (input == null) {
- reader.println();
- return exitCode;
- } // User Canceled (Ctrl+D)
-
- execCommand(input, disableAuthTimeout, false);
- } catch (UserInterruptException uie) {
- // User Cancelled (Ctrl+C)
- reader.println();
-
- String partialLine = uie.getPartialLine();
- if (partialLine == null || "".equals(uie.getPartialLine().trim())) {
- // No content, actually exit
- return exitCode;
- }
- } finally {
- reader.flush();
- }
- }
- }
-
- public void shutdown() {
- if (reader != null) {
- reader.shutdown();
- }
- }
-
- public void printInfo() throws IOException {
- reader.print("\n" + SHELL_DESCRIPTION + "\n" + "- \n" + "- version: " + Constants.VERSION + "\n" + "- instance name: "
- + connector.getInstance().getInstanceName() + "\n" + "- instance id: " + connector.getInstance().getInstanceID() + "\n" + "- \n"
- + "- type 'help' for a list of available commands\n" + "- \n");
- reader.flush();
- }
-
- public void printVerboseInfo() throws IOException {
- StringBuilder sb = new StringBuilder("-\n");
- sb.append("- Current user: ").append(connector.whoami()).append("\n");
- if (execFile != null)
- sb.append("- Executing commands from: ").append(execFile).append("\n");
- if (disableAuthTimeout)
- sb.append("- Authorization timeout: disabled\n");
- else
- sb.append("- Authorization timeout: ").append(String.format("%.2fs%n", authTimeout / 1000.0));
- sb.append("- Debug: ").append(isDebuggingEnabled() ? "on" : "off").append("\n");
- if (!scanIteratorOptions.isEmpty()) {
- for (Entry<String,List<IteratorSetting>> entry : scanIteratorOptions.entrySet()) {
- sb.append("- Session scan iterators for table ").append(entry.getKey()).append(":\n");
- for (IteratorSetting setting : entry.getValue()) {
- sb.append("- Iterator ").append(setting.getName()).append(" options:\n");
- sb.append("- ").append("iteratorPriority").append(" = ").append(setting.getPriority()).append("\n");
- sb.append("- ").append("iteratorClassName").append(" = ").append(setting.getIteratorClass()).append("\n");
- for (Entry<String,String> optEntry : setting.getOptions().entrySet()) {
- sb.append("- ").append(optEntry.getKey()).append(" = ").append(optEntry.getValue()).append("\n");
- }
- }
- }
- }
- sb.append("-\n");
- reader.print(sb.toString());
- }
-
- public String getDefaultPrompt() {
- return connector.whoami() + "@" + connector.getInstance().getInstanceName() + (getTableName().isEmpty() ? "" : " ") + getTableName() + "> ";
- }
-
- public void execCommand(String input, boolean ignoreAuthTimeout, boolean echoPrompt) throws IOException {
- audit.log(Level.INFO, getDefaultPrompt() + input);
- if (echoPrompt) {
- reader.print(getDefaultPrompt());
- reader.println(input);
- }
-
- if (input.startsWith(COMMENT_PREFIX)) {
- return;
- }
-
- String fields[];
- try {
- fields = new QuotedStringTokenizer(input).getTokens();
- } catch (BadArgumentException e) {
- printException(e);
- ++exitCode;
- return;
- }
- if (fields.length == 0)
- return;
-
- String command = fields[0];
- fields = fields.length > 1 ? Arrays.copyOfRange(fields, 1, fields.length) : new String[] {};
-
- Command sc = null;
- if (command.length() > 0) {
- try {
- // Obtain the command from the command table
- sc = commandFactory.get(command);
- if (sc == null) {
- reader.println(String.format("Unknown command \"%s\". Enter \"help\" for a list possible commands.", command));
- reader.flush();
- return;
- }
-
- if (!(sc instanceof ExitCommand) && !ignoreAuthTimeout && System.currentTimeMillis() - lastUserActivity > authTimeout) {
- reader.println("Shell has been idle for too long. Please re-authenticate.");
- boolean authFailed = true;
- do {
- String pwd = readMaskedLine("Enter current password for '" + connector.whoami() + "': ", '*');
- if (pwd == null) {
- reader.println();
- return;
- } // user canceled
-
- try {
- authFailed = !connector.securityOperations().authenticateUser(connector.whoami(), new PasswordToken(pwd));
- } catch (Exception e) {
- ++exitCode;
- printException(e);
- }
-
- if (authFailed)
- reader.print("Invalid password. ");
- } while (authFailed);
- lastUserActivity = System.currentTimeMillis();
- }
-
- // Get the options from the command on how to parse the string
- Options parseOpts = sc.getOptionsWithHelp();
-
- // Parse the string using the given options
- CommandLine cl = new BasicParser().parse(parseOpts, fields);
-
- int actualArgLen = cl.getArgs().length;
- int expectedArgLen = sc.numArgs();
- if (cl.hasOption(helpOption)) {
- // Display help if asked to; otherwise execute the command
- sc.printHelp(this);
- } else if (expectedArgLen != NO_FIXED_ARG_LENGTH_CHECK && actualArgLen != expectedArgLen) {
- ++exitCode;
- // Check for valid number of fixed arguments (if not
- // negative; negative means it is not checked, for
- // vararg-like commands)
- printException(new IllegalArgumentException(String.format("Expected %d argument%s. There %s %d.", expectedArgLen, expectedArgLen == 1 ? "" : "s",
- actualArgLen == 1 ? "was" : "were", actualArgLen)));
- sc.printHelp(this);
- } else {
- int tmpCode = sc.execute(input, cl, this);
- exitCode += tmpCode;
- reader.flush();
- }
-
- } catch (ConstraintViolationException e) {
- ++exitCode;
- printConstraintViolationException(e);
- } catch (TableNotFoundException e) {
- ++exitCode;
- if (getTableName().equals(e.getTableName()))
- setTableName("");
- printException(e);
- } catch (ParseException e) {
- // not really an error if the exception is a missing required
- // option when the user is asking for help
- if (!(e instanceof MissingOptionException && (Arrays.asList(fields).contains("-" + helpOption) || Arrays.asList(fields).contains("--" + helpLongOption)))) {
- ++exitCode;
- printException(e);
- }
- if (sc != null)
- sc.printHelp(this);
- } catch (UserInterruptException e) {
- ++exitCode;
- } catch (Exception e) {
- ++exitCode;
- printException(e);
- }
- } else {
- ++exitCode;
- printException(new BadArgumentException("Unrecognized empty command", command, -1));
- }
- reader.flush();
- }
-
- /**
- * The command tree is built in reverse so that the references are more easily linked up. There is some code in token to allow forward building of the command
- * tree.
- */
- private ShellCompletor setupCompletion() {
- rootToken = new Token();
-
- Set<String> tableNames = null;
- try {
- tableNames = connector.tableOperations().list();
- } catch (Exception e) {
- log.debug("Unable to obtain list of tables", e);
- tableNames = Collections.emptySet();
- }
-
- Set<String> userlist = null;
- try {
- userlist = connector.securityOperations().listLocalUsers();
- } catch (Exception e) {
- log.debug("Unable to obtain list of users", e);
- userlist = Collections.emptySet();
- }
-
- Set<String> namespaces = null;
- try {
- namespaces = connector.namespaceOperations().list();
- } catch (Exception e) {
- log.debug("Unable to obtain list of namespaces", e);
- namespaces = Collections.emptySet();
- }
-
- Map<Command.CompletionSet,Set<String>> options = new HashMap<Command.CompletionSet,Set<String>>();
-
- Set<String> commands = new HashSet<String>();
- for (String a : commandFactory.keySet())
- commands.add(a);
-
- Set<String> modifiedUserlist = new HashSet<String>();
- Set<String> modifiedTablenames = new HashSet<String>();
- Set<String> modifiedNamespaces = new HashSet<String>();
-
- for (String a : tableNames)
- modifiedTablenames.add(a.replaceAll("([\\s'\"])", "\\\\$1"));
- for (String a : userlist)
- modifiedUserlist.add(a.replaceAll("([\\s'\"])", "\\\\$1"));
- for (String a : namespaces) {
- String b = a.replaceAll("([\\s'\"])", "\\\\$1");
- modifiedNamespaces.add(b.isEmpty() ? "\"\"" : b);
- }
-
- options.put(Command.CompletionSet.USERNAMES, modifiedUserlist);
- options.put(Command.CompletionSet.TABLENAMES, modifiedTablenames);
- options.put(Command.CompletionSet.NAMESPACES, modifiedNamespaces);
- options.put(Command.CompletionSet.COMMANDS, commands);
-
- for (Command[] cmdGroup : commandGrouping.values()) {
- for (Command c : cmdGroup) {
- c.getOptionsWithHelp(); // prep the options for the command
- // so that the completion can
- // include them
- c.registerCompletion(rootToken, options);
- }
- }
- return new ShellCompletor(rootToken, options);
- }
-
- /**
- * The Command class represents a command to be run in the shell. It contains the methods to execute along with some methods to help tab completion, and
- * return the command name, help, and usage.
- */
- public static abstract class Command {
- // Helper methods for completion
- public enum CompletionSet {
- TABLENAMES, USERNAMES, COMMANDS, NAMESPACES
- }
-
- static Set<String> getCommandNames(Map<CompletionSet,Set<String>> objects) {
- return objects.get(CompletionSet.COMMANDS);
- }
-
- static Set<String> getTableNames(Map<CompletionSet,Set<String>> objects) {
- return objects.get(CompletionSet.TABLENAMES);
- }
-
- static Set<String> getUserNames(Map<CompletionSet,Set<String>> objects) {
- return objects.get(CompletionSet.USERNAMES);
- }
-
- static Set<String> getNamespaces(Map<CompletionSet,Set<String>> objects) {
- return objects.get(CompletionSet.NAMESPACES);
- }
-
- public void registerCompletionGeneral(Token root, Set<String> args, boolean caseSens) {
- Token t = new Token(args);
- t.setCaseSensitive(caseSens);
-
- Token command = new Token(getName());
- command.addSubcommand(t);
-
- root.addSubcommand(command);
- }
-
- public void registerCompletionForTables(Token root, Map<CompletionSet,Set<String>> completionSet) {
- registerCompletionGeneral(root, completionSet.get(CompletionSet.TABLENAMES), true);
- }
-
- public void registerCompletionForUsers(Token root, Map<CompletionSet,Set<String>> completionSet) {
- registerCompletionGeneral(root, completionSet.get(CompletionSet.USERNAMES), true);
- }
-
- public void registerCompletionForCommands(Token root, Map<CompletionSet,Set<String>> completionSet) {
- registerCompletionGeneral(root, completionSet.get(CompletionSet.COMMANDS), false);
- }
-
- public void registerCompletionForNamespaces(Token root, Map<CompletionSet,Set<String>> completionSet) {
- registerCompletionGeneral(root, completionSet.get(CompletionSet.NAMESPACES), true);
- }
-
- // abstract methods to override
- public abstract int execute(String fullCommand, CommandLine cl, Shell shellState) throws Exception;
-
- public abstract String description();
-
- /**
- * If the number of arguments is not always zero (not including those arguments handled through Options), make sure to override the {@link #usage()} method.
- * Otherwise, {@link #usage()} does need to be overridden.
- */
- public abstract int numArgs();
-
- // OPTIONAL methods to override:
-
- // the general version of getname uses reflection to get the class name
- // and then cuts off the suffix -Command to get the name of the command
- public String getName() {
- String s = this.getClass().getName();
- int st = Math.max(s.lastIndexOf('$'), s.lastIndexOf('.'));
- int i = s.indexOf("Command");
- return i > 0 ? s.substring(st + 1, i).toLowerCase(Locale.ENGLISH) : null;
- }
-
- // The general version of this method adds the name
- // of the command to the completion tree
- public void registerCompletion(Token root, Map<CompletionSet,Set<String>> completion_set) {
- root.addSubcommand(new Token(getName()));
- }
-
- // The general version of this method uses the HelpFormatter
- // that comes with the apache Options package to print out the help
- public final void printHelp(Shell shellState) {
- shellState.printHelp(usage(), "description: " + this.description(), getOptionsWithHelp());
- }
-
- public final void printHelp(Shell shellState, int width) {
- shellState.printHelp(usage(), "description: " + this.description(), getOptionsWithHelp(), width);
- }
-
- // Get options with help
- public final Options getOptionsWithHelp() {
- Options opts = getOptions();
- opts.addOption(new Option(helpOption, helpLongOption, false, "display this help"));
- return opts;
- }
-
- // General usage is just the command
- public String usage() {
- return getName();
- }
-
- // General Options are empty
- public Options getOptions() {
- return new Options();
- }
- }
-
- public interface PrintLine {
- void print(String s);
-
- void close();
- }
-
- public static class PrintShell implements PrintLine {
- ConsoleReader reader;
-
- public PrintShell(ConsoleReader reader) {
- this.reader = reader;
- }
-
- @Override
- public void print(String s) {
- try {
- reader.println(s);
- } catch (Exception ex) {
- throw new RuntimeException(ex);
- }
- }
-
- @Override
- public void close() {}
- };
-
- public static class PrintFile implements PrintLine {
- PrintWriter writer;
-
- public PrintFile(String filename) throws FileNotFoundException {
- writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filename), StandardCharsets.UTF_8)));
- }
-
- @Override
- public void print(String s) {
- writer.println(s);
- }
-
- @Override
- public void close() {
- writer.close();
- }
- };
-
- public final void printLines(Iterator<String> lines, boolean paginate) throws IOException {
- printLines(lines, paginate, null);
- }
-
- public final void printLines(Iterator<String> lines, boolean paginate, PrintLine out) throws IOException {
- int linesPrinted = 0;
- String prompt = "-- hit any key to continue or 'q' to quit --";
- int lastPromptLength = prompt.length();
- int termWidth = reader.getTerminal().getWidth();
- int maxLines = reader.getTerminal().getHeight();
-
- String peek = null;
- while (lines.hasNext()) {
- String nextLine = lines.next();
- if (nextLine == null)
- continue;
- for (String line : nextLine.split("\\n")) {
- if (out == null) {
- if (peek != null) {
- reader.println(peek);
- if (paginate) {
- linesPrinted += peek.length() == 0 ? 0 : Math.ceil(peek.length() * 1.0 / termWidth);
-
- // check if displaying the next line would result in
- // scrolling off the screen
- if (linesPrinted + Math.ceil(lastPromptLength * 1.0 / termWidth) + Math.ceil(prompt.length() * 1.0 / termWidth)
- + Math.ceil(line.length() * 1.0 / termWidth) > maxLines) {
- linesPrinted = 0;
- int numdashes = (termWidth - prompt.length()) / 2;
- String nextPrompt = repeat("-", numdashes) + prompt + repeat("-", numdashes);
- lastPromptLength = nextPrompt.length();
- reader.print(nextPrompt);
- reader.flush();
-
- if (Character.toUpperCase((char) reader.readCharacter()) == 'Q') {
- reader.println();
- return;
- }
- reader.println();
- termWidth = reader.getTerminal().getWidth();
- maxLines = reader.getTerminal().getHeight();
- }
- }
- }
- peek = line;
- } else {
- out.print(line);
- }
- }
- }
- if (out == null && peek != null) {
- reader.println(peek);
- }
- }
-
- public final void printRecords(Iterable<Entry<Key,Value>> scanner, boolean printTimestamps, boolean paginate, Class<? extends Formatter> formatterClass,
- PrintLine outFile) throws IOException {
- printLines(FormatterFactory.getFormatter(formatterClass, scanner, printTimestamps), paginate, outFile);
- }
-
- public final void printRecords(Iterable<Entry<Key,Value>> scanner, boolean printTimestamps, boolean paginate, Class<? extends Formatter> formatterClass)
- throws IOException {
- printLines(FormatterFactory.getFormatter(formatterClass, scanner, printTimestamps), paginate);
- }
-
- public final void printBinaryRecords(Iterable<Entry<Key,Value>> scanner, boolean printTimestamps, boolean paginate, PrintLine outFile) throws IOException {
- printLines(FormatterFactory.getFormatter(binaryFormatterClass, scanner, printTimestamps), paginate, outFile);
- }
-
- public final void printBinaryRecords(Iterable<Entry<Key,Value>> scanner, boolean printTimestamps, boolean paginate) throws IOException {
- printLines(FormatterFactory.getFormatter(binaryFormatterClass, scanner, printTimestamps), paginate);
- }
-
- public static String repeat(String s, int c) {
- StringBuilder sb = new StringBuilder();
- for (int i = 0; i < c; i++)
- sb.append(s);
- return sb.toString();
- }
-
- public void checkTableState() {
- if (getTableName().isEmpty())
- throw new IllegalStateException(
- "Not in a table context. Please use 'table <tableName>' to switch to a table, or use '-t' to specify a table if option is available.");
- }
-
- private final void printConstraintViolationException(ConstraintViolationException cve) {
- printException(cve, "");
- int COL1 = 50, COL2 = 14;
- int col3 = Math.max(1, Math.min(Integer.MAX_VALUE, reader.getTerminal().getWidth() - COL1 - COL2 - 6));
- logError(String.format("%" + COL1 + "s-+-%" + COL2 + "s-+-%" + col3 + "s%n", repeat("-", COL1), repeat("-", COL2), repeat("-", col3)));
- logError(String.format("%-" + COL1 + "s | %" + COL2 + "s | %-" + col3 + "s%n", "Constraint class", "Violation code", "Violation Description"));
- logError(String.format("%" + COL1 + "s-+-%" + COL2 + "s-+-%" + col3 + "s%n", repeat("-", COL1), repeat("-", COL2), repeat("-", col3)));
- for (TConstraintViolationSummary cvs : cve.violationSummaries)
- logError(String.format("%-" + COL1 + "s | %" + COL2 + "d | %-" + col3 + "s%n", cvs.constrainClass, cvs.violationCode, cvs.violationDescription));
- logError(String.format("%" + COL1 + "s-+-%" + COL2 + "s-+-%" + col3 + "s%n", repeat("-", COL1), repeat("-", COL2), repeat("-", col3)));
- }
-
- public final void printException(Exception e) {
- printException(e, e.getMessage());
- }
-
- private final void printException(Exception e, String msg) {
- logError(e.getClass().getName() + (msg != null ? ": " + msg : ""));
- log.debug(e.getClass().getName() + (msg != null ? ": " + msg : ""), e);
- }
-
- public static final void setDebugging(boolean debuggingEnabled) {
- Logger.getLogger(Constants.CORE_PACKAGE_NAME).setLevel(debuggingEnabled ? Level.TRACE : Level.INFO);
- }
-
- public static final boolean isDebuggingEnabled() {
- return Logger.getLogger(Constants.CORE_PACKAGE_NAME).isTraceEnabled();
- }
-
- private final void printHelp(String usage, String description, Options opts) {
- printHelp(usage, description, opts, Integer.MAX_VALUE);
- }
-
- private final void printHelp(String usage, String description, Options opts, int width) {
- // TODO Use the OutputStream from the JLine ConsoleReader if we can ever get access to it
- new HelpFormatter().printHelp(writer, width, usage, description, opts, 2, 5, null, true);
- writer.flush();
- }
-
- public int getExitCode() {
- return exitCode;
- }
-
- public void resetExitCode() {
- exitCode = 0;
- }
-
- public void setExit(boolean exit) {
- this.exit = exit;
- }
-
- public boolean getExit() {
- return this.exit;
- }
-
- public boolean isVerbose() {
- return verbose;
- }
-
- public void setTableName(String tableName) {
- this.tableName = (tableName == null || tableName.isEmpty()) ? "" : Tables.qualified(tableName);
- }
-
- public String getTableName() {
- return tableName;
- }
-
- public ConsoleReader getReader() {
- return reader;
- }
-
- public void updateUser(String principal, AuthenticationToken token) throws AccumuloException, AccumuloSecurityException {
- connector = instance.getConnector(principal, token);
- this.principal = principal;
- this.token = token;
- }
-
- public String getPrincipal() {
- return principal;
- }
-
- public AuthenticationToken getToken() {
- return token;
- }
-
- /**
- * Return the formatter for the current table.
- *
- * @return the formatter class for the current table
- */
- public Class<? extends Formatter> getFormatter() {
- return getFormatter(this.tableName);
- }
-
- /**
- * Return the formatter for the given table.
- *
- * @param tableName
- * the table name
- * @return the formatter class for the given table
- */
- public Class<? extends Formatter> getFormatter(String tableName) {
- Class<? extends Formatter> formatter = FormatterCommand.getCurrentFormatter(tableName, this);
-
- if (null == formatter) {
- logError("Could not load the specified formatter. Using the DefaultFormatter");
- return this.defaultFormatterClass;
- } else {
- return formatter;
- }
- }
-
- public void setLogErrorsToConsole() {
- this.logErrorsToConsole = true;
- }
-
- private void logError(String s) {
- log.error(s);
- if (logErrorsToConsole) {
- try {
- reader.println("ERROR: " + s);
- reader.flush();
- } catch (IOException e) {}
- }
- }
-
- public String readMaskedLine(String prompt, Character mask) throws IOException {
- this.masking = true;
- String s = reader.readLine(prompt, mask);
- this.masking = false;
- return s;
- }
-
- public boolean isMasking() {
- return masking;
- }
-
- public boolean hasExited() {
- return exit;
- }
-
- public boolean isTabCompletion() {
- return tabCompletion;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/accumulo/blob/b2b985e2/shell/src/main/java/org/apache/accumulo/shell/ShellCommandException.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/accumulo/shell/ShellCommandException.java b/shell/src/main/java/org/apache/accumulo/shell/ShellCommandException.java
deleted file mode 100644
index b25e9da..0000000
--- a/shell/src/main/java/org/apache/accumulo/shell/ShellCommandException.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * 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.accumulo.shell;
-
-public class ShellCommandException extends Exception {
- private static final long serialVersionUID = 1L;
-
- public enum ErrorCode {
- UNKNOWN_ERROR("Unknown error"),
- UNSUPPORTED_LANGUAGE("Programming language used is not supported"),
- UNRECOGNIZED_COMMAND("Command is not supported"),
- INITIALIZATION_FAILURE("Command could not be initialized"),
- XML_PARSING_ERROR("Failed to parse the XML file");
-
- private String description;
-
- private ErrorCode(String description) {
- this.description = description;
- }
-
- public String getDescription() {
- return this.description;
- }
-
- public String toString() {
- return getDescription();
- }
- }
-
- private ErrorCode code;
- private String command;
-
- public ShellCommandException(ErrorCode code) {
- this(code, null);
- }
-
- public ShellCommandException(ErrorCode code, String command) {
- this.code = code;
- this.command = command;
- }
-
- public String getMessage() {
- return code + (command != null ? " (" + command + ")" : "");
- }
-}
http://git-wip-us.apache.org/repos/asf/accumulo/blob/b2b985e2/shell/src/main/java/org/apache/accumulo/shell/ShellCompletor.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/accumulo/shell/ShellCompletor.java b/shell/src/main/java/org/apache/accumulo/shell/ShellCompletor.java
deleted file mode 100644
index 3ed6a04..0000000
--- a/shell/src/main/java/org/apache/accumulo/shell/ShellCompletor.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * 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.accumulo.shell;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import jline.console.completer.Completer;
-
-import org.apache.accumulo.shell.Shell.Command.CompletionSet;
-import org.apache.accumulo.shell.commands.QuotedStringTokenizer;
-
-public class ShellCompletor implements Completer {
-
- // private static final Logger log = Logger.getLogger(ShellCompletor.class);
-
- Map<CompletionSet,Set<String>> options;
- Token root = null;
-
- public ShellCompletor() {}
-
- public ShellCompletor(Token root) {
- this.root = root;
- }
-
- public ShellCompletor(Token rootToken, Map<CompletionSet,Set<String>> options) {
- this.root = rootToken;
- this.options = options;
- }
-
- @Override
- @SuppressWarnings({"unchecked", "rawtypes"})
- public int complete(String buffer, int cursor, List candidates) {
- try {
- return _complete(buffer, cursor, candidates);
- } catch (Exception e) {
- candidates.add("");
- candidates.add(e.getMessage());
- return cursor;
- }
- }
-
- private int _complete(String fullBuffer, int cursor, List<String> candidates) {
- boolean inTableFlag = false, inUserFlag = false, inNamespaceFlag = false;
- // Only want to grab the buffer up to the cursor because
- // the user could be trying to tab complete in the middle
- // of the line
- String buffer = fullBuffer.substring(0, cursor);
-
- Token current_command_token = root;
- String current_string_token = null;
- boolean end_space = buffer.endsWith(" ");
-
- // tabbing with no text
- if (buffer.length() == 0) {
- candidates.addAll(root.getSubcommandNames());
- return 0;
- }
-
- String prefix = "";
-
- QuotedStringTokenizer qst = new QuotedStringTokenizer(buffer);
-
- Iterator<String> iter = qst.iterator();
- while (iter.hasNext()) {
- current_string_token = iter.next();
- current_string_token = current_string_token.replaceAll("([\\s'\"])", "\\\\$1");
-
- if (!iter.hasNext()) {
- // if we end in a space and that space isn't part of the last token
- // (which would be the case at the start of a quote) OR the buffer
- // ends with a " indicating that we need to start on the next command
- // and not complete the current command.
- if (end_space && !current_string_token.endsWith(" ") || buffer.endsWith("\"")) {
- // match subcommands
-
- // we're in a subcommand so try to match the universal
- // option flags if we're there
- if (current_string_token.trim().equals("-" + Shell.tableOption)) {
- candidates.addAll(options.get(Shell.Command.CompletionSet.TABLENAMES));
- prefix += "-" + Shell.tableOption + " ";
- } else if (current_string_token.trim().equals("-" + Shell.userOption)) {
- candidates.addAll(options.get(Shell.Command.CompletionSet.USERNAMES));
- prefix += "-" + Shell.userOption + " ";
- } else if (current_string_token.trim().equals("-" + Shell.namespaceOption)) {
- candidates.addAll(options.get(Shell.Command.CompletionSet.NAMESPACES));
- prefix += "-" + Shell.namespaceOption + " ";
- } else if (current_command_token != null) {
- Token next = current_command_token.getSubcommand(current_string_token);
- if (next != null) {
- current_command_token = next;
-
- if (current_command_token.getCaseSensitive())
- prefix += current_string_token + " ";
- else
- prefix += current_string_token.toUpperCase() + " ";
-
- candidates.addAll(current_command_token.getSubcommandNames());
- }
- }
- Collections.sort(candidates);
- return (prefix.length());
- }
- // need to match current command
- // if we're in -t <table>, -u <user>, or -tn <namespace> complete those
- if (inTableFlag) {
- for (String a : options.get(Shell.Command.CompletionSet.TABLENAMES))
- if (a.startsWith(current_string_token))
- candidates.add(a);
- } else if (inUserFlag) {
- for (String a : options.get(Shell.Command.CompletionSet.USERNAMES))
- if (a.startsWith(current_string_token))
- candidates.add(a);
- } else if (inNamespaceFlag) {
- for (String a : options.get(Shell.Command.CompletionSet.NAMESPACES))
- if (a.startsWith(current_string_token))
- candidates.add(a);
- } else if (current_command_token != null)
- candidates.addAll(current_command_token.getSubcommandNames(current_string_token));
-
- Collections.sort(candidates);
- return (prefix.length());
- }
-
- if (current_string_token.trim().equals("-" + Shell.tableOption))
- inTableFlag = true;
- else if (current_string_token.trim().equals("-" + Shell.userOption))
- inUserFlag = true;
- else if (current_string_token.trim().equals("-" + Shell.namespaceOption))
- inNamespaceFlag = true;
- else
- inUserFlag = inTableFlag = inNamespaceFlag = false;
-
- if (current_command_token != null && current_command_token.getCaseSensitive())
- prefix += current_string_token + " ";
- else
- prefix += current_string_token.toUpperCase() + " ";
-
- if (current_command_token != null && current_command_token.getSubcommandNames().contains(current_string_token))
- current_command_token = current_command_token.getSubcommand(current_string_token);
-
- }
- return 0;
- }
-}
http://git-wip-us.apache.org/repos/asf/accumulo/blob/b2b985e2/shell/src/main/java/org/apache/accumulo/shell/ShellExtension.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/accumulo/shell/ShellExtension.java b/shell/src/main/java/org/apache/accumulo/shell/ShellExtension.java
deleted file mode 100644
index d29d276..0000000
--- a/shell/src/main/java/org/apache/accumulo/shell/ShellExtension.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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.accumulo.shell;
-
-import org.apache.accumulo.shell.Shell.Command;
-
-public abstract class ShellExtension {
-
- public abstract String getExtensionName();
-
- public abstract Command[] getCommands();
-
-}
http://git-wip-us.apache.org/repos/asf/accumulo/blob/b2b985e2/shell/src/main/java/org/apache/accumulo/shell/ShellOptions.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/accumulo/shell/ShellOptions.java b/shell/src/main/java/org/apache/accumulo/shell/ShellOptions.java
deleted file mode 100644
index 302a8a9..0000000
--- a/shell/src/main/java/org/apache/accumulo/shell/ShellOptions.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.accumulo.shell;
-
-import org.apache.commons.cli.Option;
-
-/**
- * Abstract class to encompass the Options available on the Accumulo Shell
- */
-public abstract class ShellOptions {
- // Global options flags
- public static final String userOption = "u";
- public static final String tableOption = "t";
- public static final String namespaceOption = "ns";
- public static final String helpOption = "?";
- public static final String helpLongOption = "help";
-
- final Option helpOpt = new Option(helpOption, helpLongOption, false, "display this help");
-}
http://git-wip-us.apache.org/repos/asf/accumulo/blob/b2b985e2/shell/src/main/java/org/apache/accumulo/shell/ShellOptionsJC.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/accumulo/shell/ShellOptionsJC.java b/shell/src/main/java/org/apache/accumulo/shell/ShellOptionsJC.java
deleted file mode 100644
index 35cef9f..0000000
--- a/shell/src/main/java/org/apache/accumulo/shell/ShellOptionsJC.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * 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.accumulo.shell;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Scanner;
-import java.util.TreeMap;
-
-import org.apache.accumulo.core.client.ClientConfiguration;
-import org.apache.accumulo.core.client.ClientConfiguration.ClientProperty;
-import org.apache.accumulo.core.client.security.tokens.AuthenticationToken;
-import org.apache.commons.configuration.ConfigurationException;
-import org.apache.commons.configuration.PropertiesConfiguration;
-import org.apache.log4j.Logger;
-
-import com.beust.jcommander.DynamicParameter;
-import com.beust.jcommander.IStringConverter;
-import com.beust.jcommander.Parameter;
-import com.beust.jcommander.ParameterException;
-import com.beust.jcommander.converters.FileConverter;
-
-public class ShellOptionsJC {
- // Use the Shell logger because this is really just an extension.
- public static final Logger log = Logger.getLogger(Shell.class);
-
- @Parameter(names = {"-u", "--user"}, description = "username (defaults to your OS user)")
- private String username = System.getProperty("user.name", "root");
-
- public static class PasswordConverter implements IStringConverter<String> {
- public static final String STDIN = "stdin";
-
- private enum KeyType {
- PASS("pass:"), ENV("env:") {
- @Override
- String process(String value) {
- return System.getenv(value);
- }
- },
- FILE("file:") {
- @Override
- String process(String value) {
- Scanner scanner = null;
- try {
- scanner = new Scanner(new File(value));
- return scanner.nextLine();
- } catch (FileNotFoundException e) {
- throw new ParameterException(e);
- } finally {
- if (scanner != null) {
- scanner.close();
- }
- }
- }
- },
- STDIN(PasswordConverter.STDIN) {
- @Override
- public boolean matches(String value) {
- return prefix.equals(value);
- }
-
- @Override
- public String convert(String value) {
- // Will check for this later
- return prefix;
- }
- };
-
- String prefix;
-
- private KeyType(String prefix) {
- this.prefix = prefix;
- }
-
- public boolean matches(String value) {
- return value.startsWith(prefix);
- }
-
- public String convert(String value) {
- return process(value.substring(prefix.length()));
- }
-
- String process(String value) {
- return value;
- }
- };
-
- @Override
- public String convert(String value) {
- for (KeyType keyType : KeyType.values()) {
- if (keyType.matches(value)) {
- return keyType.convert(value);
- }
- }
-
- return value;
- }
- }
-
- // Note: Don't use "password = true" because then it will prompt even if we have a token
- @Parameter(names = {"-p", "--password"}, description = "password (can be specified as 'pass:<password>', 'file:<local file containing the password>', "
- + "'env:<variable containing the pass>', or stdin)", converter = PasswordConverter.class)
- private String password;
-
- public static class TokenConverter implements IStringConverter<AuthenticationToken> {
- @Override
- public AuthenticationToken convert(String value) {
- try {
- return Class.forName(value).asSubclass(AuthenticationToken.class).newInstance();
- } catch (Exception e) {
- // Catching ClassNotFoundException, ClassCastException, InstantiationException and IllegalAccessException
- throw new ParameterException(e);
- }
- }
- }
-
- @Parameter(names = {"-tc", "--tokenClass"}, description = "token type to create, use the -l to pass options", converter = TokenConverter.class)
- private AuthenticationToken authenticationToken;
-
- @DynamicParameter(names = {"-l", "--tokenProperty"}, description = "login properties in the format key=value. Reuse -l for each property")
- private Map<String,String> tokenProperties = new TreeMap<String,String>();
-
- @Parameter(names = "--disable-tab-completion", description = "disables tab completion (for less overhead when scripting)")
- private boolean tabCompletionDisabled;
-
- @Parameter(names = "--debug", description = "enables client debugging")
- private boolean debugEnabled;
-
- @Parameter(names = "--fake", description = "fake a connection to accumulo")
- private boolean fake;
-
- @Parameter(names = {"-?", "--help"}, help = true, description = "display this help")
- private boolean helpEnabled;
-
- @Parameter(names = {"-e", "--execute-command"}, description = "executes a command, and then exits")
- private String execCommand;
-
- @Parameter(names = {"-f", "--execute-file"}, description = "executes commands from a file at startup", converter = FileConverter.class)
- private File execFile;
-
- @Parameter(names = {"-fv", "--execute-file-verbose"}, description = "executes commands from a file at startup, with commands shown",
- converter = FileConverter.class)
- private File execFileVerbose;
-
- @Parameter(names = {"-h", "--hdfsZooInstance"}, description = "use hdfs zoo instance")
- private boolean hdfsZooInstance;
-
- @Parameter(names = {"-z", "--zooKeeperInstance"}, description = "use a zookeeper instance with the given instance name and list of zoo hosts", arity = 2)
- private List<String> zooKeeperInstance = new ArrayList<String>();
-
- @Parameter(names = {"--ssl"}, description = "use ssl to connect to accumulo")
- private boolean useSsl = false;
-
- @Parameter(
- names = "--config-file",
- description = "read the given client config file. If omitted, the path searched can be specified with $ACCUMULO_CLIENT_CONF_PATH, which defaults to ~/.accumulo/config:$ACCUMULO_CONF_DIR/client.conf:/etc/accumulo/client.conf")
- private String clientConfigFile = null;
-
- @Parameter(names = {"-zi", "--zooKeeperInstanceName"}, description = "use a zookeeper instance with the given instance name")
- private String zooKeeperInstanceName;
-
- @Parameter(names = {"-zh", "--zooKeeperHosts"}, description = "use a zookeeper instance with the given list of zoo hosts")
- private String zooKeeperHosts;
-
- @Parameter(names = "--auth-timeout", description = "minutes the shell can be idle without re-entering a password")
- private int authTimeout = 60; // TODO Add validator for positive number
-
- @Parameter(names = "--disable-auth-timeout", description = "disables requiring the user to re-type a password after being idle")
- private boolean authTimeoutDisabled;
-
- @Parameter(hidden = true)
- private List<String> unrecognizedOptions;
-
- public String getUsername() {
- return username;
- }
-
- public String getPassword() {
- return password;
- }
-
- public AuthenticationToken getAuthenticationToken() {
- return authenticationToken;
- }
-
- public Map<String,String> getTokenProperties() {
- return tokenProperties;
- }
-
- public boolean isTabCompletionDisabled() {
- return tabCompletionDisabled;
- }
-
- public boolean isDebugEnabled() {
- return debugEnabled;
- }
-
- public boolean isFake() {
- return fake;
- }
-
- public boolean isHelpEnabled() {
- return helpEnabled;
- }
-
- public String getExecCommand() {
- return execCommand;
- }
-
- public File getExecFile() {
- return execFile;
- }
-
- public File getExecFileVerbose() {
- return execFileVerbose;
- }
-
- public boolean isHdfsZooInstance() {
- return hdfsZooInstance;
- }
-
- public List<String> getZooKeeperInstance() {
- return zooKeeperInstance;
- }
-
- public String getZooKeeperInstanceName() {
- return zooKeeperInstanceName;
- }
-
- public String getZooKeeperHosts() {
- return zooKeeperHosts;
- }
-
- public int getAuthTimeout() {
- return authTimeout;
- }
-
- public boolean isAuthTimeoutDisabled() {
- return authTimeoutDisabled;
- }
-
- public List<String> getUnrecognizedOptions() {
- return unrecognizedOptions;
- }
-
- public boolean useSsl() {
- return useSsl;
- }
-
- public String getClientConfigFile() {
- return clientConfigFile;
- }
-
- public ClientConfiguration getClientConfiguration() throws ConfigurationException, FileNotFoundException {
- ClientConfiguration clientConfig = clientConfigFile == null ? ClientConfiguration.loadDefault() : new ClientConfiguration(new PropertiesConfiguration(
- getClientConfigFile()));
- if (useSsl()) {
- clientConfig.setProperty(ClientProperty.INSTANCE_RPC_SSL_ENABLED, "true");
- }
- return clientConfig;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/accumulo/blob/b2b985e2/shell/src/main/java/org/apache/accumulo/shell/ShellUtil.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/accumulo/shell/ShellUtil.java b/shell/src/main/java/org/apache/accumulo/shell/ShellUtil.java
deleted file mode 100644
index c0f7a9a..0000000
--- a/shell/src/main/java/org/apache/accumulo/shell/ShellUtil.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * 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.accumulo.shell;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.nio.charset.StandardCharsets;
-import java.util.List;
-import java.util.Scanner;
-
-import org.apache.commons.codec.binary.Base64;
-import org.apache.hadoop.io.Text;
-
-import com.google.common.collect.Lists;
-
-public class ShellUtil {
-
- /**
- * Scans the given file line-by-line (ignoring empty lines) and returns a list containing those lines. If decode is set to true, every line is decoded using
- * {@link Base64#decodeBase64(byte[])} from the UTF-8 bytes of that line before inserting in the list.
- *
- * @param filename
- * Path to the file that needs to be scanned
- * @param decode
- * Whether to decode lines in the file
- * @return List of {@link Text} objects containing data in the given file
- * @throws FileNotFoundException
- * if the given file doesn't exist
- */
- public static List<Text> scanFile(String filename, boolean decode) throws FileNotFoundException {
- String line;
- Scanner file = new Scanner(new File(filename), StandardCharsets.UTF_8.name());
- List<Text> result = Lists.newArrayList();
- try {
- while (file.hasNextLine()) {
- line = file.nextLine();
- if (!line.isEmpty()) {
- result.add(decode ? new Text(Base64.decodeBase64(line.getBytes(StandardCharsets.UTF_8))) : new Text(line));
- }
- }
- } finally {
- file.close();
- }
- return result;
- }
-}
http://git-wip-us.apache.org/repos/asf/accumulo/blob/b2b985e2/shell/src/main/java/org/apache/accumulo/shell/Token.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/accumulo/shell/Token.java b/shell/src/main/java/org/apache/accumulo/shell/Token.java
deleted file mode 100644
index 5083457..0000000
--- a/shell/src/main/java/org/apache/accumulo/shell/Token.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * 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.accumulo.shell;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-/*
- * A token is a word in a command in the shell. The tree that this builds is used for
- * tab-completion of tables, users, commands and certain other parts of the shell that
- * can be realistically and quickly gathered. Tokens can have multiple commands grouped
- * together and many possible subcommands, although they are stored in a set so duplicates
- * aren't allowed.
- */
-
-public class Token {
- private Set<String> command = new HashSet<String>();
- private Set<Token> subcommands = new HashSet<Token>();
- private boolean caseSensitive = false;
-
- public Token() {}
-
- public Token(String commandName) {
- this();
- command.add(commandName);
- }
-
- public Token(Collection<String> commandNames) {
- this();
- command.addAll(commandNames);
- }
-
- public Token(Set<String> commandNames, Set<Token> subCommandNames) {
- this();
- command.addAll(commandNames);
- subcommands.addAll(subCommandNames);
- }
-
- public void setCaseSensitive(boolean cs) {
- caseSensitive = cs;
- }
-
- public boolean getCaseSensitive() {
- return caseSensitive;
- }
-
- public Set<String> getCommandNames() {
- return command;
- }
-
- public Set<Token> getSubcommandList() {
- return subcommands;
- }
-
- public Token getSubcommand(String name) {
- Iterator<Token> iter = subcommands.iterator();
- while (iter.hasNext()) {
- Token t = iter.next();
- if (t.containsCommand(name))
- return t;
- }
- return null;
- }
-
- public Set<String> getSubcommandNames() {
- HashSet<String> set = new HashSet<String>();
- for (Token t : subcommands)
- set.addAll(t.getCommandNames());
- return set;
- }
-
- public Set<String> getSubcommandNames(String startsWith) {
- Iterator<Token> iter = subcommands.iterator();
- HashSet<String> set = new HashSet<String>();
- while (iter.hasNext()) {
- Token t = iter.next();
- Set<String> subset = t.getCommandNames();
- for (String s : subset) {
- if (!t.getCaseSensitive()) {
- if (s.toLowerCase().startsWith(startsWith.toLowerCase())) {
- set.add(s);
- }
- } else {
- if (s.startsWith(startsWith)) {
- set.add(s);
- }
- }
- }
- }
- return set;
- }
-
- public boolean containsCommand(String match) {
- Iterator<String> iter = command.iterator();
- while (iter.hasNext()) {
- String t = iter.next();
- if (caseSensitive) {
- if (t.equals(match))
- return true;
- } else {
- if (t.equalsIgnoreCase(match))
- return true;
- }
- }
- return false;
- }
-
- public void addSubcommand(Token t) {
- subcommands.add(t);
- }
-
- public void addSubcommand(Collection<String> t) {
- for (String a : t) {
- addSubcommand(new Token(a));
- }
- }
-
- public String toString() {
- return this.command.toString();
- }
-}
http://git-wip-us.apache.org/repos/asf/accumulo/blob/b2b985e2/shell/src/main/java/org/apache/accumulo/shell/commands/AboutCommand.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/accumulo/shell/commands/AboutCommand.java b/shell/src/main/java/org/apache/accumulo/shell/commands/AboutCommand.java
deleted file mode 100644
index 9ba8460..0000000
--- a/shell/src/main/java/org/apache/accumulo/shell/commands/AboutCommand.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * 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.accumulo.shell.commands;
-
-import java.io.IOException;
-
-import org.apache.accumulo.shell.Shell;
-import org.apache.accumulo.shell.Shell.Command;
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.Option;
-import org.apache.commons.cli.Options;
-
-public class AboutCommand extends Command {
- private Option verboseOption;
-
- @Override
- public String description() {
- return "displays information about this program";
- }
-
- @Override
- public int execute(final String fullCommand, final CommandLine cl, final Shell shellState) throws IOException {
- shellState.printInfo();
- if (cl.hasOption(verboseOption.getOpt())) {
- shellState.printVerboseInfo();
- }
- return 0;
- }
-
- @Override
- public int numArgs() {
- return 0;
- }
-
- @Override
- public Options getOptions() {
- final Options opts = new Options();
- verboseOption = new Option("v", "verbose", false, "display detailed session information");
- opts.addOption(verboseOption);
- return opts;
- }
-}
http://git-wip-us.apache.org/repos/asf/accumulo/blob/b2b985e2/shell/src/main/java/org/apache/accumulo/shell/commands/ActiveCompactionIterator.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/accumulo/shell/commands/ActiveCompactionIterator.java b/shell/src/main/java/org/apache/accumulo/shell/commands/ActiveCompactionIterator.java
deleted file mode 100644
index 159a2a6..0000000
--- a/shell/src/main/java/org/apache/accumulo/shell/commands/ActiveCompactionIterator.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * 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.accumulo.shell.commands;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.accumulo.core.client.IteratorSetting;
-import org.apache.accumulo.core.client.admin.ActiveCompaction;
-import org.apache.accumulo.core.client.admin.InstanceOperations;
-import org.apache.accumulo.core.util.Duration;
-
-class ActiveCompactionIterator implements Iterator<String> {
-
- private InstanceOperations instanceOps;
- private Iterator<String> tsIter;
- private Iterator<String> compactionIter;
-
- private static String maxDecimal(double count) {
- if (count < 9.995)
- return String.format("%.2f", count);
- if (count < 99.95)
- return String.format("%.1f", count);
- return String.format("%.0f", count);
- }
-
- private static String shortenCount(long count) {
- if (count < 1000)
- return count + "";
- if (count < 1000000)
- return maxDecimal(count / 1000.0) + "K";
- if (count < 1000000000)
- return maxDecimal(count / 1000000.0) + "M";
- return maxDecimal(count / 1000000000.0) + "B";
- }
-
- private void readNext() {
- final List<String> compactions = new ArrayList<String>();
-
- while (tsIter.hasNext()) {
-
- final String tserver = tsIter.next();
- try {
- List<ActiveCompaction> acl = instanceOps.getActiveCompactions(tserver);
-
- acl = new ArrayList<ActiveCompaction>(acl);
-
- Collections.sort(acl, new Comparator<ActiveCompaction>() {
- @Override
- public int compare(ActiveCompaction o1, ActiveCompaction o2) {
- return (int) (o2.getAge() - o1.getAge());
- }
- });
-
- for (ActiveCompaction ac : acl) {
- String output = ac.getOutputFile();
- int index = output.indexOf("tables");
- if (index > 0) {
- output = output.substring(index + 6);
- }
-
- ac.getIterators();
-
- List<String> iterList = new ArrayList<String>();
- Map<String,Map<String,String>> iterOpts = new HashMap<String,Map<String,String>>();
- for (IteratorSetting is : ac.getIterators()) {
- iterList.add(is.getName() + "=" + is.getPriority() + "," + is.getIteratorClass());
- iterOpts.put(is.getName(), is.getOptions());
- }
-
- compactions.add(String.format("%21s | %9s | %5s | %6s | %5s | %5s | %15s | %-40s | %5s | %35s | %9s | %s", tserver,
- Duration.format(ac.getAge(), "", "-"), ac.getType(), ac.getReason(), shortenCount(ac.getEntriesRead()), shortenCount(ac.getEntriesWritten()),
- ac.getTable(), ac.getExtent(), ac.getInputFiles().size(), output, iterList, iterOpts));
- }
- } catch (Exception e) {
- compactions.add(tserver + " ERROR " + e.getMessage());
- }
-
- if (compactions.size() > 0) {
- break;
- }
- }
-
- compactionIter = compactions.iterator();
- }
-
- ActiveCompactionIterator(List<String> tservers, InstanceOperations instanceOps) {
- this.instanceOps = instanceOps;
- this.tsIter = tservers.iterator();
-
- final String header = String.format(" %-21s| %-9s | %-5s | %-6s | %-5s | %-5s | %-15s | %-40s | %-5s | %-35s | %-9s | %s", "TABLET SERVER", "AGE", "TYPE",
- "REASON", "READ", "WROTE", "TABLE", "TABLET", "INPUT", "OUTPUT", "ITERATORS", "ITERATOR OPTIONS");
-
- compactionIter = Collections.singletonList(header).iterator();
- }
-
- @Override
- public boolean hasNext() {
- return compactionIter.hasNext();
- }
-
- @Override
- public String next() {
- final String next = compactionIter.next();
-
- if (!compactionIter.hasNext())
- readNext();
-
- return next;
- }
-
- @Override
- public void remove() {
- throw new UnsupportedOperationException();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/accumulo/blob/b2b985e2/shell/src/main/java/org/apache/accumulo/shell/commands/ActiveScanIterator.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/accumulo/shell/commands/ActiveScanIterator.java b/shell/src/main/java/org/apache/accumulo/shell/commands/ActiveScanIterator.java
deleted file mode 100644
index 0412317..0000000
--- a/shell/src/main/java/org/apache/accumulo/shell/commands/ActiveScanIterator.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * 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.accumulo.shell.commands;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.accumulo.core.client.admin.ActiveScan;
-import org.apache.accumulo.core.client.admin.InstanceOperations;
-import org.apache.accumulo.core.client.admin.ScanType;
-import org.apache.accumulo.core.util.Duration;
-
-class ActiveScanIterator implements Iterator<String> {
-
- private InstanceOperations instanceOps;
- private Iterator<String> tsIter;
- private Iterator<String> scansIter;
-
- private void readNext() {
- final List<String> scans = new ArrayList<String>();
-
- while (tsIter.hasNext()) {
-
- final String tserver = tsIter.next();
- try {
- final List<ActiveScan> asl = instanceOps.getActiveScans(tserver);
-
- for (ActiveScan as : asl) {
- scans.add(String.format("%21s |%21s |%9s |%9s |%7s |%6s |%8s |%8s |%10s |%20s |%10s |%10s | %s", tserver, as.getClient(),
- Duration.format(as.getAge(), "", "-"), Duration.format(as.getLastContactTime(), "", "-"), as.getState(), as.getType(), as.getUser(),
- as.getTable(), as.getColumns(), as.getAuthorizations(), (as.getType() == ScanType.SINGLE ? as.getExtent() : "N/A"), as.getSsiList(), as.getSsio()));
- }
- } catch (Exception e) {
- scans.add(tserver + " ERROR " + e.getMessage());
- }
-
- if (scans.size() > 0) {
- break;
- }
- }
-
- scansIter = scans.iterator();
- }
-
- ActiveScanIterator(List<String> tservers, InstanceOperations instanceOps) {
- this.instanceOps = instanceOps;
- this.tsIter = tservers.iterator();
-
- final String header = String.format(" %-21s| %-21s| %-9s| %-9s| %-7s| %-6s| %-8s| %-8s| %-10s| %-20s| %-10s| %-10s | %s", "TABLET SERVER", "CLIENT", "AGE",
- "LAST", "STATE", "TYPE", "USER", "TABLE", "COLUMNS", "AUTHORIZATIONS", "TABLET", "ITERATORS", "ITERATOR OPTIONS");
-
- scansIter = Collections.singletonList(header).iterator();
- }
-
- @Override
- public boolean hasNext() {
- return scansIter.hasNext();
- }
-
- @Override
- public String next() {
- final String next = scansIter.next();
-
- if (!scansIter.hasNext())
- readNext();
-
- return next;
- }
-
- @Override
- public void remove() {
- throw new UnsupportedOperationException();
- }
-
-}