001/**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.xbean.command;
018
019import java.io.DataInputStream;
020import java.io.IOException;
021import java.io.InputStream;
022import java.io.PrintStream;
023import java.util.StringTokenizer;
024import java.util.Vector;
025
026
027public class CommandShell implements Command {
028
029    private final String prompt;
030
031    public CommandShell(String serverName) {
032        serverName = serverName.toLowerCase();
033        prompt = TTY_Reset + TTY_Bright + "["+serverName+"]$ " + TTY_Reset;
034    }
035
036    private boolean stop = false;
037    private int rc = 0;
038
039    public static final char ESC = (char) 27;
040    public static final String TTY_Reset = ESC + "[0m";
041    public static final String TTY_Bright = ESC + "[1m";
042    public static final String TTY_Dim = ESC + "[2m";
043    public static final String TTY_Underscore = ESC + "[4m";
044    public static final String TTY_Blink = ESC + "[5m";
045    public static final String TTY_Reverse = ESC + "[7m";
046    public static final String TTY_Hidden = ESC + "[8m";
047    /* Foreground Colors */
048    public static final String TTY_FG_Black = ESC + "[30m";
049    public static final String TTY_FG_Red = ESC + "[31m";
050    public static final String TTY_FG_Green = ESC + "[32m";
051    public static final String TTY_FG_Yellow = ESC + "[33m";
052    public static final String TTY_FG_Blue = ESC + "[34m";
053    public static final String TTY_FG_Magenta = ESC + "[35m";
054    public static final String TTY_FG_Cyan = ESC + "[36m";
055    public static final String TTY_FG_White = ESC + "[37m";
056    /* Background Colors */
057    public static final String TTY_BG_Black = ESC + "[40m";
058    public static final String TTY_BG_Red = ESC + "[41m";
059    public static final String TTY_BG_Green = ESC + "[42m";
060    public static final String TTY_BG_Yellow = ESC + "[43m";
061    public static final String TTY_BG_Blue = ESC + "[44m";
062    public static final String TTY_BG_Magenta = ESC + "[45m";
063    public static final String TTY_BG_Cyan = ESC + "[46m";
064    public static final String TTY_BG_White = ESC + "[47m";
065
066    public int main(String[] args, InputStream input, PrintStream out) {
067
068        DataInputStream in = new DataInputStream(input);
069        while (!stop) {
070            prompt(in, out);
071        }
072        return rc;
073    }
074
075    protected void prompt(DataInputStream in, PrintStream out) {
076        try {
077            out.print(prompt);
078            out.flush();
079
080            String commandline = in.readLine();
081            if( commandline == null ) {
082                this.stop = true;
083                return;
084            }
085            commandline = commandline.trim();
086            if (commandline.length() < 1) {
087                return;
088            }
089
090            String command = commandline;
091
092            StringTokenizer cmdstr = new StringTokenizer(command);
093            command = cmdstr.nextToken();
094
095            // Get parameters
096            Vector p = new Vector();
097            while ( cmdstr.hasMoreTokens() ) {
098                p.add(cmdstr.nextToken());
099            }
100            String[] args = new String[p.size()];
101            p.copyInto(args);
102
103            Command cmd = CommandRegistry.getCommand(command);
104
105            if (cmd == null) {
106                out.print(command);
107                out.println(": command not found");
108            } else {
109                cmd.main(args, in, out);
110            }
111        } catch (UnsupportedOperationException e) {
112            this.rc=-1;
113            this.stop = true;
114        } catch (Throwable e) {
115            e.printStackTrace(out);
116            this.rc=-1;
117            this.stop = true;
118        }
119    }
120
121    protected void badCommand(DataInputStream in, PrintStream out) throws IOException {
122        //asdf: command not found
123    }
124
125}