/* * Copyright 2014-2016 CyberVision, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.kaaproject.kaa.server.common.thrift.cli.client; import jline.console.ConsoleReader; import org.apache.commons.lang.StringUtils; import org.apache.thrift.TException; import org.kaaproject.kaa.server.common.thrift.gen.cli.CliThriftException; import org.kaaproject.kaa.server.common.thrift.gen.cli.CommandResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.PrintStream; import java.io.UnsupportedEncodingException; import java.util.Arrays; /** * The Class BaseCliThriftClient.<br> * Main class to start CLI Client session. */ public class BaseCliThriftClient { /** * The Constant LOG. */ private static final Logger LOG = LoggerFactory .getLogger(BaseCliThriftClient.class); /** * The prompt used in console. */ public static String prompt = "kaa-console"; /** * The prompt2. */ public static String prompt2 = " "; /** * Instantiates a new base cli thrift client. */ public BaseCliThriftClient() { } /** * The main method. * * @param args the arguments * @throws Exception the exception */ public static void main(String[] args) throws Exception { //NOSONAR OptionsProcessor oproc = new OptionsProcessor(); if (!oproc.parse(args)) { System.exit(1); //NOSONAR } CliSessionState ss = new CliSessionState(); ss.in = System.in; try { ss.out = new PrintStream(System.out, true, "UTF-8"); //NOSONAR ss.err = new PrintStream(System.err, true, "UTF-8"); //NOSONAR } catch (UnsupportedEncodingException ex) { LOG.error("Exception catched: ", ex); System.exit(3); //NOSONAR } if (!oproc.process(ss)) { System.exit(2); //NOSONAR } CliSessionState.start(ss); // connect to Thrift Server if (ss.getHost() != null) { ss.connect(); if (ss.isRemoteMode()) { prompt = "[" + ss.host + ':' + ss.port + "] " + ss.remoteServerName; char[] spaces = new char[prompt.length()]; Arrays.fill(spaces, ' '); prompt2 = new String(spaces); } } BaseCliThriftClient cli = new BaseCliThriftClient(); if (ss.execString != null) { System.exit(cli.processLine(ss.execString)); //NOSONAR } ConsoleReader reader = new ConsoleReader(); reader.setBellEnabled(false); String line; int ret = 0; String prefix = ""; String curPrompt = prompt; while ((line = reader.readLine(curPrompt + "> ")) != null) { if (!prefix.equals("")) { //NOSONAR prefix += '\n'; } // if (line.trim().endsWith(";") && !line.trim().endsWith("\\;")) { line = prefix + line; ret = cli.processLine(line); prefix = ""; curPrompt = prompt; // } // else { // prefix = prefix + line; // curPrompt = prompt2; // continue; // } } ss.close(); System.exit(ret); //NOSONAR } /** * Process CLI command. * * @param cmd the CLI command to execute * @return the int execution result code */ public int processCmd(String cmd) { CliSessionState ss = CliSessionState.get(); ss.out.println(); String cmdTrimmed = cmd.trim(); int ret = 0; if (cmdTrimmed.equalsIgnoreCase("quit") //NOSONAR || cmdTrimmed.equalsIgnoreCase("exit")) { //NOSONAR System.exit(0); //NOSONAR } else if (cmdTrimmed.equalsIgnoreCase("disconnect")) { //NOSONAR if (ss.isRemoteMode()) { ss.close(); prompt = "kaa-console"; prompt2 = " "; } else { ss.err.println("Not connected!"); } } else if (ss.isRemoteMode()) { CliClient client = ss.getClient(); PrintStream out = ss.out; PrintStream err = ss.err; try { CommandResult result = client.executeCommand(cmdTrimmed); out.print(result.message); } catch (CliThriftException cliException) { LOG.error("Exception catched: ", cliException); ret = cliException.errorCode; if (ret != 0) { String errMsg = cliException.message; if (errMsg == null) { errMsg = cliException.toString(); } err.println("[Thrift CLI Error]: " + errMsg); } } catch (TException ex) { LOG.error("Exception catched: ", ex); String errMsg = ex.getMessage(); if (errMsg == null) { errMsg = ex.toString(); } ret = -10002; err.println("[Thrift Error]: " + errMsg); } } else { // local mode PrintStream out = ss.out; PrintStream err = ss.err; if (cmdTrimmed.equalsIgnoreCase("help") //NOSONAR || cmdTrimmed.equalsIgnoreCase("?")) { //NOSONAR printHelp(out); } else if (cmdTrimmed.toLowerCase().startsWith("connect")) { boolean parsed = false; String[] args = cmdTrimmed.toLowerCase().split(" "); if (args.length == 2) { String connectString = args[1]; String[] hostPort = connectString.split(":"); if (hostPort.length == 2) { String host = hostPort[0]; String strPort = hostPort[1]; int port = 0; try { port = Integer.valueOf(strPort); } catch (Exception ex) { LOG.error("Unexpected exception while parsing port. Can not parse String: " + "{} to Integer, exception catched {}", strPort, ex); } if (port > 0) { parsed = true; ss.host = host; ss.port = port; try { ss.connect(); } catch (TException ex) { String errMsg = ex.getMessage(); if (errMsg == null) { errMsg = ex.toString(); } err.println("[Thrift Error]: " + errMsg); } if (ss.isRemoteMode()) { prompt = "[" + ss.host + ':' + ss.port + "] " + ss.remoteServerName; char[] spaces = new char[prompt.length()]; Arrays.fill(spaces, ' '); prompt2 = new String(spaces); } } } } if (!parsed) { out.println("Unable to parse arguments."); out.println(); out.println("Usage: connect <host:port>"); } } else { out.println("Unknown command '" + cmdTrimmed + "'"); out.println(); printHelp(out); } } ss.out.println(); return ret; } /** * Prints the help. * * @param out the output print stream */ private void printHelp(PrintStream out) { out.println("Available commands: "); out.println(); out.println("help, ? - prints this help"); out.println("connect <host:port> - connect to remote thrift server"); out.println("disconnect - disconnect from remote thrift server"); out.println("quit, exit - quit"); } /** * Process command line. * * @param line the command line * @return the int execution result code */ public int processLine(String line) { int lastRet = 0; int ret = 0; String command = ""; for (String oneCmd : line.split(";")) { if (StringUtils.endsWith(oneCmd, "\\")) { command += StringUtils.chop(oneCmd) + ";"; continue; } else { command += oneCmd; } if (StringUtils.isBlank(command)) { continue; } ret = processCmd(command); command = ""; lastRet = ret; if (ret != 0) { return ret; } } return lastRet; } }