/* * Copyright (C) 2012 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.crsh.cli.impl.parser; import org.crsh.cli.descriptor.ArgumentDescriptor; import org.crsh.cli.descriptor.CommandDescriptor; import org.crsh.cli.descriptor.OptionDescriptor; import org.crsh.cli.descriptor.ParameterDescriptor; import org.crsh.cli.impl.tokenizer.Token; import java.util.ArrayList; import java.util.List; public abstract class Event { // public static final class DoubleDash extends Event { // // /** . */ // protected final Token.Literal.Option.Long token; // // public DoubleDash(Token.Literal.Option.Long token) { // this.token = token; // } // } public abstract static class Parameter<T extends Token.Literal, D extends ParameterDescriptor> extends Event { /** . */ protected final CommandDescriptor<?> command; /** . */ protected final D parameter; /** . */ protected final List<T> values; public Parameter(CommandDescriptor<?> command, D parameter, List<T> values) { this.command = command; this.parameter = parameter; this.values = values; } public CommandDescriptor<?> getCommand() { return command; } public final D getParameter() { return parameter; } public final List<T> getValues() { return values; } public final T peekFirst() { return values.isEmpty() ? null : values.get(0); } public final T peekLast() { int size = values.size(); return size == 0 ? null : values.get(size - 1); } public final List<String> getStrings() { List<String> strings = new ArrayList<String>(); for (T value : values) { strings.add(value.getValue()); } return strings; } public abstract int getFrom(); public abstract int getTo(); @Override public String toString() { return getClass().getSimpleName() + "[descriptor=" + parameter + ",values=" + values + "]"; } } public static final class Option extends Parameter<Token.Literal.Word, OptionDescriptor> { /** . */ private final Token.Literal.Option token; Option(CommandDescriptor<?> command, OptionDescriptor descriptor, Token.Literal.Option token, List<Token.Literal.Word> values) { super(command, descriptor, values); this.token = token; } public final Token.Literal.Option getToken() { return token; } @Override public int getFrom() { return token.getFrom(); } @Override public int getTo() { return values.size() == 0 ? token.getTo() : peekLast().getTo(); } } public static final class Argument extends Parameter<Token.Literal, ArgumentDescriptor> { Argument(CommandDescriptor<?> command, ArgumentDescriptor descriptor, List<Token.Literal> values) throws IllegalArgumentException { super(command, descriptor, values); // if (values.size() == 0) { throw new IllegalArgumentException("No empty values"); } } @Override public int getFrom() { return peekFirst().getFrom(); } @Override public int getTo() { return peekLast().getTo(); } } public static final class Separator extends Event { /** . */ private final Token.Whitespace token; Separator(Token.Whitespace token) { this.token = token; } public Token.Whitespace getToken() { return token; } } public abstract static class Subordinate extends Event { /** . */ private final CommandDescriptor<?> descriptor; public static final class Implicit extends Subordinate { /** . */ private final Token.Literal trigger; public Implicit(CommandDescriptor<?> descriptor, Token.Literal trigger) { super(descriptor); this.trigger = trigger; } public Token.Literal getTrigger() { return trigger; } } public static final class Explicit extends Subordinate { /** . */ private final Token.Literal.Word token; public Explicit(CommandDescriptor<?> descriptor, Token.Literal.Word token) { super(descriptor); this.token = token; } public Token.Literal.Word getToken() { return token; } } Subordinate(CommandDescriptor<?> descriptor) { this.descriptor = descriptor; } public CommandDescriptor<?> getDescriptor() { return descriptor; } } public static abstract class Stop extends Event { public abstract int getIndex(); public static final class Done extends Stop { /** . */ private final int index; Done(int index) { this.index = index; } @Override public int getIndex() { return index; } } public static abstract class Unresolved<T extends Token> extends Stop { /** . */ private final T token; Unresolved(T token) { this.token = token; } @Override public final int getIndex() { return token.getFrom(); } public T getToken() { return token; } public static final class NoSuchOption extends Unresolved<Token.Literal.Option> { public NoSuchOption(Token.Literal.Option token) { super(token); } } public static final class TooManyArguments extends Unresolved<Token.Literal> { TooManyArguments(Token.Literal token) { super(token); } } } } }