/jEdit/tags/jedit-4-3-3/org/gjt/sp/jedit/bsh/Remote.java
# · Java · 215 lines · 126 code · 24 blank · 65 comment · 12 complexity · b5dfcc28cf6d214298543e138cd26f26 MD5 · raw file
- /*****************************************************************************
- * *
- * This file is part of the BeanShell Java Scripting distribution. *
- * Documentation and updates may be found at http://www.beanshell.org/ *
- * *
- * Sun Public License Notice: *
- * *
- * The contents of this file are subject to the Sun Public License Version *
- * 1.0 (the "License"); you may not use this file except in compliance with *
- * the License. A copy of the License is available at http://www.sun.com *
- * *
- * The Original Code is BeanShell. The Initial Developer of the Original *
- * Code is Pat Niemeyer. Portions created by Pat Niemeyer are Copyright *
- * (C) 2000. All Rights Reserved. *
- * *
- * GNU Public License Notice: *
- * *
- * Alternatively, the contents of this file may be used under the terms of *
- * the GNU Lesser General Public License (the "LGPL"), in which case the *
- * provisions of LGPL are applicable instead of those above. If you wish to *
- * allow use of your version of this file only under the terms of the LGPL *
- * and not to allow others to use your version of this file under the SPL, *
- * indicate your decision by deleting the provisions above and replace *
- * them with the notice and other provisions required by the LGPL. If you *
- * do not delete the provisions above, a recipient may use your version of *
- * this file under either the SPL or the LGPL. *
- * *
- * Patrick Niemeyer (pat@pat.net) *
- * Author of Learning Java, O'Reilly & Associates *
- * http://www.pat.net/~pat/ *
- * *
- *****************************************************************************/
- package org.gjt.sp.jedit.bsh;
- import java.io.*;
- import java.net.*;
- /**
- Remote executor class. Posts a script from the command line to a BshServlet
- or embedded interpreter using (respectively) HTTP or the bsh telnet
- service. Output is printed to stdout and a numeric return value is scraped
- from the result.
- */
- public class Remote
- {
- public static void main( String args[] )
- throws Exception
- {
- if ( args.length < 2 ) {
- System.out.println(
- "usage: Remote URL(http|bsh) file [ file ] ... ");
- System.exit(1);
- }
- String url = args[0];
- String text = getFile(args[1]);
- int ret = eval( url, text );
- System.exit( ret );
- }
- /**
- Evaluate text in the interpreter at url, returning a possible integer
- return value.
- */
- public static int eval( String url, String text )
- throws IOException
- {
- String returnValue = null;
- if ( url.startsWith( "http:" ) ) {
- returnValue = doHttp( url, text );
- } else if ( url.startsWith( "bsh:" ) ) {
- returnValue = doBsh( url, text );
- } else
- throw new IOException( "Unrecognized URL type."
- +"Scheme must be http:// or bsh://");
- try {
- return Integer.parseInt( returnValue );
- } catch ( Exception e ) {
- // this convention may change...
- return 0;
- }
- }
- static String doBsh( String url, String text )
- {
- OutputStream out;
- InputStream in;
- String host = "";
- String port = "";
- String returnValue = "-1";
- String orgURL = url;
-
- // Need some format checking here
- try {
- url = url.substring(6); // remove the bsh://
- // get the index of the : between the host and the port is located
- int index = url.indexOf(":");
- host = url.substring(0,index);
- port = url.substring(index+1,url.length());
- } catch ( Exception ex ) {
- System.err.println("Bad URL: "+orgURL+": "+ex );
- return returnValue;
- }
- try {
- System.out.println("Connecting to host : "
- + host + " at port : " + port);
- Socket s = new Socket(host, Integer.parseInt(port) + 1);
-
- out = s.getOutputStream();
- in = s.getInputStream();
-
- sendLine( text, out );
- BufferedReader bin = new BufferedReader(
- new InputStreamReader(in));
- String line;
- while ( (line=bin.readLine()) != null )
- System.out.println( line );
- // Need to scrape a value from the last line?
- returnValue="1";
- return returnValue;
- } catch(Exception ex) {
- System.err.println("Error communicating with server: "+ex);
- return returnValue;
- }
- }
- private static void sendLine( String line, OutputStream outPipe )
- throws IOException
- {
- outPipe.write( line.getBytes() );
- outPipe.flush();
- }
- /*
- TODO: this is not unicode friendly, nor is getFile()
- The output is urlencoded 8859_1 text.
- should probably be urlencoded UTF-8... how does the servlet determine
- the encoded charset? I guess we're supposed to add a ";charset" clause
- to the content type?
- */
- static String doHttp( String postURL, String text )
- {
- String returnValue = null;
- StringBuilder sb = new StringBuilder();
- sb.append( "bsh.client=Remote" );
- sb.append( "&bsh.script=" );
- sb.append( URLEncoder.encode( text ) );
- /*
- // This requires Java 1.3
- try {
- sb.append( URLEncoder.encode( text, "8859_1" ) );
- } catch ( UnsupportedEncodingException e ) {
- e.printStackTrace();
- }
- */
- String formData = sb.toString( );
- try {
- URL url = new URL( postURL );
- HttpURLConnection urlcon =
- (HttpURLConnection) url.openConnection( );
- urlcon.setRequestMethod("POST");
- urlcon.setRequestProperty("Content-type",
- "application/x-www-form-urlencoded");
- urlcon.setDoOutput(true);
- urlcon.setDoInput(true);
- PrintWriter pout = new PrintWriter( new OutputStreamWriter(
- urlcon.getOutputStream(), "8859_1"), true );
- pout.print( formData );
- pout.flush();
- // read results...
- int rc = urlcon.getResponseCode();
- if ( rc != HttpURLConnection.HTTP_OK )
- System.out.println("Error, HTTP response: "+rc );
- returnValue = urlcon.getHeaderField("Bsh-Return");
- BufferedReader bin = new BufferedReader(
- new InputStreamReader( urlcon.getInputStream() ) );
- String line;
- while ( (line=bin.readLine()) != null )
- System.out.println( line );
- System.out.println( "Return Value: "+returnValue );
- } catch (MalformedURLException e) {
- System.out.println(e); // bad postURL
- } catch (IOException e2) {
- System.out.println(e2); // I/O error
- }
- return returnValue;
- }
- /*
- Note: assumes default character encoding
- */
- static String getFile( String name )
- throws FileNotFoundException, IOException
- {
- StringBuilder sb = new StringBuilder();
- BufferedReader bin = new BufferedReader( new FileReader( name ) );
- String line;
- while ( (line=bin.readLine()) != null )
- sb.append( line ).append( "\n" );
- return sb.toString();
- }
- }