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
020package org.crsh.cli.impl.tokenizer;
021
022public abstract class Token {
023
024
025  public final static class Whitespace extends Token {
026
027    public Whitespace(int index, String raw) {
028      super(index, raw);
029    }
030
031    @Override
032    public boolean equals(Object obj) {
033      if (obj == this) {
034        return true;
035      }
036      if (obj instanceof Whitespace) {
037        Whitespace that = (Whitespace)obj;
038        return super.equals(obj) && index == that.index;
039      }
040      return false;
041    }
042
043    @Override
044    public String toString() {
045      return "Token.Whitespace[index=" + index + ",raw=" + raw + "]";
046    }
047  }
048
049  public abstract static class Literal extends Token {
050
051    public abstract static class Option extends Literal {
052
053      /** . */
054      private final String name;
055
056      public final String getName() {
057        return name;
058      }
059
060      Option(int index, String raw, String value, String name) {
061        super(index, raw, value);
062        this.name = name;
063      }
064
065      public final static class Short extends Option {
066        public Short(int index, String raw, String value) {
067          super(index, raw, value, value.substring(1));
068        }
069        public Short(int index, String value) {
070          this(index, value, value);
071        }
072      }
073
074      public final static class Long extends Option {
075        public Long(int index, String value) {
076          this(index, value, value);
077        }
078        public Long(int index, String raw, String value) {
079          super(index, raw, value, value.substring(2));
080        }
081      }
082    }
083
084    public final static class Word extends Literal {
085      public Word(int index, String raw, String value) {
086        super(index, raw, value);
087      }
088
089      public Word(int index, String value) {
090        super(index, value);
091      }
092    }
093
094    /** . */
095    final String value;
096
097    Literal(int index, String value) {
098      this(index, value, value);
099    }
100
101    Literal(int index, String raw, String value) {
102      super(index, raw);
103
104      if (value == null) {
105        throw new NullPointerException();
106      }
107
108      //
109      this.value = value;
110    }
111
112    public String getValue() {
113      return value;
114    }
115
116    @Override
117    public boolean equals(Object obj) {
118      if (obj == this) {
119        return true;
120      }
121      if (obj.getClass().equals(getClass())) {
122        Literal that = (Literal)obj;
123        return super.equals(obj) && index == that.index && value.equals(that.value);
124      }
125      return false;
126    }
127
128    @Override
129    public String toString() {
130      return getClass().getSimpleName() + "[index=" + index + ",raw=" + raw + ",value=" + value + "]";
131    }
132  }
133
134  /** The index in the containing sequence. */
135  final int index;
136
137  /** . */
138  final String raw;
139
140  Token(int index, String raw) {
141
142    if (index < 0) {
143      throw new IllegalArgumentException();
144    }
145    if (raw == null) {
146      throw new NullPointerException();
147    }
148
149    //
150    this.index = index;
151    this.raw = raw;
152  }
153
154  /**
155   * Returns the raw text.
156   *
157   * @return the raw text
158   */
159  public String getRaw() {
160    return raw;
161  }
162
163  /**
164   * Returns the from index is the containing string.
165   *
166   * @return the from index
167   */
168  public int getFrom() {
169    return index;
170  }
171
172  /**
173   * Returns the to index in the containing string.
174   *
175   * @return the to index
176   */
177  public int getTo() {
178    return index + raw.length();
179  }
180
181  @Override
182  public boolean equals(Object obj) {
183    if (obj == this) {
184      return true;
185    }
186    if (obj instanceof Token) {
187      Token that = (Token)obj;
188      return index == that.index && raw.equals(that.raw);
189    }
190    return false;
191  }
192}