/**
* Copyright (c) 2013-2016, The SeedStack authors <http://seedstack.org>
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.seedstack.seed.core.internal.command;
import com.google.common.base.Strings;
import org.seedstack.seed.SeedException;
import org.seedstack.seed.command.Argument;
import org.seedstack.seed.command.Command;
import org.seedstack.seed.command.Option;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Holds the definition of a command.
*/
class CommandDefinition implements Comparable<CommandDefinition> {
private final org.seedstack.seed.command.CommandDefinition commandDefinition;
private final Class<? extends Command> commandActionClass;
private final List<ArgumentDefinition> argumentDefinitions = new ArrayList<>();
private final List<OptionDefinition> optionDefinitions = new ArrayList<>();
CommandDefinition(org.seedstack.seed.command.CommandDefinition commandDefinition, Class<? extends Command> commandActionClass) {
this.commandDefinition = commandDefinition;
this.commandActionClass = commandActionClass;
}
void addOptionField(Option option, Field field) {
optionDefinitions.add(new OptionDefinition(option, field));
}
void addArgumentField(Argument argument, Field field) {
ArgumentDefinition argumentDefinition = new ArgumentDefinition(argument, field);
int insertionPoint = Collections.binarySearch(this.argumentDefinitions, argumentDefinition);
if (insertionPoint < 0) {
argumentDefinitions.add(-insertionPoint - 1, argumentDefinition);
} else {
throw SeedException.createNew(CommandErrorCode.ARGUMENT_INDEX_COLLISION).put("command", getQualifiedName());
}
}
List<OptionDefinition> getOptionDefinitions() {
return optionDefinitions;
}
List<ArgumentDefinition> getArgumentDefinitions() {
return argumentDefinitions;
}
String getDescription() {
return commandDefinition.description();
}
String getQualifiedName() {
return (Strings.isNullOrEmpty(commandDefinition.scope()) ? "" : commandDefinition.scope() + ":") + commandDefinition.name();
}
String getScope() {
return commandDefinition.scope();
}
String getName() {
return commandDefinition.name();
}
org.seedstack.seed.command.CommandDefinition getAnnotation() {
return commandDefinition;
}
Class<? extends Command> getCommandActionClass() {
return commandActionClass;
}
@Override
public int compareTo(CommandDefinition o) {
return getQualifiedName().compareTo(o.getQualifiedName());
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
return getQualifiedName().equals(((CommandDefinition) o).getQualifiedName());
}
@Override
public int hashCode() {
return getQualifiedName().hashCode();
}
}