001 /*
002 * Copyright (C) 2012 eXo Platform SAS.
003 *
004 * This is free software; you can redistribute it and/or modify it
005 * under the terms of the GNU Lesser General Public License as
006 * published by the Free Software Foundation; either version 2.1 of
007 * the License, or (at your option) any later version.
008 *
009 * This software is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Lesser General Public License for more details.
013 *
014 * You should have received a copy of the GNU Lesser General Public
015 * License along with this software; if not, write to the Free
016 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
017 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
018 */
019 package org.crsh.cli.impl.invocation;
020
021 import org.crsh.cli.impl.tokenizer.Token;
022
023 import java.util.ArrayList;
024 import java.util.Iterator;
025 import java.util.List;
026
027 /**
028 * @author Julien Viet
029 */
030 class TokenList implements Iterable<Token> {
031
032 /** . */
033 final ArrayList<Token> list = new ArrayList<Token>();
034
035 TokenList() {
036 }
037
038 TokenList(Iterable<Token> tokens) {
039 for (Token token : tokens) {
040 list.add(token);
041 }
042 }
043
044 int last() {
045 return list.size() > 0 ? list.get(list.size() - 1).getTo() : 0;
046 }
047
048 public void add(Token token) {
049 if (list.size() > 0) {
050 list.add(new Token.Whitespace(last(), " "));
051 }
052 list.add(token);
053 }
054
055 public void addOption(String name) {
056 if (name.length() == 1) {
057 add(new Token.Literal.Option.Short(last(), "-" + name));
058 } else {
059 add(new Token.Literal.Option.Long(last(), "--" + name));
060 }
061 }
062
063 public void addOption(String name, List<?> value) {
064 if (value.size() > 0) {
065 Object first = value.get(0);
066 if (first instanceof Boolean) {
067 for (Object o : value) {
068 if ((Boolean)o) {
069 addOption(name);
070 }
071 }
072 } else {
073 for (Object o : value) {
074 addOption(name);
075 add(new Token.Literal.Word(last(), o.toString()));
076 }
077 }
078 }
079 }
080
081 @Override
082 public Iterator<Token> iterator() {
083 return list.iterator();
084 }
085 }