001 /*
002 * Copyright (C) 2003-2009 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.shell;
021
022 import org.crsh.text.CharReader;
023
024 import java.io.Serializable;
025 import java.util.Collections;
026
027 /**
028 * The response of a shell invocation.
029 *
030 * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
031 * @version $Revision$
032 */
033 public abstract class ShellResponse implements Serializable {
034
035 public static UnknownCommand unknownCommand(String name) {
036 return new UnknownCommand(name);
037 }
038
039 public static NoCommand noCommand() {
040 return NoCommand.INSTANCE;
041 }
042
043 public static Ok ok(Iterable<?> produced) {
044 return new Ok(produced);
045 }
046
047 public static Ok ok() {
048 return new Ok();
049 }
050
051 public static Display display(String text) {
052 return new Display(new CharReader(text));
053 }
054
055 public static Display display(CharReader reader) {
056 return new Display(reader);
057 }
058
059 public static Display display(Iterable<?> produced, CharReader reader) {
060 return new Display(produced, reader);
061 }
062
063 public static Error evalError(String msg, Throwable throwable) {
064 return new Error(ErrorType.EVALUATION, msg, throwable);
065 }
066
067 public static Error evalError(String msg) {
068 return new Error(ErrorType.EVALUATION, msg);
069 }
070
071 public static Error internalError(String msg, Throwable throwable) {
072 return new Error(ErrorType.INTERNAL, msg, throwable);
073 }
074
075 public static Error internalError(String msg) {
076 return new Error(ErrorType.INTERNAL, msg);
077 }
078
079 public static Error error(ErrorType type, String msg, Throwable throwable) {
080 return new Error(type, msg, throwable);
081 }
082
083 public static Error error(ErrorType type, String msg) {
084 return new Error(type, msg);
085 }
086
087 public static Cancelled cancelled() {
088 return Cancelled.INSTANCE;
089 }
090
091 public static Close close() {
092 return Close.INSTANCE;
093 }
094
095 public abstract CharReader getReader();
096
097 public static class UnknownCommand extends ShellResponse {
098
099 /** . */
100 private final String name;
101
102 private UnknownCommand(String name) {
103 this.name = name;
104 }
105
106 public String getName() {
107 return name;
108 }
109
110 @Override
111 public CharReader getReader() {
112 return new CharReader(name + ": command not found");
113 }
114
115 @Override
116 public String toString() {
117 return "UnknownCommand[" + name + "]";
118 }
119 }
120
121 public static class NoCommand extends ShellResponse {
122
123 /** . */
124 private static final NoCommand INSTANCE = new NoCommand();
125
126 private NoCommand() {
127 }
128
129 @Override
130 public CharReader getReader() {
131 return new CharReader("Please type something");
132 }
133 }
134
135 public static class Close extends ShellResponse {
136
137 /** . */
138 private static final Close INSTANCE = new Close();
139
140 private Close() {
141 }
142
143 @Override
144 public CharReader getReader() {
145 return new CharReader("Have a good day!\r\n");
146 }
147 }
148
149 /**
150 * Command execution is terminated.
151 */
152 public static class Ok extends ShellResponse {
153
154 /** . */
155 private final transient Iterable<?> produced;
156
157 private Ok() {
158 this(Collections.<Object>emptyList());
159 }
160
161 private Ok(Iterable<?> produced) {
162 this.produced = produced;
163 }
164
165 public Iterable<?> getProduced() {
166 return produced;
167 }
168
169 @Override
170 public CharReader getReader() {
171 return new CharReader("");
172 }
173 }
174
175 public static class Display extends Ok {
176
177 /** . */
178 private final CharReader reader;
179
180 private Display(CharReader reader) {
181 this.reader = reader;
182 }
183
184 private Display(Iterable<?> produced, CharReader reader) {
185 super(produced);
186
187 //
188 this.reader = reader;
189 }
190
191 @Override
192 public boolean equals(Object obj) {
193 if (obj == this) {
194 return true;
195 }
196 if (obj instanceof Display) {
197 Display that = (Display)obj;
198 return reader.equals(that.reader);
199 }
200 return false;
201 }
202
203 @Override
204 public CharReader getReader() {
205 return reader;
206 }
207 }
208
209 public static class Cancelled extends ShellResponse {
210
211 /** . */
212 private static final Cancelled INSTANCE = new Cancelled();
213
214 private Cancelled() {
215 }
216
217 @Override
218 public CharReader getReader() {
219 return new CharReader("cancelled");
220 }
221 }
222
223 public static class Error extends ShellResponse {
224
225 /** . */
226 private final ErrorType type;
227
228 /** . */
229 private final Throwable throwable;
230
231 /** . */
232 private final String msg;
233
234 private Error(ErrorType type, String msg) {
235 this.type = type;
236 this.msg = msg;
237 this.throwable = null;
238 }
239
240 private Error(ErrorType type, String msg, Throwable throwable) {
241 this.type = type;
242 this.msg = msg;
243 this.throwable = throwable;
244 }
245
246 public ErrorType getType() {
247 return type;
248 }
249
250 public Throwable getThrowable() {
251 return throwable;
252 }
253
254 @Override
255 public CharReader getReader() {
256 return new CharReader(msg);
257 }
258
259 public String toString() {
260 return "ShellResponse.Error[type=" + type + ",msg=" + msg + "]";
261 }
262 }
263 }