/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.jmeter.util; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Socket; // N.B. Do not call any JMeter methods; the jar is standalone /** * Implements a client that can talk to the JMeter BeanShell server. */ public class BeanShellClient { private static final int MINARGS = 3; public static void main(String [] args) throws Exception{ if (args.length < MINARGS){ System.out.println("Please provide "+MINARGS+" or more arguments:"); System.out.println("serverhost serverport filename [arg1 arg2 ...]"); System.out.println("e.g. "); System.out.println("localhost 9000 extras/remote.bsh apple blake 7"); return; } String host=args[0]; String portString = args[1]; String file=args[2]; int port=Integer.parseInt(portString)+1;// convert to telnet port System.out.println("Connecting to BSH server on "+host+":"+portString); try (Socket sock = new Socket(host,port); InputStream is = sock.getInputStream(); OutputStream os = sock.getOutputStream()) { SockRead sockRead = new SockRead(is); sockRead.start(); sendLine("bsh.prompt=\"\";", os);// Prompt is unnecessary sendLine("String [] args={", os); for (int i = MINARGS; i < args.length; i++) { sendLine("\"" + args[i] + "\",\n", os); } sendLine("};", os); int b; try (InputStreamReader fis = new FileReader(file)) { while ((b = fis.read()) != -1) { os.write(b); } } sendLine("bsh.prompt=\"bsh % \";", os);// Reset for other users os.flush(); sock.shutdownOutput(); // Tell server that we are done sockRead.join(); // wait for script to finish } } private static void sendLine( String line, OutputStream outPipe ) throws IOException { outPipe.write( line.getBytes() ); // TODO - charset? outPipe.flush(); } private static class SockRead extends Thread { private final InputStream is; public SockRead(InputStream _is) { this.is=_is; //this.setDaemon(true); } @Override public void run(){ System.out.println("Reading responses from server ..."); int x = 0; try { while ((x = is.read()) > -1) { char c = (char) x; System.out.print(c); } } catch (IOException e) { e.printStackTrace(); // NOSONAR No way to log here } finally { System.out.println("... disconnected from server."); } } } }