Return-Path: X-Original-To: apmail-accumulo-commits-archive@www.apache.org Delivered-To: apmail-accumulo-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id AA06510AB7 for ; Tue, 8 Apr 2014 03:04:12 +0000 (UTC) Received: (qmail 38178 invoked by uid 500); 8 Apr 2014 03:03:29 -0000 Delivered-To: apmail-accumulo-commits-archive@accumulo.apache.org Received: (qmail 37581 invoked by uid 500); 8 Apr 2014 03:03:12 -0000 Mailing-List: contact commits-help@accumulo.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@accumulo.apache.org Delivered-To: mailing list commits@accumulo.apache.org Received: (qmail 37321 invoked by uid 99); 8 Apr 2014 03:03:04 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 08 Apr 2014 03:03:04 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 65BF294D7AA; Tue, 8 Apr 2014 03:03:04 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: elserj@apache.org To: commits@accumulo.apache.org Date: Tue, 08 Apr 2014 03:03:22 -0000 Message-Id: In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [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 defaultFormatterClass = DefaultFormatter.class; - private final Class binaryFormatterClass = BinaryFormatter.class; - public Map> scanIteratorOptions = new HashMap>(); - public Map> iteratorProfiles = new HashMap>(); - - private Token rootToken; - public final Map commandFactory = new TreeMap(); - public final Map commandGrouping = new TreeMap(); - 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 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 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> 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 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 tableNames = null; - try { - tableNames = connector.tableOperations().list(); - } catch (Exception e) { - log.debug("Unable to obtain list of tables", e); - tableNames = Collections.emptySet(); - } - - Set userlist = null; - try { - userlist = connector.securityOperations().listLocalUsers(); - } catch (Exception e) { - log.debug("Unable to obtain list of users", e); - userlist = Collections.emptySet(); - } - - Set namespaces = null; - try { - namespaces = connector.namespaceOperations().list(); - } catch (Exception e) { - log.debug("Unable to obtain list of namespaces", e); - namespaces = Collections.emptySet(); - } - - Map> options = new HashMap>(); - - Set commands = new HashSet(); - for (String a : commandFactory.keySet()) - commands.add(a); - - Set modifiedUserlist = new HashSet(); - Set modifiedTablenames = new HashSet(); - Set modifiedNamespaces = new HashSet(); - - 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 getCommandNames(Map> objects) { - return objects.get(CompletionSet.COMMANDS); - } - - static Set getTableNames(Map> objects) { - return objects.get(CompletionSet.TABLENAMES); - } - - static Set getUserNames(Map> objects) { - return objects.get(CompletionSet.USERNAMES); - } - - static Set getNamespaces(Map> objects) { - return objects.get(CompletionSet.NAMESPACES); - } - - public void registerCompletionGeneral(Token root, Set 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) { - registerCompletionGeneral(root, completionSet.get(CompletionSet.TABLENAMES), true); - } - - public void registerCompletionForUsers(Token root, Map> completionSet) { - registerCompletionGeneral(root, completionSet.get(CompletionSet.USERNAMES), true); - } - - public void registerCompletionForCommands(Token root, Map> completionSet) { - registerCompletionGeneral(root, completionSet.get(CompletionSet.COMMANDS), false); - } - - public void registerCompletionForNamespaces(Token root, Map> 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> 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 lines, boolean paginate) throws IOException { - printLines(lines, paginate, null); - } - - public final void printLines(Iterator 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> scanner, boolean printTimestamps, boolean paginate, Class formatterClass, - PrintLine outFile) throws IOException { - printLines(FormatterFactory.getFormatter(formatterClass, scanner, printTimestamps), paginate, outFile); - } - - public final void printRecords(Iterable> scanner, boolean printTimestamps, boolean paginate, Class formatterClass) - throws IOException { - printLines(FormatterFactory.getFormatter(formatterClass, scanner, printTimestamps), paginate); - } - - public final void printBinaryRecords(Iterable> scanner, boolean printTimestamps, boolean paginate, PrintLine outFile) throws IOException { - printLines(FormatterFactory.getFormatter(binaryFormatterClass, scanner, printTimestamps), paginate, outFile); - } - - public final void printBinaryRecords(Iterable> 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 ' 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 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 getFormatter(String tableName) { - Class 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> options; - Token root = null; - - public ShellCompletor() {} - - public ShellCompletor(Token root) { - this.root = root; - } - - public ShellCompletor(Token rootToken, Map> 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 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 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 , -u , or -tn 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 { - 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:', 'file:', " - + "'env:', or stdin)", converter = PasswordConverter.class) - private String password; - - public static class TokenConverter implements IStringConverter { - @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 tokenProperties = new TreeMap(); - - @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 zooKeeperInstance = new ArrayList(); - - @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 unrecognizedOptions; - - public String getUsername() { - return username; - } - - public String getPassword() { - return password; - } - - public AuthenticationToken getAuthenticationToken() { - return authenticationToken; - } - - public Map 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 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 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 scanFile(String filename, boolean decode) throws FileNotFoundException { - String line; - Scanner file = new Scanner(new File(filename), StandardCharsets.UTF_8.name()); - List 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 command = new HashSet(); - private Set subcommands = new HashSet(); - private boolean caseSensitive = false; - - public Token() {} - - public Token(String commandName) { - this(); - command.add(commandName); - } - - public Token(Collection commandNames) { - this(); - command.addAll(commandNames); - } - - public Token(Set commandNames, Set subCommandNames) { - this(); - command.addAll(commandNames); - subcommands.addAll(subCommandNames); - } - - public void setCaseSensitive(boolean cs) { - caseSensitive = cs; - } - - public boolean getCaseSensitive() { - return caseSensitive; - } - - public Set getCommandNames() { - return command; - } - - public Set getSubcommandList() { - return subcommands; - } - - public Token getSubcommand(String name) { - Iterator iter = subcommands.iterator(); - while (iter.hasNext()) { - Token t = iter.next(); - if (t.containsCommand(name)) - return t; - } - return null; - } - - public Set getSubcommandNames() { - HashSet set = new HashSet(); - for (Token t : subcommands) - set.addAll(t.getCommandNames()); - return set; - } - - public Set getSubcommandNames(String startsWith) { - Iterator iter = subcommands.iterator(); - HashSet set = new HashSet(); - while (iter.hasNext()) { - Token t = iter.next(); - Set 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 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 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 { - - private InstanceOperations instanceOps; - private Iterator tsIter; - private Iterator 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 compactions = new ArrayList(); - - while (tsIter.hasNext()) { - - final String tserver = tsIter.next(); - try { - List acl = instanceOps.getActiveCompactions(tserver); - - acl = new ArrayList(acl); - - Collections.sort(acl, new Comparator() { - @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 iterList = new ArrayList(); - Map> iterOpts = new HashMap>(); - 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 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 { - - private InstanceOperations instanceOps; - private Iterator tsIter; - private Iterator scansIter; - - private void readNext() { - final List scans = new ArrayList(); - - while (tsIter.hasNext()) { - - final String tserver = tsIter.next(); - try { - final List 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 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(); - } - -}