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 BF98210748 for ; Tue, 8 Apr 2014 00:37:40 +0000 (UTC) Received: (qmail 7739 invoked by uid 500); 8 Apr 2014 00:37:25 -0000 Delivered-To: apmail-accumulo-commits-archive@accumulo.apache.org Received: (qmail 7238 invoked by uid 500); 8 Apr 2014 00:37:11 -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 6953 invoked by uid 99); 8 Apr 2014 00:37:06 -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 00:37:06 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 8B55B94D4B8; Tue, 8 Apr 2014 00:37:05 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: mdrob@apache.org To: commits@accumulo.apache.org Date: Tue, 08 Apr 2014 00:37:29 -0000 Message-Id: In-Reply-To: <12231c1f8e464e17a778df476794cf2f@git.apache.org> References: <12231c1f8e464e17a778df476794cf2f@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [26/27] ACCUMULO-1879 Move shell into new package and module http://git-wip-us.apache.org/repos/asf/accumulo/blob/066043d4/core/src/main/java/org/apache/accumulo/core/util/shell/ShellOptionsJC.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/util/shell/ShellOptionsJC.java b/core/src/main/java/org/apache/accumulo/core/util/shell/ShellOptionsJC.java deleted file mode 100644 index 38692a0..0000000 --- a/core/src/main/java/org/apache/accumulo/core/util/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.core.util.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/066043d4/core/src/main/java/org/apache/accumulo/core/util/shell/ShellUtil.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/util/shell/ShellUtil.java b/core/src/main/java/org/apache/accumulo/core/util/shell/ShellUtil.java deleted file mode 100644 index f0dd505..0000000 --- a/core/src/main/java/org/apache/accumulo/core/util/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.core.util.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/066043d4/core/src/main/java/org/apache/accumulo/core/util/shell/Token.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/util/shell/Token.java b/core/src/main/java/org/apache/accumulo/core/util/shell/Token.java deleted file mode 100644 index b6c5869..0000000 --- a/core/src/main/java/org/apache/accumulo/core/util/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.core.util.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/066043d4/core/src/main/java/org/apache/accumulo/core/util/shell/commands/AboutCommand.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/AboutCommand.java b/core/src/main/java/org/apache/accumulo/core/util/shell/commands/AboutCommand.java deleted file mode 100644 index a0a73e4..0000000 --- a/core/src/main/java/org/apache/accumulo/core/util/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.core.util.shell.commands; - -import java.io.IOException; - -import org.apache.accumulo.core.util.shell.Shell; -import org.apache.accumulo.core.util.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/066043d4/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ActiveCompactionIterator.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ActiveCompactionIterator.java b/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ActiveCompactionIterator.java deleted file mode 100644 index bd7d9b2..0000000 --- a/core/src/main/java/org/apache/accumulo/core/util/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.core.util.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/066043d4/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ActiveScanIterator.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ActiveScanIterator.java b/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ActiveScanIterator.java deleted file mode 100644 index f1e736f..0000000 --- a/core/src/main/java/org/apache/accumulo/core/util/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.core.util.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(); - } - -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/066043d4/core/src/main/java/org/apache/accumulo/core/util/shell/commands/AddAuthsCommand.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/AddAuthsCommand.java b/core/src/main/java/org/apache/accumulo/core/util/shell/commands/AddAuthsCommand.java deleted file mode 100644 index bd478de..0000000 --- a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/AddAuthsCommand.java +++ /dev/null @@ -1,82 +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.core.util.shell.commands; - -import java.util.Map; -import java.util.Set; - -import org.apache.accumulo.core.client.AccumuloException; -import org.apache.accumulo.core.client.AccumuloSecurityException; -import org.apache.accumulo.core.security.Authorizations; -import org.apache.accumulo.core.util.shell.Shell; -import org.apache.accumulo.core.util.shell.Shell.Command; -import org.apache.accumulo.core.util.shell.Token; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.OptionGroup; -import org.apache.commons.cli.Options; - -public class AddAuthsCommand extends Command { - private Option userOpt; - private Option scanOptAuths; - - @Override - public int execute(final String fullCommand, final CommandLine cl, final Shell shellState) throws AccumuloException, AccumuloSecurityException { - final String user = cl.getOptionValue(userOpt.getOpt(), shellState.getConnector().whoami()); - final String scanOpts = cl.getOptionValue(scanOptAuths.getOpt()); - Authorizations auths = shellState.getConnector().securityOperations().getUserAuthorizations(user); - StringBuilder userAuths = new StringBuilder(); - if (!auths.isEmpty()) { - userAuths.append(auths.toString()); - userAuths.append(","); - } - userAuths.append(scanOpts); - shellState.getConnector().securityOperations().changeUserAuthorizations(user, ScanCommand.parseAuthorizations(userAuths.toString())); - Shell.log.debug("Changed record-level authorizations for user " + user); - return 0; - } - - @Override - public String description() { - return "adds authorizations to the maximum scan authorizations for a user"; - } - - @Override - public void registerCompletion(final Token root, final Map> completionSet) { - registerCompletionForUsers(root, completionSet); - } - - @Override - public Options getOptions() { - final Options o = new Options(); - final OptionGroup setOrClear = new OptionGroup(); - scanOptAuths = new Option("s", "scan-authorizations", true, "scan authorizations to set"); - scanOptAuths.setArgName("comma-separated-authorizations"); - setOrClear.addOption(scanOptAuths); - setOrClear.setRequired(true); - o.addOptionGroup(setOrClear); - userOpt = new Option(Shell.userOption, "user", true, "user to operate on"); - userOpt.setArgName("user"); - o.addOption(userOpt); - return o; - } - - @Override - public int numArgs() { - return 0; - } -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/066043d4/core/src/main/java/org/apache/accumulo/core/util/shell/commands/AddSplitsCommand.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/AddSplitsCommand.java b/core/src/main/java/org/apache/accumulo/core/util/shell/commands/AddSplitsCommand.java deleted file mode 100644 index b8ba621..0000000 --- a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/AddSplitsCommand.java +++ /dev/null @@ -1,88 +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.core.util.shell.commands; - -import java.util.TreeSet; - -import org.apache.accumulo.core.client.TableNotFoundException; -import org.apache.accumulo.core.util.shell.Shell; -import org.apache.accumulo.core.util.shell.Shell.Command; -import org.apache.accumulo.core.util.shell.ShellUtil; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.MissingArgumentException; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.Options; -import org.apache.hadoop.io.Text; - -public class AddSplitsCommand extends Command { - private Option optSplitsFile, base64Opt; - - public int execute(final String fullCommand, final CommandLine cl, final Shell shellState) throws Exception { - final String tableName = OptUtil.getTableOpt(cl, shellState); - final boolean decode = cl.hasOption(base64Opt.getOpt()); - - final TreeSet splits = new TreeSet(); - - if (cl.hasOption(optSplitsFile.getOpt())) { - splits.addAll(ShellUtil.scanFile(cl.getOptionValue(optSplitsFile.getOpt()), decode)); - } else { - if (cl.getArgList().isEmpty()) { - throw new MissingArgumentException("No split points specified"); - } - for (String s : cl.getArgs()) { - splits.add(new Text(s.getBytes(Shell.CHARSET))); - } - } - - if (!shellState.getConnector().tableOperations().exists(tableName)) { - throw new TableNotFoundException(null, tableName, null); - } - shellState.getConnector().tableOperations().addSplits(tableName, splits); - - return 0; - } - - @Override - public String description() { - return "adds split points to an existing table"; - } - - @Override - public Options getOptions() { - final Options o = new Options(); - - optSplitsFile = new Option("sf", "splits-file", true, "file with a newline-separated list of rows to split the table with"); - optSplitsFile.setArgName("filename"); - - base64Opt = new Option("b64", "base64encoded", false, "decode encoded split points (splits file only)"); - - o.addOption(OptUtil.tableOpt("name of the table to add split points to")); - o.addOption(optSplitsFile); - o.addOption(base64Opt); - return o; - } - - @Override - public String usage() { - return getName() + " [{ } ]"; - } - - @Override - public int numArgs() { - return Shell.NO_FIXED_ARG_LENGTH_CHECK; - } -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/066043d4/core/src/main/java/org/apache/accumulo/core/util/shell/commands/AuthenticateCommand.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/AuthenticateCommand.java b/core/src/main/java/org/apache/accumulo/core/util/shell/commands/AuthenticateCommand.java deleted file mode 100644 index 8ebdae8..0000000 --- a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/AuthenticateCommand.java +++ /dev/null @@ -1,66 +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.core.util.shell.commands; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.Map; -import java.util.Set; - -import org.apache.accumulo.core.client.AccumuloException; -import org.apache.accumulo.core.client.AccumuloSecurityException; -import org.apache.accumulo.core.client.security.tokens.PasswordToken; -import org.apache.accumulo.core.util.shell.Shell; -import org.apache.accumulo.core.util.shell.Shell.Command; -import org.apache.accumulo.core.util.shell.Token; -import org.apache.commons.cli.CommandLine; - -public class AuthenticateCommand extends Command { - @Override - public int execute(final String fullCommand, final CommandLine cl, final Shell shellState) throws AccumuloException, AccumuloSecurityException, IOException { - final String user = cl.getArgs()[0]; - final String p = shellState.readMaskedLine("Enter current password for '" + user + "': ", '*'); - if (p == null) { - shellState.getReader().println(); - return 0; - } // user canceled - final byte[] password = p.getBytes(StandardCharsets.UTF_8); - final boolean valid = shellState.getConnector().securityOperations().authenticateUser(user, new PasswordToken(password)); - shellState.getReader().println((valid ? "V" : "Not v") + "alid"); - return 0; - } - - @Override - public String description() { - return "verifies a user's credentials"; - } - - @Override - public String usage() { - return getName() + " "; - } - - @Override - public void registerCompletion(final Token root, final Map> completionSet) { - registerCompletionForUsers(root, completionSet); - } - - @Override - public int numArgs() { - return 1; - } -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/066043d4/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ByeCommand.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ByeCommand.java b/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ByeCommand.java deleted file mode 100644 index f0c9d24..0000000 --- a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ByeCommand.java +++ /dev/null @@ -1,19 +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.core.util.shell.commands; - -public class ByeCommand extends ExitCommand {} http://git-wip-us.apache.org/repos/asf/accumulo/blob/066043d4/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ClasspathCommand.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ClasspathCommand.java b/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ClasspathCommand.java deleted file mode 100644 index b2fe300..0000000 --- a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ClasspathCommand.java +++ /dev/null @@ -1,55 +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.core.util.shell.commands; - -import java.io.IOException; - -import jline.console.ConsoleReader; - -import org.apache.accumulo.core.util.shell.Shell; -import org.apache.accumulo.core.util.shell.Shell.Command; -import org.apache.accumulo.start.classloader.vfs.AccumuloVFSClassLoader; -import org.apache.accumulo.start.classloader.vfs.AccumuloVFSClassLoader.Printer; -import org.apache.commons.cli.CommandLine; - -public class ClasspathCommand extends Command { - @Override - public int execute(final String fullCommand, final CommandLine cl, final Shell shellState) { - final ConsoleReader reader = shellState.getReader(); - AccumuloVFSClassLoader.printClassPath(new Printer() { - @Override - public void print(String s) { - try { - reader.println(s); - } catch (IOException ex) { - throw new RuntimeException(ex); - } - } - }); - return 0; - } - - @Override - public String description() { - return "lists the current files on the classpath"; - } - - @Override - public int numArgs() { - return 0; - } -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/066043d4/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ClearCommand.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ClearCommand.java b/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ClearCommand.java deleted file mode 100644 index 4f15650..0000000 --- a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ClearCommand.java +++ /dev/null @@ -1,52 +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.core.util.shell.commands; - -import java.io.IOException; - -import org.apache.accumulo.core.util.shell.Shell; -import org.apache.accumulo.core.util.shell.Shell.Command; -import org.apache.commons.cli.CommandLine; - -public class ClearCommand extends Command { - @Override - public String description() { - return "clears the screen"; - } - - @Override - public int execute(final String fullCommand, final CommandLine cl, final Shell shellState) throws IOException { - // custom clear screen, so I don't have to redraw the prompt twice - if (!shellState.getReader().getTerminal().isAnsiSupported()) { - throw new IOException("Terminal does not support ANSI commands"); - } - // send the ANSI code to clear the screen - shellState.getReader().print(((char) 27) + "[2J"); - shellState.getReader().flush(); - - // then send the ANSI code to go to position 1,1 - shellState.getReader().print(((char) 27) + "[1;1H"); - shellState.getReader().flush(); - - return 0; - } - - @Override - public int numArgs() { - return 0; - } -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/066043d4/core/src/main/java/org/apache/accumulo/core/util/shell/commands/CloneTableCommand.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/CloneTableCommand.java b/core/src/main/java/org/apache/accumulo/core/util/shell/commands/CloneTableCommand.java deleted file mode 100644 index 207e530..0000000 --- a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/CloneTableCommand.java +++ /dev/null @@ -1,102 +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.core.util.shell.commands; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import org.apache.accumulo.core.client.AccumuloException; -import org.apache.accumulo.core.client.AccumuloSecurityException; -import org.apache.accumulo.core.client.TableExistsException; -import org.apache.accumulo.core.client.TableNotFoundException; -import org.apache.accumulo.core.util.shell.Shell; -import org.apache.accumulo.core.util.shell.Shell.Command; -import org.apache.accumulo.core.util.shell.Token; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.Options; - -public class CloneTableCommand extends Command { - - private Option setPropsOption; - private Option excludePropsOption; - private Option noFlushOption; - - @Override - public int execute(final String fullCommand, final CommandLine cl, final Shell shellState) throws AccumuloException, AccumuloSecurityException, TableNotFoundException, - TableExistsException { - - final HashMap props = new HashMap(); - final HashSet exclude = new HashSet(); - boolean flush = true; - - if (cl.hasOption(setPropsOption.getOpt())) { - String[] keyVals = cl.getOptionValue(setPropsOption.getOpt()).split(","); - for (String keyVal : keyVals) { - String[] sa = keyVal.split("="); - props.put(sa[0], sa[1]); - } - } - - if (cl.hasOption(excludePropsOption.getOpt())) { - String[] keys = cl.getOptionValue(excludePropsOption.getOpt()).split(","); - for (String key : keys) { - exclude.add(key); - } - } - - if (cl.hasOption(noFlushOption.getOpt())) { - flush = false; - } - - shellState.getConnector().tableOperations().clone(cl.getArgs()[0], cl.getArgs()[1], flush, props, exclude); - return 0; - } - - @Override - public String usage() { - return getName() + " "; - } - - @Override - public String description() { - return "clones a table"; - } - - public void registerCompletion(final Token root, final Map> completionSet) { - registerCompletionForTables(root, completionSet); - } - - @Override - public Options getOptions() { - final Options o = new Options(); - setPropsOption = new Option("s", "set", true, "set initial properties before the table comes online. Expects ={,=}"); - o.addOption(setPropsOption); - excludePropsOption = new Option("e", "exclude", true, "exclude properties that should not be copied from source table. Expects {,}"); - o.addOption(excludePropsOption); - noFlushOption = new Option("nf", "noFlush", false, "do not flush table data in memory before cloning."); - o.addOption(noFlushOption); - return o; - } - - @Override - public int numArgs() { - return 2; - } -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/066043d4/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ClsCommand.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ClsCommand.java b/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ClsCommand.java deleted file mode 100644 index cef6098..0000000 --- a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ClsCommand.java +++ /dev/null @@ -1,19 +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.core.util.shell.commands; - -public class ClsCommand extends ClearCommand {} http://git-wip-us.apache.org/repos/asf/accumulo/blob/066043d4/core/src/main/java/org/apache/accumulo/core/util/shell/commands/CompactCommand.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/CompactCommand.java b/core/src/main/java/org/apache/accumulo/core/util/shell/commands/CompactCommand.java deleted file mode 100644 index 55e9395..0000000 --- a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/CompactCommand.java +++ /dev/null @@ -1,129 +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.core.util.shell.commands; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import org.apache.accumulo.core.client.AccumuloException; -import org.apache.accumulo.core.client.AccumuloSecurityException; -import org.apache.accumulo.core.client.IteratorSetting; -import org.apache.accumulo.core.client.TableNotFoundException; -import org.apache.accumulo.core.util.shell.Shell; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.Options; -import org.apache.hadoop.io.Text; - -public class CompactCommand extends TableOperation { - private Option noFlushOption, waitOpt, profileOpt, cancelOpt; - private boolean flush; - private Text startRow; - private Text endRow; - private List iterators; - - boolean override = false; - private boolean wait; - - private boolean cancel = false; - - @Override - public String description() { - return "sets all tablets for a table to major compact as soon as possible (based on current time)"; - } - - protected void doTableOp(final Shell shellState, final String tableName) throws AccumuloException, AccumuloSecurityException { - // compact the tables - - if (cancel) { - try { - shellState.getConnector().tableOperations().cancelCompaction(tableName); - Shell.log.info("Compaction canceled for table " + tableName); - } catch (TableNotFoundException e) { - throw new AccumuloException(e); - } - } else { - try { - if (wait) { - Shell.log.info("Compacting table ..."); - } - - shellState.getConnector().tableOperations().compact(tableName, startRow, endRow, iterators, flush, wait); - - Shell.log.info("Compaction of table " + tableName + " " + (wait ? "completed" : "started") + " for given range"); - } catch (Exception ex) { - throw new AccumuloException(ex); - } - } - } - - @Override - public int execute(final String fullCommand, final CommandLine cl, final Shell shellState) throws Exception { - - if (cl.hasOption(cancelOpt.getLongOpt())) { - cancel = true; - - if (cl.getOptions().length > 2) { - throw new IllegalArgumentException("Can not specify other options with cancel"); - } - } else { - cancel = false; - } - - flush = !cl.hasOption(noFlushOption.getOpt()); - startRow = OptUtil.getStartRow(cl); - endRow = OptUtil.getEndRow(cl); - wait = cl.hasOption(waitOpt.getOpt()); - - if (cl.hasOption(profileOpt.getOpt())) { - List iterators = shellState.iteratorProfiles.get(cl.getOptionValue(profileOpt.getOpt())); - if (iterators == null) { - Shell.log.error("Profile " + cl.getOptionValue(profileOpt.getOpt()) + " does not exist"); - return -1; - } - - this.iterators = new ArrayList(iterators); - } else { - this.iterators = Collections.emptyList(); - } - - - return super.execute(fullCommand, cl, shellState); - } - - @Override - public Options getOptions() { - final Options opts = super.getOptions(); - - opts.addOption(OptUtil.startRowOpt()); - opts.addOption(OptUtil.endRowOpt()); - noFlushOption = new Option("nf", "noFlush", false, "do not flush table data in memory before compacting."); - opts.addOption(noFlushOption); - waitOpt = new Option("w", "wait", false, "wait for compact to finish"); - opts.addOption(waitOpt); - - profileOpt = new Option("pn", "profile", true, "iterator profile name"); - profileOpt.setArgName("profile"); - opts.addOption(profileOpt); - - cancelOpt = new Option(null, "cancel", false, "cancel user initiated compactions"); - opts.addOption(cancelOpt); - - return opts; - } -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/066043d4/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ConfigCommand.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ConfigCommand.java b/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ConfigCommand.java deleted file mode 100644 index c76a51f..0000000 --- a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ConfigCommand.java +++ /dev/null @@ -1,315 +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.core.util.shell.commands; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.TreeMap; - -import jline.console.ConsoleReader; - -import org.apache.accumulo.core.client.AccumuloException; -import org.apache.accumulo.core.client.AccumuloSecurityException; -import org.apache.accumulo.core.client.NamespaceNotFoundException; -import org.apache.accumulo.core.client.TableNotFoundException; -import org.apache.accumulo.core.client.impl.Namespaces; -import org.apache.accumulo.core.client.impl.Tables; -import org.apache.accumulo.core.conf.AccumuloConfiguration; -import org.apache.accumulo.core.conf.Property; -import org.apache.accumulo.core.security.ColumnVisibility; -import org.apache.accumulo.core.util.BadArgumentException; -import org.apache.accumulo.core.util.shell.Shell; -import org.apache.accumulo.core.util.shell.Shell.Command; -import org.apache.accumulo.core.util.shell.Shell.PrintFile; -import org.apache.accumulo.core.util.shell.Token; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.OptionGroup; -import org.apache.commons.cli.Options; - -public class ConfigCommand extends Command { - private Option tableOpt, deleteOpt, setOpt, filterOpt, disablePaginationOpt, outputFileOpt, namespaceOpt; - - private int COL1 = 10, COL2 = 7; - private ConsoleReader reader; - - @Override - public void registerCompletion(final Token root, final Map> completionSet) { - final Token cmd = new Token(getName()); - final Token sub = new Token("-" + setOpt.getOpt()); - for (Property p : Property.values()) { - if (!(p.getKey().endsWith(".")) && !p.isExperimental()) { - sub.addSubcommand(new Token(p.toString())); - } - } - cmd.addSubcommand(sub); - root.addSubcommand(cmd); - } - - @Override - public int execute(final String fullCommand, final CommandLine cl, final Shell shellState) throws AccumuloException, AccumuloSecurityException, - TableNotFoundException, IOException, ClassNotFoundException, NamespaceNotFoundException { - reader = shellState.getReader(); - - final String tableName = cl.getOptionValue(tableOpt.getOpt()); - if (tableName != null && !shellState.getConnector().tableOperations().exists(tableName)) { - throw new TableNotFoundException(null, tableName, null); - } - final String namespace = cl.getOptionValue(namespaceOpt.getOpt()); - if (namespace != null && !shellState.getConnector().namespaceOperations().exists(namespace)) { - throw new NamespaceNotFoundException(null, namespace, null); - } - if (cl.hasOption(deleteOpt.getOpt())) { - // delete property from table - String property = cl.getOptionValue(deleteOpt.getOpt()); - if (property.contains("=")) { - throw new BadArgumentException("Invalid '=' operator in delete operation.", fullCommand, fullCommand.indexOf('=')); - } - if (tableName != null) { - if (!Property.isValidTablePropertyKey(property)) { - Shell.log.warn("Invalid per-table property : " + property + ", still removing from zookeeper if it's there."); - } - shellState.getConnector().tableOperations().removeProperty(tableName, property); - Shell.log.debug("Successfully deleted table configuration option."); - } else if (namespace != null) { - if (!Property.isValidTablePropertyKey(property)) { - Shell.log.warn("Invalid per-table property : " + property + ", still removing from zookeeper if it's there."); - } - shellState.getConnector().namespaceOperations().removeProperty(namespace, property); - Shell.log.debug("Successfully deleted namespace configuration option."); - } else { - if (!Property.isValidZooPropertyKey(property)) { - Shell.log.warn("Invalid per-table property : " + property + ", still removing from zookeeper if it's there."); - } - shellState.getConnector().instanceOperations().removeProperty(property); - Shell.log.debug("Successfully deleted system configuration option"); - } - } else if (cl.hasOption(setOpt.getOpt())) { - // set property on table - String property = cl.getOptionValue(setOpt.getOpt()), value = null; - if (!property.contains("=")) { - throw new BadArgumentException("Missing '=' operator in set operation.", fullCommand, fullCommand.indexOf(property)); - } - final String pair[] = property.split("=", 2); - property = pair[0]; - value = pair[1]; - - if (tableName != null) { - if (!Property.isValidTablePropertyKey(property)) { - throw new BadArgumentException("Invalid per-table property.", fullCommand, fullCommand.indexOf(property)); - } - if (property.equals(Property.TABLE_DEFAULT_SCANTIME_VISIBILITY.getKey())) { - new ColumnVisibility(value); // validate that it is a valid expression - } - shellState.getConnector().tableOperations().setProperty(tableName, property, value); - Shell.log.debug("Successfully set table configuration option."); - } else if (namespace != null) { - if (!Property.isValidTablePropertyKey(property)) { - throw new BadArgumentException("Invalid per-table property.", fullCommand, fullCommand.indexOf(property)); - } - if (property.equals(Property.TABLE_DEFAULT_SCANTIME_VISIBILITY.getKey())) { - new ColumnVisibility(value); // validate that it is a valid expression - } - shellState.getConnector().namespaceOperations().setProperty(namespace, property, value); - Shell.log.debug("Successfully set table configuration option."); - } else { - if (!Property.isValidZooPropertyKey(property)) { - throw new BadArgumentException("Property cannot be modified in zookeeper", fullCommand, fullCommand.indexOf(property)); - } - shellState.getConnector().instanceOperations().setProperty(property, value); - Shell.log.debug("Successfully set system configuration option"); - } - } else { - // display properties - final TreeMap systemConfig = new TreeMap(); - systemConfig.putAll(shellState.getConnector().instanceOperations().getSystemConfiguration()); - - final String outputFile = cl.getOptionValue(outputFileOpt.getOpt()); - final PrintFile printFile = outputFile == null ? null : new PrintFile(outputFile); - - final TreeMap siteConfig = new TreeMap(); - siteConfig.putAll(shellState.getConnector().instanceOperations().getSiteConfiguration()); - - final TreeMap defaults = new TreeMap(); - for (Entry defaultEntry : AccumuloConfiguration.getDefaultConfiguration()) { - defaults.put(defaultEntry.getKey(), defaultEntry.getValue()); - } - - final TreeMap namespaceConfig = new TreeMap(); - if (tableName != null) { - String n = Namespaces.getNamespaceName(shellState.getInstance(), - Tables.getNamespaceId(shellState.getInstance(), Tables.getTableId(shellState.getInstance(), tableName))); - for (Entry e : shellState.getConnector().namespaceOperations().getProperties(n)) { - namespaceConfig.put(e.getKey(), e.getValue()); - } - } - - Iterable> acuconf = shellState.getConnector().instanceOperations().getSystemConfiguration().entrySet(); - if (tableName != null) { - acuconf = shellState.getConnector().tableOperations().getProperties(tableName); - } else if (namespace != null) { - acuconf = shellState.getConnector().namespaceOperations().getProperties(namespace); - } - final TreeMap sortedConf = new TreeMap(); - for (Entry propEntry : acuconf) { - sortedConf.put(propEntry.getKey(), propEntry.getValue()); - } - - for (Entry propEntry : acuconf) { - final String key = propEntry.getKey(); - // only show properties with similar names to that - // specified, or all of them if none specified - if (cl.hasOption(filterOpt.getOpt()) && !key.contains(cl.getOptionValue(filterOpt.getOpt()))) { - continue; - } - if ((tableName != null || namespace != null) && !Property.isValidTablePropertyKey(key)) { - continue; - } - COL2 = Math.max(COL2, propEntry.getKey().length() + 3); - } - - final ArrayList output = new ArrayList(); - printConfHeader(output); - - for (Entry propEntry : sortedConf.entrySet()) { - final String key = propEntry.getKey(); - - // only show properties with similar names to that - // specified, or all of them if none specified - if (cl.hasOption(filterOpt.getOpt()) && !key.contains(cl.getOptionValue(filterOpt.getOpt()))) { - continue; - } - if ((tableName != null || namespace != null) && !Property.isValidTablePropertyKey(key)) { - continue; - } - String siteVal = siteConfig.get(key); - String sysVal = systemConfig.get(key); - String curVal = propEntry.getValue(); - String dfault = defaults.get(key); - String nspVal = namespaceConfig.get(key); - boolean printed = false; - - if (dfault != null && key.toLowerCase().contains("password")) { - siteVal = sysVal = dfault = curVal = curVal.replaceAll(".", "*"); - } - if (sysVal != null) { - if (defaults.containsKey(key) && !Property.getPropertyByKey(key).isExperimental()) { - printConfLine(output, "default", key, dfault); - printed = true; - } - if (!defaults.containsKey(key) || !defaults.get(key).equals(siteVal)) { - printConfLine(output, "site", printed ? " @override" : key, siteVal == null ? "" : siteVal); - printed = true; - } - if (!siteConfig.containsKey(key) || !siteVal.equals(sysVal)) { - printConfLine(output, "system", printed ? " @override" : key, sysVal == null ? "" : sysVal); - printed = true; - } - - } - if (nspVal != null) { - if (!systemConfig.containsKey(key) || !sysVal.equals(nspVal)) { - printConfLine(output, "namespace", printed ? " @override" : key, nspVal == null ? "" : nspVal); - printed = true; - } - } - - // show per-table value only if it is different (overridden) - if (tableName != null && !curVal.equals(nspVal)) { - printConfLine(output, "table", printed ? " @override" : key, curVal); - } else if (namespace != null && !curVal.equals(sysVal)) { - printConfLine(output, "namespace", printed ? " @override" : key, curVal); - } - } - printConfFooter(output); - shellState.printLines(output.iterator(), !cl.hasOption(disablePaginationOpt.getOpt()), printFile); - if (printFile != null) { - printFile.close(); - } - } - return 0; - } - - private void printConfHeader(List output) { - printConfFooter(output); - output.add(String.format("%-" + COL1 + "s | %-" + COL2 + "s | %s", "SCOPE", "NAME", "VALUE")); - printConfFooter(output); - } - - private void printConfLine(List output, String s1, String s2, String s3) { - if (s2.length() < COL2) { - s2 += " " + Shell.repeat(".", COL2 - s2.length() - 1); - } - output.add(String.format("%-" + COL1 + "s | %-" + COL2 + "s | %s", s1, s2, - s3.replace("\n", "\n" + Shell.repeat(" ", COL1 + 1) + "|" + Shell.repeat(" ", COL2 + 2) + "|" + " "))); - } - - private void printConfFooter(List output) { - int col3 = Math.max(1, Math.min(Integer.MAX_VALUE, reader.getTerminal().getWidth() - COL1 - COL2 - 6)); - output.add(String.format("%" + COL1 + "s-+-%" + COL2 + "s-+-%-" + col3 + "s", Shell.repeat("-", COL1), Shell.repeat("-", COL2), Shell.repeat("-", col3))); - } - - @Override - public String description() { - return "prints system properties and table specific properties"; - } - - @Override - public Options getOptions() { - final Options o = new Options(); - final OptionGroup og = new OptionGroup(); - final OptionGroup tgroup = new OptionGroup(); - - tableOpt = new Option(Shell.tableOption, "table", true, "table to display/set/delete properties for"); - deleteOpt = new Option("d", "delete", true, "delete a per-table property"); - setOpt = new Option("s", "set", true, "set a per-table property"); - filterOpt = new Option("f", "filter", true, "show only properties that contain this string"); - disablePaginationOpt = new Option("np", "no-pagination", false, "disables pagination of output"); - outputFileOpt = new Option("o", "output", true, "local file to write the scan output to"); - namespaceOpt = new Option(Shell.namespaceOption, "namespace", true, "namespace to display/set/delete properties for"); - - tableOpt.setArgName("table"); - deleteOpt.setArgName("property"); - setOpt.setArgName("property=value"); - filterOpt.setArgName("string"); - outputFileOpt.setArgName("file"); - namespaceOpt.setArgName("namespace"); - - og.addOption(deleteOpt); - og.addOption(setOpt); - og.addOption(filterOpt); - - tgroup.addOption(tableOpt); - tgroup.addOption(namespaceOpt); - - o.addOptionGroup(tgroup); - o.addOptionGroup(og); - o.addOption(disablePaginationOpt); - o.addOption(outputFileOpt); - - return o; - } - - @Override - public int numArgs() { - return 0; - } -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/066043d4/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ConstraintCommand.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ConstraintCommand.java b/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ConstraintCommand.java deleted file mode 100644 index 208ac4a..0000000 --- a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/ConstraintCommand.java +++ /dev/null @@ -1,134 +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.core.util.shell.commands; - -import java.util.Map.Entry; - -import org.apache.accumulo.core.constraints.Constraint; -import org.apache.accumulo.core.util.shell.Shell; -import org.apache.accumulo.core.util.shell.Shell.Command; -import org.apache.accumulo.core.util.shell.ShellCommandException; -import org.apache.accumulo.core.util.shell.ShellCommandException.ErrorCode; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.OptionGroup; -import org.apache.commons.cli.Options; - -public class ConstraintCommand extends Command { - protected Option namespaceOpt; - - @Override - public int execute(final String fullCommand, final CommandLine cl, final Shell shellState) throws Exception { - final String tableName; - final String namespace; - - if (cl.hasOption(namespaceOpt.getOpt())) { - namespace = cl.getOptionValue(namespaceOpt.getOpt()); - } else { - namespace = null; - } - - if (cl.hasOption(OptUtil.tableOpt().getOpt()) || !shellState.getTableName().isEmpty()) { - tableName = OptUtil.getTableOpt(cl, shellState); - } else { - tableName = null; - } - - int i; - switch (OptUtil.getAldOpt(cl)) { - case ADD: - for (String constraint : cl.getArgs()) { - if (namespace != null) { - if (!shellState.getConnector().namespaceOperations().testClassLoad(namespace, constraint, Constraint.class.getName())) { - throw new ShellCommandException(ErrorCode.INITIALIZATION_FAILURE, "Servers are unable to load " + constraint + " as type " - + Constraint.class.getName()); - } - i = shellState.getConnector().namespaceOperations().addConstraint(namespace, constraint); - shellState.getReader().println("Added constraint " + constraint + " to namespace " + namespace + " with number " + i); - } else if (tableName != null && !tableName.isEmpty()) { - if (!shellState.getConnector().tableOperations().testClassLoad(tableName, constraint, Constraint.class.getName())) { - throw new ShellCommandException(ErrorCode.INITIALIZATION_FAILURE, "Servers are unable to load " + constraint + " as type " - + Constraint.class.getName()); - } - i = shellState.getConnector().tableOperations().addConstraint(tableName, constraint); - shellState.getReader().println("Added constraint " + constraint + " to table " + tableName + " with number " + i); - } else { - throw new IllegalArgumentException("Please specify either a table or a namespace"); - } - } - break; - case DELETE: - for (String constraint : cl.getArgs()) { - i = Integer.parseInt(constraint); - if (namespace != null) { - shellState.getConnector().namespaceOperations().removeConstraint(namespace, i); - shellState.getReader().println("Removed constraint " + i + " from namespace " + namespace); - } else if (tableName != null) { - shellState.getConnector().tableOperations().removeConstraint(tableName, i); - shellState.getReader().println("Removed constraint " + i + " from table " + tableName); - } else { - throw new IllegalArgumentException("Please specify either a table or a namespace"); - } - } - break; - case LIST: - if (namespace != null) { - for (Entry property : shellState.getConnector().namespaceOperations().listConstraints(namespace).entrySet()) { - shellState.getReader().println(property.toString()); - } - } else if (tableName != null) { - for (Entry property : shellState.getConnector().tableOperations().listConstraints(tableName).entrySet()) { - shellState.getReader().println(property.toString()); - } - } else { - throw new IllegalArgumentException("Please specify either a table or a namespace"); - } - } - - return 0; - } - - @Override - public String description() { - return "adds, deletes, or lists constraints for a table"; - } - - @Override - public int numArgs() { - return Shell.NO_FIXED_ARG_LENGTH_CHECK; - } - - @Override - public String usage() { - return getName() + " { }"; - } - - @Override - public Options getOptions() { - final Options o = new Options(); - o.addOptionGroup(OptUtil.addListDeleteGroup("constraint")); - - OptionGroup grp = new OptionGroup(); - grp.addOption(OptUtil.tableOpt("table to add, delete, or list constraints for")); - namespaceOpt = new Option(Shell.namespaceOption, "namespace", true, "name of a namespace to operate on"); - namespaceOpt.setArgName("namespace"); - grp.addOption(namespaceOpt); - - o.addOptionGroup(grp); - return o; - } -} http://git-wip-us.apache.org/repos/asf/accumulo/blob/066043d4/core/src/main/java/org/apache/accumulo/core/util/shell/commands/CreateNamespaceCommand.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/CreateNamespaceCommand.java b/core/src/main/java/org/apache/accumulo/core/util/shell/commands/CreateNamespaceCommand.java deleted file mode 100644 index a9f3deb..0000000 --- a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/CreateNamespaceCommand.java +++ /dev/null @@ -1,99 +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.core.util.shell.commands; - -import java.io.IOException; -import java.util.Map.Entry; - -import org.apache.accumulo.core.client.AccumuloException; -import org.apache.accumulo.core.client.AccumuloSecurityException; -import org.apache.accumulo.core.client.NamespaceExistsException; -import org.apache.accumulo.core.client.NamespaceNotFoundException; -import org.apache.accumulo.core.client.TableExistsException; -import org.apache.accumulo.core.client.TableNotFoundException; -import org.apache.accumulo.core.conf.Property; -import org.apache.accumulo.core.util.shell.Shell; -import org.apache.accumulo.core.util.shell.Shell.Command; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.OptionGroup; -import org.apache.commons.cli.Options; - -public class CreateNamespaceCommand extends Command { - private Option createNamespaceOptCopyConfig; - - @Override - public int execute(final String fullCommand, final CommandLine cl, final Shell shellState) throws AccumuloException, AccumuloSecurityException, - TableExistsException, TableNotFoundException, IOException, ClassNotFoundException, NamespaceExistsException, NamespaceNotFoundException { - - if (createNamespaceOptCopyConfig == null) { - getOptions(); - } - - String namespace = cl.getArgs()[0]; - - shellState.getConnector().namespaceOperations().create(namespace); - - // Copy options if flag was set - Iterable> configuration = null; - if (cl.hasOption(createNamespaceOptCopyConfig.getOpt())) { - String copy = cl.getOptionValue(createNamespaceOptCopyConfig.getOpt()); - if (shellState.getConnector().namespaceOperations().exists(namespace)) { - configuration = shellState.getConnector().namespaceOperations().getProperties(copy); - } - } - if (configuration != null) { - for (Entry entry : configuration) { - if (Property.isValidTablePropertyKey(entry.getKey())) { - shellState.getConnector().namespaceOperations().setProperty(namespace, entry.getKey(), entry.getValue()); - } - } - } - - return 0; - } - - @Override - public String description() { - return "creates a new namespace"; - } - - @Override - public String usage() { - return getName() + " "; - } - - @Override - public Options getOptions() { - final Options o = new Options(); - - createNamespaceOptCopyConfig = new Option("cc", "copy-config", true, "namespace to copy configuration from"); - createNamespaceOptCopyConfig.setArgName("namespace"); - - OptionGroup ogp = new OptionGroup(); - ogp.addOption(createNamespaceOptCopyConfig); - - o.addOptionGroup(ogp); - - return o; - } - - @Override - public int numArgs() { - return 1; - } -}