You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by bo...@locus.apache.org on 2000/11/14 11:17:01 UTC

cvs commit: jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/net TelnetTask.java

bodewig     00/11/14 02:17:00

  Modified:    src/main/org/apache/tools/ant/taskdefs/optional/net
                        TelnetTask.java
  Log:
  Improved the optional telnet task
  
  1) added an echo attribute to write to suppress output
  2) added a timeout mechanism on reads
  3) can now send an initial newline before expecting anything from the server
  
  Submitted by:	Scott Carlson <Sc...@email.com>
  
  Revision  Changes    Path
  1.2       +109 -12   jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/net/TelnetTask.java
  
  Index: TelnetTask.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/net/TelnetTask.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- TelnetTask.java	2000/11/08 17:01:10	1.1
  +++ TelnetTask.java	2000/11/14 10:17:00	1.2
  @@ -69,7 +69,7 @@
    * Class to provide automated telnet protocol support for the Ant build tool
    *
    * @author Scott Carlson<a href="mailto:ScottCarlson@email.com">ScottCarlson@email.com</a>
  - * @version $Revision: 1.1 $
  + * @version $Revision: 1.2 $
    */
   
   public class TelnetTask extends Task {
  @@ -104,6 +104,17 @@
       private Vector telnetTasks = new Vector();
   
       /** 
  +     *  If true, adds a CR to beginning of login script
  +     */
  +    private boolean addCarriageReturn = false;
  +
  +    /**
  +     *  Default time allowed for waiting for a valid response
  +     *  for all child reads.  A value of 0 means no limit.
  +     */
  +    private Integer defaultTimeout = null;
  +
  +    /** 
        *  Verify that all parameters are included. 
        *  Connect and possibly login
        *  Iterate through the list of Reads and writes 
  @@ -136,6 +147,8 @@
          while (tasksToRun!=null && tasksToRun.hasMoreElements())
          {
              TelnetSubTask task = (TelnetSubTask) tasksToRun.nextElement();
  +           if (task instanceof TelnetRead && defaultTimeout != null)
  +               ((TelnetRead)task).setDefaultTimeout(defaultTimeout);
              task.execute(telnet);
          }
       }
  @@ -146,30 +159,52 @@
        */
       private void login()
       {
  +       if (addCarriageReturn)
  +          telnet.sendString("\n", true);
          telnet.waitForString("ogin:");
  -       telnet.sendString(userid);
  +       telnet.sendString(userid, true);
          telnet.waitForString("assword:");
  -       telnet.sendString(password);
  +       telnet.sendString(password, false);
       }
   
       /**
        *  Set the userid attribute 
        */
       public void setUserid(String u) { this.userid = u; }
  +
       /**
        *  Set the password attribute 
        */
       public void setPassword(String p) { this.password = p; }
  +
       /**
        *  Set the server address attribute 
        */
       public void setServer(String m) { this.server = m; }
  +
       /**
        *  Set the tcp port to connect to attribute 
        */
       public void setPort(int p) { this.port = p; }
   
       /**
  +     *  Set the tcp port to connect to attribute 
  +     */
  +    public void setInitialCR(boolean b)
  +    {
  +       this.addCarriageReturn = b;
  +    }
  +
  +    /**
  +     *  Change the default timeout to wait for 
  +     *  valid responses
  +     */
  +    public void setTimeout(Integer i)
  +    {
  +       this.defaultTimeout = i;
  +    }
  +
  +    /**
        *  A subTask <read> tag was found.  Create the object, 
        *  Save it in our list, and return it.
        */
  @@ -215,10 +250,16 @@
        */
       public class TelnetWrite extends TelnetSubTask
       {
  +        private boolean echoString = true;
           public void execute(AntTelnetClient telnet) 
                  throws BuildException
  +        {
  +           telnet.sendString(taskString, echoString);
  +        }
  +        
  +        public void setEcho(boolean b)
           {
  -            telnet.sendString(taskString);
  +           echoString = b;
           }
       }
       /**
  @@ -227,12 +268,28 @@
        */
       public class TelnetRead extends TelnetSubTask
       {
  +        private Integer timeout = null;
           public void execute(AntTelnetClient telnet) 
                  throws BuildException
  +        {
  +            telnet.waitForString(taskString, timeout);
  +        }
  +        /**
  +         *  Override any default timeouts
  +         */
  +        public void setTimeout(Integer i)
           {
  -            telnet.waitForString(taskString);
  +           this.timeout = i;
           }
  +        /**
  +         *  Sets the default timeout if none has been set already
  +         */
  +        public void setDefaultTimeout(Integer defaultTimeout)
  +        {
  +           if (timeout == null)
  +              timeout = defaultTimeout;
       }
  +    }
       /**
        *  This class handles the abstraction of the telnet protocol.
        *  Currently it is a wrapper around <a href="www.oroinc.com">ORO</a>'s 
  @@ -240,31 +297,71 @@
        */
       public class AntTelnetClient extends TelnetClient
       {
  +      /**
  +       * Read from the telnet session until the string we are 
  +       * waiting for is found 
  +       * @parm s The string to wait on 
  +       */
         public void waitForString(String s)
         {
  +           waitForString(s, null);
  +      }
  +
  +      /**
  +       * Read from the telnet session until the string we are 
  +       * waiting for is found or the timeout has been reached
  +       * @parm s The string to wait on 
  +       * @parm timeout The maximum number of seconds to wait
  +       */
  +      public void waitForString(String s, Integer timeout)
  +      {
           InputStream is =this.getInputStream();
           try {
             StringBuffer sb = new StringBuffer();
  -          while (sb.toString().indexOf(s) == -1)
  +          if (timeout == null || timeout.intValue() == 0)
             {
  -              while (is.available() == 0);
  -              int iC = is.read();
  -              Character c = new Character((char)iC);
  -              sb.append(c);
  +              while (sb.toString().indexOf(s) == -1)
  +                  {
  +                      sb.append((char) is.read());
  +                  }
             }
  +          else
  +          {
  +              Calendar endTime = Calendar.getInstance(); 
  +              endTime.add(Calendar.SECOND,timeout.intValue());
  +              while ( sb.toString().indexOf(s) == -1)
  +              {
  +                  while (Calendar.getInstance().before(endTime) &&
  +                         is.available() == 0) {
  +                      Thread.sleep(250);
  +                  }
  +                  if (is.available() == 0)
  +                      throw new BuildException("Response Timed-Out", getLocation());
  +                  sb.append((char) is.read());
  +              }
  +          }
             log(sb.toString(), Project.MSG_INFO);
  +        } catch (BuildException be)
  +        { 
  +            throw be;
           } catch (Exception e)
           { 
               throw new BuildException(e, getLocation());
           }
         }
  +
       
  -      public void sendString(String s)
  +      /**
  +       * Write this string to the telnet session.
  +       * @parm echoString  Logs string sent
  +       */
  +      public void sendString(String s, boolean echoString)
         {
           OutputStream os =this.getOutputStream();
           try {
             os.write((s + "\n").getBytes());
  -          log(s, Project.MSG_INFO);
  +          if (echoString)
  +              log(s, Project.MSG_INFO);
             os.flush();
           } catch (Exception e)
           {