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 020 package org.crsh.cli.impl.tokenizer; 021 022 public 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 }