Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/main/java/AeshExample.java
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ public void handleInterrupt(Console console) {

}

@CommandDefinition(name="exit", description = "exit the program")
@CommandDefinition(name = "exit", description = "exit the program", aliases = {"quit"})
public static class ExitCommand implements Command {

@Override
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/org/jboss/aesh/cl/CommandDefinition.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@

String name();

String[] aliases() default {};

String description();

Class<? extends CommandValidator> validator() default NullCommandValidator.class;
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/org/jboss/aesh/cl/GroupCommandDefinition.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@

String name();

String[] aliases() default {};

String description();

Class<? extends CommandValidator> validator() default NullCommandValidator.class;
Expand Down
9 changes: 9 additions & 0 deletions src/main/java/org/jboss/aesh/cl/builder/CommandBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import org.jboss.aesh.util.ReflectionUtil;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
Expand All @@ -55,6 +56,7 @@ public class CommandBuilder {
private List<CommandBuilder> children;
private CommandLineParserException parserException;
private CommandPopulator<?, ? extends Command> populator;
private List<String> aliases;

public CommandBuilder() {
}
Expand All @@ -64,6 +66,12 @@ public CommandBuilder name(String name) {
return this;
}

public CommandBuilder aliases(List<String> aliases) {
this.aliases = aliases == null ? Collections.<String>emptyList()
: Collections.unmodifiableList(aliases);
return this;
}

public CommandBuilder description(String description) {
this.description = description;
return this;
Expand Down Expand Up @@ -177,6 +185,7 @@ private AeshCommandLineParser createParser() throws CommandLineParserException {
private ProcessedCommand createProcessedCommand() throws CommandLineParserException {
return new ProcessedCommandBuilder()
.name(name)
.aliases(aliases)
.command(command)
.description(description)
.addOptions(options)
Expand Down
10 changes: 8 additions & 2 deletions src/main/java/org/jboss/aesh/cl/internal/ProcessedCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import org.jboss.aesh.terminal.TerminalString;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
Expand All @@ -48,11 +49,12 @@ public class ProcessedCommand<C extends Command> {
private List<ProcessedOption> options;
private ProcessedOption argument;
private C command;
private final List<String> aliases;

public ProcessedCommand(String name, C command, String description, CommandValidator validator, ResultHandler resultHandler,
ProcessedOption argument, List<ProcessedOption> options, CommandPopulator populator ) throws OptionParserException {
public ProcessedCommand(String name, List<String> aliases, C command, String description, CommandValidator validator, ResultHandler resultHandler, ProcessedOption argument, List<ProcessedOption> options, CommandPopulator populator) throws OptionParserException {
setName(name);
setDescription(description);
this.aliases = aliases == null ? Collections.<String>emptyList() : aliases;
this.validator = validator;
this.resultHandler = resultHandler;
this.argument = argument;
Expand All @@ -69,6 +71,10 @@ public List<ProcessedOption> getOptions() {
return options;
}

public List<String> getAliases() {
return aliases;
}

public void addOption(ProcessedOption opt) throws OptionParserException {
this.options.add(new ProcessedOption(verifyThatNamesAreUnique(opt.getShortName(), opt.getName()), opt.getName(),
opt.getDescription(), opt.getArgument(), opt.isRequired(), opt.getValueSeparator(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import org.jboss.aesh.util.ReflectionUtil;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
Expand All @@ -47,6 +48,7 @@ public class ProcessedCommandBuilder {
private final List<ProcessedOption> options;
private CommandPopulator populator;
private Command command;
private List<String> aliases;

public ProcessedCommandBuilder() {
options = new ArrayList<>();
Expand All @@ -57,6 +59,12 @@ public ProcessedCommandBuilder name(String name) {
return this;
}

public ProcessedCommandBuilder aliases(List<String> aliases) {
this.aliases = aliases == null ? Collections.<String>emptyList()
: Collections.unmodifiableList(aliases);
return this;
}

public ProcessedCommandBuilder description(String usage) {
this.description = usage;
return this;
Expand Down Expand Up @@ -137,6 +145,6 @@ public ProcessedCommand create() throws CommandLineParserException {
if(resultHandler == null)
resultHandler = new NullResultHandler();

return new ProcessedCommand(name, command, description, validator, resultHandler, argument, options, populator);
return new ProcessedCommand(name, aliases, command, description, validator, resultHandler, argument, options, populator);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,8 @@ public CommandLine<? extends Command> parse(String line) {
@Override
public CommandLine<? extends Command> parse(AeshLine line, boolean ignoreRequirements) {
if(line.getWords().size() > 0) {
if(processedCommand.getName().equals(line.getWords().get(0))) {
if (processedCommand.getName().equals(line.getWords().get(0))
|| processedCommand.getAliases().contains(line.getWords().get(0))) {
if(isGroupCommand() && line.getWords().size() > 1) {
CommandLineParser<? extends Command> clp = getChildParser(line.getWords().get(1));
if(clp == null)
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/org/jboss/aesh/cl/parser/ParserGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;

Expand All @@ -67,6 +68,7 @@ private static AeshCommandContainer doGenerateCommandLineParser(Command commandO
if(command != null) {
ProcessedCommand processedCommand = new ProcessedCommandBuilder()
.name(command.name())
.aliases(Arrays.asList(command.aliases()))
.description(command.description())
.validator(command.validator())
.command(commandObject)
Expand All @@ -85,6 +87,7 @@ private static AeshCommandContainer doGenerateCommandLineParser(Command commandO
if(groupCommand != null) {
ProcessedCommand processedGroupCommand = new ProcessedCommandBuilder()
.name(groupCommand.name())
.aliases(Arrays.asList(groupCommand.aliases()))
.description(groupCommand.description())
.validator(groupCommand.validator())
.command((Command) commandObject)
Expand Down
43 changes: 31 additions & 12 deletions src/main/java/org/jboss/aesh/console/AeshConsoleImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -136,11 +136,11 @@ public void clear() {

@Override
public String getHelpInfo(String commandName) {
try (CommandContainer commandContainer = registry.getCommand(commandName, "")) {
if (commandContainer != null)
try (CommandContainer commandContainer = getCommand(commandName, "")) {
if (commandContainer != null) {
return commandContainer.printHelp(commandName);
}
catch (Exception e) { // ignored
}
} catch (Exception e) { // ignored
}
return "";
}
Expand Down Expand Up @@ -258,17 +258,36 @@ private void completeCommandName(CompleteOperation co) {
* @throws CommandNotFoundException
*/
private CommandContainer getCommand(AeshLine aeshLine, String line) throws CommandNotFoundException {
return getCommand(aeshLine.getWords().get(0), line);
}

/**
* try to return the command in the given registry if the given registry do
* not find the command, check if we have a internal registry and if its
* there.
*
* @param commandName command name
* @param line command line
* @return command
* @throws CommandNotFoundException
*/
private CommandContainer getCommand(String commandName, String line) throws CommandNotFoundException {
try {
return registry.getCommand(aeshLine.getWords().get(0), line);
return registry.getCommand(commandName, line);
//return commandContainer;
}
catch (CommandNotFoundException e) {
if (internalRegistry != null) {
CommandContainer cc = internalRegistry.getCommand(aeshLine.getWords().get(0));
if (cc != null)
return cc;
} catch (CommandNotFoundException e) {
// Lookup in aliases
try {
return registry.getCommandByAlias(commandName);
} catch (CommandNotFoundException e2) {
if (internalRegistry != null) {
CommandContainer cc = internalRegistry.getCommand(commandName);
if (cc != null) {
return cc;
}
}
throw e;
}
throw e;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ public List<ProcessedOption> getOptions() {
private static class MapProcessedCommand extends ProcessedCommand<MapCommand> {
private final ProcessedOptionProvider provider;
public MapProcessedCommand(String name,
List<String> aliases,
MapCommand command,
String description,
CommandValidator validator,
Expand All @@ -53,7 +54,7 @@ public MapProcessedCommand(String name,
List<ProcessedOption> options,
CommandPopulator populator,
ProcessedOptionProvider provider) throws OptionParserException {
super(name, command, description, validator, resultHandler, argument,
super(name, aliases, command, description, validator, resultHandler, argument,
options, populator);
this.provider = provider == null ? EMPTY_PROVIDER : provider;
}
Expand Down Expand Up @@ -83,6 +84,7 @@ public interface ProcessedOptionProvider {
private final List<ProcessedOption> options;
private CommandPopulator populator;
private MapCommand command;
private List<String> aliases;

public MapProcessedCommandBuilder() {
options = new ArrayList<>();
Expand All @@ -93,6 +95,12 @@ public MapProcessedCommandBuilder name(String name) {
return this;
}

public MapProcessedCommandBuilder aliases(List<String> aliases) {
this.aliases = aliases == null ? Collections.<String>emptyList()
: Collections.unmodifiableList(aliases);
return this;
}

public MapProcessedCommandBuilder description(String usage) {
this.description = usage;
return this;
Expand Down Expand Up @@ -195,6 +203,7 @@ public ProcessedCommand create() throws CommandLineParserException {
}

return new MapProcessedCommand(name,
aliases,
command,
description,
validator,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,13 @@ public interface CommandRegistry {
*/
CommandContainer getCommand(String name, String line) throws CommandNotFoundException;

/**
* @param alias command alias
* @return the matching CommandContainer's alias
* @throws org.jboss.aesh.console.command.CommandNotFoundException
*/
CommandContainer getCommandByAlias(String alias) throws CommandNotFoundException;

/**
* Based on input, find all commands that match or partly match
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,15 @@
import java.util.Map;
import java.util.Set;
import java.util.logging.Logger;
import org.jboss.aesh.cl.internal.ProcessedCommand;

/**
* @author <a href="mailto:stale.pedersen@jboss.org">Ståle W. Pedersen</a>
*/
public class MutableCommandRegistry implements CommandRegistry {

private final Map<String,CommandContainer<Command>> registry = new HashMap<>();
private final Map<String, CommandContainer<Command>> registry = new HashMap<>();
private final Map<String, CommandContainer<Command>> aliases = new HashMap<>();

private CommandContainerBuilder containerBuilder;

Expand Down Expand Up @@ -131,15 +133,40 @@ public void addAllCommandContainers(List<CommandContainer> commands) {
}

private void putIntoRegistry(CommandContainer commandContainer) {
if(!commandContainer.haveBuildError() &&
!registry.containsKey(commandContainer.getParser().getProcessedCommand().getName()))
registry.put(commandContainer.getParser().getProcessedCommand().getName(), commandContainer);
if (!commandContainer.haveBuildError()
&& !contains(commandContainer.getParser().getProcessedCommand())) {
registry.put(commandContainer.getParser().getProcessedCommand().getName(),
commandContainer);
ProcessedCommand<?> command = commandContainer.getParser().
getProcessedCommand();
for (String alias : command.getAliases()) {
aliases.put(alias, commandContainer);
}
}
}

private boolean contains(ProcessedCommand<?> command) {
if (registry.containsKey(command.getName())) {
return true;
}
for (String alias : command.getAliases()) {
if (aliases.containsKey(alias)) {
return true;
}
}
return false;
}

@Override
public void removeCommand(String name) {
if(registry.containsKey(name))
registry.remove(name);
if (registry.containsKey(name)) {
CommandContainer container = registry.remove(name);
ProcessedCommand<?> command = container.getParser().
getProcessedCommand();
for (String alias : command.getAliases()) {
aliases.remove(alias);
}
}
}

private CommandContainerBuilder getBuilder() {
Expand All @@ -148,4 +175,14 @@ private CommandContainerBuilder getBuilder() {
return containerBuilder;
}

@Override
public CommandContainer getCommandByAlias(String alias) throws CommandNotFoundException {
if (aliases.containsKey(alias)) {
return aliases.get(alias);
} else {
throw new CommandNotFoundException("Command: with " + alias
+ " alias was not found.");
}
}

}
6 changes: 5 additions & 1 deletion src/test/java/org/jboss/aesh/cl/CommandLineParserTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,10 @@ public void testParseCommandLine1() throws CommandLineParserException {
assertEquals("e", cl.getOptions().get(0).getShortName());
assertEquals("bar", cl.getOptions().get(0).getValue());

cl = (CommandLine<Parser1Test>) parser.parse("toto -e=bar -DXms=128m -DXmx=512m /tmp/file.txt");
assertEquals("e", cl.getOptions().get(0).getShortName());
assertEquals("bar", cl.getOptions().get(0).getValue());

cl = (CommandLine<Parser1Test>) parser.parse("test --equal=bar -DXms=128m -DXmx=512m /tmp/file.txt");
assertEquals("e", cl.getOptions().get(0).getShortName());
assertEquals("equal", cl.getOptions().get(0).getName());
Expand Down Expand Up @@ -261,7 +265,7 @@ public void testSubClass() throws CommandLineParserException {
assertEquals("bar", cl.getOptionValue("foo"));
}

@CommandDefinition(name = "test", description = "a simple test")
@CommandDefinition(name = "test", description = "a simple test", aliases = {"toto"})
public class Parser1Test extends TestingCommand {

@Option(shortName = 'X', name = "X", description = "enable X", hasValue = false)
Expand Down
Loading